Skip to content

Commit ad64c99

Browse files
authored
Merge pull request #5663 from flexion/10434-story
10434: Trial Session Planning Report - Screen Version
2 parents 40575eb + 0bd4a02 commit ad64c99

File tree

50 files changed

+1936
-538
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1936
-538
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { checkA11y } from '../../../support/generalCommands/checkA11y';
2+
import { loginAsDocketClerk1 } from '../../../../helpers/authentication/login-as-helpers';
3+
4+
describe('Trial Sessions Planning Report View - Accessibility', () => {
5+
beforeEach(() => {
6+
Cypress.session.clearCurrentSessionData();
7+
});
8+
9+
it('should be free of a11y issues', () => {
10+
loginAsDocketClerk1();
11+
cy.get('[data-testid="trial-session-link"]').click();
12+
cy.get('[data-testid="trial-session-planning-report-button"]').click();
13+
14+
cy.get('[data-testid="trial-session-planning-report-term-selector"]')
15+
.find('option')
16+
.last()
17+
.then(option => {
18+
const optionValue = option.val()!;
19+
cy.get(
20+
'[data-testid="trial-session-planning-report-term-selector"]',
21+
).select(optionValue);
22+
});
23+
24+
cy.get('[data-testid="trial-session-planning-report-year-selector"]')
25+
.find('option')
26+
.last()
27+
.then(option => {
28+
const optionValue = option.val()!;
29+
cy.get(
30+
'[data-testid="trial-session-planning-report-year-selector"]',
31+
).select(optionValue);
32+
});
33+
34+
cy.get('[data-testid="modal-button-confirm"]').click();
35+
36+
cy.get('[data-testid="cities-not-calendared-in-past-two-terms-table"]');
37+
checkA11y();
38+
});
39+
});
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { loginAsDocketClerk1 } from '../../../../helpers/authentication/login-as-helpers';
2+
3+
describe('Trial Sessions Planning Report View', () => {
4+
describe('BUGs', () => {
5+
it('should not display errors when user has not selected any option in dropdowns', () => {
6+
loginAsDocketClerk1();
7+
cy.get('[data-testid="trial-session-link"]').click();
8+
cy.get('[data-testid="trial-session-planning-report-button"]').click();
9+
10+
cy.get('[data-testid="trial-session-planning-report-term-selector"]')
11+
.find('option')
12+
.last()
13+
.then(option => {
14+
const optionValue = option.val()!;
15+
cy.get(
16+
'[data-testid="trial-session-planning-report-term-selector"]',
17+
).select(optionValue);
18+
});
19+
20+
cy.get(
21+
'[data-testid="trial-session-planning-report-modal-term-error"]',
22+
).should('not.exist');
23+
24+
cy.get(
25+
'[data-testid="trial-session-planning-report-modal-year-error"]',
26+
).should('not.exist');
27+
28+
cy.get('[data-testid="trial-session-planning-report-year-selector"]')
29+
.find('option')
30+
.last()
31+
.then(option => {
32+
const optionValue = option.val()!;
33+
cy.get(
34+
'[data-testid="trial-session-planning-report-year-selector"]',
35+
).select(optionValue);
36+
});
37+
38+
cy.get(
39+
'[data-testid="trial-session-planning-report-modal-term-error"]',
40+
).should('not.exist');
41+
42+
cy.get(
43+
'[data-testid="trial-session-planning-report-modal-year-error"]',
44+
).should('not.exist');
45+
46+
cy.get('[data-testid="modal-button-confirm"]').click();
47+
48+
cy.get('[data-testid="cities-not-calendared-in-past-two-terms-table"]');
49+
50+
cy.get('[data-testid="dropdown-select-report"]').click();
51+
cy.get('[data-testid="trial-session-planning-btn"').click();
52+
53+
cy.get('[data-testid="trial-session-planning-report-term-selector"]')
54+
.find('option')
55+
.last()
56+
.then(option => {
57+
const optionValue = option.val()!;
58+
cy.get(
59+
'[data-testid="trial-session-planning-report-term-selector"]',
60+
).select(optionValue);
61+
});
62+
63+
cy.get(
64+
'[data-testid="trial-session-planning-report-modal-term-error"]',
65+
).should('not.exist');
66+
67+
cy.get(
68+
'[data-testid="trial-session-planning-report-modal-year-error"]',
69+
).should('not.exist');
70+
});
71+
});
72+
});

