Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

9600 Petitioner: Add Consolidated Card to Case Information Screen #2670

Merged
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
781e308
9596: adding consolidated cases card to external case detail [skip ci]
mrinsin Oct 10, 2022
371cf63
9596 - created test for helper, added flag to helper [skip ci]
shumway-tm Oct 10, 2022
8bae67a
9596: adding more tests [skip ci]
mrinsin Oct 10, 2022
a634a40
9596 - conditionally render consolidated cases card
shumway-tm Oct 11, 2022
6a9d7bc
9596 - add additional logic for petitioner viewing sealed case from c…
shumway-tm Oct 11, 2022
c7ef1b5
9596: updating tests [skip ci]
mrinsin Oct 11, 2022
23cd4e3
9596 - add mobile view for consolidated cases card, add tests for pet…
shumway-tm Oct 11, 2022
d1ee56c
9596: wip trying to add gap between docket number link and case title…
mrinsin Oct 11, 2022
09621fa
9596: adding bottom margin in mobile view
mrinsin Oct 11, 2022
649b41e
9596 - center align items in card for very small mobile screens
shumway-tm Oct 11, 2022
78e663f
9600: WIP adding failing tests [skip ci]
mrinsin Oct 12, 2022
d0835c8
9600: adding view consolidated card permission to practitioners
mrinsin Oct 12, 2022
c23559e
9596 - add mobile view for card
shumway-tm Oct 13, 2022
3ddd3ce
9596: fixing mobile tablet and desktop style after discussing with UX
mrinsin Oct 13, 2022
516cb36
Merge branch '9596-add-consolidated-card' into 9600-practitioner-cons…
mrinsin Oct 13, 2022
c5f8fa7
9596 - align itens to baseline
shumway-tm Oct 14, 2022
5e48f8c
Merge branch '9596-add-consolidated-card' of https://github.com/flexi…
shumway-tm Oct 14, 2022
150066e
Merge remote-tracking branch 'ustc/staging' into 9600-practitioner-co…
mrinsin Oct 14, 2022
41b4bb7
Merge branch 'staging' into 9600-practitioner-consolidated-card
rosiehsmith Oct 27, 2022
c78a51a
Merge branch 'staging' into 9600-practitioner-consolidated-card
mmarcotte Oct 27, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions shared/src/authorization/authorizationClientService.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ const ROLE_PERMISSIONS = {
UPDATE_CASE_CONTEXT: 'UPDATE_CASE_CONTEXT',
UPDATE_CONTACT_INFO: 'UPDATE_CONTACT_INFO',
UPLOAD_DOCUMENT: 'UPLOAD_DOCUMENT',
VIEW_CONSOLIDATED_CASES_CARD: 'VIEW_CONSOLIDATED_CASES_CARD',
VIEW_DOCUMENTS: 'VIEW_DOCUMENTS',
VIEW_MESSAGES: 'VIEW_MESSAGES',
VIEW_PRACTITIONER_CASE_LIST: 'VIEW_PRACTITIONER_CASE_LIST',
Expand Down Expand Up @@ -190,6 +191,7 @@ const AUTHORIZATION_MAP = {
ROLE_PERMISSIONS.GET_USER_PENDING_EMAIL_STATUS,
ROLE_PERMISSIONS.UPDATE_CONTACT_INFO,
ROLE_PERMISSIONS.UPLOAD_DOCUMENT,
ROLE_PERMISSIONS.VIEW_CONSOLIDATED_CASES_CARD,
ROLE_PERMISSIONS.VIEW_DOCUMENTS,
],
irsSuperuser: [
Expand Down Expand Up @@ -217,6 +219,7 @@ const AUTHORIZATION_MAP = {
ROLE_PERMISSIONS.UPDATE_CONTACT_INFO,
ROLE_PERMISSIONS.UPLOAD_DOCUMENT,
ROLE_PERMISSIONS.VIEW_DOCUMENTS,
ROLE_PERMISSIONS.VIEW_CONSOLIDATED_CASES_CARD,
],
petitionsclerk: petitionsClerkPermissions,
privatePractitioner: [
Expand All @@ -230,6 +233,7 @@ const AUTHORIZATION_MAP = {
ROLE_PERMISSIONS.PETITION,
ROLE_PERMISSIONS.UPDATE_CONTACT_INFO,
ROLE_PERMISSIONS.UPLOAD_DOCUMENT,
ROLE_PERMISSIONS.VIEW_CONSOLIDATED_CASES_CARD,
ROLE_PERMISSIONS.VIEW_DOCUMENTS,
],
reportersOffice: allInternalUserPermissions,
Expand Down
2 changes: 1 addition & 1 deletion web-api/storage/fixtures/seed/efcms-local.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
"entityName": "Petitioner",
"name": "Astra Santiago",
"state": "NY",
"email": "petitioner@example.com"
"email": "petitioner2@example.com"
}
],
"initialDocketNumberSuffix": "L",
Expand Down
11 changes: 10 additions & 1 deletion web-client/src/presenter/computeds/caseDetailHelper.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable complexity */
import { isEmpty } from 'lodash';
import { state } from 'cerebral';

Expand Down Expand Up @@ -67,8 +68,15 @@ export const caseDetailHelper = (get, applicationContext) => {
user.role === USER_ROLES.irsPractitioner ||
user.role === USER_ROLES.privatePractitioner;

const isPetitioner = user.role === USER_ROLES.petitioner;

const showSealedCaseView =
isPractitioner && !!caseDetail.isSealed && !userAssociatedWithCase;
(isPractitioner || isPetitioner) &&
!!caseDetail.isSealed &&
!userAssociatedWithCase;

const showConsolidatedCasesCard =
permissions.VIEW_CONSOLIDATED_CASES_CARD && !!caseDetail.leadDocketNumber;

return {
caseDeadlines,
Expand All @@ -83,6 +91,7 @@ export const caseDetailHelper = (get, applicationContext) => {
showCaseDeadlinesInternal,
showCaseDeadlinesInternalEmpty,
showCaseInformationExternal: isExternalUser,
showConsolidatedCasesCard,
showDocketRecordInProgressState: !isExternalUser,
showEditCaseDetailsButton: permissions.EDIT_CASE_DETAILS,
showFileDocumentButton,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import {
adcUser,
irsPractitionerUser,
petitionerUser,
privatePractitionerUser,
} from '../../../../shared/src/test/mockUsers';
import { applicationContextForClient as applicationContext } from '../../../../shared/src/business/test/createTestApplicationContext';
import { caseDetailHelper as caseDetailHelperComputed } from './caseDetailHelper';
import { getUserPermissions } from '../../../../shared/src/authorization/getUserPermissions';
import { runCompute } from 'cerebral/test';
import { withAppContextDecorator } from '../../withAppContext';

const caseDetailHelper = withAppContextDecorator(caseDetailHelperComputed, {
...applicationContext,
getCurrentUser: () => {
return globalUser;
},
});

let globalUser;

const getBaseState = user => {
globalUser = user;
return {
permissions: getUserPermissions(user),
};
};

describe('showConsolidatedCasesCard', () => {
it('should be true when the user is a petitioner and the case is in a consolidated group', () => {
const user = petitionerUser;

const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(user),
caseDetail: {
docketEntries: [],
leadDocketNumber: '101-22F',
},
},
});
expect(result.showConsolidatedCasesCard).toEqual(true);
});

it('should be true when the user is a private practitioner and the case is in a consolidated group', () => {
const user = privatePractitionerUser;

const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(user),
caseDetail: {
docketEntries: [],
leadDocketNumber: '101-22F',
},
},
});
expect(result.showConsolidatedCasesCard).toEqual(true);
});

