Skip to content

Commit fc4a626

Browse files
committed
feat: delete multiple users from table toolbar
1 parent 46a6557 commit fc4a626

21 files changed

+321
-184
lines changed

public/app/config/channels.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ module.exports = {
6060
EDIT_CLASSROOM_CHANNEL: 'classroom:edit',
6161
GET_CLASSROOM_CHANNEL: 'classroom:get',
6262
ADD_USER_IN_CLASSROOM_CHANNEL: 'classroom:user:add',
63-
DELETE_USER_IN_CLASSROOM_CHANNEL: 'classroom:user:delete',
64-
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL:
63+
DELETE_USERS_IN_CLASSROOM_CHANNEL: 'classroom:user:delete',
64+
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL:
6565
'prompt:classroom:user:delete:show',
66-
RESPOND_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL:
66+
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL:
6767
'prompt:classroom:user:delete:respond',
6868
EDIT_USER_IN_CLASSROOM_CHANNEL: 'classroom:user:edit',
6969
};

public/app/config/errors.js

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const ERROR_DUPLICATE_CLASSROOM_NAME = 'ERROR_DUPLICATE_CLASSROOM_NAME';
1010
const ERROR_ACCESS_DENIED_CLASSROOM = 'ERROR_ACCESS_DENIED_CLASSROOM';
1111
const ERROR_DUPLICATE_USERNAME_IN_CLASSROOM =
1212
'ERROR_DUPLICATE_USERNAME_IN_CLASSROOM';
13+
const ERROR_NO_USER_TO_DELETE = 'ERROR_NO_USER_TO_DELETE';
1314

