Commits
Bruno Roemers authored a69a4e96962
134 134 | currentPage: paginationOptions.currentPage, |
135 135 | elementsPerPage: paginationOptions.pageSize |
136 136 | }); |
137 137 | }), |
138 138 | getAllSucceededRemoteData(), |
139 139 | getRemoteDataPayload(), |
140 140 | switchMap((groups: PaginatedList<Group>) => { |
141 141 | if (groups.page.length === 0) { |
142 142 | return observableOf(buildPaginatedList(groups.pageInfo, [])); |
143 143 | } |
144 - | return observableCombineLatest(groups.page.map((group: Group) => { |
145 - | if (!this.deletedGroupsIds.includes(group.id)) { |
146 - | return observableCombineLatest([ |
147 - | this.authorizationService.isAuthorized(FeatureID.CanDelete, hasValue(group) ? group.self : undefined), |
148 - | this.hasLinkedDSO(group), |
149 - | this.getSubgroups(group), |
150 - | this.getMembers(group) |
151 - | ]).pipe( |
152 - | map(([isAuthorized, hasLinkedDSO, subgroups, members]: |
153 - | [boolean, boolean, RemoteData<PaginatedList<Group>>, RemoteData<PaginatedList<EPerson>>]) => { |
154 - | const groupDtoModel: GroupDtoModel = new GroupDtoModel(); |
155 - | groupDtoModel.ableToDelete = isAuthorized && !hasLinkedDSO; |
156 - | groupDtoModel.group = group; |
157 - | groupDtoModel.subgroups = subgroups.payload; |
158 - | groupDtoModel.epersons = members.payload; |
159 - | return groupDtoModel; |
160 - | } |
161 - | ) |
162 - | ); |
163 - | } |
164 - | })).pipe(map((dtos: GroupDtoModel[]) => { |
165 - | return buildPaginatedList(groups.pageInfo, dtos); |
166 - | })); |
144 + | return this.authorizationService.isAuthorized(FeatureID.AdministratorOf).pipe( |
145 + | switchMap((isSiteAdmin: boolean) => { |
146 + | return observableCombineLatest(groups.page.map((group: Group) => { |
147 + | if (hasValue(group) && !this.deletedGroupsIds.includes(group.id)) { |
148 + | return observableCombineLatest([ |
149 + | this.authorizationService.isAuthorized(FeatureID.CanDelete, group.self), |
150 + | this.canManageGroup$(isSiteAdmin, group), |
151 + | this.hasLinkedDSO(group), |
152 + | this.getSubgroups(group), |
153 + | this.getMembers(group) |
154 + | ]).pipe( |
155 + | map(([canDelete, canManageGroup, hasLinkedDSO, subgroups, members]: |
156 + | [boolean, boolean, boolean, RemoteData<PaginatedList<Group>>, RemoteData<PaginatedList<EPerson>>]) => { |
157 + | const groupDtoModel: GroupDtoModel = new GroupDtoModel(); |
158 + | groupDtoModel.ableToDelete = canDelete && !hasLinkedDSO; |
159 + | groupDtoModel.ableToEdit = canManageGroup; |
160 + | groupDtoModel.group = group; |
161 + | groupDtoModel.subgroups = subgroups.payload; |
162 + | groupDtoModel.epersons = members.payload; |
163 + | return groupDtoModel; |
164 + | } |
165 + | ) |
166 + | ); |
167 + | } |
168 + | })).pipe(map((dtos: GroupDtoModel[]) => { |
169 + | return buildPaginatedList(groups.pageInfo, dtos); |
170 + | })); |
171 + | }) |
172 + | ); |
167 173 | }) |
168 174 | ).subscribe((value: PaginatedList<GroupDtoModel>) => { |
169 175 | this.groupsDto$.next(value); |
170 176 | this.pageInfoState$.next(value.pageInfo); |
171 177 | this.searching$.next(false); |
172 178 | }); |
173 179 | |
174 180 | this.subs.push(this.searchSub); |
175 181 | } |
176 182 | |
183 + | canManageGroup$(isSiteAdmin: boolean, group: Group): Observable<boolean> { |
184 + | if (isSiteAdmin) { |
185 + | return observableOf(true); |
186 + | } else { |
187 + | return this.authorizationService.isAuthorized(FeatureID.CanManageGroup, group.self); |
188 + | } |
189 + | } |
190 + | |
177 191 | /** |
178 192 | * Delete Group |
179 193 | */ |
180 194 | deleteGroup(group: GroupDtoModel) { |
181 195 | if (hasValue(group.group.id)) { |
182 196 | this.groupService.delete(group.group.id).pipe(getFirstCompletedRemoteData()) |
183 197 | .subscribe((rd: RemoteData<NoContent>) => { |
184 198 | if (rd.hasSucceeded) { |
185 199 | this.deletedGroupsIds = [this.deletedGroupsIds, group.group.id]; |
186 200 | this.notificationsService.success(this.translateService.get(this.messagePrefix + 'notification.deleted.success', { name: group.group.name })); |