Skip to content

Commit

Permalink
feat: delete multiple users from table toolbar
Browse files Browse the repository at this point in the history
  • Loading branch information
pyphilia committed May 27, 2020
1 parent 46a6557 commit fc4a626
Show file tree
Hide file tree
Showing 21 changed files with 321 additions and 184 deletions.
6 changes: 3 additions & 3 deletions public/app/config/channels.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ module.exports = {
EDIT_CLASSROOM_CHANNEL: 'classroom:edit',
GET_CLASSROOM_CHANNEL: 'classroom:get',
ADD_USER_IN_CLASSROOM_CHANNEL: 'classroom:user:add',
DELETE_USER_IN_CLASSROOM_CHANNEL: 'classroom:user:delete',
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL:
DELETE_USERS_IN_CLASSROOM_CHANNEL: 'classroom:user:delete',
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL:
'prompt:classroom:user:delete:show',
RESPOND_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL:
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL:
'prompt:classroom:user:delete:respond',
EDIT_USER_IN_CLASSROOM_CHANNEL: 'classroom:user:edit',
};
2 changes: 2 additions & 0 deletions public/app/config/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const ERROR_DUPLICATE_CLASSROOM_NAME = 'ERROR_DUPLICATE_CLASSROOM_NAME';
const ERROR_ACCESS_DENIED_CLASSROOM = 'ERROR_ACCESS_DENIED_CLASSROOM';
const ERROR_DUPLICATE_USERNAME_IN_CLASSROOM =
'ERROR_DUPLICATE_USERNAME_IN_CLASSROOM';
const ERROR_NO_USER_TO_DELETE = 'ERROR_NO_USER_TO_DELETE';

