Skip to content

Commit df08cfb

Browse files
authored
Event filter fix for map filter and Events Dashboard (#355)
* initial fix * remove comments
1 parent 9fa9cb9 commit df08cfb

File tree

7 files changed

+121
-127
lines changed

7 files changed

+121
-127
lines changed

service/src/routes/events.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,16 +211,16 @@ function EventRoutes(app: express.Application, security: { authentication: authe
211211
if (req.parameters!.userId) {
212212
filter.userId = req.parameters!.userId
213213
}
214-
const limit = req.query!.limit || 20
215-
const start = req.query!.start || 0
216-
EventModel.getEvents({ access: req.access, filter: filter, populate: req.parameters!.populate, projection: req.parameters!.projection, limit: limit, start: start }, (err, events, totalCount) => {
214+
const pageSize = parseInt(String(req.query.page_size)) || parseInt(String(req.query.limit)) || 20
215+
const page = parseInt(String(req.query.page)) || parseInt(String(req.query.start)) || 0
216+
EventModel.getEvents({ access: req.access, filter: filter, populate: req.parameters!.populate, projection: req.parameters!.projection, limit: pageSize, start: page }, (err, events, totalCount) => {
217217
if (err) {
218218
return next(err);
219219
}
220220
if (req.query.includePagination) {
221221
res.json({
222-
pageSize: limit,
223-
pageIndex: start,
222+
pageSize: pageSize,
223+
page: page,
224224
items: events!.map((event) => {
225225
return event.toObject({ access: req.access!, projection: req.parameters!.projection });
226226
}),

web-app/admin/src/app/admin/admin-event/events.service.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface SearchOptions {
1212
page?: number;
1313
page_size?: number;
1414
userId?: string;
15+
state?: string;
1516
}
1617

1718
interface EventsResponse {
@@ -35,10 +36,13 @@ export class EventsService {
3536
params = params.set('term', options.term);
3637
}
3738
if (options.page !== undefined) {
38-
params = params.set('start', String(options.page));
39+
params = params.set('page', String(options.page));
3940
}
4041
if (options.page_size !== undefined) {
41-
params = params.set('limit', String(options.page_size));
42+
params = params.set('page_size', String(options.page_size));
43+
}
44+
if (options.state !== undefined) {
45+
params = params.set('state', options.state);
4246
}
4347
if (options.teamId !== undefined) {
4448
params = params.set('teamId', options.teamId);

web-app/admin/src/ng1/admin/events/events.component.js

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,68 +9,83 @@ class AdminEventsController {
99
this.UserService = UserService;
1010

1111
this.events = [];
12+
this.totalEvents = 0;
1213
this.filter = 'active'; // possible values all, active, complete
1314
this.page = 0;
1415
this.itemsPerPage = 10;
1516
this.eventSearch = '';
17+
this.searchTimeout = null;
1618

1719
this.projection = {
1820
name: true,
1921
description: true,
2022
acl: true,
2123
complete: true
2224
};
23-
24-
// For some reason angular is not calling into filter function with correct context
25-
this.filterEvents = this._filterEvents.bind(this);
26-
this.filterComplete = this._filterComplete.bind(this);
2725
}
2826

2927
$onInit() {
30-
this.Event.query(
31-
{
32-
state: 'all',
33-
populate: false,
34-
projection: JSON.stringify(this.projection)
35-
},
36-
(events) => {
37-
this.events = events;
38-
}
39-
);
28+
this.loadEvents();
29+
}
30+
31+
loadEvents() {
32+
const params = {
33+
state: this.filter,
34+
populate: false,
35+
projection: JSON.stringify(this.projection),
36+
page: this.page,
37+
page_size: this.itemsPerPage,
38+
includePagination: true
39+
};
40+
41+
if (this.eventSearch && this.eventSearch.trim()) {
42+
params.term = this.eventSearch.trim();
43+
}
44+
45+
this.Event.queryWithPagination(params, (response) => {
46+
this.events = response.items || [];
47+
this.totalEvents = response.totalCount || 0;
48+
});
4049
}
4150

4251
handleSearchChange() {
43-
const filtered = this.events.filter((event) => this._filterEvents(event));
52+
if (this.searchTimeout) {
53+
clearTimeout(this.searchTimeout);
54+
}
55+
this.searchTimeout = setTimeout(() => {
56+
this.page = 0;
57+
this.loadEvents();
58+
}, 300);
59+
}
60+
61+
handleFilterChange() {
62+
this.page = 0;
63+
this.loadEvents();
64+
}
4465

45-
// If there are filtered results, reset to page 0, else keep the current page
46-
this.page = filtered.length > 0 ? 0 : this.page;
66+
handlePageChange() {
67+
this.loadEvents();
4768
}
4869

49-
_filterEvents(event) {
50-
const searchTerm = this.eventSearch.trim().toLowerCase();
51-
if (!searchTerm) {
52-
return true;
70+
nextPage() {
71+
if ((this.page + 1) * this.itemsPerPage < this.totalEvents) {
72+
this.page++;
73+
this.loadEvents();
5374
}
54-
const nameMatches = event.name.toLowerCase().includes(searchTerm);
55-
const descriptionMatches =
56-
event.description && event.description.toLowerCase().includes(searchTerm);
57-
return nameMatches || descriptionMatches;
58-
}
59-
60-
_filterComplete(event) {
61-
switch (this.filter) {
62-
case 'all':
63-
return true;
64-
case 'active':
65-
return !event.complete;
66-
case 'complete':
67-
return event.complete;
75+
}
76+
77+
previousPage() {
78+
if (this.page > 0) {
79+
this.page--;
80+
this.loadEvents();
6881
}
6982
}
7083

7184
reset() {
7285
this.page = 0;
7386
this.eventSearch = '';
87+
this.filter = 'active';
88+
this.loadEvents();
7489
}
7590

7691
newEvent() {

web-app/admin/src/ng1/admin/events/events.html

Lines changed: 22 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -9,53 +9,27 @@
99
<div class="row">
1010
<div class="col-md-3">
1111
<ul class="nav nav-pills nav-stacked">
12-
<li
13-
ng-click="$ctrl.page = 0; $ctrl.filter='active'"
14-
ng-class="{active: $ctrl.filter=='active'}"
15-
>
16-
<a href="javascript:void(0);"
17-
>Active
18-
<span class="badge pull-right"
19-
>{{($ctrl.filteredEvents | filter:{complete:
20-
'!true'}).length}}</span
21-
></a
22-
>
12+
<li ng-click="$ctrl.filter='active'; $ctrl.handleFilterChange()" ng-class="{active: $ctrl.filter=='active'}">
13+
<a href="javascript:void(0);">Active
14+
<span class="badge pull-right" ng-if="$ctrl.filter=='active'">{{$ctrl.totalEvents}}</span></a>
2315
</li>
24-
<li
25-
ng-click="$ctrl.page = 0; $ctrl.filter='complete'"
26-
ng-class="{active: $ctrl.filter=='complete'}"
27-
>
28-
<a href="javascript:void(0);"
29-
>Complete
30-
<span class="badge pull-right"
31-
>{{($ctrl.filteredEvents | filter:{complete: true}).length}}</span
32-
></a
33-
>
16+
<li ng-click="$ctrl.filter='complete'; $ctrl.handleFilterChange()"
17+
ng-class="{active: $ctrl.filter=='complete'}">
18+
<a href="javascript:void(0);">Complete
19+
<span class="badge pull-right" ng-if="$ctrl.filter=='complete'">{{$ctrl.totalEvents}}</span></a>
3420
</li>
35-
<li
36-
ng-click="$ctrl.page = 0; $ctrl.filter='all'"
37-
ng-class="{active: $ctrl.filter=='all'}"
38-
>
39-
<a href="javascript:void(0);"
40-
>All
41-
<span class="badge pull-right"
42-
>{{$ctrl.filteredEvents.length}}</span
43-
></a
44-
>
21+
<li ng-click="$ctrl.filter='all'; $ctrl.handleFilterChange()" ng-class="{active: $ctrl.filter=='all'}">
22+
<a href="javascript:void(0);">All
23+
<span class="badge pull-right" ng-if="$ctrl.filter=='all'">{{$ctrl.totalEvents}}</span></a>
4524
</li>
4625
</ul>
4726

4827
<hr />
4928
<form class="form">
5029
<div class="top-gap">
5130
<label>Search</label>
52-
<input
53-
type="text"
54-
class="form-control"
55-
placeholder="event name, description"
56-
ng-model="$ctrl.eventSearch"
57-
ng-change="$ctrl.handleSearchChange()"
58-
/>
31+
<input type="text" class="form-control" placeholder="event name, description" ng-model="$ctrl.eventSearch"
32+
ng-change="$ctrl.handleSearchChange()" />
5933
</div>
6034
</form>
6135
<hr />
@@ -73,11 +47,7 @@
7347
</div>
7448

7549
<form class="navbar-form navbar-right" role="search">
76-
<button
77-
type="submit"
78-
class="btn btn-default"
79-
ng-click="$ctrl.newEvent()"
80-
>
50+
<button type="submit" class="btn btn-default" ng-click="$ctrl.newEvent()">
8151
New Event
8252
</button>
8353
</form>
@@ -87,10 +57,7 @@
8757
<div class="row">
8858
<div class="col-md-12">
8959
<div class="admin-table">
90-
<div
91-
class="well-item"
92-
ng-repeat="e in ($ctrl.filteredEvents = ($ctrl.events | filter:$ctrl.filterEvents)) | filter:$ctrl.filterComplete | orderBy:'name' | offset: $ctrl.page*$ctrl.itemsPerPage | limitTo:$ctrl.itemsPerPage"
93-
>
60+
<div class="well-item" ng-repeat="e in $ctrl.events">
9461
<div class="row pointer" ng-click="$ctrl.gotoEvent(e)">
9562
<div class="col-md-8">
9663
<div class="right-gap pull-left">
@@ -100,18 +67,12 @@
10067
<div class="muted">{{e.description}}</div>
10168
</div>
10269
<div class="col-md-4">
103-
<button
104-
class="btn btn-sm btn-danger pull-right admin-user-button"
105-
ng-if="$ctrl.hasDeletePermission(e)"
106-
ng-click="$ctrl.deleteEvent($event, e)"
107-
>
70+
<button class="btn btn-sm btn-danger pull-right admin-user-button"
71+
ng-if="$ctrl.hasDeletePermission(e)" ng-click="$ctrl.deleteEvent($event, e)">
10872
Delete
10973
</button>
110-
<button
111-
class="btn btn-sm btn-default pull-right"
112-
ng-if="$ctrl.hasUpdatePermission(e)"
113-
ng-click="$ctrl.editEvent($event, e)"
114-
>
74+
<button class="btn btn-sm btn-default pull-right" ng-if="$ctrl.hasUpdatePermission(e)"
75+
ng-click="$ctrl.editEvent($event, e)">
11576
Edit
11677
</button>
11778
</div>
@@ -122,20 +83,10 @@
12283
<div class="col-md-12">
12384
<ul class="pager pull-right">
12485
<li ng-class="{'disabled': $ctrl.page == 0}">
125-
<a
126-
href="javascript:void(0);"
127-
ng-click="$ctrl.page == 0 || ($ctrl.page=$ctrl.page-1)"
128-
>&larr; Previous</a
129-
>
86+
<a href="javascript:void(0);" ng-click="$ctrl.previousPage()">&larr; Previous</a>
13087
</li>
131-
<li
132-
ng-class="{'disabled': $ctrl.page >= ($ctrl.filteredEvents.length/$ctrl.itemsPerPage) - 1}"
133-
>
134-
<a
135-
href="javascript:void(0);"
136-
ng-click="$ctrl.page >= ($ctrl.filteredEvents.length/$ctrl.itemsPerPage) - 1 || ($ctrl.page=$ctrl.page+1)"
137-
>Next&rarr;</a
138-
>
88+
<li ng-class="{'disabled': ($ctrl.page + 1) * $ctrl.itemsPerPage >= $ctrl.totalEvents}">
89+
<a href="javascript:void(0);" ng-click="$ctrl.nextPage()">Next&rarr;</a>
13990
</li>
14091
</ul>
14192
</div>
@@ -144,4 +95,4 @@
14495
</div>
14596
</div>
14697
</div>
147-
</div>
98+
</div>

web-app/admin/src/ng1/factories/event.resource.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function Event($rootScope, $resource) {
22
const Event = $resource('/api/events/:id', {
33
id: '@id'
4-
},{
4+
}, {
55
get: {
66
method: 'GET',
77
responseType: 'json'
@@ -22,6 +22,11 @@ function Event($rootScope, $resource) {
2222
isArray: true,
2323
responseType: 'json'
2424
},
25+
queryWithPagination: {
26+
method: 'GET',
27+
responseType: 'json',
28+
isArray: false
29+
},
2530
count: {
2631
method: 'GET',
2732
url: '/api/events/count',
@@ -101,7 +106,7 @@ function Event($rootScope, $resource) {
101106
}
102107
});
103108

104-
Event.prototype.$save = function(success, error) {
109+
Event.prototype.$save = function (success, error) {
105110
if (this.id) {
106111
this.$update(success, error);
107112
} else {
@@ -118,7 +123,7 @@ function EventAccess($resource) {
118123
const EventAccess = $resource('/api/events/:eventId/acl', {
119124
eventId: '@eventId',
120125
userId: '@userId'
121-
},{
126+
}, {
122127
update: {
123128
method: 'PUT',
124129
headers: {

web-app/src/app/event/event.service.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class EventService {
5757
private locationService: LocationService,
5858
private observationService: ObservationService,
5959
private localStorageService: LocalStorageService
60-
) {}
60+
) { }
6161

6262
init() {
6363
this.filterService.addListener(this);
@@ -82,7 +82,19 @@ export class EventService {
8282

8383
query(options?: any): Observable<any> {
8484
options = options || {};
85-
return this.httpClient.get<any>("/api/events/", options);
85+
let params = new HttpParams();
86+
87+
for (const key of Object.keys(options)) {
88+
if (options[key] !== undefined && options[key] !== null) {
89+
params = params.set(key, String(options[key]));
90+
}
91+
}
92+
93+
if (!options.limit && !options.page_size) {
94+
params = params.set('limit', '100');
95+
}
96+
97+
return this.httpClient.get<any>("/api/events/", { params });
8698
}
8799

88100
addFeed(eventId: string, feed: any): Observable<any> {
@@ -541,7 +553,7 @@ export class EventService {
541553
map(res => res.items)
542554
);
543555
}
544-
556+
545557

546558
isUserInEvent(user, event): boolean {
547559
if (!event) return false;

0 commit comments

Comments
 (0)