Skip to content

Commit 26c89f9

Browse files
committed
Add sort toggle
1 parent 02d8724 commit 26c89f9

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

client/src/app/site/pages/organization/pages/committees/pages/committee-list/committee-list.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { MatButtonModule } from '@angular/material/button';
44
import { MatDividerModule } from '@angular/material/divider';
55
import { MatIconModule } from '@angular/material/icon';
66
import { MatMenuModule } from '@angular/material/menu';
7+
import { MatTooltipModule } from '@angular/material/tooltip';
78
import { OpenSlidesTranslationModule } from 'src/app/site/modules/translations';
89
import { DirectivesModule } from 'src/app/ui/directives';
910
import { ChipComponent } from 'src/app/ui/modules/chip';
@@ -32,6 +33,7 @@ import { CommitteeListServiceModule } from './services/committee-list-service.mo
3233
OpenSlidesTranslationModule.forChild(),
3334
MatDividerModule,
3435
MatMenuModule,
36+
MatTooltipModule,
3537
MatIconModule,
3638
MatButtonModule,
3739
DirectivesModule

client/src/app/site/pages/organization/pages/committees/pages/committee-list/components/committee-list/committee-list.component.html

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ <h2>{{ 'Committees' | translate }}</h2>
2222
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
2323
<span>{{ selectedRows.length }}&nbsp;{{ 'selected' | translate }}</span>
2424
</ng-container>
25+
26+
<div class="extra-controls-slot">
27+
<div>
28+
@if (selectedView === 'hierarchy') {
29+
<button mat-button matTooltip="{{ 'Hierarchy view' | translate }}" (click)="onChangeView('list')">
30+
<mat-icon>format_align_justify</mat-icon>
31+
</button>
32+
} @else {
33+
<button mat-button matTooltip="{{ 'List view' | translate }}" (click)="onChangeView('hierarchy')">
34+
<mat-icon>format_align_right</mat-icon>
35+
</button>
36+
}
37+
</div>
38+
</div>
2539
</os-head-bar>
2640

2741
<os-list
@@ -37,7 +51,7 @@ <h2>{{ 'Committees' | translate }}</h2>
3751
<div
3852
*osScrollingTableCell="'name'; row as committee"
3953
class="cell-slot fill"
40-
[style.padding-left]="(committee.all_parent_ids?.length || 0) * 25 + 'px'"
54+
[style.padding-left]="(selectedView === 'hierarchy' ? (committee.all_parent_ids?.length || 0) : 0) * 25 + 'px'"
4155
>
4256
@if (!isMultiSelect && committee.canAccess()) {
4357
<a class="stretch-to-fill-parent" [attr.aria-label]="ariaLabel(committee)" [routerLink]="committee.id"></a>

client/src/app/site/pages/organization/pages/committees/pages/committee-list/components/committee-list/committee-list.component.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export class CommitteeListComponent extends BaseListViewComponent<ViewCommittee>
3333
return this.translate.instant(`Agenda items are in process. Please wait ...`);
3434
}
3535

36+
public selectedView = `list`;
37+
3638
public constructor(
3739
protected override translate: TranslateService,
3840
public committeeController: CommitteeControllerService,
@@ -50,6 +52,12 @@ export class CommitteeListComponent extends BaseListViewComponent<ViewCommittee>
5052
super.setTitle(`Committees`);
5153
this.canMultiSelect = true;
5254
this.listStorageIndex = COMMITTEE_LIST_STORAGE_INDEX;
55+
this.selectedView = this.sortService.hierarchySort ? `hierarchy` : `list`;
56+
}
57+
58+
public onChangeView(type: string): void {
59+
this.selectedView = type;
60+
this.sortService.hierarchySort = this.selectedView === `hierarchy`;
5361
}
5462

5563
public editSingle(committee: ViewCommittee): void {

client/src/app/site/pages/organization/pages/committees/pages/committee-list/services/committee-list-sort.service/committee-sort.service.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { Injectable, ProviderToken } from '@angular/core';
22
import { _ } from '@ngx-translate/core';
3+
import { BehaviorSubject, map, Observable, withLatestFrom } from 'rxjs';
34
import { Id } from 'src/app/domain/definitions/key-types';
45
import { BaseRepository } from 'src/app/gateways/repositories/base-repository';
56
import { CommitteeRepositoryService } from 'src/app/gateways/repositories/committee-repository.service';
6-
import { BaseSortListService, OsSortingOption } from 'src/app/site/base/base-sort.service';
7+
import { BaseSortListService, OsSortingDefinition, OsSortingOption } from 'src/app/site/base/base-sort.service';
78

89
import { ViewCommittee } from '../../../../view-models';
910

@@ -13,7 +14,14 @@ import { ViewCommittee } from '../../../../view-models';
1314
export class CommitteeSortService extends BaseSortListService<ViewCommittee> {
1415
protected storageKey = `CommitteeList`;
1516

16-
private hierarchySort = true;
17+
private _hierarchySort = new BehaviorSubject(true);
18+
public get hierarchySort(): boolean {
19+
return this._hierarchySort.value;
20+
}
21+
22+
public set hierarchySort(value: boolean) {
23+
this._hierarchySort.next(value);
24+
}
1725

1826
protected repositoryToken: ProviderToken<BaseRepository<any, any>> = CommitteeRepositoryService;
1927

@@ -34,6 +42,16 @@ export class CommitteeSortService extends BaseSortListService<ViewCommittee> {
3442
return this.staticSortOptions;
3543
}
3644

45+
/**
46+
* Updates every time when there's a new sortDefinition. Emits said sortDefinition.
47+
*/
48+
public override get sortingUpdatedObservable(): Observable<OsSortingDefinition<ViewCommittee>> {
49+
return super.sortingUpdatedObservable.pipe(
50+
withLatestFrom(this._hierarchySort),
51+
map(([sort, _]) => sort)
52+
);
53+
}
54+
3755
/**
3856
* Sorts the given array according to this services sort settings and returns it.
3957
*/

0 commit comments

Comments
 (0)