it('should be true when the user is an IRS practitioner and the case is in a consolidated group', () => {
const user = irsPractitionerUser;

const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(user),
caseDetail: {
docketEntries: [],
leadDocketNumber: '101-22F',
},
},
});
expect(result.showConsolidatedCasesCard).toEqual(true);
});

it('should be false when the user is a non practitioner/petitioner user and the case is in a consolidated group', () => {
const user = adcUser;

const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(user),
caseDetail: {
docketEntries: [],
leadDocketNumber: '101-22F',
},
},
});

expect(result.showConsolidatedCasesCard).toEqual(false);
});

it('should be false when the case is not in a consolidated group and the user has VIEW_CONSOLIDATED_CASES_CARD permission', () => {
const user = petitionerUser;

const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(user),
caseDetail: {
docketEntries: [],
leadDocketNumber: undefined,
},
},
});

expect(result.showConsolidatedCasesCard).toEqual(false);
});
});
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import { applicationContextForClient as applicationContext } from '../../../../shared/src/business/test/createTestApplicationContext';
import { caseDetailHelper as caseDetailHelperComputed } from './caseDetailHelper';
import { getUserPermissions } from '../../../../shared/src/authorization/getUserPermissions';
import {
docketClerkUser,
irsPractitionerUser,
petitionerUser,
petitionsClerkUser,
privatePractitionerUser,
} from '../../../../shared/src/test/mockUsers';
import { getUserPermissions } from '../../../../shared/src/authorization/getUserPermissions';
import { runCompute } from 'cerebral/test';
import { withAppContextDecorator } from '../../withAppContext';

Expand Down Expand Up @@ -62,29 +60,59 @@ describe('showSealedCaseView', () => {
expect(result.showSealedCaseView).toEqual(false);
});

