Skip to content

Commit 9a5b868

Browse files
committed
feat: Ember table for Admin users
1 parent 9d05db6 commit 9a5b868

File tree

11 files changed

+242
-164
lines changed

11 files changed

+242
-164
lines changed

app/controllers/admin/users/list.js

Lines changed: 121 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,126 @@
11
import Controller from '@ember/controller';
2-
import { computed } from '@ember/object';
3-
4-
export default Controller.extend({
5-
hasRestorePrivileges: computed('authManager.currentUser.isAdmin', function() {
6-
return this.get('authManager.currentUser.isSuperAdmin') || this.get('authManager.currentUser.isAdmin');
7-
}),
8-
columns: [
9-
{
10-
propertyName : 'first-name',
11-
title : 'Name',
12-
template : 'components/ui-table/cell/admin/users/cell-first-name',
13-
disableSorting : true,
14-
disableFiltering : true
15-
},
16-
{
17-
propertyName : 'email',
18-
title : 'Email',
19-
disableSorting : true,
20-
disableFiltering : true
21-
},
22-
{
23-
propertyName : 'status',
24-
title : 'Status',
25-
template : 'components/ui-table/cell/admin/users/cell-status',
26-
disableSorting : true,
27-
disableFiltering : true
28-
},
29-
{
30-
propertyName : 'system-roles',
31-
title : 'System Roles',
32-
template : 'components/ui-table/cell/admin/users/cell-system-roles',
33-
disableSorting : true,
34-
disableFiltering : true
35-
},
36-
{
37-
propertyName : 'event-roles',
38-
title : 'Event Roles',
39-
template : 'components/ui-table/cell/admin/users/cell-event-roles',
40-
disableSorting : true,
41-
disableFiltering : true
42-
},
43-
{
44-
propertyName : 'user-links',
45-
title : 'User Links',
46-
template : 'components/ui-table/cell/admin/users/cell-user-links',
47-
disableSorting : true,
48-
disableFiltering : true
49-
},
50-
{
51-
propertyName : 'created-at',
52-
title : 'Member Since',
53-
template : 'components/ui-table/cell/admin/users/cell-created-at'
54-
},
55-
{
56-
propertyName : 'lastAccessedAt',
57-
title : 'Last Accessed',
58-
template : 'components/ui-table/cell/cell-simple-date',
59-
dateFormat : 'MMMM DD, YYYY - hh:mm A',
60-
disableSorting : true,
61-
disableFiltering : true
62-
},
63-
{
64-
template : 'components/ui-table/cell/admin/users/cell-actions',
65-
title : 'Actions',
66-
disableSorting : true,
67-
disableFiltering : 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+
@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 : ['firstName', 'deletedAt'],
17+
cellComponent : 'ui-table/cell/admin/users/cell-first-name',
18+
options : {
19+
hasRestorePrivileges: this.hasRestorePrivileges
20+
},
21+
actions: {
22+
moveToUserDetails : this.moveToUserDetails.bind(this),
23+
deleteUser : this.deleteUser.bind(this),
24+
openEditModal : this.openEditModal.bind(this),
25+
restoreUser : this.restoreUser.bind(this)
26+
}
27+
28+
},
29+
{
30+
name : 'Email',
31+
valuePath : 'email'
32+
33+
34+
},
35+
{
36+
name : 'Status',
37+
valuePath : 'status',
38+
cellComponent : 'ui-table/cell/admin/users/cell-status'
39+
40+
41+
},
42+
{
43+
name : 'System Roles',
44+
valuePath : 'isSuperAdmin',
45+
extraValuePaths : ['isAdmin', 'isVerified'],
46+
cellComponent : 'ui-table/cell/admin/users/cell-system-roles'
47+
48+
49+
},
50+
{
51+
name : 'Event Roles',
52+
valuePath : 'isSuperAdmin',
53+
extraValuePaths : ['isAdmin', 'isUserOwner', 'ownerEvents',
54+
'isUserOrganizer', 'organizerEvents', 'isUserCoorganizer', 'coorganizerEvents',
55+
'isUserTrackOrganizer', 'trackOrganizerEvents', 'isUserRegistrar', 'registrarEvents',
56+
'isUserModerator', 'moderatorEvents', 'isMarketer', 'marketerEvents', 'isSalesAdmin',
57+
'salesAdminEvents'],
58+
cellComponent: 'ui-table/cell/admin/users/cell-event-roles'
59+
60+
61+
},
62+
{
63+
name : 'User Links',
64+
valuePath : 'id',
65+
cellComponent : 'ui-table/cell/admin/users/cell-user-links'
66+
67+
68+
},
69+
{
70+
name : 'Member Since',
71+
valuePath : 'createdAt',
72+
cellComponent : 'ui-table/cell/admin/users/cell-created-at'
73+
},
74+
{
75+
name : 'Last Accessed',
76+
valuePath : 'lastAccessedAt',
77+
cellComponent : 'ui-table/cell/cell-simple-date',
78+
options : {
79+
dateFormat: 'MMMM DD, YYYY - hh:mm A'
80+
}
81+
}
82+
];
83+
}
84+
85+
@action
86+
moveToUserDetails(id) {
87+
this.transitionToRoute('admin.users.view', id);
88+
}
89+
@action
90+
async deleteUser(user_id) {
91+
this.set('isLoading', true);
92+
try {
93+
let user = this.store.peekRecord('user', user_id, { backgroundReload: false });
94+
await user.destroyRecord();
95+
this.notify.success(this.l10n.t('User has been deleted successfully.'));
96+
97+
} catch (e) {
98+
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
6899
}
69-
],
70-
actions: {
71-
moveToUserDetails(id) {
72-
this.transitionToRoute('admin.users.view', id);
73-
},
74-
deleteUser(user) {
75-
this.set('isLoading', true);
76-
user.destroyRecord()
77-
.then(() => {
78-
this.notify.success(this.l10n.t('User has been deleted successfully.'));
79-
})
80-
.catch(() => {
81-
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
82-
})
83-
.finally(() => {
84-
this.set('isLoading', false);
85-
});
86-
},
87-
openEditModal(user) {
88-
this.set('isEditUserModalOpen', true);
89-
this.set('data', user);
90-
},
91-
restoreUser(user) {
92-
this.set('isLoading', true);
100+
this.set('isLoading', false);
101+
}
102+
103+
@action
104+
openEditModal(user_id) {
105+
let user = this.store.peekRecord('user', user_id, { backgroundReload: false });
106+
this.setProperties({
107+
isEditUserModalOpen : true,
108+
data : user
109+
});
110+
}
111+
112+
@action
113+
async restoreUser(user_id) {
114+
this.set('isLoading', true);
115+
try {
116+
let user = this.store.peekRecord('user', user_id, { backgroundReload: false });
93117
user.set('deletedAt', null);
94-
user.save({ adapterOptions: { getTrashed: true } })
95-
.then(() => {
96-
this.notify.success(this.l10n.t('User has been restored successfully.'));
97-
this.send('refreshRoute');
98-
})
99-
.catch(e => {
100-
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
101-
console.warn(e);
102-
})
103-
.finally(() => {
104-
this.set('isLoading', false);
105-
});
118+
user.save({ adapterOptions: { getTrashed: true } });
119+
this.notify.success(this.l10n.t('User has been restored successfully.'));
120+
} catch (e) {
121+
this.notify.error(this.l10n.t('An unexpected error has occurred.'));
122+
console.warn(e);
106123
}
124+
this.set('isLoading', false);
107125
}
108-
});
126+
}