shared/src/business/entities/EntityConstants.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1404,7 +1404,19 @@ export const LEGACY_TRIAL_CITY_STRINGS = LEGACY_TRIAL_CITIES.map(
14041404
trialLocation => `${trialLocation.city}, ${trialLocation.state}`,
14051405
);
14061406

1407-
export const SESSION_TERMS = ['Winter', 'Fall', 'Spring', 'Summer'];
1407+
export const SESSION_TERMS_DICT = {
1408+
WINTER: 'Winter',
1409+
FALL: 'Fall',
1410+
SPRING: 'Spring',
1411+
SUMMER: 'Summer',
1412+
} as const;
1413+
1414+
export const SESSION_TERMS = [
1415+
SESSION_TERMS_DICT.WINTER,
1416+
SESSION_TERMS_DICT.FALL,
1417+
SESSION_TERMS_DICT.SPRING,
1418+
SESSION_TERMS_DICT.SUMMER,
1419+
];
14081420

14091421
export const SESSION_TERMS_BY_MONTH = {
14101422
fall: [9, 10, 11, 12],

shared/src/business/utilities/documentGenerators/trialSessionPlanningReport.test.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import {
2+
PreviousTerm,
3+
TrialLocationData,
4+
} from '@shared/business/utilities/trialSessionPlanningReport/trialSessionPlanningReportDataTypes';
15
import { applicationContext } from '../../test/createTestApplicationContext';
26
import { generateAndVerifyPdfDiff } from './generateAndVerifyPdfDiff';
37
import { trialSessionPlanningReport } from './trialSessionPlanningReport';
@@ -13,38 +17,42 @@ describe('trialSessionPlanningReport', () => {
1317
locationData: [
1418
{
1519
allCaseCount: 5,
20+
blockedCaseCount: 0,
1621
previousTermsData: [['(S) Buch', '(R) Cohen'], [], []],
1722
regularCaseCount: 3,
1823
smallCaseCount: 2,
24+
specialCaseCount: 0,
1925
stateAbbreviation: 'AR',
2026
trialCityState: 'Little Rock, AR',
2127
},
2228
{
2329
allCaseCount: 2,
30+
blockedCaseCount: 0,
2431
previousTermsData: [[], ['(HS) Colvin'], ['(H) Guy']],
2532
regularCaseCount: 1,
2633
smallCaseCount: 1,
34+
specialCaseCount: 0,
2735
stateAbbreviation: 'AL',
2836
trialCityState: 'Mobile, AL',
2937
},
30-
],
38+
] as TrialLocationData[],
3139
previousTerms: [
3240
{
33-
name: 'fall',
41+
term: 'fall',
3442
termDisplay: 'Fall 2019',
3543
year: '2019',
3644
},
3745
{
38-
name: 'spring',
46+
term: 'spring',
3947
termDisplay: 'Spring 2019',
4048
year: '2019',
4149
},
4250
{
43-
name: 'winter',
51+
term: 'winter',
4452
termDisplay: 'Winter 2019',
4553
year: '2019',
4654
},
47-
],
55+
] as PreviousTerm[],
4856
term: 'Winter 2020',
4957
},
5058
}),

shared/src/business/utilities/documentGenerators/trialSessionPlanningReport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { DatePrintedFooter } from '@shared/business/utilities/pdfGenerator/compo
22
import {
33
PreviousTerm,
44
TrialLocationData,
5-
} from '@web-api/business/useCases/trialSessions/runTrialSessionPlanningReportInteractor';
5+
} from '@shared/business/utilities/trialSessionPlanningReport/trialSessionPlanningReportDataTypes';
66
import { ReportsMetaHeader } from '@shared/business/utilities/pdfGenerator/components/ReportsMetaHeader';
77
import { ServerApplicationContext } from '@web-api/applicationContext';
88
import { TrialSessionPlanningReport } from '@shared/business/utilities/pdfGenerator/documentTemplates/TrialSessionPlanningReport';