const nonPractitionerUsers = [
docketClerkUser,
petitionerUser,
petitionsClerkUser,
];
it('should be true for a unassociated private practitioner user with a sealed case', () => {
const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(privatePractitionerUser),
caseDetail: {
docketEntries: [],
isSealed: true,
privatePractitioners: [],
},
screenMetadata: {
isAssociated: false,
},
},
});

expect(result.showSealedCaseView).toEqual(true);
});

nonPractitionerUsers.forEach(user => {
it(`should be false for a non practitioner ${user} user`, () => {
const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(user),
caseDetail: {
docketEntries: [],
isSealed: true,
privatePractitioners: [],
},
screenMetadata: {
isAssociated: false,
},
it('should be true for a unassociated IRS practitioner user with a sealed case', () => {
const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(irsPractitionerUser),
caseDetail: {
docketEntries: [],
isSealed: true,
privatePractitioners: [],
},
screenMetadata: {
isAssociated: false,
},
});
},
});

expect(result.showSealedCaseView).toEqual(true);
});

expect(result.showSealedCaseView).toEqual(false);
it('should be true for an unassociated petitioner associated with a different case in the consolidated group', () => {
const result = runCompute(caseDetailHelper, {
state: {
...getBaseState(petitionerUser),
caseDetail: {
docketEntries: [],
docketNumber: '198-23',
isSealed: true,
leadDocketNumber: '199-23',
privatePractitioners: [],
},
screenMetadata: {
isAssociated: false,
},
},
});

expect(result.showSealedCaseView).toEqual(true);
});
});
4 changes: 4 additions & 0 deletions web-client/src/styles/custom.scss
Original file line number Diff line number Diff line change
Expand Up @@ -2023,3 +2023,7 @@ button.change-scanner-button {
.width-180 {
width: 180px;
}

.align-items-baseline {
align-items: baseline;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { CaseLink } from '../../../ustc-ui/CaseLink/CaseLink';
import { Mobile, NonMobile } from '../../../ustc-ui/Responsive/Responsive';
import { connect } from '@cerebral/react';
import { props } from 'cerebral';
import React from 'react';
Expand All @@ -12,16 +13,28 @@ export const ConsolidatedCases = connect(
return (
<>
{!caseDetailHelper.hasConsolidatedCases && <p>Not consolidated</p>}
<div className="grid-container padding-left-0">
<div className="grid-container padding-left-0 margin-bottom-2">
{caseDetail.consolidatedCases.map(consolidatedCase => (
<div
className="grid-row margin-top-3"
className="grid-row margin-top-3 align-items-baseline"
key={consolidatedCase.docketNumber}
>
<div className="grid-col-2">
<CaseLink formattedCase={consolidatedCase} />
</div>
<div className="grid-col-10">{consolidatedCase.caseTitle}</div>
<NonMobile>
<div className="tablet:grid-col-3 desktop:grid-col-2">
<CaseLink formattedCase={consolidatedCase} />
</div>
<div className="tablet:grid-col-9 desktop:grid-col-10">
{consolidatedCase.caseTitle}
</div>
</NonMobile>
<Mobile>
<div className="grid-col-4">
<CaseLink formattedCase={consolidatedCase} />
</div>
<div className="grid-col-8 margin-left-neg-2">
{consolidatedCase.caseTitle}
</div>
</Mobile>
</div>
))}
</div>
Expand Down
27 changes: 27 additions & 0 deletions web-client/src/views/CaseDetail/CaseInformationExternal.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Button } from '../../ustc-ui/Button/Button';
import { ConsolidatedCases } from './CaseInformation/ConsolidatedCases';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { If } from '../../ustc-ui/If/If';
import { Mobile, NonMobile } from '../../ustc-ui/Responsive/Responsive';
Expand Down Expand Up @@ -124,6 +125,21 @@ export const CaseInformationExternal = connect(
</div>
</div>
</div>
<div className="grid-row grid-gap margin-top-4">
<div className="tablet:grid-col-6">
{caseDetailHelper.showConsolidatedCasesCard && (
<div className="card height-full">
<div className="content-wrapper">
<h3 className="underlined">Consolidated Cases</h3>
<ConsolidatedCases
caseDetail={formattedCaseDetail}
caseDetailHelper={caseDetailHelper}
/>
</div>
</div>
)}
</div>
</div>
</div>
</NonMobile>
<Mobile>
Expand Down Expand Up @@ -160,6 +176,17 @@ export const CaseInformationExternal = connect(
<TrialInformation caseDetail={formattedCaseDetail} />
</div>
</div>
{caseDetailHelper.showConsolidatedCasesCard && (
<div className="margin-top-2">
<div className="case-info-card">
<h3>Consolidated Cases</h3>
<ConsolidatedCases
caseDetail={formattedCaseDetail}
caseDetailHelper={caseDetailHelper}
/>
</div>
</div>
)}
</div>
</Mobile>
</div>
Expand Down