feat: simplify extension page component and make filtering reactive (#3589)

This commit is contained in:
dni ⚡
2025-11-27 12:58:08 +01:00
committed by GitHub
parent 704e5a1b73
commit 5711b4b804
6 changed files with 31 additions and 54 deletions
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -12,7 +12,7 @@ window.g = Vue.reactive({
isUserAuthorized: !!Quasar.Cookies.get('is_lnbits_user_authorized'), isUserAuthorized: !!Quasar.Cookies.get('is_lnbits_user_authorized'),
offline: !navigator.onLine, offline: !navigator.onLine,
visibleDrawer: false, visibleDrawer: false,
extensions: [], extensions: WINDOW_SETTINGS.EXTENSIONS,
user: null, user: null,
wallet: {}, wallet: {},
fiatBalance: 0, fiatBalance: 0,
+27 -36
View File
@@ -1,6 +1,6 @@
window.PageExtensions = { window.PageExtensions = {
template: '#page-extensions', template: '#page-extensions',
mixins: [windowMixin], mixins: [window.windowMixin],
data() { data() {
return { return {
extbuilderEnabled: false, extbuilderEnabled: false,
@@ -10,7 +10,7 @@ window.PageExtensions = {
searchTerm: '', searchTerm: '',
tab: 'all', tab: 'all',
manageExtensionTab: 'releases', manageExtensionTab: 'releases',
filteredExtensions: null, filteredExtensions: [],
updatableExtensions: [], updatableExtensions: [],
showUninstallDialog: false, showUninstallDialog: false,
showManageExtensionDialog: false, showManageExtensionDialog: false,
@@ -33,12 +33,12 @@ window.PageExtensions = {
watch: { watch: {
searchTerm(term) { searchTerm(term) {
this.filterExtensions(term, this.tab) this.filterExtensions(term, this.tab)
},
tab(val) {
this.filterExtensions(this.searchTerm, val)
} }
}, },
methods: { methods: {
handleTabChanged(tab) {
this.filterExtensions(this.searchTerm, tab)
},
filterExtensions(term, tab) { filterExtensions(term, tab) {
// Filter the extensions list // Filter the extensions list
function extensionNameContains(searchTerm) { function extensionNameContains(searchTerm) {
@@ -65,7 +65,6 @@ window.PageExtensions = {
details_link: details_link:
e.installedRelease?.details_link || e.latestRelease?.details_link e.installedRelease?.details_link || e.latestRelease?.details_link
})) }))
this.tab = tab
}, },
async installExtension(release) { async installExtension(release) {
@@ -74,29 +73,31 @@ window.PageExtensions = {
this.unsubscribeFromPaylinkWs() this.unsubscribeFromPaylinkWs()
const extension = this.selectedExtension const extension = this.selectedExtension
extension.inProgress = true this.selectedExtension.inProgress = true
this.showManageExtensionDialog = false this.showManageExtensionDialog = false
release.payment_hash = release.payment_hash =
release.payment_hash || this.getPaylinkHash(release.pay_link) release.payment_hash || this.getPaylinkHash(release.pay_link)
LNbits.api LNbits.api
.request('POST', `/api/v1/extension`, this.g.user.wallets[0].adminkey, { .request('POST', `/api/v1/extension`, this.g.user.wallets[0].adminkey, {
ext_id: extension.id, ext_id: this.selectedExtension.id,
archive: release.archive, archive: release.archive,
source_repo: release.source_repo, source_repo: release.source_repo,
payment_hash: release.payment_hash, payment_hash: release.payment_hash,
version: release.version version: release.version
}) })
.then(response => { .then(response => {
const extension = this.extensions.find(
ext => ext.id === this.selectedExtension.id
)
extension.isAvailable = true extension.isAvailable = true
extension.isInstalled = true extension.isInstalled = true
extension.installedRelease = release extension.installedRelease = release
this.toggleExtension(extension) this.toggleExtension(extension)
extension.inProgress = false extension.inProgress = false
this.filteredExtensions = this.extensions.concat([]) this.selectedExtension = extension
this.handleTabChanged('installed') this.extensions = this.extensions.concat([])
this.tab = 'installed' this.tab = 'installed'
this.refreshRoute()
}) })
.catch(err => { .catch(err => {
console.warn(err) console.warn(err)
@@ -105,34 +106,32 @@ window.PageExtensions = {
}) })
}, },
async uninstallExtension() { async uninstallExtension() {
const extension = this.selectedExtension
this.showManageExtensionDialog = false this.showManageExtensionDialog = false
this.showUninstallDialog = false this.showUninstallDialog = false
extension.inProgress = true this.selectedExtension.inProgress = true
LNbits.api LNbits.api
.request( .request(
'DELETE', 'DELETE',
`/api/v1/extension/${extension.id}`, `/api/v1/extension/${this.selectedExtension.id}`,
this.g.user.wallets[0].adminkey this.g.user.wallets[0].adminkey
) )
.then(response => { .then(response => {
const extension = this.extensions.find(
ext => ext.id === this.selectedExtension.id
)
extension.isAvailable = false extension.isAvailable = false
extension.isInstalled = false extension.isInstalled = false
extension.inProgress = false extension.inProgress = false
extension.installedRelease = null extension.installedRelease = null
this.filteredExtensions = this.extensions.concat([]) this.filteredExtensions = this.filteredExtensions.filter(
this.handleTabChanged('installed') ext => ext.id !== extension.id
this.tab = 'installed' )
Quasar.Notify.create({ Quasar.Notify.create({
type: 'positive', type: 'positive',
message: 'Extension uninstalled!' message: 'Extension uninstalled!'
}) })
if (this.uninstallAndDropDb) { if (this.uninstallAndDropDb) {
this.showDropDb() this.showDropDb()
} else {
setTimeout(() => {
this.refreshRoute()
}, 300)
} }
}) })
.catch(err => { .catch(err => {
@@ -160,9 +159,6 @@ window.PageExtensions = {
type: 'positive', type: 'positive',
message: 'Extension DB deleted!' message: 'Extension DB deleted!'
}) })
setTimeout(() => {
this.refreshRoute()
}, 300)
}) })
.catch(err => { .catch(err => {
LNbits.utils.notifyApiError(err) LNbits.utils.notifyApiError(err)
@@ -626,9 +622,6 @@ window.PageExtensions = {
message: `${count ? count : 'No'} extensions updated!` message: `${count ? count : 'No'} extensions updated!`
}) })
this.showUpdateAllDialog = false this.showUpdateAllDialog = false
setTimeout(() => {
this.refreshRoute()
}, 2000)
}, },
async fetchAllExtensions() { async fetchAllExtensions() {
try { try {
@@ -644,20 +637,18 @@ window.PageExtensions = {
async created() { async created() {
this.extensions = await this.fetchAllExtensions() this.extensions = await this.fetchAllExtensions()
this.extbuilderEnabled = user.admin || this.LNBITS_EXT_BUILDER this.extbuilderEnabled = user.admin || this.LNBITS_EXT_BUILDER
this.filteredExtensions = this.extensions.concat([])
const hash = window.location.hash.replace('#', '') const extId = window.location.hash.replace('#', '')
const ext = this.filteredExtensions.find(ext => ext.id === hash) const ext = this.extensions.find(ext => ext.id === extId)
if (ext) { if (ext) {
this.searchTerm = ext.id this.searchTerm = ext.id
this.handleTabChanged(ext.isInstalled ? 'installed' : 'all') if (ext.isInstalled) this.tab = 'installed'
this.tab = ext.isInstalled ? 'installed' : 'all'
} else {
const hasInstalled = this.filteredExtensions.some(ext => ext.isInstalled)
this.handleTabChanged(hasInstalled ? 'installed' : 'all')
this.tab = hasInstalled ? 'installed' : 'all'
} }
this.updatableExtensions = this.extensions.filter(ext => this.updatableExtensions = this.extensions.filter(ext =>
this.hasNewVersion(ext) this.hasNewVersion(ext)
) )
this.filterExtensions(this.searchTerm, this.tab)
} }
} }
-8
View File
@@ -59,14 +59,6 @@ window.windowMixin = {
} }
} }
}) })
},
refreshRoute() {
const path = window.location.pathname
console.log(path)
this.$router.push('/temp').then(() => {
this.$router.replace({path})
})
} }
}, },
created() { created() {
+1 -7
View File
@@ -4,12 +4,7 @@
<q-card> <q-card>
<div> <div>
<div class="q-gutter-y-md"> <div class="q-gutter-y-md">
<q-tabs <q-tabs v-model="tab" active-color="primary" align="left">
:model-value="tab"
@update:model-value="handleTabChanged"
active-color="primary"
align="left"
>
<q-tab name="installed" :label="$t('installed')"></q-tab> <q-tab name="installed" :label="$t('installed')"></q-tab>
<q-tab name="all" :label="$t('all')"></q-tab> <q-tab name="all" :label="$t('all')"></q-tab>
<q-tab name="featured" :label="$t('featured')"></q-tab> <q-tab name="featured" :label="$t('featured')"></q-tab>
@@ -1080,7 +1075,6 @@
color="grey" color="grey"
v-text="$t('update')" v-text="$t('update')"
></q-btn> ></q-btn>
<q-btn <q-btn
v-close-popup v-close-popup
flat flat