Skip to content

Commit 16cd7ca

Browse files
committed
feat: Ember-table for admin-events
1 parent 2e6625a commit 16cd7ca

File tree

12 files changed

+256
-176
lines changed

12 files changed

+256
-176
lines changed

app/controllers/admin/events/list.js

Lines changed: 163 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,169 @@
11
import Controller from '@ember/controller';
2-
import { computed } from '@ember/object';
3-
export default Controller.extend({
4-
hasRestorePrivileges: computed('authManager.currentUser.isAdmin', function() {
5-
return this.get('authManager.currentUser.isSuperAdmin') || this.get('authManager.currentUser.isAdmin');
6-
}),
7-
columns: [
8-
{
9-
propertyName : 'name',
10-
template : 'components/ui-table/cell/cell-event',
11-
title : 'Name'
12-
},
13-
{
14-
propertyName : 'startsAt',
15-
template : 'components/ui-table/cell/cell-simple-date',
16-
dateFormat : 'MMMM DD, YYYY - hh:mm A',
17-
title : 'Starts At'
18-
},
19-
{
20-
propertyName : 'endsAt',
21-
template : 'components/ui-table/cell/cell-simple-date',
22-
dateFormat : 'MMMM DD, YYYY - hh:mm A',
23-
title : 'Ends At'
24-
},
25-
{
26-
propertyName : 'state',
27-
template : 'components/ui-table/cell/cell-event-state',
28-
title : 'State'
29-
},
30-
{
31-
propertyName : 'roles',
32-
template : 'components/ui-table/cell/cell-roles',
33-
title : 'Roles',
34-
disableSorting : true
35-
},
36-
{
37-
propertyName : 'eventStatisticsGeneral.sessions',
38-
template : 'components/ui-table/cell/cell-sessions',
39-
title : 'Sessions',
40-
disableSorting : true
41-
},
42-
{
43-
propertyName : 'eventStatisticsGeneral.speakers',
44-
template : 'components/ui-table/cell/cell-speakers-dashboard',
45-
title : 'Speakers',
46-
disableSorting : true
47-
},
48-
{
49-
propertyName : 'tickets',
50-
template : 'components/ui-table/cell/cell-tickets',
51-
title : 'Tickets',
52-
disableSorting : true
53-
},
54-
{
55-
propertyName : 'url',
56-
template : 'components/ui-table/cell/cell-link',
57-
title : 'Public URL',
58-
disableSorting : true
59-
},
60-
{
61-
propertyName : 'is-featured',
62-
template : 'components/ui-table/cell/admin/event-is-featured',
63-
title : 'Featured Event',
64-
disableSorting : false
65-
},
66-
{
67-
propertyName : 'deletedAt',
68-
template : 'components/ui-table/cell/cell-buttons',
69-
title : 'Actions',
70-
disableSorting : true
2+
import { computed, action } from '@ember/object';
3+
import { or } from '@ember/object/computed';
4+
import EmberTableControllerMixin from 'open-event-frontend/mixins/ember-table-controller';
5+
6+
7+
export default class extends Controller.extend(EmberTableControllerMixin) {
8+
9+
@or('authManager.currentUser.isSuperAdmin', 'authManager.currentUser.isAdmin') hasRestorePrivileges;
10+
11+
@computed()
12+
get columns() {
13+
return [
14+
{
15+
name : 'Name',
16+
valuePath : 'id',
17+
extraValuePaths : ['logoUrl', 'identifier', 'deletedAt', 'name'],
18+
isSortable : true,
19+
headerComponent : 'tables/headers/sort',
20+
cellComponent : 'ui-table/cell/cell-event',
21+
options : {
22+
hasRestorePrivileges: this.hasRestorePrivileges
23+
},
24+
actions: {
25+
moveToDetails : this.moveToDetails.bind(this),
26+
editEvent : this.editEvent.bind(this),
27+
openDeleteEventModal : this.openDeleteEventModal.bind(this),
28+
deleteEvent : this.deleteEvent.bind(this),
29+
restoreEvent : this.restoreEvent.bind(this)
30+
}
31+
},
32+
{
33+
name : 'Starts At',
34+
valuePath : 'startsAt',
35+
isSortable : true,
36+
headerComponent : 'tables/headers/sort',
37+
cellComponent : 'ui-table/cell/cell-simple-date',
38+
width : 40,
39+
options : {
40+
dateFormat: 'MMMM DD, YYYY - hh:mm A'
41+
}
42+
},
43+
{
44+
name : 'Ends At',
45+
valuePath : 'endsAt',
46+
isSortable : true,
47+
headerComponent : 'tables/headers/sort',
48+
cellComponent : 'ui-table/cell/cell-simple-date',
49+
width : 40,
50+
options : {
51+
dateFormat: 'MMMM DD, YYYY - hh:mm A'
52+
}
53+
},
54+
{
55+
name : 'State',
56+
valuePath : 'state',
57+
isSortable : true,
58+
headerComponent : 'tables/headers/sort',
59+
width : 50
60+
},
61+
{
62+
name : 'Roles',
63+
valuePath : 'owner',
64+
extraValuePaths : ['organizers', 'coorganizers', 'trackOrganizers', 'registrars', 'moderators'],
65+
cellComponent : 'ui-table/cell/cell-roles'
66+
},
67+
{
68+
name : 'Sessions',
69+
valuePath : 'eventStatisticsGeneral',
70+
cellComponent : 'ui-table/cell/cell-sessions',
71+
width : 60
72+
73+
},
74+
{
75+
name : 'Speakers',
76+
valuePath : 'eventStatisticsGeneral',
77+
cellComponent : 'ui-table/cell/cell-speakers-dashboard',
78+
width : 60
79+
},
80+
{
81+
name : 'Tickets',
82+
valuePath : 'tickets',
83+
cellComponent : 'ui-table/cell/cell-tickets'
84+
},
85+
{
86+
name : 'Public URL',
87+
valuePath : 'url',
88+
cellComponent : 'ui-table/cell/cell-link'
89+
},
90+
{
91+
name : 'Featured Event',
92+
valuePath : 'id',
93+
extraValuePaths : ['isFeatured'],
94+
cellComponent : 'ui-table/cell/admin/event-is-featured',
95+
width : 40,
96+
actions : {
97+
toggleFeatured: this.toggleFeatured.bind(this)
98+
}
99+
}
100+
];
101+
}
102+
103+
@action
104+
moveToDetails(id) {
105+
this.transitionToRoute('events.view', id);
106+
}
107+
108+
@action
109+
editEvent(id) {
110+
this.transitionToRoute('events.view.edit.basic-details', id);
111+
}
112+
113+
@action
114+
openDeleteEventModal(id, name) {
115+
this.setProperties({
116+
isEventDeleteModalOpen : true,
117+
confirmName : '',
118+
eventName : name,
119+
eventId : id
120+
});
121+
}
122+
123+
@action
124+
async deleteEvent() {
125+
this.set('isLoading', true);
126+
try {
127+
let event = this.store.peekRecord('event', this.eventId, { backgroundReload: false });
128+
await event.destroyRecord();
129+
this.notify.success(this.l10n.t('Event has been deleted successfully.'));
130+
} catch (e) {
131+
console.warn(e);
132+
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
71133
}
72-
],
73-
actions: {
74-
moveToDetails(id) {
75-
this.transitionToRoute('events.view', id);
76-
},
77-
editEvent(id) {
78-
this.transitionToRoute('events.view.edit.basic-details', id);
79-
},
80-
openDeleteEventModal(id, name) {
81-
this.set('isEventDeleteModalOpen', true);
82-
this.set('confirmName', '');
83-
this.set('eventName', name);
84-
this.set('eventId', id);
85-
},
86-
deleteEvent() {
87-
this.set('isLoading', true);
88-
this.store.findRecord('event', this.eventId, { backgroundReload: false }).then(function(event) {
89-
event.destroyRecord();
90-
})
91-
.then(() => {
92-
this.set('isLoading', false);
93-
this.notify.success(this.l10n.t('Event has been deleted successfully.'));
94-
this.send('refreshRoute');
95-
})
96-
.catch(() => {
97-
this.set('isLoading', false);
98-
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
99-
});
100-
this.set('isEventDeleteModalOpen', false);
101-
},
102-
restoreEvent(event) {
103-
this.set('isLoading', true);
134+
this.setProperties({
135+
isLoading : false,
136+
isEventDeleteModalOpen : false
137+
});
138+
}
139+
@action
140+
async restoreEvent(event_id) {
141+
this.set('isLoading', true);
142+
try {
143+
let event = this.store.peekRecord('event', event_id, { backgroundReload: false });
104144
event.set('deletedAt', null);
105-
event.save({ adapterOptions: { getTrashed: true } })
106-
.then(() => {
107-
this.notify.success(this.l10n.t('Event has been restored successfully.'));
108-
this.send('refreshRoute');
109-
})
110-
.catch(e => {
111-
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
112-
console.warn(e);
113-
})
114-
.finally(() => {
115-
this.set('isLoading', false);
116-
});
117-
},
118-
toggleFeatured(event) {
145+
await event.save({ adapterOptions: { getTrashed: true } });
146+
this.notify.success(this.l10n.t('Event has been restored successfully.'));
147+
} catch (e) {
148+
console.warn(e);
149+
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
150+
}
151+
this.set('isLoading', false);
152+
}
153+
154+
@action
155+
async toggleFeatured(event_id) {
156+
this.set('isLoading', true);
157+
try {
158+
let event = this.store.peekRecord('event', event_id, { backgroundReload: false });
119159
event.toggleProperty('isFeatured');
120-
event.save()
121-
.then(() => {
122-
this.notify.success(this.l10n.t('Event details modified successfully'));
123-
})
124-
.catch(() => {
125-
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
126-
});
160+
await event.save();
161+
this.notify.success(this.l10n.t('Event details modified successfully'));
162+
163+
} catch (e) {
164+
console.warn(e);
165+
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
127166
}
167+
this.set('isLoading', false);
128168
}
129-
});
169+
}

app/routes/admin/events/list.js

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import Route from '@ember/routing/route';
2+
import { action } from '@ember/object';
3+
import EmberTableRouteMixin from 'open-event-frontend/mixins/ember-table-route';
24
import moment from 'moment';
35

4-
export default Route.extend({
6+
export default class extends Route.extend(EmberTableRouteMixin) {
7+
58
titleToken() {
69
switch (this.get('params.events_status')) {
710
case 'live':
@@ -13,10 +16,13 @@ export default Route.extend({
1316
case 'deleted':
1417
return this.l10n.t('Deleted');
1518
}
16-
},
17-
model(params) {
19+
}
20+
21+
22+
async model(params) {
1823
this.set('params', params);
1924
let filterOptions = [];
25+
const searchField = 'name';
2026
if (params.events_status === 'live') {
2127
filterOptions = [
2228
{
@@ -110,17 +116,21 @@ export default Route.extend({
110116
filterOptions = [];
111117
}
112118

113-
return this.store.query('event', {
114-
get_trashed : true,
115-
include : 'tickets,sessions,speakers,owner,organizers,coorganizers,track-organizers,registrars,moderators',
116-
filter : filterOptions,
117-
'page[size]' : 10
118-
});
119-
},
119+
filterOptions = this.applySearchFilters(filterOptions, params, searchField);
120120

121-
actions: {
122-
refreshRoute() {
123-
this.refresh();
124-
}
121+
let queryString = {
122+
get_trashed : true,
123+
include : 'tickets,sessions,speakers,owner,organizers,coorganizers,track-organizers,registrars,moderators',
124+
filter : filterOptions,
125+
'page[size]' : params.per_page || 10,
126+
'page[number]' : params.page || 1
127+
};
128+
queryString = this.applySortFilters(queryString, params);
129+
return this.asArray(this.store.query('event', queryString));
130+
}
131+
132+
@action
133+
refreshRoute() {
134+
this.refresh();
125135
}
126-
});
136+
}

app/templates/admin/events/list.hbs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
<div class="sixteen column wide">
2-
{{events/events-table columns=columns data=model
3-
useNumericPagination=true
4-
showGlobalFilter=true
5-
showPageSize=true
6-
moveToDetails=(action 'moveToDetails')
7-
editEvent=(action 'editEvent')
8-
openDeleteEventModal=(action 'openDeleteEventModal')
9-
restoreEvent = (action 'restoreEvent')
10-
toggleFeatured=(action 'toggleFeatured')
11-
customGlobalFilter='name'
12-
hasRestorePrivileges=hasRestorePrivileges
2+
{{tables/default columns=columns
3+
rows=model.data
4+
currentPage=page
5+
pageSize=per_page
6+
searchQuery=search
7+
sortBy=sort_by
8+
sortDir=sort_dir
9+
metaData=model.meta
10+
filterOptions=filterOptions
11+
widthConstraint="eq-container"
12+
resizeMode="fluid"
13+
fillMode="equal-column"
1314
}}
1415
{{modals/event-delete-modal isLoading=isLoading isOpen=isEventDeleteModalOpen confirmName=confirmName eventName=eventName deleteEvent=(action 'deleteEvent')}}
1516
</div>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{ui-checkbox class='toggle' checked=record.isFeatured onChange=(action toggleFeatured record)}}
1+
{{ui-checkbox class='toggle' checked=extraRecords.isFeatured onChange=(action props.actions.toggleFeatured record)}}

0 commit comments

Comments
 (0)