@f1studio/form-spec 5.0.0-alpha.141 → 5.0.0-alpha.142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMREncoder.js.map +1 -1
- package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMREncoder.ts.map +1 -1
- package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Encode.js.map +1 -1
- package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Encode.ts.map +1 -1
- package/FormSpec.TS/plugins/vitals/src/VitalsField.js +60 -56
- package/FormSpec.TS/plugins/vitals/src/VitalsField.js.map +1 -1
- package/FormSpec.TS/plugins/vitals/src/VitalsField.ts.map +1 -1
- package/FormSpec.TS/plugins/vitals/src/VitalsLogic.js +49 -7
- package/FormSpec.TS/plugins/vitals/src/VitalsLogic.js.map +1 -1
- package/FormSpec.TS/plugins/vitals/src/VitalsLogic.ts.map +1 -1
- package/README.md +7 -7
- package/package.json +5 -1
- package/plugins/vitals/src/VitalsField.d.ts.map +1 -1
- package/plugins/vitals/src/VitalsLogic.d.ts +8 -2
- package/plugins/vitals/src/VitalsLogic.d.ts.map +1 -1
- package/src/plugins/vitals/src/VitalsField.ts +49 -60
- package/src/plugins/vitals/src/VitalsLogic.ts +50 -11
|
@@ -84,6 +84,9 @@ _export(exports, {
|
|
|
84
84
|
get serializeVitalsData () {
|
|
85
85
|
return serializeVitalsData;
|
|
86
86
|
},
|
|
87
|
+
get validateVitalsData () {
|
|
88
|
+
return validateVitalsData;
|
|
89
|
+
},
|
|
87
90
|
get validateVitalsPluginData () {
|
|
88
91
|
return validateVitalsPluginData;
|
|
89
92
|
},
|
|
@@ -491,16 +494,55 @@ function validateVitalsProperty(propertyName, rawValue) {
|
|
|
491
494
|
return new VitalPropertyValidation(propertyName, propertyName, "", rawValue, false, "invalid", "Unknown vital sign property: " + propertyName);
|
|
492
495
|
}
|
|
493
496
|
}
|
|
494
|
-
function
|
|
495
|
-
|
|
496
|
-
const
|
|
497
|
-
|
|
498
|
-
|
|
497
|
+
function validateTypedValue(def, value) {
|
|
498
|
+
if (value != null) {
|
|
499
|
+
const v = (0, _Option.value)(value);
|
|
500
|
+
const rawValue = v.toString();
|
|
501
|
+
if (!def.IsValid(v)) {
|
|
502
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, rawValue, false, "invalid", def.DisplayName + " must be " + def.ValidRangeDescription + ", got " + rawValue + def.Unit);
|
|
503
|
+
} else if (def.IsCritical(v)) {
|
|
504
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, rawValue, true, "critical", def.DisplayName + " " + rawValue + def.Unit + " — CRITICAL");
|
|
499
505
|
} else {
|
|
500
|
-
|
|
506
|
+
const status = getVitalStatus(v, def.IsValid, def.IsCritical, def.IsNormal);
|
|
507
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, rawValue, true, status, status === "abnormal" ? def.DisplayName + " " + rawValue + def.Unit + " — above normal" : "");
|
|
501
508
|
}
|
|
502
|
-
}
|
|
509
|
+
} else {
|
|
510
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, "", true, "empty", "");
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
function validateVitalsData(data) {
|
|
514
|
+
const results = (0, _Array.map)((tupledArg)=>validateTypedValue(tupledArg[0], tupledArg[1]), (0, _Array.zip)(vitalPropertyDefs, [
|
|
515
|
+
data.Temperature,
|
|
516
|
+
data.SystolicBP,
|
|
517
|
+
data.DiastolicBP,
|
|
518
|
+
data.Pulse,
|
|
519
|
+
data.Respiration,
|
|
520
|
+
data.OxygenSaturation,
|
|
521
|
+
data.PainScale
|
|
522
|
+
]));
|
|
503
523
|
return new VitalsValidationResult(results.every((r)=>r.IsValid), results.some((r_1)=>r_1.ClinicalStatus === "critical"), results);
|
|
524
|
+
}
|
|
525
|
+
function validateVitalsPluginData(properties) {
|
|
526
|
+
const getPropertyValue = (name)=>(0, _Option.bind)((p_1)=>{
|
|
527
|
+
if ((0, _String.isNullOrWhiteSpace)(p_1.Value)) {
|
|
528
|
+
return undefined;
|
|
529
|
+
} else {
|
|
530
|
+
let matchValue;
|
|
531
|
+
let outArg = 0;
|
|
532
|
+
matchValue = [
|
|
533
|
+
(0, _Double.tryParse)(p_1.Value, new _Types.FSharpRef(()=>outArg, (v)=>{
|
|
534
|
+
outArg = v;
|
|
535
|
+
})),
|
|
536
|
+
outArg
|
|
537
|
+
];
|
|
538
|
+
if (matchValue[0]) {
|
|
539
|
+
return matchValue[1];
|
|
540
|
+
} else {
|
|
541
|
+
return undefined;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}, (0, _List.tryFind)((p)=>p.Name === name, properties));
|
|
545
|
+
return validateVitalsData(new VitalsData(getPropertyValue("temperature"), getPropertyValue("systolic_bp"), getPropertyValue("diastolic_bp"), getPropertyValue("pulse"), getPropertyValue("respiration"), getPropertyValue("oxygen_saturation"), getPropertyValue("pain_scale")));
|
|
504
546
|
} //# sourceMappingURL=VitalsLogic.ts.map
|
|
505
547
|
|
|
506
548
|
//# sourceMappingURL=VitalsLogic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../FormSpec.TS/plugins/vitals/src/VitalsLogic.ts"],"names":["temp","sys","dia","pulse","resp","sat","pain","value","parts","tryParseFloat","s","matchValue","outArg","optToString","opt","vitalsData","v","isCritical","isValid","isNormal","isValidTemperature","isCriticalTemperature","isNormalTemperature","isValidSystolicBP","isCriticalSystolicBP","isValidDiastolicBP","isCriticalDiastolicBP","isValidPulse","isCriticalPulse","isValidRespiration","isCriticalRespiration","isValidOxygenSat","isCriticalOxygenSat","isValidPainScale","defOpt","d","propertyName","vitalPropertyDefs","def","rawValue","status","getVitalStatus","results","
|
|
1
|
+
{"version":3,"sources":["../../../../../FormSpec.TS/plugins/vitals/src/VitalsLogic.ts"],"names":["temp","sys","dia","pulse","resp","sat","pain","value","parts","tryParseFloat","s","matchValue","outArg","optToString","opt","vitalsData","v","isCritical","isValid","isNormal","isValidTemperature","isCriticalTemperature","isNormalTemperature","isValidSystolicBP","isCriticalSystolicBP","isValidDiastolicBP","isCriticalDiastolicBP","isValidPulse","isCriticalPulse","isValidRespiration","isCriticalRespiration","isValidOxygenSat","isCriticalOxygenSat","isValidPainScale","defOpt","d","propertyName","vitalPropertyDefs","def","rawValue","status","getVitalStatus","results","validateTypedValue","tupledArg","data","array","r","getPropertyValue","p","name","properties","validateVitalsData"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../plugins/vitals/src/VitalsLogic.fs"],"names":["temp","sys","dia","pulse","resp","sat","pain","value","parts","tryParseFloat","s","matchValue","outArg","optToString","opt","vitalsData","v","isCritical","isValid","isNormal","isValidTemperature","isCriticalTemperature","isNormalTemperature","isValidSystolicBP","isCriticalSystolicBP","isValidDiastolicBP","isCriticalDiastolicBP","isValidPulse","isCriticalPulse","isValidRespiration","isCriticalRespiration","isValidOxygenSat","isCriticalOxygenSat","isValidPainScale","defOpt","d","propertyName","vitalPropertyDefs","def","rawValue","status","getVitalStatus","results","
|
|
1
|
+
{"version":3,"sources":["../../../../../../plugins/vitals/src/VitalsLogic.fs"],"names":["temp","sys","dia","pulse","resp","sat","pain","value","parts","tryParseFloat","s","matchValue","outArg","optToString","opt","vitalsData","v","isCritical","isValid","isNormal","isValidTemperature","isCriticalTemperature","isNormalTemperature","isValidSystolicBP","isCriticalSystolicBP","isValidDiastolicBP","isCriticalDiastolicBP","isValidPulse","isCriticalPulse","isValidRespiration","isCriticalRespiration","isValidOxygenSat","isCriticalOxygenSat","isValidPainScale","defOpt","d","propertyName","vitalPropertyDefs","def","rawValue","status","getVitalStatus","results","validateTypedValue","tupledArg","data","array","r","getPropertyValue","p","name","properties","validateVitalsData"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwC2C,QAAA,AAAAA,QAAQ;AAAQ,eAAA,AAAAA,QAAQ;;;eAAxB;;;;;AACF,QAAA,AAAAC,OAAO;AAAQ,eAAA,AAAAA,OAAO;;;eAAtB;;;;;AACC,QAAA,AAAAC,OAAO;AAAQ,eAAA,AAAAA,OAAO;;;eAAtB;;;;;AACJ,QAAA,AAAAC,SAAS;AAAQ,eAAA,AAAAA,SAAS;;;eAA1B;;;;;AACK,QAAA,AAAAC,QAAQ;AAAO,eAAA,AAAAA,QAAQ;;;eAAvB;;;;;AACH,QAAA,AAAAC,OAAO;AAAQ,eAAA,AAAAA,OAAO;;;eAAtB;;;;;AACC,QAAA,AAAAC,QAAQ;AAAO,eAAA,AAAAA,QAAQ;;;eAAvB;;;;;AAGK,QAAA,AAAAN,OAAO;eAAP;;;AAAe,eAAA,AAAAA,OAAO;;;;;AACxB,QAAA,AAAAC,MAAM;eAAN;;;AAAc,eAAA,AAAAA,MAAM;;;;;AACnB,QAAA,AAAAC,MAAM;eAAN;;;AAAc,eAAA,AAAAA,MAAM;;;;;AACxB,QAAA,AAAAC,QAAQ;eAAR;;;AAAgB,eAAA,AAAAA,QAAQ;;;;;AACnB,QAAA,AAAAC,OAAO;eAAP;;;AAAe,eAAA,AAAAA,OAAO;;;;;WACzB,AAAAC,MAAM;;;;AAGL,QAAA,AAAAL,QAAQ;AAAQ,eAAA,AAAAA,QAAQ;;;eAAxB;;;;;AAOpC;AACI,YAAG,mBAA0BO;AACzB,mBAAA,eACkB,WAAmB,WAAoB,WAC7C,WAAoB,WAAyB,WAAkB;;;AAGvEC,oCAAQ,MAAAD,QAAY,iBAAZ;AACRE;AACA,oBAAG,mBAA0BC;AAAQ,2BAAA;;;AAE3BC;AAAAC;AAAAD,mCAAA,SAAgBD,GAAhB,sCAAAE;AAAAA;yBAAAA;AAAA,wBAAA,AAAAD;AACS,\u002BBAAA,AAAAA;;;AACR,\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\u002BCAEG,iJAA\u002BB,AAAAC,mBAAf,AAAAC,cAAA,AAAAA,eADnB,uCAAUP,oBATV,AAAAQ,kBACA,AAAAA,iBACA,AAAAA,kBACA,AAAAA,YACA,AAAAA,kBACA,AAAAA,uBACA,AAAAA;AAKJ,WAAA,2BACyB,AAAAC,AAAXJ,uDAAkC,AAAAK,YACb,AAAAD,AAAXJ,yDAAkC,AAAAK,uBAAmB,cAC5DL;;;;;;;AAKbM,gEAGG;AACC,YAAG,mBAA0B,AAAAC;AAAc,mBAAA;;;AAEjCtC;AAAAC;AAAAD,2BAAA,SAAgB,AAAAsC,WAAhB,sCAAArC;AAAAA;iBAAAA;AAAA,gBAAA,AAAAD;AACS,uBAAA,AAAAA;;;AACR,uBAAA;;;OANZ,iFAAuB,AAAAsC,WAASC,OADnCC;AAiBJ,WAAA,AAAAC,mBATW,eACO,AAAAJ,iBAAiB,gBAClB,AAAAA,iBAAiB,gBAChB,AAAAA,iBAAiB,iBACvB,AAAAA,iBAAiB,UACX,AAAAA,iBAAiB,gBACZ,AAAAA,iBAAiB,sBACxB,AAAAA,iBAAiB","file":null,"sourcesContent":null,"sourceRoot":null}
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# FormSpec – Build & Publish
|
|
2
2
|
|
|
3
|
-
**Version: `5.0.0-alpha.
|
|
3
|
+
**Version: `5.0.0-alpha.142`**
|
|
4
4
|
|
|
5
5
|
TypeScript package generated from F# via Fable. Runtime uses external `@fable-org/fable-library-js`.
|
|
6
6
|
|
|
@@ -63,17 +63,17 @@ Notes:
|
|
|
63
63
|
### From Verdaccio (local testing)
|
|
64
64
|
|
|
65
65
|
```bash
|
|
66
|
-
npm install @f1studio/form-spec@5.0.0-alpha.
|
|
67
|
-
pnpm add @f1studio/form-spec@5.0.0-alpha.
|
|
68
|
-
bun add @f1studio/form-spec@5.0.0-alpha.
|
|
66
|
+
npm install @f1studio/form-spec@5.0.0-alpha.142 --registry http://localhost:4873
|
|
67
|
+
pnpm add @f1studio/form-spec@5.0.0-alpha.142 --registry http://localhost:4873
|
|
68
|
+
bun add @f1studio/form-spec@5.0.0-alpha.142 --registry http://localhost:4873
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
### From npm (public registry)
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
|
-
npm install @f1studio/form-spec@5.0.0-alpha.
|
|
75
|
-
pnpm add @f1studio/form-spec@5.0.0-alpha.
|
|
76
|
-
bun add @f1studio/form-spec@5.0.0-alpha.
|
|
74
|
+
npm install @f1studio/form-spec@5.0.0-alpha.142
|
|
75
|
+
pnpm add @f1studio/form-spec@5.0.0-alpha.142
|
|
76
|
+
bun add @f1studio/form-spec@5.0.0-alpha.142
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
Entry points:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@f1studio/form-spec",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.142",
|
|
4
4
|
"description": "F1 Core - Form specification and types",
|
|
5
5
|
"main": "./FormSpec.TS/FormSpec.FS/Interop/FormSpec.Api.Option.js",
|
|
6
6
|
"types": "./FormSpec.FS/Interop/FormSpec.Api.Option.d.ts",
|
|
@@ -36,6 +36,10 @@
|
|
|
36
36
|
"./PathwayExecutor": {
|
|
37
37
|
"types": "./PathwayExecutor.withPlugins.d.ts",
|
|
38
38
|
"default": "./FormSpec.TS/PathwayExecutor.withPlugins.js"
|
|
39
|
+
},
|
|
40
|
+
"./plugins/VitalsLogic": {
|
|
41
|
+
"types": "./plugins/vitals/src/VitalsLogic.d.ts",
|
|
42
|
+
"default": "./FormSpec.TS/plugins/vitals/src/VitalsLogic.js"
|
|
39
43
|
}
|
|
40
44
|
},
|
|
41
45
|
"files": [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitalsField.d.ts","sourceRoot":"","sources":["../../../../FormSpec.TS/plugins/vitals/src/VitalsField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"VitalsField.d.ts","sourceRoot":"","sources":["../../../../FormSpec.TS/plugins/vitals/src/VitalsField.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { Option } from "@fable-org/fable-library-js/Option.js";
|
|
|
3
3
|
import { float64 } from "@fable-org/fable-library-js/Int32.js";
|
|
4
4
|
import { IComparable, IEquatable } from "@fable-org/fable-library-js/Util.js";
|
|
5
5
|
import { TypeInfo } from "@fable-org/fable-library-js/Reflection.js";
|
|
6
|
-
import { FSharpList } from "@fable-org/fable-library-js/List.js";
|
|
7
6
|
import { Shared_PluginDataProperty } from "../../../FormSpec.FS/FormSpec.js";
|
|
7
|
+
import { FSharpList } from "@fable-org/fable-library-js/List.js";
|
|
8
8
|
export declare class VitalsData extends Record implements IEquatable<VitalsData>, IComparable<VitalsData> {
|
|
9
9
|
readonly Temperature: Option<float64>;
|
|
10
10
|
readonly SystolicBP: Option<float64>;
|
|
@@ -66,7 +66,13 @@ export declare function VitalsValidationResult_$reflection(): TypeInfo;
|
|
|
66
66
|
*/
|
|
67
67
|
export declare function validateVitalsProperty(propertyName: string, rawValue: string): VitalPropertyValidation;
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* Core validator — operates on the typed domain object. Single source of medical truth.
|
|
70
|
+
* Studio calls this via parseVitalsData → validateVitalsData.
|
|
71
|
+
* HealixAI calls this via PluginDataProperty list → converter → validateVitalsData.
|
|
72
|
+
*/
|
|
73
|
+
export declare function validateVitalsData(data: VitalsData): VitalsValidationResult;
|
|
74
|
+
/**
|
|
75
|
+
* Validate plugin data from the wire format. Parses to VitalsData, then delegates to validateVitalsData.
|
|
70
76
|
*/
|
|
71
77
|
export declare function validateVitalsPluginData(properties: FSharpList<Shared_PluginDataProperty>): VitalsValidationResult;
|
|
72
78
|
//# sourceMappingURL=VitalsLogic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitalsLogic.d.ts","sourceRoot":"","sources":["../../../../FormSpec.TS/plugins/vitals/src/VitalsLogic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"VitalsLogic.d.ts","sourceRoot":"","sources":["../../../../FormSpec.TS/plugins/vitals/src/VitalsLogic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FSharpRef, Record } from "@fable-org/fable-library-js/Types.js";
|
|
2
|
-
import {
|
|
2
|
+
import { isCriticalOxygenSat, isCriticalRespiration, isCriticalPulse, isCriticalDiastolicBP, isCriticalSystolicBP, isNormalTemperature, isCriticalTemperature, isValidPainScale, isValidOxygenSat, isValidRespiration, isValidPulse, isValidDiastolicBP, isValidSystolicBP, isValidTemperature, VitalPropertyValidation, validateVitalsProperty, serializeVitalsData, VitalsData, parseVitalsData, VitalsConfig_$reflection, VitalsConfig } from "./VitalsLogic.js";
|
|
3
3
|
import { equals, createObj, IComparable, IEquatable } from "@fable-org/fable-library-js/Util.js";
|
|
4
4
|
import { mapValues, Field$3, IAttributes } from "../../../fable_modules/Fable.Form.3.0.0/Field.fs.js";
|
|
5
5
|
import { class_type, record_type, string_type, TypeInfo } from "@fable-org/fable-library-js/Reflection.js";
|
|
@@ -7,14 +7,15 @@ import { Form$3, FieldConfig$4, field as field_1 } from "../../../fable_modules/
|
|
|
7
7
|
import { join, printf, toText, isNullOrWhiteSpace, isNullOrEmpty } from "@fable-org/fable-library-js/String.js";
|
|
8
8
|
import { createElement } from "react";
|
|
9
9
|
import React from "react";
|
|
10
|
-
import { some, bind, value as
|
|
10
|
+
import { some, bind, value as value_144, Option, map, defaultArg } from "@fable-org/fable-library-js/Option.js";
|
|
11
11
|
import { float64 } from "@fable-org/fable-library-js/Int32.js";
|
|
12
12
|
import { reactApi } from "../../../fable_modules/Feliz.2.8.0/Interop.fs.js";
|
|
13
13
|
import { tryParse } from "@fable-org/fable-library-js/Double.js";
|
|
14
14
|
import { ReactElement } from "../../../fable_modules/Fable.React.Types.18.3.0/Fable.React.fs.js";
|
|
15
|
+
import { empty, singleton, append, delay, toList } from "@fable-org/fable-library-js/Seq.js";
|
|
15
16
|
import { append as append_1, cons, empty as empty_1, tryFind, FSharpList, exists, singleton as singleton_1, ofArray } from "@fable-org/fable-library-js/List.js";
|
|
17
|
+
import { IReactProperty } from "../../../fable_modules/Feliz.2.8.0/Types.fs.js";
|
|
16
18
|
import { withLabelAndError } from "../../../fable_modules/Fable.Form.Simple.Bulma.5.0.1/Html.View.fs.js";
|
|
17
|
-
import { empty, singleton, append, delay, toList } from "@fable-org/fable-library-js/Seq.js";
|
|
18
19
|
import { IStandardField$3_$reflection, IStandardField$3, IField$1, StandardRenderFieldConfig$2 } from "../../../fable_modules/Fable.Form.Simple.Bulma.5.0.1/Types.fs.js";
|
|
19
20
|
import { Spec_FormField$1, Spec_FieldType_$union, Shared_FieldOption, Shared_FieldValue_$union, Shared_FieldKey, Shared_FieldValue_PluginData, Shared_PluginDataProperty, Shared_PluginPropertyKey, Spec_PluginFieldConfig } from "../../../FormSpec.FS/FormSpec.js";
|
|
20
21
|
import { FSharpResult$2_$union, FSharpResult$2_Error, FSharpResult$2_Ok } from "@fable-org/fable-library-js/Result.js";
|
|
@@ -101,62 +102,50 @@ export function VitalsField_VitalsFieldComponent(config: StandardRenderFieldConf
|
|
|
101
102
|
};
|
|
102
103
|
config.OnChange(serializeVitalsData(new VitalsData(parseOpt(temperature), parseOpt(systolicBP), parseOpt(diastolicBP), parseOpt(pulse), parseOpt(respiration), parseOpt(oxygenSat), parseOpt(painScale))));
|
|
103
104
|
}, dependencies);
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
let outArg_1 = 0;
|
|
111
|
-
matchValue_1 = ([tryParse(raw, new FSharpRef<float64>((): float64 => outArg_1, (v_2: float64): void => {
|
|
112
|
-
outArg_1 = v_2;
|
|
113
|
-
})), outArg_1] as [boolean, float64]);
|
|
114
|
-
if (matchValue_1[0]) {
|
|
115
|
-
return matchValue_1[1];
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
return undefined;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
105
|
+
const statusBadge = (clinicalStatus: string): ReactElement => {
|
|
106
|
+
const patternInput_7: [string, string] = (clinicalStatus === "invalid") ? (["bg-red-100 text-red-800 border border-red-300", "Invalid"] as [string, string]) : ((clinicalStatus === "critical") ? (["bg-red-100 text-red-700 border border-red-200", "Critical"] as [string, string]) : ((clinicalStatus === "abnormal") ? (["bg-amber-100 text-amber-700 border border-amber-200", "Abnormal"] as [string, string]) : ((clinicalStatus === "normal") ? (["bg-emerald-100 text-emerald-700 border border-emerald-200", "Normal"] as [string, string]) : (["bg-slate-100 text-slate-600 border border-slate-200", "Pending"] as [string, string]))));
|
|
107
|
+
return createElement<any>("span", {
|
|
108
|
+
className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${patternInput_7[0]}`,
|
|
109
|
+
children: patternInput_7[1],
|
|
110
|
+
});
|
|
121
111
|
};
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
});
|
|
126
|
-
const createVitalInput = (label_1: string, value_18: string, setValue: ((arg0: string) => void), unitText: string, placeholder: string, isValid: ((arg0: float64) => boolean), isCritical: ((arg0: float64) => boolean), isNormal: Option<((arg0: float64) => boolean)>): ReactElement => {
|
|
127
|
-
let elems_1: Iterable<ReactElement>, elems: Iterable<ReactElement>;
|
|
128
|
-
const vitalStatus: string = getVitalStatus(parseNumeric(value_18), isValid, isCritical, isNormal);
|
|
112
|
+
const createVitalInput = (label_1: string, propertyName: string, value_18: string, setValue: ((arg0: string) => void), unitText: string, placeholder: string): ReactElement => {
|
|
113
|
+
let matchValue_1: string, elems_1: Iterable<ReactElement>;
|
|
114
|
+
const validation: VitalPropertyValidation = validateVitalsProperty(propertyName, value_18);
|
|
129
115
|
let inputClass: string;
|
|
130
116
|
const baseClass = "mt-1 block w-full rounded-md border bg-white px-2.5 py-1.5 text-sm text-slate-900 shadow-sm transition placeholder:text-slate-400 focus:outline-none focus:ring-2 disabled:cursor-not-allowed disabled:bg-slate-100 disabled:text-slate-500";
|
|
131
|
-
inputClass = ((config.ShowError && (config.Error != null)) ? (`${baseClass} border-red-400 focus:border-red-500 focus:ring-red-500/30`) : (`${baseClass} ${(
|
|
132
|
-
return createElement<any>("div", createObj(ofArray([["className", "rounded-lg border border-slate-200 bg-white p-2.5 shadow-sm"] as [string, any], (elems_1 =
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
children:
|
|
147
|
-
|
|
117
|
+
inputClass = ((config.ShowError && (config.Error != null)) ? (`${baseClass} border-red-400 focus:border-red-500 focus:ring-red-500/30`) : (`${baseClass} ${(matchValue_1 = validation.ClinicalStatus, (matchValue_1 === "invalid") ? "border-red-400 focus:border-red-500 focus:ring-red-500/30" : ((matchValue_1 === "critical") ? "border-red-300 focus:border-red-500 focus:ring-red-500/30" : ((matchValue_1 === "abnormal") ? "border-amber-300 focus:border-amber-500 focus:ring-amber-500/30" : "border-slate-300 focus:border-sky-500 focus:ring-sky-500/30")))}`));
|
|
118
|
+
return createElement<any>("div", createObj(ofArray([["className", "rounded-lg border border-slate-200 bg-white p-2.5 shadow-sm"] as [string, any], (elems_1 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => {
|
|
119
|
+
let elems: Iterable<ReactElement>;
|
|
120
|
+
return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex items-center justify-between gap-3"] as [string, any], (elems = [createElement<any>("label", {
|
|
121
|
+
className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
|
|
122
|
+
children: label_1,
|
|
123
|
+
}), statusBadge(validation.ClinicalStatus)], ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("input", {
|
|
124
|
+
type: "number",
|
|
125
|
+
className: inputClass,
|
|
126
|
+
value: value_18,
|
|
127
|
+
placeholder: placeholder,
|
|
128
|
+
disabled: config.Disabled ? true : config.IsReadOnly,
|
|
129
|
+
onChange: (ev: Event): void => {
|
|
130
|
+
setValue(ev.target.value);
|
|
131
|
+
},
|
|
132
|
+
})), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((validation.Message !== "") ? singleton<ReactElement>(createElement<any>("p", createObj(toList<IReactProperty>(delay<IReactProperty>((): Iterable<IReactProperty> => append<IReactProperty>(singleton<IReactProperty>(["className", !validation.IsValid ? "mt-1 text-[11px] text-red-600 font-medium" : "mt-1 text-[11px] text-amber-600"] as [string, any]), delay<IReactProperty>((): Iterable<IReactProperty> => singleton<IReactProperty>(["children", validation.Message] as [string, any])))))))) : empty<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => singleton<ReactElement>(createElement<any>("p", {
|
|
133
|
+
className: "mt-1 text-[11px] text-slate-500",
|
|
134
|
+
children: unitText,
|
|
135
|
+
}))))))));
|
|
136
|
+
})), ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any])])));
|
|
148
137
|
};
|
|
149
138
|
return withLabelAndError(config.Attributes.Label, config.ShowError, config.Error, createElement<any>("div", createObj(ofArray([["className", "space-y-2.5"] as [string, any], (elems_12 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => {
|
|
150
139
|
let elems_8: Iterable<ReactElement>;
|
|
151
|
-
return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "grid grid-cols-1 auto-rows-min content-start items-start gap-2 md:grid-cols-2 lg:grid-cols-3"] as [string, any], (elems_8 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(vitalsConfig.IncludeTemperature ? singleton<ReactElement>(createVitalInput("Temperature", temperature, patternInput[1], "Normal: 97-99°F", "98.6"
|
|
152
|
-
let
|
|
153
|
-
return append<ReactElement>(vitalsConfig.IncludeBP ? ((
|
|
140
|
+
return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "grid grid-cols-1 auto-rows-min content-start items-start gap-2 md:grid-cols-2 lg:grid-cols-3"] as [string, any], (elems_8 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(vitalsConfig.IncludeTemperature ? singleton<ReactElement>(createVitalInput("Temperature", "temperature", temperature, patternInput[1], "Normal: 97-99°F", "98.6")) : empty<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => {
|
|
141
|
+
let systolicValidation: VitalPropertyValidation, diastolicValidation: VitalPropertyValidation, elems_7: Iterable<ReactElement>, elems_3: Iterable<ReactElement>, elems_2: Iterable<ReactElement>, elems_6: Iterable<ReactElement>, elems_4: Iterable<ReactElement>, value_70: string, elems_5: Iterable<ReactElement>, value_89: string;
|
|
142
|
+
return append<ReactElement>(vitalsConfig.IncludeBP ? ((systolicValidation = validateVitalsProperty("systolic_bp", systolicBP), (diastolicValidation = validateVitalsProperty("diastolic_bp", diastolicBP), singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "rounded-lg border border-slate-200 bg-white p-2.5 shadow-sm"] as [string, any], (elems_7 = [createElement<any>("div", createObj(ofArray([["className", "flex items-center justify-between gap-3"] as [string, any], (elems_3 = [createElement<any>("label", {
|
|
154
143
|
className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
|
|
155
144
|
children: "Blood Pressure",
|
|
156
|
-
}), createElement<any>("div", createObj(ofArray([["className", "inline-flex gap-2"] as [string, any], (elems_2 = [statusBadge(
|
|
145
|
+
}), createElement<any>("div", createObj(ofArray([["className", "inline-flex gap-2"] as [string, any], (elems_2 = [statusBadge(systolicValidation.ClinicalStatus), statusBadge(diastolicValidation.ClinicalStatus)], ["children", reactApi.Children.toArray(Array.from(elems_2))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_3))] as [string, any])]))), createElement<any>("div", createObj(ofArray([["className", "mt-1 grid grid-cols-[1fr_auto_1fr] items-center gap-1.5"] as [string, any], (elems_6 = [createElement<any>("div", createObj(singleton_1((elems_4 = [createElement<any>("label", {
|
|
157
146
|
className: "text-[11px] font-medium text-slate-600",
|
|
158
147
|
children: "Systolic",
|
|
159
|
-
}), createElement<any>("input", createObj(ofArray([["type", "number"] as [string, any], (
|
|
148
|
+
}), createElement<any>("input", createObj(ofArray([["type", "number"] as [string, any], (value_70 = "mt-1 block w-full rounded-md border border-slate-300 bg-white px-2.5 py-1.5 text-sm shadow-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30 disabled:cursor-not-allowed disabled:bg-slate-100 disabled:text-slate-500", ["className", value_70] as [string, any]), ["value", systolicBP] as [string, any], ["placeholder", "120"] as [string, any], ["disabled", config.Disabled ? true : config.IsReadOnly] as [string, any], ["onChange", (ev_1: Event): void => {
|
|
160
149
|
patternInput_1[1](ev_1.target.value);
|
|
161
150
|
}] as [string, any]])))], ["children", reactApi.Children.toArray(Array.from(elems_4))] as [string, any])))), createElement<any>("div", {
|
|
162
151
|
className: "pt-4 text-base font-semibold text-slate-500",
|
|
@@ -164,12 +153,12 @@ export function VitalsField_VitalsFieldComponent(config: StandardRenderFieldConf
|
|
|
164
153
|
}), createElement<any>("div", createObj(singleton_1((elems_5 = [createElement<any>("label", {
|
|
165
154
|
className: "text-[11px] font-medium text-slate-600",
|
|
166
155
|
children: "Diastolic",
|
|
167
|
-
}), createElement<any>("input", createObj(ofArray([["type", "number"] as [string, any], (
|
|
156
|
+
}), createElement<any>("input", createObj(ofArray([["type", "number"] as [string, any], (value_89 = "mt-1 block w-full rounded-md border border-slate-300 bg-white px-2.5 py-1.5 text-sm shadow-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30 disabled:cursor-not-allowed disabled:bg-slate-100 disabled:text-slate-500", ["className", value_89] as [string, any]), ["value", diastolicBP] as [string, any], ["placeholder", "80"] as [string, any], ["disabled", config.Disabled ? true : config.IsReadOnly] as [string, any], ["onChange", (ev_2: Event): void => {
|
|
168
157
|
patternInput_2[1](ev_2.target.value);
|
|
169
158
|
}] as [string, any]])))], ["children", reactApi.Children.toArray(Array.from(elems_5))] as [string, any]))))], ["children", reactApi.Children.toArray(Array.from(elems_6))] as [string, any])]))), createElement<any>("p", {
|
|
170
159
|
className: "mt-1 text-[11px] text-slate-500",
|
|
171
160
|
children: "mmHg",
|
|
172
|
-
})], ["children", reactApi.Children.toArray(Array.from(elems_7))] as [string, any])]))))))) : empty<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(vitalsConfig.IncludePulse ? singleton<ReactElement>(createVitalInput("Pulse Rate", pulse, patternInput_3[1], "BPM", "72"
|
|
161
|
+
})], ["children", reactApi.Children.toArray(Array.from(elems_7))] as [string, any])]))))))) : empty<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(vitalsConfig.IncludePulse ? singleton<ReactElement>(createVitalInput("Pulse Rate", "pulse", pulse, patternInput_3[1], "BPM", "72")) : empty<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(vitalsConfig.IncludeRespiration ? singleton<ReactElement>(createVitalInput("Respiration Rate", "respiration", respiration, patternInput_4[1], "per minute", "16")) : empty<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(vitalsConfig.IncludeOxygenSat ? singleton<ReactElement>(createVitalInput("Oxygen Saturation", "oxygen_saturation", oxygenSat, patternInput_5[1], "%", "98")) : empty<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => (vitalsConfig.IncludePainScale ? singleton<ReactElement>(createVitalInput("Pain Scale", "pain_scale", painScale, patternInput_6[1], "0-10 scale", "0")) : empty<ReactElement>())))))))));
|
|
173
162
|
})))), ["children", reactApi.Children.toArray(Array.from(elems_8))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
|
|
174
163
|
let elems_11: Iterable<ReactElement>, elems_10: Iterable<ReactElement>, elems_9: Iterable<ReactElement>;
|
|
175
164
|
return exists<string>((s_1: string): boolean => !isNullOrWhiteSpace(s_1), ofArray([temperature, systolicBP, diastolicBP, pulse, respiration, oxygenSat, painScale])) ? singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "rounded-lg border border-sky-200 bg-sky-50/60 p-2.5 shadow-sm"] as [string, any], (elems_11 = [createElement<any>("h6", {
|
|
@@ -243,7 +232,7 @@ export const Form_PropertyKeys_PainScale: Shared_PluginPropertyKey = new Shared_
|
|
|
243
232
|
|
|
244
233
|
export const Form_enhancedVitalsConverter: IPluginValueConverter = new IPluginValueConverter((fieldKey: Shared_FieldKey, pluginValue: any): Option<Shared_FieldValue_$union> => {
|
|
245
234
|
const vitalsData: VitalsData = pluginValue;
|
|
246
|
-
return Shared_FieldValue_PluginData(toList<Shared_PluginDataProperty>(delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData.Temperature != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Temperature, "temperature", "float",
|
|
235
|
+
return Shared_FieldValue_PluginData(toList<Shared_PluginDataProperty>(delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData.Temperature != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Temperature, "temperature", "float", value_144(vitalsData.Temperature).toString(), "Temperature", "°F", "Body temperature in Fahrenheit")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData.SystolicBP != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_SystolicBP, "systolic_bp", "float", value_144(vitalsData.SystolicBP).toString(), "Systolic BP", "mmHg", "Systolic blood pressure")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData.DiastolicBP != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_DiastolicBP, "diastolic_bp", "float", value_144(vitalsData.DiastolicBP).toString(), "Diastolic BP", "mmHg", "Diastolic blood pressure")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData.Pulse != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Pulse, "pulse", "float", value_144(vitalsData.Pulse).toString(), "Pulse Rate", "BPM", "Heart rate in beats per minute")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData.Respiration != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Respiration, "respiration", "float", value_144(vitalsData.Respiration).toString(), "Respiration Rate", "RPM", "Respiratory rate per minute")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData.OxygenSaturation != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_OxygenSaturation, "oxygen_saturation", "float", value_144(vitalsData.OxygenSaturation).toString(), "O2 Saturation", "%", "Oxygen saturation percentage")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => ((vitalsData.PainScale != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_PainScale, "pain_scale", "float", value_144(vitalsData.PainScale).toString(), "Pain Level", "/10", "Pain scale from 0 to 10")) : empty<Shared_PluginDataProperty>()))))))))))))))));
|
|
247
236
|
}, (fieldValue: Shared_FieldValue_$union): Option<any> => {
|
|
248
237
|
switch (fieldValue.tag) {
|
|
249
238
|
case /* PluginData */ 3: {
|
|
@@ -357,7 +346,7 @@ export const Form_enhancedVitalsConverter: IPluginValueConverter = new IPluginVa
|
|
|
357
346
|
return fieldValue_3.fields[0];
|
|
358
347
|
case /* Single */ 0: {
|
|
359
348
|
const vitalsData_3: VitalsData = parseVitalsData(fieldValue_3.fields[0].Value);
|
|
360
|
-
return toList<Shared_PluginDataProperty>(delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData_3.Temperature != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Temperature, "temperature", "float",
|
|
349
|
+
return toList<Shared_PluginDataProperty>(delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData_3.Temperature != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Temperature, "temperature", "float", value_144(vitalsData_3.Temperature).toString(), "Temperature", "°F", "Body temperature in Fahrenheit")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData_3.SystolicBP != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_SystolicBP, "systolic_bp", "float", value_144(vitalsData_3.SystolicBP).toString(), "Systolic BP", "mmHg", "Systolic blood pressure")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData_3.DiastolicBP != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_DiastolicBP, "diastolic_bp", "float", value_144(vitalsData_3.DiastolicBP).toString(), "Diastolic BP", "mmHg", "Diastolic blood pressure")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData_3.Pulse != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Pulse, "pulse", "float", value_144(vitalsData_3.Pulse).toString(), "Pulse Rate", "BPM", "Heart rate in beats per minute")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData_3.Respiration != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_Respiration, "respiration", "float", value_144(vitalsData_3.Respiration).toString(), "Respiration Rate", "RPM", "Respiratory rate per minute")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => append<Shared_PluginDataProperty>((vitalsData_3.OxygenSaturation != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_OxygenSaturation, "oxygen_saturation", "float", value_144(vitalsData_3.OxygenSaturation).toString(), "O2 Saturation", "%", "Oxygen saturation percentage")) : empty<Shared_PluginDataProperty>(), delay<Shared_PluginDataProperty>((): Iterable<Shared_PluginDataProperty> => ((vitalsData_3.PainScale != null) ? singleton<Shared_PluginDataProperty>(new Shared_PluginDataProperty(Form_PropertyKeys_PainScale, "pain_scale", "float", value_144(vitalsData_3.PainScale).toString(), "Pain Level", "/10", "Pain scale from 0 to 10")) : empty<Shared_PluginDataProperty>())))))))))))))));
|
|
361
350
|
}
|
|
362
351
|
default:
|
|
363
352
|
return empty_1<Shared_PluginDataProperty>();
|
|
@@ -410,33 +399,33 @@ export function Form_markdownRenderer(field: Spec_FormField$1<Spec_FieldType_$un
|
|
|
410
399
|
if (exists<Option<float64>>((option: Option<float64>): boolean => (option != null), ofArray([vitalsData.Temperature, vitalsData.SystolicBP, vitalsData.DiastolicBP, vitalsData.Pulse, vitalsData.Respiration, vitalsData.OxygenSaturation, vitalsData.PainScale]))) {
|
|
411
400
|
let rows: FSharpList<string> = ofArray([("**" + field.Label) + "** 🩺", "", "| Vital Sign | Value | Status |", "|------------|-------|--------|"]);
|
|
412
401
|
if (vitalsData.Temperature != null) {
|
|
413
|
-
const temp: float64 =
|
|
402
|
+
const temp: float64 = value_144(vitalsData.Temperature);
|
|
414
403
|
const status: string = isCriticalTemperature(temp) ? "🚨 CRITICAL" : (!isValidTemperature(temp) ? "⚠️ ABNORMAL" : (!isNormalTemperature(temp) ? "⚠️ ABNORMAL" : "✅ Normal"));
|
|
415
404
|
rows = append_1(rows, singleton_1(((("| **Temperature** | " + toText(printf("%.1f"))(temp)) + "°F | ") + status) + " |"));
|
|
416
405
|
}
|
|
417
406
|
if ((vitalsData.SystolicBP != null) && (vitalsData.DiastolicBP != null)) {
|
|
418
|
-
const sys: float64 =
|
|
419
|
-
const dia: float64 =
|
|
407
|
+
const sys: float64 = value_144(vitalsData.SystolicBP);
|
|
408
|
+
const dia: float64 = value_144(vitalsData.DiastolicBP);
|
|
420
409
|
const status_1: string = (isCriticalSystolicBP(sys) ? true : isCriticalDiastolicBP(dia)) ? "🚨 CRITICAL" : ((!isValidSystolicBP(sys) ? true : !isValidDiastolicBP(dia)) ? "⚠️ ABNORMAL" : "✅ Normal");
|
|
421
410
|
rows = append_1(rows, singleton_1(((((("| **Blood Pressure** | " + toText(printf("%.0f"))(sys)) + "/") + toText(printf("%.0f"))(dia)) + " mmHg | ") + status_1) + " |"));
|
|
422
411
|
}
|
|
423
412
|
if (vitalsData.Pulse != null) {
|
|
424
|
-
const pulse: float64 =
|
|
413
|
+
const pulse: float64 = value_144(vitalsData.Pulse);
|
|
425
414
|
const status_2: string = isCriticalPulse(pulse) ? "🚨 CRITICAL" : (!isValidPulse(pulse) ? "⚠️ ABNORMAL" : "✅ Normal");
|
|
426
415
|
rows = append_1(rows, singleton_1(((("| **Pulse Rate** | " + toText(printf("%.0f"))(pulse)) + " BPM | ") + status_2) + " |"));
|
|
427
416
|
}
|
|
428
417
|
if (vitalsData.Respiration != null) {
|
|
429
|
-
const resp: float64 =
|
|
418
|
+
const resp: float64 = value_144(vitalsData.Respiration);
|
|
430
419
|
const status_3: string = isCriticalRespiration(resp) ? "🚨 CRITICAL" : (!isValidRespiration(resp) ? "⚠️ ABNORMAL" : "✅ Normal");
|
|
431
420
|
rows = append_1(rows, singleton_1(((("| **Respiration** | " + toText(printf("%.0f"))(resp)) + " RPM | ") + status_3) + " |"));
|
|
432
421
|
}
|
|
433
422
|
if (vitalsData.OxygenSaturation != null) {
|
|
434
|
-
const sat: float64 =
|
|
423
|
+
const sat: float64 = value_144(vitalsData.OxygenSaturation);
|
|
435
424
|
const status_4: string = isCriticalOxygenSat(sat) ? "🚨 CRITICAL" : (!isValidOxygenSat(sat) ? "⚠️ ABNORMAL" : "✅ Normal");
|
|
436
425
|
rows = append_1(rows, singleton_1(((("| **O2 Saturation** | " + toText(printf("%.0f"))(sat)) + "% | ") + status_4) + " |"));
|
|
437
426
|
}
|
|
438
427
|
if (vitalsData.PainScale != null) {
|
|
439
|
-
const pain: float64 =
|
|
428
|
+
const pain: float64 = value_144(vitalsData.PainScale);
|
|
440
429
|
const status_5: string = (pain >= 7) ? "🔴 Severe" : ((pain >= 4) ? "🟡 Moderate" : "🟢 Mild");
|
|
441
430
|
rows = append_1(rows, singleton_1(((("| **Pain Scale** | " + toText(printf("%.0f"))(pain)) + "/10 | ") + status_5) + " |"));
|
|
442
431
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { FSharpRef, Record } from "@fable-org/fable-library-js/Types.js";
|
|
2
|
-
import { value as value_2, map, defaultArg, Option } from "@fable-org/fable-library-js/Option.js";
|
|
2
|
+
import { bind, value as value_2, map, defaultArg, Option } from "@fable-org/fable-library-js/Option.js";
|
|
3
3
|
import { float64 } from "@fable-org/fable-library-js/Int32.js";
|
|
4
4
|
import { IComparable, IEquatable } from "@fable-org/fable-library-js/Util.js";
|
|
5
5
|
import { lambda_type, array_type, string_type, bool_type, record_type, option_type, float64_type, TypeInfo } from "@fable-org/fable-library-js/Reflection.js";
|
|
6
6
|
import { join, split, isNullOrWhiteSpace } from "@fable-org/fable-library-js/String.js";
|
|
7
7
|
import { tryParse } from "@fable-org/fable-library-js/Double.js";
|
|
8
|
-
import { map as map_1, tryFind, item } from "@fable-org/fable-library-js/Array.js";
|
|
9
|
-
import { FSharpList, tryFind as tryFind_1 } from "@fable-org/fable-library-js/List.js";
|
|
8
|
+
import { zip, map as map_1, tryFind, item } from "@fable-org/fable-library-js/Array.js";
|
|
10
9
|
import { Shared_PluginDataProperty } from "../../../FormSpec.FS/FormSpec.js";
|
|
10
|
+
import { FSharpList, tryFind as tryFind_1 } from "@fable-org/fable-library-js/List.js";
|
|
11
11
|
|
|
12
12
|
export class VitalsData extends Record implements IEquatable<VitalsData>, IComparable<VitalsData> {
|
|
13
13
|
readonly Temperature: Option<float64>;
|
|
@@ -341,20 +341,59 @@ export function validateVitalsProperty(propertyName: string, rawValue: string):
|
|
|
341
341
|
}
|
|
342
342
|
}
|
|
343
343
|
|
|
344
|
+
function validateTypedValue(def: VitalPropertyDef, value: Option<float64>): VitalPropertyValidation {
|
|
345
|
+
if (value != null) {
|
|
346
|
+
const v: float64 = value_2(value);
|
|
347
|
+
const rawValue: string = v.toString();
|
|
348
|
+
if (!def.IsValid(v)) {
|
|
349
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, rawValue, false, "invalid", ((((def.DisplayName + " must be ") + def.ValidRangeDescription) + ", got ") + rawValue) + def.Unit);
|
|
350
|
+
}
|
|
351
|
+
else if (def.IsCritical(v)) {
|
|
352
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, rawValue, true, "critical", (((def.DisplayName + " ") + rawValue) + def.Unit) + " — CRITICAL");
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
const status: string = getVitalStatus(v, def.IsValid, def.IsCritical, def.IsNormal);
|
|
356
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, rawValue, true, status, (status === "abnormal") ? ((((def.DisplayName + " ") + rawValue) + def.Unit) + " — above normal") : "");
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
return new VitalPropertyValidation(def.Name, def.DisplayName, def.Unit, "", true, "empty", "");
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Core validator — operates on the typed domain object. Single source of medical truth.
|
|
366
|
+
* Studio calls this via parseVitalsData → validateVitalsData.
|
|
367
|
+
* HealixAI calls this via PluginDataProperty list → converter → validateVitalsData.
|
|
368
|
+
*/
|
|
369
|
+
export function validateVitalsData(data: VitalsData): VitalsValidationResult {
|
|
370
|
+
const results: VitalPropertyValidation[] = map_1<[VitalPropertyDef, Option<float64>], VitalPropertyValidation>((tupledArg: [VitalPropertyDef, Option<float64>]): VitalPropertyValidation => validateTypedValue(tupledArg[0], tupledArg[1]), zip<VitalPropertyDef, Option<float64>>(vitalPropertyDefs, [data.Temperature, data.SystolicBP, data.DiastolicBP, data.Pulse, data.Respiration, data.OxygenSaturation, data.PainScale]));
|
|
371
|
+
return new VitalsValidationResult(results.every((r: VitalPropertyValidation): boolean => r.IsValid), results.some((r_1: VitalPropertyValidation): boolean => (r_1.ClinicalStatus === "critical")), results);
|
|
372
|
+
}
|
|
373
|
+
|
|
344
374
|
/**
|
|
345
|
-
* Validate
|
|
375
|
+
* Validate plugin data from the wire format. Parses to VitalsData, then delegates to validateVitalsData.
|
|
346
376
|
*/
|
|
347
377
|
export function validateVitalsPluginData(properties: FSharpList<Shared_PluginDataProperty>): VitalsValidationResult {
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
return validateVitalsProperty(def.Name, value_2(propOpt).Value);
|
|
378
|
+
const getPropertyValue = (name: string): Option<float64> => bind<Shared_PluginDataProperty, float64>((p_1: Shared_PluginDataProperty): Option<float64> => {
|
|
379
|
+
if (isNullOrWhiteSpace(p_1.Value)) {
|
|
380
|
+
return undefined;
|
|
352
381
|
}
|
|
353
382
|
else {
|
|
354
|
-
|
|
383
|
+
let matchValue: [boolean, float64];
|
|
384
|
+
let outArg = 0;
|
|
385
|
+
matchValue = ([tryParse(p_1.Value, new FSharpRef<float64>((): float64 => outArg, (v: float64): void => {
|
|
386
|
+
outArg = v;
|
|
387
|
+
})), outArg] as [boolean, float64]);
|
|
388
|
+
if (matchValue[0]) {
|
|
389
|
+
return matchValue[1];
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
return undefined;
|
|
393
|
+
}
|
|
355
394
|
}
|
|
356
|
-
},
|
|
357
|
-
return new
|
|
395
|
+
}, tryFind_1<Shared_PluginDataProperty>((p: Shared_PluginDataProperty): boolean => (p.Name === name), properties));
|
|
396
|
+
return validateVitalsData(new VitalsData(getPropertyValue("temperature"), getPropertyValue("systolic_bp"), getPropertyValue("diastolic_bp"), getPropertyValue("pulse"), getPropertyValue("respiration"), getPropertyValue("oxygen_saturation"), getPropertyValue("pain_scale")));
|
|
358
397
|
}
|
|
359
398
|
|
|
360
399
|
//# sourceMappingURL=VitalsLogic.ts.map
|