Browse Source

code refactoring #2

all-modes
pbca26 8 years ago
parent
commit
43d38a63e9
  1. 169
      react/src/components/addcoin/addcoin.js
  2. 77
      react/src/components/dashboard/syncOnly.js
  3. 51
      react/src/components/dashboard/walletsBalance.js
  4. 19
      react/src/components/dashboard/walletsBasiliskConnection.js
  5. 17
      react/src/components/dashboard/walletsBasiliskRefresh.js
  6. 59
      react/src/components/dashboard/walletsCacheData.js
  7. 166
      react/src/components/dashboard/walletsData.js
  8. 2
      react/src/components/dashboard/walletsNativeSend.js
  9. 17
      react/src/components/dashboard/walletsNativeSyncProgress.js
  10. 19
      react/src/components/dashboard/walletsNativeTxHistory.js
  11. 13
      react/src/translate/en.js

169
react/src/components/addcoin/addcoin.js

@ -63,7 +63,7 @@ class AddCoin extends React.Component {
actionsMenu: false, actionsMenu: false,
})); }));
} else { } else {
Store.dispatch(triggerToaster(true, 'Local coin list is not found', 'Coin Selection', 'info')); Store.dispatch(triggerToaster(true, translate('TOASTR.SELECTION_NOT_FOUND'), translate('TOASTR.COIN_SELECTION'), 'info'));
} }
}.bind(this)); }.bind(this));
} }
@ -248,62 +248,120 @@ class AddCoin extends React.Component {
className="form-control form-material" className="form-control form-material"
name="selectedCoin" name="selectedCoin"
id="addcoin_select_coin_mdl_options-login" id="addcoin_select_coin_mdl_options-login"
value={_coin} value={ _coin }
onChange={(event) => this.updateSelectedCoin(event, i)}> onChange={ (event) => this.updateSelectedCoin(event, i) }>
<option>{translate('INDEX.SELECT')}</option> <option>{ translate('INDEX.SELECT') }</option>
<AddCoinOptionsCrypto /> <AddCoinOptionsCrypto />
<AddCoinOptionsAC /> <AddCoinOptionsAC />
<AddCoinOptionsACFiat /> <AddCoinOptionsACFiat />
</select> </select>
</div> </div>
</div> </div>
<div className={this.state.coins.length > 1 ? 'hide' : 'col-sm-4'}> <div className={ this.state.coins.length > 1 ? 'hide' : 'col-sm-4' }>
<button <button
type="button" type="button"
className="btn btn-primary mdl_addcoin_done_btn-login" className="btn btn-primary mdl_addcoin_done_btn-login"
id="mdl_addcoin_done_btn-login" id="mdl_addcoin_done_btn-login"
onClick={() => this.activateCoin(i)} onClick={ () => this.activateCoin(i) }
disabled={_item.mode === -2 }>{translate('INDEX.ACTIVATE_COIN')}</button> disabled={ _item.mode === -2 }>{ translate('INDEX.ACTIVATE_COIN') }</button>
</div> </div>
<div className="col-sm-12 text-center"> <div className="col-sm-12 text-center">
<div className="form-group col-lg-4 col-md-4 col-sm-6 col-xs-6 style-addcoin-lbl-mdl-login"> <div className="form-group col-lg-4 col-md-4 col-sm-6 col-xs-6 style-addcoin-lbl-mdl-login">
<input type="radio" className="to-labelauty labelauty" name={`mode-${i}`} id={`addcoin_mdl_full_mode_login-${i}`} disabled={_item.fullMode.disabled} checked={_item.fullMode.checked} /> <input
<label htmlFor={`addcoin_mdl_full_mode_login-${i}`} onClick={() => this.updateSelectedMode('1', i)} style={{ pointerEvents: _item.fullMode.disabled ? 'none' : 'all' }}> type="radio"
<span className="labelauty-unchecked-image" style={{ display: _item.fullMode.checked ? 'none' : 'inline-block' }}></span> className="to-labelauty labelauty"
<span className="labelauty-unchecked" style={{ display: _item.fullMode.checked ? 'none' : 'inline-block' }}>{translate('INDEX.FULL_MODE')}</span> name={ `mode-${i}` }
<span className="labelauty-checked-image" style={{ display: _item.fullMode.checked ? 'inline-block' : 'none' }}></span> id={ `addcoin_mdl_full_mode_login-${i}` }
<span className="labelauty-checked" style={{ display: _item.fullMode.checked ? 'inline-block' : 'none' }}>{translate('INDEX.FULL_MODE')}</span> disabled={ _item.fullMode.disabled }
checked={ _item.fullMode.checked } />
<label
htmlFor={ `addcoin_mdl_full_mode_login-${i}` }
onClick={ () => this.updateSelectedMode('1', i) }
style={{ pointerEvents: _item.fullMode.disabled ? 'none' : 'all' }}>
<span
className="labelauty-unchecked-image"
style={{ display: _item.fullMode.checked ? 'none' : 'inline-block' }}></span>
<span
className="labelauty-unchecked"
style={{ display: _item.fullMode.checked ? 'none' : 'inline-block' }}>{ translate('INDEX.FULL_MODE') }</span>
<span
className="labelauty-checked-image"
style={{ display: _item.fullMode.checked ? 'inline-block' : 'none' }}></span>
<span
className="labelauty-checked"
style={{ display: _item.fullMode.checked ? 'inline-block' : 'none' }}>{ translate('INDEX.FULL_MODE') }</span>
</label> </label>
</div> </div>
<div className="form-group col-lg-4 col-md-4 col-sm-6 col-xs-6 style-addcoin-lbl-mdl-login"> <div className="form-group col-lg-4 col-md-4 col-sm-6 col-xs-6 style-addcoin-lbl-mdl-login">
<input type="radio" className="to-labelauty labelauty" name={`mode-${i}`} id={`addcoin_mdl_basilisk_mode_login-${i}`} disabled={_item.basiliskMode.disabled} checked={_item.basiliskMode.checked} /> <input
<label htmlFor={`addcoin_mdl_basilisk_mode_login-${i}`} onClick={() => this.updateSelectedMode('0', i)} style={{ pointerEvents: _item.basiliskMode.disabled ? 'none' : 'all' }}> type="radio"
<span className="labelauty-unchecked-image" style={{ display: _item.basiliskMode.checked ? 'none' : 'inline-block' }}></span> className="to-labelauty labelauty"
<span className="labelauty-unchecked" style={{ display: _item.basiliskMode.checked ? 'none' : 'inline-block' }}>{translate('INDEX.BASILISK_MODE')}</span> name={ `mode-${i}` }
<span className="labelauty-checked-image" style={{ display: _item.basiliskMode.checked ? 'inline-block' : 'none' }}></span> id={ `addcoin_mdl_basilisk_mode_login-${i}` }
<span className="labelauty-checked" style={{ display: _item.basiliskMode.checked ? 'inline-block' : 'none' }}>{translate('INDEX.BASILISK_MODE')}</span> disabled={ _item.basiliskMode.disabled }
checked={ _item.basiliskMode.checked } />
<label
htmlFor={ `addcoin_mdl_basilisk_mode_login-${i}` }
onClick={ () => this.updateSelectedMode('0', i) }
style={{ pointerEvents: _item.basiliskMode.disabled ? 'none' : 'all' }}>
<span
className="labelauty-unchecked-image"
style={{ display: _item.basiliskMode.checked ? 'none' : 'inline-block' }}></span>
<span
className="labelauty-unchecked"
style={{ display: _item.basiliskMode.checked ? 'none' : 'inline-block' }}>{ translate('INDEX.BASILISK_MODE') }</span>
<span
className="labelauty-checked-image"
style={{ display: _item.basiliskMode.checked ? 'inline-block' : 'none' }}></span>
<span
className="labelauty-checked"
style={{ display: _item.basiliskMode.checked ? 'inline-block' : 'none' }}>{ translate('INDEX.BASILISK_MODE') }</span>
</label> </label>
</div> </div>
<div className="form-group col-lg-4 col-md-4 col-sm-12 col-xs-12 style-addcoin-lbl-mdl-login"> <div className="form-group col-lg-4 col-md-4 col-sm-12 col-xs-12 style-addcoin-lbl-mdl-login">
<input type="radio" className="to-labelauty labelauty" name={`mode-${i}`} id={`addcoin_mdl_native_mode_login-${i}`} disabled={_item.nativeMode.disabled} checked={_item.nativeMode.checked} /> <input
<label htmlFor={`addcoin_mdl_native_mode_login-${i}`} onClick={() => this.updateSelectedMode('-1', i)} style={{ pointerEvents: _item.nativeMode.disabled ? 'none' : 'all' }}> type="radio"
<span className="labelauty-unchecked-image" style={{ display: _item.nativeMode.checked ? 'none' : 'inline-block' }}></span> className="to-labelauty labelauty"
<span className="labelauty-unchecked" style={{ display: _item.nativeMode.checked ? 'none' : 'inline-block' }}>{translate('INDEX.NATIVE_MODE')}</span> name={ `mode-${i}` }
<span className="labelauty-checked-image" style={{ display: _item.nativeMode.checked ? 'inline-block' : 'none' }}></span> id={ `addcoin_mdl_native_mode_login-${i}` }
<span className="labelauty-checked" style={{ display: _item.nativeMode.checked ? 'inline-block' : 'none' }}>{translate('INDEX.NATIVE_MODE')}</span> disabled={ _item.nativeMode.disabled }
checked={ _item.nativeMode.checked } />
<label
htmlFor={ `addcoin_mdl_native_mode_login-${i}` }
onClick={ () => this.updateSelectedMode('-1', i) }
style={{ pointerEvents: _item.nativeMode.disabled ? 'none' : 'all' }}>
<span
className="labelauty-unchecked-image"
style={{ display: _item.nativeMode.checked ? 'none' : 'inline-block' }}></span>
<span
className="labelauty-unchecked"
style={{ display: _item.nativeMode.checked ? 'none' : 'inline-block' }}>{ translate('INDEX.NATIVE_MODE') }</span>
<span
className="labelauty-checked-image"
style={{ display: _item.nativeMode.checked ? 'inline-block' : 'none' }}></span>
<span
className="labelauty-checked"
style={{ display: _item.nativeMode.checked ? 'inline-block' : 'none' }}>{ translate('INDEX.NATIVE_MODE') }</span>
</label> </label>
</div> </div>
</div> </div>
<div className={this.state.coins.length > 1 && i !== 0 ? 'col-sm-1' : 'hide'}> <div className={ this.state.coins.length > 1 && i !== 0 ? 'col-sm-1' : 'hide' }>
<button type="button" className="btn btn-primary mdl_addcoin_done_btn-login" data-toggle="modal" data-dismiss="modal" id="mdl_addcoin_done_btn-login" onClick={() => this.removeCoin(i)}> <button
type="button"
className="btn btn-primary mdl_addcoin_done_btn-login"
id="mdl_addcoin_done_btn-login"
onClick={ () => this.removeCoin(i) }>
<i className="fa fa-trash-o"></i> <i className="fa fa-trash-o"></i>
</button> </button>
</div> </div>
<div className={_item.mode === '1' || _item.mode === 1 ? 'col-sm-12' : 'hide'}> <div className={ _item.mode === '1' || _item.mode === 1 ? 'col-sm-12' : 'hide' }>
<div className="pull-left margin-right-10"> <div className="pull-left margin-right-10">
<input type="checkbox" id="addcoin_sync_only" data-plugin="switchery" data-size="small" checked={_item.syncOnly} /> <input type="checkbox" id="addcoin_sync_only" checked={ _item.syncOnly } />
</div> </div>
<label className="padding-top-3 padding-bottom-10" htmlFor="addcoin_sync_only" onClick={() => this.toggleSyncOnlyMode(i)}>{translate('ADD_COIN.SYNC_ONLY')}</label> <label
className="padding-top-3 padding-bottom-10"
htmlFor="addcoin_sync_only"
onClick={ () => this.toggleSyncOnlyMode(i) }>{ translate('ADD_COIN.SYNC_ONLY') }</label>
</div> </div>
</div> </div>
); );
@ -316,7 +374,7 @@ class AddCoin extends React.Component {
return ( return (
<div> <div>
<div <div
className={'modal modal-3d-sign add-coin-modal ' + this.state.modalClassName} className={ 'modal modal-3d-sign add-coin-modal ' + this.state.modalClassName }
id="AddCoinDilogModel-login" id="AddCoinDilogModel-login"
aria-hidden="true" aria-hidden="true"
aria-labelledby="AddCoinDilogModel-login" aria-labelledby="AddCoinDilogModel-login"
@ -325,51 +383,60 @@ class AddCoin extends React.Component {
<div className="modal-dialog modal-center modal-lg"> <div className="modal-dialog modal-center modal-lg">
<div className="modal-content"> <div className="modal-content">
<div className="modal-header bg-orange-a400 wallet-send-header"> <div className="modal-header bg-orange-a400 wallet-send-header">
<button type="button" className="close white" data-dismiss="modal" aria-label="Close" onClick={this.dismiss}> <button
type="button"
className="close white"
aria-label="Close" onClick={ this.dismiss }>
<span aria-hidden="true">×</span> <span aria-hidden="true">×</span>
</button> </button>
<h4 className="modal-title white">{translate('INDEX.SELECT_A_COIN')}</h4> <h4 className="modal-title white">{ translate('INDEX.SELECT_A_COIN') }</h4>
</div> </div>
<div className="modal-body"> <div className="modal-body">
<button className="btn btn-primary btn-add-coin-item" onClick={this.addNewItem}>+</button> <button className="btn btn-primary btn-add-coin-item" onClick={ this.addNewItem }>+</button>
<button className="btn btn-outline-primary btn-add-coin-item-options" onClick={this.toggleActionsMenu}> <button className="btn btn-outline-primary btn-add-coin-item-options" onClick={ this.toggleActionsMenu }>
<i className={this.state.actionsMenu ? 'fa-chevron-up' : 'fa-chevron-down' }></i> <i className={ this.state.actionsMenu ? 'fa-chevron-up' : 'fa-chevron-down' }></i>
</button> </button>
<span className={!this.state.actionsMenu ? 'hide' : ''}> <span className={ !this.state.actionsMenu ? 'hide' : '' }>
<button className="btn btn-outline-primary btn-save-coin-selection" onClick={this.saveCoinSelection}>{translate('ADD_COIN.SAVE_SELECTION')}</button> <button
<button className="btn btn-outline-primary btn-load-coin-selection" onClick={this.loadCoinSelection}>{translate('ADD_COIN.LOAD_SELECTION')}</button> className="btn btn-outline-primary btn-save-coin-selection"
onClick={ this.saveCoinSelection }>{ translate('ADD_COIN.SAVE_SELECTION') }</button>
<button
className="btn btn-outline-primary btn-load-coin-selection"
onClick={ this.loadCoinSelection }>{ translate('ADD_COIN.LOAD_SELECTION') }</button>
</span> </span>
{this.renderCoinSelectors()} { this.renderCoinSelectors() }
<div className={this.state.coins.length > 1 ? 'col-sm-12' : 'hide'} style={{textAlign: 'center', margin: '20px 0'}}> <div
className={ this.state.coins.length > 1 ? 'col-sm-12' : 'hide' }
style={{ textAlign: 'center', margin: '20px 0' }}>
<button <button
type="button" type="button"
className="btn btn-primary col-sm-4" className="btn btn-primary col-sm-4"
style={{float: 'none'}} style={{ float: 'none' }}
data-toggle="modal"
data-dismiss="modal"
id="mdl_addcoin_done_btn-login" id="mdl_addcoin_done_btn-login"
onClick={this.activateAllCoins}>{translate('ADD_COIN.ACTIVATE_ALL')}</button> onClick={ this.activateAllCoins }>{ translate('ADD_COIN.ACTIVATE_ALL') }</button>
</div> </div>
<div className="col-sm-12"> <div className="col-sm-12">
<p> <p>
<strong>{translate('INDEX.FULL_MODE')}:</strong> {translate('INDEX.FULL_MODE_DESC')} <strong>{ translate('INDEX.FULL_MODE') }:</strong> { translate('INDEX.FULL_MODE_DESC') }
</p> </p>
<p> <p>
<strong>{translate('INDEX.BASILISK_MODE')}:</strong> {translate('INDEX.BASILISK_MODE_DESC')} <strong>{ translate('INDEX.BASILISK_MODE') }:</strong> { translate('INDEX.BASILISK_MODE_DESC') }
</p> </p>
<p> <p>
<strong>{translate('INDEX.NATIVE_MODE')}:</strong> {translate('INDEX.NATIVE_MODE_DESC1')} <strong>Komodo Daemon</strong> {translate('INDEX.NATIVE_MODE_DESC2')} <i>Iguana Daemon</i> {translate('INDEX.NATIVE_MODE_DESC3')}. <strong>{ translate('INDEX.NATIVE_MODE') }:</strong> { translate('INDEX.NATIVE_MODE_DESC1') } <strong>Komodo Daemon</strong> { translate('INDEX.NATIVE_MODE_DESC2') } <i>Iguana Daemon</i> { translate('INDEX.NATIVE_MODE_DESC3') }.
</p> </p>
<div className="alert alert-icon alert-primary" role="alert"> <div className="alert alert-icon alert-primary" role="alert">
<button type="button" className="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button> <button type="button" className="close" aria-label="Close">
<i className="icon md-info-outline" aria-hidden="true"></i> <strong>{translate('INDEX.NATIVE_MODE')}</strong> {translate('INDEX.NATIVE_MODE_DESC4')} <strong>{translate('INDEX.NATIVE_MODE_DESC5')}</strong>, <i>{translate('INDEX.NATIVE_MODE_DESC5')}</i>. <span aria-hidden="true">×</span>
</button>
<i className="icon md-info-outline" aria-hidden="true"></i> <strong>{ translate('INDEX.NATIVE_MODE') }</strong> { translate('INDEX.NATIVE_MODE_DESC4') } <strong>{ translate('INDEX.NATIVE_MODE_DESC5') }</strong>, <i>{ translate('INDEX.NATIVE_MODE_DESC5') }</i>.
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div className={'modal-backdrop ' + (this.state.display ? 'show in' : 'fade hide')}></div> <div className={ 'modal-backdrop ' + (this.state.display ? 'show in' : 'fade hide') }></div>
</div> </div>
); );
} }

