Skip to content

Commit ba0993c

Browse files
committed
Add multi-select tutorial
1 parent 5a339ff commit ba0993c

12 files changed

+163
-39
lines changed

cloudapp/src/app/app-routing.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { BindComponent } from './bind/bind.component';
1111
import { StoreComponent } from './store/store.component';
1212
import { TranslateComponent } from './translate/translate.component';
1313
import { ConfigurationComponent, ConfigurationGuard } from './configuration/configuration.component';
14+
import { MultiSelectComponent } from './multi-select/multi-select.component';
1415

1516
const routes: Routes = [
1617
{ path: '', component: MainComponent },
@@ -23,6 +24,7 @@ const routes: Routes = [
2324
{ path: 'bind', component: BindComponent },
2425
{ path: 'store', component: StoreComponent },
2526
{ path: 'translate', component: TranslateComponent },
27+
{ path: 'multi-select', component: MultiSelectComponent },
2628
{ path: 'configuration', component: ConfigurationComponent, canActivate: [ConfigurationGuard] },
2729
];
2830

cloudapp/src/app/app.module.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import { BindComponent } from './bind/bind.component';
2020
import { StoreComponent } from './store/store.component';
2121
import { TranslateComponent } from './translate/translate.component';
2222
import { ConfigurationComponent } from './configuration/configuration.component';
23+
import { MultiSelectComponent } from './multi-select/multi-select.component';
24+
import { SelectEntitiesComponent } from './multi-select/select-entities/select-entities.component';
2325

2426
export function getToastrModule() {
2527
return ToastrModule.forRoot({
@@ -42,7 +44,9 @@ export function getToastrModule() {
4244
BindComponent,
4345
StoreComponent,
4446
TranslateComponent,
45-
ConfigurationComponent
47+
ConfigurationComponent,
48+
MultiSelectComponent,
49+
SelectEntitiesComponent
4650
],
4751
imports: [
4852
MaterialModule,

cloudapp/src/app/main/main.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ <h1>
1313
<li><a [routerLink]="['bind']">Model binding with REST objects</a></li>
1414
<li><a [routerLink]="['store']">Using the Store Service</a></li>
1515
<li><a [routerLink]="['translate']">Translating your app</a></li>
16+
<li><a [routerLink]="['multi-select']">Selecting multiple entities</a></li>
1617
<li *ngIf="isAdmin"><a [routerLink]="['configuration']">Using the Configuration Service</a></li>
1718
</ul>
1819
</section>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export interface Settings {
2-
showValue: boolean,
3-
pageSize: number
1+
export class Settings {
2+
showValue: boolean = false;
3+
pageSize: number = 10;
44
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<p>A total of <strong>{{ ids.size }}</strong> items have been selected.</p>
2+
<div *ngIf="entities.length>0 else noEntities">
3+
<p>Select the desired items:</p>
4+
<app-select-entities #selectEntities
5+
(entitySelected)="onEntitySelected($event)"
6+
[entityList]="entities"
7+
[selectedEntities]="ids">
8+
</app-select-entities>
9+
</div>
10+
<ng-template #noEntities>
11+
Please navigate to a list.
12+
</ng-template>

cloudapp/src/app/multi-select/multi-select.component.scss

Whitespace-only changes.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Component, OnInit } from '@angular/core';
2+
import { AppService } from '../app.service';
3+
import { Entity, CloudAppEventsService } from '@exlibris/exl-cloudapp-angular-lib';
4+
import { Subscription } from 'rxjs';
5+
6+
@Component({
7+
selector: 'app-multi-select',
8+
templateUrl: './multi-select.component.html',
9+
styleUrls: ['./multi-select.component.scss']
10+
})
11+
export class MultiSelectComponent implements OnInit {
12+
private pageLoad$: Subscription;
13+
ids = new Set<string>();
14+
entities: Entity[];
15+
16+
constructor(
17+
private appService: AppService,
18+
private eventsService: CloudAppEventsService
19+
) { }
20+
21+
ngOnInit() {
22+
this.appService.setTitle('Multi-select');
23+
this.pageLoad$ = this.eventsService.onPageLoad( pageInfo => {
24+
this.entities = (pageInfo.entities||[]);
25+
});
26+
}
27+
28+
ngOnDestroy(): void {
29+
this.pageLoad$.unsubscribe();
30+
}
31+
32+
onEntitySelected(event) {
33+
if (event.checked) this.ids.add(event.mmsId);
34+
else this.ids.delete(event.mmsId);
35+
}
36+
37+
38+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<mat-list>
2+
<mat-list-item>
3+
<mat-checkbox
4+
[(ngModel)]="masterChecked"
5+
[(indeterminate)]="masterIndeterminate"
6+
(change)="masterChange()"
7+
><b>Check/Uncheck All</b></mat-checkbox>
8+
</mat-list-item>
9+
<mat-list-item *ngFor="let entity of entities">
10+
<mat-checkbox [value]="entity.id"
11+
[(ngModel)]="entity.checked"
12+
(change)="listChange($event)"
13+
>{{entity.name}}</mat-checkbox>
14+
</mat-list-item>
15+
</mat-list>

cloudapp/src/app/multi-select/select-entities/select-entities.component.scss

Whitespace-only changes.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2+
import { MatCheckboxChange } from '@angular/material';
3+
import { Entity } from '@exlibris/exl-cloudapp-angular-lib';
4+
5+
@Component({
6+
selector: 'app-select-entities',
7+
templateUrl: './select-entities.component.html',
8+
styleUrls: ['./select-entities.component.scss']
9+
})
10+
export class SelectEntitiesComponent implements OnInit {
11+
masterChecked: boolean;
12+
masterIndeterminate: boolean;
13+
entities: SelectItem[];
14+
@Input() selectedEntities: Set<string>;
15+
@Output() entitySelected = new EventEmitter();
16+
17+
constructor() { }
18+
19+
ngOnInit() {
20+
this.masterChecked = false;
21+
}
22+
23+
@Input()
24+
set entityList(val: Entity[]) {
25+
this.entities = val.map(i=>new SelectItem(i, id => this.selectedEntities.has(id)));
26+
this.determineMasterValue();
27+
}
28+
29+
masterChange() {
30+
Object.values(this.entities).forEach(b=>{
31+
b.checked = this.masterChecked;
32+
this.entitySelected.emit({mmsId: b.id, checked: b.checked})
33+
})
34+
}
35+
36+
listChange(e: MatCheckboxChange){
37+
this.determineMasterValue();
38+
this.entitySelected.emit({mmsId: e.source.value, checked: e.checked});
39+
}
40+
41+
determineMasterValue() {
42+
const checked_count = Object.values(this.entities).filter(i=>i.checked).length;
43+
this.masterChecked = checked_count == this.entities.length;
44+
this.masterIndeterminate = checked_count > 0 && checked_count < this.entities.length;
45+
}
46+
}
47+
48+
export class SelectItem {
49+
checked: boolean;
50+
id: string;
51+
description: string;
52+
name: string;
53+
54+
constructor(item: Partial<SelectItem>, checker: (id: string) => boolean) {
55+
Object.assign(this, item);
56+
this.name = [this.description, this.id].join(' / ');
57+
this.checked = checker(item.id);
58+
}
59+
}

0 commit comments

Comments
 (0)