From a0ea24dd67a4764e7b257a1d9903268ec409c626 Mon Sep 17 00:00:00 2001 From: sophia-massie <96220951+sophia-massie@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:50:46 -0600 Subject: [PATCH] task/WP-859-860-861 Admin Extension Listing (#423) --- .../templates/list_admin_extension.html | 3 +- .../templates/view_admin_extension_modal.html | 52 +---- apcd_cms/src/apps/admin_extension/views.py | 2 +- .../EditExtensionModal/EditExtensionModal.tsx | 182 +++++++++++------- .../ViewExtensionModal/ViewExtensionModal.tsx | 125 +++++++----- 5 files changed, 198 insertions(+), 166 deletions(-) diff --git a/apcd_cms/src/apps/admin_extension/templates/list_admin_extension.html b/apcd_cms/src/apps/admin_extension/templates/list_admin_extension.html index 97b7fb49..89ea6620 100644 --- a/apcd_cms/src/apps/admin_extension/templates/list_admin_extension.html +++ b/apcd_cms/src/apps/admin_extension/templates/list_admin_extension.html @@ -5,10 +5,9 @@ -
{% include "nav_cms_breadcrumbs.html" %}
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apcd_cms/src/apps/admin_extension/templates/view_admin_extension_modal.html b/apcd_cms/src/apps/admin_extension/templates/view_admin_extension_modal.html index a5a0c355..c36028c5 100644 --- a/apcd_cms/src/apps/admin_extension/templates/view_admin_extension_modal.html +++ b/apcd_cms/src/apps/admin_extension/templates/view_admin_extension_modal.html @@ -5,54 +5,6 @@ - \ No newline at end of file + diff --git a/apcd_cms/src/apps/admin_extension/views.py b/apcd_cms/src/apps/admin_extension/views.py index 29e87afd..f7e7e155 100644 --- a/apcd_cms/src/apps/admin_extension/views.py +++ b/apcd_cms/src/apps/admin_extension/views.py @@ -44,7 +44,7 @@ def get_extensions_list_json(self, extensions, *args, **kwargs): page_num = 1 def getDate(row): - date = row[2] + date = row[9] return date if date is not None else datetimeDate(1,1,1) # put 'None' date entries all together at end of listing w/ date 1-1-0001 extensions = sorted(extensions, key=lambda row:getDate(row), reverse=True) diff --git a/apcd_cms/src/client/src/components/Extensions/EditExtensionModal/EditExtensionModal.tsx b/apcd_cms/src/client/src/components/Extensions/EditExtensionModal/EditExtensionModal.tsx index 82bb37f8..a47f77da 100644 --- a/apcd_cms/src/client/src/components/Extensions/EditExtensionModal/EditExtensionModal.tsx +++ b/apcd_cms/src/client/src/components/Extensions/EditExtensionModal/EditExtensionModal.tsx @@ -1,24 +1,8 @@ import React, { useState, useEffect } from 'react'; -import { - Modal, - ModalBody, - ModalHeader, - Label, - FormGroup, - Row, - Col, - Alert, -} from 'reactstrap'; -import { - Formik, - Field, - Form, - ErrorMessage, - useFormik, - FormikHelpers, - FormikProvider, -} from 'formik'; +import { Modal, ModalBody, ModalHeader, Row, Col, Alert } from 'reactstrap'; +import { Field, useFormik, FormikHelpers, FormikProvider } from 'formik'; import { fetchUtil } from 'utils/fetchUtil'; +import { formatDate } from 'utils/dateUtil'; import * as Yup from 'yup'; import { ExtensionRow } from 'hooks/admin'; import { useSubmitterDataPeriods } from 'hooks/entities'; @@ -27,7 +11,6 @@ import { convertPeriodLabelToApiValue, convertApiValueToPeriodLabel, } from 'utils/dateUtil'; -import styles from './EditExtensionModal.module.css'; import FieldWrapper from 'core-wrappers/FieldWrapperFormik'; import Button from 'core-components/Button'; @@ -60,33 +43,104 @@ const EditExtensionModal: React.FC = ({ const [showSuccessMessage, setShowSuccessMessage] = useState(false); const [showErrorMessage, setShowErrorMessage] = useState(false); const [errorMessage, setErrorMessage] = useState(''); - const [extensionFields, setExtensionFields] = useState([ - { - label: 'Applicable Data Period', - value: extension?.applicable_data_period || 'None', - }, - { - label: 'Approved Expiration Date', - value: extension?.approved_expiration_date || 'None', - }, - { label: 'Extension Status', value: extension?.ext_status }, - { label: 'Extension Outcome', value: extension?.ext_outcome }, - { label: 'Extension Notes', value: extension?.notes || 'None' }, - ]); + const [currentExtension, setCurrentExtension] = useState( + extension + ); + const { data: submitterData, isLoading: submitterDataLoading, error: submitterDataError, } = useSubmitterDataPeriods(extension?.submitter_id); - if (!extension) return null; + useEffect(() => { + setCurrentExtension(extension); + }, [extension]); + + if (!currentExtension) return null; + + const extensionFields = [ + { + label: 'Created', + value: currentExtension?.created + ? formatDate(currentExtension.created) + : 'None', + }, + { + label: 'Entity Organization', + value: currentExtension?.org_name, + }, + { + label: 'Requestor', + value: currentExtension?.requestor, + }, + { + label: 'Requestor Email', + value: currentExtension?.requestor_email, + }, + { + label: 'Extension Type', + value: currentExtension?.type, + }, + { + label: 'Status', + value: currentExtension?.ext_status, + }, + { + label: 'Outcome', + value: currentExtension?.ext_outcome, + }, + { + label: 'Applicable Data Period', + value: currentExtension?.applicable_data_period, + }, + { + label: 'Current Expected Date', + value: + currentExtension?.current_expected_date && + currentExtension?.current_expected_date !== 'None' + ? formatDate(currentExtension?.current_expected_date) + : 'None', + }, + { + label: 'Requested Target Date', + value: + currentExtension?.requested_target_date && + currentExtension?.requested_target_date !== 'None' + ? formatDate(currentExtension?.requested_target_date) + : 'None', + }, + { + label: 'Approved Expiration Date', + value: + currentExtension?.approved_expiration_date && + currentExtension?.approved_expiration_date !== 'None' + ? formatDate(currentExtension?.requested_target_date) + : 'None', + }, + { + label: 'Extension Justification', + value: currentExtension?.explanation_justification, + }, + { + label: 'Extension Notes', + value: currentExtension?.notes, + }, + { + label: 'Last Updated', + value: + currentExtension?.updated_at && currentExtension?.updated_at !== 'None' + ? formatDate(currentExtension?.updated_at) + : 'None', + }, + ]; // Use the custom hook to get form fields and validation const useFormFields = () => { const initialValues: FormValues = { - ...extension, - ext_id: extension?.ext_id, - notes: extension?.notes || 'None', // Set notes to 'None' if it is null + ...currentExtension, + ext_id: currentExtension?.ext_id, + notes: currentExtension?.notes || 'None', // Set notes to 'None' if it is null }; const validationSchema = Yup.object({ @@ -121,26 +175,20 @@ const EditExtensionModal: React.FC = ({ body: api_values, }); - if (onEditSuccess && response) { - onEditSuccess(response); - setExtensionFields([ - { - label: 'Applicable Data Period', - value: - convertApiValueToPeriodLabel(values.applicable_data_period) || - 'None', - }, - { - label: 'Approved Expiration Date', - value: values.approved_expiration_date || 'None', - }, - { label: 'Extension Status', value: values.ext_status }, - { label: 'Extension Outcome', value: values.ext_outcome }, - { label: 'Extension Notes', value: values.notes || 'None' }, - ]); - } + if (response) { + setCurrentExtension((prevExtension) => ({ + ...prevExtension!, + ext_status: values.ext_status, + ext_outcome: values.ext_outcome, + applicable_data_period: values.applicable_data_period, + approved_expiration_date: values.approved_expiration_date, + notes: values.notes, + updated_at: new Date().toISOString(), + })); - setShowSuccessMessage(true); + setShowSuccessMessage(true); + if (onEditSuccess) onEditSuccess(response); + } } catch (error: any) { if (error.response && error.response.data) { // Use error message from the server response @@ -170,6 +218,7 @@ const EditExtensionModal: React.FC = ({ const handleClose = () => { setShowSuccessMessage(false); setShowErrorMessage(false); + onClose(); }; const closeBtn = ( @@ -186,7 +235,8 @@ const EditExtensionModal: React.FC = ({ className="modal-dialog modal-lg" > - Edit Extension ID {extension.ext_id} for {extension.org_name} + Edit Extension ID {currentExtension.ext_id} for{' '} + {currentExtension.org_name}

Edit Selected Extension

@@ -223,7 +273,7 @@ const EditExtensionModal: React.FC = ({ ))}
- Current: {extension.applicable_data_period} + Current: {currentExtension.applicable_data_period}
@@ -246,10 +296,10 @@ const EditExtensionModal: React.FC = ({ onBlur={formik.handleBlur} />
- Current:{' '} - {extension.approved_expiration_date + Requested Target Date:{' '} + {currentExtension.requested_target_date ? new Date( - extension.approved_expiration_date + currentExtension.requested_target_date ).toLocaleDateString() : 'None'}
@@ -327,7 +377,7 @@ const EditExtensionModal: React.FC = ({
- Success: The exception data has been successfully updated. + Success: The extension data has been successfully updated. Error: {errorMessage} @@ -347,12 +397,8 @@ const EditExtensionModal: React.FC = ({
{extensionFields.map((field, index) => ( - -

{field.label}:

- - -

{field.value}

- + {field.label}: + {field.value}
))}
diff --git a/apcd_cms/src/client/src/components/Extensions/ViewExtensionModal/ViewExtensionModal.tsx b/apcd_cms/src/client/src/components/Extensions/ViewExtensionModal/ViewExtensionModal.tsx index ab877972..d38dcc2d 100644 --- a/apcd_cms/src/client/src/components/Extensions/ViewExtensionModal/ViewExtensionModal.tsx +++ b/apcd_cms/src/client/src/components/Extensions/ViewExtensionModal/ViewExtensionModal.tsx @@ -1,7 +1,6 @@ import React from 'react'; -import { Modal, ModalHeader, ModalBody } from 'reactstrap'; +import { Modal, ModalHeader, ModalBody, Row, Col } from 'reactstrap'; import { ExtensionRow } from 'hooks/admin'; -import styles from './ViewExtensionModal.module.css'; const ViewExtensionModal: React.FC<{ extension: ExtensionRow; @@ -18,53 +17,89 @@ const ViewExtensionModal: React.FC<{ Extension Details ID {extension.ext_id} for {extension.org_name} -

Details

-
-
Created
-
{extension.created}
-
Entity Organization
-
{extension.org_name}
-
Requestor
-
{extension.requestor}
-
Requestor Email
-
- {extension.requestor_email} -
-
Extension Type
-
{extension.type}
-
Status
-
{extension.ext_status}
-
Outcome
-
{extension.ext_outcome}
-
Applicable Data Period
-
- {extension.applicable_data_period} -
-
Current Expected Date
-
- {extension.current_expected_date} -
-
Requested Target Date
-
- {extension.requested_target_date} -
-
Approved Expiration Date
-
- {extension.approved_expiration_date} -
-
Extension Justification
-
- {extension.explanation_justification} -
-
Extension Notes
-
{extension.notes}
-
Last Updated
-
{extension.updated_at}
-
+ + Created + + {extension.created + ? new Date(extension.created).toLocaleString() + : 'None'} + + + + Entity Organization + {extension.org_name} + + + Requestor + {extension.requestor} + + + Requestor Email + {extension.requestor_email} + + + Extension Type + {extension.type} + + + Status + {extension.ext_status} + + + Outcome + {extension.ext_outcome} + + + Applicable Data Period + {extension.applicable_data_period} + + + Current Expected Date + + {extension.current_expected_date + ? new Date( + extension.current_expected_date + ).toLocaleDateString() + : 'None'} + + + + Requested Target Date + + {extension.requested_target_date + ? new Date( + extension.requested_target_date + ).toLocaleDateString() + : 'None'} + + + + Approved Expiration Date + + {extension.approved_expiration_date + ? new Date( + extension.approved_expiration_date + ).toLocaleDateString() + : 'None'} + + + + Extension Justification + {extension.explanation_justification} + + + Extension Notes + {extension.notes} + + + Last Updated + {extension.updated_at} + +