Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add task request UI #402

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c880138
feat: Add task request UI
TanishqSingla Jul 13, 2023
3131595
feat: Add api integration for task requests
TanishqSingla Jul 14, 2023
d4a413c
fix: task request card description
TanishqSingla Jul 15, 2023
6731825
fix: Review comments
TanishqSingla Jul 15, 2023
db44f8d
feat: Add task request details page
TanishqSingla Jul 15, 2023
24caf85
fix: task request title skeleton
TanishqSingla Jul 15, 2023
0ff42db
fix: console statements and variable names
TanishqSingla Jul 15, 2023
b8d4b35
feat: Add approve api call to button
TanishqSingla Jul 15, 2023
b7e5759
fix: Review comments
TanishqSingla Jul 15, 2023
8d33633
fix: use console.error instead of console.log for catch
TanishqSingla Jul 15, 2023
162a208
Merge branch 'develop' into feat/task-request
sahsisunny Jul 20, 2023
158638c
Merge branch 'feat/task-request' into feat/task-request-details
sahsisunny Jul 27, 2023
8388200
fix: review comments
TanishqSingla Jul 30, 2023
c08ca24
fix: review comments
TanishqSingla Jul 30, 2023
566adfa
Merge branch 'develop' into feat/task-request
sahsisunny Aug 1, 2023
d8bc362
Merge branch 'develop' into feat/task-request
prakashchoudhary07 Aug 5, 2023
e015ed4
Merge pull request #404 from Real-Dev-Squad/feat/task-request-details
iamitprakash Aug 5, 2023
11777bc
Revert "feat: Add task request details page"
Pratiyushkumar Aug 6, 2023
28a4a33
Merge pull request #444 from Real-Dev-Squad/revert-404-feat/task-requ…
iamitprakash Aug 6, 2023
884f7a8
Merge branch 'develop' into feat/task-request
Achintya-Chatterjee Aug 11, 2023
8c12b2d
Merge branch 'develop' into feat/task-request
RitikJaiswal75 Aug 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added taskRequests/assets/RDSLogo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions taskRequests/constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const taskRequestStatus = {
WAITING: 'WAITING',
APPROVED: 'APPROVED',
};

const ErrorMessages = {
UNAUTHENTICATED:
'You are unauthenticated to view this section, please login!',
UNAUTHORIZED: 'You are unauthrozed to view this section',
NOT_FOUND: 'Task Requests not found',
SERVER_ERROR: 'Unexpected error occurred',
};
48 changes: 48 additions & 0 deletions taskRequests/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" href="/images/index.ico" type="image/x-icon" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@100;400;700;800&display=swap"
rel="stylesheet"
/>

<title>Task Requests | Real Dev Squad</title>
<link rel="stylesheet" href="./style.css" />
<script src="/helpers/loadENV.js"></script>
<script src="./constants.js"></script>
<script src="./script.js" defer></script>
</head>

<body>
<div class="header">
<div class="header__contents">
<img src="./assets/RDSLogo.png" alt="RDS logo" height="48" width="48" />
<a href="/index.html" class="header__contents__navlink">Home</a>
</div>
</div>
<div class="container">
<h1 class="container__title">Task Request</h1>
<div class="container__body">
<div class="container__body__loader hidden">Loading...</div>
<div class="container__filters hidden">
<select
id="status"
defaultValue=""
class="container__filters__status"
>
<option value="">All</option>
<option value="WAITING">Waiting</option>
<option value="APPROVED">Approved</option>
</select>
</div>
<div id="task-request-container" class="taskRequest"></div>
</div>
</div>
</body>
</html>
188 changes: 188 additions & 0 deletions taskRequests/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
const API_BASE_URL = window.API_BASE_URL;
const taskRequestContainer = document.getElementById('task-request-container');
const containerBody = document.querySelector('.container__body');
const filterContainer = document.querySelector('.container__filters');

const fetchedTaskRequests = [];

const loader = document.querySelector('.container__body__loader');
const startLoading = () => loader.classList.remove('hidden');
const stopLoading = () => loader.classList.add('hidden');

