From 5daf2a92e3902787abec5e06f8879c17c71df27a Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Mon, 5 Jun 2023 14:10:33 -0700 Subject: [PATCH 01/15] 9785: add lead case and consolidated case icons with associated tool tip to deadline report table --- shared/src/business/entities/CaseDeadline.ts | 3 ++ .../createCaseDeadlineInteractor.ts | 8 ----- .../getCaseDeadlineFromFormAction.ts | 5 +++- .../computeds/caseDeadlineReportHelper.ts | 30 ++++++++++++------- .../src/views/CaseDeadlines/CaseDeadlines.tsx | 14 +++++++++ 5 files changed, 41 insertions(+), 19 deletions(-) diff --git a/shared/src/business/entities/CaseDeadline.ts b/shared/src/business/entities/CaseDeadline.ts index f820cace45b..a7fde81cda9 100644 --- a/shared/src/business/entities/CaseDeadline.ts +++ b/shared/src/business/entities/CaseDeadline.ts @@ -13,6 +13,7 @@ export class CaseDeadline extends JoiValidationEntity { public docketNumber: string; public sortableDocketNumber: string; public entityName: string; + public leadDocketNumber?: string; // eslint-disable-next-line @typescript-eslint/no-unused-vars constructor(rawProps, { applicationContext }) { @@ -29,6 +30,7 @@ export class CaseDeadline extends JoiValidationEntity { this.deadlineDate = rawProps.deadlineDate; this.description = rawProps.description; this.docketNumber = rawProps.docketNumber; + this.leadDocketNumber = rawProps.leadDocketNumber; // TODO: why is this if statement here if (this.docketNumber) { this.sortableDocketNumber = Case.getSortableDocketNumber( @@ -81,6 +83,7 @@ export class CaseDeadline extends JoiValidationEntity { ), entityName: JoiValidationConstants.STRING.valid('CaseDeadline').required(), + leadDocketNumber: JoiValidationConstants.DOCKET_NUMBER.optional(), sortableDocketNumber: joi .number() .required() diff --git a/shared/src/business/useCases/caseDeadline/createCaseDeadlineInteractor.ts b/shared/src/business/useCases/caseDeadline/createCaseDeadlineInteractor.ts index 4303a27c81e..d1a40ea9a1e 100644 --- a/shared/src/business/useCases/caseDeadline/createCaseDeadlineInteractor.ts +++ b/shared/src/business/useCases/caseDeadline/createCaseDeadlineInteractor.ts @@ -6,14 +6,6 @@ import { } from '../../../authorization/authorizationClientService'; import { UnauthorizedError } from '../../../errors/errors'; -/** - * createCaseDeadlineInteractor - * - * @param {object} applicationContext the application context - * @param {object} providers the providers object - * @param {object} providers.caseDeadline the case deadline data - * @returns {CaseDeadline} the created case deadline - */ export const createCaseDeadlineInteractor = async ( applicationContext: IApplicationContext, { caseDeadline }: { caseDeadline: CaseDeadline }, diff --git a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.ts b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.ts index 33a852d6795..ee5e24c76dd 100644 --- a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.ts +++ b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.ts @@ -22,7 +22,9 @@ export const getCaseDeadlineFromFormAction = ({ .createISODateString(props.computedDate); } - const { associatedJudge, docketNumber } = get(state.caseDetail); + const { associatedJudge, docketNumber, leadDocketNumber } = get( + state.caseDetail, + ); const caseDeadline = omit( { @@ -30,6 +32,7 @@ export const getCaseDeadlineFromFormAction = ({ associatedJudge, deadlineDate, docketNumber, + leadDocketNumber, }, ['day', 'month', 'year', 'searchError'], ); diff --git a/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts b/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts index 002b7047a2e..98f4bfb3e6c 100644 --- a/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts +++ b/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts @@ -41,16 +41,26 @@ export const caseDeadlineReportHelper = (get, applicationContext) => { .formatDateString(filterEndDate, DATE_FORMATS.MONTH_DAY_YEAR); } - caseDeadlines = caseDeadlines.map(d => ({ - ...d, - associatedJudgeFormatted: applicationContext - .getUtilities() - .getJudgeLastName(d.associatedJudge), - caseTitle: applicationContext.getCaseTitle(d.caseCaption || ''), - formattedDeadline: applicationContext - .getUtilities() - .formatDateString(d.deadlineDate, 'MMDDYY'), - })); + caseDeadlines = caseDeadlines.map(d => { + const inConsolidatedGroup = !!d.leadDocketNumber; + const inLeadCase = d.leadDocketNumber === d.docketNumber; + const consolidatedIconTooltipText = + inConsolidatedGroup && inLeadCase ? 'Lead case' : 'Consolidated case'; + + return { + ...d, + associatedJudgeFormatted: applicationContext + .getUtilities() + .getJudgeLastName(d.associatedJudge), + caseTitle: applicationContext.getCaseTitle(d.caseCaption || ''), + consolidatedIconTooltipText, + formattedDeadline: applicationContext + .getUtilities() + .formatDateString(d.deadlineDate, 'MMDDYY'), + inConsolidatedGroup, + inLeadCase, + }; + }); return { caseDeadlines, diff --git a/web-client/src/views/CaseDeadlines/CaseDeadlines.tsx b/web-client/src/views/CaseDeadlines/CaseDeadlines.tsx index 84848c6b981..fa85d1f05f8 100644 --- a/web-client/src/views/CaseDeadlines/CaseDeadlines.tsx +++ b/web-client/src/views/CaseDeadlines/CaseDeadlines.tsx @@ -2,6 +2,7 @@ import { BigHeader } from '../BigHeader'; import { BindedSelect } from '../../ustc-ui/BindedSelect/BindedSelect'; import { Button } from '../../ustc-ui/Button/Button'; import { CaseLink } from '../../ustc-ui/CaseLink/CaseLink'; +import { ConsolidatedCaseIcon } from '../../ustc-ui/Icon/ConsolidatedCaseIcon'; import { DateRangePickerComponent } from '../../ustc-ui/DateInput/DateRangePickerComponent'; import { ErrorNotification } from '../ErrorNotification'; import { SuccessNotification } from '../SuccessNotification'; @@ -124,6 +125,10 @@ export const CaseDeadlines = connect( Due Date + Docket No. Case Title Description @@ -136,6 +141,15 @@ export const CaseDeadlines = connect( {item.formattedDeadline} + + + From d7fc6f26b521c2f5d67db6cf8714eb091ebabb79 Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Mon, 5 Jun 2023 15:16:18 -0700 Subject: [PATCH 02/15] 9785: add unit tests and bug fix for consolidated icon tool tip when a docket entry was not part of a consolidated case --- .../business/entities/CaseDeadline.test.ts | 14 ++++++ .../getCaseDeadlineFromFormAction.test.ts | 32 +++++++++++++ .../caseDeadlineReportHelper.test.ts | 46 +++++++++++++++++++ .../computeds/caseDeadlineReportHelper.ts | 11 ++++- 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/shared/src/business/entities/CaseDeadline.test.ts b/shared/src/business/entities/CaseDeadline.test.ts index 09a717fa9b9..aa3d9bb018f 100644 --- a/shared/src/business/entities/CaseDeadline.test.ts +++ b/shared/src/business/entities/CaseDeadline.test.ts @@ -18,6 +18,20 @@ describe('CaseDeadline', () => { }); it('should be valid when all fields are present', () => { + const caseDeadline = new CaseDeadline( + { + associatedJudge: 'Judge Buch', + deadlineDate: '2019-03-01T21:42:29.073Z', + description: 'One small step', + docketNumber: DOCKET_NUMBER, + leadDocketNumber: DOCKET_NUMBER, + }, + { applicationContext }, + ); + expect(caseDeadline.getFormattedValidationErrors()).toEqual(null); + }); + + it('should be valid when all fields are present except for leadDocketNumber', () => { const caseDeadline = new CaseDeadline( { associatedJudge: 'Judge Buch', diff --git a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.test.ts b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.test.ts index 4a0e44a7ac3..2c3fcbfd432 100644 --- a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.test.ts +++ b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlineFromFormAction.test.ts @@ -47,6 +47,38 @@ describe('getCaseDeadlineFromFormAction', () => { caseDetail: { associatedJudge: mockJudge, docketNumber: mockDocketNumber, + leadDocketNumber: mockDocketNumber, + }, + form: { + day: 5, + month: 2, + searchError: {}, + year: 1993, + }, + }, + }); + + expect(result.output).toEqual({ + associatedJudge: mockJudge, + deadlineDate: computedDateFromProps, + docketNumber: mockDocketNumber, + leadDocketNumber: mockDocketNumber, + }); + }); + + it('returns a caseDeadline with props.computedDate and form values when props.computedDeadline is defined when case does not have a leadDocketNumber', async () => { + const result = await runAction(getCaseDeadlineFromFormAction, { + modules: { + presenter, + }, + props: { + computedDate: computedDateFromProps, + }, + state: { + caseDetail: { + associatedJudge: mockJudge, + docketNumber: mockDocketNumber, + leadDocketNumber: undefined, }, form: { day: 5, diff --git a/web-client/src/presenter/computeds/caseDeadlineReportHelper.test.ts b/web-client/src/presenter/computeds/caseDeadlineReportHelper.test.ts index b7279b4aab2..4361c5ccefc 100644 --- a/web-client/src/presenter/computeds/caseDeadlineReportHelper.test.ts +++ b/web-client/src/presenter/computeds/caseDeadlineReportHelper.test.ts @@ -94,6 +94,52 @@ describe('caseDeadlineReportHelper', () => { expect(result.caseDeadlines[3].associatedJudgeFormatted).toEqual('Barney'); }); + it('should format the caseDeadline with consolidated cases with correct icons and tool tips', () => { + const consolidatedCaseDeadlines = [ + { + associatedJudge: 'Judge of Madea Rummy', + deadlineDate: '2019-08-21T04:00:00.000Z', + docketNumber: '101-19', + leadDocketNumber: '101-19', + }, + { + associatedJudge: 'Not A Judge Barney', + deadlineDate: '2019-08-21T04:00:00.000Z', + docketNumber: '102-19', + leadDocketNumber: '101-19', + }, + { + associatedJudge: 'In Training Judge Brandeis', + deadlineDate: '2019-08-24T04:00:00.000Z', + docketNumber: '103-19', + }, + ]; + const result = runCompute(caseDeadlineReportHelper, { + state: { + caseDeadlineReport: { caseDeadlines: consolidatedCaseDeadlines }, + judges: [{ name: 'Carluzzo' }, { name: 'Buch' }], + screenMetadata: { + filterEndDate: '2019-08-21T12:59:59.000Z', + filterStartDate: '2019-08-21T04:00:00.000Z', + }, + }, + }); + + expect(result.caseDeadlines[0].inConsolidatedGroup).toEqual(true); + expect(result.caseDeadlines[0].inLeadCase).toEqual(true); + expect(result.caseDeadlines[0].consolidatedIconTooltipText).toEqual( + 'Lead case', + ); + expect(result.caseDeadlines[1].inConsolidatedGroup).toEqual(true); + expect(result.caseDeadlines[1].inLeadCase).toEqual(false); + expect(result.caseDeadlines[1].consolidatedIconTooltipText).toEqual( + 'Consolidated case', + ); + expect(result.caseDeadlines[2].inConsolidatedGroup).toEqual(false); + expect(result.caseDeadlines[2].inLeadCase).toEqual(false); + expect(result.caseDeadlines[2].consolidatedIconTooltipText).toBeUndefined(); + }); + describe('showLoadMoreButton', () => { it('should return showLoadMoreButton true when caseDeadlines length is less than totalCount', () => { const result = runCompute(caseDeadlineReportHelper, { diff --git a/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts b/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts index 98f4bfb3e6c..4e68c838e57 100644 --- a/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts +++ b/web-client/src/presenter/computeds/caseDeadlineReportHelper.ts @@ -44,8 +44,15 @@ export const caseDeadlineReportHelper = (get, applicationContext) => { caseDeadlines = caseDeadlines.map(d => { const inConsolidatedGroup = !!d.leadDocketNumber; const inLeadCase = d.leadDocketNumber === d.docketNumber; - const consolidatedIconTooltipText = - inConsolidatedGroup && inLeadCase ? 'Lead case' : 'Consolidated case'; + let consolidatedIconTooltipText; + + if (inConsolidatedGroup) { + if (inLeadCase) { + consolidatedIconTooltipText = 'Lead case'; + } else { + consolidatedIconTooltipText = 'Consolidated case'; + } + } return { ...d, From a304c35dd8fa10f88e655e270aa6ac8074877216 Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Mon, 5 Jun 2023 15:24:42 -0700 Subject: [PATCH 03/15] 9785: remove jsdoc from createCaseDeadline --- .../dynamo/caseDeadlines/createCaseDeadline.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/shared/src/persistence/dynamo/caseDeadlines/createCaseDeadline.ts b/shared/src/persistence/dynamo/caseDeadlines/createCaseDeadline.ts index 28e7d05c212..166f5319e66 100644 --- a/shared/src/persistence/dynamo/caseDeadlines/createCaseDeadline.ts +++ b/shared/src/persistence/dynamo/caseDeadlines/createCaseDeadline.ts @@ -1,13 +1,5 @@ import { put } from '../../dynamodbClientService'; -/** - * createCaseDeadline - * - * @param {object} providers the providers object - * @param {object} providers.applicationContext the application context - * @param {object} providers.caseDeadline the case deadline data - * @returns {Promise} resolves upon creation of case deadline - */ export const createCaseDeadline = ({ applicationContext, caseDeadline, From 006dd99f9db95f65e425e1923867d9e1a2195b33 Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Tue, 6 Jun 2023 13:54:29 -0700 Subject: [PATCH 04/15] 9785: add migration script for CaseDeadline entity update to accept leadDocketNumber --- ...ead-docket-number-to-case-deadline.test.ts | 101 ++++++++++++++++++ ...add-lead-docket-number-to-case-deadline.ts | 39 +++++++ .../migration/main/lambdas/migrationsToRun.ts | 5 + 3 files changed, 145 insertions(+) create mode 100644 web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts create mode 100644 web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts new file mode 100644 index 00000000000..92ce1792e48 --- /dev/null +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts @@ -0,0 +1,101 @@ +import { CASE_STATUS_TYPES } from '../../../../../../shared/src/business/entities/EntityConstants'; +import { aggregateCaseItems } from '../../../../../../shared/src/persistence/dynamo/helpers/aggregateCaseItems'; +import { migrateItems } from './0010-add-lead-docket-number-to-case-deadline'; +jest.mock( + '../../../../../../shared/src/persistence/dynamo/helpers/aggregateCaseItems', +); +import { queryFullCase } from '../utilities/queryFullCase'; +jest.mock('../utilities/queryFullCase'); + +let documentClientMock; +const MOCK_CONSOLIDATED_CASE_RECORD = { + associatedJudge: 'Colvin', + docketNumber: '101-18', + docketNumberWithSuffix: '101-18', + entityName: 'Case', + leadDocketNumber: '101-18', + pk: 'case|101-18', + sk: 'case|101-18', + status: CASE_STATUS_TYPES.calendared, + trialDate: '2020-03-01T00:00:00.000Z', + trialLocation: 'Washington, District of Columbia', + trialSessionId: '7805d1ab-18d0-43ec-bafb-654e83405410', +}; + +const MOCK_CASE_RECORD = { + associatedJudge: 'Colvin', + docketNumber: '101-18', + docketNumberWithSuffix: '101-18', + entityName: 'Case', + pk: 'case|101-18', + sk: 'case|101-18', + status: CASE_STATUS_TYPES.calendared, + trialDate: '2020-03-01T00:00:00.000Z', + trialLocation: 'Washington, District of Columbia', + trialSessionId: '7805d1ab-18d0-43ec-bafb-654e83405410', +}; + +describe('migrateItems', () => { + it('should return and not modify records that do not have a leadDocketNUmber', async () => { + (queryFullCase as jest.Mock).mockResolvedValue({ + pk: `case|${MOCK_CASE_RECORD.docketNumber}`, + sk: `case|${MOCK_CASE_RECORD.docketNumber}`, + }); + (aggregateCaseItems as jest.Mock).mockReturnValue(MOCK_CASE_RECORD); + + const mockNonConsolidatedCaseDeadlineItem = [ + { + associatedJudge: MOCK_CASE_RECORD.associatedJudge, + caseDeadLineId: '97a214a0-437d-461b-80a9-1cfd3d669690', + createdAt: '2023-06-06T18:55:57.361Z', + deadlineDate: '2023-06-10T04:00:00.000Z', + description: 'test', + docketNumber: MOCK_CASE_RECORD.docketNumber, + entityName: 'CaseDeadline', + pk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690', + sk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690', + sortableDocketNumber: 2018000101, + }, + ]; + + const results = await migrateItems( + mockNonConsolidatedCaseDeadlineItem, + documentClientMock, + ); + + expect(results).toEqual(mockNonConsolidatedCaseDeadlineItem); + }); + + it('should modify CaseDeadline when the case has a leadDocketNumber, adding the case\'s property "leadDocketNUmber" to the CaseDeadline', async () => { + (queryFullCase as jest.Mock).mockResolvedValue({ + pk: `case|${MOCK_CONSOLIDATED_CASE_RECORD.docketNumber}`, + sk: `case|${MOCK_CONSOLIDATED_CASE_RECORD.docketNumber}`, + }); + (aggregateCaseItems as jest.Mock).mockReturnValue( + MOCK_CONSOLIDATED_CASE_RECORD, + ); + + const mockConsolidatedCaseDeadlineItem = [ + { + associatedJudge: MOCK_CONSOLIDATED_CASE_RECORD.associatedJudge, + caseDeadLineId: '97a214a0-437d-461b-80a9-1cfd3d669690', + createdAt: '2023-06-06T18:55:57.361Z', + deadlineDate: '2023-06-10T04:00:00.000Z', + description: 'test', + docketNumber: MOCK_CONSOLIDATED_CASE_RECORD.docketNumber, + entityName: 'CaseDeadline', + leadDocketNumber: MOCK_CONSOLIDATED_CASE_RECORD.leadDocketNumber, + pk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690', + sk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690', + sortableDocketNumber: 2018000101, + }, + ]; + + const results = await migrateItems( + mockConsolidatedCaseDeadlineItem, + documentClientMock, + ); + + expect(results).toEqual(mockConsolidatedCaseDeadlineItem); + }); +}); diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts new file mode 100644 index 00000000000..9632a15d4fc --- /dev/null +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts @@ -0,0 +1,39 @@ +import { CaseDeadline } from '../../../../../../shared/src/business/entities/CaseDeadline'; +import { aggregateCaseItems } from '../../../../../../shared/src/persistence/dynamo/helpers/aggregateCaseItems'; +import { createApplicationContext } from '../../../../../src/applicationContext'; +import { queryFullCase } from '../utilities/queryFullCase'; + +const applicationContext = createApplicationContext({}); + +const isCaseDeadlineItem = item => { + return ( + item.pk.startsWith('case-deadline|') && item.sk.startsWith('case-deadline|') + ); +}; + +export const migrateItems = async (items, documentClient) => { + const itemsAfter = []; + + for (const item of items) { + if (isCaseDeadlineItem(item)) { + const fullCase = await queryFullCase(documentClient, item.docketNumber); + const caseRecord = aggregateCaseItems(fullCase); + + const theCaseDeadline = new CaseDeadline( + { + ...item, + leadDocketNumber: caseRecord.leadDocketNumber, + }, + { + applicationContext, + }, + ).validateWithLogging(applicationContext); + + item.leadDocketNumber = theCaseDeadline.leadDocketNumber; + } + + itemsAfter.push(item); + } + + return itemsAfter; +}; diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrationsToRun.ts b/web-api/workflow-terraform/migration/main/lambdas/migrationsToRun.ts index 1ad42985b59..21586caa9e2 100644 --- a/web-api/workflow-terraform/migration/main/lambdas/migrationsToRun.ts +++ b/web-api/workflow-terraform/migration/main/lambdas/migrationsToRun.ts @@ -1,6 +1,7 @@ import { migrateItems as migration0007 } from './migrations/0007-update-corporate-disclosure-document'; import { migrateItems as migration0008 } from './migrations/0008-add-assignee-id-gsi2pk-to-work-item'; import { migrateItems as migration0009 } from './migrations/0009-add-trial-location-field-to-work-item'; +import { migrateItems as migration0010 } from './migrations/0010-add-lead-docket-number-to-case-deadline'; export const migrationsToRun = [ { @@ -15,4 +16,8 @@ export const migrationsToRun = [ key: '0009-add-trial-location-field-to-work-item.ts', script: migration0009, }, + { + key: '0010-add-lead-docket-number-to-case-deadline.ts', + script: migration0010, + }, ]; From c1ff5f9d84ceb2e51c2b877c2eaa56d60b5dbe98 Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Wed, 7 Jun 2023 07:32:23 -0700 Subject: [PATCH 05/15] 9785: remove more jsdocs and add leadDocketNumber to case mapping so deadline will show icons --- .../useCases/getCaseDeadlinesInteractor.ts | 21 +------------------ .../CaseDeadline/getCaseDeadlinesAction.ts | 7 ------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/shared/src/business/useCases/getCaseDeadlinesInteractor.ts b/shared/src/business/useCases/getCaseDeadlinesInteractor.ts index f4e585b4476..0aa98478ded 100644 --- a/shared/src/business/useCases/getCaseDeadlinesInteractor.ts +++ b/shared/src/business/useCases/getCaseDeadlinesInteractor.ts @@ -7,18 +7,6 @@ import { import { UnauthorizedError } from '../../errors/errors'; import { pick } from 'lodash'; -/** - * getCaseDeadlinesInteractor - * - * @param {object} applicationContext the application context - * @param {object} providers the providers object - * @param {string} providers.endDate the end date - * @param {string} providers.startDate the start date - * @param {number} providers.from the index to start from - * @param {string} providers.judge the judge - * @param {number} providers.pageSize the page size - * @returns {Promise} the promise of the getCaseDeadlinesByDateRange call - */ export const getCaseDeadlinesInteractor = async ( applicationContext: IApplicationContext, { @@ -73,20 +61,13 @@ export const getCaseDeadlinesInteractor = async ( 'docketNumber', 'docketNumberSuffix', 'docketNumberWithSuffix', + 'leadDocketNumber', ]), })); return { deadlines: afterCaseMapping, totalCount }; }; -/** - * Helper function to grab all of the cases from persistence; only return the valid cases - * - * @param {object} providers The providers - * @param {object} providers.applicationContext the application context - * @param {array} providers.docketNumbers an array of docket numbers to retrieve from persistence - * @returns {array} a validated array of cases - */ const getCasesByDocketNumbers = async ({ applicationContext, docketNumbers, diff --git a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts index 0342d1a7fc9..a7f118bc6ab 100644 --- a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts +++ b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts @@ -1,12 +1,5 @@ import { state } from 'cerebral'; -/** - * get case deadlines between start and end date - * @param {object} providers the providers object - * @param {object} providers.applicationContext the application context - * @param {function} providers.get the get function - * @returns {object} the case deadlines - */ export const getCaseDeadlinesAction = async ({ applicationContext, get, From 01aa86559e2435c6ee341921148c3fe0db18c559 Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Tue, 13 Jun 2023 10:46:02 -0700 Subject: [PATCH 06/15] 9785: update this.sortableDocketNumber to number instead of string, get sortableDocketNumber from raw props or Case.getSortableDocketNumber --- shared/src/business/entities/CaseDeadline.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/shared/src/business/entities/CaseDeadline.ts b/shared/src/business/entities/CaseDeadline.ts index a7fde81cda9..a085e035d15 100644 --- a/shared/src/business/entities/CaseDeadline.ts +++ b/shared/src/business/entities/CaseDeadline.ts @@ -11,8 +11,8 @@ export class CaseDeadline extends JoiValidationEntity { public deadlineDate: string; public description: string; public docketNumber: string; - public sortableDocketNumber: string; - public entityName: string; + public sortableDocketNumber: number; + // public entityName: string; public leadDocketNumber?: string; // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -31,12 +31,9 @@ export class CaseDeadline extends JoiValidationEntity { this.description = rawProps.description; this.docketNumber = rawProps.docketNumber; this.leadDocketNumber = rawProps.leadDocketNumber; - // TODO: why is this if statement here - if (this.docketNumber) { - this.sortableDocketNumber = Case.getSortableDocketNumber( - this.docketNumber, - ); - } + this.sortableDocketNumber = + rawProps.sortableDocketNumber || + Case.getSortableDocketNumber(this.docketNumber); } static VALIDATION_ERROR_MESSAGES = { From 6e2e9d053eea11f46f7282602aafe95bcd9dbeff Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Tue, 13 Jun 2023 11:07:47 -0700 Subject: [PATCH 07/15] 9785: fix failing autoGenerateDeadline unit test - changed sortableDOcketNUmber to number and correct format --- shared/src/business/useCaseHelper/autoGenerateDeadline.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/business/useCaseHelper/autoGenerateDeadline.test.ts b/shared/src/business/useCaseHelper/autoGenerateDeadline.test.ts index 18945e8236f..4e4345d43b7 100644 --- a/shared/src/business/useCaseHelper/autoGenerateDeadline.test.ts +++ b/shared/src/business/useCaseHelper/autoGenerateDeadline.test.ts @@ -10,7 +10,7 @@ describe('autoGenerateDeadline', () => { subjectCaseEntity: { associatedJudge: 'Laozi', docketNumber: '101-01', - sortableDocketNumber: '101-01', + sortableDocketNumber: 2001000101, }, }); From 0370e6f6ffea1e0d5f6d2ce47a74526ddd0a5c37 Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Tue, 13 Jun 2023 13:55:23 -0700 Subject: [PATCH 08/15] 9785: fix more ts errors --- .../migrations/0007-update-corporate-disclosure-document.ts | 2 +- .../migrations/0009-add-trial-location-field-to-work-item.ts | 2 +- .../migrations/0010-add-lead-docket-number-to-case-deadline.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0007-update-corporate-disclosure-document.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0007-update-corporate-disclosure-document.ts index b9e8941e401..48350f158bd 100644 --- a/web-api/workflow-terraform/migration/main/lambdas/migrations/0007-update-corporate-disclosure-document.ts +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0007-update-corporate-disclosure-document.ts @@ -9,7 +9,7 @@ const isCase = item => { }; export const migrateItems = items => { - const itemsAfter = []; + const itemsAfter: any[] = []; for (const item of items) { if (isDocketEntry(item)) { diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts index 60e430758e5..31438afae7f 100644 --- a/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts @@ -17,7 +17,7 @@ const isOutboxItem = item => { }; export const migrateItems = async (items, documentClient) => { - const itemsAfter = []; + const itemsAfter: any[] = []; for (const item of items) { if (isWorkItem(item) && item.caseStatus === CASE_STATUS_TYPES.calendared) { diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts index 9632a15d4fc..11f5c105c97 100644 --- a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts @@ -12,7 +12,7 @@ const isCaseDeadlineItem = item => { }; export const migrateItems = async (items, documentClient) => { - const itemsAfter = []; + const itemsAfter: any[] = []; for (const item of items) { if (isCaseDeadlineItem(item)) { From d17474dabaca32877d5fec1a93fb09c4fc9210de Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Tue, 13 Jun 2023 14:28:02 -0700 Subject: [PATCH 09/15] 9785: fix more ts errors to get robocop to pass --- web-client/src/providers/socket.ts | 2 +- web-client/src/utilities/queryStringDecoder.test.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/web-client/src/providers/socket.ts b/web-client/src/providers/socket.ts index f3e64040065..cfd9a65909f 100644 --- a/web-client/src/providers/socket.ts +++ b/web-client/src/providers/socket.ts @@ -28,7 +28,7 @@ export const socketProvider = ({ socketRouter }) => { const token = app.getState('token'); const clientConnectionId = app.getState('clientConnectionId'); if (!socket) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { try { socket = createWebSocketClient({ clientConnectionId, token }); diff --git a/web-client/src/utilities/queryStringDecoder.test.ts b/web-client/src/utilities/queryStringDecoder.test.ts index f13f28fba96..e68d462e700 100644 --- a/web-client/src/utilities/queryStringDecoder.test.ts +++ b/web-client/src/utilities/queryStringDecoder.test.ts @@ -3,6 +3,7 @@ import { queryStringDecoder } from './queryStringDecoder'; describe('queryStringDecoder', () => { beforeAll(() => { delete window.location; + // (window as any).location = {}; }); it('should return code, path, and token from hash', () => { From efdc6611de073b16ed0e2a37338b28140e0ed444 Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Tue, 13 Jun 2023 14:55:49 -0700 Subject: [PATCH 10/15] 9785: fix more ts errors by adding CaseDeadlineReportHelper type to state.js and caseDeadlineHelperReport as CaseDeadlineReportHelper --- web-client/src/presenter/state.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web-client/src/presenter/state.ts b/web-client/src/presenter/state.ts index c2fa779d7fd..8f93fe794ce 100644 --- a/web-client/src/presenter/state.ts +++ b/web-client/src/presenter/state.ts @@ -251,6 +251,13 @@ const helpers = { workQueueHelper, }; +type CaseDeadlineReportHelper = { + caseDeadlines: any[]; + judgeFilter: any; + totalCount: number; + page: number; +}; + export const baseState = { advancedSearchForm: {}, // form for advanced search screen, TODO: replace with state.form advancedSearchTab: 'case', @@ -263,7 +270,7 @@ export const baseState = { }, assigneeId: null, // used for assigning workItems in assignSelectedWorkItemsAction batchDownloads: {}, // batch download of PDFs - caseDeadlineReport: {}, + caseDeadlineReport: {} as CaseDeadlineReportHelper, caseDetail: {} as TCase, closedCases: [], cognitoLoginUrl: null, From 38cde3da7548fac9b340d9a843a98362bb7758bf Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Tue, 13 Jun 2023 15:15:00 -0700 Subject: [PATCH 11/15] 9785: remove unneeded commented out code --- shared/src/business/entities/CaseDeadline.ts | 1 - web-client/src/utilities/queryStringDecoder.test.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/shared/src/business/entities/CaseDeadline.ts b/shared/src/business/entities/CaseDeadline.ts index a085e035d15..3a4b7bd3b4b 100644 --- a/shared/src/business/entities/CaseDeadline.ts +++ b/shared/src/business/entities/CaseDeadline.ts @@ -12,7 +12,6 @@ export class CaseDeadline extends JoiValidationEntity { public description: string; public docketNumber: string; public sortableDocketNumber: number; - // public entityName: string; public leadDocketNumber?: string; // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/web-client/src/utilities/queryStringDecoder.test.ts b/web-client/src/utilities/queryStringDecoder.test.ts index e68d462e700..f13f28fba96 100644 --- a/web-client/src/utilities/queryStringDecoder.test.ts +++ b/web-client/src/utilities/queryStringDecoder.test.ts @@ -3,7 +3,6 @@ import { queryStringDecoder } from './queryStringDecoder'; describe('queryStringDecoder', () => { beforeAll(() => { delete window.location; - // (window as any).location = {}; }); it('should return code, path, and token from hash', () => { From 5c6ff8e42b6f9fb5d18228a6c8582d51f51bb47f Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Wed, 14 Jun 2023 09:21:10 -0700 Subject: [PATCH 12/15] 9785: corrected types for migration scripts and add back jsdoc with some new text for getCaseDeadlineAction as per feedback --- .../0009-add-trial-location-field-to-work-item.ts | 2 +- .../0010-add-lead-docket-number-to-case-deadline.ts | 2 +- .../actions/CaseDeadline/getCaseDeadlinesAction.ts | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts index 31438afae7f..726abbae7ee 100644 --- a/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0009-add-trial-location-field-to-work-item.ts @@ -17,7 +17,7 @@ const isOutboxItem = item => { }; export const migrateItems = async (items, documentClient) => { - const itemsAfter: any[] = []; + const itemsAfter: (RawWorkItem | RawOutboxItem)[] = []; for (const item of items) { if (isWorkItem(item) && item.caseStatus === CASE_STATUS_TYPES.calendared) { diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts index 11f5c105c97..3bd9fb4ccd1 100644 --- a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.ts @@ -12,7 +12,7 @@ const isCaseDeadlineItem = item => { }; export const migrateItems = async (items, documentClient) => { - const itemsAfter: any[] = []; + const itemsAfter: RawCaseDeadline[] = []; for (const item of items) { if (isCaseDeadlineItem(item)) { diff --git a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts index a7f118bc6ab..48c5d0d09b6 100644 --- a/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts +++ b/web-client/src/presenter/actions/CaseDeadline/getCaseDeadlinesAction.ts @@ -1,5 +1,12 @@ import { state } from 'cerebral'; +/** + * get case deadlines between start and end date and can be filtered by judge + * @param {object} providers the providers object + * @param {object} providers.applicationContext the application context + * @param {function} providers.get the get function + * @returns {object} the case deadlines and total count of returned case deadlines + */ export const getCaseDeadlinesAction = async ({ applicationContext, get, From 6c8fbdb0e63e42a4fcbc37fa0d86ced813b5908e Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Wed, 14 Jun 2023 10:06:13 -0700 Subject: [PATCH 13/15] 9785: corrected types in state.ts for caseDeadlineReport and caseDetail --- web-client/src/presenter/state.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web-client/src/presenter/state.ts b/web-client/src/presenter/state.ts index 8f93fe794ce..2885374e4fa 100644 --- a/web-client/src/presenter/state.ts +++ b/web-client/src/presenter/state.ts @@ -251,9 +251,9 @@ const helpers = { workQueueHelper, }; -type CaseDeadlineReportHelper = { - caseDeadlines: any[]; - judgeFilter: any; +type TCaseDeadlineReport = { + caseDeadlines: RawCaseDeadline[]; + judgeFilter: string; totalCount: number; page: number; }; @@ -270,8 +270,8 @@ export const baseState = { }, assigneeId: null, // used for assigning workItems in assignSelectedWorkItemsAction batchDownloads: {}, // batch download of PDFs - caseDeadlineReport: {} as CaseDeadlineReportHelper, - caseDetail: {} as TCase, + caseDeadlineReport: {} as TCaseDeadlineReport, + caseDetail: {} as RawCase, closedCases: [], cognitoLoginUrl: null, completeForm: {}, From 30311231fe743dc4fa8719e7bde75feb7caec46e Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Thu, 22 Jun 2023 07:01:49 -0700 Subject: [PATCH 14/15] 9785: fix typescript errors --- web-client/src/presenter/computeds/messageModalHelper.ts | 2 +- .../src/presenter/computeds/setForHearingModalHelper.ts | 2 +- web-client/src/presenter/computeds/statisticsHelper.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web-client/src/presenter/computeds/messageModalHelper.ts b/web-client/src/presenter/computeds/messageModalHelper.ts index cca3cecb870..8eaf43393ed 100644 --- a/web-client/src/presenter/computeds/messageModalHelper.ts +++ b/web-client/src/presenter/computeds/messageModalHelper.ts @@ -25,7 +25,7 @@ export const messageModalHelper = ( .getUtilities() .getFormattedCaseDetail({ applicationContext, caseDetail }); - const documents = []; + const documents: RawDocketEntry[] = []; formattedDocketEntries.forEach(entry => { if (entry.isFileAttached && entry.isOnDocketRecord) { entry.title = entry.descriptionDisplay || entry.documentType; diff --git a/web-client/src/presenter/computeds/setForHearingModalHelper.ts b/web-client/src/presenter/computeds/setForHearingModalHelper.ts index 665478047fe..a0fa4749596 100644 --- a/web-client/src/presenter/computeds/setForHearingModalHelper.ts +++ b/web-client/src/presenter/computeds/setForHearingModalHelper.ts @@ -9,7 +9,7 @@ export const setForHearingModalHelper = ( ) => { const caseDetail = get(state.caseDetail); const { SESSION_STATUS_GROUPS } = applicationContext.getConstants(); - let excludedTrialSessionIds = []; + let excludedTrialSessionIds: String[] = []; if (caseDetail.trialSessionId) { excludedTrialSessionIds.push(caseDetail.trialSessionId); diff --git a/web-client/src/presenter/computeds/statisticsHelper.ts b/web-client/src/presenter/computeds/statisticsHelper.ts index bcd8a43ba35..25df0a5cb73 100644 --- a/web-client/src/presenter/computeds/statisticsHelper.ts +++ b/web-client/src/presenter/computeds/statisticsHelper.ts @@ -95,10 +95,10 @@ export const statisticsHelper = ( } const formattedDamages = - damages && applicationContext.getUtilities().formatDollars(damages); + damages && applicationContext.getUtilities().formatDollars(+damages); const formattedLitigationCosts = litigationCosts && - applicationContext.getUtilities().formatDollars(litigationCosts); + applicationContext.getUtilities().formatDollars(+litigationCosts); const showDamages = !!formattedDamages; const showLitigationCosts = !!formattedLitigationCosts; From 02a919dbf5f37dd6c150bd9b52f2c4c28f9043de Mon Sep 17 00:00:00 2001 From: Richard Goshen Date: Thu, 22 Jun 2023 11:46:42 -0700 Subject: [PATCH 15/15] 9785: update migration script unit test --- ...lead-docket-number-to-case-deadline.test.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts index 92ce1792e48..2c168e43670 100644 --- a/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts +++ b/web-api/workflow-terraform/migration/main/lambdas/migrations/0010-add-lead-docket-number-to-case-deadline.test.ts @@ -66,7 +66,7 @@ describe('migrateItems', () => { expect(results).toEqual(mockNonConsolidatedCaseDeadlineItem); }); - it('should modify CaseDeadline when the case has a leadDocketNumber, adding the case\'s property "leadDocketNUmber" to the CaseDeadline', async () => { + it('should modify CaseDeadline when the case has a leadDocketNumber, adding the case\'s property "leadDocketNumber" to the CaseDeadline', async () => { (queryFullCase as jest.Mock).mockResolvedValue({ pk: `case|${MOCK_CONSOLIDATED_CASE_RECORD.docketNumber}`, sk: `case|${MOCK_CONSOLIDATED_CASE_RECORD.docketNumber}`, @@ -75,7 +75,7 @@ describe('migrateItems', () => { MOCK_CONSOLIDATED_CASE_RECORD, ); - const mockConsolidatedCaseDeadlineItem = [ + const mockConsolidatedCaseDeadlineItemWithoutLeadDocketNumber = [ { associatedJudge: MOCK_CONSOLIDATED_CASE_RECORD.associatedJudge, caseDeadLineId: '97a214a0-437d-461b-80a9-1cfd3d669690', @@ -84,18 +84,26 @@ describe('migrateItems', () => { description: 'test', docketNumber: MOCK_CONSOLIDATED_CASE_RECORD.docketNumber, entityName: 'CaseDeadline', - leadDocketNumber: MOCK_CONSOLIDATED_CASE_RECORD.leadDocketNumber, pk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690', sk: 'case-deadline|97a214a0-437d-461b-80a9-1cfd3d669690', sortableDocketNumber: 2018000101, }, ]; + const mockConsolidatedCaseDeadlineItemWithLeadDocketNumber = [ + { + ...mockConsolidatedCaseDeadlineItemWithoutLeadDocketNumber[0], + leadDocketNumber: MOCK_CONSOLIDATED_CASE_RECORD.leadDocketNumber, + }, + ]; + const results = await migrateItems( - mockConsolidatedCaseDeadlineItem, + mockConsolidatedCaseDeadlineItemWithoutLeadDocketNumber, documentClientMock, ); - expect(results).toEqual(mockConsolidatedCaseDeadlineItem); + expect(results).toEqual( + mockConsolidatedCaseDeadlineItemWithLeadDocketNumber, + ); }); });