fix: extension enable reactivity (#3512)

This commit is contained in:
dni ⚡ 2025-11-12 13:41:01 +01:00 committed by GitHub
parent 39c33699af
commit f9b0604711
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 115 additions and 116 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -15,11 +15,6 @@ window.LNbits = {
} }
}, },
map: { map: {
extension(data) {
const obj = {...data}
obj.url = ['/', obj.code, '/'].join('')
return obj
},
user(data) { user(data) {
const obj = { const obj = {
id: data.id, id: data.id,

View file

@ -43,62 +43,6 @@ window.app.component('lnbits-wallet-list', {
} }
}) })
window.app.component('lnbits-extension-list', {
mixins: [window.windowMixin],
template: '#lnbits-extension-list',
data() {
return {
extensions: [],
searchTerm: ''
}
},
watch: {
'g.user.extensions': {
handler(newExtensions) {
this.loadExtensions()
},
deep: true
}
},
computed: {
userExtensions() {
return this.updateUserExtensions(this.searchTerm)
}
},
methods: {
async loadExtensions() {
try {
const {data} = await LNbits.api.request('GET', '/api/v1/extension')
this.extensions = data
.map(extension => LNbits.map.extension(extension))
.sort((a, b) => a.name.localeCompare(b.name))
} catch (error) {
LNbits.utils.notifyApiError(error)
}
},
updateUserExtensions(filterBy) {
const path = window.location.pathname
const userExtensions = this.g.user.extensions
return this.extensions
.filter(o => userExtensions.includes(o.code))
.filter(o => {
if (!filterBy) return true
return `${o.code} ${o.name} ${o.short_description} ${o.url}`
.toLocaleLowerCase()
.includes(filterBy.toLocaleLowerCase())
})
.map(obj => {
obj.isActive = path.startsWith(obj.url)
return obj
})
}
},
async created() {
await this.loadExtensions()
}
})
window.app.component('lnbits-manage', { window.app.component('lnbits-manage', {
mixins: [window.windowMixin], mixins: [window.windowMixin],
template: '#lnbits-manage', template: '#lnbits-manage',

View file

@ -0,0 +1,57 @@
window.app.component('lnbits-extension-list', {
mixins: [window.windowMixin],
template: '#lnbits-extension-list',
data() {
return {
extensions: [],
userExtensions: [],
searchTerm: ''
}
},
watch: {
'g.user.extensions': {
async handler() {
await this.loadExtensions()
}
},
searchTerm() {
this.filterUserExtensionsByTerm()
}
},
methods: {
map(data) {
const obj = {...data}
obj.url = ['/', obj.code, '/'].join('')
return obj
},
async loadExtensions() {
try {
const {data} = await LNbits.api.request('GET', '/api/v1/extension')
this.extensions = data
.map(extension => this.map(extension))
.sort((a, b) => a.name.localeCompare(b.name))
this.filterUserExtensionsByTerm()
} catch (error) {
LNbits.utils.notifyApiError(error)
}
},
filterUserExtensionsByTerm() {
const userExts = this.g.user.extensions
this.userExtensions = this.extensions
.filter(o => userExts.includes(o.code))
.filter(o => {
if (this.searchTerm === '') return true
return `${o.code} ${o.name} ${o.short_description} ${o.url}`
.toLocaleLowerCase()
.includes(this.searchTerm.toLocaleLowerCase())
})
.map(obj => {
obj.isActive = window.location.pathname.startsWith(obj.url)
return obj
})
}
},
async created() {
await this.loadExtensions()
}
})

View file

@ -205,13 +205,14 @@ window.PageExtensions = {
this.g.user.wallets[0].adminkey this.g.user.wallets[0].adminkey
) )
.then(response => { .then(response => {
// create new array to trigger reactivity
this.g.user.extensions = this.g.user.extensions
.concat([])
.push(extension.id)
Quasar.Notify.create({ Quasar.Notify.create({
type: 'positive', type: 'positive',
message: 'Extension enabled!' message: 'Extension enabled!'
}) })
setTimeout(() => {
this.refreshRoute()
}, 300)
}) })
.catch(err => { .catch(err => {
console.warn(err) console.warn(err)
@ -226,13 +227,13 @@ window.PageExtensions = {
this.g.user.wallets[0].adminkey this.g.user.wallets[0].adminkey
) )
.then(response => { .then(response => {
this.g.user.extensions = this.g.user.extensions.filter(
ext => ext !== extension.id
)
Quasar.Notify.create({ Quasar.Notify.create({
type: 'positive', type: 'positive',
message: 'Extension disabled!' message: 'Extension disabled!'
}) })
setTimeout(() => {
this.refreshRoute()
}, 300)
}) })
.catch(err => { .catch(err => {
console.warn(error) console.warn(error)

View file

@ -74,6 +74,7 @@
"js/components/lnbits-footer.js", "js/components/lnbits-footer.js",
"js/components/lnbits-header.js", "js/components/lnbits-header.js",
"js/components/lnbits-drawer.js", "js/components/lnbits-drawer.js",
"js/components/lnbits-manage-extension-list.js",
"js/components/extension-settings.js", "js/components/extension-settings.js",
"js/components/data-fields.js", "js/components/data-fields.js",
"js/components/payment-list.js", "js/components/payment-list.js",

View file

@ -14,7 +14,8 @@ include('components/new_user_wallet.vue') %} {%
include('components/lnbits-footer.vue') %} {% include('components/lnbits-footer.vue') %} {%
include('components/lnbits-header.vue') %} {% include('components/lnbits-header.vue') %} {%
include('components/lnbits-drawer.vue') %} {% include('components/lnbits-drawer.vue') %} {%
include('components/lnbits-home-logos.vue') %} include('components/lnbits-home-logos.vue') %} {%
include('components/lnbits-manage-extension-list.vue') %}
<template id="lnbits-wallet-list"> <template id="lnbits-wallet-list">
<q-list <q-list
@ -107,51 +108,6 @@ include('components/lnbits-home-logos.vue') %}
</q-list> </q-list>
</template> </template>
<template id="lnbits-extension-list">
<q-list
v-if="
(g.user && userExtensions && userExtensions.length > 0) || !!searchTerm
"
dense
class="lnbits-drawer__q-list"
>
<q-item>
<q-item-section>
<q-input
v-model="searchTerm"
dense
borderless
:label="$t('extensions')"
>
</q-input>
</q-item-section>
</q-item>
<q-item
v-for="extension in userExtensions"
:key="extension.code"
clickable
:active="extension.isActive"
tag="a"
:href="extension.url"
>
<q-item-section side>
<q-avatar size="md">
<q-img :src="extension.tile" style="max-width: 20px"></q-img>
</q-avatar>
</q-item-section>
<q-item-section>
<q-item-label lines="1"
><span v-text="extension.name"></span>
</q-item-label>
</q-item-section>
<q-item-section side v-show="extension.isActive">
<q-icon name="chevron_right" color="grey-5" size="md"></q-icon>
</q-item-section>
</q-item>
<div class="lt-md q-mt-xl q-mb-xl"></div>
</q-list>
</template>
<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">
<q-item-label header v-text="$t('manage')"></q-item-label> <q-item-label header v-text="$t('manage')"></q-item-label>

View file

@ -38,7 +38,9 @@
@wallet-action="handleWalletAction" @wallet-action="handleWalletAction"
></lnbits-wallet-list> ></lnbits-wallet-list>
<lnbits-manage></lnbits-manage> <lnbits-manage></lnbits-manage>
<lnbits-extension-list class="q-pb-xl"></lnbits-extension-list> <lnbits-manage-extension-list
class="q-pb-xl"
></lnbits-manage-extension-list>
</q-scroll-area> </q-scroll-area>
</q-drawer> </q-drawer>
</template> </template>

View file

@ -0,0 +1,42 @@
<template id="lnbits-extension-list">
<q-list
v-if="g.user && extensions && extensions.length > 0"
dense
class="lnbits-drawer__q-list"
>
<q-item>
<q-item-section>
<q-input
v-model="searchTerm"
dense
borderless
:label="$t('extensions')"
>
</q-input>
</q-item-section>
</q-item>
<q-item
v-for="extension in userExtensions"
:key="extension.code"
clickable
:active="extension.isActive"
tag="a"
:href="extension.url"
>
<q-item-section side>
<q-avatar size="md">
<q-img :src="extension.tile" style="max-width: 20px"></q-img>
</q-avatar>
</q-item-section>
<q-item-section>
<q-item-label lines="1"
><span v-text="extension.name"></span>
</q-item-label>
</q-item-section>
<q-item-section side v-show="extension.isActive">
<q-icon name="chevron_right" color="grey-5" size="md"></q-icon>
</q-item-section>
</q-item>
<div class="lt-md q-mt-xl q-mb-xl"></div>
</q-list>
</template>

View file

@ -126,6 +126,7 @@
"js/components/lnbits-footer.js", "js/components/lnbits-footer.js",
"js/components/lnbits-header.js", "js/components/lnbits-header.js",
"js/components/lnbits-drawer.js", "js/components/lnbits-drawer.js",
"js/components/lnbits-manage-extension-list.js",
"js/components/extension-settings.js", "js/components/extension-settings.js",
"js/components/data-fields.js", "js/components/data-fields.js",
"js/components/payment-list.js", "js/components/payment-list.js",