shared/src/business/utilities/pdfGenerator/documentTemplates/TrialSessionPlanningReport.tsx

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import {
33
PreviousTerm,
44
TrialLocationData,
5-
} from '@web-api/business/useCases/trialSessions/runTrialSessionPlanningReportInteractor';
5+
} from '@shared/business/utilities/trialSessionPlanningReport/trialSessionPlanningReportDataTypes';
66
import { PrimaryHeader } from '../components/PrimaryHeader';
77
import { ReportsHeader } from '../components/ReportsHeader';
88
import React from 'react';
@@ -40,6 +40,10 @@ export const TrialSessionPlanningReport = ({
4040
<PrimaryHeader />
4141
<ReportsHeader subtitle={term} title="Trial Session Planning Report" />
4242

43+
<CitiesNotCalendaredInPastTwoTerms
44+
locationData={locationData}
45+
></CitiesNotCalendaredInPastTwoTerms>
46+
4347
<table>
4448
<thead>
4549
<tr>
@@ -48,13 +52,25 @@ export const TrialSessionPlanningReport = ({
4852
<th>Small</th>
4953
<th>Regular</th>
5054
{previousTerms.map(getTermHeaders)}
55+
<th>Special</th>
56+
<th>Blocked</th>
5157
</tr>
5258
</thead>
5359
<tbody>
5460
{locationData &&
5561
locationData.map((trialLocation, idx) => {
5662
return (
57-
<tr key={`row-${idx}`}>
63+
<tr
64+
key={`row-${idx}`}
65+
style={{
66+
backgroundColor:
67+
getAllCitiesNotCalendaredInTwoPreviousTerms(
68+
locationData,
69+
).includes(trialLocation.trialCityState)
70+
? '#FFE396'
71+
: '',
72+
}}
73+
>
5874
<td>{trialLocation.trialCityState}</td>
5975
<td>{trialLocation.allCaseCount}</td>
6076
<td>{trialLocation.smallCaseCount}</td>
@@ -63,6 +79,8 @@ export const TrialSessionPlanningReport = ({
6379
trialLocation.previousTermsData.map(
6480
getLocationDataFactory(idx),
6581
)}
82+
<td>{trialLocation.specialCaseCount}</td>
83+
<td>{trialLocation.blockedCaseCount}</td>
6684
</tr>
6785
);
6886
})}
@@ -71,3 +89,77 @@ export const TrialSessionPlanningReport = ({
7189
</>
7290
);
7391
};
92+
93+
function getAllCitiesNotCalendaredInTwoPreviousTerms(
94+
trialLocationData: TrialLocationData[],
95+
): string[] {
96+
return trialLocationData
97+
.filter(locationData => {
98+
return (
99+
!locationData.previousTermsData[0].length &&
100+
!locationData.previousTermsData[1].length
101+
);
102+
})
103+
.map(locationData => locationData.trialCityState)
104+
.sort();
105+
}
106+
107+
export function formatCities(
108+
allCities: string[],
109+
numberOfCols: number = 4,
110+
): string[][] {
111+
const NUMBER_OF_COLUMNS = numberOfCols;
112+
const equalParts = Math.floor(allCities.length / NUMBER_OF_COLUMNS);
113+
const remainderCount = allCities.length % NUMBER_OF_COLUMNS;
114+
const results = Array.from(
115+
{ length: NUMBER_OF_COLUMNS },
116+
() => [] as string[],
117+
);
118+
119+
for (let index = 0; index < NUMBER_OF_COLUMNS; index++) {
120+
const poppedElements = allCities.splice(0, equalParts);
121+
results[index].push(...poppedElements);
122+
123+
if (remainderCount < 0) continue;
124+
if (index >= remainderCount) continue;
125+
const remainingElement = allCities.splice(0, 1);
126+
results[index].push(...remainingElement);
127+
}
128+
129+
return results;
130+
}
131+
132+
type CitiesNotCalendaredInPastTwoTermsParams = {
133+
locationData: TrialLocationData[];
134+
};
135+
136+
function CitiesNotCalendaredInPastTwoTerms({
137+
locationData,
138+
}: CitiesNotCalendaredInPastTwoTermsParams) {
139+
const cities = formatCities(
140+
getAllCitiesNotCalendaredInTwoPreviousTerms(locationData),
141+
3,
142+
);
143+
return (
144+
<>
145+
<table style={{ marginBottom: '20px', width: '100%' }}>
146+
<thead>
147+
<th colSpan={4} style={{ backgroundColor: '#FFE396' }}>
148+
Cities not calendared in two previous terms:
149+
</th>
150+
</thead>
151+
<tbody>
152+
<tr>
153+
{cities.map((cityLocations, index) => (
154+
<td key={index}>
155+
{cityLocations.map(location => (
156+
<div key={location}>{location}</div>
157+
))}
158+
</td>
159+
))}
160+
</tr>
161+
</tbody>
162+
</table>
163+
</>
164+
);
165+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export type PreviousTerm = {
2+
term: string;
3+
termDisplay: string;
4+
year: string;
5+
};
6+
7+
export type TrialLocationData = {
8+
allCaseCount: number;
9+
previousTermsData: string[][];
10+
regularCaseCount: number;
11+
smallCaseCount: number;
12+
specialCaseCount: number;
13+
stateAbbreviation: string;
14+
trialCityState: string;
15+
blockedCaseCount: number;
16+
lastVisitedDate?: string;
17+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { ClientApplicationContext } from '@web-client/applicationContext';
2+
import {
3+
PreviousTerm,
4+
TrialLocationData,
5+
} from '@shared/business/utilities/trialSessionPlanningReport/trialSessionPlanningReportDataTypes';
6+
import { get } from '../requests';
7+
8+
export const getTrialSessionPlanningReportDataInteractor = (
9+
applicationContext: ClientApplicationContext,
10+
queryParams: { term: string; year: string },
11+
): Promise<{
12+
previousTerms: PreviousTerm[];
13+
trialLocationData: TrialLocationData[];
14+
}> => {
15+
return get({
16+
applicationContext,
17+
endpoint: '/reports/planning-report',
18+
params: queryParams,
19+
});
20+
};
45 KB
Loading

web-api/src/app.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ import { getPractitionerDocumentsLambda } from './lambdas/practitioners/getPract
116116
import { getPractitionersByNameLambda } from './lambdas/practitioners/getPractitionersByNameLambda';
117117
import { getPrivatePractitionersBySearchKeyLambda } from './lambdas/users/getPrivatePractitionersBySearchKeyLambda';
118118
import { getTrialSessionDetailsLambda } from './lambdas/trialSessions/getTrialSessionDetailsLambda';
119+
import { getTrialSessionPlanningReportLambda } from '@web-api/lambdas/trialSessions/getTrialSessionPlanningReportLambda';
119120
import { getTrialSessionWorkingCopyLambda } from './lambdas/trialSessions/getTrialSessionWorkingCopyLambda';
120121
import { getTrialSessionsForJudgeActivityReportLambda } from './lambdas/reports/getTrialSessionsForJudgeActivityReportLambda';
121122
import { getTrialSessionsForJudgeLambda } from './lambdas/trialSessions/getTrialSessionsForJudgeLambda';
@@ -855,6 +856,10 @@ app.delete(
855856
'/reports/trial-calendar-pdf',
856857
lambdaWrapper(generateTrialCalendarPdfLambda),
857858
);
859+
app.get(
860+
'/reports/planning-report',
861+
lambdaWrapper(getTrialSessionPlanningReportLambda),
862+
);
858863
app.post(
859864
'/reports/planning-report',
860865
lambdaWrapper(runTrialSessionPlanningReportLambda),

0 commit comments

Comments
 (0)