|
|
@@ -9,7 +9,8 @@
|
|
|
{{ page.name }}
|
|
|
</v-col>
|
|
|
<v-col cols="8">
|
|
|
- <v-text-field hide-details single-line label="Local Search" append-icon="mdi-magnify" v-model="table.search"/>
|
|
|
+ <v-text-field hide-details single-line label="Local Search" append-icon="mdi-magnify"
|
|
|
+ v-model="table.search"/>
|
|
|
</v-col>
|
|
|
</v-row>
|
|
|
</v-container>
|
|
|
@@ -20,16 +21,37 @@
|
|
|
<v-row>
|
|
|
<v-col cols="2"></v-col>
|
|
|
<v-col cols="2">
|
|
|
- <v-text-field required type="number" label="page" v-model="tempPage" @change="inputPageNum" />
|
|
|
+ <v-text-field required type="number" label="page" v-model="tempPage" @change="inputPageNum"/>
|
|
|
</v-col>
|
|
|
<v-col cols="4">
|
|
|
- <v-pagination color="teal" :disabled="table.loading" :length="99" v-model="table.pageNum" @input="generateTableDataAgain"></v-pagination>
|
|
|
+ <v-pagination color="teal" :disabled="table.loading" :length="99" v-model="table.pageNum"
|
|
|
+ @input="generateTableDataAgain"></v-pagination>
|
|
|
</v-col>
|
|
|
</v-row>
|
|
|
</div>
|
|
|
|
|
|
<!-- 表格主体 -->
|
|
|
<v-data-table calculate-widths multi-sort hide-default-footer
|
|
|
+ @current-items="currentItems"
|
|
|
+ @input="input"
|
|
|
+ @item-selected="itemSelected"
|
|
|
+ @item-expanded="itemExpanded"
|
|
|
+ @page-count="pageCount"
|
|
|
+ @pagination="pagination"
|
|
|
+ @toggle-select-all="toggleSelectAll"
|
|
|
+ @update:expanded="updateExpanded"
|
|
|
+ @update:group-by="updateGroupBy"
|
|
|
+ @update:group-desc="updateGroupEesc"
|
|
|
+ @update:items-per-page="updateItemsPerPage"
|
|
|
+ @update:multi-sort="updateMultiSort"
|
|
|
+ @update:must-sort="updateMustSort"
|
|
|
+ @update:options="updateOptions"
|
|
|
+ @update:page="updatePage"
|
|
|
+ @update:sort-by="updateSortBy"
|
|
|
+ @update:sort-desc="updateSortDesc"
|
|
|
+ @toggle="toggle"
|
|
|
+
|
|
|
+ @dblclick:row="dblclickRow"
|
|
|
:group-by="table.groupBy" :group-desc="table.groupDesc"
|
|
|
:headers="table.headers" :items="table.data" :search="table.search" :loading="table.loading"
|
|
|
:items-per-page="table.pageSize"
|
|
|
@@ -54,7 +76,8 @@
|
|
|
</template>
|
|
|
<!-- Hash -->
|
|
|
<template v-slot:item.hash="{ item }">
|
|
|
- <v-btn v-if="item.hash.indexOf('0x') !== -1" outlined text target="_blank" @click="httpKit.jumpToExplorer(item.hash, 'tx')">
|
|
|
+ <v-btn v-if="item.hash.indexOf('0x') !== -1" outlined text target="_blank"
|
|
|
+ @click="httpKit.jumpToExplorer(item.hash, 'tx')">
|
|
|
{{ hashKit.head5(item.hash) + '..' }}
|
|
|
</v-btn>
|
|
|
<v-chip v-else label target="_blank">
|
|
|
@@ -63,7 +86,7 @@
|
|
|
</template>
|
|
|
<!-- From -->
|
|
|
<template v-slot:item.from="{ item }">
|
|
|
- <v-chip v-if="!item.fromName" label color="indigo lighten-3" @click="httpKit.jumpToExplorer(item.to)">
|
|
|
+ <v-chip v-if="!item.fromName" label color="indigo lighten-3" @click="httpKit.jumpToExplorer(item.to)">
|
|
|
{{ hashKit.headAndEnd2(item.from) }}
|
|
|
</v-chip>
|
|
|
<v-chip v-else label color="green lighten-3" target="_blank" @click="httpKit.jumpToExplorer(item.from)">
|
|
|
@@ -72,7 +95,7 @@
|
|
|
</template>
|
|
|
<!-- to -->
|
|
|
<template v-slot:item.to="{ item }">
|
|
|
- <v-chip v-if="!item.toName" label color="indigo lighten-4" @click="httpKit.jumpToExplorer(item.to)">
|
|
|
+ <v-chip v-if="!item.toName" label color="indigo lighten-4" @click="httpKit.jumpToExplorer(item.to)">
|
|
|
{{ hashKit.headAndEnd2(item.to) }}
|
|
|
</v-chip>
|
|
|
<v-chip v-else label color="indigo lighten-4" @click="httpKit.jumpToExplorer(item.to)">
|
|
|
@@ -136,8 +159,11 @@
|
|
|
<div v-if="page.name === 'Pending Page'">
|
|
|
<div class="tradeInfoBtn" @click="showTradeInfo(item)">
|
|
|
<v-chip v-for="tokenAddress in item.tokenAddressList" :key='tokenAddress'
|
|
|
- :color="item.tokenMap[tokenAddress] ? hashKit.generateColorByHash(tokenAddress) : undefined" class="tokenChip">
|
|
|
- {{ item.tokenMap[tokenAddress] ? item.tokenMap[tokenAddress] : '**' + hashKit.headAndEnd2(tokenAddress) }}
|
|
|
+ :color="item.tokenMap[tokenAddress] ? hashKit.generateColorByHash(tokenAddress) : undefined"
|
|
|
+ class="tokenChip">
|
|
|
+ {{
|
|
|
+ item.tokenMap[tokenAddress] ? item.tokenMap[tokenAddress] : '**' + hashKit.headAndEnd2(tokenAddress)
|
|
|
+ }}
|
|
|
</v-chip>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -152,10 +178,11 @@
|
|
|
<v-row>
|
|
|
<v-col cols="2"></v-col>
|
|
|
<v-col cols="2">
|
|
|
- <v-text-field type="number" required label="page" v-model="tempPage" @change="inputPageNum" />
|
|
|
+ <v-text-field type="number" required label="page" v-model="tempPage" @change="inputPageNum"/>
|
|
|
</v-col>
|
|
|
<v-col cols="4">
|
|
|
- <v-pagination :disabled="table.loading" :length="99" v-model="table.pageNum" @input="generateTableDataAgain"></v-pagination>
|
|
|
+ <v-pagination :disabled="table.loading" :length="99" v-model="table.pageNum"
|
|
|
+ @input="generateTableDataAgain"></v-pagination>
|
|
|
</v-col>
|
|
|
</v-row>
|
|
|
</div>
|
|
|
@@ -165,7 +192,9 @@
|
|
|
<v-dialog v-model="transferDetailsDialog.visible" max-width="800">
|
|
|
<v-card elevation="0">
|
|
|
<v-card-title>交易详情</v-card-title>
|
|
|
- <v-card-text><TradeInfo :item="transferDetailsDialog.data"></TradeInfo></v-card-text>
|
|
|
+ <v-card-text>
|
|
|
+ <TradeInfo :item="transferDetailsDialog.data"></TradeInfo>
|
|
|
+ </v-card-text>
|
|
|
<v-card-actions>
|
|
|
<v-spacer></v-spacer>
|
|
|
<v-btn text color="primary" @click="transferDetailsDialog.visible = false">我知道了</v-btn>
|
|
|
@@ -221,11 +250,12 @@ import HashKit from '@/plugins/kit/HashKit'
|
|
|
import HttpKit from '@/plugins/kit/HttpKit'
|
|
|
import TimeKit from '@/plugins/kit/TimeKit'
|
|
|
import AddressModel from "@/plugins/model/AddressModel";
|
|
|
+import jquery from 'jquery'
|
|
|
|
|
|
export default {
|
|
|
name: 'Table',
|
|
|
components: {BooleanViewer, TradeInfo},
|
|
|
- props: ['query', 'page', 'table', 'tx'],
|
|
|
+ props: ['query', 'page', 'table', 'tx', 'explorer'],
|
|
|
inject: ['generateTableData'],
|
|
|
data: () => ({
|
|
|
hashKit: HashKit,
|
|
|
@@ -240,7 +270,8 @@ export default {
|
|
|
visible: false
|
|
|
},
|
|
|
tempPage: 1,
|
|
|
- addressModel: undefined
|
|
|
+ addressModel: undefined,
|
|
|
+ dblclickRowUrl:"https://tools.blocksec.com/tx/eth/",
|
|
|
}),
|
|
|
methods: {
|
|
|
async deleteByHash(hash_code, item) {
|
|
|
@@ -299,7 +330,9 @@ export default {
|
|
|
this.tempPage = this.table.pageNum
|
|
|
this.table.data = []
|
|
|
|
|
|
+
|
|
|
await this.generateTableData()
|
|
|
+ await this.addButRegroup()
|
|
|
},
|
|
|
formatTimeBySixBitTimestamp(sixBitTimestamp) {
|
|
|
let lastThreeBit = (sixBitTimestamp + '').slice(-3)
|
|
|
@@ -311,7 +344,181 @@ export default {
|
|
|
},
|
|
|
createAddressModel() {
|
|
|
if (!this.addressModel) this.addressModel = new AddressModel(this.tx.chainId, AddressModel.MODULES.unknown)
|
|
|
- }
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ currentItems(val) {
|
|
|
+ console.log("currentItems:", val)
|
|
|
+ if(val.length == 0){
|
|
|
+ this.showIfHide(true)
|
|
|
+ console.log("currentItems:---")
|
|
|
+
|
|
|
+ }else {
|
|
|
+ this.showIfHide(false)
|
|
|
+ console.log("currentItems:+++++++++++")
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+ input(val) {
|
|
|
+ console.log("input:", val)
|
|
|
+ },
|
|
|
+ itemSelected(val) {
|
|
|
+ console.log("itemSelected:", val)
|
|
|
+ },
|
|
|
+ pageCount(val) {
|
|
|
+ console.log("pageCount:", val)
|
|
|
+ },
|
|
|
+ pagination(val) {/*12312312312*/
|
|
|
+ console.log("pagination:", val)
|
|
|
+ },
|
|
|
+ toggleSelectAll(val) {
|
|
|
+ console.log("toggleSelectAll:", val)
|
|
|
+ },
|
|
|
+ updateExpanded(val) {
|
|
|
+ console.log("updateExpanded:", val)
|
|
|
+ },
|
|
|
+ updateGroupBy(val) {
|
|
|
+ console.log("updateGroupBy:", val)
|
|
|
+ },
|
|
|
+ updateGroupEesc(val) {
|
|
|
+ console.log("updateGroupEesc:", val)
|
|
|
+ },
|
|
|
+ updateItemsPerPage(val) {
|
|
|
+ console.log("updateItemsPerPage:", val)
|
|
|
+ },
|
|
|
+
|
|
|
+ updateMultiSort(val) {
|
|
|
+ console.log("updateMultiSort:", val)
|
|
|
+ },
|
|
|
+
|
|
|
+ updateMustSort(val) {
|
|
|
+ console.log("updateMustSort:", val)
|
|
|
+ },
|
|
|
+
|
|
|
+ updateOptions(val) {
|
|
|
+ console.log("updateOptions:", val)
|
|
|
+ },
|
|
|
+
|
|
|
+ updatePage(val) {
|
|
|
+ console.log("updatePage:", val)
|
|
|
+ },
|
|
|
+ updateSortBy(val) {
|
|
|
+ console.log("updateSortBy:", val)
|
|
|
+ },
|
|
|
+ updateSortDesc(val) {
|
|
|
+ console.log("updateSortDesc:", val)
|
|
|
+ },
|
|
|
+
|
|
|
+ itemExpanded(item, val) {
|
|
|
+ console.log("itemExpanded:", item, val)
|
|
|
+ },
|
|
|
+
|
|
|
+ toggle(val) {
|
|
|
+ console.log("toggle:", val)
|
|
|
+ },
|
|
|
+ dblclickRow(event,value){
|
|
|
+ console.log("dblclickRow:", event,value)
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ //赋予按钮第二个点击事件
|
|
|
+ addButClick(explorer) {
|
|
|
+ jquery("div.v-data-table__wrapper table tbody").on("click", ".v-row-group__header td.text-start", function (dom) {
|
|
|
+ //需要移除临时 并已经作废的标签
|
|
|
+ var array_del = jquery("a.temporary_label")
|
|
|
+ for (var d = 0; d < array_del.length; d++) {
|
|
|
+ var a = array_del.eq(d)[0]
|
|
|
+ var tr = jquery(jquery(a).parent().parent())[0]
|
|
|
+ var className = tr.className
|
|
|
+ console.log("addButRegroup--移除---", a,)
|
|
|
+ if(className.indexOf("v-row-group__header") === -1){
|
|
|
+ jquery(a).remove()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var array = jquery("div.v-data-table__wrapper table tbody .v-row-group__header td.text-start");
|
|
|
+ console.log("addButRegroup-监听-----", array)
|
|
|
+ for (var i = 0; i < array.length; i++) {
|
|
|
+ console.log("index:", array.eq(i))
|
|
|
+ //思路:根据 jq 拿到对应的td 然后循环遍历 动态添加元素标签
|
|
|
+ var td = array.eq(i)[0]
|
|
|
+ var innerText = td.innerText
|
|
|
+ var but_x = jquery(td).children()[1]
|
|
|
+ console.log("addButRegroup--对象获取---", but_x)
|
|
|
+ if (jquery(td).children().length > 2) {
|
|
|
+
|
|
|
+ } else {
|
|
|
+ //添加
|
|
|
+ var href = explorer + "/block/" + innerText.split(": ")[1];
|
|
|
+ var a = '<a class="temporary_label" href="' + href + '" target="_blank"> 跳转 </a>';
|
|
|
+ jquery(but_x).before(a)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ //添加跳转标签
|
|
|
+ addButRegroup() {
|
|
|
+ var array = jquery("div.v-data-table__wrapper table tbody .v-row-group__header td.text-start");
|
|
|
+ console.log("addButRegroup-监听-----", array)
|
|
|
+ for (var i = 0; i < array.length; i++) {
|
|
|
+ console.log("index:", array.eq(i))
|
|
|
+ //思路:根据 jq 拿到对应的td 然后循环遍历 动态添加元素标签
|
|
|
+ var td = array.eq(i)[0]
|
|
|
+ var innerText = td.innerText
|
|
|
+
|
|
|
+ var but_x = jquery(td).children()[1]
|
|
|
+ console.log("addButRegroup--对象获取---", but_x)
|
|
|
+ if (jquery(td).children().length > 2) {
|
|
|
+
|
|
|
+ } else {
|
|
|
+ //添加
|
|
|
+ var href = this.explorer + "/block/" + innerText.split(": ")[1];
|
|
|
+ var a = '<a class="temporary_label" href="' + href + '" target="_blank"> 跳转 </a>';
|
|
|
+ jquery(but_x).before(a)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //移除
|
|
|
+ remButRegroup() {
|
|
|
+ //需要移除临时 并已经作废的标签
|
|
|
+ var array_del = jquery("a.temporary_label")
|
|
|
+ for (var d = 0; d < array_del.length; d++) {
|
|
|
+ var a = array_del.eq(d)[0]
|
|
|
+ var tr = jquery(jquery(a).parent().parent())[0]
|
|
|
+ var className = tr.className
|
|
|
+ console.log("addButRegroup--移除---", a,)
|
|
|
+ if(className.indexOf("v-row-group__header") === -1){
|
|
|
+ jquery(a).remove()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ showIfHide(boo){
|
|
|
+ var array = jquery("a.temporary_label")
|
|
|
+ console.log("array",array)
|
|
|
+ if(array.length > 0){
|
|
|
+ var a = array[0]
|
|
|
+ console.log("a",a)
|
|
|
+ if(boo)
|
|
|
+ jquery(a).hide()
|
|
|
+ else
|
|
|
+ jquery(a).show()
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ },
|
|
|
+ async mounted() {
|
|
|
+ this.addButClick(this.explorer)
|
|
|
+ // let vm = new Vue({
|
|
|
+ // el: "td.text-start",
|
|
|
+ // click: () => {
|
|
|
+ // console.log('点击')
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+
|
|
|
+ // $("td.text-start").on("click",this,function (){
|
|
|
+ // console.log('点击')
|
|
|
+ // });
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
@@ -324,21 +531,25 @@ export default {
|
|
|
#dataTableHeader {
|
|
|
max-width: none;
|
|
|
}
|
|
|
+
|
|
|
.tokenChip {
|
|
|
margin-top: 5px;
|
|
|
margin-left: 5px;
|
|
|
margin-bottom: 5px;
|
|
|
}
|
|
|
+
|
|
|
.tradeInfoBtn {
|
|
|
padding: 15px !important;
|
|
|
border: grey 2px solid;
|
|
|
}
|
|
|
+
|
|
|
.tradeInfoBtn:hover {
|
|
|
background: beige;
|
|
|
}
|
|
|
+
|
|
|
.memo-span {
|
|
|
width: 200px;
|
|
|
- display:block;
|
|
|
+ display: block;
|
|
|
padding: 10px;
|
|
|
}
|
|
|
</style>
|