fix: extension enable reactivity (#3512)
This commit is contained in:
parent
39c33699af
commit
f9b0604711
11 changed files with 115 additions and 116 deletions
2
lnbits/static/bundle-components.min.js
vendored
2
lnbits/static/bundle-components.min.js
vendored
File diff suppressed because one or more lines are too long
2
lnbits/static/bundle.min.js
vendored
2
lnbits/static/bundle.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
57
lnbits/static/js/components/lnbits-manage-extension-list.js
Normal file
57
lnbits/static/js/components/lnbits-manage-extension-list.js
Normal 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()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
42
lnbits/templates/components/lnbits-manage-extension-list.vue
Normal file
42
lnbits/templates/components/lnbits-manage-extension-list.vue
Normal 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>
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue