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 @@
-
-
-
-
-
- Details
-
-
- Created
- {{r.created_at}}
- Entity Organization
- {{r.entity_name}}
- Requestor
- {{r.requestor_name}}
- Requestor Email
- {{r.requestor_email}}
- Extension Type
- {{r.extension_type}}
- Status
- {{r.status}}
- Outcome
- {{r.outcome}}
- Applicable Data Period
- {{r.applicable_data_period}}
- Current Expected Date
- {{r.current_expected_date}}
- Requested Target Date
- {{r.requested_target_date}}
- Approved Expiration Date
- {{r.approved_expiration_date}}
- Extension Justification
- {{r.explanation_justification}}
- Extension Notes
- {{r.notes}}
- Last Updated
- {{r.updated_at}}
-
-
-
-
-
-
-
-
+
-
\ 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}
+
+