diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 2ca8d17860..f239104e89 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,4 +1,6 @@ ## RELEASE NOTES +### Version 6.19.6-case-flags-v2-reasonable-adjustments-v2 +**EUI-7243** Case flags v2 reasonable adjustments ### Version 6.19.13 **EXUI-908** Unable to upload correspondence to Manage Cases @@ -29,6 +31,17 @@ ### Version 6.19.4-sscs-joh-fixes **EUI-8679/EUI-8770** Re-tag for formal release. Also includes partial reversion of EXUI-623 (`WriteDocumentFieldComponent` changes) due to deficient unit test coverage +### Version 6.19.2-case-flags-v2-status-text-wrapping-fix +**EUI-8778** Prevent flag status tag text from wrapping in Case Flags table + +### Version 6.19.2-case-flags-v2-reasonable-adjustments-text-amendments-v3 +**EUI-8283** Reasonable adjustments amend the term flag and flag type +**EUI-8284** Reasonable adjustments amend screen caption text on the tell us more about the request screen +**EUI-8287** Reasonable adjustments amend the update screen caption text to remove for not approved + +### Version 6.19.2-case-flags-v2-reasonable-adjustments-v2 +**EUI-7243** Case flags v2 reasonable adjustments + ### Version 6.18.3-hotfix-EUI-8738 **EUI-8738** Remove JudicialUser FormControls from FormGroup displayed on "Check your answers" page @@ -49,6 +62,59 @@ **EUI-8515** Fix Case Flags and Linked Cases submissions not to depend on presence of "Check your answers" page **EUI-8550** Fix incorrect behaviour of showEventNotes() function on Case Event submission, introduced in error by EUI-6693 +### Version 6.16.0-query-management-orchestrator-v3 +**EUI-8303** Query management orchestrator to get the mock data + +### Version 6.10.7-case-flags-v2-welsh-language-support-additional-rework-2 +**EUI-8116** Additional rework of Welsh language support + +### Version 6.10.7-case-flags-v2-reasonable-adjustments-fixes +**EUI-8370** Ensure "Other" support type is not shown at the top-level selection when the user is external +**EUI-8371** Show details of the selected support being updated when the user is external + +### Version 6.10.7-case-flags-v2-hide-event-summary-and-description-on-cya-page-v2 +**EUI-8246** Reasonable Adjustments legal rep hide Event Summary and Event Description section on CYA page + +### Version 6.10.7-case-flags-v2-view-case-flags-ui-amendments-v2 +**EUI-8069** Fix Case Flags table display to show selected language for "Language Interpreter" flag types (ported from Case Flags v1) +**EUI-8070** Display "decision reason" (flag update comment) for "Not approved" flags to internal HMCTS users only +**EUI-8071** Hide "Active flags" banner from external users + +### Version 6.10.7-case-flags-legal-rep-comments-page-v3 +**EUI-7373** Reasonable Adjustments legal rep display and edit 'Tell us why the support is no longer needed' screen + +### Version 6.10.7-case-flags-welsh-language-support +**EUI-7858** Ensure support for Welsh language toggle by storing flag description and comments entries in correct `_cy` fields, and displaying flag comments according to language selection + +### Version 6.10.7-case-flags-legal-rep-review-details-page +**EUI-7375** Reasonable adjustments legal rep display review flag details page + +### Version 6.10.7-case-flags-review-details-page-v4 +**EUI-7351** Reasonable adjustments display review flag details page + +### Version 6.10.7-manage-case-flags-valid-status-progression +**EUI-7929** Set the valid flag status options available on the "Update flag" page, based on the current status of the selected flag + +### Version 6.10.7-manage-case-flags-filter-out-inactive-and-not-approved +**EUI-7354** Ensure flags with a status of either "Inactive" or "Not approved" are filtered out from display on "Manage case flags" page, so they cannot be selected for update + +### Version 6.10.7-case-flags-add-translations-page-validation +**EUI-7932** Add validation to "Add translations to flag" page and map additional fields for "Other" description (English/Welsh) and flag comments (Welsh) for persistence as part of flag update + +### Version 6.10.7-case-flags-manage-case-flags-ui-amendments +**EUI-7777** Change wording for "translation needed" checkbox on "Update flag" page +**EUI-7842** Remove read-only setting from English description and comments boxes on "Add Welsh translation to flag" page +**EUI-7900** Add validation to "Update flag" page + +### Version 6.10.7-case-flags-confirm-flag-status-page-validation +**EUI-7611** Add validation to "Confirm the status of the flag" page + +### Version 6.10.7-case-flags-write-component-fixes-for-legal-rep-journey +**EUI-7362** Ensure correct titles and captions are shown for "Request support" and "Manage support" journeys for legal reps + +### Version 6.10.7-case-flags-confirm-flag-status-step +**EUI-7350** Add "confirm flag status" step of Create Case Flag journey + ### Version 6.13.10-case-file-view-sort-by-document-upload-date-v9 **EUI-7812** Case file view sort by document upload date diff --git a/package.json b/package.json index 24b3b9b7fd..b89e7cc548 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hmcts/ccd-case-ui-toolkit", - "version": "6.19.13", + "version": "6.19.6-case-flags-v2-reasonable-adjustments-v2", "engines": { "yarn": "^3.5.0", "npm": "^8.10.0" @@ -99,7 +99,7 @@ "@angular/cli": "^11.2.19", "@angular/compiler-cli": "~11.2.14", "@babel/core": "^7.18.10", - "@compodoc/compodoc": "1.1.12", + "@compodoc/compodoc": "^1.1.12", "@storybook/addon-actions": "^6.5.10", "@storybook/addon-essentials": "^6.5.10", "@storybook/addon-interactions": "^6.5.10", diff --git a/projects/ccd-case-ui-toolkit/package.json b/projects/ccd-case-ui-toolkit/package.json index 17dc6b3f27..21e6dcbcc6 100644 --- a/projects/ccd-case-ui-toolkit/package.json +++ b/projects/ccd-case-ui-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@hmcts/ccd-case-ui-toolkit", - "version": "6.19.13", + "version": "6.19.6-case-flags-v2-reasonable-adjustments-v2", "engines": { "yarn": "^3.5.0", "npm": "^8.10.0" diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/commons/case-edit-data/case-edit-data.module.spec.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/commons/case-edit-data/case-edit-data.module.spec.ts new file mode 100644 index 0000000000..7b0cc9697d --- /dev/null +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/commons/case-edit-data/case-edit-data.module.spec.ts @@ -0,0 +1,9 @@ +import { CaseEditDataModule } from './case-edit-data.module'; + +describe('JurisdictionService', () => { + describe('forRoot', () => { + it('shouldto be truthy', () => { + expect(CaseEditDataModule.forRoot()).toBeTruthy(); + }); + }); +}); diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/commons/case-edit-data/case-edit-data.service.spec.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/commons/case-edit-data/case-edit-data.service.spec.ts new file mode 100644 index 0000000000..734ac33862 --- /dev/null +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/commons/case-edit-data/case-edit-data.service.spec.ts @@ -0,0 +1,84 @@ +import { take } from 'rxjs/operators'; +import { CaseEditDataService } from './case-edit-data.service'; + +describe('CaseEditDataService', () => { + let service: CaseEditDataService; + + describe('setCaseTitle', () => { + it('should update title', (done) => { + service = new CaseEditDataService(); + service.setCaseTitle('mr'); + service.caseTitle$.pipe(take(1)).subscribe((actual) => { + expect(actual).toEqual('mr'); + done(); + }); + }); + }); + + describe('setCaseEventTriggerName', () => { + it('should update eventTriggerName', (done) => { + service = new CaseEditDataService(); + service.setCaseEventTriggerName('test'); + service.caseEventTriggerName$.pipe(take(1)).subscribe((actual) => { + expect(actual).toEqual('test'); + done(); + }); + }); + }); + + describe('setFormValidationErrors', () => { + it('should update formValidationErrors', (done) => { + const result = [{ + id: 'id', + message: 'message' + }]; + service = new CaseEditDataService(); + service.setFormValidationErrors(result); + service.caseFormValidationErrors$.pipe(take(1)).subscribe((actual) => { + expect(actual).toEqual(result); + done(); + }); + }); + }); + + describe('addFormValidationError', () => { + it('should update formValidationErrors', (done) => { + const result = [{ + id: 'id', + message: 'message' + }]; + service = new CaseEditDataService(); + service.addFormValidationError(result[0]); + service.caseFormValidationErrors$.pipe(take(1)).subscribe((actual) => { + expect(actual).toEqual(result); + done(); + }); + }); + }); + + describe('setTriggerSubmitEvent', () => { + it('should update triggerSubmitEvent', (done) => { + const result = true; + service = new CaseEditDataService(); + service.setTriggerSubmitEvent(result); + service.caseTriggerSubmitEvent$.pipe(take(1)).subscribe((actual) => { + expect(actual).toEqual(result); + done(); + }); + }); + }); + + describe('clearFormValidationErrors', () => { + it('should clear formValidationErrors', (done) => { + const result = []; + service = new CaseEditDataService(); + service.clearFormValidationErrors(); + + service.caseFormValidationErrors$.pipe(take(1)).subscribe((actual) => { + expect(actual).toEqual(result); + done(); + }); + }); + }); + +}); diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-create/case-create.component.spec.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-create/case-create.component.spec.ts index 56eccb5a84..0360d17e86 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-create/case-create.component.spec.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-create/case-create.component.spec.ts @@ -326,7 +326,7 @@ describe('CaseCreateComponent failed to resolve event trigger', () => { })); it('should alert warning message and never announce event trigger if getting event trigger fails', () => { - expect(alertService.error).toHaveBeenCalledWith({ phrase: 'ERROR!'}); + expect(alertService.error).toHaveBeenCalledWith({ phrase: 'ERROR!' }); expect(eventTriggerService.announceEventTrigger).not.toHaveBeenCalled(); }); }); diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.ts index 5300b5ecc0..855e0a712f 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.ts @@ -228,17 +228,9 @@ export class CaseEditPageComponent implements OnInit, AfterViewChecked, OnDestro this.generateErrorMessage(casefield.field_type.collection_field_type.complex_fields, c.get('value'), id); }); } else if (FieldsUtils.isCaseFieldOfType(casefield, ['FlagLauncher'])) { - // Check whether the case field DisplayContextParameter is signalling "create" mode or "update" mode - // (expected always to be one of the two), to set the correct error message - let action = ''; - if (casefield.display_context_parameter === '#ARGUMENT(CREATE)') { - action = 'creation'; - } else if (casefield.display_context_parameter === '#ARGUMENT(UPDATE)') { - action = 'update'; - } this.validationErrors.push({ id, - message: `Please select Next to complete the ${action} of the ${action === 'update' ? 'selected ' : ''}case flag` + message: FieldsUtils.getValidationErrorMessageForFlagLauncherCaseField(casefield) }); } else { this.validationErrors.push({id, message: `Select or fill the required ${casefield.label} field`}); diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.spec.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.spec.ts index 9d778a2f5f..012e4e40a1 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.spec.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.spec.ts @@ -24,12 +24,14 @@ import { ProfileNotifier, SessionStorageService } from '../../../services'; +import { MockRpxTranslatePipe } from '../../../test/mock-rpx-translate.pipe'; import { IsCompoundPipe } from '../../palette/utils/is-compound.pipe'; import { CaseEditPageText } from '../case-edit-page/case-edit-page-text.enum'; import { aWizardPage } from '../case-edit.spec'; import { CaseEditComponent } from '../case-edit/case-edit.component'; import { Wizard, WizardPage } from '../domain'; import { CaseNotifier } from '../services'; +import { CaseEditSubmitTitles } from './case-edit-submit-titles.enum'; import { CaseEditSubmitComponent } from './case-edit-submit.component'; import createSpyObj = jasmine.createSpyObj; @@ -204,7 +206,8 @@ describe('CaseEditSubmitComponent', () => { CcdCYAPageLabelFilterPipe, CcdPageFieldsPipe, CaseReferencePipe, - CcdCaseTitlePipe + CcdCaseTitlePipe, + MockRpxTranslatePipe ], schemas: [CUSTOM_ELEMENTS_SCHEMA], providers: [ @@ -384,6 +387,92 @@ describe('CaseEditSubmitComponent', () => { expect(eventNotes).toBeNull(); }); + it('should show event notes when set in event trigger and showEventNotes is called', () => { + comp.profile.user.idam.roles = ['caseworker-divorce']; + comp.eventTrigger.show_event_notes = true; + fixture.detectChanges(); + const eventNotes = de.query($EVENT_NOTES); + const result = comp.showEventNotes(); + expect(result).toEqual(true); + expect(eventNotes).not.toBeNull(); + }); + + it('should hide event notes when set in event trigger and profile is solicitor and showEventNotes is called', () => { + comp.profile.user.idam.roles = ['divorce-solicitor']; + comp.eventTrigger.show_event_notes = true; + fixture.detectChanges(); + const eventNotes = de.query($EVENT_NOTES); + const result = comp.showEventNotes(); + expect(result).toEqual(false); + expect(eventNotes).toBeNull(); + }); + + it('should hide event notes when set in event trigger and is case flag journey and showEventNotes is called', () => { + comp.profile.user.idam.roles = ['caseworker-divorce']; + comp.caseEdit.isCaseFlagSubmission = true; + comp.eventTrigger.show_event_notes = true; + fixture.detectChanges(); + const eventNotes = de.query($EVENT_NOTES); + const result = comp.showEventNotes(); + expect(result).toEqual(false); + expect(eventNotes).toBeNull(); + }); + + it('should hide event notes when not set in event trigger and showEventNotes is called', () => { + comp.eventTrigger.show_event_notes = null; + fixture.detectChanges(); + const eventNotes = de.query($EVENT_NOTES); + const result = comp.showEventNotes(); + expect(result).toEqual(false); + expect(eventNotes).toBeNull(); + }); + + it('should hide event notes when not defined in event trigger and showEventNotes is called', () => { + comp.eventTrigger.show_event_notes = undefined; + fixture.detectChanges(); + const eventNotes = de.query($EVENT_NOTES); + const result = comp.showEventNotes(); + expect(result).toEqual(false); + expect(eventNotes).toBeNull(); + }); + + it('should set correct page title', () => { + const caseFieldCaseFlagCreate: CaseField = aCaseField('FlagLauncher1', 'FlagLauncher1', 'FlagLauncher', '#ARGUMENT(CREATE)', 2); + const caseFieldCaseFlagUpdate: CaseField = aCaseField('FlagLauncher1', 'FlagLauncher1', 'FlagLauncher', '#ARGUMENT(UPDATE)', 2); + const caseFieldCaseFlagExternalCreate: CaseField = aCaseField('FlagLauncher1', 'FlagLauncher1', 'FlagLauncher', '#ARGUMENT(CREATE,EXTERNAL)', 2); + const caseFieldCaseFlagExternalUpdate: CaseField = aCaseField('FlagLauncher1', 'FlagLauncher1', 'FlagLauncher', '#ARGUMENT(UPDATE,EXTERNAL)', 2); + + comp.eventTrigger.case_fields = [ + caseFieldCaseFlagExternalCreate + ]; + comp.ngOnInit(); + expect(comp.pageTitle).toEqual(CaseEditSubmitTitles.REVIEW_SUPPORT_REQUEST); + + comp.eventTrigger.case_fields = [ + caseFieldCaseFlagExternalUpdate + ]; + comp.ngOnInit(); + expect(comp.pageTitle).toEqual(CaseEditSubmitTitles.REVIEW_SUPPORT_REQUEST); + + comp.eventTrigger.case_fields = [ + caseFieldCaseFlagCreate + ]; + comp.ngOnInit(); + expect(comp.pageTitle).toEqual(CaseEditSubmitTitles.REVIEW_FLAG_DETAILS); + + comp.eventTrigger.case_fields = [ + caseFieldCaseFlagUpdate + ]; + comp.ngOnInit(); + expect(comp.pageTitle).toEqual(CaseEditSubmitTitles.REVIEW_FLAG_DETAILS); + + comp.eventTrigger.case_fields = [ + caseField1 + ]; + comp.ngOnInit(); + expect(comp.pageTitle).toEqual(CaseEditSubmitTitles.CHECK_YOUR_ANSWERS); + }); + it('should return false when no field exists and readOnlySummaryFieldsToDisplayExists is called', () => { comp.eventTrigger.case_fields = []; fixture.detectChanges(); @@ -532,7 +621,8 @@ describe('CaseEditSubmitComponent', () => { CcdPageFieldsPipe, CcdCYAPageLabelFilterPipe, CaseReferencePipe, - CcdCaseTitlePipe + CcdCaseTitlePipe, + MockRpxTranslatePipe ], schemas: [CUSTOM_ELEMENTS_SCHEMA], providers: [ @@ -683,7 +773,8 @@ describe('CaseEditSubmitComponent', () => { CcdPageFieldsPipe, CcdCYAPageLabelFilterPipe, CaseReferencePipe, - CcdCaseTitlePipe + CcdCaseTitlePipe, + MockRpxTranslatePipe ], schemas: [CUSTOM_ELEMENTS_SCHEMA], providers: [ diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.ts index 192dfc50f7..55f0170d05 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.ts @@ -15,6 +15,7 @@ import { PaletteContext } from '../../palette'; import { CaseEditPageComponent } from '../case-edit-page/case-edit-page.component'; import { CaseEditComponent } from '../case-edit/case-edit.component'; import { Wizard, WizardPage } from '../domain'; +import { CaseEditSubmitTitles } from './case-edit-submit-titles.enum'; // @dynamic @Component({ @@ -82,7 +83,7 @@ export class CaseEditSubmitComponent implements OnInit, OnDestroy { this.eventTrigger.case_fields.some(caseField => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher'])); this.caseEdit.isLinkedCasesSubmission = this.eventTrigger.case_fields.some(caseField => FieldsUtils.isCaseFieldOfType(caseField, ['ComponentLauncher'])); - this.pageTitle = this.caseEdit.isCaseFlagSubmission ? 'Review flag details' : 'Check your answers'; + this.pageTitle = this.getPageTitle(); } public ngOnDestroy(): void { @@ -111,6 +112,18 @@ export class CaseEditSubmitComponent implements OnInit, OnDestroy { }); } + private getPageTitle(): string { + const caseFlagField = this.eventTrigger.case_fields.find(caseField => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher'])); + if (caseFlagField) { + const isCaseFlagExternalMode = caseFlagField.display_context_parameter === '#ARGUMENT(UPDATE,EXTERNAL)' || + caseFlagField.display_context_parameter === '#ARGUMENT(CREATE,EXTERNAL)'; + return isCaseFlagExternalMode + ? CaseEditSubmitTitles.REVIEW_SUPPORT_REQUEST + : CaseEditSubmitTitles.REVIEW_FLAG_DETAILS; + } + return CaseEditSubmitTitles.CHECK_YOUR_ANSWERS; + } + private get hasErrors(): boolean { return this.caseEdit?.error?.callbackErrors?.length; } @@ -183,7 +196,15 @@ export class CaseEditSubmitComponent implements OnInit, OnDestroy { } public showEventNotes(): boolean { - return !!this.eventTrigger.show_event_notes; + // Display event notes related controls only if the following conditions are met + // 1. show_event_notes flag is set to true + // 2. profile is not a solicitor + // 3. is not a case flags journey, as it uses a custom check your answers component + if (this.eventTrigger.show_event_notes) { + return !this.profile?.isSolicitor() + && !this.caseEdit.isCaseFlagSubmission; + } + return false; } private getLastPageShown(): WizardPage { @@ -218,10 +239,6 @@ export class CaseEditSubmitComponent implements OnInit, OnDestroy { return field.show_summary_change_option; } - public isSolicitor(): boolean { - return this.profile.isSolicitor(); - } - private sortFieldsByShowSummaryContent(fields: CaseField[]): CaseField[] { return this.orderService .sort(fields, CaseEditSubmitComponent.SHOW_SUMMARY_CONTENT_COMPARE_FUNCTION) diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.html b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.html index b14e7cece2..5445bbac5c 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.html +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.html @@ -1,6 +1,6 @@
{{field.label}} | ++ {{field.label | rpxTranslate}} + |
|
- - Change - | ++ + + {{'Change' | rpxTranslate}} + + + | +
---|
{{field.label}} | +{{field.label | rpxTranslate}} |
|
@@ -74,27 +82,35 @@
---|
+ + {{getCancelText() | rpxTranslate}} + +
{{firstColumnHeader}} | -Comments | -Creation date | -Last modified | -Flag status | +{{'Comments' | rpxTranslate}} | +{{'Creation date' | rpxTranslate}} | +{{'Last modified' | rpxTranslate}} | +{{'Flag status' | rpxTranslate}} | |
---|---|---|---|---|---|---|---|---|---|
None | +{{'None' | rpxTranslate}} | ||||||||
- {{flagDetail.name}}
- {{flagDetail.otherDescription}}
- {{flagDetail.subTypeValue}}
+ {{flagDetail | flagFieldDisplay:'name'}}
+ {{flagDetail | flagFieldDisplay:'otherDescription'}}
+ {{flagDetail | flagFieldDisplay:'subTypeValue'}}
+ |
+
+ {{flagDetail | flagFieldDisplay:'flagComment'}}
+
+ Decision Reason: {{flagDetail.flagUpdateComment}}
+
|
- {{flagDetail.flagComment}} | {{flagDetail.dateTimeCreated | date: 'dd LLL yyyy'}} | {{flagDetail.dateTimeModified | date: 'dd LLL yyyy'}} | -- Active - Inactive - Requested + | + {{'Active' | rpxTranslate}} + {{'Inactive' | rpxTranslate}} + {{'Requested' | rpxTranslate}} + {{'Not approved' | rpxTranslate}} |
+ {{ col.displayName | rpxTranslate }} + + | +||||
---|---|---|---|---|
+ {{ message.subject }} + | +{{ message.lastSubmittedBy }} | +{{ message.lastSubmittedDate | date: 'dd MMM YYYY' }} | +{{ message.lastResponseDate | date: 'dd MMM YYYY' }} | +{{ message.lastResponseBy }} | +