app/mixins/ember-table-route.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,23 @@ export default Mixin.create({
4343
delete query.sort;
4444
}
4545
return query;
46+
},
47+
48+
/**
49+
* Convert the given ArrayProxy or Promise<ArrayProxy> to a native Array.
50+
*
51+
* @param promise
52+
* @return {Promise<Array>}
53+
*/
54+
async asArray(promise) {
55+
const resolved = await promise;
56+
if (resolved.toArray) {
57+
return {
58+
data : resolved.toArray(),
59+
meta : resolved.meta
60+
};
61+
}
62+
return resolved;
4663
}
4764

4865

app/routes/admin/users/list.js

Lines changed: 28 additions & 17 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.users_status')) {
710
case 'active':
@@ -11,17 +14,20 @@ export default Route.extend({
1114
case 'inactive':
1215
return this.l10n.t('Inactive');
1316
}
14-
},
17+
}
18+
1519
beforeModel(transition) {
16-
this._super(...arguments);
20+
super.beforeModel(...arguments);
1721
const userState = transition.to.params.users_status;
1822
if (!['all', 'deleted', 'active', 'inactive'].includes(userState)) {
1923
this.replaceWith('admin.users.view', userState);
2024
}
21-
},
22-
model(params) {
25+
}
26+
27+
async model(params) {
2328
this.set('params', params);
2429
let filterOptions = [];
30+
const searchField = 'firstName';
2531
if (params.users_status === 'active') {
2632
filterOptions = [
2733
{
@@ -74,16 +80,21 @@ export default Route.extend({
7480
}
7581
];
7682
}
77-
return this.store.query('user', {
78-
include : 'events',
79-
get_trashed : true,
80-
filter : filterOptions,
81-
'page[size]' : 10
82-
});
83-
},
84-
actions: {
85-
refreshRoute() {
86-
this.refresh();
87-
}
83+
filterOptions = this.applySearchFilters(filterOptions, params, searchField);
84+
85+
let queryString = {
86+
include : 'events',
87+
get_trashed : true,
88+
filter : filterOptions,
89+
'page[size]' : params.per_page || 10,
90+
'page[number]' : params.page || 1
91+
};
92+
93+
queryString = this.applySortFilters(queryString, params);
94+
return this.asArray(this.store.query('user', queryString));
95+
}
96+
@action
97+
refreshRoute() {
98+
this.refresh();
8899
}
89-
});
100+
}

app/templates/admin/users/list.hbs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
<div class="sixteen wide column">
2-
{{events/events-table columns=columns
3-
data=model
4-
useNumericPagination=true
5-
showGlobalFilter=true
6-
showPageSize=true
7-
moveToUserDetails=(action 'moveToUserDetails')
8-
deleteUser=(action 'deleteUser')
9-
openEditModal=(action 'openEditModal')
10-
restoreUser = (action 'restoreUser')
11-
customGlobalFilter='first-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
</div>
1516
{{modals/edit-user-modal isOpen=isEditUserModalOpen data=data}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<span>
2-
{{moment-from-now record.createdAt}}
2+
{{moment-from-now record}}
33
</span>

0 commit comments

Comments
 (0)