module.exports = {
ERROR_ZIP_CORRUPTED,
Expand All @@ -20,4 +21,5 @@ module.exports = {
ERROR_DUPLICATE_CLASSROOM_NAME,
ERROR_ACCESS_DENIED_CLASSROOM,
ERROR_DUPLICATE_USERNAME_IN_CLASSROOM,
ERROR_NO_USER_TO_DELETE,
};
6 changes: 4 additions & 2 deletions public/app/config/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,10 @@ const ERROR_EDITING_USER_IN_CLASSROOM_MESSAGE =
'There was an error editing a user in this classroom';
const SUCCESS_EDITING_USER_IN_CLASSROOM_MESSAGE =
'The user was successfully edited';
const SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE =
const SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE =
'The user was successfully deleted';
const ERROR_INVALID_USERNAME_MESSAGE = 'This username is invalid';
const ERROR_NO_USER_TO_DELETE_MESSAGE = 'There is no user to delete';

module.exports = {
ERROR_GETTING_DEVELOPER_MODE,
Expand Down Expand Up @@ -159,7 +160,8 @@ module.exports = {
ERROR_ADDING_USER_IN_CLASSROOM_MESSAGE,
ERROR_DELETING_USER_IN_CLASSROOM_MESSAGE,
ERROR_EDITING_USER_IN_CLASSROOM_MESSAGE,
SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE,
SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE,
SUCCESS_EDITING_USER_IN_CLASSROOM_MESSAGE,
ERROR_INVALID_USERNAME_MESSAGE,
ERROR_NO_USER_TO_DELETE_MESSAGE,
};
30 changes: 0 additions & 30 deletions public/app/listeners/deleteUserInClassroom.js

This file was deleted.

41 changes: 41 additions & 0 deletions public/app/listeners/deleteUsersInClassroom.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const { USERS_COLLECTION, CLASSROOMS_COLLECTION } = require('../db');
const { DELETE_USERS_IN_CLASSROOM_CHANNEL } = require('../config/channels');
const { ERROR_GENERAL, ERROR_NO_USER_TO_DELETE } = require('../config/errors');

const logger = require('../logger');

const deleteUsersInClassroom = (mainWindow, db) => async (
event,
{ users = [], classroomId }
) => {
logger.debug('deleting a user in a classroom');

if (!users.length) {
logger.error('no user to delete');
return mainWindow.webContents.send(
DELETE_USERS_IN_CLASSROOM_CHANNEL,
ERROR_NO_USER_TO_DELETE
);
}

try {
const usersInClassroom = db
.get(CLASSROOMS_COLLECTION)
.find({ id: classroomId })
.get(USERS_COLLECTION);

users.forEach(({ id }) => {
usersInClassroom.remove({ id }).write();
});

return mainWindow.webContents.send(DELETE_USERS_IN_CLASSROOM_CHANNEL);
} catch (err) {
logger.error(err);
return mainWindow.webContents.send(
DELETE_USERS_IN_CLASSROOM_CHANNEL,
ERROR_GENERAL
);
}
};

module.exports = deleteUsersInClassroom;
8 changes: 4 additions & 4 deletions public/app/listeners/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ const getClassrooms = require('./getClassrooms');
const deleteClassroom = require('./deleteClassroom');
const editClassroom = require('./editClassroom');
const showDeleteClassroomPrompt = require('./showDeleteClassroomPrompt');
const showDeleteUserInClassroomPrompt = require('./showDeleteUserInClassroomPrompt');
const showDeleteUsersInClassroomPrompt = require('./showDeleteUsersInClassroomPrompt');
const getClassroom = require('./getClassroom');
const addUserInClassroom = require('./addUserInClassroom');
const deleteUserInClassroom = require('./deleteUserInClassroom');
const deleteUsersInClassroom = require('./deleteUsersInClassroom');
const editUserInClassroom = require('./editUserInClassroom');

module.exports = {
Expand Down Expand Up @@ -90,7 +90,7 @@ module.exports = {
getClassroom,
showDeleteClassroomPrompt,
addUserInClassroom,
deleteUserInClassroom,
showDeleteUserInClassroomPrompt,
deleteUsersInClassroom,
showDeleteUsersInClassroomPrompt,
editUserInClassroom,
};
27 changes: 0 additions & 27 deletions public/app/listeners/showDeleteUserInClassroomPrompt.js

This file was deleted.

43 changes: 43 additions & 0 deletions public/app/listeners/showDeleteUsersInClassroomPrompt.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// eslint-disable-next-line import/no-extraneous-dependencies
const { dialog } = require('electron');
const {
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
} = require('../config/channels');
const logger = require('../logger');
const { ERROR_NO_USER_TO_DELETE } = require('../config/errors');

const showDeleteUsersInClassroomPrompt = mainWindow => (
event,
{ users = [] }
) => {
logger.debug('showing delete user in classroom prompt');

if (!users.length) {
logger.error('no user to delete');
mainWindow.webContents.send(
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
ERROR_NO_USER_TO_DELETE
);
} else {
const usernamesString = users
.map(({ username }) => `- ${username}`)
.join('\n');

const options = {
type: 'warning',
buttons: ['Cancel', 'Delete'],
defaultId: 0,
cancelId: 0,
message: `Are you sure you want to delete the following users:\n\n${usernamesString}\n\nfrom this classroom?`,
};

dialog.showMessageBox(mainWindow, options).then(({ response }) => {
mainWindow.webContents.send(
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
response
);
});
}
};

module.exports = showDeleteUsersInClassroomPrompt;
16 changes: 8 additions & 8 deletions public/electron.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ const {
EDIT_CLASSROOM_CHANNEL,
GET_CLASSROOM_CHANNEL,
ADD_USER_IN_CLASSROOM_CHANNEL,
DELETE_USER_IN_CLASSROOM_CHANNEL,
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
DELETE_USERS_IN_CLASSROOM_CHANNEL,
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
EDIT_USER_IN_CLASSROOM_CHANNEL,
} = require('./app/config/channels');
const env = require('./env.json');
Expand Down Expand Up @@ -115,8 +115,8 @@ const {
editClassroom,
getClassroom,
addUserInClassroom,
showDeleteUserInClassroomPrompt,
deleteUserInClassroom,
showDeleteUsersInClassroomPrompt,
deleteUsersInClassroom,
editUserInClassroom,
} = require('./app/listeners');
const isMac = require('./app/utils/isMac');
Expand Down Expand Up @@ -514,14 +514,14 @@ app.on('ready', async () => {

// prompt when deleting a user in a classroom
ipcMain.on(
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
showDeleteUserInClassroomPrompt(mainWindow, db)
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
showDeleteUsersInClassroomPrompt(mainWindow, db)
);

// called when deleting a user in a classroom
ipcMain.on(
DELETE_USER_IN_CLASSROOM_CHANNEL,
deleteUserInClassroom(mainWindow, db)
DELETE_USERS_IN_CLASSROOM_CHANNEL,
deleteUsersInClassroom(mainWindow, db)
);

// prompt when deleting a classroom
Expand Down
61 changes: 40 additions & 21 deletions src/actions/classroom.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ import {
GET_CLASSROOM_SUCCEEDED,
FLAG_ADDING_USER_IN_CLASSROOM,
FLAG_EDITING_USER_IN_CLASSROOM,
FLAG_DELETING_USER_IN_CLASSROOM,
FLAG_DELETING_USERS_IN_CLASSROOM,
} from '../types';
import {
ERROR_GENERAL,
ERROR_DUPLICATE_CLASSROOM_NAME,
ERROR_DUPLICATE_USERNAME_IN_CLASSROOM,
ERROR_NO_USER_TO_DELETE,
} from '../config/errors';
import {
ADD_CLASSROOM_CHANNEL,
Expand All @@ -26,9 +27,9 @@ import {
GET_CLASSROOM_CHANNEL,
EDIT_CLASSROOM_CHANNEL,
ADD_USER_IN_CLASSROOM_CHANNEL,
DELETE_USER_IN_CLASSROOM_CHANNEL,
SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
RESPOND_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
DELETE_USERS_IN_CLASSROOM_CHANNEL,
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
EDIT_USER_IN_CLASSROOM_CHANNEL,
} from '../config/channels';
import {
Expand All @@ -47,7 +48,8 @@ import {
ERROR_DELETING_USER_IN_CLASSROOM_MESSAGE,
ERROR_EDITING_USER_IN_CLASSROOM_MESSAGE,
SUCCESS_EDITING_USER_IN_CLASSROOM_MESSAGE,
SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE,
SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE,
ERROR_NO_USER_TO_DELETE_MESSAGE,
} from '../config/messages';
import { createFlag } from './common';

Expand All @@ -58,7 +60,9 @@ const flagDeletingClassroom = createFlag(FLAG_DELETING_CLASSROOM);
const flagEditingClassroom = createFlag(FLAG_EDITING_CLASSROOM);
const flagEditingUserInClassroom = createFlag(FLAG_EDITING_USER_IN_CLASSROOM);
const flagAddingUserInClassroom = createFlag(FLAG_ADDING_USER_IN_CLASSROOM);
const flagDeletingUserInClassroom = createFlag(FLAG_DELETING_USER_IN_CLASSROOM);
const flagDeletingUsersInClassroom = createFlag(
FLAG_DELETING_USERS_IN_CLASSROOM
);

export const getClassrooms = () => dispatch => {
dispatch(flagGettingClassrooms(true));
Expand Down Expand Up @@ -224,41 +228,56 @@ export const addUserInClassroom = payload => dispatch => {
});
};

export const deleteUserInClassroom = payload => dispatch => {
export const deleteUsersInClassroom = payload => dispatch => {
// show confirmation prompt
window.ipcRenderer.send(SHOW_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL);
window.ipcRenderer.send(
SHOW_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
payload
);
window.ipcRenderer.once(
RESPOND_DELETE_USER_IN_CLASSROOM_PROMPT_CHANNEL,
RESPOND_DELETE_USERS_IN_CLASSROOM_PROMPT_CHANNEL,
(event, response) => {
if (response === ERROR_NO_USER_TO_DELETE) {
toastr.error(ERROR_MESSAGE_HEADER, ERROR_NO_USER_TO_DELETE_MESSAGE);
}
// accept deletion
if (response === 1) {
dispatch(flagDeletingUserInClassroom(true));
window.ipcRenderer.send(DELETE_USER_IN_CLASSROOM_CHANNEL, payload);
dispatch(flagDeletingUsersInClassroom(true));
window.ipcRenderer.send(DELETE_USERS_IN_CLASSROOM_CHANNEL, payload);
}
}
);
window.ipcRenderer.once(
DELETE_USER_IN_CLASSROOM_CHANNEL,
(event, response) => {
if (response === ERROR_GENERAL) {
window.ipcRenderer.once(DELETE_USERS_IN_CLASSROOM_CHANNEL, (e, response) => {
switch (response) {
case ERROR_NO_USER_TO_DELETE: {
toastr.error(ERROR_MESSAGE_HEADER, ERROR_NO_USER_TO_DELETE_MESSAGE);
break;
}
case ERROR_GENERAL: {
toastr.error(
ERROR_MESSAGE_HEADER,
ERROR_DELETING_USER_IN_CLASSROOM_MESSAGE
);
} else {
break;
}
default: {
// update current classroom
dispatch(
getClassroom({ id: payload.classroomId, userId: payload.teacherId })
getClassroom({
id: payload.classroomId,
userId: payload.teacherId,
})
);

toastr.success(
SUCCESS_MESSAGE_HEADER,
SUCCESS_DELETING_USER_IN_CLASSROOM_MESSAGE
SUCCESS_DELETING_USERS_IN_CLASSROOM_MESSAGE
);
}

dispatch(flagDeletingUserInClassroom(false));
}
);

dispatch(flagDeletingUsersInClassroom(false));
});
};

export const editUserInClassroom = payload => dispatch => {
Expand Down
Loading

0 comments on commit fc4a626

Please sign in to comment.