Skip to content

Commit 9185479

Browse files
Ishan VeerIshan Veer
authored andcommitted
Merge branch 'develop' of https://github.com/Real-Dev-Squad/website-dashboard into feature/user-data-pagination
2 parents f2920d6 + de2e4aa commit 9185479

File tree

8 files changed

+386
-15
lines changed

8 files changed

+386
-15
lines changed

__tests__/groups/group.test.js

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
const puppeteer = require('puppeteer');
2-
const { allUsersData } = require('../../mock-data/users');
2+
const { allUsersData, superUserData } = require('../../mock-data/users');
33
const { discordGroups, GroupRoleData } = require('../../mock-data/groups');
44

55
const BASE_URL = 'https://api.realdevsquad.com';
66
const PAGE_URL = 'http://localhost:8000';
77

8+
function setSuperUserPermission() {
9+
allUsersData.users[0] = superUserData;
10+
}
11+
12+
function resetUserPermission() {
13+
allUsersData.users[0] = {
14+
...allUsersData.users[0],
15+
roles: { archived: false },
16+
};
17+
}
18+
819
describe('Discord Groups Page', () => {
920
let browser;
1021
let page;
@@ -297,4 +308,66 @@ describe('Discord Groups Page', () => {
297308
const repoLinkStyle = await page.evaluate((el) => el.style, repoLink);
298309
expect(repoLinkStyle).toBeTruthy();
299310
});
311+
312+
test('Should display delete button for super users', async () => {
313+
setSuperUserPermission();
314+
await page.goto(`${PAGE_URL}/groups?dev=true`);
315+
await page.waitForNetworkIdle();
316+
await page.waitForTimeout(1000);
317+
318+
const deleteButtons = await page.$$('.delete-group');
319+
const cards = await page.$$('.card');
320+
expect(deleteButtons.length).toBe(cards.length);
321+
expect(deleteButtons.length).toBeGreaterThan(0);
322+
});
323+
324+
test('Should not display delete button when user is normal user', async () => {
325+
resetUserPermission();
326+
await page.goto(`${PAGE_URL}/groups?dev=true`);
327+
await page.waitForNetworkIdle();
328+
329+
const deleteButtons = await page.$$('.delete-group');
330+
expect(deleteButtons.length).toBe(0);
331+
});
332+
333+
test('Should not display delete button when dev=false', async () => {
334+
setSuperUserPermission();
335+
await page.goto(`${PAGE_URL}/groups`);
336+
await page.waitForNetworkIdle();
337+
338+
const deleteButtons = await page.$$('.delete-group');
339+
expect(deleteButtons.length).toBe(0);
340+
});
341+
342+
test('Should display delete confirmation modal on click of delete button', async () => {
343+
setSuperUserPermission();
344+
await page.goto(`${PAGE_URL}/groups?dev=true`);
345+
await page.waitForNetworkIdle();
346+
await page.waitForTimeout(1000);
347+
348+
const deleteButton = await page.$('.delete-group');
349+
await deleteButton.click();
350+
351+
const deleteConfirmationModal = await page.waitForSelector(
352+
'.delete-confirmation-modal',
353+
);
354+
355+
expect(deleteConfirmationModal).toBeTruthy();
356+
});
357+
358+
test('Should close delete confirmation modal when cancel button is clicked', async () => {
359+
setSuperUserPermission();
360+
await page.goto(`${PAGE_URL}/groups?dev=true`);
361+
await page.waitForNetworkIdle();
362+
await page.waitForTimeout(1000);
363+
364+
const deleteButton = await page.$('.delete-group');
365+
await deleteButton.click();
366+
367+
const cancelButton = await page.waitForSelector('#cancel-delete');
368+
await cancelButton.click();
369+
370+
const modalClosed = await page.$('.delete-confirmation-modal');
371+
expect(modalClosed).toBeFalsy();
372+
});
300373
});

groups/assets/delete.svg

Lines changed: 8 additions & 0 deletions
Loading