function createCustomElement(domObjectMap) {
const el = document.createElement(domObjectMap.tagName);
for (const [key, value] of Object.entries(domObjectMap)) {
if (key === 'tagName') {
continue;
}
if (key === 'eventListeners') {
value.forEach((obj) => {
el.addEventListener(obj.event, obj.func);
});
}
if (key === 'class') {
if (Array.isArray(value)) {
el.classList.add(...value);
} else {
el.classList.add(value);
}
} else if (key === 'child') {
el.append(...value);
} else {
el[key] = value;
}
}
return el;
}

async function getTaskRequests() {
startLoading();
try {
const res = await fetch(`${API_BASE_URL}/taskRequests`);

Pratiyushkumar marked this conversation as resolved.
Show resolved Hide resolved
if (res.ok) {
const data = await res.json();
fetchedTaskRequests.push(...data.data);
return;
}

if (res.status === 401) {
showMessage('ERROR', ErrorMessages.UNAUTHENTICATED);
return;
}

if (res.status === 403) {
showMessage('ERROR', ErrorMessages.UNAUTHORIZED);
return;
}

if (res.status === 404) {
showMessage('ERROR', ErrorMessages.NOT_FOUND);
return;
}

showMessage('ERROR', ErrorMessages.SERVER_ERROR);
Pratiyushkumar marked this conversation as resolved.
Show resolved Hide resolved
} catch (e) {
console.log(e);
Pratiyushkumar marked this conversation as resolved.
Show resolved Hide resolved
Pratiyushkumar marked this conversation as resolved.
Show resolved Hide resolved
} finally {
stopLoading();
}
}

function showMessage(type, message) {
const p = document.createElement('p');
const classes = ['taskRequest__message'];
if (type === 'ERROR') {
classes.push('taskRequest__message--error');
}
p.classList.add(...classes);
p.textContent = message;
containerBody.innerHTML = '';
containerBody.appendChild(p);
}

function getAvatar(user) {
if (user.user?.picture?.url) {
return createCustomElement({
tagName: 'img',
src: user.user?.picture?.url,
});
}
return createCustomElement({
tagName: 'span',
textContent: user.user.first_name[0],
});
}
function getRemainingCount(requestors) {
if (requestors.length > 3) {
return createCustomElement({
tagName: 'span',
textContent: `+${requestors.length - 3}`,
});
}
}

function openTaskDetails(id) {
window.location.href = new URL(`/taskRequest/details?id=${id}`, API_BASE_URL);
}

function createTaskRequestCard({ id, task, requestors, status }) {
const card = createCustomElement({
tagName: 'div',
class: 'taskRequest__card',
eventListeners: [{ event: 'click', func: (e) => openTaskDetails(id, e) }],
child: [
createCustomElement({
tagName: 'div',
class: 'taskRequest__card__header',
child: [
createCustomElement({
tagName: 'h3',
class: 'taskRequest__card__header__title',
textContent: task.title,
}),
createCustomElement({
tagName: 'div',
class: [
'taskRequest__card__header__status',
`taskRequest__card__header__status--${status.toLowerCase()}`,
],
title: status.toLowerCase(),
}),
],
}),
createCustomElement({
tagName: 'div',
class: 'taskRequest__card__body',
child: [
createCustomElement({
tagName: 'p',
textContent: task.purpose,
}),
],
}),
createCustomElement({
tagName: 'div',
class: 'taskRequest__card__footer',
child: [
createCustomElement({
tagName: 'p',
textContent: 'Requested By',
}),
createCustomElement({
tagName: 'div',
class: 'taskRequest__card__footer__requestor',
child: [
...requestors.map((requestor, index) => {
if (index < 3) {
return createCustomElement({
tagName: 'div',
class: 'taskRequest__card__footer__requestor__avatar',
title: requestor.user.first_name,
child: [getAvatar(requestor)],
});
}
}),
getRemainingCount(requestors) || '',
],
}),
],
}),
],
});
return card;
}

function renderTaskRequestCards(taskRequests) {
if (taskRequests.length > 0) {
filterContainer.classList.remove('hidden');
taskRequests.forEach((taskRequest) => {
taskRequestContainer.appendChild(createTaskRequestCard(taskRequest));
});
}
}

(async () => {
await getTaskRequests();
renderTaskRequestCards(fetchedTaskRequests);
})();
Loading
Loading