1415
module.exports = {
1516
ERROR_ZIP_CORRUPTED,
@@ -20,4 +21,5 @@ module.exports = {
2021
ERROR_DUPLICATE_CLASSROOM_NAME,
2122
ERROR_ACCESS_DENIED_CLASSROOM,
2223
ERROR_DUPLICATE_USERNAME_IN_CLASSROOM,
24+
ERROR_NO_USER_TO_DELETE,
2325
};

public/app/config/messages.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,10 @@ const ERROR_EDITING_USER_IN_CLASSROOM_MESSAGE =
9393
'There was an error editing a user in this classroom';
9494
const SUCCESS_EDITING_USER_IN_CLASSROOM_MESSAGE =
9595
'The user was successfully edited';
96-
const SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE =
96+
const SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE =
9797
'The user was successfully deleted';
9898
const ERROR_INVALID_USERNAME_MESSAGE = 'This username is invalid';
99+
const ERROR_NO_USER_TO_DELETE_MESSAGE = 'There is no user to delete';
99100

100101
module.exports = {
101102
ERROR_GETTING_DEVELOPER_MODE,
@@ -159,7 +160,8 @@ module.exports = {
159160
ERROR_ADDING_USER_IN_CLASSROOM_MESSAGE,
160161
ERROR_DELETING_USER_IN_CLASSROOM_MESSAGE,
161162
ERROR_EDITING_USER_IN_CLASSROOM_MESSAGE,
162-
SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE,
163+
SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE,
163164
SUCCESS_EDITING_USER_IN_CLASSROOM_MESSAGE,
164165
ERROR_INVALID_USERNAME_MESSAGE,
166+
ERROR_NO_USER_TO_DELETE_MESSAGE,
165167
};

public/app/listeners/deleteUserInClassroom.js

-30
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
const { USERS_COLLECTION, CLASSROOMS_COLLECTION } = require('../db');
2+
const { DELETE_USERS_IN_CLASSROOM_CHANNEL } = require('../config/channels');
3+
const { ERROR_GENERAL, ERROR_NO_USER_TO_DELETE } = require('../config/errors');
4+
5+
const logger = require('../logger');
6+
7+
const deleteUsersInClassroom = (mainWindow, db) => async (
8+
event,
9+
{ users = [], classroomId }
10+
) => {
11+
logger.debug('deleting a user in a classroom');
12+
13+
if (!users.length) {
14+
logger.error('no user to delete');
15+
return mainWindow.webContents.send(
16+
DELETE_USERS_IN_CLASSROOM_CHANNEL,
17+
ERROR_NO_USER_TO_DELETE
18+
);
19+
}
20+
21+
try {
22+
const usersInClassroom = db
23+
.get(CLASSROOMS_COLLECTION)
24+
.find({ id: classroomId })
25+
.get(USERS_COLLECTION);
26+
27+
users.forEach(({ id }) => {
28+
usersInClassroom.remove({ id }).write();
29+
});
30+
31+
return mainWindow.webContents.send(DELETE_USERS_IN_CLASSROOM_CHANNEL);
32+
} catch (err) {
33+
logger.error(err);
34+
return mainWindow.webContents.send(
35+
DELETE_USERS_IN_CLASSROOM_CHANNEL,
36+
ERROR_GENERAL
37+
);
38+
}
39+
};
40+
41+
module.exports = deleteUsersInClassroom;

public/app/listeners/index.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ const getClassrooms = require('./getClassrooms');
4040
const deleteClassroom = require('./deleteClassroom');
4141
const editClassroom = require('./editClassroom');
4242
const showDeleteClassroomPrompt = require('./showDeleteClassroomPrompt');
43-
const showDeleteUserInClassroomPrompt = require('./showDeleteUserInClassroomPrompt');
43+
const showDeleteUsersInClassroomPrompt = require('./showDeleteUsersInClassroomPrompt');
4444
const getClassroom = require('./getClassroom');
4545
const addUserInClassroom = require('./addUserInClassroom');
46-
const deleteUserInClassroom = require('./deleteUserInClassroom');
46+
const deleteUsersInClassroom = require('./deleteUsersInClassroom');
4747
const editUserInClassroom = require('./editUserInClassroom');
4848

4949
module.exports = {
@@ -90,7 +90,7 @@ module.exports = {
9090
getClassroom,
9191
showDeleteClassroomPrompt,
9292
addUserInClassroom,
93-
deleteUserInClassroom,
94-
showDeleteUserInClassroomPrompt,
93+
deleteUsersInClassroom,
94+
showDeleteUsersInClassroomPrompt,
9595
editUserInClassroom,
9696
};

public/app/listeners/showDeleteUserInClassroomPrompt.js

-27
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// eslint-disable-next-line import/no-extraneous-dependencies
2+
const { dialog } = require('electron');
3+
const {
4+
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
5+
} = require('../config/channels');
6+
const logger = require('../logger');
7+
const { ERROR_NO_USER_TO_DELETE } = require('../config/errors');
8+
9+
const showDeleteUsersInClassroomPrompt = mainWindow => (
10+
event,
11+
{ users = [] }
12+
) => {
13+
logger.debug('showing delete user in classroom prompt');
14+
15+
if (!users.length) {
16+
logger.error('no user to delete');
17+
mainWindow.webContents.send(
18+
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
19+
ERROR_NO_USER_TO_DELETE
20+
);
21+
} else {
22+
const usernamesString = users
23+
.map(({ username }) => `- ${username}`)
24+
.join('\n');
25+
26+
const options = {
27+
type: 'warning',
28+
buttons: ['Cancel', 'Delete'],
29+
defaultId: 0,
30+
cancelId: 0,
31+
message: `Are you sure you want to delete the following users:\n\n${usernamesString}\n\nfrom this classroom?`,
32+
};
33+
34+
dialog.showMessageBox(mainWindow, options).then(({ response }) => {
35+
mainWindow.webContents.send(
36+
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
37+
response
38+
);
39+
});
40+
}
41+
};
42+
43+
module.exports = showDeleteUsersInClassroomPrompt;

public/electron.js

+8-8
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ const {
6767
EDIT_CLASSROOM_CHANNEL,
6868
GET_CLASSROOM_CHANNEL,
6969
ADD_USER_IN_CLASSROOM_CHANNEL,
70-
DELETE_USER_IN_CLASSROOM_CHANNEL,
71-
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
70+
DELETE_USERS_IN_CLASSROOM_CHANNEL,
71+
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
7272
EDIT_USER_IN_CLASSROOM_CHANNEL,
7373
} = require('./app/config/channels');
7474
const env = require('./env.json');
@@ -115,8 +115,8 @@ const {
115115
editClassroom,
116116
getClassroom,
117117
addUserInClassroom,
118-
showDeleteUserInClassroomPrompt,
119-
deleteUserInClassroom,
118+
showDeleteUsersInClassroomPrompt,
119+
deleteUsersInClassroom,
120120
editUserInClassroom,
121121
} = require('./app/listeners');
122122
const isMac = require('./app/utils/isMac');
@@ -514,14 +514,14 @@ app.on('ready', async () => {
514514

515515
// prompt when deleting a user in a classroom
516516
ipcMain.on(
517-
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
518-
showDeleteUserInClassroomPrompt(mainWindow, db)
517+
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
518+
showDeleteUsersInClassroomPrompt(mainWindow, db)
519519
);
520520

521521
// called when deleting a user in a classroom
522522
ipcMain.on(
523-
DELETE_USER_IN_CLASSROOM_CHANNEL,
524-
deleteUserInClassroom(mainWindow, db)
523+
DELETE_USERS_IN_CLASSROOM_CHANNEL,
524+
deleteUsersInClassroom(mainWindow, db)
525525
);
526526

527527
// prompt when deleting a classroom

src/actions/classroom.js

+40-21
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import {
1010
GET_CLASSROOM_SUCCEEDED,
1111
FLAG_ADDING_USER_IN_CLASSROOM,
1212
FLAG_EDITING_USER_IN_CLASSROOM,
13-
FLAG_DELETING_USER_IN_CLASSROOM,
13+
FLAG_DELETING_USERS_IN_CLASSROOM,
1414
} from '../types';
1515
import {
1616
ERROR_GENERAL,
1717
ERROR_DUPLICATE_CLASSROOM_NAME,
1818
ERROR_DUPLICATE_USERNAME_IN_CLASSROOM,
19+
ERROR_NO_USER_TO_DELETE,
1920
} from '../config/errors';
2021
import {
2122
ADD_CLASSROOM_CHANNEL,
@@ -26,9 +27,9 @@ import {
2627
GET_CLASSROOM_CHANNEL,
2728
EDIT_CLASSROOM_CHANNEL,
2829
ADD_USER_IN_CLASSROOM_CHANNEL,
29-
DELETE_USER_IN_CLASSROOM_CHANNEL,
30-
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
31-
RESPOND_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
30+
DELETE_USERS_IN_CLASSROOM_CHANNEL,
31+
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
32+
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
3233
EDIT_USER_IN_CLASSROOM_CHANNEL,
3334
} from '../config/channels';
3435
import {
@@ -47,7 +48,8 @@ import {
4748
ERROR_DELETING_USER_IN_CLASSROOM_MESSAGE,
4849
ERROR_EDITING_USER_IN_CLASSROOM_MESSAGE,
4950
SUCCESS_EDITING_USER_IN_CLASSROOM_MESSAGE,
50-
SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE,
51+
SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE,
52+
ERROR_NO_USER_TO_DELETE_MESSAGE,
5153
} from '../config/messages';
5254
import { createFlag } from './common';
5355

@@ -58,7 +60,9 @@ const flagDeletingClassroom = createFlag(FLAG_DELETING_CLASSROOM);
5860
const flagEditingClassroom = createFlag(FLAG_EDITING_CLASSROOM);
5961
const flagEditingUserInClassroom = createFlag(FLAG_EDITING_USER_IN_CLASSROOM);
6062
const flagAddingUserInClassroom = createFlag(FLAG_ADDING_USER_IN_CLASSROOM);
61-
const flagDeletingUserInClassroom = createFlag(FLAG_DELETING_USER_IN_CLASSROOM);
63+
const flagDeletingUsersInClassroom = createFlag(
64+
FLAG_DELETING_USERS_IN_CLASSROOM
65+
);
6266

6367
export const getClassrooms = () => dispatch => {
6468
dispatch(flagGettingClassrooms(true));
@@ -224,41 +228,56 @@ export const addUserInClassroom = payload => dispatch => {
224228
});
225229
};
226230

227-
export const deleteUserInClassroom = payload => dispatch => {
231+
export const deleteUsersInClassroom = payload => dispatch => {
228232
// show confirmation prompt
229-
window.ipcRenderer.send(SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL);
233+
window.ipcRenderer.send(
234+
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
235+
payload
236+
);
230237
window.ipcRenderer.once(
231-
RESPOND_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
238+
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
232239
(event, response) => {
240+
if (response === ERROR_NO_USER_TO_DELETE) {
241+
toastr.error(ERROR_MESSAGE_HEADER, ERROR_NO_USER_TO_DELETE_MESSAGE);
242+
}
243+
// accept deletion
233244
if (response === 1) {
234-
dispatch(flagDeletingUserInClassroom(true));
235-
window.ipcRenderer.send(DELETE_USER_IN_CLASSROOM_CHANNEL, payload);
245+
dispatch(flagDeletingUsersInClassroom(true));
246+
window.ipcRenderer.send(DELETE_USERS_IN_CLASSROOM_CHANNEL, payload);
236247
}
237248
}
238249
);
239-
window.ipcRenderer.once(
240-
DELETE_USER_IN_CLASSROOM_CHANNEL,
241-
(event, response) => {
242-
if (response === ERROR_GENERAL) {
250+
window.ipcRenderer.once(DELETE_USERS_IN_CLASSROOM_CHANNEL, (e, response) => {
251+
switch (response) {
252+
case ERROR_NO_USER_TO_DELETE: {
253+
toastr.error(ERROR_MESSAGE_HEADER, ERROR_NO_USER_TO_DELETE_MESSAGE);
254+
break;
255+
}
256+
case ERROR_GENERAL: {
243257
toastr.error(
244258
ERROR_MESSAGE_HEADER,
245259
ERROR_DELETING_USER_IN_CLASSROOM_MESSAGE
246260
);
247-
} else {
261+
break;
262+
}
263+
default: {
248264
// update current classroom
249265
dispatch(
250-
getClassroom({ id: payload.classroomId, userId: payload.teacherId })
266+
getClassroom({
267+
id: payload.classroomId,
268+
userId: payload.teacherId,
269+
})
251270
);
252271

253272
toastr.success(
254273
SUCCESS_MESSAGE_HEADER,
255-
SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE
274+
SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE
256275
);
257276
}
258-
259-
dispatch(flagDeletingUserInClassroom(false));
260277
}
261-
);
278+
279+
dispatch(flagDeletingUsersInClassroom(false));
280+
});
262281
};
263282

264283
export const editUserInClassroom = payload => dispatch => {

0 commit comments

Comments
 (0)