1
0
Fork 0
forked from lthn/blockchain

Merge branch 'master' into develop

This commit is contained in:
crypro.zoidberg 2019-01-14 22:55:25 +03:00
commit 0e67ffe10c
116 changed files with 1366 additions and 20182 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -3,7 +3,8 @@
"SETUP_MASTER_PASS": "Setup master password",
"SETUP_CONFIRM_PASS": "Confirm the password",
"MASTER_PASS": "Master password",
"BUTTON_NEXT": "Next"
"BUTTON_NEXT": "Next",
"INCORRECT_PASSWORD": "Invalid password"
},
"COMMON": {
"BACK": "Go back"
@ -24,7 +25,8 @@
"ADD_NEW": "+ Add new",
"ACCOUNT": {
"STAKING": "Staking",
"MESSAGES": "New offers/Messages"
"MESSAGES": "New offers/Messages",
"SYNCING": "Syncing wallet"
},
"SETTINGS": "Settings",
"LOG_OUT": "Log out",
@ -42,19 +44,26 @@
"BUTTON_NEW_WALLET": "Create new wallet",
"BUTTON_OPEN_WALLET": "Open existing wallet",
"BUTTON_RESTORE_BACKUP": "Restore from backup",
"HELP": "How to create wallet?"
"HELP": "How to create wallet?",
"CHOOSE_PATH": "Please choose a path"
},
"CREATE_WALLET": {
"NAME": "Wallet name",
"PASS": "Set wallet password",
"CONFIRM": "Confirm wallet password",
"BUTTON_SELECT": "Select wallet location",
"BUTTON_CREATE": "Create wallet"
"BUTTON_CREATE": "Create wallet",
"TITLE_SAVE": "Save the wallet file.",
"ERROR_CANNOT_SAVE_TOP": "You cannot record a file on top of another file",
"ERROR_CANNOT_SAVE_SYSTEM": "You cannot save a safe file to the system partition"
},
"OPEN_WALLET": {
"NAME": "Wallet name",
"PASS": "Wallet password",
"BUTTON": "Open wallet"
"BUTTON": "Open wallet",
"WITH_ADDRESS_ALREADY_OPEN": "A wallet with this account is already open",
"SAFE_FILE_NOT_FOUND1": "Safe file not found",
"SAFE_FILE_NOT_FOUND2": "<br/><br/> It might have been renamed or moved. <br/> To open it, use the \"Open safe\" button."
},
"RESTORE_WALLET": {
"LABEL_NAME": "Wallet name",
@ -62,7 +71,9 @@
"PASS": "Wallet password",
"CONFIRM": "Confirm wallet password",
"BUTTON_SELECT": "Select wallet location",
"BUTTON_CREATE": "Create wallet"
"BUTTON_CREATE": "Create wallet",
"NOT_CORRECT_FILE_OR_PASSWORD": "Invalid safe file or password does not match",
"CHOOSE_PATH": "Please choose a path"
},
"SEED_PHRASE": {
"TITLE": "Make sure to keep your seed phrase in a safe place. If you forget your seed phrase you will not be able to recover your account.",
@ -109,7 +120,8 @@
"DETAILS": "Additional details",
"MIXIN": "Mixin",
"FEE": "Fee",
"BUTTON": "Send"
"BUTTON": "Send",
"SUCCESS_SENT": "The payment will be received within 20 minutes"
},
"HISTORY": {
"STATUS": "Status",
@ -162,13 +174,38 @@
"PROGRESS_RECEIVE": "Reply received",
"PROGRESS_COMPLETE": "Completed",
"FEE": "Fee",
"PAYMENT": "Payment ID"
"PAYMENT": "Payment ID",
"ACCEPT_STATE_WAIT_BIG": "You have accepted the contract proposal. Please wait for the pledges to be made",
"IGNORED_ACCEPT": "You have ignored the contract proposal",
"BURN_PROPOSAL": "The pledges have been nullified.",
"SUCCESS_FINISH_PROPOSAL": "The contract is complete. The payment has been sent.",
"SEND_CANCEL_PROPOSAL": "Proposal to cancel contract sent to seller",
"IGNORED_CANCEL": "You have ignored the proposal to cancel the contract",
"DEALS_CANCELED_WAIT": "The contract is being cancelled. Please wait for the pledge to be returned",
"WAITING_TIME": "Time until response"
},
"MESSAGES": {
"ADDRESS": "Address",
"MESSAGE": "Message",
"SEND_PLACEHOLDER": "Type a message...",
"SEND_BUTTON": "Send"
},
"ERRORS": {
"NOT_ENOUGH_MONEY": "Insufficient funds in account",
"CORE_BUSY": "Internal error (core is busy)",
"DAEMON_BUSY": "Internal error: deamon is busy",
"NO_MONEY_REMOVE_OFFER": "There is no fee for deleting an offer, but in order to protect the network against flood transactions you need to have at least {{fee}} {{currency}} in your safe",
"NOT_ENOUGH_OUTPUTS_TO_MIX": "For the sake of security, mixed transaction will take several days",
"TRANSACTION_IS_TO_BIG": "This transaction is large and was therefore denied by the network. Try sending the required amount in parts.",
"TRANSFER_ATTEMPT": "There is no connection to the Zano network",
"ACCESS_DENIED": "Access denied",
"TRANSACTION_ERROR": "Error. Payment not completed.",
"BAD_ARG": "Invalid argument",
"WALLET_WRONG_ID": "Invalid wallet ID",
"WRONG_PASSWORD": "Invalid password",
"FILE_RESTORED": "The safe file was corrupted somehow. We have recovered the keys and safe from the blockchain.",
"FILE_NOT_FOUND": "File not found",
"FILE_EXIST": "A file with that name already exists. Enter another name to save the file under",
"FILE_NOT_SAVED": "You cannot save a safe file in this folder. Please choose another folder."
}
}

