Browse Source

Merge the 'WalletsNativeTxHistory' component into 'WalletsData'

all-modes
petitPapillon 7 years ago
parent
commit
2fcdd4878c
  1. 2
      react/src/components/dashboard/main/dashboard.render.js
  2. 44
      react/src/components/dashboard/walletsData/walletsData.js
  3. 141
      react/src/components/dashboard/walletsData/walletsData.render.js
  4. 4
      react/src/components/dashboard/walletsNative/walletsNative.render.js
  5. 219
      react/src/components/dashboard/walletsNativeTxHistory/walletsNativeTxHistory.js
  6. 152
      react/src/components/dashboard/walletsNativeTxHistory/walletsNativeTxHistory.render.js

2
react/src/components/dashboard/main/dashboard.render.js

@ -30,7 +30,7 @@ const DashboardRender = function() {
{ !this.isNativeMode() && <WalletsBalance {...this.props} />}
<SendCoin {...this.props} />
{ !this.isNativeMode() && <ReceiveCoin {...this.props.ActiveCoin} /> }
<WalletsData {...this.props} />
{ !this.isNativeMode() && <WalletsData {...this.props} /> }
<WalletsTxInfo {...this.props} />
<WalletsNative {...this.props} />
</div>

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

@ -24,7 +24,6 @@ import {
PaginationItemsPerPageSelectorRender,
PaginationRender,
TxHistoryListRender,
UseCacheToggleRender,
AddressListRender,
WalletsDataRender
} from './walletsData.render';
@ -342,9 +341,11 @@ class WalletsData extends React.Component {
renderTxHistoryList() {
if (this.state.itemsList === 'loading') {
return (
<div>{ translate('INDEX.LOADING_HISTORY') }...</div>
);
if (!this.isNativeMode() || this.isFullySynced()) {
return (
<div>{ translate('INDEX.LOADING_HISTORY') }...</div>
);
}
} else if (this.state.itemsList === 'no data') {
return (
<div>{ translate('INDEX.NO_DATA') }</div>
@ -400,6 +401,18 @@ class WalletsData extends React.Component {
}));
}
renderAddress(tx) {
if (!tx.address) {
return (
<span>
<i className="icon fa-bullseye"></i> <span className="label label-dark">{ translate('DASHBOARD.ZADDR_NOT_LISTED') }</span>
</span>
);
}
return tx.address;
}
renderAddressByType(type) {
const _addresses = this.props.ActiveCoin.addresses;
@ -422,7 +435,7 @@ class WalletsData extends React.Component {
<li key={address}>
<a onClick={ () => this.updateAddressSelection(address, type, _amount) }>
<i className={ type === 'public' ? 'icon fa-eye' : 'icon fa-eye-slash' }></i>&nbsp;&nbsp;
<span className="text">[ { _amount } { _coin } ] { address }</span>
<span className="text">[ { _amount } { _coin } ] { address }</span>
<span className="glyphicon glyphicon-ok check-mark"></span>
</a>
</li>
@ -454,8 +467,8 @@ class WalletsData extends React.Component {
return _addresses.public[i].amount;
} else {
const address = _addresses.public[i].address;
const _amount = _cache[_coin] && _cache[_coin][address] && _cache[_coin][address].getbalance.data && _cache[_coin][address].getbalance.data.balance ? _cache[_coin][address].getbalance.data.balance : 'N/A';
const _amount = _cache && _cache[_coin] && _cache[_coin][address] && _cache[_coin][address].getbalance.data && _cache[_coin][address].getbalance.data.balance ? _cache[_coin][address].getbalance.data.balance : 'N/A';
return _amount;
}
}
@ -491,11 +504,26 @@ class WalletsData extends React.Component {
}
}
isActiveCoinMode(coinMode) {
return this.props.ActiveCoin.mode === coinMode;
}
isNativeMode() {
return this.isActiveCoinMode('native');
}
isFullMode() {
return this.isActiveCoinMode('full');
}
isBasiliskMode() {
return this.isActiveCoinMode('basilisk');
}
render() {
if (this.props &&
this.props.ActiveCoin &&
this.props.ActiveCoin.coin &&
this.props.ActiveCoin.mode !== 'native' &&
!this.props.ActiveCoin.send &&
!this.props.ActiveCoin.receive) {
return WalletsDataRender.call(this);

141
react/src/components/dashboard/walletsData/walletsData.render.js

@ -74,12 +74,22 @@ export const PaginationRender = function(paginationFrom, paginationTo) {
export const TxHistoryListRender = function(tx, index) {
return (
<tr key={ tx.txid + tx.amount }>
{ this.isNativeMode() ?
<td>
<span className="label label-default">
<i className="icon fa-eye"></i> { translate('IAPI.PUBLIC_SM') }
</span>
</td>
:
null
}
<td>{ this.renderTxType(tx.category || tx.type) }</td>
<td>{ tx.confirmations }</td>
<td>{ tx.amount || translate('DASHBOARD.UNKNOWN') }</td>
<td>{ secondsToString(tx.blocktime || tx.timestamp) }</td>
<td className={ this.props.ActiveCoin.mode === 'basilisk' ? 'hide' : '' }>{ tx.address }</td>
<td className={ this.props.ActiveCoin.mode === 'basilisk' ? 'text-center' : '' }>
<td>{ secondsToString(tx.blocktime || tx.timestamp || tx.time) }</td>
<td className={ this.isFullMode() ? '' : 'hide' }>{ tx.address }</td>
<td className={ this.isNativeMode() ? '' : 'hide' }>{ this.renderAddress(tx) }</td>
<td className={ this.isBasiliskMode() ? 'text-center' : '' }>
<button
type="button"
className="btn btn-xs white btn-info waves-effect waves-light btn-kmdtxid"
@ -91,17 +101,6 @@ export const TxHistoryListRender = function(tx, index) {
);
};
export const UseCacheToggleRender = function() {
return (
<div className="col-sm-2">
<div className="pull-left margin-right-10">
<input type="checkbox" id="edexcoin_cache_api" checked={this.state.useCache} />
</div>
<label className="padding-top-3" htmlFor="edexcoin_cache_api" onClick={this.toggleCacheApi}>Use cache</label>
</div>
);
};
export const AddressListRender = function() {
return (
<div className={ `btn-group bootstrap-select form-control form-material showkmdwalletaddrs show-tick ${(this.state.addressSelectorOpen ? 'open' : '')}` }>
@ -149,50 +148,57 @@ export const WalletsDataRender = function() {
{ translate('SEND.PROCESSING_REQ') }: { this.state.currentStackLength } / { this.state.totalStackLength }
</div>
</div>
<div
className={ this.state.basiliskActionsMenu ? 'dropdown open' : 'dropdown' }
onClick={ this.toggleBasiliskActionsMenu }>
<a className="dropdown-toggle btn-xs btn-default">
<i className="icon fa-magic margin-right-10"></i> { translate('INDEX.BASILISK_ACTIONS') } <span className="caret"></span>
</a>
<ul className="dropdown-menu dropdown-menu-right">
<li>
<a onClick={ this.getDexNotariesAction }>
<i className="icon fa-sitemap"></i> { translate('INDEX.GET_NOTARY_NODES_LIST') }
</a>
</li>
<li>
<a onClick={ this.basiliskConnectionAction }>
<i className="icon wb-refresh"></i> { translate('INDEX.REFRESH_BASILISK_CONNECTIONS') }
</a>
</li>
<li className={ !this.state.useCache ? 'hide' : '' }>
<a onClick={ this.basiliskRefreshActionOne }>
<i className="icon fa-cloud-download"></i> { translate('INDEX.FETCH_WALLET_DATA') } ({ translate('INDEX.ACTIVE_ADDRESS') })
</a>
</li>
<li className={ !this.state.useCache || this.props.ActiveCoin.addresses && this.props.ActiveCoin.addresses.public.length === 1 ? 'hide' : '' }>
<a onClick={ this.basiliskRefreshAction }>
<i className="icon fa-cloud-download"></i> { translate('INDEX.FETCH_ALL_ADDR') }
</a>
</li>
<li className={ !this.state.useCache ? 'hide' : '' }>
<a onClick={ this.removeAndFetchNewCache }>
<i className="icon fa-history"></i> { translate('INDEX.REFETCH_WALLET_DATA') }
</a>
</li>
<li className={ 'hide ' + (!this.state.useCache ? 'hide' : '') }>
<a onClick={ this.restartBasiliskInstance }>
<i className="icon fa-refresh"></i> Restart Basilisk Instance (unsafe!)
</a>
</li>
<li className={ !this.state.useCache ? 'hide' : '' }>
<a onClick={ this._toggleViewCacheModal }>
<i className="icon fa-list-alt"></i> { translate('INDEX.VIEW_CACHE_DATA') }
</a>
</li>
</ul>
</div>
{ !this.isNativeMode() ?
<div
className={ this.state.basiliskActionsMenu ? 'dropdown open' : 'dropdown' }
onClick={ this.toggleBasiliskActionsMenu }>
<a className="dropdown-toggle btn-xs btn-default">
<i className="icon fa-magic margin-right-10"></i> { translate('INDEX.BASILISK_ACTIONS') }
<span className="caret"></span>
</a>
<ul className="dropdown-menu dropdown-menu-right">
<li>
<a onClick={ this.getDexNotariesAction }>
<i className="icon fa-sitemap"></i> { translate('INDEX.GET_NOTARY_NODES_LIST') }
</a>
</li>
<li>
<a onClick={ this.basiliskConnectionAction }>
<i className="icon wb-refresh"></i> { translate('INDEX.REFRESH_BASILISK_CONNECTIONS') }
</a>
</li>
<li className={ !this.state.useCache ? 'hide' : '' }>
<a onClick={ this.basiliskRefreshActionOne }>
<i className="icon fa-cloud-download"></i> { translate('INDEX.FETCH_WALLET_DATA') }
({ translate('INDEX.ACTIVE_ADDRESS') })
</a>
</li>
<li className={ !this.state.useCache || this.props.ActiveCoin.addresses
&& this.props.ActiveCoin.addresses.public.length === 1 ? 'hide' : '' }>
<a onClick={ this.basiliskRefreshAction }>
<i className="icon fa-cloud-download"></i> { translate('INDEX.FETCH_ALL_ADDR') }
</a>
</li>
<li className={ !this.state.useCache ? 'hide' : '' }>
<a onClick={ this.removeAndFetchNewCache }>
<i className="icon fa-history"></i> { translate('INDEX.REFETCH_WALLET_DATA') }
</a>
</li>
<li className={ 'hide ' + (!this.state.useCache ? 'hide' : '') }>
<a onClick={ this.restartBasiliskInstance }>
<i className="icon fa-refresh"></i> Restart Basilisk Instance (unsafe!)
</a>
</li>
<li className={ !this.state.useCache ? 'hide' : '' }>
<a onClick={ this._toggleViewCacheModal }>
<i className="icon fa-list-alt"></i> { translate('INDEX.VIEW_CACHE_DATA') }
</a>
</li>
</ul>
</div>
:
null
}
</div>
<h4 className="panel-title">{ translate('INDEX.TRANSACTION_HISTORY') }</h4>
</header>
@ -201,7 +207,6 @@ export const WalletsDataRender = function() {
<div className="col-sm-8">
{ this.renderAddressList() }
</div>
{ this.renderUseCacheToggle }
</div>
<div className="row pagination-container">
<div className="col-sm-6">
@ -219,12 +224,17 @@ export const WalletsDataRender = function() {
<table className="table table-hover dataTable table-striped" width="100%">
<thead>
<tr>
{ this.isNativeMode() ?
<th>{ translate('INDEX.TYPE') }</th>
:
null
}
<th>{ translate('INDEX.DIRECTION') }</th>
<th className="hidden-xs hidden-sm">{ translate('INDEX.CONFIRMATIONS') }</th>
<th>{ translate('INDEX.AMOUNT') }</th>
<th>{ translate('INDEX.TIME') }</th>
<th className={ this.props.ActiveCoin.mode === 'basilisk' ? 'hide' : '' }>{ translate('INDEX.DEST_ADDRESS') }</th>
<th className={ this.props.ActiveCoin.mode === 'basilisk' ? 'hidden-xs hidden-sm text-center' : 'hidden-xs hidden-sm' }>{ translate('INDEX.TX_DETAIL') }</th>
<th className={ this.isBasiliskMode() ? 'hide' : '' }>{ translate('INDEX.DEST_ADDRESS') }</th>
<th className={ this.isBasiliskMode() ? 'hidden-xs hidden-sm text-center' : 'hidden-xs hidden-sm' }>{ translate('INDEX.TX_DETAIL') }</th>
</tr>
</thead>
<tbody>
@ -232,12 +242,17 @@ export const WalletsDataRender = function() {
</tbody>
<tfoot>
<tr>
{ this.isNativeMode() ?
<th>{ translate('INDEX.TYPE') }</th>
:
null
}
<th>{ translate('INDEX.DIRECTION') }</th>
<th>{ translate('INDEX.CONFIRMATIONS') }</th>
<th>{ translate('INDEX.AMOUNT') }</th>
<th>{ translate('INDEX.TIME') }</th>
<th className={ this.props.ActiveCoin.mode === 'basilisk' ? 'hide' : '' }>{ translate('INDEX.DEST_ADDRESS') }</th>
<th className={ this.props.ActiveCoin.mode === 'basilisk' ? 'hidden-xs hidden-sm text-center' : 'hidden-xs hidden-sm' }>{ translate('INDEX.TX_DETAIL') }</th>
<th className={ this.isBasiliskMode() ? 'hide' : '' }>{ translate('INDEX.DEST_ADDRESS') }</th>
<th className={ this.isBasiliskMode() ? 'hidden-xs hidden-sm text-center' : 'hidden-xs hidden-sm' }>{ translate('INDEX.TX_DETAIL') }</th>
</tr>
</tfoot>
</table>

4
react/src/components/dashboard/walletsNative/walletsNative.render.js

@ -3,7 +3,7 @@ import WalletsBalance from '../walletsBalance/walletsBalance';
import WalletsNativeInfo from '../walletsNativeInfo/walletsNativeInfo';
import WalletsNativeSend from '../walletsNativeSend/walletsNativeSend';
import WalletsProgress from '../walletsProgress/walletsProgress';
import WalletsNativeTxHistory from '../walletsNativeTxHistory/walletsNativeTxHistory';
import WalletsData from '../walletsData/walletsData';
import ReceiveCoin from '../receiveCoin/receiveCoin';
const WalletsNativeRender = function() {
@ -30,7 +30,7 @@ const WalletsNativeRender = function() {
<div className="row">
<WalletsBalance {...this.props} />
<ReceiveCoin {...this.props.ActiveCoin} />
<WalletsNativeTxHistory {...this.props} />
<WalletsData {...this.props} />
<WalletsNativeSend {...this.props} />
<WalletsNativeInfo {...this.props} />
</div>

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

@ -1,219 +0,0 @@
import React from 'react';
import { translate } from '../../../translate/translate';
import { sortByDate } from '../../../util/sort';
import { toggleDashboardTxInfoModal } from '../../../actions/actionCreators';
import Store from '../../../store';
import {
PaginationItemsPerPageSelectorRender,
PaginationRender,
TxHistoryListRender,
WalletsNativeTxHistoryRender
} from './walletsNativeTxHistory.render';
class WalletsNativeTxHistory extends React.Component {
constructor(props) {
super(props);
this.state = {
itemsPerPage: 10,
activePage: 1,
itemsList: null,
};
this.updateInput = this.updateInput.bind(this);
}
// TODO: implement sorting
// implement pagination past X items should call listtransactions to get new chunk of data
// z transactions
// filter based on addr
toggleTxInfoModal(display, txIndex) {
Store.dispatch(
toggleDashboardTxInfoModal(
display,
txIndex
)
);
}
isFullySynced() {
if (this.props.Dashboard &&
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) {
let historyToSplit = sortByDate(this.props.ActiveCoin.txhistory);
historyToSplit = historyToSplit.slice(0, e.target.value);
this.setState({
[e.target.name]: e.target.value,
activePage: 1,
itemsList: historyToSplit,
});
}
renderTxType(category) {
if (category === 'send') {
return (
<span className="label label-danger">
<i className="icon fa-arrow-circle-left"></i> <span>{ translate('DASHBOARD.OUT') }</span>
</span>
);
}
if (category === 'receive') {
return (
<span className="label label-success">
<i className="icon fa-arrow-circle-right"></i> <span>{ translate('DASHBOARD.IN') }</span>
</span>
);
}
if (category === 'generate') {
return (
<span>
<i className="icon fa-cogs"></i> <span>{ translate('DASHBOARD.MINED') }</span>
</span>
);
}
if (category === 'immature') {
return (
<span>
<i className="icon fa-clock-o"></i> <span>{ translate('DASHBOARD.IMMATURE') }</span>
</span>
);
}
}
renderAddress(tx) {
if (!tx.address) {
return (
<span>
<i className="icon fa-bullseye"></i> <span className="label label-dark">{ translate('DASHBOARD.ZADDR_NOT_LISTED') }</span>
</span>
);
} else {
return (tx.address);
}
}
componentWillReceiveProps(props) {
if (!this.state.itemsList ||
(this.state.itemsList && !this.state.itemsList.length) ||
(props.ActiveCoin.txhistory !== this.props.ActiveCoin.txhistory)) {
if (this.props.ActiveCoin.txhistory &&
this.props.ActiveCoin.txhistory !== 'loading' &&
this.props.ActiveCoin.txhistory !== 'no data') {
let historyToSplit = sortByDate(this.props.ActiveCoin.txhistory);
historyToSplit = historyToSplit.slice(
(this.state.activePage - 1) * this.state.itemsPerPage,
this.state.activePage * this.state.itemsPerPage
);
this.setState(Object.assign({}, this.state, {
itemsList: historyToSplit,
}));
}
}
}
updateCurrentPage(page) {
let historyToSplit = sortByDate(this.props.ActiveCoin.txhistory);
historyToSplit = historyToSplit.slice(
(page - 1) * this.state.itemsPerPage,
page * this.state.itemsPerPage
);
this.setState(Object.assign({}, this.state, {
activePage: page,
itemsList: historyToSplit,
}));
}
renderPaginationItems() {
let items = [];
for (let i = 0; i < Math.floor(this.props.ActiveCoin.txhistory.length / this.state.itemsPerPage); i++) {
items.push(
<li className={ this.state.activePage === i + 1 ? 'paginate_button active' : 'paginate_button' }>
<a
key={ `${i}-pagination` }
onClick={ this.state.activePage !== (i + 1) ? () => this.updateCurrentPage(i + 1) : null }>{ i + 1 }</a>
</li>
);
}
return items;
}
renderPaginationItemsPerPageSelector() {
if (this.props.ActiveCoin.txhistory &&
this.props.ActiveCoin.txhistory !== 'loading' &&
this.props.ActiveCoin.txhistory.length > 10) {
return PaginationItemsPerPageSelectorRender.call(this);
} else {
return null;
}
}
renderPagination() {
if (this.props.ActiveCoin.txhistory &&
this.props.ActiveCoin.txhistory !== 'loading' &&
this.props.ActiveCoin.txhistory.length > 10) {
const _paginationStart = ((this.state.activePage - 1) * this.state.itemsPerPage) + 1;
const _paginationEnd = this.state.activePage * this.state.itemsPerPage;
const _paginationNextState = this.state.activePage > Math.floor(this.props.ActiveCoin.txhistory.length / this.state.itemsPerPage);
return PaginationRender.call(
this,
_paginationStart,
_paginationEnd,
_paginationNextState
);
}
return null;
}
renderTxHistoryList() {
if (this.props.ActiveCoin.txhistory &&
this.props.ActiveCoin.txhistory === 'no data') {
return translate('INDEX.NO_DATA');
} else if (
this.props.ActiveCoin.txhistory &&
this.props.ActiveCoin.txhistory === 'loading') {
if (this.isFullySynced()) {
return translate('INDEX.LOADING_HISTORY');
} else {
return translate('INDEX.WAIT_UNTIL_SYNCED');
}
} else if (
this.props.ActiveCoin.txhistory &&
(this.props.ActiveCoin.txhistory !== 'loading' && this.props.ActiveCoin.txhistory !== 'no data')) {
if (this.state.itemsList &&
this.state.itemsList.length &&
this.props.ActiveCoin.nativeActiveSection === 'default') {
return TxHistoryListRender.call(this);
}
return null;
}
}
render() {
if (this.props &&
this.props.ActiveCoin.nativeActiveSection === 'default') {
return WalletsNativeTxHistoryRender.call(this);
}
return null;
}
}
export default WalletsNativeTxHistory;

152
react/src/components/dashboard/walletsNativeTxHistory/walletsNativeTxHistory.render.js

@ -1,152 +0,0 @@
import React from 'react';
import { translate } from '../../../translate/translate';
import { secondsToString } from '../../../util/time';
export const PaginationItemsPerPageSelectorRender = function() {
return (
<div className="dataTables_length">
<label>
{ translate('INDEX.SHOW') }&nbsp;
<select
name="itemsPerPage"
className="form-control input-sm"
onChange={ this.updateInput }>
<option value="10">10</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
</select>&nbsp;
{ translate('INDEX.ENTRIES_SM') }
</label>
</div>
);
};
export const PaginationRender = function(paginationStart, paginationEnd, paginationNextState) {
return (
<div className="row unselectable">
<div className="col-sm-5">
<div className="dataTables_info">
{ translate('INDEX.SHOWING') }&nbsp;
{ paginationStart }&nbsp;
{ translate('INDEX.TO') }&nbsp;
{ paginationEnd }&nbsp;
{ translate('INDEX.OF') }&nbsp;
{ this.props.ActiveCoin.txhistory.length }&nbsp;
{ translate('INDEX.ENTRIES_SM') }
</div>
</div>
<div className="col-sm-7">
<div className="dataTables_paginate paging_simple_numbers">
<ul className="pagination">
<li className={ this.state.activePage
=== 1 ? 'paginate_button previous disabled' : 'paginate_button previous' }>
<a onClick={ () => this.updateCurrentPage(this.state.activePage - 1) }>{ translate('INDEX.PREVIOUS') }</a>
</li>
{ this.renderPaginationItems() }
<li className={ paginationNextState ? 'paginate_button next disabled' : 'paginate_button next' }>
<a onClick={ () => this.updateCurrentPage(this.state.activePage + 1) }>{ translate('INDEX.NEXT') }</a>
</li>
</ul>
</div>
</div>
</div>
);
};
export const TxHistoryListRender = function() {
return this.state.itemsList.map((tx, index) =>
<tr key={ tx.txid + tx.amount }>
<td>
<span className="label label-default">
<i className="icon fa-eye"></i> { translate('IAPI.PUBLIC_SM') }
</span>
</td>
<td>{ this.renderTxType(tx.category) }</td>
<td>{ tx.confirmations }</td>
<td>{ tx.amount }</td>
<td>{ secondsToString(tx.time) }</td>
<td>{ this.renderAddress(tx) }</td>
<td>
<button
type="button"
className="btn btn-xs white btn-info waves-effect waves-light btn-kmdtxid"
onClick={ () => this.toggleTxInfoModal(!this.props.ActiveCoin.showTransactionInfo, index) }>
<i className="icon fa-search"></i>
</button>
</td>
</tr>
);
};
export const WalletsNativeTxHistoryRender = function() {
return (
<div className="native-transactions">
<div>
<div className="col-xs-12 margin-top-20">
<div className="panel nav-tabs-horizontal">
<div>
<div className="col-xlg-12 col-lg-12 col-sm-12 col-xs-12">
<div className="panel">
<header className="panel-heading">
<h3 className="panel-title">{ translate('INDEX.TRANSACTION_HISTORY') }</h3>
</header>
<div className="panel-body">
<div className="row">
<div className="col-sm-6">
{ this.renderPaginationItemsPerPageSelector() }
</div>
<div className="col-sm-6">
<div className="dataTables_filter">
<label>
{ translate('INDEX.SEARCH') }:
<input
type="search"
className="form-control input-sm"
disabled="true" />
</label>
</div>
</div>
</div>
<div className="row">
<table
className="table table-hover dataTable table-striped"
width="100%">
<thead>
<tr>
<th>{ translate('INDEX.TYPE') }</th>
<th>{ translate('INDEX.DIRECTION') }</th>
<th>{ translate('INDEX.CONFIRMATIONS') }</th>
<th>{ translate('INDEX.AMOUNT') }</th>
<th>{ translate('INDEX.TIME') }</th>
<th>{ translate('INDEX.DEST_ADDRESS') }</th>
<th>{ translate('INDEX.TX_DETAIL') }</th>
</tr>
</thead>
<tbody>
{ this.renderTxHistoryList() }
</tbody>
<tfoot>
<tr>
<th>{ translate('INDEX.TYPE') }</th>
<th>{ translate('INDEX.DIRECTION') }</th>
<th>{ translate('INDEX.CONFIRMATIONS') }</th>
<th>{ translate('INDEX.AMOUNT') }</th>
<th>{ translate('INDEX.TIME') }</th>
<th>{ translate('INDEX.DEST_ADDRESS') }</th>
<th>{ translate('INDEX.TX_DETAIL') }</th>
</tr>
</tfoot>
</table>
</div>
{ this.renderPagination() }
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
};
Loading…
Cancel
Save