Compare commits

..
21 changed files with 915 additions and 910 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ RUN uv sync --all-extras
ENV LNBITS_PORT="5000" ENV LNBITS_PORT="5000"
ENV LNBITS_HOST="0.0.0.0" ENV LNBITS_HOST="0.0.0.0"
ENV LNBITS_BACKEND_WALLET_CLASS="BoltzWallet" ENV LNBITS_BACKEND_WALLET_CLASS="BoltzWallet"
ENV FUNDING_SOURCE_MAX_RETRIES=10 ENV FUNDING_SOURCE_MAX_RETRIES="10"
# Boltzd # Boltzd
ENV BOLTZ_CLIENT_ENDPOINT="127.0.0.1:9002" ENV BOLTZ_CLIENT_ENDPOINT="127.0.0.1:9002"
+5 -3
View File
@@ -2,15 +2,17 @@ ARG LNBITS_TAG=latest
FROM lnbits/lnbits:${LNBITS_TAG} FROM lnbits/lnbits:${LNBITS_TAG}
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
RUN apt-get update && apt-get -y upgrade RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y netcat-openbsd npm nodejs git RUN apt-get install -y ca-certificates curl gnupg netcat-openbsd git nodejs
RUN curl -LsSf https://astral.sh/uv/install.sh | sh RUN curl -LsSf https://astral.sh/uv/install.sh | sh
ENV PATH="/root/.local/bin:$PATH" ENV PATH="/root/.local/bin:$PATH"
# install sparksidecar # install sparksidecar
RUN git clone https://github.com/lnbits/spark_sidecar RUN git clone https://github.com/lnbits/spark_sidecar
RUN cd spark_sidecar && npm install RUN cd spark_sidecar && npm ci
# Reinstall dependencies for lnbits just in case (needed for CMD usage) # Reinstall dependencies for lnbits just in case (needed for CMD usage)
RUN uv sync --all-extras RUN uv sync --all-extras
@@ -22,7 +24,7 @@ ENV LNBITS_BACKEND_WALLET_CLASS="SparkL2Wallet"
ENV LNBITS_RESERVE_FEE_MIN="20000" ENV LNBITS_RESERVE_FEE_MIN="20000"
ENV LNBITS_RESERVE_FEE_PERCENT="1" ENV LNBITS_RESERVE_FEE_PERCENT="1"
ENV LNBITS_FUNDING_SOURCE_PAY_INVOICE_WAIT_SECONDS="20" ENV LNBITS_FUNDING_SOURCE_PAY_INVOICE_WAIT_SECONDS="20"
ENV FUNDING_SOURCE_MAX_RETRIES=10 ENV FUNDING_SOURCE_MAX_RETRIES="10"
# spark sidecar # spark sidecar
ENV SPARK_NETWORK="MAINNET" ENV SPARK_NETWORK="MAINNET"
File diff suppressed because one or more lines are too long
@@ -1,105 +0,0 @@
window.app.component('lnbits-dialog', {
template: '#lnbits-dialog',
props: {
show: {
type: Boolean,
default: false
},
title: {
type: String,
default: ''
},
position: {
type: String,
default: 'top'
},
persistent: {
type: Boolean,
default: false
},
showCancel: {
type: Boolean,
default: true
},
cancelLabel: {
type: String,
default: 'Close'
},
cancelColor: {
type: String,
default: 'grey'
},
action: {
type: Object,
default: null
},
secondaryAction: {
type: Object,
default: null
}
},
emits: ['update:show', 'hide', 'cancel', 'action', 'secondary-action'],
computed: {
hasAction() {
return !!(this.action && this.action.label)
},
hasSecondaryAction() {
return !!(this.secondaryAction && this.secondaryAction.label)
},
actionProps() {
const action = this.action || {}
const obj = {
label: action.label || 'Action',
color: action.color || 'primary',
loading: !!action.loading,
disable: !!action.disable,
closePopup: !!action.closePopup
}
if (action.icon) {
obj.icon = action.icon
}
return obj
},
secondaryActionProps() {
const action = this.secondaryAction || {}
const obj = {
label: action.label || 'Secondary',
color: action.color || 'secondary',
loading: !!action.loading,
disable: !!action.disable,
closePopup: !!action.closePopup
}
if (action.icon) {
obj.icon = action.icon
}
return obj
}
},
methods: {
handleModelUpdate(value) {
this.$emit('update:show', value)
},
handleHide() {
this.handleModelUpdate(false)
this.$emit('hide')
},
handleCancel() {
this.$emit('cancel')
},
handleAction() {
this.$emit('action')
},
handleSecondaryAction() {
this.$emit('secondary-action')
}
}
})
-1
View File
@@ -70,7 +70,6 @@
"js/components/admin/lnbits-admin-site-customisation.js", "js/components/admin/lnbits-admin-site-customisation.js",
"js/components/admin/lnbits-admin-assets-config.js", "js/components/admin/lnbits-admin-assets-config.js",
"js/components/admin/lnbits-admin-audit.js", "js/components/admin/lnbits-admin-audit.js",
"js/components/lnbits-dialog.js",
"js/components/lnbits-wallet-charts.js", "js/components/lnbits-wallet-charts.js",
"js/components/lnbits-wallet-api-docs.js", "js/components/lnbits-wallet-api-docs.js",
"js/components/lnbits-wallet-icon.js", "js/components/lnbits-wallet-icon.js",
+1 -2
View File
@@ -30,8 +30,7 @@ include('components/lnbits-wallet-share.vue') %} {%
include('components/lnbits-wallet-charts.vue') %} {% include('components/lnbits-wallet-charts.vue') %} {%
include('components/lnbits-wallet-paylinks.vue') %} {% include('components/lnbits-wallet-paylinks.vue') %} {%
include('components/lnbits-wallet-extra.vue') %} {% include('components/lnbits-wallet-extra.vue') %} {%
include('components/lnbits-error.vue') %} {% include('components/lnbits-error.vue') %}
include('components/lnbits-dialog.vue') %}
<template id="lnbits-manage"> <template id="lnbits-manage">
<q-list v-if="g.user" dense class="lnbits-drawer__q-list"> <q-list v-if="g.user" dense class="lnbits-drawer__q-list">
@@ -199,16 +199,12 @@
</div> </div>
<div class="col-md-8 col-sm-12"></div> <div class="col-md-8 col-sm-12"></div>
</div> </div>
<lnbits-dialog
:show="exchangeData.showTickerConversion" <q-dialog v-model="exchangeData.showTickerConversion" position="top">
:title="$t('create_ticker_converter')" <q-card class="q-pa-md q-pt-md lnbits__dialog-card">
:action="{ <div class="q-mb-md">
label: 'Add Ticker Conversion' <strong v-text="$t('create_ticker_converter')"></strong>
}" </div>
:cancel-label="$t('close')"
@update:show="exchangeData.showTickerConversion = $event"
@action="addExchangeTickerConversion()"
>
<div class="row"> <div class="row">
<div class="col-12 q-mb-md"> <div class="col-12 q-mb-md">
<q-select <q-select
@@ -230,5 +226,20 @@
</q-input> </q-input>
</div> </div>
</div> </div>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn
@click="addExchangeTickerConversion()"
label="Add Ticker Conversion"
color="primary"
></q-btn>
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
v-text="$t('close')"
></q-btn>
</div>
</q-card>
</q-dialog>
</template> </template>
@@ -125,14 +125,15 @@
</q-expansion-item> </q-expansion-item>
</div> </div>
</q-list> </q-list>
<lnbits-dialog <q-dialog v-model="showQRDialog">
:show="showQRDialog" <q-card class="q-pa-md">
:position="'standard'"
@update:show="showQRDialog = $event"
>
<q-card-section> <q-card-section>
<lnbits-qrcode :value="qrValue"></lnbits-qrcode> <lnbits-qrcode :value="qrValue"></lnbits-qrcode>
</q-card-section> </q-card-section>
</lnbits-dialog> <q-card-actions align="right">
<q-btn flat :label="$t('close')" v-close-popup />
</q-card-actions>
</q-card>
</q-dialog>
</div> </div>
</template> </template>
@@ -1,61 +0,0 @@
<template id="lnbits-dialog">
<q-dialog
:model-value="show"
:position="position"
:persistent="persistent"
@update:model-value="handleModelUpdate"
@hide="handleHide"
>
<q-card class="q-pa-lg q-pt-xl lnbits__dialog-card">
<!-- Header with optional title -->
<q-card-section v-if="title">
<div class="text-h6" v-text="title"></div>
</q-card-section>
<!-- Main content slot -->
<q-card-section>
<slot></slot>
</q-card-section>
<q-card-actions
v-if="showCancel || hasAction || hasSecondaryAction"
class="q-mt-lg"
align="right"
>
<q-btn
v-if="showCancel"
v-close-popup
flat
:color="cancelColor"
:label="cancelLabel"
@click="handleCancel"
></q-btn>
<q-space></q-space>
<q-btn
v-if="hasSecondaryAction"
:icon="secondaryActionProps.icon"
:color="secondaryActionProps.color"
:label="secondaryActionProps.label"
:loading="secondaryActionProps.loading"
:disable="secondaryActionProps.disable"
@click="handleSecondaryAction"
v-close-popup="secondaryActionProps.closePopup"
class="q-mr-sm"
></q-btn>
<q-btn
v-if="hasAction"
:icon="actionProps.icon"
:color="actionProps.color"
:label="actionProps.label"
:loading="actionProps.loading"
:disable="actionProps.disable"
@click="handleAction"
v-close-popup="actionProps.closePopup"
></q-btn>
</q-card-actions>
</q-card>
</q-dialog>
</template>
@@ -394,16 +394,9 @@
></span> ></span>
</i> </i>
</q-td> </q-td>
<lnbits-dialog <q-dialog v-model="props.expand" :props="props" position="top">
:show="props.expand" <q-card class="q-pa-sm q-pt-xl lnbits__dialog-card">
:cancel-label="$t('close')" <q-card-section>
:action="{
label: $t('check_payment'),
icon: 'refresh'
}"
@update:show="props.expand = $event"
@action="checkPayment(props.row.payment_hash)"
>
<q-list bordered separator> <q-list bordered separator>
<q-expansion-item <q-expansion-item
expand-separator expand-separator
@@ -468,7 +461,9 @@
</q-list> </q-list>
<div <div
v-if="props.row.isIn && props.row.isPending && props.row.bolt11" v-if="
props.row.isIn && props.row.isPending && props.row.bolt11
"
> >
<div v-if="props.row.extra.fiat_payment_request"> <div v-if="props.row.extra.fiat_payment_request">
<lnbits-qrcode <lnbits-qrcode
@@ -484,24 +479,27 @@
></lnbits-qrcode> ></lnbits-qrcode>
</div> </div>
</div> </div>
</lnbits-dialog> <div class="row q-mt-md">
<lnbits-dialog <q-btn
:show="hodlInvoice.show" outline
:cancel-label="$t('close')" color="grey"
:action="{ @click="checkPayment(props.row.payment_hash)"
label: $t('cancel_invoice'), icon="refresh"
color: 'grey', :label="$t('payment_check')"
closePopup: true ></q-btn>
}" <q-btn
:secondary-action="{ v-close-popup
label: $t('settle_invoice'), flat
color: 'grey', color="grey"
closePopup: true class="q-ml-auto"
}" :label="$t('close')"
@update:show="hodlInvoice.show = $event" ></q-btn>
@action="cancelHoldInvoice(hodlInvoice.payment.payment_hash)" </div>
@secondary-action="settleHoldInvoice(hodlInvoice.preimage)" </q-card-section>
> </q-card>
</q-dialog>
<q-dialog v-model="hodlInvoice.show" position="top">
<q-card class="q-pa-sm q-pt-xl lnbits__dialog-card">
<q-card-section> <q-card-section>
<q-item-label class="text-h6"> <q-item-label class="text-h6">
<span v-text="$t('hold_invoice')"></span> <span v-text="$t('hold_invoice')"></span>
@@ -522,7 +520,33 @@
> >
</q-input> </q-input>
</q-card-section> </q-card-section>
</lnbits-dialog> <q-card-section class="row q-gutter-x-sm">
<q-btn
@click="settleHoldInvoice(hodlInvoice.preimage)"
outline
v-close-popup
color="grey"
:label="$t('settle_invoice')"
>
</q-btn>
<q-btn
v-close-popup
outline
color="grey"
class="q-ml-sm"
@click="cancelHoldInvoice(hodlInvoice.payment.payment_hash)"
:label="$t('cancel_invoice')"
></q-btn>
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
:label="$t('close')"
></q-btn>
</q-card-section>
</q-card>
</q-dialog>
</q-tr> </q-tr>
</template> </template>
</q-table> </q-table>
@@ -1,10 +1,6 @@
<template id="lnbits-qrcode-scanner"> <template id="lnbits-qrcode-scanner">
<lnbits-dialog <q-dialog v-model="showScanner" position="top">
:show="showScanner" <q-card class="q-pa-lg q-pt-xl">
:cancel-label="$t('cancel')"
@update:show="showScanner = $event"
@cancel="reset"
>
<div class="text-center q-mb-lg"> <div class="text-center q-mb-lg">
<qrcode-stream <qrcode-stream
@detect="detect" @detect="detect"
@@ -12,5 +8,15 @@
class="rounded-borders" class="rounded-borders"
></qrcode-stream> ></qrcode-stream>
</div> </div>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn
@click="reset"
flat
color="grey"
class="q-ml-auto"
:label="$t('cancel')"
></q-btn>
</div>
</q-card>
</q-dialog>
</template> </template>
@@ -8,17 +8,9 @@
icon="edit" icon="edit"
style="position: relative; left: -15px; bottom: -10px" style="position: relative; left: -15px; bottom: -10px"
></q-btn> ></q-btn>
<lnbits-dialog <q-dialog v-model="icon.show" position="top">
:show="icon.show" <q-card class="q-pa-lg q-pt-xl lnbits__dialog-card">
:action="{ <q-form @submit="setIcon" class="q-gutter-md">
label: 'Save Icon',
disable: !icon.data.icon
}"
@update:show="icon.show = $event"
@action="setIcon"
@hide="icon.data = {}"
>
<q-form class="q-gutter-md">
<div class="q-gutter-sm q-pa-sm flex flex-wrap justify-center"> <div class="q-gutter-sm q-pa-sm flex flex-wrap justify-center">
<q-btn <q-btn
v-for="(thisIcon, index) in icon.options" v-for="(thisIcon, index) in icon.options"
@@ -49,7 +41,16 @@
class="q-mr-xs" class="q-mr-xs"
></q-btn> ></q-btn>
</div> </div>
<q-btn
unelevated
color="primary"
:disable="!icon.data.icon"
type="submit"
>
Save Icon
</q-btn>
</div> </div>
</q-form> </q-form>
</lnbits-dialog> </q-card>
</q-dialog>
</template> </template>
@@ -1,24 +1,11 @@
<template id="lnbits-wallet-new"> <template id="lnbits-wallet-new">
<lnbits-dialog <q-dialog v-model="showNewWalletDialog" position="top">
:show="showNewWalletDialog" <q-card class="q-pa-lg q-pt-md lnbits__dialog-card">
:title="$t('add_new_wallet')" <q-card-section>
:action="{ <div class="text-h6">
label: $t('add_wallet'), <span v-text="$t('add_new_wallet')"></span>
closePopup: true </div>
}" </q-card-section>
:secondary-action="
isLightningShared
? {
label: $t('reject_wallet'),
color: 'negative',
closePopup: true
}
: null
"
@update:show="showNewWalletDialog = $event"
@action="submitAddWallet"
@secondary-action="submitRejectWalletInvitation"
>
<q-card-section v-if="g.user.walletInvitesCount"> <q-card-section v-if="g.user.walletInvitesCount">
<q-badge <q-badge
@click="g.newWalletType = 'lightning-shared'" @click="g.newWalletType = 'lightning-shared'"
@@ -68,5 +55,40 @@
<span v-text="$t('shared_wallet_desc')" class="q-mt-lg"></span> <span v-text="$t('shared_wallet_desc')" class="q-mt-lg"></span>
</div> </div>
</q-card-section> </q-card-section>
</lnbits-dialog>
<q-card-actions class="text-primary">
<div class="row full-width">
<div class="col-md-4">
<q-btn
flat
:label="$t('cancel')"
class="float-left"
v-close-popup
></q-btn>
</div>
<div class="col-md-4">
<q-btn
v-if="isLightningShared"
:disabled="!wallet.sharedWalletId"
flat
:label="$t('reject_wallet')"
v-close-popup
color="negative"
@click="submitRejectWalletInvitation()"
></q-btn>
<span v-else></span>
</div>
<div class="col-md-4">
<q-btn
flat
:label="$t('add_wallet')"
v-close-popup
@click="submitAddWallet()"
class="float-right"
></q-btn>
</div>
</div>
</q-card-actions>
</q-card>
</q-dialog>
</template> </template>
+99 -60
View File
@@ -1231,16 +1231,10 @@
</div> </div>
</div> </div>
<lnbits-dialog <q-dialog v-model="apiAcl.showPasswordDialog" position="top">
:show="apiAcl.showPasswordDialog" <q-card class="q-pa-md q-pt-md lnbits__dialog-card">
title="Password Required" <strong>User Password</strong>
:action="{ <div class="row q-mt-md q-col-gutter-md">
label: $t('ok')
}"
@update:show="apiAcl.showPasswordDialog = $event"
@action="runPasswordGuardedFunction()"
>
<div class="row q-col-gutter-md">
<div class="col-12"> <div class="col-12">
<q-input <q-input
v-model="apiAcl.password" v-model="apiAcl.password"
@@ -1253,39 +1247,55 @@
</q-input> </q-input>
</div> </div>
</div> </div>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
v-text="$t('cancel')"
></q-btn>
<q-btn
@click="runPasswordGuardedFunction()"
:label="$t('ok')"
color="primary"
></q-btn>
</div>
</q-card>
</q-dialog>
<lnbits-dialog <q-dialog v-model="apiAcl.showNewAclDialog" position="top">
:show="apiAcl.showNewAclDialog" <q-card class="q-pa-md q-pt-md lnbits__dialog-card">
title="New API Access Control List" <strong>New API Access Control List</strong>
:action="{ <div class="row q-mt-md q-col-gutter-md">
label: 'Create'
}"
:cancel-label="$t('close')"
@update:show="apiAcl.showNewAclDialog = $event"
@action="addApiACL()"
>
<div class="row q-col-gutter-md">
<div class="col-12"> <div class="col-12">
<q-input v-model="apiAcl.newAclName" dense filled label="ACL Name"> <q-input v-model="apiAcl.newAclName" dense filled label="ACL Name">
</q-input> </q-input>
</div> </div>
</div> </div>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn @click="addApiACL()" label="Create" color="primary"></q-btn>
<lnbits-dialog <q-btn
:show="apiAcl.showNewTokenDialog" v-close-popup
title="New API Token" flat
:action="{ color="grey"
label: 'Create' class="q-ml-auto"
}" v-text="$t('close')"
:cancel-label="$t('close')" ></q-btn>
@update:show="apiAcl.showNewTokenDialog = $event" </div>
@action="generateApiToken()" </q-card>
> </q-dialog>
<div class="row q-col-gutter-md"> <q-dialog v-model="apiAcl.showNewTokenDialog" position="top">
<q-card class="q-pa-md q-pt-md lnbits__dialog-card">
<strong>New API Token</strong>
<div class="row q-col-gutter-md q-mt-md">
<div class="col-12"> <div class="col-12">
<q-input v-model="apiAcl.newTokenName" dense filled label="Token Name"> <q-input
v-model="apiAcl.newTokenName"
dense
filled
label="Token Name"
>
</q-input> </q-input>
</div> </div>
<div class="col-12"> <div class="col-12">
@@ -1303,7 +1313,10 @@
transition-show="scale" transition-show="scale"
transition-hide="scale" transition-hide="scale"
> >
<q-date v-model="apiAcl.newTokenExpiry" mask="YYYY-MM-DD HH:mm"> <q-date
v-model="apiAcl.newTokenExpiry"
mask="YYYY-MM-DD HH:mm"
>
<div class="row items-center justify-end"> <div class="row items-center justify-end">
<q-btn v-close-popup label="Close" color="primary" flat /> <q-btn v-close-popup label="Close" color="primary" flat />
</div> </div>
@@ -1334,28 +1347,26 @@
</q-input> </q-input>
</div> </div>
</div> </div>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn
<lnbits-dialog @click="generateApiToken()"
:show="labelsDialog.show" label="Create"
:title="$t('label')" color="primary"
:action="{ ></q-btn>
label: g.user.extra.labels.some( <q-btn
label => label.name === labelsDialog.data.name v-close-popup
) flat
? $t('update_label') color="grey"
: $t('add_label'), class="q-ml-auto"
disable: !labelsDialog.data.name || !labelsDialog.data.color v-text="$t('close')"
}" ></q-btn>
:cancel-label="$t('cancel')" </div>
@update:show="labelsDialog.show = $event" </q-card>
@action=" </q-dialog>
g.user.extra.labels.some(label => label.name === labelsDialog.data.name) <q-dialog v-model="labelsDialog.show" position="top">
? updateUserLabel() <q-card class="q-pa-md q-pt-md lnbits__dialog-card">
: addUserLabel() <strong v-text="$t('label')"></strong>
" <div class="row q-mt-md q-col-gutter-md">
>
<div class="row q-col-gutter-md">
<div class="col-12"> <div class="col-12">
<q-input <q-input
v-model="labelsDialog.data.name" v-model="labelsDialog.data.name"
@@ -1400,5 +1411,33 @@
</q-input> </q-input>
</div> </div>
</div> </div>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
v-text="$t('cancel')"
></q-btn>
<q-btn
v-if="
g.user.extra.labels.some(
label => label.name === labelsDialog.data.name
)
"
@click="updateUserLabel()"
:disable="!labelsDialog.data.name || !labelsDialog.data.color"
:label="$t('update_label')"
color="primary"
></q-btn>
<q-btn
v-else
@click="addUserLabel()"
:disable="!labelsDialog.data.name || !labelsDialog.data.color"
:label="$t('add_label')"
color="primary"
></q-btn>
</div>
</q-card>
</q-dialog>
</template> </template>
+22 -12
View File
@@ -170,17 +170,9 @@
</div> </div>
</div> </div>
<lnbits-dialog <q-dialog v-model="auditDetailsDialog.show" position="top">
:show="auditDetailsDialog.show" <q-card class="q-pa-md q-pt-md lnbits__dialog-card">
:title="$t('http_request_details')" <strong v-text="$t('http_request_details')"></strong>
:action="{
label: $t('copy'),
icon: 'content_copy'
}"
:cancel-label="$t('close')"
@update:show="auditDetailsDialog.show = $event"
@action="utils.copyText(auditDetailsDialog.data)"
>
<q-input <q-input
filled filled
dense dense
@@ -188,5 +180,23 @@
type="textarea" type="textarea"
rows="25" rows="25"
></q-input> ></q-input>
</lnbits-dialog>
<div class="row q-mt-lg">
<q-btn
@click="utils.copyText(auditDetailsDialog.data)"
icon="content_copy"
color="grey"
flat
v-text="$t('copy')"
></q-btn>
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
v-text="$t('close')"
></q-btn>
</div>
</q-card>
</q-dialog>
</template> </template>
+59 -44
View File
@@ -366,16 +366,9 @@
</div> </div>
</div> </div>
<lnbits-dialog <q-dialog v-model="showUninstallDialog" position="top">
:show="showUninstallDialog" <q-card class="q-pa-lg">
:title="$t('warning')" <h6 class="q-my-md text-primary" v-text="$t('warning')"></h6>
:action="{
label: $t('uninstall_confirm')
}"
:cancel-label="$t('cancel')"
@update:show="showUninstallDialog = $event"
@action="uninstallExtension()"
>
<p> <p>
<span v-text="$t('extension_uninstall_warning')"></span><br /> <span v-text="$t('extension_uninstall_warning')"></span><br />
<span v-text="$t('confirm_continue')"></span> <span v-text="$t('confirm_continue')"></span>
@@ -392,21 +385,27 @@
</q-tooltip> </q-tooltip>
</q-checkbox> </q-checkbox>
</div> </div>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn
outline
color="grey"
@click="uninstallExtension()"
v-text="$t('uninstall_confirm')"
></q-btn>
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
v-text="$t('cancel')"
></q-btn>
</div>
</q-card>
</q-dialog>
<lnbits-dialog <q-dialog v-model="showDropDbDialog" position="top">
v-if="selectedExtension" <q-card v-if="selectedExtension" class="q-pa-lg">
:show="showDropDbDialog" <h6 class="q-my-md text-primary" v-text="$t('warning')"></h6>
:title="$t('warning')"
:action="{
label: $t('confirm'),
color: 'red',
disable: dropDbExtensionId !== selectedExtension.id
}"
:cancel-label="$t('cancel')"
@update:show="showDropDbDialog = $event"
@action="dropExtensionDb()"
>
<p><span v-text="$t('extension_db_drop_warning')"></span><br /></p> <p><span v-text="$t('extension_db_drop_warning')"></span><br /></p>
<q-input <q-input
v-model="dropDbExtensionId" v-model="dropDbExtensionId"
@@ -431,7 +430,8 @@
v-text="$t('cancel')" v-text="$t('cancel')"
></q-btn> ></q-btn>
</div> </div>
</lnbits-dialog> </q-card>
</q-dialog>
<q-dialog v-model="showManageExtensionDialog" position="top"> <q-dialog v-model="showManageExtensionDialog" position="top">
<q-card v-if="selectedRelease" class="q-pa-lg lnbits__dialog-card"> <q-card v-if="selectedRelease" class="q-pa-lg lnbits__dialog-card">
@@ -1244,11 +1244,9 @@
</q-card-section> </q-card-section>
</q-card> </q-card>
</q-dialog> </q-dialog>
<lnbits-dialog <q-dialog v-model="paymentDialog.show" position="top">
:show="paymentDialog.show" <q-card class="q-pa-md lnbits__dialog-card">
:cancel-label="$t('close')" <q-card-section>
@update:show="paymentDialog.show = $event"
>
<q-responsive :ratio="1" class="q-mx-xl q-mb-xl"> <q-responsive :ratio="1" class="q-mx-xl q-mb-xl">
<lnbits-qrcode <lnbits-qrcode
:value="paymentDialog.invoice" :value="paymentDialog.invoice"
@@ -1256,20 +1254,21 @@
class="rounded-borders" class="rounded-borders"
></lnbits-qrcode> ></lnbits-qrcode>
</q-responsive> </q-responsive>
</lnbits-dialog> </q-card-section>
<q-card-actions align="between">
<lnbits-dialog <q-btn v-close-popup flat color="grey" :label="$t('close')"></q-btn>
:show="showUpdateAllDialog" </q-card-actions>
:title="$t('update')" </q-card>
:action="{ </q-dialog>
label: $t('update') <q-dialog v-model="showUpdateAllDialog" position="top">
}" <q-card class="q-pa-md q-pt-md lnbits__dialog-card">
:cancel-label="$t('cancel')" <div class="row">
@update:show="showUpdateAllDialog = $event" <div class="col-12">
@action="updateSelectedExtensions()" <h6 class="q-my-md" v-text="$t('update')"></h6>
> </div>
</div>
<div v-if="updatableExtensions?.length > 1" class="row"> <div v-if="updatableExtensions?.length > 1" class="row">
<div class="col-12 q-mb-md"> <div class="col-12">
<q-btn <q-btn
outline outline
color="grey" color="grey"
@@ -1300,5 +1299,21 @@
</div> </div>
</template> </template>
</q-virtual-scroll> </q-virtual-scroll>
</lnbits-dialog> <div class="row q-mt-lg">
<q-btn
@click="updateSelectedExtensions()"
outline
color="grey"
v-text="$t('update')"
></q-btn>
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
v-text="$t('cancel')"
></q-btn>
</div>
</q-card>
</q-dialog>
</template> </template>
+83 -46
View File
@@ -103,15 +103,8 @@
</q-card-section> </q-card-section>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="channels"> <q-tab-panel name="channels">
<lnbits-dialog <q-dialog v-model="connectPeerDialog.show" position="top">
:show="connectPeerDialog.show" <q-card class="q-pa-lg q-pt-xl lnbits__dialog-card">
:action="{
label: $t('connect')
}"
:cancel-label="$t('cancel')"
@update:show="connectPeerDialog.show = $event"
@action="connectPeer"
>
<q-form class="q-gutter-md"> <q-form class="q-gutter-md">
<q-input <q-input
dense dense
@@ -121,19 +114,28 @@
label="Node URI" label="Node URI"
hint="pubkey@host:port" hint="pubkey@host:port"
></q-input> ></q-input>
</q-form>
</lnbits-dialog>
<lnbits-dialog <div class="row q-mt-lg">
:show="setFeeDialog.show" <q-btn
title="Set Channel Fee" :label="$t('connect')"
:action="{ color="primary"
label: $t('set') @click="connectPeer"
}" ></q-btn>
:cancel-label="$t('cancel')" <q-btn
@update:show="setFeeDialog.show = $event" v-close-popup
@action="setChannelFee(setFeeDialog.channel_id)" flat
> color="grey"
class="q-ml-auto"
:label="$t('cancel')"
></q-btn>
</div>
</q-form>
</q-card>
</q-dialog>
<q-dialog v-model="setFeeDialog.show">
<q-card class="q-pa-lg q-pt-xl lnbits__dialog-card">
<label class="text-h6">Set Channel Fee</label>
<p class="text-caption" v-text="setFeeDialog.channel_id"></p> <p class="text-caption" v-text="setFeeDialog.channel_id"></p>
<q-separator></q-separator> <q-separator></q-separator>
<q-form class="q-gutter-md"> <q-form class="q-gutter-md">
@@ -151,18 +153,27 @@
v-model.number="setFeeDialog.data.fee_base_msat" v-model.number="setFeeDialog.data.fee_base_msat"
label="Fee Base msat" label="Fee Base msat"
></q-input> ></q-input>
</q-form>
</lnbits-dialog>
<lnbits-dialog <div class="row q-mt-lg">
:show="openChannelDialog.show" <q-btn
:action="{ :label="$t('set')"
label: $t('open') color="primary"
}" @click="setChannelFee(setFeeDialog.channel_id)"
:cancel-label="$t('cancel')" ></q-btn>
@update:show="openChannelDialog.show = $event" <q-btn
@action="openChannel" v-close-popup
> flat
color="grey"
class="q-ml-auto"
:label="$t('cancel')"
></q-btn>
</div>
</q-form>
</q-card>
</q-dialog>
<q-dialog v-model="openChannelDialog.show">
<q-card class="q-pa-lg q-pt-xl lnbits__dialog-card">
<q-form class="q-gutter-md"> <q-form class="q-gutter-md">
<q-input <q-input
dense dense
@@ -186,7 +197,9 @@
dense dense
type="number" type="number"
filled filled
v-model.number="openChannelDialog.data.push_amount" v-model.number="
openChannelDialog.data.push_amount
"
label="Push Amount" label="Push Amount"
hint="This gifts sats to the other side!" hint="This gifts sats to the other side!"
></q-input> ></q-input>
@@ -202,19 +215,27 @@
</q-card-section> </q-card-section>
</q-card> </q-card>
</q-expansion-item> </q-expansion-item>
</q-form>
</lnbits-dialog>
<lnbits-dialog <div class="row q-mt-lg">
:show="closeChannelDialog.show" <q-btn
title="Close Channel" :label="$t('open')"
:action="{ color="primary"
label: $t('close') @click="openChannel"
}" ></q-btn>
:cancel-label="$t('cancel')" <q-btn
@update:show="closeChannelDialog.show = $event" v-close-popup
@action="closeChannel" flat
> color="grey"
class="q-ml-auto"
:label="$t('cancel')"
></q-btn>
</div>
</q-form>
</q-card>
</q-dialog>
<q-dialog v-model="closeChannelDialog.show" position="top">
<q-card class="q-pa-lg q-pt-xl lnbits__dialog-card">
<q-form class="q-gutter-md"> <q-form class="q-gutter-md">
<div> <div>
<q-checkbox <q-checkbox
@@ -222,8 +243,24 @@
label="Force" label="Force"
/> />
</div> </div>
<div class="row q-mt-lg">
<q-btn
:label="$t('close')"
color="primary"
@click="closeChannel"
></q-btn>
<q-btn
v-close-popup
flat
color="grey"
class="q-ml-auto"
:label="$t('cancel')"
></q-btn>
</div>
</q-form> </q-form>
</lnbits-dialog> </q-card>
</q-dialog>
<q-card-section class="q-pa-none"> <q-card-section class="q-pa-none">
<div class="row q-col-gutter-lg"> <div class="row q-col-gutter-lg">
+19 -13
View File
@@ -446,17 +446,9 @@
</div> </div>
</div> </div>
<div v-else-if="activeWallet.show"> <div v-else-if="activeWallet.show">
<lnbits-dialog <q-dialog v-model="createWalletDialog.show" position="top">
:show="createWalletDialog.show" <q-card class="q-pa-md q-pt-md lnbits__dialog-card">
title="Create Wallet" <strong>Create Wallet</strong>
:action="{
label: 'Create',
closePopup: true
}"
cancel-label="Cancel"
@update:show="createWalletDialog.show = $event"
@action="createWallet"
>
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<div class="row q-mt-lg"> <div class="row q-mt-lg">
@@ -477,13 +469,27 @@
filled filled
dense dense
v-model="createWalletDialog.data.currency" v-model="createWalletDialog.data.currency"
:options="g.allowedCurrencies" :options="{{ currencies | safe }}"
></q-select> ></q-select>
</div> </div>
</div> </div>
<div class="row q-mt-lg">
<q-btn
v-close-popup
@click="createWallet()"
unelevated
color="primary"
type="submit"
>Create</q-btn
>
<q-btn v-close-popup flat color="grey" class="q-ml-auto"
>Cancel</q-btn
>
</div> </div>
</div> </div>
</lnbits-dialog> </div>
</q-card>
</q-dialog>
</div> </div>
<div v-else> <div v-else>
<div class="row q-col-gutter-md q-mb-md"> <div class="row q-col-gutter-md q-mb-md">
-1
View File
@@ -123,7 +123,6 @@
"js/components/admin/lnbits-admin-site-customisation.js", "js/components/admin/lnbits-admin-site-customisation.js",
"js/components/admin/lnbits-admin-assets-config.js", "js/components/admin/lnbits-admin-assets-config.js",
"js/components/admin/lnbits-admin-audit.js", "js/components/admin/lnbits-admin-audit.js",
"js/components/lnbits-dialog.js",
"js/components/lnbits-wallet-charts.js", "js/components/lnbits-wallet-charts.js",
"js/components/lnbits-wallet-api-docs.js", "js/components/lnbits-wallet-api-docs.js",
"js/components/lnbits-wallet-icon.js", "js/components/lnbits-wallet-icon.js",
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "lnbits" name = "lnbits"
version = "1.5.2-rc1" version = "1.5.2"
requires-python = ">=3.10,<3.13" requires-python = ">=3.10,<3.13"
description = "LNbits, free and open-source Lightning wallet and accounts system." description = "LNbits, free and open-source Lightning wallet and accounts system."
authors = [{ name = "Alan Bits", email = "alan@lnbits.com" }] authors = [{ name = "Alan Bits", email = "alan@lnbits.com" }]
Generated
+1 -1
View File
@@ -1247,7 +1247,7 @@ wheels = [
[[package]] [[package]]
name = "lnbits" name = "lnbits"
version = "1.5.2rc1" version = "1.5.2"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "aiosqlite" }, { name = "aiosqlite" },