diff --git a/apps/settings/src/components/Users/UserFormGroups.vue b/apps/settings/src/components/Users/UserFormGroups.vue index 8e28ec6fe54a2..852b04cc1d2a0 100644 --- a/apps/settings/src/components/Users/UserFormGroups.vue +++ b/apps/settings/src/components/Users/UserFormGroups.vue @@ -46,6 +46,7 @@ import NcSelect from '@nextcloud/vue/components/NcSelect' import logger from '../../logger.ts' import { searchGroups } from '../../service/groups.ts' +import { isSelectableGroup } from './userFormUtils.ts' export default { name: 'UserFormGroups', @@ -73,7 +74,7 @@ export default { ? this.$store.getters.getSortedGroups : this.$store.getters.getSubAdminGroups - return groups.filter(({ id }) => id !== '__nc_internal_recent' && id !== 'disabled') + return groups.filter(isSelectableGroup) }, availableSubAdminGroups() { diff --git a/apps/settings/src/components/Users/userFormUtils.spec.ts b/apps/settings/src/components/Users/userFormUtils.spec.ts index 01482e30e71fe..4ecace3da7997 100644 --- a/apps/settings/src/components/Users/userFormUtils.spec.ts +++ b/apps/settings/src/components/Users/userFormUtils.spec.ts @@ -4,7 +4,7 @@ */ import { describe, expect, it } from 'vitest' -import { diffPayload, languageFilterBy, resolveLanguage, userToFormData, validateQuota } from './userFormUtils.ts' +import { diffPayload, isSelectableGroup, languageFilterBy, resolveLanguage, userToFormData, validateQuota } from './userFormUtils.ts' describe('resolveLanguage', () => { const serverLanguages = { @@ -266,6 +266,18 @@ describe('diffPayload', () => { }) }) +describe('isSelectableGroup', () => { + it('allows regular groups in the groups picker', () => { + expect(isSelectableGroup({ id: 'devs', name: 'Developers' })).toBe(true) + }) + + it('hides internal and guest-only groups from the groups picker', () => { + expect(isSelectableGroup({ id: '__nc_internal_recent', name: 'Recently active' })).toBe(false) + expect(isSelectableGroup({ id: 'disabled', name: 'Disabled accounts' })).toBe(false) + expect(isSelectableGroup({ id: 'guest_app', name: 'Guests' })).toBe(false) + }) +}) + describe('validateQuota', () => { const fallback = { id: 'default', label: 'Default quota' } diff --git a/apps/settings/src/components/Users/userFormUtils.ts b/apps/settings/src/components/Users/userFormUtils.ts index ae0a271b03682..49178d63e05ef 100644 --- a/apps/settings/src/components/Users/userFormUtils.ts +++ b/apps/settings/src/components/Users/userFormUtils.ts @@ -30,6 +30,21 @@ interface FormData { manager: string | { id: string, displayname?: string } } +const UNSELECTABLE_GROUP_IDS = [ + '__nc_internal_recent', + 'disabled', + 'guest_app', +] + +/** + * Whether a group can be offered as a selectable account group option. + * + * @param group Group option + */ +export function isSelectableGroup(group: IGroup): boolean { + return !UNSELECTABLE_GROUP_IDS.includes(group.id) +} + /** * Resolves the user's language code to a { code, name } object. *