Merge pull request #56569 from nextcloud/backport/55901/stable32

[stable32] fix(settings): Reactive UI updates for app group limitations
pull/56731/head
F. E Noel Nfebe 2025-11-27 13:06:24 +07:00 committed by GitHub
commit 1eb8d7e105
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 56 additions and 9 deletions

@ -164,21 +164,35 @@ export default {
}, },
addGroupLimitation(groupArray) { addGroupLimitation(groupArray) {
if (this.app?.app_api) { if (this.app?.app_api) {
return // not supported for app_api apps return
} }
const group = groupArray.pop() const group = groupArray.pop()
const groups = this.app.groups.concat([]).concat([group.id]) const groups = this.app.groups.concat([]).concat([group.id])
if (this.store && this.store.updateAppGroups) {
this.store.updateAppGroups(this.app.id, groups)
}
this.$store.dispatch('enableApp', { appId: this.app.id, groups }) this.$store.dispatch('enableApp', { appId: this.app.id, groups })
}, },
removeGroupLimitation(group) { removeGroupLimitation(group) {
if (this.app?.app_api) { if (this.app?.app_api) {
return // not supported for app_api apps return
} }
const currentGroups = this.app.groups.concat([]) const currentGroups = this.app.groups.concat([])
const index = currentGroups.indexOf(group.id) const index = currentGroups.indexOf(group.id)
if (index > -1) { if (index > -1) {
currentGroups.splice(index, 1) currentGroups.splice(index, 1)
} }
if (this.store && this.store.updateAppGroups) {
this.store.updateAppGroups(this.app.id, currentGroups)
}
if (currentGroups.length === 0) {
this.groupCheckedAppsData = false
}
this.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups }) this.$store.dispatch('enableApp', { appId: this.app.id, groups: currentGroups })
}, },
forceEnable(appId) { forceEnable(appId) {

@ -83,5 +83,12 @@ export const useAppsStore = defineStore('settings-apps', {
getAppById(appId: string): IAppstoreApp|null { getAppById(appId: string): IAppstoreApp|null {
return this.apps.find(({ id }) => id === appId) ?? null return this.apps.find(({ id }) => id === appId) ?? null
}, },
updateAppGroups(appId: string, groups: string[]) {
const app = this.apps.find(({ id }) => id === appId)
if (app) {
app.groups = [...groups]
}
},
}, },
}) })

@ -71,7 +71,7 @@ const mutations = {
enableApp(state, { appId, groups }) { enableApp(state, { appId, groups }) {
const app = state.apps.find(app => app.id === appId) const app = state.apps.find(app => app.id === appId)
app.active = true app.active = true
app.groups = groups Vue.set(app, 'groups', [...groups])
if (app.id === 'app_api') { if (app.id === 'app_api') {
state.appApiEnabled = true state.appApiEnabled = true
} }
@ -183,6 +183,19 @@ const actions = {
return api.requireAdmin().then((response) => { return api.requireAdmin().then((response) => {
context.commit('startLoading', apps) context.commit('startLoading', apps)
context.commit('startLoading', 'install') context.commit('startLoading', 'install')
const previousState = {}
apps.forEach((_appId) => {
const app = context.state.apps.find((app) => app.id === _appId)
if (app) {
previousState[_appId] = {
active: app.active,
groups: [...(app.groups || [])],
}
context.commit('enableApp', { appId: _appId, groups })
}
})
return api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups }) return api.post(generateUrl('settings/apps/enable'), { appIds: apps, groups })
.then((response) => { .then((response) => {
context.commit('stopLoading', apps) context.commit('stopLoading', apps)
@ -225,6 +238,19 @@ const actions = {
.catch((error) => { .catch((error) => {
context.commit('stopLoading', apps) context.commit('stopLoading', apps)
context.commit('stopLoading', 'install') context.commit('stopLoading', 'install')
apps.forEach((_appId) => {
if (previousState[_appId]) {
context.commit('enableApp', {
appId: _appId,
groups: previousState[_appId].groups,
})
if (!previousState[_appId].active) {
context.commit('disableApp', _appId)
}
}
})
context.commit('setError', { context.commit('setError', {
appId: apps, appId: apps,
error: error.response.data.data.message, error: error.response.data.data.message,

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long