diff --git a/webroot/src/components/Icons/AlertCircle/AlertCircle.less b/webroot/src/components/Icons/AlertCircle/AlertCircle.less new file mode 100644 index 000000000..a8b800029 --- /dev/null +++ b/webroot/src/components/Icons/AlertCircle/AlertCircle.less @@ -0,0 +1,6 @@ +// +// AlertCircle.less +// CompactConnect +// +// Created by InspiringApps on 5/7/2026. +// diff --git a/webroot/src/components/Icons/AlertCircle/AlertCircle.spec.ts b/webroot/src/components/Icons/AlertCircle/AlertCircle.spec.ts new file mode 100644 index 000000000..a99db5cc2 --- /dev/null +++ b/webroot/src/components/Icons/AlertCircle/AlertCircle.spec.ts @@ -0,0 +1,19 @@ +// +// AlertCircle.spec.ts +// CompactConnect +// +// Created by InspiringApps on 5/7/2026. +// + +import { expect } from 'chai'; +import { mountShallow } from '@tests/helpers/setup'; +import AlertCircle from '@components/Icons/AlertCircle/AlertCircle.vue'; + +describe('AlertCircle component', async () => { + it('should mount the component', async () => { + const wrapper = await mountShallow(AlertCircle); + + expect(wrapper.exists()).to.equal(true); + expect(wrapper.findComponent(AlertCircle).exists()).to.equal(true); + }); +}); diff --git a/webroot/src/components/Icons/AlertCircle/AlertCircle.ts b/webroot/src/components/Icons/AlertCircle/AlertCircle.ts new file mode 100644 index 000000000..1f1fa8323 --- /dev/null +++ b/webroot/src/components/Icons/AlertCircle/AlertCircle.ts @@ -0,0 +1,18 @@ +// +// AlertCircle.ts +// CompactConnect +// +// Created by InspiringApps on 5/7/2026. +// + +import { Component, Vue, toNative } from 'vue-facing-decorator'; + +@Component({ + name: 'AlertCircle', +}) +class AlertCircle extends Vue { +} + +export default toNative(AlertCircle); + +// export default AlertCircle; diff --git a/webroot/src/components/Icons/AlertCircle/AlertCircle.vue b/webroot/src/components/Icons/AlertCircle/AlertCircle.vue new file mode 100644 index 000000000..63f3811b6 --- /dev/null +++ b/webroot/src/components/Icons/AlertCircle/AlertCircle.vue @@ -0,0 +1,23 @@ + + + + + + diff --git a/webroot/src/locales/en.json b/webroot/src/locales/en.json index c0f2b68c0..44ba7aef9 100644 --- a/webroot/src/locales/en.json +++ b/webroot/src/locales/en.json @@ -664,6 +664,7 @@ "iUnderstand": "I understand", "jurisprudenceConfirmation": "Jurisprudence Confirmation", "lastUpdate": "Latest upload", + "disciplineTitle": "Disciplinary information", "disciplineStatus": "Discipline status", "noDiscipline": "No discipline", "twoHomeStateErrorMessage": "Two states have you listed as a resident. Please update your information with those states to reflect your current residency status.", diff --git a/webroot/src/locales/es.json b/webroot/src/locales/es.json index 2d29345b9..168140de4 100644 --- a/webroot/src/locales/es.json +++ b/webroot/src/locales/es.json @@ -648,6 +648,7 @@ "adminFee": "Tarifa Administrativa", "jurisdictionFee": "Tarifa Estatal", "jurisdictionFeeMilitary": "Tarifa Estatal (militar)", + "disciplineTitle": "Información disciplinaria", "disciplineStatus": "Estado de disciplina", "jurisprudenceExplanationText": "Certifico que he completado con éxito un examen de jurisprudencia para este estado, si es necesario.", "scopeAttestTitle": "Alcance de la certificación de práctica", diff --git a/webroot/src/models/AdverseAction/AdverseAction.model.spec.ts b/webroot/src/models/AdverseAction/AdverseAction.model.spec.ts index 5afa16933..9b9dcdbce 100644 --- a/webroot/src/models/AdverseAction/AdverseAction.model.spec.ts +++ b/webroot/src/models/AdverseAction/AdverseAction.model.spec.ts @@ -58,6 +58,8 @@ describe('AdverseAction model', () => { expect(adverseAction.endDateDisplay()).to.equal(''); expect(adverseAction.hasEndDate()).to.equal(false); expect(adverseAction.encumbranceTypeName()).to.equal(''); + expect(adverseAction.npdbTypeName()).to.equal(''); + expect(adverseAction.npdbTypeNames()).to.matchPattern([]); expect(adverseAction.isActive()).to.equal(false); }); it('should create an AdverseAction model with specific values', () => { @@ -95,6 +97,8 @@ describe('AdverseAction model', () => { expect(adverseAction.endDateDisplay()).to.equal('Invalid date'); expect(adverseAction.hasEndDate()).to.equal(true); expect(adverseAction.encumbranceTypeName()).to.equal(''); + expect(adverseAction.npdbTypeName()).to.equal(''); + expect(adverseAction.npdbTypeNames()).to.matchPattern([]); expect(adverseAction.isActive()).to.equal(false); }); it('should create an AdverseAction model with specific values (startDate but no endDate)', () => { @@ -178,6 +182,8 @@ describe('AdverseAction model', () => { ); expect(adverseAction.hasEndDate()).to.equal(true); expect(adverseAction.encumbranceTypeName()).to.equal('Fine'); + expect(adverseAction.npdbTypeName('Non-compliance With Requirements')).to.equal('Non-compliance With Requirements'); + expect(adverseAction.npdbTypeNames()).to.matchPattern(['Non-compliance With Requirements']); expect(adverseAction.isActive()).to.equal(true); }); it('should create an AdverseAction model with specific values through serializer (invalid data type from server)', () => { diff --git a/webroot/src/models/AdverseAction/AdverseAction.model.ts b/webroot/src/models/AdverseAction/AdverseAction.model.ts index 0480b7da9..88f12ef3b 100644 --- a/webroot/src/models/AdverseAction/AdverseAction.model.ts +++ b/webroot/src/models/AdverseAction/AdverseAction.model.ts @@ -83,6 +83,19 @@ export class AdverseAction implements InterfaceAdverseActionCreate { return typeName; } + public npdbTypeName(npdbTypeKey: string): string { + const npdbTypes = this.$tm('licensing.npdbTypes') || []; + const npdbType = npdbTypes.find((translate) => translate.key === npdbTypeKey); + const typeName = npdbType?.name || ''; + + return typeName; + } + + public npdbTypeNames(): Array { + return this.npdbTypes?.map((npdbTypeKey) => this.npdbTypeName(npdbTypeKey)) + .filter((npdbTypeName) => npdbTypeName.length) || []; + } + public isActive(): boolean { // Determine whether the adverse action is currently in effect const { startDate, endDate } = this; diff --git a/webroot/src/models/Licensee/Licensee.model.spec.ts b/webroot/src/models/Licensee/Licensee.model.spec.ts index 61d215088..89614097f 100644 --- a/webroot/src/models/Licensee/Licensee.model.spec.ts +++ b/webroot/src/models/Licensee/Licensee.model.spec.ts @@ -7,7 +7,7 @@ import chai, { expect } from 'chai'; import chaiMatchPattern from 'chai-match-pattern'; -import { serverDateFormat, displayDateFormat } from '@/app.config'; +import { serverDateFormat, serverDatetimeFormat, displayDateFormat } from '@/app.config'; import { CompactType } from '@models/Compact/Compact.model'; import { Licensee, LicenseeStatus, LicenseeSerializer } from '@models/Licensee/Licensee.model'; import { Address } from '@models/Address/Address.model'; @@ -18,6 +18,7 @@ import { EligibilityStatus } from '@models/License/License.model'; import { MilitaryAffiliation } from '@models/MilitaryAffiliation/MilitaryAffiliation.model'; +import { AdverseAction } from '@models/AdverseAction/AdverseAction.model'; import { Investigation } from '@models/Investigation/Investigation.model'; import { State } from '@models/State/State.model'; import i18n from '@/i18n'; @@ -60,6 +61,7 @@ describe('Licensee model', () => { expect(licensee.licenses).to.matchPattern([]); expect(licensee.privilegeStates).to.matchPattern([]); expect(licensee.privileges).to.matchPattern([]); + expect(licensee.adverseActions).to.matchPattern([]); expect(licensee.militaryAffiliations).to.matchPattern([]); expect(licensee.militaryStatus).to.equal(null); expect(licensee.militaryStatusNote).to.equal(null); @@ -151,6 +153,7 @@ describe('Licensee model', () => { privileges: [ new License(), ], + adverseActions: [new AdverseAction()], lastUpdated: '2020-01-01', status: LicenseeStatus.ACTIVE, }; @@ -180,6 +183,8 @@ describe('Licensee model', () => { expect(licensee.privilegeStates[0]).to.be.an.instanceof(State); expect(licensee.privileges).to.be.an('array').with.length(1); expect(licensee.privileges[0]).to.be.an.instanceof(License); + expect(licensee.adverseActions).to.be.an('array').with.length(1); + expect(licensee.adverseActions[0]).to.be.an.instanceof(AdverseAction); expect(licensee.militaryStatus).to.equal(data.militaryStatus); expect(licensee.militaryStatusNote).to.equal(data.militaryStatusNote); expect(licensee.lastUpdated).to.equal(data.lastUpdated); @@ -424,6 +429,25 @@ describe('Licensee model', () => { ], dateOfUpdate: moment().format(serverDateFormat), licenseStatus: LicenseeStatus.ACTIVE, + adverseActions: [ + { + adverseActionId: 'test-adverseAction-id', + providerId: 'test-provider-id', + compact: 'aslp', + type: 'adverseAction', + encumbranceType: 'fine', + clinicalPrivilegeActionCategories: ['Non-compliance With Requirements'], + actionAgainst: 'privilege', + jurisdiction: 'oh', + licenseTypeAbbreviation: 'aud', + licenseType: 'audiologist', + creationDate: moment().subtract(1, 'week').format(serverDatetimeFormat), + effectiveStartDate: moment().subtract(1, 'month').format(serverDateFormat), + effectiveLiftDate: moment().add(11, 'months').format(serverDateFormat), + submittingUser: '1', + liftingUser: '1', + }, + ], }; const licensee = LicenseeSerializer.fromServer(data); @@ -447,6 +471,8 @@ describe('Licensee model', () => { expect(licensee.privilegeStates[0]).to.be.an.instanceof(State); expect(licensee.privileges).to.be.an('array').with.length(1); expect(licensee.privileges[0]).to.be.an.instanceof(License); + expect(licensee.adverseActions).to.be.an('array').with.length(1); + expect(licensee.adverseActions[0]).to.be.an.instanceof(AdverseAction); expect(licensee.lastUpdated).to.equal(data.dateOfUpdate); expect(licensee.militaryAffiliations).to.be.an('array').with.length(2); expect(licensee.militaryAffiliations[0]).to.be.an.instanceof(MilitaryAffiliation); diff --git a/webroot/src/models/Licensee/Licensee.model.ts b/webroot/src/models/Licensee/Licensee.model.ts index f16b405e2..aa7f55dc6 100644 --- a/webroot/src/models/Licensee/Licensee.model.ts +++ b/webroot/src/models/Licensee/Licensee.model.ts @@ -17,6 +17,7 @@ import { EligibilityStatus } from '@models/License/License.model'; import { MilitaryAffiliation, MilitaryAffiliationSerializer } from '@models/MilitaryAffiliation/MilitaryAffiliation.model'; +import { AdverseAction, AdverseActionSerializer } from '@models/AdverseAction/AdverseAction.model'; import { Investigation } from '@models/Investigation/Investigation.model'; import { State } from '@models/State/State.model'; import moment from 'moment'; @@ -57,6 +58,7 @@ export interface InterfaceLicensee { licenses?: Array; privilegeStates?: Array; privileges?: Array; + adverseActions?: Array; lastUpdated?: string | null; status?: LicenseeStatus; } @@ -88,6 +90,7 @@ export class Licensee implements InterfaceLicensee { public militaryStatus? = null; public militaryStatusNote? = null; public privileges? = []; + public adverseActions? = []; public lastUpdated? = null; public status? = LicenseeStatus.INACTIVE; @@ -436,6 +439,7 @@ export class LicenseeSerializer { licenses: [] as Array, privilegeStates: [] as Array, privileges: [] as Array, + adverseActions: [] as Array, militaryAffiliations: [] as Array, militaryStatus: json.militaryStatus, militaryStatusNote: json.militaryStatusNote, @@ -476,6 +480,13 @@ export class LicenseeSerializer { }); } + // In get-one responses, server returns adverse action ojects at top level for some compacts, does not in get-all + if (Array.isArray(json.adverseActions)) { + json.adverseActions.forEach((serverAdverseAction) => { + licenseeData.adverseActions.push(AdverseActionSerializer.fromServer(serverAdverseAction)); + }); + } + return new Licensee(licenseeData); } diff --git a/webroot/src/models/StaffUser/StaffUser.model.spec.ts b/webroot/src/models/StaffUser/StaffUser.model.spec.ts index 20b3ead9f..b4dcb06a2 100644 --- a/webroot/src/models/StaffUser/StaffUser.model.spec.ts +++ b/webroot/src/models/StaffUser/StaffUser.model.spec.ts @@ -156,6 +156,7 @@ describe('Staff User model', () => { { state: new State({ abbrev: 'co' }), isReadPrivate: true, + isReadSsn: true, isWrite: true, isAdmin: true, }, @@ -166,9 +167,9 @@ describe('Staff User model', () => { const user = new StaffUser(data); expect(user).to.be.an.instanceof(StaffUser); - expect(user.permissionsShortDisplay(CompactType.ASLP)).to.equal('Read Private, Write, Admin'); + expect(user.permissionsShortDisplay(CompactType.ASLP)).to.equal('Read Private, Read SSN, Write, Admin'); expect(user.permissionsFullDisplay()).to.matchPattern([ - 'Colorado: Read Private, Write, Admin', + 'Colorado: Read Private, Read SSN, Write, Admin', ]); expect(user.affiliationDisplay(CompactType.ASLP)).to.equal('Colorado'); expect(user.statesDisplay(CompactType.ASLP)).to.equal('Colorado'); diff --git a/webroot/src/network/mocks/mock.data.ts b/webroot/src/network/mocks/mock.data.ts index 3f37adb51..ec1172101 100644 --- a/webroot/src/network/mocks/mock.data.ts +++ b/webroot/src/network/mocks/mock.data.ts @@ -828,7 +828,7 @@ export const licensees = { type: 'adverseAction', encumbranceType: 'fine', clinicalPrivilegeActionCategories: ['Non-compliance With Requirements'], - actionAgainst: 'privilege', + actionAgainst: 'license', jurisdiction: 'nv', licenseTypeAbbreviation: 'ota', licenseType: 'occupational therapy assistant', @@ -845,7 +845,7 @@ export const licensees = { type: 'adverseAction', encumbranceType: 'fine', clinicalPrivilegeActionCategories: ['Non-compliance With Requirements'], - actionAgainst: 'privilege', + actionAgainst: 'license', jurisdiction: 'nv', licenseTypeAbbreviation: 'ota', licenseType: 'occupational therapy assistant', @@ -1083,6 +1083,98 @@ export const licensees = { ], }, ], + adverseActions: [ + { + adverseActionId: '12345-ABC', + providerId: 'aa2e057d-6972-4a68-a55d-aad1c3d05278', + compact: 'octp', + type: 'adverseAction', + encumbranceType: 'fine', + clinicalPrivilegeActionCategories: [ + 'Non-compliance With Requirements', + 'Confidentiality, Consent or Disclosure Violations', + 'Improper Supervision or Allowing Unlicensed Practice', + 'Consumer Harm', + ], + actionAgainst: 'privilege', + jurisdiction: 'oh', + licenseTypeAbbreviation: 'ota', + licenseType: 'occupational therapy assistant', + creationDate: moment().subtract(1, 'week').format(serverDatetimeFormat), + effectiveStartDate: moment().subtract(1, 'month').format(serverDateFormat), + effectiveLiftDate: moment().add(11, 'months').format(serverDateFormat), + submittingUser: '1', + liftingUser: '1', + }, + { + adverseActionId: '12345-DEF', + providerId: 'aa2e057d-6972-4a68-a55d-aad1c3d05278', + compact: 'octp', + type: 'adverseAction', + encumbranceType: 'fine', + clinicalPrivilegeActionCategories: ['Non-compliance With Requirements'], + actionAgainst: 'privilege', + jurisdiction: 'al', + licenseTypeAbbreviation: 'ota', + licenseType: 'occupational therapy assistant', + creationDate: moment().subtract(8, 'months').format(serverDatetimeFormat), + effectiveStartDate: moment().subtract(7, 'months').format(serverDateFormat), + effectiveLiftDate: moment().subtract(5, 'months').format(serverDateFormat), + submittingUser: '1', + liftingUser: '1', + }, + { + adverseActionId: '12345-GHI', + providerId: 'aa2e057d-6972-4a68-a55d-aad1c3d05278', + compact: 'octp', + type: 'adverseAction', + encumbranceType: 'fine', + clinicalPrivilegeActionCategories: ['Unsafe Practice or Substandard Care'], + actionAgainst: 'privilege', + jurisdiction: 'al', + licenseTypeAbbreviation: 'ota', + licenseType: 'occupational therapy assistant', + creationDate: moment().subtract(1, 'week').format(serverDatetimeFormat), + effectiveStartDate: moment().subtract(3, 'months').format(serverDateFormat), + effectiveLiftDate: moment().subtract(1, 'months').format(serverDateFormat), + submittingUser: '1', + liftingUser: null, + }, + { + adverseActionId: '12345-MNO', + providerId: 'aa2e057d-6972-4a68-a55d-aad1c3d05278', + compact: 'octp', + type: 'adverseAction', + encumbranceType: 'fine', + clinicalPrivilegeActionCategories: ['Non-compliance With Requirements'], + actionAgainst: 'license', + jurisdiction: 'nv', + licenseTypeAbbreviation: 'ota', + licenseType: 'occupational therapy assistant', + creationDate: moment().subtract(1, 'year').format(serverDatetimeFormat), + effectiveStartDate: moment().subtract(1, 'year').format(serverDateFormat), + effectiveLiftDate: moment().subtract(1, 'month').format(serverDateFormat), + submittingUser: '1', + liftingUser: '1', + }, + { + adverseActionId: '12345-JKL', + providerId: 'aa2e057d-6972-4a68-a55d-aad1c3d05278', + compact: 'octp', + type: 'adverseAction', + encumbranceType: 'fine', + clinicalPrivilegeActionCategories: ['Non-compliance With Requirements'], + actionAgainst: 'license', + jurisdiction: 'nv', + licenseTypeAbbreviation: 'ota', + licenseType: 'occupational therapy assistant', + creationDate: moment().subtract(1, 'week').format(serverDatetimeFormat), + effectiveStartDate: moment().subtract(1, 'month').format(serverDateFormat), + effectiveLiftDate: null, + submittingUser: '1', + liftingUser: null, + }, + ], }, { // ================================================================ diff --git a/webroot/src/pages/LicensingDetail/LicensingDetail.less b/webroot/src/pages/LicensingDetail/LicensingDetail.less index 957efa84f..da19b480a 100644 --- a/webroot/src/pages/LicensingDetail/LicensingDetail.less +++ b/webroot/src/pages/LicensingDetail/LicensingDetail.less @@ -47,6 +47,16 @@ width: 3.2rem; height: 2.8rem; } + + .alert-icon { + width: 3.2rem; + height: 2.8rem; + stroke: @fontColor; + + &:deep(.custom-fill) { + fill: @fontColor; + } + } } :deep(.collapse-caret-button) { @@ -286,6 +296,87 @@ } } + .discipline-section { + margin: @spacingMobile; + padding-top: @spacingMobile; + padding-bottom: 4rem; + border-top: 1px solid @lightGrey; + + @media @tabletWidth { + margin: @spacingMobile @spacingTablet; + padding-top: @spacingMobile; + } + + @media @desktopWidth { + margin: @spacingMobile @spacingDesktop; + padding-top: @spacingMobile; + } + + .discipline-list-container { + display: flex; + width: 100%; + } + + .discipline-list { + display: flex; + flex-direction: column; + width: 100%; + + .discipline-row { + display: flex; + flex-direction: column; + padding: 1.6rem 0; + + &:not(:first-child) { + border-top: 1px solid @lightGrey; + } + + @media @tabletWidth { + flex-direction: row; + } + + &.header { + font-weight: @fontWeightBold; + } + } + + .discipline-cell { + display: flex; + + @media @tabletWidth { + align-items: center; + } + + &.state { + flex-basis: 18%; + } + + &.start-date { + flex-basis: 18%; + } + + &.end-date { + flex-basis: 18%; + } + + &.action-type { + flex-basis: 23%; + } + + &.action-basis { + flex-basis: 23%; + } + + .cell-title { + flex-shrink: 0; + width: 14.4rem; + padding-right: 0.4rem; + font-weight: @fontWeightBold; + } + } + } + } + .no-touch-item { margin: 1rem; } diff --git a/webroot/src/pages/LicensingDetail/LicensingDetail.ts b/webroot/src/pages/LicensingDetail/LicensingDetail.ts index 6d3763328..41735d8fd 100644 --- a/webroot/src/pages/LicensingDetail/LicensingDetail.ts +++ b/webroot/src/pages/LicensingDetail/LicensingDetail.ts @@ -12,7 +12,8 @@ import LicenseCard from '@/components/LicenseCard/LicenseCard.vue'; import PrivilegeCard from '@/components/PrivilegeCard/PrivilegeCard.vue'; import MilitaryAffiliationInfoBlock from '@components/MilitaryAffiliationInfoBlock/MilitaryAffiliationInfoBlock.vue'; import CollapseCaretButton from '@components/CollapseCaretButton/CollapseCaretButton.vue'; -import AlertIcon from '@components/Icons/AlertTriangle/AlertTriangle.vue'; +import AlertTriangleIcon from '@components/Icons/AlertTriangle/AlertTriangle.vue'; +import AlertCircleIcon from '@components/Icons/AlertCircle/AlertCircle.vue'; import LicenseIcon from '@components/Icons/LicenseIcon/LicenseIcon.vue'; import ExpirationExplanationIcon from '@components/Icons/ExpirationExplanationIcon/ExpirationExplanationIcon.vue'; import { CompactType } from '@models/Compact/Compact.model'; @@ -20,6 +21,7 @@ import { StaffUser } from '@models/StaffUser/StaffUser.model'; import { Licensee } from '@models/Licensee/Licensee.model'; import { License, LicenseStatus } from '@models/License/License.model'; import { State } from '@models/State/State.model'; +import { AdverseAction } from '@models/AdverseAction/AdverseAction.model'; import { dataApi } from '@network/data.api'; @Component({ @@ -29,7 +31,8 @@ import { dataApi } from '@network/data.api'; LicenseCard, PrivilegeCard, CollapseCaretButton, - AlertIcon, + AlertTriangleIcon, + AlertCircleIcon, LicenseIcon, MilitaryAffiliationInfoBlock, ExpirationExplanationIcon @@ -42,6 +45,7 @@ export default class LicensingDetail extends Vue { isPersonalInfoCollapsed = false; isLicensesCollapsed = false; isPrivsCollapsed = false; + isDisciplineCollapsed = false; licenseeFullSsnLoading = false; licenseeFullSsn = ''; licenseeFullSsnError = ''; @@ -236,6 +240,10 @@ export default class LicensingDetail extends Vue { return this.homeState?.name() || ''; } + get licenseeDiscipline(): Array { + return (this.licensee?.adverseActions || []).slice().sort(this.sortDiscipline); + } + // // Methods // @@ -265,6 +273,10 @@ export default class LicensingDetail extends Vue { this.isPrivsCollapsed = !this.isPrivsCollapsed; } + toggleDisciplineCollapsed(): void { + this.isDisciplineCollapsed = !this.isDisciplineCollapsed; + } + sortingChange(): boolean { // Sorting not API supported return false; @@ -323,6 +335,44 @@ export default class LicensingDetail extends Vue { return sort; } + sortDiscipline(action1: AdverseAction, action2: AdverseAction): number { + let sort = this.sortByDisciplineStart(action1, action2); + + if (sort === 0) { + sort = this.sortByDisciplineState(action1, action2); + } + + return sort; + } + + sortByDisciplineStart(action1: AdverseAction, action2: AdverseAction): number { + const startDate1 = action1.startDate || ''; + const startDate2 = action2.startDate || ''; + let sort = 0; + + if (startDate1 < startDate2) { + sort = -1; + } else if (startDate1 > startDate2) { + sort = 1; + } + + return sort; + } + + sortByDisciplineState(action1: AdverseAction, action2: AdverseAction): number { + const state1 = action1.state?.name().toLowerCase() || ''; + const state2 = action2.state?.name().toLowerCase() || ''; + let sort = 0; + + if (state1 < state2) { + sort = -1; + } else if (state1 > state2) { + sort = 1; + } + + return sort; + } + async revealFullSsn(): Promise { this.licenseeFullSsnLoading = true; this.licenseeFullSsn = ''; diff --git a/webroot/src/pages/LicensingDetail/LicensingDetail.vue b/webroot/src/pages/LicensingDetail/LicensingDetail.vue index 788b656b9..3cd7ae379 100644 --- a/webroot/src/pages/LicensingDetail/LicensingDetail.vue +++ b/webroot/src/pages/LicensingDetail/LicensingDetail.vue @@ -12,7 +12,7 @@
- + {{ licenseeInvestigationAlertContent }}
@@ -203,6 +203,63 @@
+
+
+
+
+ +
+
{{ $t('licensing.disciplineTitle') }}
+
+ +
+
+
+ {{ $t('licensing.noDiscipline') }} +
+
+
+
{{ $t('common.state') }}
+
{{ $t('common.startDate') }}
+
{{ $t('common.endDate') }}
+
{{ $t('licensing.encumberAction') }}
+
{{ $t('licensing.encumberBasisLabel') }}
+
+
+
+ + {{ $t('common.state') }}: + + {{ discipline.state.name() }} +
+
+ + {{ $t('common.startDate') }}: + + {{ discipline.startDateDisplay() }} +
+
+ + {{ $t('common.endDate') }}: + + {{ discipline.endDateDisplay() }} +
+
+ + {{ $t('licensing.encumberAction') }}: + + {{ discipline.encumbranceTypeName() }} +
+
+ + {{ $t('licensing.encumberBasisLabel') }}: + + {{ discipline.npdbTypeNames().join('; ') }} +
+
+
+
+