Skip to content

Commit 0a26c90

Browse files
committed
feat: ember table for admin users/view/events
1 parent 4c6aa2d commit 0a26c90

File tree

9 files changed

+229
-165
lines changed

9 files changed

+229
-165
lines changed
Lines changed: 116 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,121 @@
11
import Controller from '@ember/controller';
2+
import { computed, action } from '@ember/object';
3+
import EmberTableControllerMixin from 'open-event-frontend/mixins/ember-table-controller';
4+
import { or } from '@ember/object/computed';
25

3-
export default Controller.extend({
4-
columns: [
5-
{
6-
propertyName : 'name',
7-
template : 'components/ui-table/cell/cell-event',
8-
title : 'Name'
9-
},
10-
{
11-
propertyName : 'startsAt',
12-
template : 'components/ui-table/cell/cell-event-date',
13-
dateFormat : 'MMMM DD, YYYY - HH:mm A',
14-
title : 'Date And Time'
15-
},
16-
{
17-
propertyName : 'sessionsByState',
18-
template : 'components/ui-table/cell/cell-sessions',
19-
title : 'Sessions',
20-
disableSorting : true,
21-
disableFiltering : true
22-
},
23-
{
24-
propertyName : 'eventStatisticsGeneral.speakers',
25-
template : 'components/ui-table/cell/cell-speakers-dashboard',
26-
title : 'Speakers',
27-
disableSorting : true,
28-
disableFiltering : true
29-
},
30-
{
31-
propertyName : 'tickets',
32-
template : 'components/ui-table/cell/cell-tickets',
33-
title : 'Tickets',
34-
disableSorting : true,
35-
disableFiltering : true
36-
},
37-
{
38-
propertyName : 'url',
39-
template : 'components/ui-table/cell/cell-link',
40-
title : 'Public URL',
41-
disableSorting : true,
42-
disableFiltering : true
43-
},
44-
{
45-
template : 'components/ui-table/cell/cell-buttons',
46-
title : 'Actions',
47-
disableSorting : true,
48-
disableFiltering : true
49-
}
50-
],
51-
actions: {
52-
moveToDetails(id) {
53-
this.transitionToRoute('events.view', id);
54-
},
55-
editEvent(id) {
56-
this.transitionToRoute('events.view.edit.basic-details', id);
57-
},
58-
openDeleteEventModal(id, name) {
59-
this.set('isEventDeleteModalOpen', true);
60-
this.set('confirmName', '');
61-
this.set('eventName', name);
62-
this.set('eventId', id);
63-
},
64-
deleteEvent() {
65-
this.set('isLoading', true);
66-
this.store.findRecord('event', this.eventId, { backgroundReload: false }).then(function(event) {
67-
event.destroyRecord();
68-
})
69-
.then(() => {
70-
this.notify.success(this.l10n.t('Event has been deleted successfully.'));
71-
})
72-
.catch(() => {
73-
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
74-
})
75-
.finally(() => {
76-
this.set('isLoading', false);
77-
});
78-
this.set('isEventDeleteModalOpen', false);
6+
export default class extends Controller.extend(EmberTableControllerMixin) {
7+
8+
@or('authManager.currentUser.isSuperAdmin', 'authManager.currentUser.isAdmin') hasRestorePrivileges;
9+
10+
@computed()
11+
get columns() {
12+
return [
13+
{
14+
name : 'Name',
15+
valuePath : 'id',
16+
extraValuePaths : ['logoUrl', 'name', 'identifier', 'deletedAt'],
17+
isSortable : true,
18+
headerComponent : 'tables/headers/sort',
19+
cellComponent : 'ui-table/cell/cell-event',
20+
options : {
21+
hasRestorePrivileges: this.hasRestorePrivileges
22+
},
23+
actions: {
24+
moveToDetails : this.moveToDetails.bind(this),
25+
editEvent : this.editEvent.bind(this),
26+
openDeleteEventModal : this.openDeleteEventModal.bind(this),
27+
deleteEvent : this.deleteEvent.bind(this),
28+
restoreEvent : this.restoreEvent.bind(this)
29+
}
30+
},
31+
{
32+
name : 'Date',
33+
valuePath : 'startsAt',
34+
extraValuePaths : ['endsAt'],
35+
isSortable : true,
36+
headerComponent : 'tables/headers/sort',
37+
cellComponent : 'ui-table/cell/cell-event-date'
38+
39+
},
40+
{
41+
name : 'Sessions',
42+
valuePath : 'eventStatisticsGeneral',
43+
width : 80,
44+
isSortable : false,
45+
cellComponent : 'ui-table/cell/cell-sessions-dashboard'
46+
},
47+
{
48+
name : 'Speakers',
49+
valuePath : 'eventStatisticsGeneral',
50+
cellComponent : 'ui-table/cell/cell-speakers-dashboard',
51+
isSortable : false
52+
53+
},
54+
{
55+
name : 'Tickets',
56+
valuePath : 'tickets',
57+
cellComponent : 'ui-table/cell/cell-tickets',
58+
isSortable : false
59+
60+
},
61+
{
62+
name : 'Public URL',
63+
valuePath : 'url',
64+
cellComponent : 'ui-table/cell/cell-link',
65+
isSortable : false
66+
}
67+
];
68+
}
69+
70+
@action
71+
moveToDetails(id) {
72+
this.transitionToRoute('events.view', id);
73+
}
74+
75+
@action
76+
editEvent(id) {
77+
this.transitionToRoute('events.view.edit.basic-details', id);
78+
}
79+
80+
@action
81+
openDeleteEventModal(id, name) {
82+
this.setProperties({
83+
isEventDeleteModalOpen : true,
84+
confirmName : '',
85+
eventName : name,
86+
eventId : id
87+
});
88+
}
89+
90+
@action
91+
async deleteEvent() {
92+
this.set('isLoading', true);
93+
94+
try {
95+
const event = this.store.peekRecord('event', this.eventId, { backgroundReload: false });
96+
await event.destroyRecord();
97+
this.notify.success(this.l10n.t('Event has been deleted successfully.'));
98+
} catch (e) {
99+
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
79100
}
101+
this.setProperties({
102+
isLoading : false,
103+
isEventDeleteModalOpen : false
104+
});
80105
}
81-
});
82106

107+
@action
108+
async restoreEvent(event_id) {
109+
this.set('isLoading', true);
110+
try {
111+
let event = this.store.peekRecord('event', event_id, { backgroundReload: false });
112+
event.set('deletedAt', null);
113+
await event.save({ adapterOptions: { getTrashed: true } });
114+
this.notify.success(this.l10n.t('Event has been restored successfully.'));
115+
} catch (e) {
116+
console.warn(e);
117+
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
118+
}
119+
this.set('isLoading', false);
120+
}
121+
}
Lines changed: 76 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,46 @@
11
import Route from '@ember/routing/route';
2-
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
32
import moment from 'moment';
3+
import EmberTableRouteMixin from 'open-event-frontend/mixins/ember-table-route';
44

5-
export default Route.extend(AuthenticatedRouteMixin, {
6-
titleToken() {
7-
switch (this.get('params.event_status')) {
8-
case 'live':
9-
return this.l10n.t('Live');
10-
case 'draft':
11-
return this.l10n.t('Draft');
12-
case 'past':
13-
return this.l10n.t('Past');
14-
}
15-
},
16-
async model(params) {
17-
this.set('params', params);
5+
export default class extends Route.extend(EmberTableRouteMixin) {
186

7+
async model(params) {
198
let filterOptions = [];
9+
const searchField = 'name';
2010
if (params.event_status === 'live') {
2111
filterOptions = [
2212
{
23-
name : 'state',
24-
op : 'eq',
25-
val : 'published'
26-
},
27-
{
28-
or: [
13+
and: [
2914
{
30-
name : 'starts-at',
31-
op : 'ge',
32-
val : moment().toISOString()
15+
name : 'deleted-at',
16+
op : 'eq',
17+
val : null
18+
},
19+
{
20+
name : 'state',
21+
op : 'eq',
22+
val : 'published'
3323
},
3424
{
35-
and: [
25+
or: [
3626
{
3727
name : 'starts-at',
38-
op : 'le',
28+
op : 'ge',
3929
val : moment().toISOString()
4030
},
4131
{
42-
name : 'ends-at',
43-
op : 'gt',
44-
val : moment().toISOString()
32+
and: [
33+
{
34+
name : 'starts-at',
35+
op : 'le',
36+
val : moment().toISOString()
37+
},
38+
{
39+
name : 'ends-at',
40+
op : 'gt',
41+
val : moment().toISOString()
42+
}
43+
]
4544
}
4645
]
4746
}
@@ -51,42 +50,62 @@ export default Route.extend(AuthenticatedRouteMixin, {
5150
} else if (params.event_status === 'past') {
5251
filterOptions = [
5352
{
54-
name : 'ends-at',
55-
op : 'lt',
56-
val : moment().toISOString()
57-
},
53+
and: [
54+
{
55+
name : 'deleted-at',
56+
op : 'eq',
57+
val : null
58+
},
59+
{
60+
name : 'ends-at',
61+
op : 'lt',
62+
val : moment().toISOString()
63+
},
64+
{
65+
name : 'state',
66+
op : 'eq',
67+
val : 'published'
68+
}
69+
]
70+
}
71+
];
72+
} else if (params.event_status === 'draft') {
73+
filterOptions = [
5874
{
59-
name : 'state',
60-
op : 'eq',
61-
val : 'published'
75+
and:
76+
[
77+
{
78+
name : 'deleted-at',
79+
op : 'eq',
80+
val : null
81+
},
82+
{
83+
name : 'state',
84+
op : 'eq',
85+
val : 'draft'
86+
}
87+
]
88+
6289
}
6390
];
64-
} else {
91+
} else if (params.event_status === 'deleted') {
6592
filterOptions = [
6693
{
67-
name : 'state',
68-
op : 'eq',
69-
val : 'draft'
94+
name : 'deleted-at',
95+
op : 'ne',
96+
val : null
7097
}
7198
];
7299
}
73-
74-
let queryObject = {
75-
include : 'tickets,sessions,speakers',
76-
filter : filterOptions,
77-
'page[size]' : 10
78-
};
79-
80-
const store = this.modelFor('admin.users.view');
81-
82-
const data = await store.query('events', queryObject);
83-
84-
return {
85-
data,
86-
store,
87-
query : queryObject,
88-
objectType : 'events'
100+
filterOptions = this.applySearchFilters(filterOptions, params, searchField);
101+
let queryString = {
102+
get_trashed : true,
103+
include : 'tickets,sessions,speakers',
104+
filter : filterOptions,
105+
'page[size]' : params.per_page || 10,
106+
'page[number]' : params.page || 1
89107
};
90-
108+
queryString = this.applySortFilters(queryString, params);
109+
return this.asArray(this.modelFor('admin.users.view').query('events', queryString));
91110
}
92-
});
111+
}

app/templates/admin/users/view/events.hbs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
{{#link-to 'admin.users.view.events.list' 'past' class='item'}}
1212
{{t 'Past'}}
1313
{{/link-to}}
14+
{{#link-to 'admin.users.view.events.list' 'deleted' class='item'}}
15+
{{t 'Deleted'}}
16+
{{/link-to}}
1417
{{/tabbed-navigation}}
1518
</div>
1619
</div>

0 commit comments

Comments
 (0)