diff --git a/shared/src/business/entities/Message.js b/shared/src/business/entities/Message.js index 69c2e84fa32..e18d2f42e89 100644 --- a/shared/src/business/entities/Message.js +++ b/shared/src/business/entities/Message.js @@ -17,37 +17,49 @@ function Message() { } Message.prototype.init = function init(rawMessage, { applicationContext }) { + messageDecorator(this, rawMessage, { applicationContext }); +}; + +const messageDecorator = ( + messageEntity, + rawMessage, + { applicationContext }, +) => { if (!applicationContext) { throw new TypeError('applicationContext must be defined'); } - this.attachments = (rawMessage.attachments || []).map(attachment => ({ - documentId: attachment.documentId, - })); - this.caseStatus = rawMessage.caseStatus; - this.caseTitle = rawMessage.caseTitle; - this.completedAt = rawMessage.completedAt; - this.completedBy = rawMessage.completedBy; - this.completedBySection = rawMessage.completedBySection; - this.completedByUserId = rawMessage.completedByUserId; - this.completedMessage = rawMessage.completedMessage; - this.createdAt = rawMessage.createdAt || createISODateString(); - this.leadDocketNumber = rawMessage.leadDocketNumber; - this.docketNumber = rawMessage.docketNumber; - this.docketNumberWithSuffix = rawMessage.docketNumberWithSuffix; - this.from = rawMessage.from; - this.fromSection = rawMessage.fromSection; - this.fromUserId = rawMessage.fromUserId; - this.isCompleted = rawMessage.isCompleted || false; - this.isRead = rawMessage.isRead || false; - this.isRepliedTo = rawMessage.isRepliedTo || false; - this.message = rawMessage.message; - this.messageId = rawMessage.messageId || applicationContext.getUniqueId(); - this.parentMessageId = rawMessage.parentMessageId || this.messageId; - this.subject = rawMessage.subject; - this.to = rawMessage.to; - this.toSection = rawMessage.toSection; - this.toUserId = rawMessage.toUserId; + messageEntity.attachments = (rawMessage.attachments || []).map( + attachment => ({ + documentId: attachment.documentId, + }), + ); + messageEntity.caseStatus = rawMessage.caseStatus; + messageEntity.caseTitle = rawMessage.caseTitle; + messageEntity.completedAt = rawMessage.completedAt; + messageEntity.completedBy = rawMessage.completedBy; + messageEntity.completedBySection = rawMessage.completedBySection; + messageEntity.completedByUserId = rawMessage.completedByUserId; + messageEntity.completedMessage = rawMessage.completedMessage; + messageEntity.createdAt = rawMessage.createdAt || createISODateString(); + messageEntity.leadDocketNumber = rawMessage.leadDocketNumber; + messageEntity.docketNumber = rawMessage.docketNumber; + messageEntity.docketNumberWithSuffix = rawMessage.docketNumberWithSuffix; + messageEntity.from = rawMessage.from; + messageEntity.fromSection = rawMessage.fromSection; + messageEntity.fromUserId = rawMessage.fromUserId; + messageEntity.isCompleted = rawMessage.isCompleted || false; + messageEntity.isRead = rawMessage.isRead || false; + messageEntity.isRepliedTo = rawMessage.isRepliedTo || false; + messageEntity.message = rawMessage.message; + messageEntity.messageId = + rawMessage.messageId || applicationContext.getUniqueId(); + messageEntity.parentMessageId = + rawMessage.parentMessageId || messageEntity.messageId; + messageEntity.subject = rawMessage.subject; + messageEntity.to = rawMessage.to; + messageEntity.toSection = rawMessage.toSection; + messageEntity.toUserId = rawMessage.toUserId; }; Message.VALIDATION_ERROR_MESSAGES = { @@ -205,4 +217,7 @@ Message.prototype.addAttachment = function (attachmentToAdd) { return this; }; -exports.Message = validEntityDecorator(Message); +module.exports = { + Message: validEntityDecorator(Message), + messageDecorator, +}; diff --git a/shared/src/business/entities/MessageResult.js b/shared/src/business/entities/MessageResult.js new file mode 100644 index 00000000000..c8acdc45386 --- /dev/null +++ b/shared/src/business/entities/MessageResult.js @@ -0,0 +1,56 @@ +const joi = require('joi'); +const { + joiValidationDecorator, + validEntityDecorator, +} = require('./JoiValidationDecorator'); +const { + TRIAL_CITY_STRINGS, + TRIAL_LOCATION_MATCHER, +} = require('./EntityConstants'); +const { JoiValidationConstants } = require('./JoiValidationConstants'); +const { messageDecorator } = require('./Message'); + +/** + * constructor + * + * @param {object} rawMessage the raw message data + * @constructor + */ +function MessageResult() { + this.entityName = 'MessageResult'; +} + +MessageResult.prototype.init = function init( + rawMessage, + { applicationContext }, +) { + messageDecorator(this, rawMessage, { applicationContext }); + this.trialDate = rawMessage.trialDate; + this.trialLocation = rawMessage.trialLocation; +}; + +MessageResult.VALIDATION_RULES = { + trialDate: joi + .alternatives() + .optional() + .description('When this case goes to trial.'), + trialLocation: joi + .alternatives() + .try( + JoiValidationConstants.STRING.valid(...TRIAL_CITY_STRINGS, null), + JoiValidationConstants.STRING.pattern(TRIAL_LOCATION_MATCHER), + JoiValidationConstants.STRING.valid('Standalone Remote'), + ) + .optional() + .description( + 'Where this case goes to trial. This may be different that the preferred trial location.', + ), +}; + +joiValidationDecorator( + MessageResult, + joi.object().keys(MessageResult.VALIDATION_RULES), + MessageResult.VALIDATION_ERROR_MESSAGES, +); + +exports.MessageResult = validEntityDecorator(MessageResult); diff --git a/shared/src/business/entities/MessageResult.test.js b/shared/src/business/entities/MessageResult.test.js new file mode 100644 index 00000000000..680c23a31d6 --- /dev/null +++ b/shared/src/business/entities/MessageResult.test.js @@ -0,0 +1,47 @@ +const { applicationContext } = require('../test/createTestApplicationContext'); +const { CASE_STATUS_TYPES, PETITIONS_SECTION } = require('./EntityConstants'); +const { MessageResult } = require('./MessageResult'); + +describe('MessageResult', () => { + const mockRawMessageResult = { + caseStatus: CASE_STATUS_TYPES.generalDocket, + caseTitle: 'The Land Before Time', + createdAt: '2019-03-01T21:40:46.415Z', + docketNumber: '123-20', + docketNumberWithSuffix: '123-45S', + from: 'Test Petitionsclerk', + fromSection: PETITIONS_SECTION, + fromUserId: '4791e892-14ee-4ab1-8468-0c942ec379d2', + isCompleted: false, + isRead: false, + isRepliedTo: false, + message: 'hey there', + messageId: 'a10d6855-f3ee-4c11-861c-c7f11cba4dff', + parentMessageId: '31687a1e-3640-42cd-8e7e-a8e6df39ce9a', + subject: 'hello', + to: 'Test Petitionsclerk2', + toSection: PETITIONS_SECTION, + toUserId: '449b916e-3362-4a5d-bf56-b2b94ba29c12', + trialDate: '2029-03-01T21:40:46.415Z', + trialLocation: 'Denver, Colorado', + }; + + it('should create a valid MessageResult', () => { + const messageResult = new MessageResult(mockRawMessageResult, { + applicationContext, + }); + + expect(messageResult.isValid()).toBeTruthy(); + }); + + it('should fail validation when trialLocation is not one of TRIAL_CITY_STRINGS or StandaloneRemote', () => { + const messageResult = new MessageResult( + { ...mockRawMessageResult, trialLocation: 'New Delhi, India' }, + { + applicationContext, + }, + ); + + expect(messageResult.isValid()).toBeFalsy(); + }); +}); diff --git a/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.test.ts b/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.test.ts index 5fb90bf6903..d80e6d8214d 100644 --- a/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.test.ts +++ b/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.test.ts @@ -30,7 +30,7 @@ describe('getInboxMessagesForSectionInteractor', () => { createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', - entityName: 'Message', + entityName: 'MessageResult', from: 'Test Petitionsclerk2', fromSection: PETITIONS_SECTION, fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', @@ -44,6 +44,8 @@ describe('getInboxMessagesForSectionInteractor', () => { to: 'Test Petitionsclerk', toSection: PETITIONS_SECTION, toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + trialDate: '2028-03-01T21:40:46.415Z', + trialLocation: 'El Paso, Texas', }; applicationContext.getCurrentUser.mockReturnValue({ role: ROLES.petitionsClerk, diff --git a/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.ts b/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.ts index 911b11a60ce..67e9c2bf069 100644 --- a/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.ts +++ b/shared/src/business/useCases/messages/getInboxMessagesForSectionInteractor.ts @@ -1,4 +1,4 @@ -import { Message } from '../../entities/Message'; +import { MessageResult } from '../../entities/MessageResult'; import { ROLE_PERMISSIONS, isAuthorized, @@ -30,7 +30,7 @@ export const getInboxMessagesForSectionInteractor = async ( section, }); - return Message.validateRawCollection(messages, { + return MessageResult.validateRawCollection(messages, { applicationContext, }); }; diff --git a/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.test.ts b/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.test.ts index 52a90505a77..9fec8a6f671 100644 --- a/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.test.ts +++ b/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.test.ts @@ -30,7 +30,7 @@ describe('getInboxMessagesForUserInteractor', () => { createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', - entityName: 'Message', + entityName: 'MessageResult', from: 'Test Petitionsclerk2', fromSection: PETITIONS_SECTION, fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', @@ -44,6 +44,8 @@ describe('getInboxMessagesForUserInteractor', () => { to: 'Test Petitionsclerk', toSection: PETITIONS_SECTION, toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + trialDate: '2028-03-01T21:40:46.415Z', + trialLocation: 'El Paso, Texas', }; applicationContext.getCurrentUser.mockReturnValue({ role: ROLES.petitionsClerk, diff --git a/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.ts b/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.ts index be637870e75..acfb55b9700 100644 --- a/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.ts +++ b/shared/src/business/useCases/messages/getInboxMessagesForUserInteractor.ts @@ -1,4 +1,4 @@ -import { Message } from '../../entities/Message'; +import { MessageResult } from '../../entities/MessageResult'; import { ROLE_PERMISSIONS, isAuthorized, @@ -30,7 +30,7 @@ export const getInboxMessagesForUserInteractor = async ( userId, }); - return Message.validateRawCollection(messages, { + return MessageResult.validateRawCollection(messages, { applicationContext, }); }; diff --git a/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.test.ts b/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.test.ts index 603b001d6b6..0e3ade0ad1d 100644 --- a/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.test.ts +++ b/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.test.ts @@ -30,7 +30,7 @@ describe('getOutboxMessagesForSectionInteractor', () => { createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', - entityName: 'Message', + entityName: 'MessageResult', from: 'Test Petitionsclerk2', fromSection: PETITIONS_SECTION, fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', @@ -44,6 +44,8 @@ describe('getOutboxMessagesForSectionInteractor', () => { to: 'Test Petitionsclerk', toSection: PETITIONS_SECTION, toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + trialDate: '2028-03-01T21:40:46.415Z', + trialLocation: 'El Paso, Texas', }; applicationContext.getCurrentUser.mockReturnValue({ role: ROLES.petitionsClerk, diff --git a/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.ts b/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.ts index 6fc9616612e..3dc6cc31511 100644 --- a/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.ts +++ b/shared/src/business/useCases/messages/getOutboxMessagesForSectionInteractor.ts @@ -1,4 +1,4 @@ -import { Message } from '../../entities/Message'; +import { MessageResult } from '../../entities/MessageResult'; import { ROLE_PERMISSIONS, isAuthorized, @@ -30,7 +30,7 @@ export const getOutboxMessagesForSectionInteractor = async ( section, }); - return Message.validateRawCollection(messages, { + return MessageResult.validateRawCollection(messages, { applicationContext, }); }; diff --git a/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.test.ts b/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.test.ts index 8d45fe2f73d..10a10df62fb 100644 --- a/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.test.ts +++ b/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.test.ts @@ -30,7 +30,7 @@ describe('getOutboxMessagesForUserInteractor', () => { createdAt: '2019-03-01T21:40:46.415Z', docketNumber: '123-45', docketNumberWithSuffix: '123-45S', - entityName: 'Message', + entityName: 'MessageResult', from: 'Test Petitionsclerk2', fromSection: PETITIONS_SECTION, fromUserId: 'fe6eeadd-e4e8-4e56-9ddf-0ebe9516df6b', @@ -44,6 +44,8 @@ describe('getOutboxMessagesForUserInteractor', () => { to: 'Test Petitionsclerk', toSection: PETITIONS_SECTION, toUserId: 'b427ca37-0df1-48ac-94bb-47aed073d6f7', + trialDate: '2028-03-01T21:40:46.415Z', + trialLocation: 'El Paso, Texas', }; applicationContext.getCurrentUser.mockReturnValue({ role: ROLES.petitionsClerk, diff --git a/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.ts b/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.ts index 08a451e35ed..3d0b8ffbd9a 100644 --- a/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.ts +++ b/shared/src/business/useCases/messages/getOutboxMessagesForUserInteractor.ts @@ -1,4 +1,4 @@ -import { Message } from '../../entities/Message'; +import { MessageResult } from '../../entities/MessageResult'; import { ROLE_PERMISSIONS, isAuthorized, @@ -30,7 +30,7 @@ export const getOutboxMessagesForUserInteractor = async ( userId, }); - return Message.validateRawCollection(messages, { + return MessageResult.validateRawCollection(messages, { applicationContext, }); }; diff --git a/shared/src/business/utilities/abbreviateState.js b/shared/src/business/utilities/abbreviateState.js new file mode 100644 index 00000000000..98da069ecb3 --- /dev/null +++ b/shared/src/business/utilities/abbreviateState.js @@ -0,0 +1,20 @@ +import { US_STATES } from '../entities/EntityConstants'; +import { invert } from 'lodash'; + +/** + * abbreviates the state given a string with a comma separated city and state + * + * @param {string} locationString the location string to format + * @returns {string} a formatted string with the abbreviated state + */ +const abbreviateState = locationString => { + const cityAndState = locationString.split(', '); + const stateAbbreviation = invert(US_STATES)[cityAndState[1]]; + const formattedCityAndState = `${cityAndState[0]}, ${stateAbbreviation}`; + + return formattedCityAndState; +}; + +module.exports = { + abbreviateState, +}; diff --git a/shared/src/business/utilities/abbreviateState.test.js b/shared/src/business/utilities/abbreviateState.test.js new file mode 100644 index 00000000000..442e579ba5e --- /dev/null +++ b/shared/src/business/utilities/abbreviateState.test.js @@ -0,0 +1,12 @@ +const { abbreviateState } = require('./abbreviateState'); + +describe('abbreviateState', () => { + it('should return a string with an abbreviated state when passed a comma separated city and unabbreviated state', () => { + const locationString = 'Denver, Colorado'; + const expectedResult = 'Denver, CO'; + + const result = abbreviateState(locationString); + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/shared/src/persistence/elasticsearch/helpers/searchClauses.js b/shared/src/persistence/elasticsearch/helpers/searchClauses.js index 4019cbcb8e0..78529841eba 100644 --- a/shared/src/persistence/elasticsearch/helpers/searchClauses.js +++ b/shared/src/persistence/elasticsearch/helpers/searchClauses.js @@ -31,7 +31,12 @@ const GET_PARENT_CASE = { has_parent: { inner_hits: { _source: { - includes: ['leadDocketNumber', 'docketNumber'], + includes: [ + 'leadDocketNumber', + 'docketNumber', + 'trialDate', + 'trialLocation', + ], }, name: 'case-mappings', }, diff --git a/web-api/elasticsearch/efcms-case-mappings.js b/web-api/elasticsearch/efcms-case-mappings.js index 65611436b6d..be5d4c75a79 100644 --- a/web-api/elasticsearch/efcms-case-mappings.js +++ b/web-api/elasticsearch/efcms-case-mappings.js @@ -99,6 +99,12 @@ module.exports = { 'status.S': { type: 'keyword', }, + 'trialDate.S': { + type: 'date', + }, + 'trialLocation.S': { + type: 'keyword', + }, 'userId.S': { type: 'keyword', }, diff --git a/web-api/storage/fixtures/seed/efcms-local.json b/web-api/storage/fixtures/seed/efcms-local.json index 64e84ad239a..e7a78d16f9b 100644 --- a/web-api/storage/fixtures/seed/efcms-local.json +++ b/web-api/storage/fixtures/seed/efcms-local.json @@ -4552,7 +4552,14 @@ "partySecondary": false, "pk": "case|103-20", "documentTitle": "Petition", - "docketNumber": "103-20" + "docketNumber": "103-20", + "servedParties": [ + { + "name": "Reuben Blair", + "email": "petitioner@example.com" + } + ], + "servedAt": "2020-09-25T19:27:16.630Z" }, { "isStricken": false, diff --git a/web-client/integration-tests/messagesTableJourney.test.js b/web-client/integration-tests/messagesTableJourney.test.js new file mode 100644 index 00000000000..5407b73ea54 --- /dev/null +++ b/web-client/integration-tests/messagesTableJourney.test.js @@ -0,0 +1,92 @@ +import { CASE_STATUS_TYPES } from '../../shared/src/business/entities/EntityConstants'; +import { createNewMessageOnCase } from './journey/createNewMessageOnCase'; +import { loginAs, setupTest } from './helpers'; + +describe('messages table journey', () => { + const cerebralTest = setupTest(); + const calendaredCaseDocketNumber = '103-20'; + const expectedMessageResult = { + caseStatus: CASE_STATUS_TYPES.calendared, + docketNumber: calendaredCaseDocketNumber, + trialDate: '2020-11-27T05:00:00.000Z', + trialLocation: 'Houston, Texas', + }; + + beforeAll(() => { + jest.setTimeout(40000); + jest.spyOn( + cerebralTest.applicationContext.getUseCases(), + 'createMessageInteractor', + ); + }); + + afterAll(() => { + cerebralTest.closeSocket(); + }); + + loginAs(cerebralTest, 'petitionsclerk@example.com'); + createNewMessageOnCase(cerebralTest, { + docketNumber: calendaredCaseDocketNumber, + }); + + it('petitions clerk views case trial information from section sent messages view', async () => { + await cerebralTest.runSequence('gotoMessagesSequence', { + box: 'outbox', + queue: 'section', + }); + + const messages = cerebralTest.getState('messages'); + + const foundMessage = messages.find( + message => message.docketNumber === calendaredCaseDocketNumber, + ); + + expect(foundMessage).toMatchObject(expectedMessageResult); + }); + + it('petitions clerk views case trial information from individual sent messages view', async () => { + await cerebralTest.runSequence('gotoMessagesSequence', { + box: 'outbox', + queue: 'my', + }); + + const messages = cerebralTest.getState('messages'); + + const foundMessage = messages.find( + message => message.docketNumber === calendaredCaseDocketNumber, + ); + + expect(foundMessage).toMatchObject(expectedMessageResult); + }); + + loginAs(cerebralTest, 'petitionsclerk1@example.com'); + it('petitions clerk 1 views case trial information from messages individual inbox view', async () => { + await cerebralTest.runSequence('gotoMessagesSequence', { + box: 'inbox', + queue: 'my', + }); + + const messages = cerebralTest.getState('messages'); + + const foundMessage = messages.find( + message => message.docketNumber === calendaredCaseDocketNumber, + ); + + expect(foundMessage).toMatchObject(expectedMessageResult); + }); + + it('petitions clerk 1 views case trial information from messages section inbox view', async () => { + await cerebralTest.runSequence('gotoMessagesSequence', { + box: 'inbox', + queue: 'section', + }); + + const messages = cerebralTest.getState('messages'); + + const foundMessage = messages.find( + message => message.docketNumber === calendaredCaseDocketNumber, + ); + + expect(foundMessage).toMatchObject(expectedMessageResult); + }); +}); diff --git a/web-client/src/applicationContext.js b/web-client/src/applicationContext.js index 632faf4be31..cbf956591bf 100644 --- a/web-client/src/applicationContext.js +++ b/web-client/src/applicationContext.js @@ -67,6 +67,7 @@ const { getWorkQueueFilters, } = require('../../shared/src/business/utilities/getWorkQueueFilters'); import { User } from '../../shared/src/business/entities/User'; +import { abbreviateState } from '../../shared/src/business/utilities/abbreviateState'; import { addCaseToTrialSessionInteractor } from '../../shared/src/proxies/trialSessions/addCaseToTrialSessionProxy'; import { addConsolidatedCaseInteractor } from '../../shared/src/proxies/addConsolidatedCaseProxy'; import { addCoversheetInteractor } from '../../shared/src/proxies/documents/addCoversheetProxy'; @@ -697,6 +698,7 @@ const applicationContext = { getUserPermissions, getUtilities: () => { return { + abbreviateState, aggregatePartiesForService, calculateISODate, canAllowDocumentServiceForCase, diff --git a/web-client/src/presenter/computeds/formattedMessages.js b/web-client/src/presenter/computeds/formattedMessages.js index 02fae35926d..68e979c394c 100644 --- a/web-client/src/presenter/computeds/formattedMessages.js +++ b/web-client/src/presenter/computeds/formattedMessages.js @@ -6,6 +6,8 @@ import { import { state } from 'cerebral'; export const formattedMessages = (get, applicationContext) => { + const { STATUS_TYPES } = applicationContext.getConstants(); + const tableSort = get(state.tableSort); const { completedMessages, messages } = getFormattedMessages({ @@ -15,6 +17,18 @@ export const formattedMessages = (get, applicationContext) => { tableSort, }); + messages.forEach(message => { + message.showTrialInformation = + message.caseStatus === STATUS_TYPES.calendared; + + if (message.showTrialInformation) { + setTrialInformationOnMessage({ + applicationContext, + message, + }); + } + }); + const { box } = get(state.messageBoxToDisplay); const { role } = get(state.user); const { USER_ROLES } = applicationContext.getConstants(); @@ -56,3 +70,19 @@ export const formattedMessages = (get, applicationContext) => { return sharedComputedResult; }; + +const setTrialInformationOnMessage = ({ applicationContext, message }) => { + const { TRIAL_SESSION_SCOPE_TYPES } = applicationContext.getConstants(); + + if (message.trialLocation !== TRIAL_SESSION_SCOPE_TYPES.standaloneRemote) { + message.formattedTrialLocation = applicationContext + .getUtilities() + .abbreviateState(message.trialLocation); + } else { + message.formattedTrialLocation = message.trialLocation; + } + + message.formattedTrialDate = applicationContext + .getUtilities() + .formatDateString(message.trialDate, 'MMDDYY'); +}; diff --git a/web-client/src/presenter/computeds/formattedMessages.test.js b/web-client/src/presenter/computeds/formattedMessages.test.js index 356faaf7806..9e935a0a995 100644 --- a/web-client/src/presenter/computeds/formattedMessages.test.js +++ b/web-client/src/presenter/computeds/formattedMessages.test.js @@ -1,9 +1,12 @@ /* eslint-disable max-lines */ +import { applicationContextForClient as applicationContext } from '../../../../shared/src/business/test/createTestApplicationContext'; import { formattedMessages as formattedMessagesComputed } from './formattedMessages'; import { runCompute } from 'cerebral/test'; import { withAppContextDecorator } from '../../withAppContext'; describe('formattedMessages', () => { + const { STATUS_TYPES, TRIAL_SESSION_SCOPE_TYPES } = + applicationContext.getConstants(); const formattedMessages = withAppContextDecorator(formattedMessagesComputed); it('returns filtered messages sorted oldest to newest and completedMessages from state.messages when messageBoxToDisplay.box is inbox', () => { @@ -488,4 +491,117 @@ describe('formattedMessages', () => { expect(result.messages.length).toEqual(2); }); + + it('should set showTrialInformation to true when caseStatus is calendared', () => { + const mockCalendaredMessage = { + caseStatus: STATUS_TYPES.calendared, + completedAt: '2019-01-02T16:29:13.122Z', + createdAt: '2019-01-01T16:29:13.122Z', + docketNumber: '101-20', + message: 'This is a test message', + trialDate: '2025-01-01T16:29:13.122Z', + trialLocation: 'Austin, TX', + }; + const result = runCompute(formattedMessages, { + state: { + messageBoxToDisplay: { + box: 'outbox', + }, + messages: [mockCalendaredMessage], + screenMetadata: {}, + user: { + role: 'adc', + }, + }, + }); + + expect(result.messages[0].showTrialInformation).toBe(true); + }); + + it('should set showTrialInformation to false when caseStatus is NOT calendared', () => { + const mockCalendaredMessage = { + caseStatus: STATUS_TYPES.new, + completedAt: '2019-01-02T16:29:13.122Z', + createdAt: '2019-01-01T16:29:13.122Z', + docketNumber: '101-20', + message: 'This is a test message', + }; + + const result = runCompute(formattedMessages, { + state: { + messageBoxToDisplay: { + box: 'outbox', + }, + messages: [mockCalendaredMessage], + screenMetadata: {}, + user: { + role: 'adc', + }, + }, + }); + + expect(result.messages[0].showTrialInformation).toBe(false); + }); + + it('should format the trialDate and trialLocation on the message when caseStatus is Calendared', () => { + const mockCalendaredMessage = { + caseStatus: STATUS_TYPES.calendared, + completedAt: '2019-01-02T16:29:13.122Z', + createdAt: '2019-01-01T16:29:13.122Z', + docketNumber: '101-20', + message: 'This is a test message', + trialDate: '2019-01-01T16:29:13.122Z', + trialLocation: 'Houston, Texas', + }; + + const result = runCompute(formattedMessages, { + state: { + messageBoxToDisplay: { + box: 'outbox', + }, + messages: [mockCalendaredMessage], + screenMetadata: {}, + user: { + role: 'adc', + }, + }, + }); + + expect(result.messages[0]).toMatchObject({ + formattedTrialDate: '01/01/19', + formattedTrialLocation: 'Houston, TX', + }); + }); + + it(`should not abbreviate trialLocation when it is ${TRIAL_SESSION_SCOPE_TYPES.standaloneRemote}`, () => { + const mockCalendaredMessage = { + caseStatus: STATUS_TYPES.calendared, + completedAt: '2019-01-02T16:29:13.122Z', + createdAt: '2019-01-01T16:29:13.122Z', + docketNumber: '101-20', + message: 'This is a test message', + trialDate: '2019-01-01T16:29:13.122Z', + trialLocation: TRIAL_SESSION_SCOPE_TYPES.standaloneRemote, + }; + + const result = runCompute(formattedMessages, { + state: { + messageBoxToDisplay: { + box: 'outbox', + }, + messages: [mockCalendaredMessage], + screenMetadata: {}, + user: { + role: 'adc', + }, + }, + }); + + expect( + applicationContext.getUtilities().abbreviateState, + ).not.toHaveBeenCalled(); + expect(result.messages[0]).toMatchObject({ + formattedTrialLocation: TRIAL_SESSION_SCOPE_TYPES.standaloneRemote, + }); + }); }); diff --git a/web-client/src/views/Messages/MessagesIndividualInbox.jsx b/web-client/src/views/Messages/MessagesIndividualInbox.jsx index 4d676836f55..b6ceb99afd5 100644 --- a/web-client/src/views/Messages/MessagesIndividualInbox.jsx +++ b/web-client/src/views/Messages/MessagesIndividualInbox.jsx @@ -157,7 +157,15 @@ export const MessagesIndividualInbox = connect(