From c2dea5faf65dca0f6775ed6d73661eb9738eaf0b Mon Sep 17 00:00:00 2001
From: Arthur Schiwon <blizzz@arthur-schiwon.de>
Date: Tue, 8 Apr 2025 18:27:05 +0200
Subject: fix(workflowengine): fix group not shown in Group membership check

this might have occured on instances with
- more than twenty groups, and
- on rules with more than one Group membership checks
- and at least one of them being not in the set of the first 20 groups

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
---
 .../src/components/Checks/RequestUserGroup.vue     | 37 +++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

(limited to 'apps/workflowengine/src/components/Checks/RequestUserGroup.vue')

diff --git a/apps/workflowengine/src/components/Checks/RequestUserGroup.vue b/apps/workflowengine/src/components/Checks/RequestUserGroup.vue
index 978732aed09..f9606b7ca26 100644
--- a/apps/workflowengine/src/components/Checks/RequestUserGroup.vue
+++ b/apps/workflowengine/src/components/Checks/RequestUserGroup.vue
@@ -25,6 +25,7 @@ import axios from '@nextcloud/axios'
 import NcSelect from '@nextcloud/vue/components/NcSelect'
 
 const groups = []
+const wantedGroups = []
 const status = {
 	isLoading: false,
 }
@@ -49,6 +50,7 @@ export default {
 		return {
 			groups,
 			status,
+			wantedGroups,
 			newValue: '',
 		}
 	},
@@ -82,6 +84,13 @@ export default {
 
 		searchAsync(searchQuery) {
 			if (this.status.isLoading) {
+				if (searchQuery) {
+					// The first 20 groups are loaded up front (indicated by an
+					// empty searchQuery parameter), afterwards we may load
+					// groups that have not been fetched yet, but are used
+					// in existing rules.
+					this.enqueueWantedGroup(searchQuery)
+				}
 				return
 			}
 
@@ -94,11 +103,15 @@ export default {
 					})
 				})
 				this.status.isLoading = false
+				this.findGroupByQueue()
 			}, (error) => {
 				console.error('Error while loading group list', error.response)
 			})
 		},
-		updateInternalValue() {
+		async updateInternalValue() {
+			if (!this.newValue) {
+				await this.searchAsync(this.modelValue)
+			}
 			this.newValue = this.modelValue
 		},
 		addGroup(group) {
@@ -107,10 +120,32 @@ export default {
 				this.groups.push(group)
 			}
 		},
+		hasGroup(group) {
+			const index = this.groups.findIndex((item) => item.id === group)
+			return index > -1
+		},
 		update(value) {
 			this.newValue = value.id
 			this.$emit('update:model-value', this.newValue)
 		},
+		enqueueWantedGroup(expectedGroupId) {
+			const index = this.wantedGroups.findIndex((groupId) => groupId === expectedGroupId)
+			if (index === -1) {
+				this.wantedGroups.push(expectedGroupId)
+			}
+		},
+		async findGroupByQueue() {
+			let nextQuery
+			do {
+				nextQuery = this.wantedGroups.shift()
+				if (this.hasGroup(nextQuery)) {
+					nextQuery = undefined
+				}
+			} while (!nextQuery && this.wantedGroups.length > 0)
+			if (nextQuery) {
+				await this.searchAsync(nextQuery)
+			}
+		},
 	},
 }
 </script>
-- 
cgit v1.2.3

