From 1997125d01b689245fae3f7cd90b866598579186 Mon Sep 17 00:00:00 2001 From: RishiChaubey31 Date: Sat, 3 May 2025 15:59:39 +0530 Subject: [PATCH 01/18] initial commit for ER button --- src/app/services/api.ts | 1 + src/app/services/tasksApi.ts | 40 +++ src/components/Form/ExtensionRequestForm.tsx | 181 +++++++++++ src/components/Form/Form.module.scss | 92 ++++++ src/components/Modal/ExtensionStatusModal.tsx | 300 ++++++++++++++++++ src/components/Modal/modal.module.scss | 126 ++++++++ src/components/tasks/card/card.module.scss | 41 ++- src/components/tasks/card/index.tsx | 59 ++-- src/interfaces/task.type.ts | 36 +++ 9 files changed, 854 insertions(+), 22 deletions(-) create mode 100644 src/components/Form/ExtensionRequestForm.tsx create mode 100644 src/components/Form/Form.module.scss create mode 100644 src/components/Modal/ExtensionStatusModal.tsx diff --git a/src/app/services/api.ts b/src/app/services/api.ts index 661812310..b8cb919b6 100644 --- a/src/app/services/api.ts +++ b/src/app/services/api.ts @@ -27,6 +27,7 @@ export const api = createApi({ 'Progress_Details', 'User_Standup', 'TASK_REQUEST', + 'Extension_Requests', ], /** * This api has endpoints injected in adjacent files, diff --git a/src/app/services/tasksApi.ts b/src/app/services/tasksApi.ts index 029c463db..0491157ad 100644 --- a/src/app/services/tasksApi.ts +++ b/src/app/services/tasksApi.ts @@ -2,6 +2,10 @@ import task, { TaskRequestPayload, TasksResponseType, GetAllTaskParamType, + ExtensionRequest, + ExtensionRequestsResponse, + ExtensionRequestCreatePayload, + ExtensionRequestCreateResponse, } from '@/interfaces/task.type'; import { api } from './api'; import { MINE_TASKS_URL, TASKS_URL } from '@/constants/url'; @@ -100,6 +104,40 @@ export const tasksApi = api.injectEndpoints({ }, ], }), + getSelfExtensionRequests: builder.query< + ExtensionRequestsResponse, + { taskId: string; dev: boolean } + >({ + query: ({ taskId, dev }) => ({ + url: '/extension-requests/self', + params: { + taskId, + dev, + }, + }), + providesTags: ['Extension_Requests'], + }), + + createExtensionRequest: builder.mutation< + ExtensionRequestCreateResponse, + ExtensionRequestCreatePayload & { dev?: boolean } + >({ + query: (payload) => ({ + url: '/extension-requests', + method: 'POST', + params: { dev: payload.dev ?? true }, + body: { + assignee: payload.assignee, + newEndsOn: payload.newEndsOn, + oldEndsOn: payload.oldEndsOn, + reason: payload.reason, + status: payload.status, + taskId: payload.taskId, + title: payload.title, + }, + }), + invalidatesTags: ['Extension_Requests'], + }), }), overrideExisting: true, }); @@ -110,4 +148,6 @@ export const { useAddTaskMutation, useUpdateTaskMutation, useUpdateSelfTaskMutation, + useGetSelfExtensionRequestsQuery, + useCreateExtensionRequestMutation, } = tasksApi; diff --git a/src/components/Form/ExtensionRequestForm.tsx b/src/components/Form/ExtensionRequestForm.tsx new file mode 100644 index 000000000..1bb482e63 --- /dev/null +++ b/src/components/Form/ExtensionRequestForm.tsx @@ -0,0 +1,181 @@ +import React, { useState, useEffect } from 'react'; +import styles from './Form.module.scss'; +import { useCreateExtensionRequestMutation } from 'src/app/services/tasksApi'; + +interface ExtensionRequestFormProps { + isOpen: boolean; + onClose: () => void; + taskId: string; + assignee: string; + oldEndsOn: number | null; +} + +interface FormData { + reason: string; + newEndsOn: number; + title: string; +} + +export const ExtensionRequestForm: React.FC = ({ + isOpen, + onClose, + taskId, + assignee, + oldEndsOn, +}) => { + const [formData, setFormData] = useState({ + reason: '', + newEndsOn: new Date().getTime(), + title: '', + }); + + const [createExtensionRequest, { isLoading }] = + useCreateExtensionRequestMutation(); + + useEffect(() => { + if (isOpen) { + const defaultNewEndsOn = oldEndsOn + ? oldEndsOn + 3 * 24 * 60 * 60 * 1000 + : new Date().getTime(); + setFormData((prev) => ({ ...prev, newEndsOn: defaultNewEndsOn })); + } + }, [isOpen, oldEndsOn]); + + const handleChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; + + if (name === 'newEndsOn') { + const timestamp = new Date(value).getTime(); + setFormData((prev) => ({ ...prev, [name]: timestamp })); + } else { + setFormData((prev) => ({ ...prev, [name]: value })); + } + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + const submissionOldEndsOn = oldEndsOn || new Date().getTime(); + + try { + console.log('Sending data:', { + ...formData, + taskId, + oldEndsOn: submissionOldEndsOn, + }); + + await createExtensionRequest({ + assignee: assignee, + newEndsOn: formData.newEndsOn, + oldEndsOn: submissionOldEndsOn, + reason: formData.reason, + status: 'PENDING', + taskId, + title: formData.title, + dev: true, + }).unwrap(); + + onClose(); + } catch (error) { + console.error('Failed to create extension request:', error); + } + }; + + if (!isOpen) return null; + + const oldEndsOnDate = oldEndsOn + ? new Date(oldEndsOn).toLocaleDateString('en-US', { + month: 'numeric', + day: 'numeric', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: true, + }) + : 'Not available'; + + const formatDateForInput = (timestamp: number) => + new Date(timestamp).toISOString().slice(0, 16); + + return ( +
+
+

Extension Request Form

+ +
+
+ +