groups/createElements.js

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
const createCard = (rawGroup, onClick = () => {}) => {
1+
const createCard = (
2+
rawGroup,
3+
onClick = () => {},
4+
onDelete = () => {},
5+
isSuperUser = false,
6+
) => {
27
const group = {
38
...rawGroup,
49
description:
@@ -10,7 +15,17 @@ const createCard = (rawGroup, onClick = () => {}) => {
1015
cardElement.className = 'card';
1116
cardElement.id = `group-${group.id}`;
1217
cardElement.innerHTML = `
13-
<h5 class="card__title"></h5>
18+
<div class="card__header">
19+
<h5 class="card__title"></h5>
20+
${
21+
isSuperUser
22+
? `
23+
<button class="delete-group">
24+
<img class="delete-group__icon" src="assets/delete.svg" alt="Delete" />
25+
</button>`
26+
: ''
27+
}
28+
</div>
1429
<p class="card__description"></p>
1530
<div class="card__action">
1631
<button class="card__btn button"></button>
@@ -36,6 +51,15 @@ const createCard = (rawGroup, onClick = () => {}) => {
3651
.querySelector('.card__btn')
3752
.addEventListener('click', () => group.isUpdating || onClick());
3853

54+
if (isSuperUser) {
55+
cardElement
56+
.querySelector('.delete-group')
57+
.addEventListener('click', (e) => {
58+
e.stopPropagation();
59+
onDelete(rawGroup.id, rawGroup.roleId);
60+
});
61+
}
62+
3963
return cardElement;
4064
};
4165

@@ -214,6 +238,44 @@ const createGroupCreationModal = (onClose = () => {}, onSubmit = () => {}) => {
214238
return backdropElement;
215239
};
216240

241+
const createDeleteConfirmationModal = (
242+
onClose = () => {},
243+
onConfirm = () => {},
244+
) => {
245+
const backdropElement = document.createElement('div');
246+
backdropElement.className = 'backdrop';
247+
248+
const modalElement = document.createElement('div');
249+
modalElement.className = 'delete-confirmation-modal';
250+
modalElement.innerHTML = `
251+
<div class="delete-modal__header">
252+
<h2 class="delete-modal__title">Confirm Delete</h2>
253+
<button type="button" id="close-button" class="delete-modal__close">
254+
<img src="assets/close.svg" alt="Close" />
255+
</button>
256+
</div>
257+
<div class="delete-modal__content">
258+
<p class="delete-modal__msg"> Are you sure you want to delete this group? </p>
259+
</div>
260+
261+
<div class="delete-modal__buttons">
262+
<button class="delete-modal-button button--secondary" id="cancel-delete">Cancel</button>
263+
<button class="delete-modal-button button--danger" id="confirm-delete">Delete</button>
264+
</div>
265+
`;
266+
267+
modalElement.querySelector('#close-button').onclick = onClose;
268+
modalElement.querySelector('#cancel-delete').onclick = onClose;
269+
modalElement.querySelector('#confirm-delete').onclick = onConfirm;
270+
271+
backdropElement.appendChild(modalElement);
272+
backdropElement.onclick = (e) => {
273+
if (e.target === backdropElement) onClose();
274+
};
275+
276+
return backdropElement;
277+
};
278+
217279
export {
218280
createCard,
219281
createLoadingCard,
@@ -222,4 +284,5 @@ export {
222284
createNavbarProfileLoading,
223285
createNavbarProfileSignin,
224286
createGroupCreationModal,
287+
createDeleteConfirmationModal,
225288
};

groups/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<link rel="stylesheet" href="/groups/style.css" />
1111
<script src="/helpers/loadENV.js"></script>
1212
<script src="/constants.js"></script>
13+
<script src="../utils.js" defer></script>
1314
<script type="module" src="/groups/script.js" defer></script>
1415
<link rel="preconnect" href="https://fonts.googleapis.com" />
1516
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />

groups/render.js

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
createNavbarProfile,
77
createNavbarProfileLoading,
88
createNavbarProfileSignin,
9+
createDeleteConfirmationModal,
910
} from './createElements.js';
1011

1112
const renderNotAuthenticatedPage = () => {
@@ -86,8 +87,13 @@ const removeLoadingCards = () => {
8687
loadingCards.forEach((card) => mainContainer.removeChild(card));
8788
};
8889

89-
const renderGroupById = ({ group, cardOnClick = () => {} }) => {
90-
const card = createCard(group, cardOnClick);
90+
const renderGroupById = ({
91+
group,
92+
cardOnClick = () => {},
93+
onDelete = () => {},
94+
isSuperUser = false,
95+
}) => {
96+
const card = createCard(group, cardOnClick, onDelete, isSuperUser);
9197
const mainContainer = document.querySelector('.group-container');
9298
const groupElement = document.getElementById(`group-${group.id}`);
9399
if (groupElement) {
@@ -105,6 +111,29 @@ const renderNoGroupFound = () => {
105111
mainContainer.append(noGroupContainer);
106112
};
107113

114+
const renderDeleteConfirmationModal = ({
115+
onClose = () => {},
116+
onConfirm = () => {},
117+
}) => {
118+
const container = document.querySelector('body');
119+
const existingBackdrop = document.querySelector('.backdrop');
120+
121+
if (existingBackdrop) {
122+
container.removeChild(existingBackdrop);
123+
}
124+
125+
const modal = createDeleteConfirmationModal(onClose, onConfirm);
126+
container.appendChild(modal);
127+
};
128+
129+
const removeDeleteConfirmationModal = () => {
130+
const container = document.querySelector('body');
131+
const backdrop = document.querySelector('.backdrop');
132+
if (backdrop) {
133+
container.removeChild(backdrop);
134+
}
135+
};
136+
108137
export {
109138
renderNotAuthenticatedPage,
110139
renderGroupCreationModal,
@@ -117,4 +146,6 @@ export {
117146
removeLoadingCards,
118147
renderGroupById,
119148
renderNoGroupFound,
149+
renderDeleteConfirmationModal,
150+
removeDeleteConfirmationModal,
120151
};

0 commit comments

Comments
 (0)