feat: add expanding details to rows

This commit is contained in:
Vlad Stan
2022-07-08 15:47:48 +03:00
parent 4fa8b5a292
commit 5a3e1d7fbb
2 changed files with 179 additions and 48 deletions

View File

@@ -13,19 +13,22 @@ const retryWithDelay = async function (fn, retryCount = 0) {
} }
} }
const mapCharge = obj => { const mapCharge = (obj, oldObj = {}) => {
obj._data = _.clone(obj) obj._data = _.clone(obj)
obj.theTime = obj.time * 60 - (Date.now() / 1000 - obj.timestamp) obj.theTime = obj.time * 60 - (Date.now() / 1000 - obj.timestamp)
obj.time = obj.time + 'mins' obj.time = obj.time + ' min'
if (obj.time_elapsed) { if (obj.time_elapsed) {
obj.date = 'Time elapsed' obj.date = ''
} else { } else {
obj.date = Quasar.utils.date.formatDate( obj.date = Quasar.utils.date.formatDate(
new Date((obj.theTime - 3600) * 1000), new Date((obj.theTime - 3600) * 1000),
'HH:mm:ss' 'HH:mm:ss'
) )
} }
obj.expanded = false
obj.displayUrl = ['/satspay/', obj.id].join('') obj.displayUrl = ['/satspay/', obj.id].join('')
obj.expanded = oldObj.expanded
obj.pendingBalance = oldObj.pendingBalance || 0
return obj return obj
} }

View File

