adding medical record wizard for lab results. (#350)
This commit is contained in:
parent
82fd5d103a
commit
eac07d01e5
|
@ -35,6 +35,41 @@
|
|||
"glob": "**/*",
|
||||
"input": "./node_modules/dwv/decoders/",
|
||||
"output": "/assets/dwv/decoders/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.js",
|
||||
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
|
||||
"output": "/assets/js/lforms/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.js.map",
|
||||
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
|
||||
"output": "/assets/js/lforms/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.js",
|
||||
"input": "./node_modules/lforms/dist/lforms/fhir/",
|
||||
"output": "/assets/js/lforms/fhir/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.js.map",
|
||||
"input": "./node_modules/lforms/dist/lforms/fhir/",
|
||||
"output": "/assets/js/lforms/fhir/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.js",
|
||||
"input": "./node_modules/@webcomponents/webcomponentsjs",
|
||||
"output": "/assets/js/webcomponents/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.css",
|
||||
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
|
||||
"output": "/assets/css/lforms/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.png",
|
||||
"input": "./node_modules/lforms/dist/lforms/webcomponent/",
|
||||
"output": "/assets/css/lforms/"
|
||||
}
|
||||
],
|
||||
"styles": [
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
"@panva/oauth4webapi": "1.2.0",
|
||||
"@swimlane/ngx-datatable": "^20.0.0",
|
||||
"@types/fhir": "^0.0.35",
|
||||
"@webcomponents/webcomponentsjs": "^2.8.0",
|
||||
"asmcrypto.js": "^2.3.2",
|
||||
"bootstrap": "^4.4.1",
|
||||
"chart.js": "^4.0.1",
|
||||
|
@ -45,6 +46,7 @@
|
|||
"humanize-duration": "^3.27.3",
|
||||
"idb": "^7.1.0",
|
||||
"jose": "^4.10.4",
|
||||
"lforms": "34.0.0",
|
||||
"moment": "^2.29.4",
|
||||
"ng2-charts": "^4.1.1",
|
||||
"ngx-dropzone": "^3.1.0",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||
import { AppRoutingModule } from './app-routing.module';
|
||||
import { AppComponent } from './app.component';
|
||||
import {HttpClientModule, HTTP_INTERCEPTORS, HttpClient} from '@angular/common/http';
|
||||
|
@ -105,7 +105,8 @@ import {FhirDatatableModule} from './components/fhir-datatable/fhir-datatable.mo
|
|||
}
|
||||
],
|
||||
exports: [],
|
||||
bootstrap: [AppComponent]
|
||||
bootstrap: [AppComponent],
|
||||
schemas: [CUSTOM_ELEMENTS_SCHEMA] //required for lhncbc/lforms (webcomponent)
|
||||
})
|
||||
export class AppModule {
|
||||
constructor(library: FaIconLibrary) {
|
||||
|
|
|
@ -68,6 +68,7 @@
|
|||
class="mr-auto"
|
||||
[collectionSize]="metaData.length"
|
||||
[(page)]="tagsPage"
|
||||
[maxSize]="15"
|
||||
[pageSize]="tagsPageSize"
|
||||
(pageChange)="refreshTags()"
|
||||
>
|
||||
|
|
|
@ -137,10 +137,13 @@ export class ObservationComponent implements OnInit {
|
|||
|
||||
|
||||
//populate chart data
|
||||
|
||||
if(this.displayModel?.effective_date) {
|
||||
this.barChartLabels.push(
|
||||
formatDate(this.displayModel?.effective_date, "mediumDate", "en-US", undefined)
|
||||
)
|
||||
} else {
|
||||
this.barChartLabels.push("")
|
||||
}
|
||||
|
||||
this.barChartData[0].data = [[this.displayModel?.reference_range?.[0]?.low?.value, this.displayModel?.reference_range?.[0]?.high?.value]]
|
||||
this.barChartData[1].data = [[this.displayModel?.value_quantity_value as number, this.displayModel?.value_quantity_value as number]]
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
<div class="modal-header">
|
||||
<h4 class="modal-title" id="modal-attachment">Lab Results</h4>
|
||||
<button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss()"><span aria-hidden="true">×</span></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
|
||||
<div *ngIf="debugMode" class="alert alert-warning">
|
||||
<!-- <pre><code [highlight]="newAttachmentForm.getRawValue() | json"></code></pre>-->
|
||||
<!-- <strong>New Attachment Form Status: {{ newAttachmentForm.status }}</strong>-->
|
||||
</div>
|
||||
|
||||
<div class="row mg-b-15">
|
||||
<div class="col-md-12">
|
||||
<p class="mg-b-10">Lab Panel Name<span ngbTooltip="required" class="text-danger">*</span></p>
|
||||
<form [formGroup]="newLabPanelTypeaheadForm">
|
||||
<app-nlm-typeahead formControlName="data" searchType="LabPanels" [debugMode]="debugMode"></app-nlm-typeahead>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div *ngIf="questionnaire" class="row">
|
||||
<wc-lhc-form
|
||||
#lhcForm
|
||||
[(questionnaire)]="questionnaire"
|
||||
[options]="options"
|
||||
[fhirVersion]="format"
|
||||
(onFormReady)="onFormReady($event)"
|
||||
(onError)="onError($event)"
|
||||
|
||||
></wc-lhc-form>
|
||||
</div>
|
||||
<app-loading-spinner *ngIf="loading"></app-loading-spinner>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-az-primary" (click)="submit()">Create Lab Results</button>
|
||||
</div>
|
|
@ -0,0 +1,23 @@
|
|||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { MedicalRecordWizardAddLabResultsComponent } from './medical-record-wizard-add-lab-results.component';
|
||||
|
||||
describe('MedicalRecordWizardAddLabResultsComponent', () => {
|
||||
let component: MedicalRecordWizardAddLabResultsComponent;
|
||||
let fixture: ComponentFixture<MedicalRecordWizardAddLabResultsComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ MedicalRecordWizardAddLabResultsComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(MedicalRecordWizardAddLabResultsComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,46 @@
|
|||
import type { Meta, StoryObj } from '@storybook/angular';
|
||||
import {MedicalRecordWizardAddLabResultsComponent} from './medical-record-wizard-add-lab-results.component';
|
||||
import {applicationConfig} from '@storybook/angular';
|
||||
import {NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';
|
||||
import {HTTP_CLIENT_TOKEN} from '../../dependency-injection';
|
||||
import {HttpClient} from '@angular/common/http';
|
||||
import {HttpClientTestingModule} from '@angular/common/http/testing';
|
||||
import {importProvidersFrom} from '@angular/core';
|
||||
|
||||
// More on how to set up stories at: https://storybook.js.org/docs/angular/writing-stories/introduction
|
||||
const meta: Meta<MedicalRecordWizardAddLabResultsComponent> = {
|
||||
title: 'Components/MedicalRecordWizardAddLabResults',
|
||||
component: MedicalRecordWizardAddLabResultsComponent,
|
||||
decorators: [
|
||||
applicationConfig({
|
||||
providers: [
|
||||
importProvidersFrom(HttpClientTestingModule),
|
||||
NgbActiveModal,
|
||||
{
|
||||
provide: HttpClient,
|
||||
useClass: HttpClient
|
||||
},
|
||||
{
|
||||
provide: HTTP_CLIENT_TOKEN,
|
||||
useClass: HttpClient,
|
||||
}
|
||||
]
|
||||
}),
|
||||
],
|
||||
tags: ['autodocs'],
|
||||
render: (args: MedicalRecordWizardAddLabResultsComponent) => ({
|
||||
props: {
|
||||
backgroundColor: null,
|
||||
...args,
|
||||
},
|
||||
}),
|
||||
argTypes: {
|
||||
},
|
||||
};
|
||||
|
||||
export default meta;
|
||||
type Story = StoryObj<MedicalRecordWizardAddLabResultsComponent>;
|
||||
|
||||
// More on writing stories with args: https://storybook.js.org/docs/angular/writing-stories/args
|
||||
export const Primary: Story = {};
|
||||
|
|
@ -328,12 +328,28 @@
|
|||
</p>
|
||||
</div>
|
||||
|
||||
<fhir-card *ngFor="let diagnosticReport of existingEncounter?.related_resources?.['DiagnosticReport']" [showDetails]="false" [displayModel]="diagnosticReport" [isCollapsed]="true"></fhir-card>
|
||||
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<strong>Under Construction</strong> Fasten does not currently support adding lab results manually. <br/>This feature is expected to be available in the next release.
|
||||
<ng-container formArrayName="labresults">
|
||||
<ng-container *ngFor="let labresultsGroup of labresults.controls; let i = index">
|
||||
<div *ngIf="debugMode" class="alert alert-warning">
|
||||
<strong>Lab Results Status: {{labresultsGroup.status}}</strong>
|
||||
</div>
|
||||
<fhir-diagnostic-report class="fhir-card-callout-warning" [formGroup]="labresultsGroup" [showDetails]="false" [displayModel]="labresultsGroup.controls.data.value?.entry?.[0]?.resource | fastenDisplayModel" [isCollapsed]="true">
|
||||
<div header>
|
||||
<span class="cursor-pointer float-right" (click)="deleteLabResults(i)" aria-hidden="true"><i class="fas fa-trash"></i></span>
|
||||
</div>
|
||||
</fhir-diagnostic-report>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
|
||||
|
||||
<div class="row pt-2">
|
||||
<div class="col-lg-4 col-md-3">
|
||||
<button type="button" (click)="openLabResultsModal()" class="btn btn-outline-indigo btn-block">Create Lab Result</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</ng-template>
|
||||
</ng-container>
|
||||
|
|
|
@ -38,9 +38,13 @@ import {
|
|||
import {generateReferenceUriFromResourceOrReference, internalResourceReferenceUri} from '../../../lib/utils/bundle_references';
|
||||
|
||||
import {
|
||||
Bundle,
|
||||
FhirResource,
|
||||
List, Reference
|
||||
} from 'fhir/r4';
|
||||
import {
|
||||
MedicalRecordWizardAddLabResultsComponent
|
||||
} from '../medical-record-wizard-add-lab-results/medical-record-wizard-add-lab-results.component';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
|
@ -91,6 +95,7 @@ export class MedicalRecordWizardComponent implements OnInit {
|
|||
procedures: new FormArray([]),
|
||||
practitioners: new FormArray([]),
|
||||
organizations: new FormArray([]),
|
||||
labresults: new FormArray([]),
|
||||
attachments: new FormArray([]),
|
||||
});
|
||||
|
||||
|
@ -112,6 +117,9 @@ export class MedicalRecordWizardComponent implements OnInit {
|
|||
get organizations(): FormArray<FormGroup> {
|
||||
return this.form.controls["organizations"] as FormArray;
|
||||
}
|
||||
get labresults(): FormArray<FormGroup> {
|
||||
return this.form.controls["labresults"] as FormArray;
|
||||
}
|
||||
get attachments(): FormArray<FormGroup> {
|
||||
return this.form.controls["attachments"] as FormArray;
|
||||
}
|
||||
|
@ -130,6 +138,9 @@ export class MedicalRecordWizardComponent implements OnInit {
|
|||
deleteOrganization(index: number) {
|
||||
this.organizations.removeAt(index);
|
||||
}
|
||||
deleteLabResults(index: number) {
|
||||
this.labresults.removeAt(index);
|
||||
}
|
||||
deleteAttachment(index: number) {
|
||||
this.attachments.removeAt(index);
|
||||
}
|
||||
|
@ -209,6 +220,14 @@ export class MedicalRecordWizardComponent implements OnInit {
|
|||
|
||||
this.attachments.push(attachmentGroup);
|
||||
}
|
||||
|
||||
addLabResultsBundle(diagnosticReportBundle: WizardFhirResourceWrapper<Bundle>){
|
||||
const diagnosticReportGroup = new FormGroup({
|
||||
data: new FormControl(diagnosticReportBundle.data),
|
||||
action: new FormControl(diagnosticReportBundle.action),
|
||||
});
|
||||
this.labresults.push(diagnosticReportGroup);
|
||||
}
|
||||
//</editor-fold>
|
||||
|
||||
//<editor-fold desc="Open Modals">
|
||||
|
@ -287,6 +306,23 @@ export class MedicalRecordWizardComponent implements OnInit {
|
|||
},
|
||||
);
|
||||
}
|
||||
openLabResultsModal() {
|
||||
let modalRef = this.modalService.open(MedicalRecordWizardAddLabResultsComponent, {
|
||||
ariaLabelledBy: 'modal-labresults',
|
||||
size: 'lg'
|
||||
})
|
||||
modalRef.componentInstance.debugMode = this.debugMode;
|
||||
modalRef.result.then(
|
||||
(result) => {
|
||||
console.log('Closing, saving form', result);
|
||||
//add this to the list of organization
|
||||
this.addLabResultsBundle(result);
|
||||
},
|
||||
(err) => {
|
||||
console.log('Closed without saving', err);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
openAttachmentModal(formGroup?: AbstractControl, controlName?: string) {
|
||||
let modalRef = this.modalService.open(MedicalRecordWizardAddAttachmentComponent, {
|
||||
|
|
|
@ -13,7 +13,7 @@ import {
|
|||
Resource,
|
||||
Bundle,
|
||||
Organization,
|
||||
Practitioner, MedicationRequest, Patient, Encounter, DocumentReference, Media, DiagnosticReport, Reference, Binary, HumanName
|
||||
Practitioner, MedicationRequest, Patient, Encounter, DocumentReference, Media, DiagnosticReport, Reference, Binary, HumanName, Observation
|
||||
} from 'fhir/r4';
|
||||
import {uuidV4} from '../../../lib/utils/uuid';
|
||||
import {OrganizationModel} from '../../../lib/models/resources/organization-model';
|
||||
|
@ -24,14 +24,14 @@ import {FastenDisplayModel} from '../../../lib/models/fasten/fasten-display-mode
|
|||
import {generateReferenceUriFromResourceOrReference} from '../../../lib/utils/bundle_references';
|
||||
import {HumanNameModel} from '../../../lib/models/datatypes/human-name-model';
|
||||
|
||||
export interface WizardFhirResourceWrapper<T extends OrganizationModel | PractitionerModel | EncounterModel> {
|
||||
export interface WizardFhirResourceWrapper<T extends OrganizationModel | PractitionerModel | EncounterModel | Bundle> {
|
||||
data: T,
|
||||
action: 'find'|'create'
|
||||
}
|
||||
|
||||
interface ResourceStorage {
|
||||
[resourceType: string]: {
|
||||
[resourceId: string]: Condition | Patient | MedicationRequest | Organization | FhirLocation | Practitioner | Procedure | Encounter | DocumentReference | Media | DiagnosticReport | Binary | Reference
|
||||
[resourceId: string]: Condition | Patient | MedicationRequest | Organization | FhirLocation | Practitioner | Procedure | Encounter | DocumentReference | Media | DiagnosticReport | Binary | Observation | Reference
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,6 +72,9 @@ export function GenerateR4ResourceLookup(resourceCreate: MedicalRecordWizardForm
|
|||
|
||||
//DocumentReference -> (Optional) Binary
|
||||
//DiagnosticReport -> Media
|
||||
for(let labresult of resourceCreate.labresults) {
|
||||
resourceStorage = resourceCreateLabResultsToR4DiagnosticReports(resourceStorage, labresult)
|
||||
}
|
||||
//ImagingStudy
|
||||
//ImagingSelection
|
||||
|
||||
|
@ -436,6 +439,24 @@ function resourceAttachmentToR4DiagnosticReport(resourceStorage: ResourceStorage
|
|||
return resourceStorage
|
||||
}
|
||||
|
||||
function resourceCreateLabResultsToR4DiagnosticReports(resourceStorage: ResourceStorage, resourceLabResult: WizardFhirResourceWrapper<Bundle>): ResourceStorage {
|
||||
resourceLabResult.data.entry.forEach((entry) => {
|
||||
|
||||
if (entry.resource.resourceType === 'Observation') {
|
||||
resourceStorage['Observation'] = resourceStorage['Observation'] || {}
|
||||
let resource = entry.resource as Observation
|
||||
resourceStorage['Observation'][resource.id] = resource
|
||||
} else if (entry.resource.resourceType === 'DiagnosticReport') {
|
||||
resourceStorage['DiagnosticReport'] = resourceStorage['DiagnosticReport'] || {}
|
||||
let resource = entry.resource as DiagnosticReport
|
||||
resourceStorage['DiagnosticReport'][resource.id] = resource
|
||||
} else {
|
||||
console.log('Unknown resource type: ', entry.resource.resourceType)
|
||||
}
|
||||
})
|
||||
return resourceStorage
|
||||
}
|
||||
|
||||
|
||||
function findEncounter(resourceStorage: ResourceStorage): Encounter | Reference {
|
||||
let [encounterId] = Object.keys(resourceStorage['Encounter'])
|
||||
|
|
|
@ -22,6 +22,7 @@ export enum NlmSearchType {
|
|||
MedicationWhyStopped = 'MedicationWhyStopped',
|
||||
Procedure = 'Procedure',
|
||||
Vaccine = 'Vaccine',
|
||||
LabPanels = 'LabPanels',
|
||||
|
||||
Countries = 'Countries',
|
||||
AttachmentFileType = 'AttachmentFileType',
|
||||
|
@ -146,6 +147,10 @@ export class NlmTypeaheadComponent implements ControlValueAccessor {
|
|||
case NlmSearchType.Procedure:
|
||||
searchOpFn = this.nlmClinicalTableSearchService.searchProcedure
|
||||
break
|
||||
case NlmSearchType.LabPanels:
|
||||
searchOpFn = this.nlmClinicalTableSearchService.searchLabPanels
|
||||
this.editable = false
|
||||
break
|
||||
case NlmSearchType.Vaccine:
|
||||
searchOpFn = this.nlmClinicalTableSearchService.searchVaccine
|
||||
this.openOnFocus = true
|
||||
|
|
|
@ -35,6 +35,7 @@ import { MedicalRecordWizardAddAttachmentComponent } from './medical-record-wiza
|
|||
import {FhirCardModule} from './fhir-card/fhir-card.module';
|
||||
import {FhirDatatableModule} from './fhir-datatable/fhir-datatable.module';
|
||||
import { MedicalRecordWizardAddEncounterComponent } from './medical-record-wizard-add-encounter/medical-record-wizard-add-encounter.component';
|
||||
import { MedicalRecordWizardAddLabResultsComponent } from './medical-record-wizard-add-lab-results/medical-record-wizard-add-lab-results.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
|
@ -68,6 +69,7 @@ import { MedicalRecordWizardAddEncounterComponent } from './medical-record-wizar
|
|||
MedicalRecordWizardAddOrganizationComponent,
|
||||
MedicalRecordWizardAddAttachmentComponent,
|
||||
MedicalRecordWizardAddEncounterComponent,
|
||||
MedicalRecordWizardAddLabResultsComponent,
|
||||
|
||||
],
|
||||
declarations: [
|
||||
|
@ -111,6 +113,7 @@ import { MedicalRecordWizardAddEncounterComponent } from './medical-record-wizar
|
|||
MedicalRecordWizardAddOrganizationComponent,
|
||||
MedicalRecordWizardAddPractitionerComponent,
|
||||
MedicalRecordWizardComponent,
|
||||
MedicalRecordWizardAddLabResultsComponent,
|
||||
MedicalSourcesCategoryLookupPipe,
|
||||
NlmTypeaheadComponent,
|
||||
]
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
export interface LabresultsQuestionnaire {
|
||||
type: string
|
||||
code: string
|
||||
name: string
|
||||
codingInstructions: any
|
||||
copyrightNotice: any
|
||||
items: any[]
|
||||
lformsVersion: string
|
||||
codeSystem: string
|
||||
}
|
|
@ -5,6 +5,7 @@ import {WizardFhirResourceWrapper} from '../../components/medical-record-wizard/
|
|||
import {EncounterModel} from '../../../lib/models/resources/encounter-model';
|
||||
import {PractitionerModel} from '../../../lib/models/resources/practitioner-model';
|
||||
import {OrganizationModel} from '../../../lib/models/resources/organization-model';
|
||||
import {Bundle} from 'fhir/r4';
|
||||
|
||||
|
||||
//
|
||||
|
@ -134,6 +135,7 @@ export interface MedicalRecordWizardFormCreate {
|
|||
"procedures": ResourceCreateProcedure[],
|
||||
"practitioners": WizardFhirResourceWrapper<PractitionerModel>[],
|
||||
"organizations": WizardFhirResourceWrapper<OrganizationModel>[],
|
||||
"labresults": WizardFhirResourceWrapper<Bundle>[],
|
||||
"attachments": ResourceCreateAttachment[],
|
||||
}
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
[collectionSize]="allEncountersIds.length"
|
||||
[(page)]="currentPage"
|
||||
[pageSize]="pageSize"
|
||||
[maxSize]="15"
|
||||
(pageChange)="pageChange()"
|
||||
>
|
||||
</ngb-pagination>
|
||||
|
|
|
@ -71,6 +71,7 @@
|
|||
<div class="col-12 d-flex justify-content-center flex-nowrap">
|
||||
<ngb-pagination
|
||||
[collectionSize]="allObservationGroups.length"
|
||||
[maxSize]="15"
|
||||
[(page)]="currentPage"
|
||||
[pageSize]="pageSize"
|
||||
(pageChange)="populateObservationsForCurrentPage()"
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
import { FastenDisplayModelPipe } from './fasten-display-model.pipe';
|
||||
|
||||
describe('FastenDisplayModelPipe', () => {
|
||||
it('create an instance', () => {
|
||||
const pipe = new FastenDisplayModelPipe();
|
||||
expect(pipe).toBeTruthy();
|
||||
});
|
||||
});
|
|
@ -0,0 +1,30 @@
|
|||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import {DomainResource} from 'fhir/r4';
|
||||
import {ResourceFhir} from '../models/fasten/resource_fhir';
|
||||
import {FastenDisplayModel} from '../../lib/models/fasten/fasten-display-model';
|
||||
import {fhirModelFactory, wrapFhirModel} from '../../lib/models/factory';
|
||||
import {ResourceType} from '../../lib/models/constants';
|
||||
|
||||
@Pipe({
|
||||
name: 'fastenDisplayModel'
|
||||
})
|
||||
export class FastenDisplayModelPipe implements PipeTransform {
|
||||
|
||||
transform(fhirResourceOrWrapper: any, ...args: unknown[]): FastenDisplayModel | any {
|
||||
if(!fhirResourceOrWrapper) {
|
||||
throw new Error("resource data cannot be empty")
|
||||
}
|
||||
|
||||
if((fhirResourceOrWrapper as DomainResource).resourceType && (fhirResourceOrWrapper as DomainResource).id) {
|
||||
//wrap
|
||||
fhirResourceOrWrapper = wrapFhirModel(fhirResourceOrWrapper as DomainResource)
|
||||
}
|
||||
|
||||
if((fhirResourceOrWrapper as ResourceFhir).resource_raw) {
|
||||
return fhirModelFactory((fhirResourceOrWrapper as ResourceFhir).source_resource_type as ResourceType, fhirResourceOrWrapper as ResourceFhir)
|
||||
} else {
|
||||
throw new Error("resource data must be a valid wrapped FHIR resource")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -8,6 +8,7 @@ import { ShortDomainPipe } from './short-domain.pipe';
|
|||
import { DatasetLatestEntryPipe } from './dataset-latest-entry.pipe';
|
||||
import { HumanNamePipe } from './human-name.pipe';
|
||||
import { ReferenceUriPipe } from './reference-uri.pipe';
|
||||
import { FastenDisplayModelPipe } from './fasten-display-model.pipe';
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
|
@ -18,6 +19,7 @@ import { ReferenceUriPipe } from './reference-uri.pipe';
|
|||
DatasetLatestEntryPipe,
|
||||
HumanNamePipe,
|
||||
ReferenceUriPipe,
|
||||
FastenDisplayModelPipe,
|
||||
],
|
||||
imports: [
|
||||
|
||||
|
@ -28,7 +30,8 @@ import { ReferenceUriPipe } from './reference-uri.pipe';
|
|||
ShortDomainPipe,
|
||||
DatasetLatestEntryPipe,
|
||||
HumanNamePipe,
|
||||
ReferenceUriPipe
|
||||
ReferenceUriPipe,
|
||||
FastenDisplayModelPipe
|
||||
]
|
||||
})
|
||||
export class PipesModule {}
|
||||
|
|
|
@ -4,6 +4,7 @@ import {map} from 'rxjs/operators';
|
|||
import {Observable, of} from 'rxjs';
|
||||
import {CodingModel} from '../../lib/models/datatypes/coding-model';
|
||||
import {HTTP_CLIENT_TOKEN} from "../dependency-injection";
|
||||
import {LabresultsQuestionnaire} from '../models/fasten/labresults-questionnaire';
|
||||
|
||||
export interface NlmSearchResults {
|
||||
id: string
|
||||
|
@ -689,6 +690,44 @@ export class NlmClinicalTableSearchService {
|
|||
)
|
||||
}
|
||||
|
||||
//https://lforms-service.nlm.nih.gov/api/loinc_items/v3/search?type=form&available=true&terms=Diabetes
|
||||
searchLabPanels(searchTerm: string): Observable<NlmSearchResults[]> {
|
||||
let queryParams = {
|
||||
'type':'form',
|
||||
'available':'true',
|
||||
'terms':searchTerm
|
||||
}
|
||||
return this._httpClient.get<any>(`https://lforms-service.nlm.nih.gov/api/loinc_items/v3/search`, {params: queryParams})
|
||||
.pipe(
|
||||
map((response) => {
|
||||
|
||||
return response[3].map((panelName, ndx):NlmSearchResults => {
|
||||
return {
|
||||
id: response[1][ndx],
|
||||
text: panelName,
|
||||
identifier: [{
|
||||
system: 'http://loinc.org',
|
||||
code: response[1][ndx],
|
||||
display: panelName
|
||||
}]
|
||||
}
|
||||
})
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
searchLabPanelQuestionnaire(panelLoincCode: string): Observable<LabresultsQuestionnaire> {
|
||||
let queryParams = {
|
||||
'loinc_num': panelLoincCode,
|
||||
}
|
||||
return this._httpClient.get<any>(`https://lforms-service.nlm.nih.gov/loinc_form_definitions`, {params: queryParams})
|
||||
.pipe(
|
||||
map((response: LabresultsQuestionnaire) => {
|
||||
return response
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
//see https://lhcforms.nlm.nih.gov/phr.json
|
||||
//see https://build.fhir.org/valueset-provider-taxonomy.html
|
||||
// ideally we'd use http://www.hl7.org/fhir/valueset-performer-role.html
|
||||
|
|
|
@ -300,3 +300,26 @@ app-medical-sources-filter > .az-content-left-components:hover{
|
|||
.fhir-card-callout-warning .card, .bd-callout-warning { @include bs-callout-variant($yellow); }
|
||||
.fhir-card-callout-danger .card, .bd-callout-danger { @include bs-callout-variant($red); }
|
||||
|
||||
|
||||
// lhc-autocomplete fixes - if we dont set this z-index, the autocomplete results are hidden behind the modal
|
||||
#searchResults {
|
||||
z-index: 9999 !important;
|
||||
}
|
||||
|
||||
// LHC Forms
|
||||
.lhc-form-title {
|
||||
border-radius: inherit;
|
||||
background-color: $indigo;
|
||||
}
|
||||
|
||||
.lhc-item.lhc-tree-line::before {
|
||||
border-top: 2px solid $indigo;
|
||||
}
|
||||
|
||||
.lhc-item.lhc-tree-line::after {
|
||||
border-left: 2px solid $indigo;
|
||||
}
|
||||
|
||||
.lhc-item-question.lhc-active-row {
|
||||
background-color: $primary;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
<!-- Fonts and icons -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Poppins:200,300,400,600,700,800" rel="stylesheet"/>
|
||||
<link href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" rel="stylesheet"/>
|
||||
<!-- TODO: figure out why we cant use the built-in styles <link href="./assets/lforms/styles.css" rel="stylesheet">-->
|
||||
<link href="https://clinicaltables.nlm.nih.gov/lforms-versions/34.0.0/webcomponent/styles.css" media="screen" rel="stylesheet" />
|
||||
<script src="./assets/js/asmcrypto-2.3.2.all.es5.min.js"></script>
|
||||
<script>
|
||||
var baseHref = "/"
|
||||
|
@ -28,8 +30,20 @@
|
|||
}
|
||||
|
||||
document.write(`<base href="${baseHref}"/>`); </script>
|
||||
|
||||
<!-- required for lhncbc/lforms -->
|
||||
<script src="./assets/js/webcomponents/webcomponents-loader.js"></script>
|
||||
<script>
|
||||
if (!window.customElements) {
|
||||
document.write('<!--');
|
||||
}
|
||||
</script>
|
||||
<!-- ! DO NOT REMOVE THIS COMMENT, WE NEED ITS CLOSING MARKER -->
|
||||
</head>
|
||||
<body>
|
||||
<app-root></app-root>
|
||||
<script src="./assets/js/lforms/assets/lib/zone.min.js"></script>
|
||||
<script src="./assets/js/lforms/lhc-forms.js"></script>
|
||||
<script src="./assets/js/lforms/fhir/lformsFHIRAll.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -31,13 +31,34 @@ import {ExplanationOfBenefitModel} from './resources/explanation-of-benefit-mode
|
|||
|
||||
// import {BinaryModel} from './resources/binary-model';
|
||||
|
||||
export function wrapFhirModel(fhirResource): any {
|
||||
if(!fhirResource) {
|
||||
throw new Error("resource data cannot be empty")
|
||||
}
|
||||
//determine if valid FhirResource
|
||||
if(!fhirResource.resourceType || !fhirResource.id) {
|
||||
throw new Error("resource data must be a valid FHIR resource")
|
||||
}
|
||||
//wrap
|
||||
|
||||
return {
|
||||
resource_raw: fhirResource,
|
||||
source_resource_id: fhirResource.id,
|
||||
source_resource_type: fhirResource.resourceType,
|
||||
}
|
||||
}
|
||||
|
||||
export function fhirModelFactory(
|
||||
modelResourceType: ResourceType,
|
||||
fhirResourceWrapper: any, //this is a ResourceFhir object (database structure)
|
||||
fhirResourceWrapper: any, //this is a ResourceFhir object (database structure) or a FhirEntity (fhir structure)
|
||||
fhirVersion: fhirVersions = fhirVersions.R4,
|
||||
fastenOptions?: FastenOptions
|
||||
): FastenDisplayModel {
|
||||
|
||||
if(!fhirResourceWrapper) {
|
||||
throw new Error("resource data cannot be empty")
|
||||
}
|
||||
|
||||
let resourceModel: FastenDisplayModel
|
||||
switch (modelResourceType) {
|
||||
case ResourceType.AdverseEvent:
|
||||
|
|
|
@ -78,6 +78,32 @@ declare global {
|
|||
CallByID: (methodID, ...args) => Promise<any>
|
||||
CallByName: (name, ...args) => Promise<any>
|
||||
}
|
||||
|
||||
//see https://lhncbc.github.io/lforms/ for definitions
|
||||
let LForms: {
|
||||
Util: {
|
||||
|
||||
addFormToPage(formDefinition: any, formElement: HTMLElement | string, options?: any): any
|
||||
|
||||
// Retrieving User-Entered Data
|
||||
// The utility method LForms.Util.getFormData() will return both the user data and the complete form definition data together in a way that can be fed back to LHC-Forms to display the form with the data. This is useful when you want to allow the user to save the form so it can be redisplayed later for completion or editing.
|
||||
getFormData: (formElement: HTMLElement, noEmptyValue: boolean, noDisabledItem: boolean) => any
|
||||
|
||||
// To get a compact structure with just the user-entered data and minimal form definition data, you can call LForms.Util.getUserData(formElement, true, true, true). The parameters are:
|
||||
getFormHL7Data(element?: HTMLElement): any
|
||||
|
||||
// Prior to submitting the form, the form can be checked to make sure required fields are filled in and that the values have the correct format, by using the following function:
|
||||
checkValidity(formElement?: HTMLElement): any[] | null
|
||||
|
||||
// The form definition and user-entered data can be retrieved as FHIR resources, using the following utility method:
|
||||
getFormFHIRData(
|
||||
resourceType: 'DiagnosticReport' | 'Questionnaire' | 'QuestionnaireResponse',
|
||||
fhirVersion: 'STU3' | 'R4',
|
||||
formDataSource?: HTMLElement | any,
|
||||
options?: {bundleType: 'transaction' | 'collection'}
|
||||
): any
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//required for PouchDB
|
||||
|
|
|
@ -159,14 +159,14 @@
|
|||
ora "5.4.1"
|
||||
rxjs "6.6.7"
|
||||
|
||||
"@angular/animations@^14.1.3":
|
||||
"@angular/animations@^14.1.3", "@angular/animations@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/animations/-/animations-14.2.12.tgz#9ff16bad809d3ff7526f8359ef214e63e8236f9f"
|
||||
integrity sha512-gwdnFZkvVUr+enUNfhfCGRGGqNHn1+vTA81apLfHYhJxgjiLUtETc4KTOrQevtDm022pEd+LSrvr8r+7ag+jkw==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
"@angular/cdk@^14.1.3":
|
||||
"@angular/cdk@^14.1.0", "@angular/cdk@^14.1.3":
|
||||
version "14.2.7"
|
||||
resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.7.tgz#65eb6fbbeed6120fad4e3913aa66f8b74c853ac3"
|
||||
integrity sha512-/tEsYaUbDSnfEmKVvAMramIptmhI67O+9STjOV0i+74XR2NospeK0fkbywIANu1n3w6AHGMotvRWJrjmbCElFg==
|
||||
|
@ -201,7 +201,7 @@
|
|||
uuid "8.3.2"
|
||||
yargs "17.5.1"
|
||||
|
||||
"@angular/common@^14.1.3":
|
||||
"@angular/common@^14.1.3", "@angular/common@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/common/-/common-14.2.12.tgz#b608ff629a635f323b297000f53f976f71ae3c80"
|
||||
integrity sha512-oZunh9wfInFWhNO1P8uoEs/o4u8kerKMhw8GruywKm1TV7gHDP2Fi5WHGjFqq3XYptgBTPCTSEfyLX6Cwq1PUw==
|
||||
|
@ -224,21 +224,28 @@
|
|||
tslib "^2.3.0"
|
||||
yargs "^17.2.1"
|
||||
|
||||
"@angular/compiler@^14.1.3":
|
||||
"@angular/compiler@^14.1.3", "@angular/compiler@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.12.tgz#2b17667acfb2cda1521de102246b178845838812"
|
||||
integrity sha512-u2MH9+NRwbbFDRNiPWPexed9CnCq9+pGHLuyACSP2uR6Ik68cE6cayeZbIeoEV5vWpda/XsLmJgPJysw7dAZLQ==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
"@angular/core@^14.1.3":
|
||||
"@angular/core@^14.1.3", "@angular/core@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/core/-/core-14.2.12.tgz#118467ec4e8ea082931a84e8cefe722a0e110dc9"
|
||||
integrity sha512-sGQxU5u4uawwvJa6jOTmGoisJiQ5HIN/RoBw99CmoqZIVyUSg9IRJJC1KVdH8gbpWBNLkElZv21lwJTL/msWyg==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
"@angular/forms@^14.1.3":
|
||||
"@angular/elements@^14.2.12":
|
||||
version "14.3.0"
|
||||
resolved "https://registry.npmjs.org/@angular/elements/-/elements-14.3.0.tgz#f4ce07241d5b05c8c843465cf564f3519ed8d5d5"
|
||||
integrity sha512-fIg8IOD2R36v3SZ8yQEwTC8T71Hk0lbJFJXaOUZDZ6MfwdT8mMkFCujPRXOF0+p/ZnOiq2EhBwuPdjmKTf7XHA==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
"@angular/forms@^14.1.3", "@angular/forms@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/forms/-/forms-14.2.12.tgz#2174e4e3b87390b0f1ebde0b3fc6c4d2ae793a1a"
|
||||
integrity sha512-7abYlGIT2JnAtutQUlH3fQS6QEpbfftgvsVcZJCyvX0rXL3u2w2vUQkDHJH4YJJp3AHFVCH4/l7R4VcaPnrwvA==
|
||||
|
@ -259,27 +266,42 @@
|
|||
glob "8.0.3"
|
||||
yargs "^17.2.1"
|
||||
|
||||
"@angular/platform-browser-dynamic@^14.1.3":
|
||||
"@angular/platform-browser-dynamic@^14.1.3", "@angular/platform-browser-dynamic@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.12.tgz#d4dac4a488c804ea07213a98450efa124a15d70a"
|
||||
integrity sha512-oZhNJeaBmgw8+KBSYpKz2RYqEDyETC+HJXH8dwIFcP6BqqwL2NE70FdSR7EnOa5c41MEtTmMCGhrJSFR60x5/w==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
"@angular/platform-browser@^14.1.3":
|
||||
"@angular/platform-browser@^14.1.3", "@angular/platform-browser@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.12.tgz#24fe6bc87d056fc8b91924091da712fef7c66457"
|
||||
integrity sha512-vOarWym8ucl1gjYWCzdwyBha+MTvL381mvTTUu8aUx6nVhHFjv4bvpjlZnZgojecqUPyxOwmPLLHvCZPJVHZYg==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
"@angular/router@^14.1.3":
|
||||
"@angular/router@^14.1.3", "@angular/router@~14.2.12":
|
||||
version "14.2.12"
|
||||
resolved "https://registry.npmjs.org/@angular/router/-/router-14.2.12.tgz#f5b2c9ced3337e4a7af1905b861b114ac80a8482"
|
||||
integrity sha512-r5tVus5RJDNc4U2v0jMtjPiAS1xDsVsJ70lS313DgZmBDHIVZP1cWIehdxwgNlGwQQtAA36eG7toBwqUU3gb/A==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
"@ant-design/colors@^5.0.0":
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-5.1.1.tgz#800b2186b1e27e66432e67d03ed96af3e21d8940"
|
||||
integrity sha512-Txy4KpHrp3q4XZdfgOBqLl+lkQIc3tEvHXOimRN1giX1AEC7mGtyrO9p8iRGJ3FLuVMGa2gNEzQyghVymLttKQ==
|
||||
dependencies:
|
||||
"@ctrl/tinycolor" "^3.3.1"
|
||||
|
||||
"@ant-design/icons-angular@^14.1.0":
|
||||
version "14.1.0"
|
||||
resolved "https://registry.npmjs.org/@ant-design/icons-angular/-/icons-angular-14.1.0.tgz#7612507aae28872ce3ccd139857452426cc30be3"
|
||||
integrity sha512-SvWi8p4L+cCfTGtezeUq1s8kahZEO1UVf7ZR615Fix3c2l9OnAJi+niDkq2fZHjpiarFrt8HoZ2EhMAMN7jfbg==
|
||||
dependencies:
|
||||
"@ant-design/colors" "^5.0.0"
|
||||
tslib "^2.0.0"
|
||||
|
||||
"@assemblyscript/loader@^0.10.1":
|
||||
version "0.10.1"
|
||||
resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06"
|
||||
|
@ -1679,6 +1701,13 @@
|
|||
dependencies:
|
||||
regenerator-runtime "^0.13.11"
|
||||
|
||||
"@babel/runtime@^7.21.0":
|
||||
version "7.23.5"
|
||||
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db"
|
||||
integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==
|
||||
dependencies:
|
||||
regenerator-runtime "^0.14.0"
|
||||
|
||||
"@babel/runtime@^7.8.4":
|
||||
version "7.20.13"
|
||||
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
|
||||
|
@ -1953,6 +1982,11 @@
|
|||
resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.0.tgz#923ebf8ba47e854863ae72510d9cbf7b44d525ea"
|
||||
integrity sha512-zJ6hb3FDgBbO8d2e83vg6zq7tNvDqSq9RwdwfzJ8tdm9JHNvANq2fqwyRn6mlpUb7CwTs5ILdUrGwi9Gk4vY5w==
|
||||
|
||||
"@ctrl/tinycolor@^3.3.1":
|
||||
version "3.6.1"
|
||||
resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31"
|
||||
integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
|
||||
|
||||
"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.3":
|
||||
version "0.5.7"
|
||||
resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
|
||||
|
@ -2315,6 +2349,22 @@
|
|||
string-to-stream "^1.1.0"
|
||||
xmldoc "^0.4.0"
|
||||
|
||||
"@lhncbc/ucum-lhc@^4.1.6":
|
||||
version "4.2.0"
|
||||
resolved "https://registry.npmjs.org/@lhncbc/ucum-lhc/-/ucum-lhc-4.2.0.tgz#522cc16fe37739d7da16c27c8b9ad039ee39c2d7"
|
||||
integrity sha512-OEiWX7IHFHLTFs7+w5EvGtI5dhXhhL0341LqZ9WEBWErtoY0/9xl/vn+wwT9vnBHnjQ7Ux0o7iEUXvN8uVn4xg==
|
||||
dependencies:
|
||||
coffeescript "^2.7.0"
|
||||
csv-parse "^4.4.6"
|
||||
csv-stringify "^1.0.4"
|
||||
escape-html "^1.0.3"
|
||||
is-integer "^1.0.6"
|
||||
jsonfile "^2.2.3"
|
||||
stream "0.0.2"
|
||||
stream-transform "^0.1.1"
|
||||
string-to-stream "^1.1.0"
|
||||
xmldoc "^0.4.0"
|
||||
|
||||
"@mdx-js/react@^2.1.5":
|
||||
version "2.3.0"
|
||||
resolved "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3"
|
||||
|
@ -3555,6 +3605,13 @@
|
|||
dependencies:
|
||||
"@types/jasmine" "*"
|
||||
|
||||
"@types/jquery@^3.5.14":
|
||||
version "3.5.29"
|
||||
resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.29.tgz#3c06a1f519cd5fc3a7a108971436c00685b5dcea"
|
||||
integrity sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==
|
||||
dependencies:
|
||||
"@types/sizzle" "*"
|
||||
|
||||
"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
|
||||
version "7.0.11"
|
||||
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||
|
@ -3721,6 +3778,11 @@
|
|||
"@types/mime" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/sizzle@*":
|
||||
version "2.3.8"
|
||||
resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627"
|
||||
integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==
|
||||
|
||||
"@types/sockjs@^0.3.33":
|
||||
version "0.3.33"
|
||||
resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f"
|
||||
|
@ -3885,6 +3947,11 @@
|
|||
"@webassemblyjs/ast" "1.11.1"
|
||||
"@xtuc/long" "4.2.2"
|
||||
|
||||
"@webcomponents/webcomponentsjs@^2.8.0":
|
||||
version "2.8.0"
|
||||
resolved "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz#ab21f027594fa827c1889e8b646da7be27c7908a"
|
||||
integrity sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==
|
||||
|
||||
"@xtuc/ieee754@^1.2.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
|
||||
|
@ -4359,6 +4426,11 @@ at-least-node@^1.0.0:
|
|||
resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
|
||||
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
|
||||
|
||||
autocomplete-lhc@^18.6.3:
|
||||
version "18.6.3"
|
||||
resolved "https://registry.npmjs.org/autocomplete-lhc/-/autocomplete-lhc-18.6.3.tgz#73217169e58581dfa3f4cd800d8225fcd79aefc2"
|
||||
integrity sha512-1bkfn4RY4bk67O1PzN8Jr6H2APbrYN4RDofqputmmZ/Qe6cw6Dg1TkoqqP/2Y0lyApd/ctWcPpkbsVEnIDp9vQ==
|
||||
|
||||
autoprefixer@^10.4.8:
|
||||
version "10.4.13"
|
||||
resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8"
|
||||
|
@ -5501,6 +5573,13 @@ date-fns@^1.30.1:
|
|||
resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
|
||||
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
|
||||
|
||||
date-fns@^2.16.1:
|
||||
version "2.30.0"
|
||||
resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
|
||||
integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.21.0"
|
||||
|
||||
date-format@^4.0.14:
|
||||
version "4.0.14"
|
||||
resolved "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400"
|
||||
|
@ -6569,6 +6648,11 @@ fancy-log@^2.0.0:
|
|||
dependencies:
|
||||
color-support "^1.1.3"
|
||||
|
||||
fast-copy@^2.1.7:
|
||||
version "2.1.7"
|
||||
resolved "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz#affc9475cb4b555fb488572b2a44231d0c9fa39e"
|
||||
integrity sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==
|
||||
|
||||
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
||||
|
@ -6633,6 +6717,17 @@ fetch-retry@^5.0.2:
|
|||
resolved "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.4.tgz#06e8e4533030bf6faa00ffbb9450cb9264c23c12"
|
||||
integrity sha512-LXcdgpdcVedccGg0AZqg+S8lX/FCdwXD92WNZ5k5qsb0irRhSFsBOpcJt7oevyqT2/C2nEE0zSFNdBEpj3YOSw==
|
||||
|
||||
fhirpath@3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.npmjs.org/fhirpath/-/fhirpath-3.2.0.tgz#1c70cfdf6f22edf3a6d79b157a10b19bca6039e4"
|
||||
integrity sha512-T6j53O5MVd2DkJ+PXHN9cceNdhOFLZ1f5mKOBhuv1NKZ++yKW+6qyUM+YPGvU3ugEM2dERj6Hz4xhPlWaaQH0A==
|
||||
dependencies:
|
||||
"@lhncbc/ucum-lhc" "^4.1.3"
|
||||
antlr4 "~4.9.3"
|
||||
commander "^2.18.0"
|
||||
date-fns "^1.30.1"
|
||||
js-yaml "^3.13.1"
|
||||
|
||||
fhirpath@^3.3.0:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.npmjs.org/fhirpath/-/fhirpath-3.3.1.tgz#cda17acd62243e3dac24e4b54f65dd5a37fee937"
|
||||
|
@ -8147,6 +8242,11 @@ jose@^4.10.4:
|
|||
resolved "https://registry.npmjs.org/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23"
|
||||
integrity sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==
|
||||
|
||||
jquery@^3.6.1:
|
||||
version "3.7.1"
|
||||
resolved "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
|
||||
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
|
||||
|
||||
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||
|
@ -8450,6 +8550,33 @@ levn@~0.3.0:
|
|||
prelude-ls "~1.1.2"
|
||||
type-check "~0.3.2"
|
||||
|
||||
lforms@34.0.0:
|
||||
version "34.0.0"
|
||||
resolved "https://registry.npmjs.org/lforms/-/lforms-34.0.0.tgz#301a77247fd3e4839901d2f2dff8fcbd4770b58b"
|
||||
integrity sha512-rfl0vtu1WsE09xNERx9Ie8YsH7J3DoVe3gDmRZiV/meRZg2sVaHx03fEbawYmcHTn6YhpSsHtEfJ1yLRrcISmQ==
|
||||
dependencies:
|
||||
"@angular/animations" "~14.2.12"
|
||||
"@angular/common" "~14.2.12"
|
||||
"@angular/compiler" "~14.2.12"
|
||||
"@angular/core" "~14.2.12"
|
||||
"@angular/elements" "^14.2.12"
|
||||
"@angular/forms" "~14.2.12"
|
||||
"@angular/platform-browser" "~14.2.12"
|
||||
"@angular/platform-browser-dynamic" "~14.2.12"
|
||||
"@angular/router" "~14.2.12"
|
||||
"@lhncbc/ucum-lhc" "^4.1.6"
|
||||
"@types/jquery" "^3.5.14"
|
||||
autocomplete-lhc "^18.6.3"
|
||||
deep-equal "^2.0.5"
|
||||
fast-copy "^2.1.7"
|
||||
fhirpath "3.2.0"
|
||||
jquery "^3.6.1"
|
||||
moment "^2.29.4"
|
||||
ng-zorro-antd "^14.1.1"
|
||||
rxjs "~6.6.7"
|
||||
tslib "^2.4.1"
|
||||
zone.js "~0.11.8"
|
||||
|
||||
license-webpack-plugin@4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6"
|
||||
|
@ -9036,6 +9163,16 @@ next-tick@^1.1.0:
|
|||
resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
|
||||
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
|
||||
|
||||
ng-zorro-antd@^14.1.1:
|
||||
version "14.3.0"
|
||||
resolved "https://registry.npmjs.org/ng-zorro-antd/-/ng-zorro-antd-14.3.0.tgz#0cc5a406b62f4dcbcda2eea4d8d654c27c323dae"
|
||||
integrity sha512-mGVok0DggrvVYTYWpbJJVekBs6j19kAkxB7PdZp0bvYRedpOVWKSEDX1Cigy7txnGw5UsSuzRSn3h6oZcBUmTA==
|
||||
dependencies:
|
||||
"@angular/cdk" "^14.1.0"
|
||||
"@ant-design/icons-angular" "^14.1.0"
|
||||
date-fns "^2.16.1"
|
||||
tslib "^2.3.0"
|
||||
|
||||
ng2-charts@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.npmjs.org/ng2-charts/-/ng2-charts-4.1.1.tgz#699bee539030b093caf54ab6111c6dea9e8e7ed3"
|
||||
|
@ -10612,6 +10749,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4:
|
|||
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
|
||||
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
|
||||
|
||||
regenerator-runtime@^0.14.0:
|
||||
version "0.14.0"
|
||||
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
|
||||
integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
|
||||
|
||||
regenerator-transform@^0.15.1:
|
||||
version "0.15.1"
|
||||
resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56"
|
||||
|
@ -10851,7 +10993,7 @@ run-parallel@^1.1.9:
|
|||
dependencies:
|
||||
queue-microtask "^1.2.2"
|
||||
|
||||
rxjs@6.6.7:
|
||||
rxjs@6.6.7, rxjs@~6.6.7:
|
||||
version "6.6.7"
|
||||
resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
|
||||
integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
|
||||
|
@ -11898,6 +12040,11 @@ tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.1:
|
|||
resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
|
||||
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
|
||||
|
||||
tslib@^2.4.1:
|
||||
version "2.6.2"
|
||||
resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
|
||||
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
|
||||
|
||||
tslint@~6.1.0:
|
||||
version "6.1.3"
|
||||
resolved "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904"
|
||||
|
|
Loading…
Reference in New Issue