View file

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 644 B

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_2_);}
.st2{fill:url(#SVGID_3_);}
</style>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="512.55" y1="984.3" x2="512.55" y2="39.3" gradientTransform="matrix(1 0 0 -1 0 1024)">
<stop offset="0" style="stop-color:#1ECED0"/>
<stop offset="0.5" style="stop-color:#8AA9F4"/>
<stop offset="1" style="stop-color:#6A44FB"/>
</linearGradient>
<polygon class="st0" points="679.6,984.7 193.5,305.1 344.4,39.7 831.6,715.3 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="217.75" y1="700.86" x2="217.75" y2="382.2152" gradientTransform="matrix(1 0 0 -1 0 1024)">
<stop offset="0" style="stop-color:#57B7E3"/>
<stop offset="1" style="stop-color:#7E8AF4;stop-opacity:0"/>
</linearGradient>
<polygon class="st1" points="193.5,305.1 435.5,643.4 0,643.4 "/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="807.25" y1="332.3745" x2="807.25" y2="641.9303" gradientTransform="matrix(1 0 0 -1 0 1024)">
<stop offset="0" style="stop-color:#7C83F4"/>
<stop offset="1" style="stop-color:#68B0E9;stop-opacity:0"/>
</linearGradient>
<polygon class="st2" points="831.6,715.3 590.5,381 1024,381 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

Before

Width:  |  Height:  |  Size: 708 B

After

Width:  |  Height:  |  Size: 708 B

View file

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 1 KiB

View file

Before

Width:  |  Height:  |  Size: 931 B

After

Width:  |  Height:  |  Size: 931 B

View file

@ -1,6 +1,6 @@
button {
border: none;
font-family: 'Open Sans', sans-serif;
font-family: OpenSans, sans-serif;
font-size: 1.5rem;
font-weight: 600;
outline: none;
@ -116,7 +116,7 @@ button {
}
}
input[type='text'], input[type='password'] {
input[type='text'], input[type='password'], select {
border: none;
font-size: 1.4rem;
outline: none;
@ -134,7 +134,7 @@ button {
height: auto;
textarea {
font-family: 'Open Sans', sans-serif;
font-family: OpenSans, sans-serif;
border: none;
font-size: 1.4rem;
outline: none;
@ -273,6 +273,30 @@ input[type='checkbox'].style-checkbox {
}
}
.switch {
@include themify($themes) {
background-color: themed(switchBackgroundColor);
}
.circle {
&.on {
@include themify($themes) {
background-color: themed(blueTextColor);
}
}
&.off {
@include themify($themes) {
background-color: themed(optionalTextColor);
}
}
}
}
.error-block {
font-size: 1.2rem;
text-align: right;
@ -364,12 +388,32 @@ input[type='checkbox'].style-checkbox {
.modal {
@include themify($themes) {
background: themed(tooltipBackgroundColor);
background: themed(modalBackground);
color: themed(mainTextColor);
}
.content {
.icon.error {
@include themify($themes) {
background-color: themed(redTextColor);
}
}
.icon.success {
@include themify($themes) {
background-color: themed(greenTextColor);
}
}
.icon.info {
@include themify($themes) {
background-color: themed(blueTextColor);
}
}
}
.action-button {
@ -379,4 +423,52 @@ input[type='checkbox'].style-checkbox {
color: themed(alternativeTextColor);
}
}
.close-button {
.icon {
@include themify($themes) {
background-color: themed(closeButtonColor);
}
}
}
}
.ngx-contextmenu {
.dropdown-menu {
border: none;
padding: 0;
@include themify($themes) {
background-color: themed(chartOptionsBackgroundColor);
box-shadow: themed(tooltipShadow);
}
}
li {
display: block;
font-family: OpenSans, sans-serif;
font-size: 1.3rem;
text-transform: uppercase;
text-align: center;
}
a {
display: block;
padding: 0.5em 1em;
@include themify($themes) {
color: themed(mainTextColor);
}
&:hover {
@include themify($themes) {
background-color: themed(chartOptionsHoverColor);
color: themed(mainTextColor);
}
}
}
}

View file

@ -10,7 +10,8 @@ $themes: (
alternativeTextColor: #111921,
optionalTextColor: #556576,
blueTextColor: #4db1ff,
redTextColor: #ff5252,
greenTextColor: #5cda9d,
redTextColor: #fe5252,
blueButtonBackgroundColor: #4db1ff,
blueButtonHoverColor: #60b9ff,
disabledButtonBackgroundColor: #90a4ae,
@ -38,7 +39,9 @@ $themes: (
chartOptionsBackgroundColor: #2b3644,
chartOptionsHoverColor: #556576,
tooltipBackgroundColor: #42505f,
tooltipShadow: 0 0 1rem rgba(0, 0, 0, 0.5)
tooltipShadow: 0 0 1rem rgba(0, 0, 0, 0.5),
modalBackground: url(~src/assets/images/background-dark.png),
closeButtonColor: #556576
),
gray: (
bodyBackgroundColor: #101417,
@ -51,7 +54,8 @@ $themes: (
alternativeTextColor: #1a1a1a,
optionalTextColor: #565c62,
blueTextColor: #42a5f5,
redTextColor: #ff5252,
greenTextColor: #47cf8d,
redTextColor: #fe5252,
blueButtonBackgroundColor: #42a5f5,
blueButtonHoverColor: #4dafff,
disabledButtonBackgroundColor: #79848f,
@ -79,7 +83,9 @@ $themes: (
chartOptionsBackgroundColor: #292d31,
chartOptionsHoverColor: #515960,
tooltipBackgroundColor: #3e464c,
tooltipShadow: 0 0 1rem rgba(0, 0, 0, 0.5)
tooltipShadow: 0 0 1rem rgba(0, 0, 0, 0.5),
modalBackground: url(~src/assets/images/background-gray.png),
closeButtonColor: #515960
),
white: (
bodyBackgroundColor: #eeeeee,
@ -92,6 +98,7 @@ $themes: (
alternativeTextColor: #fefefe,
optionalTextColor: #a0a5ab,
blueTextColor: #2c95f1,
greenTextColor: #46c172,
redTextColor: #ff5252,
blueButtonBackgroundColor: #2c95f1,
blueButtonHoverColor: #379ffa,
@ -120,7 +127,9 @@ $themes: (
chartOptionsBackgroundColor: #e0e0e0,
chartOptionsHoverColor: #ffffff,
tooltipBackgroundColor: #ffffff,
tooltipShadow: 0 0 1rem rgba(120, 120, 120, 0.5)
tooltipShadow: 0 0 1rem rgba(120, 120, 120, 0.5),
modalBackground: url(~src/assets/images/background-white.png),
closeButtonColor: #43454b
)
);

View file

@ -81,27 +81,3 @@ app-settings {
app-login {
min-width: inherit;
}
.switch {
@include themify($themes) {
background-color: themed(switchBackgroundColor);
}
.circle {
&.on {
@include themify($themes) {
background-color: themed(blueTextColor);
}
}
&.off {
@include themify($themes) {
background-color: themed(optionalTextColor);
}
}
}
}

View file

@ -17,6 +17,7 @@
&:not(:last-child) {
position: relative;
cursor: pointer;
margin-right: 20px;
&:after {

View file

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 142 KiB

View file

@ -7,7 +7,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i" rel="stylesheet">
<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>
</head>
<body>

View file

@ -1,474 +0,0 @@
@import "../variables";
@import "mixins";
#contacts {
padding: 2.5rem 8rem;
.main-options-wrapper {
.contacts-options {
.flex-container-direction(row);
.flex-container-alignment(center, space-between);
margin-bottom: 7rem;
.contacts-options-left {
.flex-container-direction(row);
.contacts-groups {
.dropdown-toggle {
.flex-container;
.flex-container-alignment(center, space-between);
background-color: white !important;
border: 1px solid @contacts-groups-border-color;
border-radius: 4rem;
box-shadow: none;
color: @program-dark-color;
font-size: 3.75rem;
height: 8.25rem;
padding: 0 4rem;
outline-style: none !important;
width: 62.5rem;
z-index: 0;
.filter-option {
text-overflow: ellipsis;
white-space: nowrap;
}
.caret {
position: relative;
margin: 0;
}
}
.dropdown-menu.open {
top: 10.5rem;
border-radius: 2rem;
box-shadow: @box-shadow;
margin: 0;
li {
a {
min-height: 8.25rem;
word-break: break-word;
}
&.divider {
display: block;
background-color: @program-divider-color;
margin: 0 auto;
width: 90%;
}
.edit-groups-item {
.flex-container;
.flex-container-alignment(center, flex-start);
.base-icon {
.icon-sizing(5rem, 5rem, -3.5rem, -4.5rem);
margin-right: 1.5rem;
flex-shrink: 0;
&:before {
content: '#';
}
}
}
}
}
}
.contacts-search {
margin-left: 3.25rem;
}
}
.contacts-buttons {
.flex-container;
.main-options-btn {
.add-contact-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
margin-right: 2rem;
}
&:not(:first-child) {
margin-left: 6rem;
}
}
}
}
}
.contacts-table {
margin-bottom: 3rem;
.contacts-name {
display: inline-flex;
min-width: 22rem;
.flex-container-alignment(center, flex-start);
font-size: 3.75rem;
word-break: break-word;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
color: @program-table-icon-color;
margin-right: 1rem;
flex-shrink: 0;
}
&:hover {
color: @program-hover-color;
cursor: pointer;
.base-icon {
color: @program-hover-color;
}
}
}
.contacts-account {
.flex-container;
.safe-address {
font-size: 3.25rem;
margin-top: 0.75rem;
margin-bottom: 0.75rem;
.safe-address-wrap {
width: 40rem;
}
.safe-address-inner {
left: inherit;
right: 0;
width: 150%;
.contact-address {
.safe-address-inner-additional {
.flex-container-direction(row-reverse);
.flex-container-alignment(flex-start, space-between);
margin-top: 2rem;
.copy-icon {
cursor: pointer;
float: none;
margin-right: -1rem;
margin-top: 0;
margin-bottom: 0;
&:hover, &.hovered {
color: @program-exuding-color;
}
&.hovered:before {
content: 'A';
}
}
}
&:not(:first-child) {
border-top: 1px solid @program-divider-color;
margin-top: 4rem;
padding-top: 3rem;
}
}
}
}
alias-display:not(.safe-address-inner-alias) {
display: inline-flex;
.safe-alias {
margin-top: 0.75rem;
margin-bottom: 0.75rem;
}
}
}
.contacts-location, .contacts-groups {
max-width: 32.5rem;
}
.contacts-communication-method {
max-width: 43rem;
}
.contacts-note {
.flex-container;
.flex-container-alignment(center, flex-start);
position: relative;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
cursor: pointer;
}
}
.contacts-menu {
line-height: 0;
visibility: hidden;
.contacts-menu-btn {
background: transparent;
border: none;
padding: 0;
margin: 0;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
}
}
.contacts-menu-list {
.menu-list(-10.5rem, inherit, -3rem, 38rem);
}
}
tr {
font-size: 3.25rem;
.table-long-item-wrapper {
.table-long-item {
.table-long-item-text {
font-size: 3.25rem;
}
}
}
th:last-child, td:last-child {
width: 10rem;
}
&:hover {
.contacts-menu {
visibility: visible;
}
}
}
}
.export-import-contacts-wrapper {
.flex-container;
color: @export-import-contacts-text-color;
.export-import-contacts-btn {
.flex-container;
.flex-container-alignment(center, center);
background-color: fade(white, 20%);
border: 1px solid @export-import-contacts-border-color;
font-size: 3.5rem;
height: 6rem;
padding: 0;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
}
&.left-btn {
border-radius: 3rem 0 0 3rem;
border-right: none;
width: 32.5rem;
}
&.right-btn {
border-radius: 0 3rem 3rem 0;
width: 8.5rem;
}
&:hover {
background-color: fade(white, 40%);
color: @program-dark-color;
cursor: pointer;
}
}
.export-import-contacts-menu{
.menu-list(-1rem, inherit, 0, 42.5rem);
}
}
}
#contact-details {
padding: 2.5rem 8rem;
.contact-details-options {
.flex-container-direction(row);
.flex-container-alignment(center, space-between);
margin-bottom: 5.5rem;
.back-btn {
margin: 0 0 1rem;
}
.contact-name {
color: @program-dark-color;
font-size: 7.75rem;
font-weight: 300;
line-height: 7.5rem;
margin-top: 0;
margin-bottom: 5.5rem;
text-align: center;
width: 100%;
}
}
.contacts-data {
margin-top: 11rem;
margin-bottom: 5rem;
.adaptive-form-field-group {
padding-bottom: 7.5rem;
.field-group-label {
min-width: 42rem;
max-width: 42rem;
}
.safe-address-wrapper {
width: 100%;
.general-input-wrapper {
.contact-option-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
min-width: 4rem;
visibility: hidden;
align-self: flex-end;
margin: 1.5rem 0 1.5rem 2rem;
&:hover {
color: @program-hover-color;
}
&.hovered:before {
content: 'A';
}
}
&:hover {
.contact-option-icon {
cursor: pointer;
visibility: visible;
}
}
}
.safe-alias-modal {
margin-top: 4rem;
}
.contacts-data-btn-wrapper {
.flex-container;
flex-wrap: wrap;
.contacts-data-btn {
.flex-container-direction(row);
.flex-container-alignment(center, center);
background: transparent;
border: none;
color: @contacts-accounts-btn-text-color;
font-size: 3rem;
margin: 3rem 13rem 0 0;
padding: 0;
.base-icon {
.icon-sizing(6rem, 6rem, -3rem, -4rem);
margin-right: 1.5rem;
margin-left: -0.5rem;
}
&:hover {
color: @program-hover-color;
}
}
}
}
.contact-connection-wrapper {
.flex-container;
width: 100%;
.messenger-type, angucomplete-alt {
margin-right: 6.5rem;
min-width: 37%;
width: 37%;
}
}
.add-contact-btn {
.flex-container-direction(row);
.flex-container-alignment(center, center);
background: transparent;
border: none;
color: @contacts-accounts-btn-text-color;
font-size: 3rem;
line-height: 7rem;
margin: 0 0 0.25rem;
padding: 0;
.base-icon {
.icon-sizing(6rem, 6rem, -3rem, -4rem);
margin-right: 1.5rem;
margin-left: -0.5rem;
}
&:hover {
color: @program-hover-color;
}
}
.edit-groups-field {
.flex-container;
.flex-container-alignment(center, flex-start);
.edit-groups-icon {
.icon-sizing(5rem, 5rem, -3.5rem, -4.5rem);
margin-right: 1.5rem;
flex-shrink: 0;
&:before {
content: '#';
}
}
}
}
}
.contact-payment-history {
padding: 7rem 2.5rem 6rem;
}
.contact-empty-payments {
color: @program-empty-color;
font-size: 3.75rem;
line-height: 5.5rem;
padding: 12.5rem 0;
text-align: center;
}
.delete-contact-btn {
.flex-container;
.flex-container-alignment(center, center);
background: transparent;
border: none;
color: @program-dark-color;
font-size: 4.25rem;
margin: 1rem auto 0;
padding: 0;
.base-icon {
.icon-sizing(5rem, 4rem, -3.5rem, -5rem);
margin-right: 3rem;
}
}
}

View file

@ -1,221 +0,0 @@
@import "../variables";
@import "mixins";
#dashboard {
padding: 0 8rem 2.5rem;
.main-options-wrapper {
.dashboard-options {
.flex-container;
.flex-container-alignment(center, space-between);
margin-bottom: 7rem;
.top-options-list {
.flex-container;
justify-content: space-between;
flex-grow: 1;
.top-options-item {
background: rgba(255, 255, 255, 0.4);
padding: 2.5rem 0;
flex-basis: 25%;
.top-options-link {
.flex-container-direction(row);
.flex-container-alignment(center, center);
height: 12rem;
color: @dashboard-indicator-text-color;
cursor: pointer;
.base-icon {
.icon-sizing(12rem, 12rem, 0, -1rem);
color: @dashboard-indicator-icon-color;
margin-right: 1rem;
}
.top-options-number {
font-size: 8rem;
font-weight: 200;
line-height: 6rem;
}
&:hover {
color: @program-main-color;
.base-icon {
color: @program-main-color;
}
}
}
&:first-child {
border-radius: 3rem 0 0 3rem;
.top-options-link {
border-radius: 2.75rem 0 0 2.75rem;
}
}
&:not(:first-child) {
border-left: none;
}
&:last-child {
border-radius: 0 3rem 3rem 0;
.top-options-link {
border-radius: 0 2.75rem 2.75rem 0;
}
}
}
}
.dashboard-buttons {
margin-top: 3rem;
}
}
}
.dashboard-slider-wrapper {
margin: 0 -3.5rem;
overflow: hidden;
.dashboard-slider {
.flex-container;
padding-top: 3rem;
width: 200%;
transition: 1s;
.dashboard-slider-item {
max-width: 25%;
min-width: 25%;
padding: 0 3.5rem;
transition: 1s;
}
}
}
.slider-control-wrapper {
.flex-container;
.flex-container-alignment(center, space-between);
padding-top: 2.75rem;
.slider-control-btn {
.flex-container;
.flex-container-alignment(center, center);
background: rgba(255, 255, 255, 0.7);
border: 1px solid @dashboard-slider-border-color;
border-radius: 100%;
color: @dashboard-slider-icon-color;
padding: 0;
height: 7rem;
width: 7rem;
.base-icon {
.icon-sizing(4rem, 4rem, -3rem, -3.75rem);
font-size: 12rem;
}
&.prev-btn {
transform: rotate(180deg);
}
&:hover {
background: white;
color: @program-main-color;
}
}
.slider-status-wrapper {
.flex-container;
.flex-container-alignment(center, center);
line-height: 0;
list-style-type: none;
padding: 0;
margin: 0;
li {
.slider-status-btn {
background: rgba(255, 255, 255, 0.5);
border: none;
border-radius: 100%;
margin: 0 1rem;
padding: 0;
height: 2rem;
width: 2rem;
}
&.active-slide {
.slider-status-btn{
background: white;
border: 1px solid @dashboard-slider-border-color;
height: 2.5rem;
width: 2.5rem;
}
}
}
}
}
.add-widget-btn-wrapper {
.flex-container;
.flex-container-alignment(center, center);
margin: 5rem auto;
.add-widget-btn {
position: relative;
button {
.flex-container;
.flex-container-alignment(center, center);
background: transparent;
border: none;
color: @program-dark-color;
font-size: 4.25rem;
padding: 0;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
margin-top: 0.5rem;
margin-right: 1.5rem;
z-index: -1;
}
}
.dropdown-menu {
.menu-list(inherit, 50%, inherit, 88rem);
.flex-container-direction(row);
flex-wrap: wrap;
bottom: 0;
transform: translateX(-50%) translateY(-2em);
li {
flex-basis: 50%;
flex-shrink: 0;
button {
border-radius: 0 !important;
}
&.last-element {
flex-basis: 100%;
button {
-webkit-justify-content: center;
justify-content: center;
}
}
}
}
&.open {
.dropdown-menu {
transform: translateX(-50%) translateY(0);
}
}
}
}
}

View file

@ -1,134 +0,0 @@
@import "../variables";
.datepicker {
border: none !important;
border-radius: 2.5rem !important;
-webkit-box-shadow: @box-shadow !important;
box-shadow: @box-shadow !important;
font-family: 'Titillium Web', 'AgoraSansPro', sans-serif;
width: 65rem !important;
.datepicker--pointer {
display: none;
}
.datepicker--nav {
border-bottom: none;
.datepicker--nav-action {
path {
stroke: @datepicker-nav-action-color;
stroke-width: 1px;
}
&:hover {
background: none;
}
}
.datepicker--nav-title {
color: @datepicker-nav-title-color;
font-size: 4rem;
text-transform: uppercase;
font-style: normal !important;
i {
color: @datepicker-nav-title-color;
}
&:hover {
background: none;
}
}
}
.datepicker--content {
color: @program-dark-color;
font-size: 3.25rem;
.datepicker--body {
.datepicker--days-names {
.datepicker--day-name {
color: @datepicker-day-name-color;
font-size: 3.25rem;
text-transform: uppercase;
}
}
.datepicker--cells {
justify-content: space-between;
.datepicker--cell {
height: 7rem !important;
width: 7rem !important;
margin: 0.5rem;
&.-selected- {
color: @program-dark-color;
border-radius: 100%;
background: @datepicker-cell-selected-color;
&:hover {
color: @program-dark-color;
background: @datepicker-cell-selected-color;
}
}
&.-focus- {
border-radius: 100%;
border: 1px solid @datepicker-cell-border-color;
background: transparent;
}
&.-disabled- {
color: @program-dark-color;
&:hover {
border: none !important;
}
}
&.-other-month- {
color: @datepicker-day-other-month-color;
&.-selected- {
&:hover {
color: @datepicker-day-other-month-color;
}
}
&:hover {
border-radius: 100%;
border: 1px solid @datepicker-cell-border-color;
}
}
&.-current- {
color: @program-dark-color;
border-radius: 100%;
border: 1px solid @datepicker-cell-border-color;
&.-selected- {
&:hover {
color: @program-dark-color;
background: @datepicker-cell-selected-color;
}
}
&:hover {
border-radius: 100%;
border: 1px solid @datepicker-cell-border-color;
color: @program-dark-color;
background: transparent;
}
}
}
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,177 +0,0 @@
@import "../variables";
@import "mixins";
header {
min-height: 36.5rem;
min-width: @min-width;
padding: 0 8rem 5.5rem;
.header-top-wrapper {
.flex-container;
.flex-container-alignment(center, space-between);
min-height: 22rem;
max-height: 22rem;
.header-options-wrapper {
.flex-container;
.flex-container-alignment(center, flex-start);
height: 6rem;
.header-lock-btn {
.icon-sizing(5rem, 8rem, -3.5rem, -3rem);
color: @program-dark-color;
cursor: pointer;
margin-right: 10.5rem;
}
.header-test-network {
color: @program-light-color;
font-size: 3.5rem;
font-weight: 300;
line-height: 6rem;
margin-right: 9.5rem;
.base-icon {
color: @program-light-color;
}
}
.header-status {
font-size: 3.5rem;
font-weight: 300;
line-height: 6rem;
&.online {
color: @program-online-color;
}
&.offline {
color: @program-offline-color;
}
&.loading {
color: @program-light-color;
}
&.sync-wrapper {
.flex-container;
.flex-container-alignment(center, center);
color: @program-online-color;
.sync {
padding-right: 4rem;
}
progress[value] {
-webkit-appearance: none;
appearance: none;
width: 36.5rem;
height: 0.75rem;
&::-webkit-progress-bar{
background-color: @program-progress-bar-bg-color;
border-radius: 1rem;
}
&::-webkit-progress-value{
background-color: @program-progress-bar-fill-color;
border-radius: 1rem;
}
}
.sync-percent {
padding-left: 2.5rem;
opacity: 0.5;
}
}
}
}
.header-logo-wrapper {
.header-logo {
display: block;
background: url("../img/logo.svg") center no-repeat;
background-size: 100%;
height: 7.5rem;
width: 50rem;
}
}
}
.header-nav-wrapper {
.flex-container;
min-height: 10rem;
max-height: 10rem;
.sidebar-nav {
.flex-container;
flex-grow: 1;
.nav-item {
border-top: 1px solid @program-header-border-color;
border-bottom: 1px solid @program-header-border-color;
border-right: 1px solid @program-header-border-color;
flex-grow: 1;
text-align: center;
height: 9rem;
box-sizing: content-box;
.nav-item-link {
display: flex;
justify-content: center;
background: white;
border: none;
color: @program-header-text-color;
margin: 0;
padding: 1.5rem 0;
font-size: 4.25rem;
line-height: 6rem;
width: 100%;
.indicator-number {
border-color: @program-header-indicator-border-color;
color: @program-header-indicator-text-color;
margin-left: 2.5rem;
margin-right: -2rem;
}
&:disabled {
color: @program-header-text-blocked-color;
}
}
&:first-child {
border-left: 1px solid @program-header-border-color;
border-radius: 10rem 0 0 10rem;
.nav-item-link {
border-radius: 9.75rem 0 0 9.75rem;
}
}
&:last-child {
border-radius: 0 10rem 10rem 0;
.nav-item-link {
border-radius: 0 9.75rem 9.75rem 0;
}
}
&:hover:not(.active) {
.nav-item-link:not(:disabled) {
background: @program-header-bg-hover-color;
}
}
&.active {
.nav-item-link {
background: @program-header-bg-active-color;
border-color: @program-header-bg-active-color;
}
}
}
}
}
}

View file

@ -1,83 +0,0 @@
@import "../variables";
.highcharts-container{
width: 100%!important;
}
.highcharts-background {
fill-opacity: 0;
}
.highcharts-tooltip {
span {
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
b {
text-align: center;
}
}
}
.highcharts-input-group {
display: none;
}
.highcharts-range-selector-buttons {
visibility: hidden;
}
.highcharts-scrollbar-thumb{
opacity: 1;
stroke: @highcharts-scrollbar-color;
}
.highcharts-scrollbar-arrow{
display: none;
}
.highcharts-scrollbar-rifles{
stroke: @highcharts-scrollbar-color;
}
.highcharts-axis.highcharts-xaxis {
stroke: @highcharts-axis-line-color;
.highcharts-tick {
stroke: @highcharts-axis-line-color;
}
.highcharts-axis-line {
stroke: @highcharts-axis-line-color;
}
}
.highcharts-grid.highcharts-xaxis-grid.highcharts-navigator-xaxis{
stroke-opacity: 0;
}
.highcharts-label-box.highcharts-tooltip-box {
filter: url("#dropShadow");
&:nth-child(1) {
fill-opacity: 0;
stroke-opacity: 0;
}
&:nth-child(2) {
fill-opacity: 0;
stroke-opacity: 0;
}
&:nth-child(3) {
fill-opacity: 0;
stroke-opacity: 0;
}
}
feFlood {
flood-color: #1f360b;
}

View file

@ -1,239 +0,0 @@
@import "../variables";
@import "mixins";
#history {
padding: 2.5rem 8rem;
}
.history-options {
.flex-container-direction(row);
.flex-container-alignment(center, flex-start);
position: relative;
margin-bottom: 7rem;
.history-search {
margin-left: 3.25rem;
}
}
.history-table {
margin-bottom: 3rem;
table {
thead {
tr {
font-size: 3.25rem;
}
}
tr {
th:first-child {
padding-left: 0;
padding-right: 10rem;
text-align: center;
}
td:first-child {
position: relative;
padding-left: 0;
padding-right: 10rem;
&::after {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
}
&.history-marker::after {
border-left: 1rem solid @marker-light-green;
}
}
td:last-child {
width: 14rem;
}
&.transaction-blocked {
background-color: @history-transaction-blocked-border-color !important;
color: @history-transaction-blocked-text-color;
.transaction-status-indicator {
.status-graph {
&.income {
stroke: @history-transaction-blocked-status-income-color !important;
}
&.outgoing {
stroke: @history-transaction-blocked-status-outgoing-color !important;
}
}
.status-inner {
.base-icon.income {
color: @history-transaction-blocked-status-income-color !important;
}
.base-icon.outgoing {
color: @history-transaction-blocked-status-outgoing-color !important;
}
}
}
.safe-address {
.safe-address-wrap {
color: @history-transaction-blocked-text-color;
.safe-address-text {
background: -webkit-linear-gradient(left, @history-transaction-blocked-text-color 0, @history-transaction-blocked-text-color 75%, transparent 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
.safe-alias {
.safe-alias-btn {
background-color: fade(@history-transaction-blocked-text-color, 20%);
border-color: @history-transaction-blocked-alias-color;
color: @history-transaction-blocked-text-color;
}
}
.history-date {
&:hover {
color: @history-transaction-blocked-hover-color;
.base-icon {
color: @history-transaction-blocked-hover-color;
}
}
}
.history-safe {
&:hover {
color: @history-transaction-blocked-hover-color;
}
}
&:hover {
.history-date {
.base-icon {
opacity: 0.6;
}
}
}
}
&:hover {
.history-date {
.base-icon {
opacity: 0.3;
}
}
}
}
}
.transaction-status-indicator {
margin: 0 auto;
}
.history-safe {
.flex-container;
.flex-container-alignment(center, flex-start);
.history-anonym-icon {
.icon-sizing(4rem, 5rem, -4rem, -4.5rem);
margin-right: 2rem;
}
&:hover {
color: @program-hover-color;
cursor: pointer;
}
}
.history-date {
.flex-container-alignment(center, flex-start);
display: inline-flex;
.base-icon {
.icon-sizing(5rem, 5rem, -3.5rem, -4.5rem);
margin-left: 2rem;
opacity: 0;
}
&:hover {
color: @program-hover-color;
cursor: pointer;
.base-icon {
color: @program-hover-color;
opacity: 0.3;
}
}
}
.history-counterparty {
.flex-container-direction(column);
max-width: 75rem;
.safe-address {
font-size: 3.25rem;
margin-top: 0.75rem;
margin-bottom: 0.75rem;
.safe-address-wrap {
width: 40rem;
}
.safe-address-inner {
left: inherit;
right: 0;
width: 150%;
}
}
alias-display:not(.safe-address-inner-alias) {
display: inline-flex;
.safe-alias {
margin-top: 0.75rem;
margin-bottom: 0.75rem;
}
}
}
.history-comment-wrapper {
.flex-container;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
&:hover {
cursor: pointer;
}
}
}
.contact-btn {
margin-top: 1.5rem;
padding: 0 1rem;
}
}

View file

@ -1,296 +0,0 @@
@import "../variables";
@import "mixins";
#mining {
padding: 2.5rem 8rem;
.main-options-wrapper {
.mining-options {
margin-bottom: 8rem;
}
}
.calculate-options {
.flex-container;
.flex-container-alignment(center, space-between);
color: @program-main-color;
height: 30.5rem;
padding: 2.5rem 11rem 0;
.calculate-tile {
.flex-container;
font-size: 3.5rem;
label {
.flex-container;
.flex-container-alignment(center, flex-end);
font-weight: 600;
height: 7rem;
line-height: 4.5rem;
margin-bottom: 0;
max-width: 45rem;
padding-right: 3rem;
text-align: end;
}
.general-input-wrapper {
width: 42rem;
}
.calculate-mining-btn {
border: 1px solid @mining-range-border-color;
height: 8rem;
width: 44rem;
font-size: 4rem;
margin-left: 3rem;
}
&:hover, &.focused-line {
label {
color: @program-hover-color;
}
.general-input-wrapper {
border-bottom-color: @program-hover-color;
.general-input {
color: @program-hover-color;
}
::-webkit-input-placeholder {
color: @program-input-placeholder-hover-color;
}
}
}
}
}
.chart-wrapper {
padding-top: 1rem;
padding-bottom: 5rem;
transition: all 0.5s linear;
overflow: hidden;
.chart-label {
.flex-container;
.flex-container-alignment(center, center);
position: relative;
color: @program-dark-color;
font-size: 5rem;
font-style: italic;
font-weight: 300;
padding-top: 5rem;
padding-bottom: 1rem;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
top: -1rem;
right: -1rem;
color: @program-label-info-color;
}
}
}
.mining-select-wrapper {
.flex-container;
.flex-container-alignment(center, space-between);
flex-grow: 1;
.mining-select {
.flex-container;
.dropdown-toggle {
border-bottom: none;
color: @program-hover-color;
font-size: 5rem;
line-height: 6rem;
padding: 0 3rem 0 0;
.caret {
color: @program-hover-color;
}
}
.dropdown-menu {
border-radius: 2rem;
min-width: 44rem;
width: 100%;
}
&.mining-safe {
padding-left: 5rem;
}
&.mining-view {
padding-left: 5rem;
padding-right: 6rem;
.dropdown-menu {
right: 0;
left: auto;
}
}
}
}
.mined-empty {
.flex-container;
.flex-container-alignment(center, center);
color: @program-empty-color;
font-size: 3.75rem;
height: 35rem;
}
.mined-statistics {
padding: 3rem 0;
.mined-statistics-options {
.flex-container;
.flex-container-alignment(flex-start, space-between);
padding: 7rem 7rem 0;
.chart-range-wrapper {
.flex-container;
.flex-container-alignment(center, space-between);
margin-top: 1rem;
.chart-range-group {
.flex-container;
.flex-container-alignment(center, center);
color: @program-dark-color;
font-size: 3rem;
.chart-range-selector {
.flex-container;
margin: 0 2.5rem;
padding: 0;
li {
border: 1px solid @mining-range-border-color;
color: @mining-range-text-color;
line-height: 5.5rem;
height: 6rem;
width: 13rem;
text-align: center;
list-style-type: none;
&:first-child {
border-radius: 3rem 0 0 3rem;
width: 13.5rem;
}
&:not(:first-child) {
border-left: none;
}
&:last-child {
border-radius: 0 3rem 3rem 0;
width: 13.5rem;
}
}
.active {
background: white;
color: @program-dark-color;
}
}
&:first-child {
margin-right: 8.5rem;
@media screen and (max-width: 1150px) {
margin-right: 2.5rem;
}
}
}
}
.total-mined-chart {
color: @program-dark-color;
font-size: 5rem;
font-style: italic;
font-weight: 300;
line-height: 7rem;
white-space: nowrap;
text-align: right;
}
.total-mined-table {
color: @program-dark-color;
font-size: 5rem;
font-style: italic;
font-weight: 300;
line-height: 7rem;
text-align: right;
width: 100%;
}
}
}
.statistics-table {
margin: 8rem 2.5rem 2.5rem;
overflow: hidden;
transition: height 1s;
table {
tbody {
tr {
td {
width: 33.33%;
.order-icon {
opacity: 0.6;
}
&:first-child {
position: relative;
padding-left: 8rem;
&::after {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
border-left: 1rem solid @marker-light-green;
}
}
}
}
}
}
}
.pagination-wrapper {
margin: 5rem 2.5rem 3rem;
.pagination {
.pages {
color: @program-pagination-text-inactive-color;
}
.next-page, .prev-page {
background-color: transparent;
border-color: @program-main-color;
color: @program-main-color;
}
}
}
#chart-calculate {
width: 100%;
height: 70rem;
}
#chart-statistics{
width: 100%;
height: 142rem;
}
}

View file

@ -1,113 +0,0 @@
@import "../variables";
.flex-container {
display: -webkit-flex;
display: flex;
}
.flex-container-direction(@direction) {
.flex-container;
-webkit-flex-direction: @direction;
flex-direction: @direction;
}
.flex-container-alignment(@align-items, @justify-content) {
-webkit-align-items: @align-items;
align-items: @align-items;
-webkit-justify-content: @justify-content;
justify-content: @justify-content;
}
.general-button(@width, @height) {
.flex-container;
.flex-container-alignment(center, center);
background: fade(white, 40%);
border: none;
border-radius: 10rem;
padding: 0 3rem;
height: @height;
width: @width;
&:hover {
background: fade(white, 55%);
}
&:active {
background: fade(white, 55%);
}
}
.icon-sizing(@height, @width, @top, @left) {
width: @width;
height: @height;
&:before {
top: @top;
left: @left;
}
}
.menu-list(@top, @left, @right, @width) {
position: absolute;
top: @top;
left: @left;
right: @right;
min-width: @width;
padding: 0;
margin: 0;
border: none;
box-shadow: @box-shadow;
border-radius: 2rem;
overflow: hidden;
li {
width: 100%;
button {
.flex-container;
.flex-container-alignment(center, flex-start);
background: transparent;
border: none;
color: @program-exuding-color;
font-size: 3.5rem;
height: 8.25rem;
padding-left: 3rem;
text-align: left;
width: 100%;
white-space: nowrap;
&:disabled {
color: @program-light-color;
}
&:hover {
&:not(:disabled) {
background: @program-select-hover-color;
cursor: pointer;
}
}
}
&:first-child {
button {
border-top-left-radius: 2rem;
border-top-right-radius: 2rem;
}
}
&:last-child {
button {
border-bottom-left-radius: 2rem;
border-bottom-right-radius: 2rem;
}
}
}
.menu-divider {
border-top: 1px solid @program-divider-color;
margin: 0 3.5rem;
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,125 +0,0 @@
@import "../variables";
@import "mixins";
.page-empty {
.flex-container;
.flex-container-alignment(center, center);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: -1;
color: @program-exuding-color;
text-align: center;
min-height: 150rem;
.one-block {
display: inline-block;
width: 112rem;
&.wider-block {
width: 140rem;
}
h1 {
font-size: 10.75rem;
font-weight: 200;
margin-top:6.5rem;
}
span {
font-size: 6.25rem;
margin-top: 5.5rem;
font-weight: 200;
line-height: 9.5rem;
text-align: center;
}
}
}
.dashboard-empty {
z-index: 0;
margin: 18rem 8rem;
min-height: 100rem;
.main-block {
display: block;
height: 100%;
padding: 0 30rem;
overflow: hidden;
.main-block-row {
.flex-container;
.flex-container-alignment(center, space-between);
width: 155rem;
height: 100%;
transition: transform 0.5s ease-in-out;
.main-block-col {
.flex-container-direction(column);
.flex-container-alignment(center, center);
position: relative;
margin-bottom: 0;
width: 55rem;
transition: all 0.2s ease-in-out;
.main-block-icon {
&.dashboard-create-safe {
background: url('../img/createsafe.svg') no-repeat center;
background-size: 100%;
width: 50rem;
height: 16rem;
}
&.dashboard-open-safe {
background: url('../img/opensafe.svg') no-repeat center;
background-size: 100%;
width: 50rem;
height: 20rem;
margin-top: -4rem;
}
&.dashboard-open-file-safe {
background: url('../img/openfilesafe.svg') no-repeat center;
background-size: 100%;
width: 50rem;
height: 16rem;
margin-top: -1.5rem;
margin-bottom: 1.5rem;
}
&.dashboard-open-smartsafe {
background: url('../img/opensmartsafe.svg') no-repeat center;
background-size: 100%;
width: 50rem;
height: 16rem;
margin-top: -1.5rem;
margin-bottom: 1.5rem;
}
}
.main-block-title {
font-size: 9.5rem;
font-weight: 200;
line-height: 24rem;
margin-bottom: 3rem;
white-space: nowrap;
&.smaller-size {
font-size: 8rem;
}
}
&:hover {
margin-top: -3rem;
}
}
}
.slide-up {
transform: translateY(-100%);
}
}
}

View file

@ -1,118 +0,0 @@
@import "../variables";
@import "mixins";
.main-options-wrapper {
.page-title {
color: @program-dark-color;
font-size: 8rem;
font-weight: 300;
line-height: 9rem;
margin: 0;
}
.back-btn {
.flex-container;
.flex-container-alignment(center, center);
background: transparent;
border: none;
color: @program-dark-color;
font-size: 3.75rem;
padding: 0;
margin: 0;
.base-icon {
.icon-sizing(3rem, 2rem, -4.5rem, -6rem);
margin-right: 2rem;
margin-bottom: -0.5rem;
}
}
.main-options-btn {
.general-button(auto, 8.25rem);
color: @program-button-text-color;
font-size: 4.25rem;
min-width: 45rem;
&.disabled {
color: @program-light-color;
cursor: default;
&:hover {
background: fade(white, 55%);
}
&:active {
background: fade(white, 55%);
}
}
}
.main-options-btn-group {
.flex-container-direction(row);
border-radius: 10rem;
.main-options-btn {
border-radius: 0;
min-width: 33rem;
&.button-in-group {
border-right: 1px solid @program-button-divider-color;
&:first-child {
border-top-left-radius: 10rem;
border-bottom-left-radius: 10rem;
}
&:last-child {
border-top-right-radius: 10rem;
border-bottom-right-radius: 10rem;
margin-right: 0;
}
}
&.button-in-dropdown {
border-top-right-radius: 10rem;
border-bottom-right-radius: 10rem;
.base-icon {
.icon-sizing(2rem, 2rem, -4rem, -5rem);
margin-top: 0.5rem;
margin-left: 2rem;
font-size: 12rem;
}
}
}
.dropdown.open {
.button-in-dropdown {
background: rgba(255, 255, 255, 0.55)!important;
}
}
.dropdown-menu {
.menu-list(10.5rem, inherit, -0.75rem, 47rem);
border-radius: 3rem;
li {
height: auto;
button {
font-size: 3.75rem;
padding: 1.5rem 4rem;
}
&:first-child {
border-top-left-radius: 3rem;
border-top-right-radius: 3rem;
}
&:last-child {
border-bottom-left-radius: 3rem;
border-bottom-right-radius: 3rem;
}
}
}
}
}

View file

@ -1,119 +0,0 @@
@import "../variables";
@import "mixins";
.pagination-wrapper {
.flex-container-direction(row);
.flex-container-alignment(center, space-between);
.display {
.flex-container-direction(row);
.flex-container-alignment(center, space-between);
font-size: 3.75rem;
.display-text {
color: @program-pagination-text-color;
margin-right: 2rem;
}
.display-values {
.flex-container-direction(row);
color: @program-pagination-text-inactive-color;
padding: 0;
margin: 0;
li {
display: inline-block;
margin: 0 2rem;
width: 4rem;
&:hover {
color: @program-pagination-text-color;
cursor: pointer;
}
&.active {
color: @program-pagination-text-color;
}
}
}
}
.show-all {
.flex-container;
color: @program-pagination-text-color;
cursor: pointer;
.base-icon {
.icon-sizing(6rem, 6rem, -3rem, -4rem);
margin-right: 2rem;
&.rotate-icon {
transform: rotate(180deg);
}
}
.show-all-text {
font-size: 3.75rem;
line-height: 6rem;
}
}
.pagination {
.flex-container-direction(row);
.flex-container-alignment(center, space-between);
margin: 0;
.prev-page, .next-page {
.flex-container;
.flex-container-alignment(center, center);
background-color: fade(white, 30%);
border: 1px solid @program-pagination-border-color;
border-radius: 3rem;
color: white;
height: 6rem;
width: 7.5rem;
.pagination-arrow {
.icon-sizing(4rem, 4rem, -3rem, -3.75rem);
font-size: 12rem;
}
&:hover {
background-color: fade(white, 45%);
cursor: pointer;
}
}
.prev-page {
.pagination-arrow {
transform: rotate(180deg);
}
}
.pages {
.flex-container;
color: @program-pagination-pages-color;
font-size: 3.75rem;
margin: 0 2.5rem;
span {
margin: 0 0.5rem;
}
.active-page {
width: 6rem;
.general-input{
border-bottom: none;
color: white;
padding: 0;
text-align: center;
}
}
}
}
}

View file

@ -1,212 +0,0 @@
@import "../variables";
@import "mixins";
.general-panel {
background: @program-panel-bg-color;
border: 1px solid @program-panel-border-color;
border-radius: 3rem;
margin-bottom: 6rem;
.general-panel-header {
.flex-container-direction(row);
.flex-container-alignment(center, flex-start);
background-color: @program-panel-header-bg-color;
border-top-left-radius: 2.75rem;
border-top-right-radius: 2.75rem;
color: @program-dark-color;
font-size: 5rem;
height: 13rem;
padding-left: 4rem;
.general-panel-header-arrow {
.icon-sizing(2rem, 2rem, -5rem, -6rem);
cursor: pointer;
margin-left: 2rem;
}
&.closed-panel {
border-bottom: none;
border-bottom-left-radius: 2.75rem;
border-bottom-right-radius: 2.75rem;
.general-panel-header-arrow {
transform: rotate(180deg);
}
}
}
.general-panel-body {
border-bottom-left-radius: 2.75rem;
border-bottom-right-radius: 2.75rem;
.adaptive-form {
.flex-container-direction(column);
color: @program-exuding-color;
padding-left: 32rem;
padding-right: 37rem;
i {
display: flex;
&.option-icon {
align-self: flex-end;
margin: 1.5rem 0 1.5rem 2rem;
}
}
.adaptive-form-column {
width: 100%;
.adaptive-form-field-group {
.flex-container-direction(row);
.field-group-label {
.flex-container;
.flex-container-alignment(center, flex-end);
position: relative;
color: @program-label-color;
font-size: 3.5rem;
font-weight: 600;
line-height: 3.5rem;
height: 7rem;
padding-right: 2.5rem;
margin: 0;
min-width: 31rem;
max-width: 31rem;
text-align: right;
}
.field-group-error-wrapper {
.flex-container-direction(column);
width: 100%;
.field-group-error {
display: block;
color: @error-color;
font-size: 3.25rem;
line-height: 2.75rem;
font-style: italic;
margin-top: 1.5rem;
}
}
.general-input {
&:hover, &:focus, &:active {
&:read-only:not(.no-hover) {
cursor: pointer;
}
}
}
&:hover, &.focused-line {
&:not(.no-hover) {
color: @program-hover-color;
.general-input {
border-bottom-color: @program-hover-color;
color: @program-hover-color;
&::-webkit-input-placeholder {
color: @program-input-placeholder-hover-color;
}
}
.general-input-wrapper {
border-bottom-color: @program-hover-color;
color: @program-hover-color;
::-webkit-input-placeholder {
color: @program-input-placeholder-hover-color;
}
}
.general-textarea {
border-bottom-color: @program-hover-color;
color: @program-hover-color;
&::-webkit-input-placeholder {
color: @program-input-placeholder-hover-color;
}
}
.general-select {
.dropdown-toggle {
color: @program-hover-color;
border-bottom-color: @program-hover-color;
}
}
}
.option-icon {
cursor: pointer;
visibility: visible;
}
}
}
}
@media screen and (min-width: 1085px) and (max-width: 1164px) {
padding-left: 47rem;
padding-right: 52rem;
}
@media screen and (min-width: 1165px) and (max-width: 1334px) {
.flex-container-direction(row);
padding-left: 9.5rem;
padding-right: 21.5rem;
.adaptive-form-column {
width: 50%;
&:first-child {
margin-right: 9.5rem;
}
&:last-child {
margin-left: 9.5rem;
}
}
}
@media screen and (min-width: 1335px) and (max-width: 1614px) {
.flex-container-direction(row);
padding-left: 16.5rem;
padding-right: 23.5rem;
.adaptive-form-column {
width: 50%;
&:first-child {
margin-right: 9.5rem;
}
&:last-child {
margin-left: 9.5rem;
}
}
}
@media screen and (min-width: 1615px) {
.flex-container-direction(row);
padding-left: 25rem;
padding-right: 31rem;
.adaptive-form-column {
width: 50%;
&:first-child {
margin-right: 9.5rem;
}
&:last-child {
margin-left: 9.5rem;
}
}
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,84 +0,0 @@
@import "../variables";
@import "mixins";
#settings {
padding: 2.5rem 8rem;
.main-options-wrapper {
.settings-options {
.flex-container-direction(row);
.flex-container-alignment(center, space-between);
}
}
.settings-panel {
background: @program-panel-bg-color;
border: 1px solid @program-panel-border-color;
border-radius: 3rem;
width: 100%;
.settings-panel-header {
background-color: fade(@program-panel-border-color, 30%);
border-top-left-radius: 2.75rem;
border-top-right-radius: 2.75rem;
color: @program-dark-color;
height: 21rem;
padding-left: 6rem;
h3 {
font-size: 5rem;
line-height: 21rem;
margin: 0;
}
}
.settings-panel-body {
.settings-panel-body-item {
.flex-container;
.flex-container-alignment(center, space-between);
color: @program-main-color;
font-size: 4rem;
height: 21rem;
padding-left: 6rem;
padding-right: 7rem;
.general-select {
max-width: 51.5rem;
.dropdown-menu {
&.open {
max-height: 32rem !important;
.inner{
max-height: inherit !important;
}
}
}
}
.general-range-wrapper {
width: 76rem;
}
.settings-btn {
font-size: 4rem;
height: 8.5rem;
width: 32rem;
}
&:nth-child(even) {
background-color: fade(@program-panel-border-color, 30%);
}
&:first-child {
border-top: none;
}
&:last-child {
border-bottom-left-radius: 2.75rem;
border-bottom-right-radius: 2.75rem;
}
}
}
}
}

View file

@ -1,228 +0,0 @@
@import "../variables";
@import "mixins";
.table-wrapper {
background: @program-table-bg-color;
border: 1px solid @program-table-border-color;
border-radius: 3rem;
-webkit-transform: translateZ(0);
transform: translateZ(0);
table {
border-radius: 3rem;
width: 100%;
thead {
tr {
background-color: @program-table-header-bg-color;
border: none;
border-top-left-radius: 2.75rem;
border-top-right-radius: 2.75rem;
color: @program-exuding-color;
font-size: 3.5rem;
height: 18rem;
th {
font-weight: 400;
padding: 0 1rem;
text-transform: uppercase;
white-space: nowrap;
.ordered-cell {
.flex-container-direction(row);
.flex-container-alignment(center, flex-start);
.order-icon {
.icon-sizing(2rem, 2rem, -5rem, -6rem);
color: @program-light-color;
cursor: pointer;
margin-left: 2rem;
&.rotate-icon {
transform: rotate(180deg);
}
&.active {
color: @program-exuding-color;
}
}
}
&:first-child {
border-top-left-radius: 2.75rem;
padding-left: 4rem;
}
&:last-child {
border-top-right-radius: 2.75rem;
}
}
}
}
tbody {
tr {
border: none;
color: @program-main-color;
font-size: 3.5rem;
height: 18rem;
overflow: hidden;
td {
padding: 3rem 1rem;
safe-address-copy {
align-self: flex-start;
}
&:first-child {
padding-left: 4rem;
overflow: hidden;
}
}
&:nth-child(even) {
background-color: @program-table-header-bg-color;
}
&:last-child {
border-bottom: none;
border-bottom-left-radius: 2.75rem;
border-bottom-right-radius: 2.75rem;
td:first-child {
border-bottom-left-radius: 2.75rem;
}
td:last-child {
border-bottom-right-radius: 2.75rem;
}
}
}
}
}
}
.table-long-item-wrapper {
display: inline-block;
color: @program-main-color;
max-width: 100%;
position: relative;
.table-long-item {
.flex-container;
.flex-container-alignment(center, center);
cursor: pointer;
.table-long-item-text {
overflow: hidden;
white-space: nowrap;
background: -webkit-linear-gradient(left, @program-main-color 0, @program-main-color 75%, transparent 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 3.5rem;
height: 4.5rem;
line-height: 4.5rem;
}
.separator {
color: #a1b2a2;
}
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
min-width: 4rem;
min-height: 4rem;
}
&:hover {
color: @program-hover-color;
.table-long-item-text {
background: -webkit-linear-gradient(left, @program-hover-color 0, @program-hover-color 75%, transparent 100%);
-webkit-background-clip: text;
}
.separator {
color: #cdb495;
}
}
}
&.open {
color: @program-hover-color;
.table-long-item-text {
background: -webkit-linear-gradient(left, @program-hover-color 0, @program-hover-color 75%, transparent 100%);
-webkit-background-clip: text;
span {
color: #cdb495;
}
}
}
}
.table-long-item-inner {
position: absolute;
top: 6.5rem;
left: 0;
background-color: white;
border: none;
border-radius: 2rem;
-webkit-box-shadow: @table-item-shadow;
box-shadow: @table-item-shadow;
color: @program-exuding-color;
font-size: 3.25rem;
padding: 0 3rem;
margin-left: -3rem;
margin-top: 0;
max-height: 90vh;
white-space: nowrap;
z-index: 1;
outline: none;
overflow-y: auto;
display: none;
visibility: hidden;
opacity: 0;
transform: translateY(-2em);
transition: all 0.3s ease-in-out 0s, visibility 0s linear 0.3s, z-index 0s linear 0.01s;
&.open {
visibility: visible;
max-height: 90vh;
opacity: 1;
transform: translateY(0%);
transition-delay: 0s, 0s, 0.3s;
}
div {
.flex-container;
.flex-container-alignment(center, space-between);
height: 8rem;
&:not(:last-child) {
border-bottom: 1px solid #f3f5f4;
}
}
.copy-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
color: @program-copy-icon-color;
cursor: pointer;
margin-left: 5rem;
&:hover, &.hovered {
color: @program-exuding-color;
}
&.hovered:before {
content: 'A';
}
}
}

View file

@ -1,85 +0,0 @@
@import "../variables";
@import "mixins";
.general-tabs {
.flex-container;
margin: 7.5rem auto 5rem;
padding: 0;
.general-tab {
.flex-container;
.flex-container-alignment(center, space-between);
flex: 1 0 0;
background-color: @program-tab-bg-color;
border: 1px solid @program-tab-border-color;
font-size: 6rem;
font-weight: 200;
line-height: 10rem;
button {
.flex-container;
.flex-container-alignment(center, center);
background-color: transparent;
border: none;
color: @program-tab-text-color;
height: 17rem;
line-height: 6rem;
margin: 0;
padding: 0 2rem;
width: 100%;
.base-icon {
.icon-sizing(8rem, 8rem, -2rem, -3rem);
margin-right: 2rem;
&.bigger-indent {
margin-right: 3rem;
}
&.wider-icon {
.icon-sizing(8rem, 10rem, -2rem, -2rem);
}
}
.indicator-number {
font-weight: 400;
margin-top: 1rem;
margin-left: 2.5rem;
}
&:hover, &:active {
background-color: @program-tab-hover-bg-color;
color: @program-dark-color;
cursor: pointer;
}
}
&:first-child {
border-radius: 2rem 0 0 2rem;
button {
border-radius: 1.75rem 0 0 1.75rem;
}
}
&:not(:last-child) {
border-right: none;
}
&:last-child {
border-radius: 0 2rem 2rem 0;
button {
border-radius: 0 1.75rem 1.75rem 0;
}
}
&.tab-active {
button {
background-color: @program-tab-hover-bg-color;
color: @program-dark-color;
}
}
}
}

View file

@ -1,466 +0,0 @@
@import "../variables";
@import "mixins";
.widgets {
.flex-container;
flex-wrap: wrap;
margin: 3.5rem -3.5rem 3.5rem;
.widget-wrapper {
//padding: 0 3.5rem 7rem;
//-webkit-transform: translateZ(0);
//transform: translateZ(0);
padding: 3.5rem 3.5rem;
transition: 0.1s;
.widget-block {
background: fade(white, 60%);
border: 1px solid @program-panel-border-color;
border-radius: 3rem;
.widget-header {
.flex-container;
.flex-container-alignment(center, space-between);
height: 13rem;
padding: 0 5rem;
h3 {
color: @program-exuding-color;
font-size: 5.75rem;
font-weight: 300;
margin: 0;
&.widget-select-wrapper {
.flex-container;
line-height: 6rem;
.widget-select {
.flex-container;
margin-left: 5rem;
.dropdown-toggle {
border-bottom: none;
color: @program-hover-color;
font-size: 5rem;
line-height: 6rem;
margin-bottom: -1rem;
padding: 0 3rem 0 0;
.caret {
color: @program-input-placeholder-hover-color;
}
}
.dropdown-menu {
min-width: 44rem;
}
}
}
}
.widget-menu {
.widget-menu-btn {
.flex-container;
background: transparent;
border: none;
margin: 0;
padding: 0;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
color: @program-main-color;
}
}
.widget-menu-list {
.menu-list(6.5rem, inherit, -2rem, 46rem);
}
}
}
.widget-body-wrapper {
-webkit-transform: translateZ(0);
transform: translateZ(0);
border-bottom-left-radius: 3rem;
border-bottom-right-radius: 3rem;
overflow: hidden;
.widget-body {
border-bottom-left-radius: 3rem;
border-bottom-right-radius: 3rem;
height: 53rem;
overflow-y: auto;
table {
width: 100%;
thead {
tr {
background-color: fade(white, 40%);
color: @program-exuding-color;
font-size: 3.5rem;
height: 9rem;
th {
font-weight: 400;
padding: 0 1rem;
text-transform: uppercase;
white-space: nowrap;
.ordered-cell {
.flex-container;
.flex-container-alignment(center, flex-start);
.order-icon {
.icon-sizing(2rem, 2rem, -5rem, -6rem);
color: @program-light-color;
cursor: pointer;
margin-left: 2rem;
margin-top: 0.25rem;
&.active {
color: @program-exuding-color;
}
&.rotate-icon {
transform: rotate(180deg);
}
}
}
&:first-child {
padding-left: 5rem;
}
}
}
}
tbody {
tr {
color: @program-main-color;
font-size: 3.25rem;
height: 9rem;
td {
padding: 0 1rem;
.empty-table {
color: @program-empty-color;
text-align: center;
}
&:first-child {
padding-left: 5rem;
position: relative;
}
}
&:nth-child(even) {
background-color: fade(white, 40%);
}
}
}
}
.widget-loading {
.flex-container;
.flex-container-alignment(center, center);
color: @program-empty-color;
height: 100%;
}
}
}
}
&.widget-small {
width: 50%;
}
&.widget-big {
width: 100%;
}
&.drag-not-possible {
.widget-block {
box-shadow: 0 0 10px 3px rgb(255, 95, 95);
background-color: rgba(255, 95, 95, 0.6);
}
}
}
.widget-long-item-wrapper {
max-width: 32rem;
.table-long-item {
.table-long-item-text {
font-size: 3.25rem;
}
}
}
}
.payments-widget {
tr.transaction-blocked {
background-color: @history-transaction-blocked-border-color !important;
color: @history-transaction-blocked-text-color !important;
.transaction-status-indicator {
.status-graph {
&.income {
stroke: @history-transaction-blocked-status-income-color !important;
}
&.outgoing {
stroke: @history-transaction-blocked-status-outgoing-color !important;
}
}
.status-inner {
.base-icon.income {
color: @history-transaction-blocked-status-income-color !important;
}
.base-icon.outgoing {
color: @history-transaction-blocked-status-outgoing-color !important;
}
}
}
}
.payments-marker {
&::after {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
border-left: 1rem solid @marker-light-green;
}
}
.transaction-status-indicator {
.mined-icon {
font-size: 11rem;
&:before {
top: -2.5rem;
left: -3.5rem;
}
}
}
.payments-comment-wrapper {
.flex-container;
.flex-container-alignment(center, flex-start);
max-width: 9rem;
.base-icon {
.icon-sizing(5rem, 5rem, -3.5rem, -4.5rem);
&:hover {
color: @program-hover-color;
cursor: pointer;
}
}
}
}
.contacts-widget {
tr {
td:last-child {
width: 20rem;
}
&:hover {
.contact-options-btn-wrapper {
visibility: visible;
}
}
}
.contact-name {
.flex-container;
.flex-container-alignment(center, flex-start);
font-size: 3.25rem;
white-space: nowrap;
.base-icon {
.icon-sizing(4rem, 4rem, -4rem, -5rem);
color: @program-table-icon-color;
margin-right: 1rem;
}
&:hover {
color: @program-hover-color;
cursor: pointer;
.base-icon {
color: @program-hover-color;
}
}
}
.contact-connections {
max-width: 36rem;
}
.contact-options-btn-wrapper {
.flex-container;
.flex-container-alignment(center, space-between);
visibility: hidden;
.contact-options-btn {
.flex-container;
background: transparent;
border: none;
margin: 0;
padding: 0;
color: @program-main-color;
.send-money-icon {
.icon-sizing(5rem, 5rem, -3.5rem, -4.5rem);
}
.payments-icon {
.icon-sizing(5rem, 5rem, -3.5rem, -4.5rem);
}
.delete-icon {
.icon-sizing(5rem, 5rem, -3.5rem, -4.5rem);
}
&:disabled {
color: @program-light-color;
}
&:hover {
&:not(:disabled) {
color: @program-hover-color;
}
}
}
}
}
.network-info-widget {
.network-text-wrapper {
display: inline-block;
.base-icon {
.icon-sizing(2rem, 2rem, -5rem, -6rem);
margin-left: 1rem;
}
&:hover {
color: @program-hover-color;
cursor: pointer;
}
}
}
.mining-widget {
border-top: none !important;
height: 58rem !important;
.mining-widget-empty {
.flex-container;
.flex-container-alignment(center, center);
color: @program-empty-color;
font-size: 3.75rem;
height: 100%;
}
.mining-widget-chart {
.chart-range-wrapper {
.flex-container;
.flex-container-alignment(center, space-between);
padding: 2.5rem 7rem;
.chart-range-group {
.flex-container;
.flex-container-alignment(center, center);
color: @program-dark-color;
font-size: 3rem;
.chart-range-selector {
.flex-container;
margin: 0 2.5rem;
padding: 0;
li {
border: 1px solid @mining-range-border-color;
color: @mining-range-text-color;
line-height: 5.5rem;
height: 6rem;
width: 14rem;
text-align: center;
list-style-type: none;
&:first-child {
border-radius: 3rem 0 0 3rem;
width: 14.5rem;
}
&:not(:first-child) {
border-left: none;
}
&:last-child {
border-radius: 0 3rem 3rem 0;
width: 14.5rem;
}
}
.active {
background: white;
color: @program-dark-color;
}
}
}
}
.chart-graph {
height: 47rem;
width: 100%;
}
}
}
//TODO active line when tooltip clicked
/*.active-widget-tr {
background: #dce4d3 !important;
color: #062f1b !important;
.comment {
.icon {
color: #062f1b !important;
}
}
}*/
.red-row{
background-color: #e95145 !important;
color: #FFFFFF;
}

View file

@ -1,173 +0,0 @@
@xs: ~"(max-width: 767px)";
@sm: ~"(min-width: 768px)";
@md: ~"(min-width: 992px)";
@lg: ~"(min-width: 1200px)";
@min-width: 250rem;
@background-image: url('../img/bg_blue.jpg');
@program-online-color: #5d6c78;
@program-offline-color: #cd5044;
@scroll-light-color: fade(white, 70%);
@scroll-dark-color: #7b919e;
@error-color: #e9301d;
@success-color: #1d9f5f;
@box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.25);
@modal-form-shadow: 0 0.5rem 0.75rem 0 rgba(0, 0, 0, 0.15);
@table-item-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.175);
@market-details-shadow: 0 2.5rem 6rem 0 rgba(0, 0, 0, 0.45);
@program-header-text-color: #004d73;
@program-header-text-blocked-color: #aaafb4;
@program-header-border-color: #edf2f4;
@program-header-bg-hover-color: #f4f9fb;
@program-header-bg-active-color: #d5e6f0;
@program-header-indicator-text-color: #b83a2d;
@program-header-indicator-border-color: #d48279;
@program-table-bg-color: fade(white, 60%);
@program-table-header-bg-color: fade(white, 40%);
@program-table-border-color: #e1e8eb;
@program-table-icon-color: #5a7388;
@program-table-button-border-color: #adbbbe;
@program-table-button-border-hover-color: #b3ac90;
@program-table-button-icon-hover-color: #7d5d1f;
@program-tab-bg-color: fade(white, 50%);
@program-tab-hover-bg-color: white;
@program-tab-border-color: #e1e8eb;
@program-tab-text-color: #4d7a92;
@program-filter-button-border-color: #e1e8eb;
@program-options-bg-hover-color: #f1f6f9;
@program-panel-bg-color: fade(white, 60%);
@program-panel-header-bg-color: #d5e6ef;
@program-panel-border-color: #e1e8eb;
@program-panel-divider-color: #e1e8eb;
@program-pagination-text-color: #1f415d;
@program-pagination-text-inactive-color: #83919d;
@program-pagination-border-color: #e3eaec;
@program-pagination-pages-color: #a2bac9;
@marker-red: #f1b2b2;
@marker-yellow: #fce493;
@marker-grey: #aaafb4;
@marker-escrow: #65a9de;
@marker-light-green: #a7c790;
@program-exuding-color: #142839;
@program-main-color: #1f415d;
@program-dark-color: #004d73;
@program-light-color: #929ca4;
@program-empty-color: #7190a1;
@program-hover-color: #74520f;
@program-label-color: #004d73;
@program-label-subtext-color: #417b96;
@program-label-info-color: #548ca8;
@program-modal-header-color: #d5e6ef;
@program-modal-header-close-color: #88a1b5;
@program-modal-divider-color: #dae1e2;
@program-modal-active-line-color: #61de11;
@program-select-hover-color: #eef3f6;
@program-select-selected-color: #e3ecf1;
@program-input-text-color: #142839;
@program-input-border-color: #828d97;
@program-input-placeholder-color: #aaafb4;
@program-input-placeholder-hover-color: #bca577;
@program-input-icon-color: #787f86;
@program-checkbox-border-color: #718ea7;
@program-switch-text-color: #5888a1;
@program-range-border-color: #a2b9c5;
@program-range-selected-color: #4d7a92;
@program-button-bg-color: white;
@program-button-hover-bg-color: #f5f8f9;
@program-button-active-bg-color: #f1f6f9;
@program-button-text-color: #004d73;
@program-button-border-color: #e2eaed;
@program-button-border-hover-color: #e1e2d9;
@program-button-divider-color: #c3ced4;
@program-button-done-icon-color: #60d22d;
@program-button-subtext-color: #709bb1;
@program-clear-button-color: #a64833;
@program-clear-button-hover-color: #a64833;
@program-progress-bar-bg-color: #e1e3e4;
@program-progress-bar-fill-color: #95a2ac;
@program-mined-icon-color: #81be55;
@program-payments-income-color: #67aa3b;
@program-payments-outgoing-color: #e27078;
@program-transaction-status-inner-color: #b4bcc1;
@program-transaction-status-pending-inner-color: #57b85f;
@program-transaction-status-sending-inner-color: #e47661;
@program-copy-icon-color: fade(@program-exuding-color, 50%);
@program-divider-color: #f3f5f4;
@program-selection-bg-color: #e8cca8;
@dashboard-indicator-text-color: #004d73;
@dashboard-indicator-icon-color: #004d73;
@dashboard-slider-border-color: #c6d4dc;
@dashboard-slider-icon-color: #578aa2;
@dashboard-alias-border-color: #c9d4d9;
@safes-indicator-color: #3c7592;
@safes-block-text-color: #8b96a0;
@safes-block-text-open-color: #1f415d;
@safes-block-mined-bg-color: #95b5c7;
@safes-block-mined-icon-color: #ecf1f2;
@safes-alias-border-color: #adbbbe;
@safes-alias-border-hover-color: #d5cab9;
@safes-balance-text-color: #8b96a0;
@safe-pages-switch-bg-color: white;
@safe-pages-switch-bg-hover-color: #f1f6f9;
@safe-pages-switch-border-color: #e9eef2;
@safe-pages-switch-text-color: #9ab1c4;
@safe-pages-switch-text-hover-color: #1f415d;
@safe-balance-indicator-color: #f5b81b;
@safe-mined-indicator-color: #aab5ba;
@safe-mined-completed-indicator-color: #539f42;
@safe-button-border-hover-color: #97835c;
@safe-alias-icon-color: #87929b;
@safe-alias-icon-hover-color: #828d97;
@safe-button-bg-color: fade(white, 80%);
@market-header-icon-color: #6a9cb6;
@market-favorite-color: #cd5044;
@market-detail-divider-color: #ebeeec;
@escrow-transaction-status-color: #338dd4;
@history-transaction-blocked-border-color: #e95145;
@history-transaction-blocked-text-color: #fbe3e2;
@history-transaction-blocked-status-income-color: #a2be7e;
@history-transaction-blocked-status-outgoing-color: #c51616;
@history-transaction-blocked-alias-color: #f2a09b;
@history-transaction-blocked-hover-color: #e7c48e;
@contacts-groups-border-color: #e9eef2;
@contacts-accounts-btn-text-color: #7e858c;
@export-import-contacts-text-color: #004d73;
@export-import-contacts-border-color: #e1e8eb;
@mining-range-text-color: #7190a1;
@mining-range-border-color: #e0e7ed;
@bug-report-button-color: white;
@send-money-contacts-hover-color: #f4f0d7;
@send-money-contacts-icon-hover-color: #97835c;
@send-money-contacts-address-hover-color: #bca577;
@create-safe-progress-bar-step-color: #95b5c7;
@create-safe-progress-bar-bg-color: fade(@create-safe-progress-bar-step-color, 25%);
@create-safe-progress-bar-fill-color: #89b0c6;
@modal-update-text-color: #f4f6e9;
@modal-update-green-color: #61a75b;
@modal-update-yellow-color: #cdb912;
@modal-update-red-color: #e95145;
@datepicker-nav-action-color: #004d73;
@datepicker-nav-title-color: #142839;
@datepicker-day-name-color: #a8b2b9;
@datepicker-day-other-month-color: #5888a1;
@datepicker-cell-border-color: #83a7b9;
@datepicker-cell-selected-color: #d5e6f0;
@highcharts-scrollbar-color: #a5adb5;
@highcharts-axis-line-color: fade(#a5adb5, 75%);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_2_);}
.st2{fill:url(#SVGID_3_);}
</style>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="512.55" y1="984.3" x2="512.55" y2="39.3" gradientTransform="matrix(1 0 0 -1 0 1024)">
<stop offset="0" style="stop-color:#1ECED0"/>
<stop offset="0.5" style="stop-color:#8AA9F4"/>
<stop offset="1" style="stop-color:#6A44FB"/>
</linearGradient>
<polygon class="st0" points="679.6,984.7 193.5,305.1 344.4,39.7 831.6,715.3 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="217.75" y1="700.86" x2="217.75" y2="382.2152" gradientTransform="matrix(1 0 0 -1 0 1024)">
<stop offset="0" style="stop-color:#57B7E3"/>
<stop offset="1" style="stop-color:#7E8AF4;stop-opacity:0"/>
</linearGradient>
<polygon class="st1" points="193.5,305.1 435.5,643.4 0,643.4 "/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="807.25" y1="332.3745" x2="807.25" y2="641.9303" gradientTransform="matrix(1 0 0 -1 0 1024)">
<stop offset="0" style="stop-color:#7C83F4"/>
<stop offset="1" style="stop-color:#68B0E9;stop-opacity:0"/>
</linearGradient>
<polygon class="st2" points="831.6,715.3 590.5,381 1024,381 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

Before

Width:  |  Height:  |  Size: 708 B

After

Width:  |  Height:  |  Size: 708 B

View file

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 1 KiB

View file

Before

Width:  |  Height:  |  Size: 931 B

After

Width:  |  Height:  |  Size: 931 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -38,3 +38,4 @@ testem.log
.DS_Store
Thumbs.db
/package.json
/package-lock.json

View file

@ -24,7 +24,8 @@
"tsConfig": "src/tsconfig.app.json",
"assets": [
"src/favicon.ico",
"src/assets"
"src/assets",
"src/files"
],
"styles": [
"src/styles.scss"

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,11 @@
<div class="modal">
<div class="content">
<i class="icon"></i>
<div class="message">
<span>Success</span>
<span>Successfully</span>
<i class="icon" [class.error]="type === 'error'" [class.success]="type === 'success'" [class.info]="type === 'info'"></i>
<div class="message-container">
<span class="title">{{title}}</span>
<span class="message">{{message}}</span>
</div>
</div>
<button type="button" class="action-button" (click)="false">OK</button>
<button type="button" class="close-button" (click)="false"><i class="icon close"></i></button>
<button type="button" class="action-button" (click)="onClose()" #btn>OK</button>
<button type="button" class="close-button" (click)="onClose()"><i class="icon close"></i></button>
</div>

View file

@ -13,28 +13,53 @@
position: relative;
display: flex;
flex-direction: column;
background-position: center;
background-size: 200%;
padding: 2rem;
width: 34rem;
background: #1a1a1a;
.content {
display: flex;
margin: 1.2rem 0;
.icon {
flex: 0 0 auto;
width: 4.4rem;
height: 4.4rem;
&.error {
mask: url(~src/assets/icons/modal-alert.svg) no-repeat center;
}
&.success {
mask: url(~src/assets/icons/modal-success.svg) no-repeat center;
}
&.info {
mask: url(~src/assets/icons/modal-info.svg) no-repeat center;
}
}
.message {
.message-container {
display: flex;
flex-direction: column;
margin-left: 2rem;
.title {
font-size: 1.8rem;
font-weight: 600;
line-height: 2.2rem;
}
.message {
font-size: 1.3rem;
line-height: 1.8rem;
margin-top: 0.4rem;
}
}
}
.action-button {
background: #2c95f1;
margin: 1.2rem auto 0.6rem;
width: 10rem;
height: 2.4rem;
@ -42,15 +67,21 @@
.close-button {
position: absolute;
top: 0.5rem;
right: 0.5rem;
top: 0;
right: 0;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
margin: 0;
padding: 0;
width: 1.5rem;
height: 1.5rem;
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

@ -1,4 +1,4 @@
import { Component, OnInit } from '@angular/core';
import {Component, OnInit, Input, Output, EventEmitter, ViewChild, ElementRef} from '@angular/core';
@Component({
selector: 'app-modal-container',
@ -7,9 +7,25 @@ import { Component, OnInit } from '@angular/core';
})
export class ModalContainerComponent implements OnInit {
constructor() { }
public title: string;
@Input() type: string;
@Input() message: string;
@Output() close = new EventEmitter<boolean>();
@ViewChild('btn') button: ElementRef;
constructor() {}
ngOnInit() {
this.button.nativeElement.focus();
switch (this.type) {
case 'error': this.title = 'Wrong'; break;
case 'success': this.title = 'Success'; break;
case 'info': this.title = 'Information'; break;
default: this.title = 'Unexpected'; break;
}
}
onClose() {
this.close.emit();
}
}

View file

@ -13,11 +13,9 @@ export class StakingSwitchComponent implements OnInit {
@Input() staking: boolean;
@Output() stakingChange = new EventEmitter<boolean>();
constructor(private backend: BackendService, private variablesService: VariablesService) {
}
constructor(private backend: BackendService, private variablesService: VariablesService) {}
ngOnInit() {
}
ngOnInit() {}
toggleStaking() {
const wallet = this.variablesService.getWallet(this.wallet_id);

View file

@ -1,28 +1,36 @@
import {Directive, Input, ElementRef, HostListener, Renderer2} from '@angular/core';
import {Directive, Input, ElementRef, HostListener, Renderer2, HostBinding} from '@angular/core';
@Directive({
selector: '[tooltip]',
host: {
'[style.cursor]': '"pointer"'
}
selector: '[tooltip]'
})
export class TooltipDirective {
@HostBinding('style.cursor') cursor = 'pointer';
@Input('tooltip') tooltipTitle: string;
@Input() placement: string;
@Input() tooltipClass: string;
@Input() delay: number;
tooltip: HTMLElement;
offset = 10;
constructor(private el: ElementRef, private renderer: Renderer2) {}
removeTooltipTimeout;
constructor(private el: ElementRef, private renderer: Renderer2) {
}
@HostListener('mouseenter') onMouseEnter() {
if (!this.tooltip) { this.show(); }
if (!this.tooltip) {
this.show();
} else {
this.cancelHide();
}
}
@HostListener('mouseleave') onMouseLeave() {
if (this.tooltip) { this.hide(); }
if (this.tooltip) {
this.hide();
}
}
show() {
@ -32,12 +40,17 @@ export class TooltipDirective {
hide() {
this.renderer.setStyle(this.tooltip, 'opacity', '0');
window.setTimeout(() => {
this.removeTooltipTimeout = setTimeout(() => {
this.renderer.removeChild(document.body, this.tooltip);
this.tooltip = null;
}, this.delay);
}
cancelHide() {
clearTimeout(this.removeTooltipTimeout);
this.renderer.setStyle(this.tooltip, 'opacity', '1');
}
create() {
this.tooltip = this.renderer.createElement('span');
this.renderer.appendChild(this.tooltip, this.renderer.createText(this.tooltipTitle));
@ -76,8 +89,15 @@ export class TooltipDirective {
}
if (this.placement === 'bottom') {
this.renderer.setStyle(this.tooltip, 'top', hostPos.bottom + 'px');
this.renderer.setStyle(this.tooltip, 'left', hostPos.left + 'px');
if (window.innerHeight < hostPos.bottom + this.tooltip.offsetHeight + parseInt(getComputedStyle(this.tooltip).marginTop, 10)) {
this.renderer.removeClass(this.tooltip, 'ng-tooltip-bottom');
this.renderer.addClass(this.tooltip, 'ng-tooltip-top');
this.renderer.setStyle(this.tooltip, 'top', hostPos.top - tooltipPos.height + 'px');
this.renderer.setStyle(this.tooltip, 'left', hostPos.left + 'px');
} else {
this.renderer.setStyle(this.tooltip, 'top', hostPos.bottom + 'px');
this.renderer.setStyle(this.tooltip, 'left', hostPos.left + 'px');
}
}
if (this.placement === 'left') {

View file

@ -1,6 +1,8 @@
import {Injectable} from '@angular/core';
import {Observable} from 'rxjs';
import {TranslateService} from '@ngx-translate/core';
import {VariablesService} from './variables.service';
import {ModalService} from './modal.service';
import {MoneyToIntPipe} from '../pipes/money-to-int.pipe';
@Injectable()
@ -9,9 +11,7 @@ export class BackendService {
backendObject: any;
backendLoaded = false;
constructor(private variablesService: VariablesService, private moneyToIntPipe: MoneyToIntPipe) {
}
constructor(private translate: TranslateService, private variablesService: VariablesService, private modalService: ModalService, private moneyToIntPipe: MoneyToIntPipe) {}
private Debug(type, message) {
switch (type) {
@ -35,11 +35,11 @@ export class BackendService {
switch (error) {
case 'NOT_ENOUGH_MONEY':
error_translate = 'ERROR.NOT_ENOUGH_MONEY';
error_translate = 'ERRORS.NOT_ENOUGH_MONEY';
break;
case 'CORE_BUSY':
if (command !== 'get_all_aliases') {
error_translate = 'INFORMER.CORE_BUSY';
error_translate = 'ERRORS.CORE_BUSY';
}
break;
case 'OVERFLOW':
@ -48,62 +48,62 @@ export class BackendService {
}
break;
case 'INTERNAL_ERROR:daemon is busy':
error_translate = 'INFORMER.DAEMON_BUSY';
error_translate = 'ERRORS.DAEMON_BUSY';
break;
case 'INTERNAL_ERROR:not enough money':
case 'INTERNAL_ERROR:NOT_ENOUGH_MONEY':
if (command === 'cancel_offer') {
// error_translate = $filter('translate')('INFORMER.NO_MONEY_REMOVE_OFFER', {
// 'fee': CONFIG.standart_fee,
// 'currency': CONFIG.currency_symbol
// });
error_translate = this.translate.instant('ERRORS.NO_MONEY_REMOVE_OFFER', {
'fee': '0.01',
'currency': 'ZAN'
});
} else {
error_translate = 'INFORMER.NO_MONEY';
}
break;
case 'INTERNAL_ERROR:not enough outputs to mix':
error_translate = 'MESSAGE.NOT_ENOUGH_OUTPUTS_TO_MIX';
error_translate = 'ERRORS.NOT_ENOUGH_OUTPUTS_TO_MIX';
break;
case 'INTERNAL_ERROR:transaction is too big':
error_translate = 'MESSAGE.TRANSACTION_IS_TO_BIG';
error_translate = 'ERRORS.TRANSACTION_IS_TO_BIG';
break;
case 'INTERNAL_ERROR:Transfer attempt while daemon offline':
error_translate = 'MESSAGE.TRANSFER_ATTEMPT';
error_translate = 'ERRORS.TRANSFER_ATTEMPT';
break;
case 'ACCESS_DENIED':
error_translate = 'INFORMER.ACCESS_DENIED';
error_translate = 'ERRORS.ACCESS_DENIED';
break;
case 'INTERNAL_ERROR:transaction was rejected by daemon':
if (command === 'request_alias_registration') {
error_translate = 'INFORMER.ALIAS_IN_REGISTER';
} else {
error_translate = 'INFORMER.TRANSACTION_ERROR';
}
// if (command === 'request_alias_registration') {
// error_translate = 'INFORMER.ALIAS_IN_REGISTER';
// } else {
error_translate = 'ERRORS.TRANSACTION_ERROR';
// }
break;
case 'INTERNAL_ERROR':
error_translate = 'INFORMER.TRANSACTION_ERROR';
error_translate = 'ERRORS.TRANSACTION_ERROR';
break;
case 'BAD_ARG':
error_translate = 'INFORMER.BAD_ARG';
error_translate = 'ERRORS.BAD_ARG';
break;
case 'WALLET_WRONG_ID':
error_translate = 'INFORMER.WALLET_WRONG_ID';
error_translate = 'ERRORS.WALLET_WRONG_ID';
break;
case 'WRONG_PASSWORD':
case 'WRONG_PASSWORD:invalid password':
params = JSON.parse(params);
if (!params.testEmpty) {
error_translate = 'INFORMER.WRONG_PASSWORD';
error_translate = 'ERRORS.WRONG_PASSWORD';
}
break;
case 'FILE_RESTORED':
if (command === 'open_wallet') {
// error_translate = $filter('translate')('INFORMER.FILE_RESTORED');
error_translate = 'ERRORS.FILE_RESTORED';
}
break;
case 'FILE_NOT_FOUND':
if (command !== 'open_wallet' && command !== 'get_alias_info_by_name' && command !== 'get_alias_info_by_address') {
// error_translate = $filter('translate')('INFORMER.FILE_NOT_FOUND');
error_translate = this.translate.instant('ERRORS.FILE_NOT_FOUND');
params = JSON.parse(params);
if (params.path) {
error_translate += ': ' + params.path;
@ -119,16 +119,16 @@ export class BackendService {
}
break;
case 'ALREADY_EXISTS':
error_translate = 'INFORMER.FILE_EXIST';
error_translate = 'ERRORS.FILE_EXIST';
break;
default:
error_translate = error;
}
if (error.indexOf('FAIL:failed to save file') > -1) {
error_translate = 'INFORMER.FILE_NOT_SAVED';
error_translate = 'ERRORS.FILE_NOT_SAVED';
}
if (error_translate !== '') {
alert(error_translate);
this.modalService.prepareModal('error', error_translate);
}
}
@ -272,7 +272,7 @@ export class BackendService {
}
storeSecureAppData(callback) {
if ( this.variablesService.appPass === '' ) {
if (this.variablesService.appPass === '') {
return callback(false);
}
const wallets = [];
@ -461,6 +461,10 @@ export class BackendService {
this.runCommand('stop_pos_mining', {wallet_id: parseInt(wallet_id, 10)}, callback);
}
openUrlInBrowser(url, callback?) {
this.runCommand('open_url_in_browser', url, callback);
}
}
@ -653,9 +657,7 @@ export class BackendService {
return this.runCommand('print_log', {msg: msg, log_level: log_level});
},
openUrlInBrowser: function (url, callback) {
return this.runCommand('open_url_in_browser', url, callback);
},

View file

@ -0,0 +1,12 @@
import { TestBed } from '@angular/core/testing';
import { ModalService } from './modal.service';
describe('ModalService', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: ModalService = TestBed.get(ModalService);
expect(service).toBeTruthy();
});
});

View file

@ -0,0 +1,52 @@
import {Injectable, Injector, ComponentFactoryResolver, EmbeddedViewRef, ApplicationRef, NgZone} from '@angular/core';
import {TranslateService} from '@ngx-translate/core';
import {ModalContainerComponent} from '../directives/modal-container/modal-container.component';
@Injectable()
export class ModalService {
private components: any[] = [];
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
private appRef: ApplicationRef,
private injector: Injector,
private ngZone: NgZone,
private translate: TranslateService
) {}
prepareModal(type, message) {
const length = this.components.push(
this.componentFactoryResolver.resolveComponentFactory(ModalContainerComponent).create(this.injector)
);
this.components[length - 1].instance['type'] = type;
this.components[length - 1].instance['message'] = this.translate.instant(message);
this.components[length - 1].instance['close'].subscribe(() => {
this.removeModal(length - 1);
});
this.ngZone.run(() => {
this.appendModal(length - 1);
});
}
appendModal(index) {
this.appRef.attachView(this.components[index].hostView);
const domElem = (this.components[index].hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;
document.body.appendChild(domElem);
}
removeModal(index) {
if (this.components[index]) {
this.appRef.detachView(this.components[index].hostView);
this.components[index].destroy();
this.components.splice(index, 1);
} else {
const last = this.components.length - 1;
this.appRef.detachView(this.components[last].hostView);
this.components[last].destroy();
this.components.splice(last, 1);
}
}
}

View file

@ -82,7 +82,7 @@ export class VariablesService {
}
startCountdown() {
this.idle.restart();
this.idle.start();
}
stopCountdown() {

View file

@ -75,7 +75,7 @@ const routes: Routes = [
},
{
path: '',
redirectTo: 'send',
redirectTo: 'history',
pathMatch: 'full'
}
]

View file

@ -385,7 +385,6 @@ export class AppComponent implements OnInit, OnDestroy {
}
getMoneyEquivalent() {
// todo now start only once, need check daemon state and re-init
this.http.get('https://api.coinmarketcap.com/v2/ticker/2').subscribe(
result => {
if (result.hasOwnProperty('data')) {
@ -393,6 +392,9 @@ export class AppComponent implements OnInit, OnDestroy {
}
},
error => {
setTimeout(() => {
this.getMoneyEquivalent();
}, 60000);
console.warn('Error coinmarketcap', error);
}
);

View file

@ -29,6 +29,7 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { TypingMessageComponent } from './typing-message/typing-message.component';
import { BackendService } from './_helpers/services/backend.service';
import { ModalService } from './_helpers/services/modal.service';
import { MoneyToIntPipe } from './_helpers/pipes/money-to-int.pipe';
import { IntToMoneyPipe } from './_helpers/pipes/int-to-money.pipe';
import { StakingSwitchComponent } from './_helpers/directives/staking-switch/staking-switch.component';
@ -105,10 +106,14 @@ Highcharts.setOptions({
],
providers: [
BackendService,
ModalService,
MoneyToIntPipe,
IntToMoneyPipe,
// {provide: HIGHCHARTS_MODULES, useFactory: () => [ highstock, more, exporting ] }
],
entryComponents: [
ModalContainerComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }

View file

@ -10,60 +10,71 @@
margin: -3rem -3rem 0 -3rem;
overflow-x: auto;
.contract {
position: relative;
display: flex;
align-items: center;
table {
.icon {
flex-shrink: 0;
tbody {
&.new, &.alert {
position: absolute;
top: 0;
}
tr {
cursor: pointer;
outline: none !important;
&.new {
left: -2.3rem;
mask: url(../../assets/icons/new.svg) no-repeat center;
width: 1.7rem;
height: 1.7rem;
}
.contract {
position: relative;
display: flex;
align-items: center;
&.alert {
top: 0.2rem;
left: -2.1rem;
mask: url(../../assets/icons/alert.svg) no-repeat center;
width: 1.2rem;
height: 1.2rem;
}
.icon {
flex-shrink: 0;
&.purchase, &.sell {
margin-right: 1rem;
width: 1.5rem;
height: 1.5rem;
}
&.new, &.alert {
position: absolute;
top: 0;
}
&.purchase {
mask: url(../../assets/icons/purchase.svg) no-repeat center;
}
&.new {
left: -2.3rem;
mask: url(../../assets/icons/new.svg) no-repeat center;
width: 1.7rem;
height: 1.7rem;
}
&.sell {
mask: url(../../assets/icons/sell.svg) no-repeat center;
&.alert {
top: 0.2rem;
left: -2.1rem;
mask: url(../../assets/icons/alert.svg) no-repeat center;
width: 1.2rem;
height: 1.2rem;
}
&.purchase, &.sell {
margin-right: 1rem;
width: 1.5rem;
height: 1.5rem;
}
&.purchase {
mask: url(../../assets/icons/purchase.svg) no-repeat center;
}
&.sell {
mask: url(../../assets/icons/sell.svg) no-repeat center;
}
}
span {
text-overflow: ellipsis;
overflow: hidden;
max-width: 20vw;
}
}
.status, .comment {
text-overflow: ellipsis;
overflow: hidden;
max-width: 20vw;
}
}
}
span {
text-overflow: ellipsis;
overflow: hidden;
max-width: 20vw;
}
}
.status, .comment {
text-overflow: ellipsis;
overflow: hidden;
max-width: 20vw;
}
}

View file

@ -16,7 +16,8 @@ export class ContractsComponent implements OnInit, OnDestroy {
private route: ActivatedRoute,
private router: Router,
private variablesService: VariablesService
) {}
) {
}
ngOnInit() {
this.parentRouting = this.route.parent.params.subscribe(params => {

View file

@ -2,7 +2,7 @@
<div class="head">
<div class="breadcrumbs">
<span>{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span [routerLink]="['/main']">{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span>{{ 'BREADCRUMBS.CREATE_WALLET' | translate }}</span>
</div>
<a class="back-btn" [routerLink]="['/main']">

View file

@ -2,8 +2,10 @@ import {Component, NgZone, OnInit} from '@angular/core';
import {FormGroup, FormControl, Validators} from '@angular/forms';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
import {ModalService} from '../_helpers/services/modal.service';
import {Router} from '@angular/router';
import {Wallet} from '../_helpers/models/wallet.model';
import {TranslateService} from '@ngx-translate/core';
@Component({
selector: 'app-create-wallet',
@ -37,7 +39,9 @@ export class CreateWalletComponent implements OnInit {
private router: Router,
private backend: BackendService,
private variablesService: VariablesService,
private ngZone: NgZone
private modalService: ModalService,
private ngZone: NgZone,
private translate: TranslateService
) {
}
@ -50,7 +54,7 @@ export class CreateWalletComponent implements OnInit {
saveWallet() {
if (this.createForm.valid) {
this.backend.saveFileDialog('Save the wallet file.', '*', this.variablesService.settings.default_path, (file_status, file_data) => {
this.backend.saveFileDialog(this.translate.instant('CREATE_WALLET.TITLE_SAVE'), '*', this.variablesService.settings.default_path, (file_status, file_data) => {
if (file_status) {
this.variablesService.settings.default_path = file_data.path.substr(0, file_data.path.lastIndexOf('/'));
this.backend.generateWallet(file_data.path, this.createForm.get('password').value, (generate_status, generate_data, errorCode) => {
@ -72,9 +76,9 @@ export class CreateWalletComponent implements OnInit {
});
} else {
if (errorCode && errorCode === 'ALREADY_EXISTS') {
alert('You cannot record a file on top of another file');
this.modalService.prepareModal('error', 'CREATE_WALLET.ERROR_CANNOT_SAVE_TOP');
} else {
alert('You cannot save a safe file to the system partition');
this.modalService.prepareModal('error', 'CREATE_WALLET.ERROR_CANNOT_SAVE_SYSTEM');
}
}
});

View file

@ -13,15 +13,19 @@
<tr *ngFor="let item of variablesService.currentWallet.history">
<td>
<div class="status" [class.send]="!item.is_income" [class.received]="item.is_income">
<div class="confirmation" tooltip="{{ 'HISTORY.STATUS_TOOLTIP' | translate : {'current': getHeight(item)/10, 'total': 10} }}" placement="bottom" tooltipClass="history-tooltip" delay="500">
<div class="fill" [style.height]="getHeight(item) + '%'"></div>
</div>
<ng-container *ngIf="variablesService.height_app - item.height <= 10 || item.height === 0 || (item.is_mining && item.height === 0)">
<div class="confirmation" tooltip="{{ 'HISTORY.STATUS_TOOLTIP' | translate : {'current': getHeight(item)/10, 'total': 10} }}" placement="bottom" tooltipClass="history-tooltip" delay="500">
<div class="fill" [style.height]="getHeight(item) + '%'"></div>
</div>
</ng-container>
<i class="icon"></i>
<span>{{ (item.is_income ? 'HISTORY.RECEIVED' : 'HISTORY.SEND') | translate }}</span>
</div>
</td>
<td>{{item.timestamp * 1000 | date : 'dd-MM-yyyy HH:mm'}}</td>
<td>{{item.sortAmount | intToMoney}} {{variablesService.defaultCurrency}}</td>
<td>
<span *ngIf="item.sortAmount">{{item.sortAmount | intToMoney}} {{variablesService.defaultCurrency}}</span>
</td>
<td>
<span *ngIf="item.sortFee">{{item.sortFee | intToMoney}} {{variablesService.defaultCurrency}}</span>
</td>

View file

@ -1,6 +1,4 @@
import {Component, OnInit, OnDestroy} from '@angular/core';
import {ActivatedRoute} from '@angular/router';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
@Component({
@ -9,19 +7,11 @@ import {VariablesService} from '../_helpers/services/variables.service';
styleUrls: ['./history.component.scss']
})
export class HistoryComponent implements OnInit, OnDestroy {
parentRouting;
constructor(
private route: ActivatedRoute,
private backend: BackendService,
private variablesService: VariablesService
) {
constructor(private variablesService: VariablesService) {
}
ngOnInit() {
this.parentRouting = this.route.parent.params.subscribe(() => {
console.log(this.variablesService.currentWallet.history);
});
}
getHeight(item) {
@ -37,7 +27,6 @@ export class HistoryComponent implements OnInit, OnDestroy {
}
ngOnDestroy() {
this.parentRouting.unsubscribe();
}
}

View file

@ -14,9 +14,9 @@
max-width: 40rem;
.logo {
background: url("../../assets/images/logo.png") no-repeat center top;
background: url(../../assets/icons/logo.svg) no-repeat center;
width: 100%;
height: 14rem;
height: 20rem;
}
.form-login {

View file

@ -1,8 +1,9 @@
import {Component, NgZone, OnInit} from '@angular/core';
import {Component, NgZone, OnInit, OnDestroy} from '@angular/core';
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';
import {ModalService} from '../_helpers/services/modal.service';
import {Wallet} from '../_helpers/models/wallet.model';
@Component({
@ -10,7 +11,9 @@ import {Wallet} from '../_helpers/models/wallet.model';
templateUrl: './login.component.html',
styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {
export class LoginComponent implements OnInit, OnDestroy {
queryRouting;
regForm = new FormGroup({
password: new FormControl('', Validators.required),
@ -30,12 +33,13 @@ export class LoginComponent implements OnInit {
private router: Router,
private backend: BackendService,
private variablesService: VariablesService,
private modalService: ModalService,
private ngZone: NgZone
) {
}
ngOnInit() {
this.route.queryParams.subscribe(params => {
this.queryRouting = this.route.queryParams.subscribe(params => {
if (params.type) {
this.type = params.type;
}
@ -51,7 +55,6 @@ export class LoginComponent implements OnInit {
this.router.navigate(['/']);
});
} else {
// TODO error sign in
console.log(data['error_code']);
}
});
@ -62,10 +65,7 @@ export class LoginComponent implements OnInit {
if (this.authForm.valid) {
const appPass = this.authForm.get('password').value;
this.backend.getSecureAppData({pass: appPass}, (status, data) => {
if (data.error_code && data.error_code === 'WRONG_PASSWORD') {
// TODO error log in informer.error('MESSAGE.INCORRECT_PASSWORD');
console.log('WRONG_PASSWORD');
} else {
if (!data.error_code) {
this.variablesService.startCountdown();
this.variablesService.appPass = appPass;
if (this.variablesService.wallets.length) {
@ -139,4 +139,10 @@ export class LoginComponent implements OnInit {
});
}
}
ngOnDestroy() {
this.queryRouting.unsubscribe();
}
}

View file

@ -6,7 +6,7 @@
<button type="button" class="blue-button" (click)="openWallet()">{{ 'MAIN.BUTTON_OPEN_WALLET' | translate }}</button>
<button type="button" class="blue-button" [routerLink]="['/restore']">{{ 'MAIN.BUTTON_RESTORE_BACKUP' | translate }}</button>
</div>
<div class="add-wallet-help">
<div class="add-wallet-help" (click)="openInBrowser()">
<i class="icon"></i><span>{{ 'MAIN.HELP' | translate }}</span>
</div>
</div>

View file

@ -29,6 +29,7 @@
.add-wallet-help {
display: flex;
cursor: pointer;
font-size: 1.3rem;
line-height: 1.4rem;

View file

@ -2,6 +2,7 @@ import {Component, NgZone, OnInit} from '@angular/core';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
import {Router} from '@angular/router';
import {TranslateService} from '@ngx-translate/core';
@Component({
selector: 'app-main',
@ -14,13 +15,14 @@ export class MainComponent implements OnInit {
private router: Router,
private backend: BackendService,
private variablesService: VariablesService,
private ngZone: NgZone
private ngZone: NgZone,
private translate: TranslateService
) {}
ngOnInit() {}
openWallet() {
this.backend.openFileDialog('Open the wallet file.', '*', this.variablesService.settings.default_path, (file_status, file_data) => {
this.backend.openFileDialog(this.translate.instant('MAIN.CHOOSE_PATH'), '*', this.variablesService.settings.default_path, (file_status, file_data) => {
if (file_status) {
this.variablesService.settings.default_path = file_data.path.substr(0, file_data.path.lastIndexOf('/'));
this.ngZone.run(() => {
@ -32,4 +34,8 @@ export class MainComponent implements OnInit {
});
}
openInBrowser() {
this.backend.openUrlInBrowser('zano.org');
}
}

View file

@ -2,7 +2,7 @@
<div class="head">
<div class="breadcrumbs">
<span>{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span [routerLink]="['/main']">{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span>{{ 'BREADCRUMBS.OPEN_WALLET' | translate }}</span>
</div>
<a class="back-btn" [routerLink]="['/main']">

View file

@ -1,17 +1,20 @@
import {Component, NgZone, OnInit} from '@angular/core';
import {Component, NgZone, OnDestroy, OnInit} from '@angular/core';
import {FormGroup, FormControl, Validators} from '@angular/forms';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
import {ModalService} from '../_helpers/services/modal.service';
import {ActivatedRoute, Router} from '@angular/router';
import {Wallet} from '../_helpers/models/wallet.model';
import {TranslateService} from '@ngx-translate/core';
@Component({
selector: 'app-open-wallet',
templateUrl: './open-wallet.component.html',
styleUrls: ['./open-wallet.component.scss']
})
export class OpenWalletComponent implements OnInit {
export class OpenWalletComponent implements OnInit, OnDestroy {
queryRouting;
filePath: string;
openForm = new FormGroup({
@ -31,12 +34,14 @@ export class OpenWalletComponent implements OnInit {
private router: Router,
private backend: BackendService,
private variablesService: VariablesService,
private ngZone: NgZone
private modalService: ModalService,
private ngZone: NgZone,
private translate: TranslateService
) {
}
ngOnInit() {
this.route.queryParams.subscribe(params => {
this.queryRouting = this.route.queryParams.subscribe(params => {
if (params.path) {
this.filePath = params.path;
let filename = '';
@ -57,11 +62,11 @@ export class OpenWalletComponent implements OnInit {
if (this.openForm.valid) {
this.backend.openWallet(this.filePath, this.openForm.get('password').value, false, (open_status, open_data, open_error) => {
if (open_error && open_error === 'FILE_NOT_FOUND') {
// var error_translate = $filter('translate')('INFORMER.SAFE_FILE_NOT_FOUND1');
let error_translate = this.translate.instant('OPEN_WALLET.SAFE_FILE_NOT_FOUND1');
// error_translate += ':<br>' + $scope.safe.path;
// error_translate += $filter('translate')('INFORMER.SAFE_FILE_NOT_FOUND2');
// informer.fileNotFound(error_translate);
alert('FILE_NOT_FOUND');
error_translate += ':<br>' + this.filePath;
error_translate += this.translate.instant('OPEN_WALLET.SAFE_FILE_NOT_FOUND2');
this.modalService.prepareModal('error', error_translate);
} else {
if (open_status || open_error === 'FILE_RESTORED') {
@ -73,9 +78,8 @@ export class OpenWalletComponent implements OnInit {
});
if (exists) {
alert('SAFES.WITH_ADDRESS_ALREADY_OPEN');
this.modalService.prepareModal('error', 'OPEN_WALLET.WITH_ADDRESS_ALREADY_OPEN');
this.backend.closeWallet(open_data.wallet_id, (close_status, close_data) => {
console.log(close_status, close_data);
this.ngZone.run(() => {
this.router.navigate(['/']);
});
@ -122,4 +126,8 @@ export class OpenWalletComponent implements OnInit {
}
}
ngOnDestroy() {
this.queryRouting.unsubscribe();
}
}

View file

@ -1,6 +1,6 @@
<div class="head">
<div class="breadcrumbs">
<span>{{ 'BREADCRUMBS.CONTRACTS' | translate }}</span>
<span [routerLink]="'/wallet/' + currentWalletId + '/contracts'">{{ 'BREADCRUMBS.CONTRACTS' | translate }}</span>
<span *ngIf="newPurchase">{{ 'BREADCRUMBS.NEW_PURCHASE' | translate }}</span>
<span *ngIf="!newPurchase">{{ 'BREADCRUMBS.OLD_PURCHASE' | translate }}</span>
</div>
@ -78,7 +78,7 @@
<div class="input-block">
<label for="purchase-comment">{{ 'PURCHASE.COMMENT' | translate }}</label>
<input type="text" id="purchase-comment" formControlName="comment" (contextmenu)="variablesService.onContextMenu($event)">
<input type="text" id="purchase-comment" formControlName="comment" [readonly]="!newPurchase" (contextmenu)="variablesService.onContextMenu($event)">
</div>
<button type="button" class="purchase-select" (click)="toggleOptions()">
@ -90,6 +90,14 @@
<label for="purchase-fee">{{ 'PURCHASE.FEE' | translate }}</label>
<input type="text" id="purchase-fee" formControlName="fee" readonly>
</div>
<div class="input-block" *ngIf="newPurchase">
<label for="purchase-time">{{ 'PURCHASE.WAITING_TIME' | translate }}</label>
<select id="purchase-time" formControlName="time">
<option *ngFor="let title of [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]" [value]="title">
{{title}}
</option>
</select>
</div>
<div class="input-block">
<label for="purchase-payment">{{ 'PURCHASE.PAYMENT' | translate }}</label>
<input type="text" id="purchase-payment" formControlName="payment" [readonly]="!newPurchase" (contextmenu)="variablesService.onContextMenu($event)">
@ -105,7 +113,7 @@
</ng-container>
<ng-container *ngIf="currentContract.is_a">
<span *ngIf="currentContract.state == 1">{{ 'DEALS.CUSTOMER_WAITING_ANSWER' | translate }}</span>
<span *ngIf="currentContract.state == 1">{{ 'Waiting for seller respond to contract proposal' | translate }}</span>
<!--<span *ngIf="currentContract.state == 1" ng-bind="'(' + (currentContract.expiration_time | buyingTime : 0) + ')'"></span>-->
<span *ngIf="currentContract.state == 110">{{ 'The seller ignored your contract proposal' | translate }}</span>
@ -167,8 +175,9 @@
</ng-container>
<ng-container *ngIf="currentContract.state == 201 || currentContract.state == 601">
<span *ngIf="(variablesService.height_app - currentContract.height) < 10">{{variablesService.height_app - currentContract.height}}/10</span>
<span *ngIf="historyBlock && historyBlock.sortAmount">{{(historyBlock.is_income ? '+' : '') + (historyBlock.sortAmount | intToMoney)}}</span>
<span *ngIf="currentContract.height === 0">0/10</span>
<span *ngIf="currentContract.height !== 0 && (variablesService.height_app - currentContract.height) < 10">{{variablesService.height_app - currentContract.height}}/10</span>
<span *ngIf="historyBlock && historyBlock.sortAmount">{{(historyBlock.is_income ? '+' : '') + (historyBlock.sortAmount | intToMoney)}} {{variablesService.defaultCurrency}}</span>
</ng-container>
</div>
@ -204,6 +213,17 @@
</div>
<div style="display: flex; justify-content: center;" *ngIf="!newPurchase && currentContract.is_a && (currentContract.state == 201 || currentContract.state == 2 || currentContract.state == 120 || currentContract.state == 130)">
<div class="input-block">
<label for="purchase-timeCancel">{{ 'PURCHASE.WAITING_TIME' | translate }}</label>
<select id="purchase-timeCancel" formControlName="timeCancel">
<option *ngFor="let title of [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]" [value]="title">
{{title}}
</option>
</select>
</div>
</div>
</form>
<div class="progress-bar-container">

View file

@ -3,8 +3,10 @@ import {ActivatedRoute} from '@angular/router';
import {FormControl, FormGroup, Validators} from '@angular/forms';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
import {ModalService} from '../_helpers/services/modal.service';
import {Location} from '@angular/common';
import {IntToMoneyPipe} from '../_helpers/pipes/int-to-money.pipe';
import {TranslateService} from '@ngx-translate/core';
@Component({
selector: 'app-purchase',
@ -15,6 +17,7 @@ export class PurchaseComponent implements OnInit, OnDestroy {
currentWalletId;
newPurchase = false;
parentRouting;
subRouting;
historyBlock;
purchaseForm = new FormGroup({
@ -26,19 +29,24 @@ export class PurchaseComponent implements OnInit, OnDestroy {
sameAmount: new FormControl(false),
comment: new FormControl(''),
fee: new FormControl('0.01'),
time: new FormControl({value: '12', disabled: false}),
timeCancel: new FormControl('12'),
payment: new FormControl('')
});
additionalOptions = false;
currentContract = null;
heightAppEvent;
constructor(
private route: ActivatedRoute,
private backend: BackendService,
private variablesService: VariablesService,
private modalService: ModalService,
private ngZone: NgZone,
private location: Location,
private intToMoneyPipe: IntToMoneyPipe
private intToMoneyPipe: IntToMoneyPipe,
private translate: TranslateService
) {
}
@ -54,7 +62,7 @@ export class PurchaseComponent implements OnInit, OnDestroy {
this.parentRouting = this.route.parent.params.subscribe(params => {
this.currentWalletId = params['id'];
});
this.route.params.subscribe(params => {
this.subRouting = this.route.params.subscribe(params => {
if (params.hasOwnProperty('id')) {
this.currentContract = this.variablesService.currentWallet.getContract(params['id']);
this.purchaseForm.setValue({
@ -66,23 +74,12 @@ export class PurchaseComponent implements OnInit, OnDestroy {
sameAmount: false,
comment: this.currentContract.private_detailes.c,
fee: '0.01',
time: '12',
timeCancel: '12',
payment: this.currentContract.payment_id
});
this.newPurchase = false;
// todo original code watch height_v
if (this.currentContract.state === 201 && this.currentContract.height !== 0 && (this.variablesService.height_app - this.currentContract.height) >= 10) {
this.currentContract.state = 2;
this.currentContract.is_new = true;
this.variablesService.currentWallet.recountNewContracts();
} else if (this.currentContract.state === 601 && this.currentContract.height !== 0 && (this.variablesService.height_app - this.currentContract.height) >= 10) {
this.currentContract.state = 6;
this.currentContract.is_new = true;
this.variablesService.currentWallet.recountNewContracts();
}
if (this.currentContract.is_new) {
if (this.currentContract.is_a && this.currentContract.state === 2) {
this.currentContract.state = 120;
@ -109,19 +106,27 @@ export class PurchaseComponent implements OnInit, OnDestroy {
}
this.currentContract.is_new = false;
// todo need remove timeout
setTimeout(() => {
this.variablesService.currentWallet.recountNewContracts();
}, 0);
this.checkAndChangeHistory();
}
this.checkAndChangeHistory();
} else {
this.newPurchase = true;
}
});
this.heightAppEvent = this.variablesService.getHeightAppEvent.subscribe((newHeight: number) => {
if (this.currentContract && this.currentContract.state === 201 && this.currentContract.height !== 0 && (newHeight - this.currentContract.height) >= 10) {
this.currentContract.state = 2;
this.currentContract.is_new = true;
this.variablesService.currentWallet.recountNewContracts();
} else if (this.currentContract && this.currentContract.state === 601 && this.currentContract.height !== 0 && (newHeight - this.currentContract.height) >= 10) {
this.currentContract.state = 6;
this.currentContract.is_new = true;
this.variablesService.currentWallet.recountNewContracts();
}
});
}
toggleOptions() {
@ -129,11 +134,17 @@ export class PurchaseComponent implements OnInit, OnDestroy {
}
getProgressBarWidth() {
if (this.newPurchase) {
return '9rem';
} else {
return '50%';
let progress = '9rem';
if (!this.newPurchase) {
if (this.currentContract) {
if ([110, 3, 4, 6, 140].indexOf(this.currentContract.state) !== -1) {
progress = '100%';
} else {
progress = '50%';
}
}
}
return progress;
}
sameAmountChange() {
@ -172,10 +183,12 @@ export class PurchaseComponent implements OnInit, OnDestroy {
this.purchaseForm.get('amount').value,
this.purchaseForm.get('yourDeposit').value,
this.purchaseForm.get('sellerDeposit').value,
12,
this.purchaseForm.get('time').value,
this.purchaseForm.get('payment').value,
() => {
this.back();
(create_status) => {
if (create_status) {
this.back();
}
});
}
}
@ -187,7 +200,7 @@ export class PurchaseComponent implements OnInit, OnDestroy {
acceptState() {
this.backend.acceptProposal(this.currentWalletId, this.currentContract.contract_id, (accept_status) => {
if (accept_status) {
alert('You have accepted the contract proposal. Please wait for the pledges to be made');
this.modalService.prepareModal('info', 'PURCHASE.ACCEPT_STATE_WAIT_BIG');
this.back();
}
});
@ -217,7 +230,7 @@ export class PurchaseComponent implements OnInit, OnDestroy {
this.currentContract.time = this.currentContract.expiration_time;
this.variablesService.currentWallet.recountNewContracts();
alert('You have ignored the contract proposal');
this.modalService.prepareModal('info', 'PURCHASE.IGNORED_ACCEPT');
this.back();
}
@ -225,7 +238,7 @@ export class PurchaseComponent implements OnInit, OnDestroy {
productNotGot() {
this.backend.releaseProposal(this.currentWalletId, this.currentContract.contract_id, 'REL_B', (release_status) => {
if (release_status) {
alert('The pledges have been nullified.');
this.modalService.prepareModal('info', 'PURCHASE.BURN_PROPOSAL');
this.back();
}
});
@ -234,16 +247,16 @@ export class PurchaseComponent implements OnInit, OnDestroy {
dealsDetailsFinish() {
this.backend.releaseProposal(this.currentWalletId, this.currentContract.contract_id, 'REL_N', (release_status) => {
if (release_status) {
alert('The contract is complete. The payment has been sent.');
this.modalService.prepareModal('success', 'PURCHASE.SUCCESS_FINISH_PROPOSAL');
this.back();
}
});
}
dealsDetailsCancel() {
this.backend.requestCancelContract(this.currentWalletId, this.currentContract.contract_id, 12, (cancel_status) => {
this.backend.requestCancelContract(this.currentWalletId, this.currentContract.contract_id, this.purchaseForm.get('timeCancel').value, (cancel_status) => {
if (cancel_status) {
alert('Proposal to cancel contract sent to seller');
this.modalService.prepareModal('info', 'PURCHASE.SEND_CANCEL_PROPOSAL');
this.back();
}
});
@ -273,14 +286,14 @@ export class PurchaseComponent implements OnInit, OnDestroy {
this.currentContract.time = this.currentContract.cancel_expiration_time;
this.variablesService.currentWallet.recountNewContracts();
alert('You have ignored the proposal to cancel the contract');
this.modalService.prepareModal('info', 'PURCHASE.IGNORED_CANCEL');
this.back();
}
dealsDetailsSellerCancel() {
this.backend.acceptCancelContract(this.currentWalletId, this.currentContract.contract_id, (accept_status) => {
if (accept_status) {
alert('The contract is being cancelled. Please wait for the pledge to be returned');
this.modalService.prepareModal('info', 'PURCHASE.DEALS_CANCELED_WAIT');
this.back();
}
});
@ -288,6 +301,8 @@ export class PurchaseComponent implements OnInit, OnDestroy {
ngOnDestroy() {
this.parentRouting.unsubscribe();
this.subRouting.unsubscribe();
this.heightAppEvent.unsubscribe();
}
}

View file

@ -1,7 +1,7 @@
<div class="content">
<div class="head">
<div class="breadcrumbs">
<span>{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span [routerLink]="['/main']">{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span>{{ 'BREADCRUMBS.RESTORE_WALLET' | translate }}</span>
</div>
<a class="back-btn" [routerLink]="['/main']">

View file

@ -3,7 +3,9 @@ import {FormGroup, FormControl, Validators} from '@angular/forms';
import {Router} from '@angular/router';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
import {ModalService} from '../_helpers/services/modal.service';
import {Wallet} from '../_helpers/models/wallet.model';
import {TranslateService} from '@ngx-translate/core';
@Component({
selector: 'app-restore-wallet',
@ -38,7 +40,9 @@ export class RestoreWalletComponent implements OnInit {
private router: Router,
private backend: BackendService,
private variablesService: VariablesService,
private ngZone: NgZone
private modalService: ModalService,
private ngZone: NgZone,
private translate: TranslateService
) {
}
@ -59,7 +63,7 @@ export class RestoreWalletComponent implements OnInit {
this.restoreForm.get('key').setErrors({key_not_valid: true});
});
} else {
this.backend.saveFileDialog('Save the wallet file.', '*', this.variablesService.settings.default_path, (save_status, save_data) => {
this.backend.saveFileDialog(this.translate.instant('RESTORE_WALLET.CHOOSE_PATH'), '*', this.variablesService.settings.default_path, (save_status, save_data) => {
if (save_status) {
this.variablesService.settings.default_path = save_data.path.substr(0, save_data.path.lastIndexOf('/'));
this.backend.restoreWallet(save_data.path, this.restoreForm.get('password').value, this.restoreForm.get('key').value, (restore_status, restore_data) => {
@ -90,7 +94,7 @@ export class RestoreWalletComponent implements OnInit {
this.walletSaved = true;
});
} else {
alert('SAFES.NOT_CORRECT_FILE_OR_PASSWORD');
this.modalService.prepareModal('error', 'RESTORE_WALLET.NOT_CORRECT_FILE_OR_PASSWORD');
}
});
}

View file

@ -1,7 +1,7 @@
<div class="content">
<div class="head">
<div class="breadcrumbs">
<span>{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span [routerLink]="['/main']">{{ 'BREADCRUMBS.ADD_WALLET' | translate }}</span>
<span>{{ 'BREADCRUMBS.SAVE_PHRASE' | translate }}</span>
</div>
<a class="back-btn" [routerLink]="['/main']">

View file

@ -1,4 +1,4 @@
import {Component, NgZone, OnInit} from '@angular/core';
import {Component, NgZone, OnDestroy, OnInit} from '@angular/core';
import {BackendService} from '../_helpers/services/backend.service';
import {ActivatedRoute, Router} from '@angular/router';
import {VariablesService} from '../_helpers/services/variables.service';
@ -8,8 +8,9 @@ import {VariablesService} from '../_helpers/services/variables.service';
templateUrl: './seed-phrase.component.html',
styleUrls: ['./seed-phrase.component.scss']
})
export class SeedPhraseComponent implements OnInit {
export class SeedPhraseComponent implements OnInit, OnDestroy {
queryRouting;
seedPhrase = '';
wallet_id: number;
@ -22,7 +23,7 @@ export class SeedPhraseComponent implements OnInit {
) {}
ngOnInit() {
this.route.queryParams.subscribe(params => {
this.queryRouting = this.route.queryParams.subscribe(params => {
if (params.wallet_id) {
this.wallet_id = params.wallet_id;
this.backend.getSmartSafeInfo(params.wallet_id, (status, data) => {
@ -56,9 +57,6 @@ export class SeedPhraseComponent implements OnInit {
} else {
console.log(run_data['error_code']);
}
// $rootScope.reloadCounters();
// $rootScope.$broadcast('NEED_REFRESH_HISTORY');
// $rootScope.saveSecureData();
});
} else {
this.variablesService.opening_wallet = null;
@ -71,4 +69,8 @@ export class SeedPhraseComponent implements OnInit {
}
}
ngOnDestroy() {
this.queryRouting.unsubscribe();
}
}

View file

@ -3,6 +3,7 @@ import {FormGroup, FormControl, Validators} from '@angular/forms';
import {ActivatedRoute} from '@angular/router';
import {BackendService} from '../_helpers/services/backend.service';
import {VariablesService} from '../_helpers/services/variables.service';
import {ModalService} from '../_helpers/services/modal.service';
@Component({
selector: 'app-send',
@ -26,6 +27,7 @@ export class SendComponent implements OnInit, OnDestroy {
private route: ActivatedRoute,
private backend: BackendService,
private variablesService: VariablesService,
private modalService: ModalService,
private ngZone: NgZone
) {}
@ -65,7 +67,7 @@ export class SendComponent implements OnInit, OnDestroy {
this.sendForm.get('comment').value,
(send_status, send_data) => {
if (send_status) {
alert('SEND_MONEY.SUCCESS_SENT');
this.modalService.prepareModal('success', 'SEND.SUCCESS_SENT');
this.sendForm.reset({address: '', amount: null, comment: '', mixin: 0, fee: '0.01'});
}
});

View file

@ -3,7 +3,7 @@
<h3>{{ 'SIDEBAR.TITLE' | translate }}</h3><button [routerLink]="['main']">{{ 'SIDEBAR.ADD_NEW' | translate }}</button>
</div>
<div class="sidebar-accounts-list scrolled-content">
<div class="sidebar-account" *ngFor="let wallet of variablesService.wallets" [class.active]="wallet?.wallet_id === walletActive" [routerLink]="['/wallet/' + wallet.wallet_id + '/' + walletActiveSubDirectory]">
<div class="sidebar-account" *ngFor="let wallet of variablesService.wallets" [class.active]="wallet?.wallet_id === walletActive" [routerLink]="['/wallet/' + wallet.wallet_id + '/history']">
<div class="sidebar-account-row account-title-balance">
<span class="title">{{wallet.name}}</span>
<span class="balance">{{wallet.unlocked_balance | intToMoney}} {{variablesService.defaultCurrency}}</span>
@ -21,7 +21,7 @@
<span class="indicator">{{wallet.new_contracts}}</span>
</div>
<div class="sidebar-account-row account-synchronization" *ngIf="!wallet.loaded && variablesService.daemon_state === 2">
<span class="status">{{ 'SIDEBAR.SYNCHRONIZATION.SYNCING' | translate }}</span>
<span class="status">{{ 'SIDEBAR.ACCOUNT.SYNCING' | translate }}</span>
<div class="progress-bar-container">
<div class="progress-bar">
<div class="fill" [style.width]="wallet.progress + '%'"></div>

View file

@ -8,7 +8,6 @@ import {VariablesService} from '../_helpers/services/variables.service';
styleUrls: ['./sidebar.component.scss']
})
export class SidebarComponent implements OnInit, OnDestroy {
walletActiveSubDirectory = '';
walletSubRouting;
walletActive: number;
@ -26,9 +25,6 @@ export class SidebarComponent implements OnInit, OnDestroy {
if (localPathArr.length >= 3) {
this.walletActive = parseInt(localPathArr[2], 10);
}
if (localPathArr.length >= 4) {
this.walletActiveSubDirectory = localPathArr[3];
}
} else if (this.router.url.indexOf('/details') !== -1) {
this.walletActive = this.variablesService.currentWallet.wallet_id;
} else {
@ -42,12 +38,6 @@ export class SidebarComponent implements OnInit, OnDestroy {
if (localPathArr.length >= 3) {
this.walletActive = parseInt(localPathArr[2], 10);
}
if (localPathArr.length >= 4) {
this.walletActiveSubDirectory = localPathArr[3];
if (this.walletActiveSubDirectory === 'purchase') {
this.walletActiveSubDirectory = 'contracts';
}
}
} else if (event.url.indexOf('/details') !== -1) {
this.walletActive = this.variablesService.currentWallet.wallet_id;
} else {

View file

@ -1,7 +1,7 @@
<div class="content">
<div class="head">
<div class="breadcrumbs">
<span>{{variablesService.currentWallet.name}}</span>
<span (click)="back()">{{variablesService.currentWallet.name}}</span>
<span>{{ 'BREADCRUMBS.WALLET_DETAILS' | translate }}</span>
</div>
<button type="button" class="back-btn" (click)="back()">

View file

@ -1,7 +1,7 @@
<div class="header">
<div>
<h3>{{variablesService.currentWallet.name}}</h3>
<button>
<button (click)="openInBrowser()">
<i class="icon account"></i>
<span>{{ 'WALLET.REGISTER_ALIAS' | translate }}</span>
</button>

View file

@ -12,12 +12,19 @@ export class WalletComponent implements OnInit, OnDestroy {
subRouting;
walletID;
tabs = [
{
title: 'WALLET.TABS.HISTORY',
icon: 'history',
link: '/history',
indicator: false,
active: true
},
{
title: 'WALLET.TABS.SEND',
icon: 'send',
link: '/send',
indicator: false,
active: true
active: false
},
{
title: 'WALLET.TABS.RECEIVE',
@ -26,13 +33,6 @@ export class WalletComponent implements OnInit, OnDestroy {
indicator: false,
active: false
},
{
title: 'WALLET.TABS.HISTORY',
icon: 'history',
link: '/history',
indicator: false,
active: false
},
{
title: 'WALLET.TABS.CONTRACTS',
icon: 'contracts',
@ -40,13 +40,13 @@ export class WalletComponent implements OnInit, OnDestroy {
indicator: 1,
active: false
},
{
/*{
title: 'WALLET.TABS.MESSAGES',
icon: 'messages',
link: '/messages',
indicator: 32,
active: false
},
},*/
{
title: 'WALLET.TABS.STAKING',
icon: 'staking',
@ -90,20 +90,9 @@ export class WalletComponent implements OnInit, OnDestroy {
this.backend.setClipboard(this.variablesService.currentWallet.address);
}
/*closeWallet() {
this.backend.closeWallet(this.walletID, () => {
for (let i = this.variablesService.wallets.length - 1; i >= 0; i--) {
if (this.variablesService.wallets[i].wallet_id === this.walletID) {
this.variablesService.wallets.splice(i, 1);
}
}
this.backend.storeSecureAppData(() => {
this.ngZone.run(() => {
this.router.navigate(['/']);
});
});
});
}*/
openInBrowser() {
this.backend.openUrlInBrowser('zano.org');
}
ngOnDestroy() {
this.subRouting.unsubscribe();

View file

@ -3,7 +3,8 @@
"SETUP_MASTER_PASS": "Setup master password",
"SETUP_CONFIRM_PASS": "Confirm the password",
"MASTER_PASS": "Master password",
"BUTTON_NEXT": "Next"
"BUTTON_NEXT": "Next",
"INCORRECT_PASSWORD": "Invalid password"
},
"COMMON": {
"BACK": "Go back"
@ -24,7 +25,8 @@
"ADD_NEW": "+ Add new",
"ACCOUNT": {
"STAKING": "Staking",
"MESSAGES": "New offers/Messages"
"MESSAGES": "New offers/Messages",
"SYNCING": "Syncing wallet"
},
"SETTINGS": "Settings",
"LOG_OUT": "Log out",
@ -42,19 +44,26 @@
"BUTTON_NEW_WALLET": "Create new wallet",
"BUTTON_OPEN_WALLET": "Open existing wallet",
"BUTTON_RESTORE_BACKUP": "Restore from backup",
"HELP": "How to create wallet?"
"HELP": "How to create wallet?",
"CHOOSE_PATH": "Please choose a path"
},
"CREATE_WALLET": {
"NAME": "Wallet name",
"PASS": "Set wallet password",
"CONFIRM": "Confirm wallet password",
"BUTTON_SELECT": "Select wallet location",
"BUTTON_CREATE": "Create wallet"
"BUTTON_CREATE": "Create wallet",
"TITLE_SAVE": "Save the wallet file.",
"ERROR_CANNOT_SAVE_TOP": "You cannot record a file on top of another file",
"ERROR_CANNOT_SAVE_SYSTEM": "You cannot save a safe file to the system partition"
},
"OPEN_WALLET": {
"NAME": "Wallet name",
"PASS": "Wallet password",
"BUTTON": "Open wallet"
"BUTTON": "Open wallet",
"WITH_ADDRESS_ALREADY_OPEN": "A wallet with this account is already open",
"SAFE_FILE_NOT_FOUND1": "Safe file not found",
"SAFE_FILE_NOT_FOUND2": "<br/><br/> It might have been renamed or moved. <br/> To open it, use the \"Open safe\" button."
},
"RESTORE_WALLET": {
"LABEL_NAME": "Wallet name",
@ -62,7 +71,9 @@
"PASS": "Wallet password",
"CONFIRM": "Confirm wallet password",
"BUTTON_SELECT": "Select wallet location",
"BUTTON_CREATE": "Create wallet"
"BUTTON_CREATE": "Create wallet",
"NOT_CORRECT_FILE_OR_PASSWORD": "Invalid safe file or password does not match",
"CHOOSE_PATH": "Please choose a path"
},
"SEED_PHRASE": {
"TITLE": "Make sure to keep your seed phrase in a safe place. If you forget your seed phrase you will not be able to recover your account.",
@ -109,7 +120,8 @@
"DETAILS": "Additional details",
"MIXIN": "Mixin",
"FEE": "Fee",
"BUTTON": "Send"
"BUTTON": "Send",
"SUCCESS_SENT": "The payment will be received within 20 minutes"
},
"HISTORY": {
"STATUS": "Status",
@ -162,13 +174,38 @@
"PROGRESS_RECEIVE": "Reply received",
"PROGRESS_COMPLETE": "Completed",
"FEE": "Fee",
"PAYMENT": "Payment ID"
"PAYMENT": "Payment ID",
"ACCEPT_STATE_WAIT_BIG": "You have accepted the contract proposal. Please wait for the pledges to be made",
"IGNORED_ACCEPT": "You have ignored the contract proposal",
"BURN_PROPOSAL": "The pledges have been nullified.",
"SUCCESS_FINISH_PROPOSAL": "The contract is complete. The payment has been sent.",
"SEND_CANCEL_PROPOSAL": "Proposal to cancel contract sent to seller",
"IGNORED_CANCEL": "You have ignored the proposal to cancel the contract",
"DEALS_CANCELED_WAIT": "The contract is being cancelled. Please wait for the pledge to be returned",
"WAITING_TIME": "Time until response"
},
"MESSAGES": {
"ADDRESS": "Address",
"MESSAGE": "Message",
"SEND_PLACEHOLDER": "Type a message...",
"SEND_BUTTON": "Send"
},
"ERRORS": {
"NOT_ENOUGH_MONEY": "Insufficient funds in account",
"CORE_BUSY": "Internal error (core is busy)",
"DAEMON_BUSY": "Internal error: deamon is busy",
"NO_MONEY_REMOVE_OFFER": "There is no fee for deleting an offer, but in order to protect the network against flood transactions you need to have at least {{fee}} {{currency}} in your safe",
"NOT_ENOUGH_OUTPUTS_TO_MIX": "For the sake of security, mixed transaction will take several days",
"TRANSACTION_IS_TO_BIG": "This transaction is large and was therefore denied by the network. Try sending the required amount in parts.",
"TRANSFER_ATTEMPT": "There is no connection to the Zano network",
"ACCESS_DENIED": "Access denied",
"TRANSACTION_ERROR": "Error. Payment not completed.",
"BAD_ARG": "Invalid argument",
"WALLET_WRONG_ID": "Invalid wallet ID",
"WRONG_PASSWORD": "Invalid password",
"FILE_RESTORED": "The safe file was corrupted somehow. We have recovered the keys and safe from the blockchain.",
"FILE_NOT_FOUND": "File not found",
"FILE_EXIST": "A file with that name already exists. Enter another name to save the file under",
"FILE_NOT_SAVED": "You cannot save a safe file in this folder. Please choose another folder."
}
}

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 384 384" style="enable-background:new 0 0 384 384;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<g id="Layer_1">
</g>
<g id="Layer_1_copy">
</g>
<g id="Layer_4">
<polygon class="st0" points="300,105.1 278.9,84 192,170.9 105.1,84 84,105.1 170.9,192 84,278.9 105.1,300 192,213.1 278.9,300
300,278.9 213.1,192 "/>
</g>
<g id="Layer_2">
</g>
</svg>

After

Width:  |  Height:  |  Size: 644 B

Some files were not shown because too many files have changed in this diff Show more