@@ -58,17 +58,14 @@
<template v-slot:header="props"> <template v-slot:header="props">
<q-tr :props="props"> <q-tr :props="props">
<q-th auto-width></q-th> <q-th auto-width></q-th>
<q-th auto-width></q-th> <q-th auto-width>Status</q-th>
<q-th auto-width>Title</q-th>
<q-th <q-th auto-width>Time Left</q-th>
v-for="col in props.cols" <q-th auto-width>Time To Pay</q-th>
:key="col.name" <q-th auto-width>Amount To Pay</q-th>
:props="props" <q-th auto-width>Balance</q-th>
auto-width <q-th auto-width>Pending Balance</q-th>
> <q-th auto-width>Onchain Address</q-th>
<div v-if="col.name == 'id'"></div>
<div v-else>{{ col.label }}</div>
</q-th>
<q-th auto-width></q-th> <q-th auto-width></q-th>
</q-tr> </q-tr>
</template> </template>
@@ -77,53 +74,162 @@
<q-tr :props="props"> <q-tr :props="props">
<q-td auto-width> <q-td auto-width>
<q-btn <q-btn
unelevated size="sm"
color="accent"
round
dense dense
size="xs" @click="props.row.expanded= !props.row.expanded"
icon="link" :icon="props.row.expanded? 'remove' : 'add'"
:color="($q.dark.isActive) ? 'grey-7' : 'grey-5'" />
type="a"
:href="props.row.displayUrl"
target="_blank"
>
<q-tooltip> Payment link </q-tooltip>
</q-btn>
</q-td> </q-td>
<q-td auto-width> <q-td auto-width>
<q-btn
flat
dense
size="xs"
@click="deleteChargeLink(props.row.id)"
icon="cancel"
color="pink"
>
<q-tooltip> Delete charge </q-tooltip>
</q-btn>
<q-badge <q-badge
v-if="props.row.time_elapsed && props.row.balance < props.row.amount" v-if="props.row.time_elapsed && props.row.balance < props.row.amount"
color="red" color="red"
> >
expired <a
:href="props.row.displayUrl"
target="_blank"
style="color: unset; text-decoration: none"
>expired</a
>
</q-badge> </q-badge>
<q-badge <q-badge
v-else-if="props.row.balance >= props.row.amount" v-else-if="props.row.balance >= props.row.amount"
color="green" color="green"
> >
paid <a
:href="props.row.displayUrl"
target="_blank"
style="color: unset; text-decoration: none"
>paid</a
>
</q-badge> </q-badge>
<q-badge v-else color="blue"> waiting </q-badge> <q-badge v-else color="blue"
</q-td> ><a
<q-td :href="props.row.displayUrl"
v-for="col in props.cols" target="_blank"
:key="col.name" style="color: unset; text-decoration: none"
:props="props" >waiting</a
auto-width
> >
<div v-if="col.name == 'id'"></div> </q-badge>
<div v-else>{{ col.value }}</div> </q-td>
<q-td key="description" :props="props" :class="">
<a
:href="props.row.displayUrl"
target="_blank"
style="color: unset; text-decoration: none"
>{{props.row.description}}</a
>
</q-td>
<q-td key="timeleft" :props="props" :class="">
<div>{{props.row.date}}</div>
</q-td>
<q-td key="time to pay" :props="props" :class="">
<div>{{props.row.time}}</div>
</q-td>
<q-td key="amount" :props="props" :class="">
<div>{{props.row.amount}}</div>
</q-td>
<q-td key="balance" :props="props" :class="">
<div>{{props.row.balance}}</div>
</q-td>
<q-td key="pendingBalance" :props="props" :class="">
<div>
{{props.row.pendingBalance ? props.row.pendingBalance : ''}}
</div>
</q-td>
<q-td key="onchain address" :props="props" :class="">
<a
:href="props.row.displayUrl"
target="_blank"
style="color: unset; text-decoration: none"
>{{props.row.onchainaddress}}</a
>
</q-td>
</q-tr>
<q-tr v-show="props.row.expanded" :props="props">
<q-td colspan="100%">
<div
v-if="props.row.onchainwallet"
class="row items-center q-mt-md q-mb-lg"
>
<div class="col-2 q-pr-lg">Onchain Wallet:</div>
<div class="col-4 q-pr-lg">
{{getOnchainWalletName(props.row.onchainwallet)}}
</div>
</div>
<div
v-if="props.row.lnbitswallet"
class="row items-center q-mt-md q-mb-lg"
>
<div class="col-2 q-pr-lg">LNbits Wallet:</div>
<div class="col-4 q-pr-lg">
{{getLNbitsWalletName(props.row.lnbitswallet)}}
</div>
</div>
<div
v-if="props.row.completelink || props.row.completelinktext"
class="row items-center q-mt-md q-mb-lg"
>
<div class="col-2 q-pr-lg">Completed Link:</div>
<div class="col-4 q-pr-lg">
<a
:href="props.row.completelink"
target="_blank"
style="color: unset; text-decoration: none"
>{{props.row.completelinktext ||
props.row.completelink}}</a
>
</div>
</div>
<div
v-if="props.row.webhook"
class="row items-center q-mt-md q-mb-lg"
>
<div class="col-2 q-pr-lg">Webhook:</div>
<div class="col-4 q-pr-lg">
<a
:href="props.row.webhook"
target="_blank"
style="color: unset; text-decoration: none"
>{{props.row.webhook || props.row.webhook}}</a
>
</div>
</div>
<div class="row items-center q-mt-md q-mb-lg">
<div class="col-2 q-pr-lg">ID:</div>
<div class="col-4 q-pr-lg">{{props.row.id}}</div>
</div>
<div class="row items-center q-mt-md q-mb-lg">
<div class="col-2 q-pr-lg"></div>
<div class="col-6 q-pr-lg">
<q-btn
unelevated
color="gray"
outline
type="a"
:href="props.row.displayUrl"
target="_blank"
class="float-right"
>Details</q-btn
></div>
<div class="col-4 q-pr-lg">
<q-btn
unelevated
color="pink"
icon="cancel"
@click="deleteChargeLink(props.row.id)"
>Delete</q-btn
>
</div>
<div class="col-4"></div>
<div class="col-2 q-pr-lg"></div>
</div>
</q-td> </q-td>
</q-tr> </q-tr>
</template> </template>
@@ -330,6 +436,12 @@
label: 'Balance', label: 'Balance',
field: 'balance' field: 'balance'
}, },
{
name: 'pendingBalance',
align: 'left',
label: 'Pending Balance',
field: 'pendingBalance'
},
{ {
name: 'onchain address', name: 'onchain address',
align: 'left', align: 'left',
@@ -394,7 +506,7 @@
) )
this.walletLinks = data.map(w => ({ this.walletLinks = data.map(w => ({
id: w.id, id: w.id,
label: w.title label: w.title + ' - ' + w.id
})) }))
} catch (error) { } catch (error) {
LNbits.utils.notifyApiError(error) LNbits.utils.notifyApiError(error)
@@ -413,6 +525,16 @@
LNbits.utils.notifyApiError(error) LNbits.utils.notifyApiError(error)
} }
}, },
getOnchainWalletName: function (walletId) {
const wallet = this.walletLinks.find(w => w.id === walletId)
if (!wallet) return 'unknown'
return wallet.label
},
getLNbitsWalletName: function (walletId) {
const wallet = this.g.user.walletOptions.find(w => w.value === walletId)
if (!wallet) return 'unknown'
return wallet.label
},
getCharges: async function () { getCharges: async function () {
try { try {
@@ -421,7 +543,13 @@
'/satspay/api/v1/charges', '/satspay/api/v1/charges',
this.g.user.wallets[0].inkey this.g.user.wallets[0].inkey
) )
this.chargeLinks = data.map(mapCharge) this.chargeLinks = data.map(c =>
mapCharge(
c,
this.chargeLinks.find(old => old.id === c.id)
)
)
console.log('### this.chargeLinks', this.chargeLinks)
} catch (error) { } catch (error) {
LNbits.utils.notifyApiError(error) LNbits.utils.notifyApiError(error)
} }
@@ -466,7 +594,7 @@
}) })
const utxos = await retryWithDelay(fn) const utxos = await retryWithDelay(fn)
charge.balance = utxos.reduce((t, u) => t + u.value, 0) charge.pendingBalance = utxos.reduce((t, u) => t + u.value, 0)
} }
} catch (error) { } catch (error) {
console.error(error) console.error(error)