77
react/src/components/dashboard/syncOnly.js

@ -175,28 +175,48 @@ class SyncOnly extends React.Component {
<div> <div>
<div> <div>
<div className="progress progress-sm"> <div className="progress progress-sm">
<div className={this.isFullySynced(fork) ? 'progress-bar progress-bar-striped active progress-bar-indicating progress-bar-success' : 'hide'} style={{width: '100%', fontSize: '80%'}} role="progressbar" id="currency-bundles"> <div
{translate('INDEX.BUNDLES')} <span data-edexcoin="GAME" id="currency-bundles-percent">({fork.coin}) 100.00% - ( {fork.blocks} / {fork.blocks} ) ==&gt;&gt; RT{fork.RTheight}</span> className={ this.isFullySynced(fork) ? 'progress-bar progress-bar-striped active progress-bar-indicating progress-bar-success' : 'hide' }
style={{ width: '100%', fontSize: '80%' }}
role="progressbar"
id="currency-bundles">
{ translate('INDEX.BUNDLES') } <span id="currency-bundles-percent">({ fork.coin }) 100.00% - ( { fork.blocks } / { fork.blocks } ) ==&gt;&gt; RT{ fork.RTheight }</span>
</div> </div>
<div className={this.isFullySynced(fork) ? 'hide' : 'progress-bar progress-bar-info progress-bar-striped active'} style={{width: fork.bundles + '%', fontSize: '80%'}} role="progressbar" data-edexcoin="COIN" id="currency-bundles"> <div
{translate('INDEX.BUNDLES')} <span data-edexcoin="COIN" id="currency-bundles-percent">{fork.bundles}%</span> className={ this.isFullySynced(fork) ? 'hide' : 'progress-bar progress-bar-info progress-bar-striped active' }
style={{ width: fork.bundles + '%', fontSize: '80%' }}
role="progressbar"
id="currency-bundles">
{ translate('INDEX.BUNDLES') } <span id="currency-bundles-percent">{ fork.bundles }%</span>
</div> </div>
</div> </div>
</div> </div>
<div data-edexcoin="COIN" id="additional-progress-bars" className={this.isFullySynced(fork) ? 'hide' : ''}> <div id="additional-progress-bars" className={ this.isFullySynced(fork) ? 'hide' : '' }>
<div className="progress progress-sm"> <div className="progress progress-sm">
<div className="progress-bar progress-bar-warning progress-bar-striped active" style={{width: fork.utxo + '%', fontSize: '80%'}} role="progressbar" data-edexcoin="COIN" id="currency-utxo"> <div
utxo <span data-edexcoin="COIN" id="currency-utxo-percent">{fork.utxo}%</span> className="progress-bar progress-bar-warning progress-bar-striped active"
style={{ width: fork.utxo + '%', fontSize: '80%' }}
role="progressbar"
id="currency-utxo">
utxo <span id="currency-utxo-percent">{ fork.utxo }%</span>
</div> </div>
</div> </div>
<div className="progress progress-sm"> <div className="progress progress-sm">
<div className="progress-bar progress-bar-danger progress-bar-striped active" style={{width: fork.balances + '%', fontSize: '80%'}} role="progressbar" data-edexcoin="COIN" id="currency-balances"> <div
{translate('INDEX.BALANCES')} <span data-edexcoin="COIN" id="currency-balances-percent">{fork.balances}%</span> className="progress-bar progress-bar-danger progress-bar-striped active"
style={{ width: fork.balances + '%', fontSize: '80%' }}
role="progressbar"
id="currency-balances">
{ translate('INDEX.BALANCES') } <span id="currency-balances-percent">{ fork.balances }%</span>
</div> </div>
</div> </div>
<div className="progress progress-sm"> <div className="progress progress-sm">
<div className="progress-bar progress-bar-success progress-bar-striped active" style={{width: fork.validated + '%', fontSize: '80%'}} role="progressbar" data-edexcoin="COIN" id="currency-validated"> <div
{translate('INDEX.VALIDATED')} <span data-edexcoin="COIN" id="currency-validated-percent">{fork.validated}%</span> className="progress-bar progress-bar-success progress-bar-striped active"
style={{ width: fork.validated + '%', fontSize: '80%' }}
role="progressbar"
id="currency-validated">
{ translate('INDEX.VALIDATED') } <span id="currency-validated-percent">{ fork.validated }%</span>
</div> </div>
</div> </div>
</div> </div>
@ -210,19 +230,25 @@ class SyncOnly extends React.Component {
for (let port in this.props.SyncOnly.forks) { for (let port in this.props.SyncOnly.forks) {
const forkInfo = this.props.SyncOnly.forks[port]; const forkInfo = this.props.SyncOnly.forks[port];
if (forkInfo && forkInfo.registry && forkInfo.getinfo) { if (forkInfo &&
forkInfo.registry && forkInfo.getinfo) {
items.push( items.push(
<div key={port} style={{width: '100%'}} className="padding-bottom-60"> <div key={ port } style={{ width: '100%' }} className="padding-bottom-60">
<div className="avatar" href="javascript:void(0)"> <div className="avatar">
<img className="img-responsive margin-bottom-5" src={'assets/images/cryptologo/' + this.renderCoinName(forkInfo.registry.coin).logo + '.png'} alt="{forkInfo.registry.coin}"/> <img
<span className="badge up badge-success margin-bottom-5" data-toggle="tooltip" data-placement="top" data-original-title="full">Full</span> className="img-responsive margin-bottom-5"
<div className="coin-name">{this.renderCoinName(forkInfo.registry.coin).name} ({forkInfo.registry.coin.toUpperCase()})</div> src={ 'assets/images/cryptologo/' + this.renderCoinName(forkInfo.registry.coin).logo + '.png' }
alt={ forkInfo.registry.coin }/>
<span className="badge up badge-success margin-bottom-5">Full</span>
<div className="coin-name">{ this.renderCoinName(forkInfo.registry.coin).name } ({ forkInfo.registry.coin.toUpperCase() })</div>
<div className="margin-top-10"> <div className="margin-top-10">
<span className="btn btn-primary" onClick={() => this._stopIguanaFork(forkInfo.registry.pmid)}> <span className="btn btn-primary" onClick={ () => this._stopIguanaFork(forkInfo.registry.pmid) }>
<span className="fa fa-stop"></span> Stop <span className="fa fa-stop"></span> { translate('INDEX.STOP') }
</span> </span>
<span className="btn btn-primary margin-left-10" onClick={() => this._restartIguanaFork(forkInfo.registry.coin.toUpperCase(), forkInfo.registry.pmid, port)}> <span
<span className="fa fa-undo"></span> Restart className="btn btn-primary margin-left-10"
onClick={ () => this._restartIguanaFork(forkInfo.registry.coin.toUpperCase(), forkInfo.registry.pmid, port) }>
<span className="fa fa-undo"></span> { translate('INDEX.RESTART') }
</span> </span>
</div> </div>
</div> </div>
@ -244,17 +270,18 @@ class SyncOnly extends React.Component {
} }
render() { render() {
if (this.props && this.props.SyncOnly.display) { if (this.props &&
this.props.SyncOnly.display) {
return ( return (
<div> <div>
<div className="modal show sync-only-forks" aria-hidden="false" role="dialog"> <div className="modal show sync-only-forks" aria-hidden="false" role="dialog">
<div className="modal-dialog modal-center modal-lg"> <div className="modal-dialog modal-center modal-lg">
<div className="modal-content"> <div className="modal-content">
<div className="modal-body" style={{height: '590px'}}> <div className="modal-body" style={{ height: '590px' }}>
{this.renderForksList()} { this.renderForksList() }
</div> </div>
<div className="modal-footer"> <div className="modal-footer">
<button type="button" className="btn btn-default" onClick={this.closeSyncOnlyModal}>Close</button> <button type="button" className="btn btn-default" onClick={ this.closeSyncOnlyModal }>{ translate('INDEX.CLOSE') }</button>
</div> </div>
</div> </div>
</div> </div>

51
react/src/components/dashboard/walletsBalance.js

@ -8,7 +8,8 @@ class WalletsBalance extends React.Component {
} }
isFullySynced() { isFullySynced() {
if (this.props.Dashboard.progress && (Number(this.props.Dashboard.progress.balances) + if (this.props.Dashboard.progress &&
(Number(this.props.Dashboard.progress.balances) +
Number(this.props.Dashboard.progress.validated) + Number(this.props.Dashboard.progress.validated) +
Number(this.props.Dashboard.progress.bundles) + Number(this.props.Dashboard.progress.bundles) +
Number(this.props.Dashboard.progress.utxo)) / 4 === 100) { Number(this.props.Dashboard.progress.utxo)) / 4 === 100) {
@ -88,37 +89,39 @@ class WalletsBalance extends React.Component {
return ( return (
<div id="wallet-widgets"> <div id="wallet-widgets">
<div className="col-xs-12"> <div className="col-xs-12">
<div className={this.props.ActiveCoin.mode === 'native' || (this.props.ActiveCoin.mode === 'full' && !this.isFullySynced()) ? 'col-xs-12' : 'col-xs-12 hide'}> <div className={ this.props.ActiveCoin.mode === 'native' || (this.props.ActiveCoin.mode === 'full' && !this.isFullySynced()) ? 'col-xs-12' : 'col-xs-12 hide' }>
<div role="alert" className="alert alert-info alert-dismissible" id="edexcoin-wallet-waitingrt-alert"> <div role="alert" className="alert alert-info alert-dismissible" id="edexcoin-wallet-waitingrt-alert">
<button aria-label="Close" data-dismiss="alert" className="close" type="button"> <button aria-label="Close" data-dismiss="alert" className="close" type="button">
<span aria-hidden="true">×</span> <span aria-hidden="true">×</span>
</button> </button>
<h4>{translate('INDEX.ACTIVATING_WALLET_RT')}</h4> <h4>{ translate('INDEX.ACTIVATING_WALLET_RT') }</h4>
<p data-edexcoin="COIN" id="edexcoin-wallet-waitingrt-alert-text">{translate('INDEX.IGUANA_FULL_MODE_SYNC_P1')}</p> <p id="edexcoin-wallet-waitingrt-alert-text">{ translate('INDEX.IGUANA_FULL_MODE_SYNC_P1') }</p>
<p>{translate('INDEX.IGUANA_FULL_MODE_SYNC_P2')}</p> <p>{ translate('INDEX.IGUANA_FULL_MODE_SYNC_P2') }</p>
<p style={{fontWeight: '600'}}>{this.renderLB('INDEX.IGUANA_FULL_MODE_SYNC_P3')}</p> <p style={{ fontWeight: '600' }}>{ this.renderLB('INDEX.IGUANA_FULL_MODE_SYNC_P3') }</p>
</div> </div>
<div role="alert" className="alert alert-info alert-dismissible" id="edexcoin-wallet-waitingcache-alert"> <div role="alert" className="alert alert-info alert-dismissible" id="edexcoin-wallet-waitingcache-alert">
<button aria-label="Close" data-dismiss="alert" className="close" type="button"> <button aria-label="Close" data-dismiss="alert" className="close" type="button">
<span aria-hidden="true">×</span> <span aria-hidden="true">×</span>
</button> </button>
<h4>{translate('INDEX.FETCHING_COIN_DATA')}</h4> <h4>{ translate('INDEX.FETCHING_COIN_DATA') }</h4>
<p data-edexcoin="COIN" id="edexcoin-wallet-waitingcache-alert-text">{translate('INDEX.IGUANA_FULL_MODE_SYNC_P1')}</p> <p id="edexcoin-wallet-waitingcache-alert-text">{ translate('INDEX.IGUANA_FULL_MODE_SYNC_P1') }</p>
<p>{translate('INDEX.IGUANA_FULL_MODE_SYNC_P2')}</p> <p>{ translate('INDEX.IGUANA_FULL_MODE_SYNC_P2') }</p>
<p style={{fontWeight: '600'}}>{this.renderLB('INDEX.IGUANA_FULL_MODE_SYNC_P3')}</p> <p style={{ fontWeight: '600' }}>{ this.renderLB('INDEX.IGUANA_FULL_MODE_SYNC_P3') }</p>
</div> </div>
</div> </div>
<div className={this.props.ActiveCoin.mode === 'native' || this.props.ActiveCoin.mode === 'basilisk' ? 'col-lg-4 col-xs-12' : 'col-lg-12 col-xs-12'} id="edexcoin_getbalance_t"> <div
className={ this.props.ActiveCoin.mode === 'native' || this.props.ActiveCoin.mode === 'basilisk' ? 'col-lg-4 col-xs-12' : 'col-lg-12 col-xs-12' }
id="edexcoin_getbalance_t">
<div className="widget widget-shadow" id="widgetLineareaOne"> <div className="widget widget-shadow" id="widgetLineareaOne">
<div className="widget-content"> <div className="widget-content">
<div className="padding-20 padding-top-10"> <div className="padding-20 padding-top-10">
<div className="clearfix"> <div className="clearfix">
<div className="pull-left padding-vertical-10"> <div className="pull-left padding-vertical-10">
<i className="icon fa-eye font-size-24 vertical-align-bottom margin-right-5"></i>{translate('INDEX.BALANCE')} <i className="icon fa-eye font-size-24 vertical-align-bottom margin-right-5"></i>{ translate('INDEX.BALANCE')}
</div> </div>
<span className="pull-right padding-top-10" style={{fontSize: '22px'}}> <span className="pull-right padding-top-10" style={{ fontSize: '22px' }}>
{this.renderBalance('main')} {this.props.ActiveCoin.coin} { this.renderBalance('main') } { this.props.ActiveCoin.coin }
</span> </span>
</div> </div>
</div> </div>
@ -126,16 +129,18 @@ class WalletsBalance extends React.Component {
</div> </div>
</div> </div>
<div className={this.props.ActiveCoin.mode === 'native' || this.props.ActiveCoin.mode === 'basilisk' ? 'col-lg-4 col-xs-12' : 'col-lg-4 col-xs-12 hide'} id="edexcoin_getbalance_interest"> <div
className={ this.props.ActiveCoin.mode === 'native' || this.props.ActiveCoin.mode === 'basilisk' ? 'col-lg-4 col-xs-12' : 'col-lg-4 col-xs-12 hide' }
id="edexcoin_getbalance_interest">
<div className="widget widget-shadow" id="widgetLineareaOne"> <div className="widget widget-shadow" id="widgetLineareaOne">
<div className="widget-content"> <div className="widget-content">
<div className="padding-20 padding-top-10"> <div className="padding-20 padding-top-10">
<div className="clearfix"> <div className="clearfix">
<div className="pull-left padding-vertical-10"> <div className="pull-left padding-vertical-10">
<i className="icon fa-money font-size-24 vertical-align-bottom margin-right-5"></i>{translate('INDEX.INTEREST_EARNED')} <i className="icon fa-money font-size-24 vertical-align-bottom margin-right-5"></i>{ translate('INDEX.INTEREST_EARNED') }
</div> </div>
<span className="pull-right padding-top-10" style={{fontSize: '22px'}}> <span className="pull-right padding-top-10" style={{ fontSize: '22px' }}>
{this.renderBalance('interest')} {this.props.ActiveCoin.coin} { this.renderBalance('interest') } { this.props.ActiveCoin.coin }
</span> </span>
</div> </div>
</div> </div>
@ -143,16 +148,18 @@ class WalletsBalance extends React.Component {
</div> </div>
</div> </div>
<div className={this.props.ActiveCoin.mode === 'native' || this.props.ActiveCoin.mode === 'basilisk' ? 'col-lg-4 col-xs-12' : 'col-lg-4 col-xs-12 hide'} id="edexcoin_getbalance_total_interest"> <div
className={ this.props.ActiveCoin.mode === 'native' || this.props.ActiveCoin.mode === 'basilisk' ? 'col-lg-4 col-xs-12' : 'col-lg-4 col-xs-12 hide' }
id="edexcoin_getbalance_total_interest">
<div className="widget widget-shadow" id="widgetLineareaOne"> <div className="widget widget-shadow" id="widgetLineareaOne">
<div className="widget-content"> <div className="widget-content">
<div className="padding-20 padding-top-10"> <div className="padding-20 padding-top-10">
<div className="clearfix"> <div className="clearfix">
<div className="pull-left padding-vertical-10"> <div className="pull-left padding-vertical-10">
<i className="icon fa-bullseye font-size-24 vertical-align-bottom margin-right-5"></i>{translate('INDEX.TOTAL_BALANCE')} <i className="icon fa-bullseye font-size-24 vertical-align-bottom margin-right-5"></i>{ translate('INDEX.TOTAL_BALANCE') }
</div> </div>
<span className="pull-right padding-top-10" data-edexcoin="COIN" style={{fontSize: '22px'}}> <span className="pull-right padding-top-10" style={{ fontSize: '22px' }}>
{this.renderBalance('total')} {this.props.ActiveCoin.coin} { this.renderBalance('total') } { this.props.ActiveCoin.coin }
</span> </span>
</div> </div>
</div> </div>

19
react/src/components/dashboard/walletsBasiliskConnection.js

@ -14,22 +14,23 @@ class WalletsBasiliskConnection extends React.Component {
} }
render() { render() {
if (this.props && this.props.Dashboard.basiliskConnection) { if (this.props &&
this.props.Dashboard.basiliskConnection) {
return ( return (
<div> <div>
<div className="modal show" id="RefreshBasiliskConnectionsMdl" aria-hidden="false" role="dialog"> <div className="modal show" id="RefreshBasiliskConnectionsMdl" aria-hidden="false" role="dialog">
<div className="modal-dialog modal-center modal-md"> <div className="modal-dialog modal-center modal-md">
<div className="modal-content"> <div className="modal-content">
<div className="modal-header bg-orange-a400 wallet-send-header" style={{borderRadius: '3px 3px 0 0'}}> <div className="modal-header bg-orange-a400 wallet-send-header" style={{ borderRadius: '3px 3px 0 0' }}>
<h4 className="modal-title white"> <h4 className="modal-title white">
<span className="icon fa-refresh" style={{margin: '0'}}></span> {translate('INDEX.REFRESHING_BASILISK_NET')}... <span className="icon fa-refresh" style={{ margin: '0' }}></span> { translate('INDEX.REFRESHING_BASILISK_NET') }...
</h4> </h4>
<button type="button" className="close btn-close" aria-label="Close" onClick={this.basiliskConnectionAction}> <button type="button" className="close btn-close" aria-label="Close" onClick={ this.basiliskConnectionAction }>
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
<span className="sr-only">{translate('INDEX.CLOSE')}</span> <span className="sr-only">{ translate('INDEX.CLOSE') }</span>
</button> </button>
</div> </div>
<div className="modal-body" style={{textAlign: 'center'}}> <div className="modal-body" style={{ textAlign: 'center' }}>
<div className="loader-wrapper active"> <div className="loader-wrapper active">
<div className="loader-layer loader-blue"> <div className="loader-layer loader-blue">
<div className="loader-circle-left"> <div className="loader-circle-left">
@ -69,13 +70,13 @@ class WalletsBasiliskConnection extends React.Component {
</div> </div>
</div> </div>
<h5 className="text-left"> <h5 className="text-left">
{translate('IAPI.CON_STATUS') + '... ' + this.props.Dashboard.connectedNotaries.current + '/' + this.props.Dashboard.connectedNotaries.total + ': ' + this.props.Dashboard.connectedNotaries.currentNodeName} <span className="pull-right" id="basilisk-connections-refresh-percent">{Math.floor(this.props.Dashboard.connectedNotaries.current * 100 / this.props.Dashboard.connectedNotaries.total)}%</span> { translate('IAPI.CON_STATUS') + '... ' + this.props.Dashboard.connectedNotaries.current + '/' + this.props.Dashboard.connectedNotaries.total + ': ' + this.props.Dashboard.connectedNotaries.currentNodeName} <span className="pull-right" id="basilisk-connections-refresh-percent">{ Math.floor(this.props.Dashboard.connectedNotaries.current * 100 / this.props.Dashboard.connectedNotaries.total) }%</span>
</h5> </h5>
<div className="progress progress-sm"> <div className="progress progress-sm">
<div className="progress-bar progress-bar-info progress-bar-striped active" style={{width: Math.floor(this.props.Dashboard.connectedNotaries.current * 100 / this.props.Dashboard.connectedNotaries.total) + '%', fontSize: '80%'}} role="progressbar" id="basilisk-connections-refresh-progress-bar"></div> <div className="progress-bar progress-bar-info progress-bar-striped active" style={{ width: Math.floor(this.props.Dashboard.connectedNotaries.current * 100 / this.props.Dashboard.connectedNotaries.total) + '%', fontSize: '80%' }} role="progressbar" id="basilisk-connections-refresh-progress-bar"></div>
</div> </div>
<pre id="basilisk-connections-refresh-status-output"> <pre id="basilisk-connections-refresh-status-output">
{this.props.Dashboard.connectedNotaries.failedToConnectNodes ? 'Failed: ' + this.props.Dashboard.connectedNotaries.failedToConnectNodes : null} { this.props.Dashboard.connectedNotaries.failedToConnectNodes ? 'Failed: ' + this.props.Dashboard.connectedNotaries.failedToConnectNodes : null }
</pre> </pre>
</div> </div>
</div> </div>

17
react/src/components/dashboard/walletsBasiliskRefresh.js

@ -3,14 +3,15 @@ import { translate } from '../../translate/translate';
class WalletsBasiliskRefresh extends React.Component { class WalletsBasiliskRefresh extends React.Component {
render() { render() {
if (this.props && this.props.Dashboard.basiliskRefresh) { if (this.props &&
this.props.Dashboard.basiliskRefresh) {
return ( return (
<div data-edexcoin="COIN" id="edexcoin_dashboard_basilisk_refresh_status"> <div id="edexcoin_dashboard_basilisk_refresh_status">
<div className="col-xs-12 margin-top-20"> <div className="col-xs-12 margin-top-20">
<div className="col-xs-12"> <div className="col-xs-12">
<div className="panel"> <div className="panel">
<div className="panel-heading"> <div className="panel-heading">
<h3 className="panel-title">{translate('INDEX.FETCHING_BASILISK_DATA')}</h3> <h3 className="panel-title">{ translate('INDEX.FETCHING_BASILISK_DATA') }</h3>
<div className="panel-actions"> <div className="panel-actions">
<a className="panel-action icon md-refresh-alt" aria-hidden="true"></a> <a className="panel-action icon md-refresh-alt" aria-hidden="true"></a>
</div> </div>
@ -19,11 +20,11 @@ class WalletsBasiliskRefresh extends React.Component {
<table className="table table-hover table-striped tbl_edexcoin_dashboard_basilisk_refresh_status"> <table className="table table-hover table-striped tbl_edexcoin_dashboard_basilisk_refresh_status">
<thead> <thead>
<tr> <tr>
<th>{translate('INDEX.ADDRESS')}</th> <th>{ translate('INDEX.ADDRESS') }</th>
<th>{translate('INDEX.LIST_UNSPENT')}</th> <th>{ translate('INDEX.LIST_UNSPENT') }</th>
<th>{translate('INDEX.LIST_TRANSACTIONS')}</th> <th>{ translate('INDEX.LIST_TRANSACTIONS') }</th>
<th>{translate('INDEX.GET_BALANCE')}</th> <th>{ translate('INDEX.GET_BALANCE') }</th>
<th>{translate('INDEX.REFRESH')}</th> <th>{ translate('INDEX.REFRESH') }</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

59
react/src/components/dashboard/walletsCacheData.js

@ -26,17 +26,18 @@ class WalletsCacheData extends React.Component {
} else { } else {
return ( return (
<div> <div>
<strong>{Object.keys(this.props.ActiveCoin.cache).length}</strong> coin(s) in cache file <strong>{ Object.keys(this.props.ActiveCoin.cache).length }</strong> coin(s) in cache file
</div> </div>
); );
} }
} }
renderKeyValueParent(pre, _sourceObj) { renderKeyValueParent(pre, _sourceObj) {
if (_sourceObj.data[0] && Object.keys(_sourceObj.data[0]).length) { if (_sourceObj.data[0] &&
Object.keys(_sourceObj.data[0]).length) {
return _sourceObj.data.map((key, value) => return _sourceObj.data.map((key, value) =>
<TreeNode title={key.txid ? key.txid : `${pre}-array-${value}`} key={`{$pre}-${value}-array`}> <TreeNode title={ key.txid ? key.txid : `${pre}-array-${value}` } key={ `{$pre}-${value}-array` }>
{this.renderArrayNode(`${pre}-array-${value}`, key)} { this.renderArrayNode(`${pre}-array-${value}`, key) }
</TreeNode>); </TreeNode>);
} else { } else {
return Object.keys(_sourceObj.data).map((key, value) => this.renderKeyValue(pre, key, _sourceObj.data[key])); return Object.keys(_sourceObj.data).map((key, value) => this.renderKeyValue(pre, key, _sourceObj.data[key]));
@ -49,32 +50,33 @@ class WalletsCacheData extends React.Component {
renderKeyValue(pre, key, value) { renderKeyValue(pre, key, value) {
return ( return (
<TreeNode title={`${key}: ${value}`} key={`{$pre}-${key}`} /> <TreeNode title={ `${key}: ${value}` } key={ `{$pre}-${key}` } />
); );
} }
renderCallData(coin, address, call) { renderCallData(coin, address, call) {
const sourceObj = this.props.ActiveCoin.cache[coin][address]; const sourceObj = this.props.ActiveCoin.cache[coin][address];
if (sourceObj[call].data && (sourceObj[call].data.length || Object.keys(sourceObj[call].data).length)) { if (sourceObj[call].data &&
(sourceObj[call].data.length || Object.keys(sourceObj[call].data).length)) {
return ( return (
<TreeNode title={`${call}`} key={`${coin}-${address}-${call}`}> <TreeNode title={ `${call}`} key={`${coin}-${address}-${call}` }>
<TreeNode title={`status: ${sourceObj[call].status}`} key={`${coin}-${address}-${call}-status`} /> <TreeNode title={ `status: ${sourceObj[call].status}` } key={ `${coin}-${address}-${call}-status` } />
<TreeNode title={`updated @: ${secondsToString(sourceObj[call].timestamp, true)}`} key={`${coin}-${address}-${call}-timestamp`} /> <TreeNode title={ `updated @: ${secondsToString(sourceObj[call].timestamp, true)}` } key={ `${coin}-${address}-${call}-timestamp` } />
<TreeNode title="data" key={`${coin}-${address}-${call}-data`}> <TreeNode title="data" key={ `${coin}-${address}-${call}-data` }>
{this.renderKeyValueParent(`${coin}-${address}-${call}`, sourceObj[call])} { this.renderKeyValueParent(`${coin}-${address}-${call}`, sourceObj[call]) }
</TreeNode> </TreeNode>
</TreeNode> </TreeNode>
); );
} else { } else {
return ( return (
<TreeNode title={`${call} (no data)`} key={`${coin}-${address}-${call}`} /> <TreeNode title={ `${call} (no data)` } key={ `${coin}-${address}-${call}` } />
); );
} }
} }
renderAddressCallsList(coin, address) { renderAddressCallsList(coin, address) {
var allCalls = []; let allCalls = [];
const sourceObj = this.props.ActiveCoin.cache[coin][address]; const sourceObj = this.props.ActiveCoin.cache[coin][address];
const _allCalls = [ const _allCalls = [
'listtransactions', 'listtransactions',
@ -101,8 +103,8 @@ class WalletsCacheData extends React.Component {
if (addrList && addrList.length) { if (addrList && addrList.length) {
return addrList.map((address, index) => return addrList.map((address, index) =>
<TreeNode title={`${address}`} key={`${coin}-${address}`}> <TreeNode title={ `${address}` } key={ `${coin}-${address}` }>
{this.renderAddressCallsList(coin, address)} { this.renderAddressCallsList(coin, address) }
</TreeNode> </TreeNode>
); );
} else { } else {
@ -111,11 +113,12 @@ class WalletsCacheData extends React.Component {
} }
renderCoinRootNodes() { renderCoinRootNodes() {
if (this.props.ActiveCoin.cache && Object.keys(this.props.ActiveCoin.cache).length) { if (this.props.ActiveCoin.cache &&
Object.keys(this.props.ActiveCoin.cache).length) {
return Object.keys(this.props.ActiveCoin.cache).map((coinName, index) => return Object.keys(this.props.ActiveCoin.cache).map((coinName, index) =>
<TreeNode title={`${coinName}`} key={`coin-${coinName}`}> <TreeNode title={ `${coinName}` } key={ `coin-${coinName}` }>
<TreeNode title="Address list" key={`${coinName}-addrlist`}> <TreeNode title="Address list" key={ `${coinName}-addrlist` }>
{this.renderCoinAddressList(coinName)} { this.renderCoinAddressList(coinName) }
</TreeNode> </TreeNode>
</TreeNode> </TreeNode>
); );
@ -129,10 +132,10 @@ class WalletsCacheData extends React.Component {
this.props.ActiveCoin.notaries.notaries && this.props.ActiveCoin.notaries.notaries &&
this.props.ActiveCoin.notaries.notaries.length) { this.props.ActiveCoin.notaries.notaries.length) {
return this.props.ActiveCoin.notaries.notaries.map((node, index) => return this.props.ActiveCoin.notaries.notaries.map((node, index) =>
<TreeNode title={`Node ${index}`} key={`node-${index}`}> <TreeNode title={ `Node ${index}` } key={ `node-${index}` }>
<TreeNode key={`node-${index}-btc`} title={`BTC: ${node.BTCaddress}`} /> <TreeNode key={ `node-${index}-btc` } title={ `BTC: ${node.BTCaddress}` } />
<TreeNode key={`node-${index}-kmd`} title={`KMD: ${node.KMDaddress}`} /> <TreeNode key={ `node-${index}-kmd` } title={ `KMD: ${node.KMDaddress}` } />
<TreeNode key={`node-${index}-pubkey`} title={`Pubkey: ${node.pubkey}`} /> <TreeNode key={ `node-${index}-pubkey` } title={ `Pubkey: ${node.pubkey}` } />
</TreeNode> </TreeNode>
); );
} else { } else {
@ -150,14 +153,14 @@ class WalletsCacheData extends React.Component {
<div className="modal show" aria-hidden="false" role="dialog"> <div className="modal show" aria-hidden="false" role="dialog">
<div className="modal-dialog modal-center modal-lg"> <div className="modal-dialog modal-center modal-lg">
<div className="modal-content"> <div className="modal-content">
<div className="modal-body" style={{height: '590px'}}> <div className="modal-body" style={{ height: '590px' }}>
<div className="panel nav-tabs-horizontal"> <div className="panel nav-tabs-horizontal">
<div className="panel-body"> <div className="panel-body">
<div className="tab-content"> <div className="tab-content">
<div className="tab-pane active" role="tabpanel"> <div className="tab-pane active" role="tabpanel">
{this.renderNotariesFetching()} { this.renderNotariesFetching() }
<Tree defaultExpandAll={false} openAnimation={animation}> <Tree defaultExpandAll={ false } openAnimation={ animation }>
{this.renderCoinRootNodes()} { this.renderCoinRootNodes() }
</Tree> </Tree>
</div> </div>
</div> </div>
@ -165,7 +168,7 @@ class WalletsCacheData extends React.Component {
</div> </div>
</div> </div>
<div className="modal-footer"> <div className="modal-footer">
<button type="button" className="btn btn-default" onClick={this.closeViewCacheModal}>Close</button> <button type="button" className="btn btn-default" onClick={ this.closeViewCacheModal }>{ translate('INDEX.CLOSE') }</button>
</div> </div>
</div> </div>
</div> </div>

166
react/src/components/dashboard/walletsData.js

@ -477,7 +477,9 @@ class WalletsData extends React.Component {
items.push( items.push(
<li key={address.address}> <li key={address.address}>
<a tabIndex="0" onClick={() => this.updateAddressSelection(address.address, type, _amount)}><i className={type === 'public' ? 'icon fa-eye' : 'icon fa-eye-slash'}></i> <span className="text">[ {_amount} {this.props.ActiveCoin.coin} ] {address.address}</span><span className="glyphicon glyphicon-ok check-mark"></span></a> <a
tabIndex="0"
onClick={ () => this.updateAddressSelection(address.address, type, _amount) }><i className={ type === 'public' ? 'icon fa-eye' : 'icon fa-eye-slash' }></i> <span className="text">[ { _amount } { this.props.ActiveCoin.coin } ] { address.address }</span><span className="glyphicon glyphicon-ok check-mark"></span></a>
</li> </li>
); );
} }
@ -494,7 +496,8 @@ class WalletsData extends React.Component {
this.props.ActiveCoin.addresses.public.length) { this.props.ActiveCoin.addresses.public.length) {
for (let i = 0; i < this.props.ActiveCoin.addresses.public.length; i++) { for (let i = 0; i < this.props.ActiveCoin.addresses.public.length; i++) {
if (this.props.ActiveCoin.addresses.public[i].address === this.state.currentAddress) { if (this.props.ActiveCoin.addresses.public[i].address === this.state.currentAddress) {
if (this.props.ActiveCoin.addresses.public[i].amount && this.props.ActiveCoin.addresses.public[i].amount !== 'N/A') { if (this.props.ActiveCoin.addresses.public[i].amount &&
this.props.ActiveCoin.addresses.public[i].amount !== 'N/A') {
return this.props.ActiveCoin.addresses.public[i].amount; return this.props.ActiveCoin.addresses.public[i].amount;
} else { } else {
const address = this.props.ActiveCoin.addresses.public[i].address; const address = this.props.ActiveCoin.addresses.public[i].address;
@ -512,12 +515,12 @@ class WalletsData extends React.Component {
if (this.state.currentAddress) { if (this.state.currentAddress) {
return ( return (
<span> <span>
<i className={this.state.addressType === 'public' ? 'icon fa-eye' : 'icon fa-eye-slash'}></i> <span className="text">[ {this.renderAddressAmount()} {this.props.ActiveCoin.coin} ] {this.state.currentAddress}</span> <i className={ this.state.addressType === 'public' ? 'icon fa-eye' : 'icon fa-eye-slash' }></i> <span className="text">[ { this.renderAddressAmount() } { this.props.ActiveCoin.coin } ] { this.state.currentAddress }</span>
</span> </span>
); );
} else { } else {
return ( return (
<span>- Select Transparent or Private Address -</span> <span>- { translate('KMD_NATIVE.SELECT_ADDRESS') } -</span>
); );
} }
} }
@ -528,16 +531,24 @@ class WalletsData extends React.Component {
this.props.Dashboard.activeHandle[this.props.ActiveCoin.coin] && this.props.Dashboard.activeHandle[this.props.ActiveCoin.coin] &&
this.props.ActiveCoin.mode === 'basilisk') { this.props.ActiveCoin.mode === 'basilisk') {
return ( return (
<div className={'btn-group bootstrap-select form-control form-material showkmdwalletaddrs show-tick ' + (this.state.addressSelectorOpen ? 'open' : '')}> <div className={ 'btn-group bootstrap-select form-control form-material showkmdwalletaddrs show-tick ' + (this.state.addressSelectorOpen ? 'open' : '') }>
<button type="button" className="btn dropdown-toggle btn-info" data-toggle="dropdown" data-id="kmd_wallet_send_from" title="- Select Transparent or Private Address -" aria-expanded="true" onClick={this.openDropMenu}> <button
<span className="filter-option pull-left">{this.renderSelectorCurrentLabel()} </span>&nbsp;<span className="bs-caret"><span className="caret"></span></span> type="button"
className="btn dropdown-toggle btn-info"
title={ '-' + translate('KMD_NATIVE.SELECT_ADDRESS') + '-' }
aria-expanded="true"
onClick={ this.openDropMenu }>
<span className="filter-option pull-left">{ this.renderSelectorCurrentLabel() } </span>&nbsp;
<span className="bs-caret">
<span className="caret"></span>
</span>
</button> </button>
<div className="dropdown-menu open"> <div className="dropdown-menu open">
<ul className="dropdown-menu inner" role="menu"> <ul className="dropdown-menu inner" role="menu">
<li data-original-index="1" className="selected"> <li data-original-index="1" className="selected">
<a tabIndex="0" data-tokens="null"><span className="text"> - Select Transparent or Private Address - </span><span className="glyphicon glyphicon-ok check-mark"></span></a> <a tabIndex="0"><span className="text"> - { translate('KMD_NATIVE.SELECT_ADDRESS') } - </span><span className="glyphicon glyphicon-ok check-mark"></span></a>
</li> </li>
{this.renderAddressByType('public')} { this.renderAddressByType('public') }
</ul> </ul>
</div> </div>
</div> </div>
@ -560,118 +571,139 @@ class WalletsData extends React.Component {
<WalletsBasiliskConnection {...this.props} /> <WalletsBasiliskConnection {...this.props} />
<WalletsNotariesList {...this.props} /> <WalletsNotariesList {...this.props} />
<WalletsCacheData {...this.props} /> <WalletsCacheData {...this.props} />
<div data-edexcoin="COIN" id="edexcoin_dashboardinfo"> <div id="edexcoin_dashboardinfo">
<div className="col-xs-12 margin-top-20"> <div className="col-xs-12 margin-top-20">
<div className="panel nav-tabs-horizontal"> <div className="panel nav-tabs-horizontal">
<div data-edexcoin="COIN" id="edexcoin_dashoard_section"> <div id="edexcoin_dashoard_section">
<div className="col-xlg-12 col-lg-12 col-sm-12 col-xs-12 edexcoin_dashoard_section_main_div"> <div className="col-xlg-12 col-lg-12 col-sm-12 col-xs-12 edexcoin_dashoard_section_main_div">
<div id="edexcoin_txhistory" className="panel"> <div id="edexcoin_txhistory" className="panel">
<header className="panel-heading" style={{zIndex: '10'}}> <header className="panel-heading" style={{ zIndex: '10' }}>
<div className={this.props.ActiveCoin.mode === 'basilisk' ? 'panel-actions' : 'panel-actions hide'}> <div className={ this.props.ActiveCoin.mode === 'basilisk' ? 'panel-actions' : 'panel-actions hide' }>
<div className={this.state.currentStackLength === 1 || (this.state.currentStackLength === 0 && this.state.totalStackLength === 0) ? 'hide' : 'progress progress-sm'} style={{width: '100%', marginBottom: '3px'}}> <div
<div className="progress-bar progress-bar-striped active progress-bar-indicating progress-bar-success" style={{width: 100 - (this.state.currentStackLength * 100 / this.state.totalStackLength) + '%', fontSize: '80%'}} role="progressbar"> className={ this.state.currentStackLength === 1 || (this.state.currentStackLength === 0 && this.state.totalStackLength === 0) ? 'hide' : 'progress progress-sm' }
Processing requests: {this.state.currentStackLength} / {this.state.totalStackLength} style={{ width: '100%', marginBottom: '3px' }}>
<div
className="progress-bar progress-bar-striped active progress-bar-indicating progress-bar-success"
style={{ width: 100 - (this.state.currentStackLength * 100 / this.state.totalStackLength) + '%', fontSize: '80%' }}
role="progressbar">
{ translate('SEND.PROCESSING_REQ') }: { this.state.currentStackLength } / { this.state.totalStackLength }
</div> </div>
</div> </div>
<div className={this.state.basiliskActionsMenu ? 'dropdown open' : 'dropdown'} onClick={this.toggleBasiliskActionsMenu}> <div className={ this.state.basiliskActionsMenu ? 'dropdown open' : 'dropdown' } onClick={ this.toggleBasiliskActionsMenu }>
<a className="dropdown-toggle btn-xs btn-default" data-edexcoin="COIN" id="btn_edexcoin_basilisk" data-toggle="dropdown" href="javascript:void(0)" <a
aria-expanded="false" role="button"> className="dropdown-toggle btn-xs btn-default"
<i className="icon fa-magic margin-right-10" aria-hidden="true"></i> {translate('INDEX.BASILISK_ACTIONS')} <span className="caret"></span> id="btn_edexcoin_basilisk"
href="javascript:void(0)"
aria-expanded="false"
role="button">
<i className="icon fa-magic margin-right-10" aria-hidden="true"></i> { translate('INDEX.BASILISK_ACTIONS') } <span className="caret"></span>
</a> </a>
<ul className="dropdown-menu dropdown-menu-right" aria-labelledby="btn_edexcoin_basilisk" <ul className="dropdown-menu dropdown-menu-right" aria-labelledby="btn_edexcoin_basilisk" role="menu">
role="menu">
<li role="presentation"> <li role="presentation">
<a className="btn_edexcoin_dashboard_getnotaries" data-edexcoin="COIN" id="btn_edexcoin_dashboard_getnotaries" role="menuitem" onClick={this.getDexNotariesAction}> <a
<i className="icon fa-sitemap" aria-hidden="true"></i> {translate('INDEX.GET_NOTARY_NODES_LIST')} className="btn_edexcoin_dashboard_getnotaries"
id="btn_edexcoin_dashboard_getnotaries"
role="menuitem"
onClick={ this.getDexNotariesAction }>
<i className="icon fa-sitemap" aria-hidden="true"></i> { translate('INDEX.GET_NOTARY_NODES_LIST') }
</a> </a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a className="btn_edexcoin_dashboard_refresh_basilisk_conn" data-edexcoin="COIN" id="btn_edexcoin_dashboard_refresh_basilisk_conn" role="menuitem" onClick={this.basiliskConnectionAction}> <a
<i className="icon wb-refresh" aria-hidden="true"></i> {translate('INDEX.REFRESH_BASILISK_CONNECTIONS')} className="btn_edexcoin_dashboard_refresh_basilisk_conn"
id="btn_edexcoin_dashboard_refresh_basilisk_conn"
role="menuitem"
onClick={ this.basiliskConnectionAction }>
<i className="icon wb-refresh" aria-hidden="true"></i> { translate('INDEX.REFRESH_BASILISK_CONNECTIONS') }
</a> </a>
</li> </li>
<li data-edexcoin="COIN" role="presentation" className={!this.state.useCache ? 'hide' : ''}> <li role="presentation" className={ !this.state.useCache ? 'hide' : '' }>
<a className="btn_edexcoin_dashboard_fetchdata" data-edexcoin="COIN" id="btn_edexcoin_dashboard_fetchdata" role="menuitem" onClick={this.basiliskRefreshActionOne}> <a
<i className="icon fa-cloud-download" aria-hidden="true"></i> {translate('INDEX.FETCH_WALLET_DATA')} (active address) className="btn_edexcoin_dashboard_fetchdata"
id="btn_edexcoin_dashboard_fetchdata"
role="menuitem"
onClick={ this.basiliskRefreshActionOne }>
<i className="icon fa-cloud-download" aria-hidden="true"></i> { translate('INDEX.FETCH_WALLET_DATA') } ({ translate('INDEX.ACTIVE_ADDRESS') })
</a> </a>
</li> </li>
<li data-edexcoin="COIN" role="presentation" className={!this.state.useCache ? 'hide' : ''}> <li
<a role="menuitem" onClick={this.basiliskRefreshAction}> role="presentation"
<i className="icon fa-cloud-download" aria-hidden="true"></i> Fetch (all addresses) className={ !this.state.useCache || this.props.ActiveCoin.addresses.public.length === 1 ? 'hide' : '' }>
<a role="menuitem" onClick={ this.basiliskRefreshAction }>
<i className="icon fa-cloud-download" aria-hidden="true"></i> { translate('INDEX.FETCH_ALL_ADDR') }
</a> </a>
</li> </li>
<li data-edexcoin="COIN" role="presentation" className={!this.state.useCache ? 'hide' : ''}> <li role="presentation" className={ !this.state.useCache ? 'hide' : '' }>
<a className="btn_edexcoin_dashboard_refetchdata" data-edexcoin="COIN" id="btn_edexcoin_dashboard_refetchdata" role="menuitem" onClick={this.removeAndFetchNewCache}> <a
<i className="icon fa-history" aria-hidden="true"></i> {translate('INDEX.REFETCH_WALLET_DATA')} className="btn_edexcoin_dashboard_refetchdata"
id="btn_edexcoin_dashboard_refetchdata"
role="menuitem"
onClick={ this.removeAndFetchNewCache }>
<i className="icon fa-history" aria-hidden="true"></i> { translate('INDEX.REFETCH_WALLET_DATA') }
</a> </a>
</li> </li>
<li data-edexcoin="COIN" role="presentation" className={!this.state.useCache ? 'hide' : ''} style={{display: 'none'}}> <li role="presentation" className={ !this.state.useCache ? 'hide' : '' } style={{ display: 'none' }}>
<a role="menuitem" onClick={this._fetchUtxoCache}> <a role="menuitem" onClick={ this.restartBasiliskInstance }>
<i className="icon fa-history" aria-hidden="true"></i> Update UTXO <i className="icon fa-refresh" aria-hidden="true"></i> Restart Basilisk Instance (unsafe!)
</a> </a>
</li> </li>
<li data-edexcoin="COIN" role="presentation" className={!this.state.useCache ? 'hide' : ''}> <li role="presentation" className={ !this.state.useCache ? 'hide' : '' }>
<a role="menuitem" onClick={this.restartBasiliskInstance}> <a className="btn_edexcoin_dashboard_fetchdata" role="menuitem" onClick={ this._toggleViewCacheModal }>
<i className="icon fa-refresh" aria-hidden="true"></i> Restart Basilisk Instance (!) <i className="icon fa-list-alt" aria-hidden="true"></i> { translate('INDEX.VIEW_CACHE_DATA') }
</a>
</li>
<li data-edexcoin="COIN" role="presentation" className={!this.state.useCache ? 'hide' : ''}>
<a className="btn_edexcoin_dashboard_fetchdata" role="menuitem" onClick={this._toggleViewCacheModal}>
<i className="icon fa-list-alt" aria-hidden="true"></i> {translate('INDEX.VIEW_CACHE_DATA')}
</a> </a>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<h4 className="panel-title">{translate('INDEX.TRANSACTION_HISTORY')}</h4> <h4 className="panel-title">{ translate('INDEX.TRANSACTION_HISTORY') }</h4>
</header> </header>
<div className="panel-body"> <div className="panel-body">
<div className="row"> <div className="row">
<div className="col-sm-8"> <div className="col-sm-8">
{this.renderAddressList()} { this.renderAddressList() }
</div> </div>
{this.renderUseCacheToggle} { this.renderUseCacheToggle }
</div> </div>
<div className="row" style={{padding: '20px 0 10px 0'}}> <div className="row" style={{ padding: '20px 0 10px 0' }}>
<div className="col-sm-6"> <div className="col-sm-6">
{this.renderPaginationItemsPerPageSelector()} { this.renderPaginationItemsPerPageSelector() }
</div> </div>
<div className="col-sm-6"> <div className="col-sm-6">
<div id="kmd-tx-history-tbl_filter" className="dataTables_filter"> <div id="kmd-tx-history-tbl_filter" className="dataTables_filter">
<label> <label>
Search: <input type="search" className="form-control input-sm" aria-controls="kmd-tx-history-tbl" disabled="true" /> { translate('INDEX.SEARCH') }: <input type="search" className="form-control input-sm" aria-controls="kmd-tx-history-tbl" disabled="true" />
</label> </label>
</div> </div>
</div> </div>
</div> </div>
<div className="row"> <div className="row">
<table className="table table-hover dataTable table-striped" data-edexcoin="COIN" id="edex-tx-history-tbl" width="100%"> <table className="table table-hover dataTable table-striped" id="edex-tx-history-tbl" width="100%">
<thead> <thead>
<tr> <tr>
<th>{translate('INDEX.DIRECTION')}</th> <th>{ translate('INDEX.DIRECTION') }</th>
<th className="hidden-xs hidden-sm">{translate('INDEX.CONFIRMATIONS')}</th> <th className="hidden-xs hidden-sm">{ translate('INDEX.CONFIRMATIONS') }</th>
<th>{translate('INDEX.AMOUNT')}</th> <th>{ translate('INDEX.AMOUNT') }</th>
<th>{translate('INDEX.TIME')}</th> <th>{ translate('INDEX.TIME') }</th>
<th>{translate('INDEX.DEST_ADDRESS')}</th> <th>{ translate('INDEX.DEST_ADDRESS') }</th>
<th className="hidden-xs hidden-sm">{translate('INDEX.TX_DETAIL')}</th> <th className="hidden-xs hidden-sm">{ translate('INDEX.TX_DETAIL') }</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{this.renderTxHistoryList()} { this.renderTxHistoryList() }
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<th>{translate('INDEX.DIRECTION')}</th> <th>{ translate('INDEX.DIRECTION') }</th>
<th>{translate('INDEX.CONFIRMATIONS')}</th> <th>{ translate('INDEX.CONFIRMATIONS') }</th>
<th>{translate('INDEX.AMOUNT')}</th> <th>{ translate('INDEX.AMOUNT') }</th>
<th>{translate('INDEX.TIME')}</th> <th>{ translate('INDEX.TIME') }</th>
<th>{translate('INDEX.DEST_ADDRESS')}</th> <th>{ translate('INDEX.DEST_ADDRESS') }</th>
<th className="hidden-xs hidden-sm">{translate('INDEX.TX_DETAIL')}</th> <th className="hidden-xs hidden-sm">{ translate('INDEX.TX_DETAIL') }</th>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
</div> </div>
{this.renderPagination()} { this.renderPagination() }
</div> </div>
</div> </div>
</div> </div>

2
react/src/components/dashboard/walletsNativeSend.js

@ -298,7 +298,7 @@ class WalletsNativeSend extends React.Component {
onChange={ this.updateInput } onChange={ this.updateInput }
value={ this.state.sendTo } value={ this.state.sendTo }
id="kmd_wallet_sendto" id="kmd_wallet_sendto"
placeholder="{ translate('SEND.ENTER_T_OR_Z_ADDR') }" placeholder={ translate('SEND.ENTER_T_OR_Z_ADDR') }
autoComplete="off" autoComplete="off"
required /> required />
</div> </div>

17
react/src/components/dashboard/walletsNativeSyncProgress.js

@ -61,11 +61,24 @@ class WalletsNativeSyncProgress extends React.Component {
return(': ' + Math.floor(currentBestChain * 100 / this.props.Dashboard.progress.remoteKMDNode.blocks) + '% (blocks ' + currentBestChain + ' / ' + this.props.Dashboard.progress.remoteKMDNode.blocks + ')'); return(': ' + Math.floor(currentBestChain * 100 / this.props.Dashboard.progress.remoteKMDNode.blocks) + '% (blocks ' + currentBestChain + ' / ' + this.props.Dashboard.progress.remoteKMDNode.blocks + ')');
} else { } else {
return (<span id="activating-komodod-tridot">...</span>); return (
<span id="activating-komodod-tridot">...</span>
);
} }
} }
} }
renderLB(_translationID) {
const _translationComponents = translate(_translationID).split('<br>');
return _translationComponents.map((_translation) =>
<span>
{_translation}
<br />
</span>
);
}
renderChainActivationNotification() { renderChainActivationNotification() {
if ((this.props.Dashboard.progress.blocks < this.props.Dashboard.progress.longestchain) || if ((this.props.Dashboard.progress.blocks < this.props.Dashboard.progress.longestchain) ||
this.props.Dashboard.progress.remoteKMDNode) { this.props.Dashboard.progress.remoteKMDNode) {
@ -81,7 +94,7 @@ class WalletsNativeSyncProgress extends React.Component {
<h4> <h4>
{ translate('INDEX.ACTIVATING_CHAIN') }{ this.renderActivatingBestChainProgress() } { translate('INDEX.ACTIVATING_CHAIN') }{ this.renderActivatingBestChainProgress() }
</h4> </h4>
<p id="extcoin-wallet-connection-alert-text">{ translate('INDEX.KMD_STARTED') }</p> <p id="extcoin-wallet-connection-alert-text">{ this.renderLB('INDEX.KMD_STARTED') }</p>
</div> </div>
); );
} else { } else {

19
react/src/components/dashboard/walletsNativeTxHistory.js

@ -25,6 +25,19 @@ class WalletsNativeTxHistory extends React.Component {
Store.dispatch(toggleDashboardTxInfoModal(display, txIndex)); Store.dispatch(toggleDashboardTxInfoModal(display, txIndex));
} }
isFullySynced() {
if (this.props.Dashboard.progress &&
this.props.Dashboard.progress.balances &&
(Number(this.props.Dashboard.progress.balances) +
Number(this.props.Dashboard.progress.validated) +
Number(this.props.Dashboard.progress.bundles) +
Number(this.props.Dashboard.progress.utxo)) / 4 === 100) {
return true;
} else {
return false;
}
}
updateInput(e) { updateInput(e) {
let historyToSplit = sortByDate(this.props.ActiveCoin.txhistory); let historyToSplit = sortByDate(this.props.ActiveCoin.txhistory);
historyToSplit = historyToSplit.slice(0, e.target.value); historyToSplit = historyToSplit.slice(0, e.target.value);
@ -202,7 +215,11 @@ class WalletsNativeTxHistory extends React.Component {
} else if ( } else if (
this.props.ActiveCoin.txhistory && this.props.ActiveCoin.txhistory &&
this.props.ActiveCoin.txhistory === 'loading') { this.props.ActiveCoin.txhistory === 'loading') {
return translate('INDEX.LOADING_HISTORY'); if (this.isFullySynced()) {
return translate('INDEX.LOADING_HISTORY');
} else {
return translate('INDEX.WAIT_UNTIL_SYNCED');
}
} else if ( } else if (
this.props.ActiveCoin.txhistory && this.props.ActiveCoin.txhistory &&
(this.props.ActiveCoin.txhistory !== 'loading' && this.props.ActiveCoin.txhistory !== 'no data')) { (this.props.ActiveCoin.txhistory !== 'loading' && this.props.ActiveCoin.txhistory !== 'no data')) {

13
react/src/translate/en.js

@ -1,10 +1,16 @@
export const _lang = { export const _lang = {
'EN': { 'EN': {
'INDEX': { 'INDEX': {
'STOP': 'Stop',
'START': 'Start',
'UPDATE_UTXO': 'Update UTXO',
'ACTIVE_ADDRESS': 'active address',
'FETCH_ALL_ADDR': 'Fetch (all addresses)',
'NO_DATA': 'No history available', 'NO_DATA': 'No history available',
'LOADING_HISTORY': 'Loading transaction history', 'LOADING_HISTORY': 'Loading transaction history',
'FETCHING_NOTARIES_LIST': 'Fetching notaries list data', 'FETCHING_NOTARIES_LIST': 'Fetching notaries list data',
'TOTAL_NOTARIES': 'Notaries list. Total nodes count', 'TOTAL_NOTARIES': 'Notaries list. Total nodes count',
'WAIT_UNTIL_SYNCED': 'Transactions history will be available shortly after blockchain data is synced',
'CLOSE': 'Close', 'CLOSE': 'Close',
'SHOW': 'Show', 'SHOW': 'Show',
'SHOWING': 'Showing', 'SHOWING': 'Showing',
@ -341,7 +347,9 @@ export const _lang = {
'ADDED_TO': 'added to', 'ADDED_TO': 'added to',
'SUCCESSFULLY': 'Successfully', 'SUCCESSFULLY': 'Successfully',
'FAILED_TO_ADDCOIN': 'Failed to add iguana coin', 'FAILED_TO_ADDCOIN': 'Failed to add iguana coin',
'FAILED_SHEPHERD_HERD': 'Failed to get execute shepherd herd' 'FAILED_SHEPHERD_HERD': 'Failed to get execute shepherd herd',
'COIN_SELECTION': 'Coin Selection',
'SELECTION_NOT_FOUND': 'Local coin list is not found'
}, },
'COIN_WALLETS': { 'COIN_WALLETS': {
'TX_FAILED': 'Transaction Failed', 'TX_FAILED': 'Transaction Failed',
@ -363,7 +371,8 @@ export const _lang = {
'FAILED': 'Failed', 'FAILED': 'Failed',
'SUCCESS': 'Success', 'SUCCESS': 'Success',
'MESSAGE': 'Message', 'MESSAGE': 'Message',
'EXECUTION_SECONDS': 'Execution Seconds' 'EXECUTION_SECONDS': 'Execution Seconds',
'WAIT_UNTIL_SYNCED': 'Transaction history is unavailable during synchronization progresss'
}, },
'LOGIN': { 'LOGIN': {
'PWD_REQ': 'Password is required.', 'PWD_REQ': 'Password is required.',

Loading…
Cancel
Save