@f1studio/form-spec 5.0.0-alpha.140 → 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.
Files changed (105) hide show
  1. package/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRElementTypeMap.d.ts +3 -2
  2. package/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRElementTypeMap.d.ts.map +1 -1
  3. package/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRFieldTypeMapper.d.ts.map +1 -1
  4. package/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMREncoder.d.ts.map +1 -1
  5. package/FormSpec.FS/Integrations/OpenFda/OpenFdaTypes.d.ts +74 -0
  6. package/FormSpec.FS/Integrations/OpenFda/OpenFdaTypes.d.ts.map +1 -0
  7. package/FormSpec.TS/FormSpec.FS/BlueprintValidation.js.map +1 -1
  8. package/FormSpec.TS/FormSpec.FS/BlueprintValidation.ts.map +1 -1
  9. package/FormSpec.TS/FormSpec.FS/FormSpecHelpers.js.map +1 -1
  10. package/FormSpec.TS/FormSpec.FS/FormSpecHelpers.ts.map +1 -1
  11. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRElementTypeMap.js +36 -30
  12. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRElementTypeMap.js.map +1 -1
  13. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRElementTypeMap.ts.map +1 -1
  14. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRFieldTypeMapper.js +4 -19
  15. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRFieldTypeMapper.js.map +1 -1
  16. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRFieldTypeMapper.ts.map +1 -1
  17. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRTemplateToFormSpec.js.map +1 -1
  18. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRTemplateToFormSpec.ts.map +1 -1
  19. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMREncoder.js +12 -2
  20. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMREncoder.js.map +1 -1
  21. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMREncoder.ts.map +1 -1
  22. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMRSourceMap.js.map +1 -1
  23. package/FormSpec.TS/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMRSourceMap.ts.map +1 -1
  24. package/FormSpec.TS/FormSpec.FS/Integrations/CorEMR/TemplateManifestDecoder.js.map +1 -1
  25. package/FormSpec.TS/FormSpec.FS/Integrations/CorEMR/TemplateManifestDecoder.ts.map +1 -1
  26. package/FormSpec.TS/FormSpec.FS/Integrations/OpenFda/OpenFdaTypes.js +282 -0
  27. package/FormSpec.TS/FormSpec.FS/Integrations/OpenFda/OpenFdaTypes.js.map +1 -0
  28. package/FormSpec.TS/FormSpec.FS/Integrations/OpenFda/OpenFdaTypes.ts.map +1 -0
  29. package/FormSpec.TS/FormSpec.FS/Interop/Facade/FormAnswersGate.js.map +1 -1
  30. package/FormSpec.TS/FormSpec.FS/Interop/Facade/FormAnswersGate.ts.map +1 -1
  31. package/FormSpec.TS/FormSpec.FS/Interop/FormSpec.Api.Helpers.js.map +1 -1
  32. package/FormSpec.TS/FormSpec.FS/Interop/FormSpec.Api.Helpers.ts.map +1 -1
  33. package/FormSpec.TS/FormSpec.FS/Interop/FormSpec.Api.Option.js.map +1 -1
  34. package/FormSpec.TS/FormSpec.FS/Interop/FormSpec.Api.Option.ts.map +1 -1
  35. package/FormSpec.TS/FormSpec.FS/Interop/FormSpec.Values.Api.Option.js.map +1 -1
  36. package/FormSpec.TS/FormSpec.FS/Interop/FormSpec.Values.Api.Option.ts.map +1 -1
  37. package/FormSpec.TS/FormSpec.FS/Migrator.js.map +1 -1
  38. package/FormSpec.TS/FormSpec.FS/Migrator.ts.map +1 -1
  39. package/FormSpec.TS/FormSpec.FS/PathwayExecutor.js.map +1 -1
  40. package/FormSpec.TS/FormSpec.FS/PathwayExecutor.ts.map +1 -1
  41. package/FormSpec.TS/PluginRegistration.js +2 -0
  42. package/FormSpec.TS/PluginRegistration.js.map +1 -1
  43. package/FormSpec.TS/PluginRegistration.ts.map +1 -1
  44. package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Decode.js +63 -69
  45. package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Decode.js.map +1 -1
  46. package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Decode.ts.map +1 -1
  47. package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Encode.js +6 -10
  48. package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Encode.js.map +1 -1
  49. package/FormSpec.TS/Thoth.Json/packages/Thoth.Json/Encode.ts.map +1 -1
  50. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/AsyncIterable.fs +57 -0
  51. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/AsyncIterable.fs.js +119 -0
  52. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/AsyncIterable.fs.js.map +1 -0
  53. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/AsyncIterable.fs.ts.map +1 -0
  54. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/Fable.Promise.fableproj +20 -0
  55. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/Promise.fs +766 -0
  56. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/Promise.fs.js +165 -0
  57. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/Promise.fs.js.map +1 -0
  58. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/Promise.fs.ts.map +1 -0
  59. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs +31 -0
  60. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs.js +32 -0
  61. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs.js.map +1 -0
  62. package/FormSpec.TS/fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs.ts.map +1 -0
  63. package/FormSpec.TS/fable_modules/Feliz.2.8.0/DateParsing.fs.js.map +1 -1
  64. package/FormSpec.TS/fable_modules/Feliz.2.8.0/DateParsing.fs.ts.map +1 -1
  65. package/FormSpec.TS/fable_modules/project_cracked.json +1 -1
  66. package/FormSpec.TS/plugins/allergyfinder/src/AllergyFinderField.js +2431 -0
  67. package/FormSpec.TS/plugins/allergyfinder/src/AllergyFinderField.js.map +1 -0
  68. package/FormSpec.TS/plugins/allergyfinder/src/AllergyFinderField.ts.map +1 -0
  69. package/FormSpec.TS/plugins/allergyfinder/src/OpenFdaClient.js +107 -0
  70. package/FormSpec.TS/plugins/allergyfinder/src/OpenFdaClient.js.map +1 -0
  71. package/FormSpec.TS/plugins/allergyfinder/src/OpenFdaClient.ts.map +1 -0
  72. package/FormSpec.TS/plugins/vitals/src/VitalsField.js +85 -364
  73. package/FormSpec.TS/plugins/vitals/src/VitalsField.js.map +1 -1
  74. package/FormSpec.TS/plugins/vitals/src/VitalsField.ts.map +1 -1
  75. package/FormSpec.TS/plugins/vitals/src/VitalsLogic.js +548 -0
  76. package/FormSpec.TS/plugins/vitals/src/VitalsLogic.js.map +1 -0
  77. package/FormSpec.TS/plugins/vitals/src/VitalsLogic.ts.map +1 -0
  78. package/README.md +7 -7
  79. package/Thoth.Json/packages/Thoth.Json/Decode.d.ts +2 -2
  80. package/Thoth.Json/packages/Thoth.Json/Decode.d.ts.map +1 -1
  81. package/Thoth.Json/packages/Thoth.Json/Encode.d.ts.map +1 -1
  82. package/fable_modules/Fable.Promise.3.2.0/Promise.fs.d.ts +112 -0
  83. package/fable_modules/Fable.Promise.3.2.0/Promise.fs.d.ts.map +1 -0
  84. package/fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs.d.ts +8 -0
  85. package/fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs.d.ts.map +1 -0
  86. package/package.json +5 -1
  87. package/plugins/allergyfinder/src/AllergyFinderField.d.ts +116 -0
  88. package/plugins/allergyfinder/src/AllergyFinderField.d.ts.map +1 -0
  89. package/plugins/allergyfinder/src/OpenFdaClient.d.ts +5 -0
  90. package/plugins/allergyfinder/src/OpenFdaClient.d.ts.map +1 -0
  91. package/plugins/vitals/src/VitalsField.d.ts +4 -43
  92. package/plugins/vitals/src/VitalsField.d.ts.map +1 -1
  93. package/plugins/vitals/src/VitalsLogic.d.ts +78 -0
  94. package/plugins/vitals/src/VitalsLogic.d.ts.map +1 -0
  95. package/src/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRElementTypeMap.ts +35 -32
  96. package/src/FormSpec.FS/Integrations/Adapters/CorEMR/CorEMRFieldTypeMapper.ts +5 -22
  97. package/src/FormSpec.FS/Integrations/Adapters/CorEMR/CoreMREncoder.ts +13 -2
  98. package/src/FormSpec.FS/Integrations/OpenFda/OpenFdaTypes.ts +160 -0
  99. package/src/PluginRegistration.ts +2 -0
  100. package/src/Thoth.Json/packages/Thoth.Json/Decode.ts +38 -55
  101. package/src/Thoth.Json/packages/Thoth.Json/Encode.ts +10 -16
  102. package/src/plugins/allergyfinder/src/AllergyFinderField.ts +1341 -0
  103. package/src/plugins/allergyfinder/src/OpenFdaClient.ts +103 -0
  104. package/src/plugins/vitals/src/VitalsField.ts +78 -298
  105. package/src/plugins/vitals/src/VitalsLogic.ts +399 -0
@@ -0,0 +1,1341 @@
1
+ import { FSharpRef, toString as toString_1, Record, Union } from "@fable-org/fable-library-js/Types.js";
2
+ import { lambda_type, class_type, record_type, bool_type, list_type, option_type, string_type, union_type, TypeInfo } from "@fable-org/fable-library-js/Reflection.js";
3
+ import { LabelWarnings, CountResult, AllergenInsights, OpenFdaSearchResult_$reflection, OpenFdaSearchResult, AllergyCategory_$reflection, AllergyCategory_Custom, AllergyCategory_Environmental, AllergyCategory_Food, AllergyCategory_Drug, AllergyCategory_$union } from "../../../FormSpec.FS/Integrations/OpenFda/OpenFdaTypes.js";
4
+ import { orElseWith, unwrap, bind, map as map_2, value as value_284, some, defaultArgWith, defaultArg, Option } from "@fable-org/fable-library-js/Option.js";
5
+ import { tryFind, length, choose, singleton as singleton_1, contains, exists, filter, append as append_1, max, truncate, isEmpty as isEmpty_1, ofArray, empty, map, FSharpList } from "@fable-org/fable-library-js/List.js";
6
+ import { IDisposable, disposeSafe, IEnumerator, getEnumerator, equals, stringHash, int32ToString, comparePrimitives, defaultOf, createObj, uncurry2, IComparable, IEquatable } from "@fable-org/fable-library-js/Util.js";
7
+ import { toString, list as list_7, option as option_15, object } from "../../../Thoth.Json/packages/Thoth.Json/Encode.js";
8
+ import { fromString, IOptionalGetter, IGetters, bool, list as list_8, IRequiredGetter, string, object as object_1 } from "../../../Thoth.Json/packages/Thoth.Json/Decode.js";
9
+ import { FSharpResult$2_Error, FSharpResult$2_Ok, FSharpResult$2_$union } from "@fable-org/fable-library-js/Result.js";
10
+ import { ErrorReason_$union } from "../../../Thoth.Json/packages/Thoth.Json/Types.js";
11
+ import { newGuid } from "@fable-org/fable-library-js/Guid.js";
12
+ import { join, compare, isNullOrEmpty, isNullOrWhiteSpace } from "@fable-org/fable-library-js/String.js";
13
+ import { mapValues, Field$3, IAttributes } from "../../../fable_modules/Fable.Form.3.0.0/Field.fs.js";
14
+ import { Form$3, FieldConfig$4, field as field_1 } from "../../../fable_modules/Fable.Form.3.0.0/Base.fs.js";
15
+ import { createElement } from "react";
16
+ import React from "react";
17
+ import { IRefValue$1, ReactElement } from "../../../fable_modules/Fable.React.Types.18.3.0/Fable.React.fs.js";
18
+ import { reactApi } from "../../../fable_modules/Feliz.2.8.0/Interop.fs.js";
19
+ import { PromiseBuilder__Delay_62FBFDE1, PromiseBuilder__Run_212F1D4B } from "../../../fable_modules/Fable.Promise.3.2.0/Promise.fs.js";
20
+ import { promise } from "../../../fable_modules/Fable.Promise.3.2.0/PromiseImpl.fs.js";
21
+ import { searchAllergens, getAllergenInsights } from "./OpenFdaClient.js";
22
+ import { collect, empty as empty_1, map as map_1, singleton, append, delay, toList } from "@fable-org/fable-library-js/Seq.js";
23
+ import { tryParse, float64, int32 } from "@fable-org/fable-library-js/Int32.js";
24
+ import { IReactProperty } from "../../../fable_modules/Feliz.2.8.0/Types.fs.js";
25
+ import { IStandardField$3_$reflection, IStandardField$3, IField$1, StandardRenderFieldConfig$2 } from "../../../fable_modules/Fable.Form.Simple.Bulma.5.0.1/Types.fs.js";
26
+ import { Spec_FormField$1, Spec_FieldType_$union, Shared_FieldAnswer, Shared_FieldOption, Shared_FieldValue_$union, Shared_FieldKey, Shared_FieldValue_PluginData, Shared_PluginDataProperty, Shared_PluginPropertyKey, Spec_PluginFieldConfig } from "../../../FormSpec.FS/FormSpec.js";
27
+ import { IPluginValueConverter } from "../../../FormSpec.FS/PluginInterface.js";
28
+ import { Helpers_combineClasses } from "../../../fable_modules/Feliz.Bulma.3.0.0/ElementBuilders.fs.js";
29
+ import { RenderPreviewProps$1 } from "../../../FormSpec.FS/Interfaces.js";
30
+ import { FieldDetails } from "../../../FormSpec.FS/Designer.js";
31
+
32
+ export type AllergyFinderField_AllergySeverity_$union =
33
+ | AllergyFinderField_AllergySeverity<0>
34
+ | AllergyFinderField_AllergySeverity<1>
35
+ | AllergyFinderField_AllergySeverity<2>
36
+ | AllergyFinderField_AllergySeverity<3>
37
+ | AllergyFinderField_AllergySeverity<4>
38
+
39
+ export type AllergyFinderField_AllergySeverity_$cases = {
40
+ 0: ["Unknown", []],
41
+ 1: ["Mild", []],
42
+ 2: ["Moderate", []],
43
+ 3: ["Severe", []],
44
+ 4: ["LifeThreatening", []]
45
+ }
46
+
47
+ export function AllergyFinderField_AllergySeverity_Unknown() {
48
+ return new AllergyFinderField_AllergySeverity<0>(0, []);
49
+ }
50
+
51
+ export function AllergyFinderField_AllergySeverity_Mild() {
52
+ return new AllergyFinderField_AllergySeverity<1>(1, []);
53
+ }
54
+
55
+ export function AllergyFinderField_AllergySeverity_Moderate() {
56
+ return new AllergyFinderField_AllergySeverity<2>(2, []);
57
+ }
58
+
59
+ export function AllergyFinderField_AllergySeverity_Severe() {
60
+ return new AllergyFinderField_AllergySeverity<3>(3, []);
61
+ }
62
+
63
+ export function AllergyFinderField_AllergySeverity_LifeThreatening() {
64
+ return new AllergyFinderField_AllergySeverity<4>(4, []);
65
+ }
66
+
67
+ export class AllergyFinderField_AllergySeverity<Tag extends keyof AllergyFinderField_AllergySeverity_$cases> extends Union<Tag, AllergyFinderField_AllergySeverity_$cases[Tag][0]> {
68
+ constructor(readonly tag: Tag, readonly fields: AllergyFinderField_AllergySeverity_$cases[Tag][1]) {
69
+ super();
70
+ }
71
+ cases() {
72
+ return ["Unknown", "Mild", "Moderate", "Severe", "LifeThreatening"];
73
+ }
74
+ }
75
+
76
+ export function AllergyFinderField_AllergySeverity_$reflection(): TypeInfo {
77
+ return union_type("Fable.Form.Simple.Bulma.Fields.AllergyFinderField.AllergyFinderField.AllergySeverity", [], AllergyFinderField_AllergySeverity, () => [[], [], [], [], []]);
78
+ }
79
+
80
+ export function AllergyFinderField_severityToString(_arg: AllergyFinderField_AllergySeverity_$union): string {
81
+ switch (_arg.tag) {
82
+ case /* Mild */ 1:
83
+ return "mild";
84
+ case /* Moderate */ 2:
85
+ return "moderate";
86
+ case /* Severe */ 3:
87
+ return "severe";
88
+ case /* LifeThreatening */ 4:
89
+ return "life_threatening";
90
+ default:
91
+ return "unknown";
92
+ }
93
+ }
94
+
95
+ export function AllergyFinderField_severityFromString(_arg: string): AllergyFinderField_AllergySeverity_$union {
96
+ switch (_arg) {
97
+ case "mild":
98
+ return AllergyFinderField_AllergySeverity_Mild();
99
+ case "moderate":
100
+ return AllergyFinderField_AllergySeverity_Moderate();
101
+ case "severe":
102
+ return AllergyFinderField_AllergySeverity_Severe();
103
+ case "life_threatening":
104
+ return AllergyFinderField_AllergySeverity_LifeThreatening();
105
+ default:
106
+ return AllergyFinderField_AllergySeverity_Unknown();
107
+ }
108
+ }
109
+
110
+ export function AllergyFinderField_severityLabel(_arg: AllergyFinderField_AllergySeverity_$union): string {
111
+ switch (_arg.tag) {
112
+ case /* Mild */ 1:
113
+ return "Mild";
114
+ case /* Moderate */ 2:
115
+ return "Moderate";
116
+ case /* Severe */ 3:
117
+ return "Severe";
118
+ case /* LifeThreatening */ 4:
119
+ return "Life-threatening";
120
+ default:
121
+ return "Unknown";
122
+ }
123
+ }
124
+
125
+ export function AllergyFinderField_severityColor(_arg: AllergyFinderField_AllergySeverity_$union): string {
126
+ switch (_arg.tag) {
127
+ case /* Mild */ 1:
128
+ return "bg-emerald-100 text-emerald-700 border-emerald-200";
129
+ case /* Moderate */ 2:
130
+ return "bg-amber-100 text-amber-700 border-amber-200";
131
+ case /* Severe */ 3:
132
+ return "bg-orange-100 text-orange-700 border-orange-200";
133
+ case /* LifeThreatening */ 4:
134
+ return "bg-red-100 text-red-700 border-red-200";
135
+ default:
136
+ return "bg-slate-100 text-slate-600 border-slate-200";
137
+ }
138
+ }
139
+
140
+ export function AllergyFinderField_severityBorderColor(_arg: AllergyFinderField_AllergySeverity_$union): string {
141
+ switch (_arg.tag) {
142
+ case /* Mild */ 1:
143
+ return "border-l-emerald-400";
144
+ case /* Moderate */ 2:
145
+ return "border-l-amber-400";
146
+ case /* Severe */ 3:
147
+ return "border-l-orange-500";
148
+ case /* LifeThreatening */ 4:
149
+ return "border-l-red-500";
150
+ default:
151
+ return "border-l-slate-400";
152
+ }
153
+ }
154
+
155
+ export function AllergyFinderField_categoryToString(cat: AllergyCategory_$union): string {
156
+ switch (cat.tag) {
157
+ case /* Food */ 1:
158
+ return "food";
159
+ case /* Environmental */ 2:
160
+ return "environmental";
161
+ case /* Custom */ 3:
162
+ return "custom";
163
+ default:
164
+ return "drug";
165
+ }
166
+ }
167
+
168
+ export function AllergyFinderField_categoryFromString(_arg: string): AllergyCategory_$union {
169
+ switch (_arg) {
170
+ case "drug":
171
+ return AllergyCategory_Drug();
172
+ case "food":
173
+ return AllergyCategory_Food();
174
+ case "environmental":
175
+ return AllergyCategory_Environmental();
176
+ default:
177
+ return AllergyCategory_Custom();
178
+ }
179
+ }
180
+
181
+ export function AllergyFinderField_categoryLabel(cat: AllergyCategory_$union): string {
182
+ switch (cat.tag) {
183
+ case /* Food */ 1:
184
+ return "Food";
185
+ case /* Environmental */ 2:
186
+ return "Environmental";
187
+ case /* Custom */ 3:
188
+ return "Other";
189
+ default:
190
+ return "Drug";
191
+ }
192
+ }
193
+
194
+ export class AllergyFinderField_AllergyEntry extends Record implements IEquatable<AllergyFinderField_AllergyEntry>, IComparable<AllergyFinderField_AllergyEntry> {
195
+ readonly Id: string;
196
+ readonly Name: string;
197
+ readonly SubstanceName: string;
198
+ readonly NdcCode: Option<string>;
199
+ readonly Category: AllergyCategory_$union;
200
+ readonly Severity: AllergyFinderField_AllergySeverity_$union;
201
+ readonly Reactions: FSharpList<string>;
202
+ readonly Remedy: Option<string>;
203
+ readonly OnsetTiming: Option<string>;
204
+ readonly StaffOnly: boolean;
205
+ readonly Notes: Option<string>;
206
+ constructor(Id: string, Name: string, SubstanceName: string, NdcCode: Option<string>, Category: AllergyCategory_$union, Severity: AllergyFinderField_AllergySeverity_$union, Reactions: FSharpList<string>, Remedy: Option<string>, OnsetTiming: Option<string>, StaffOnly: boolean, Notes: Option<string>) {
207
+ super();
208
+ this.Id = Id;
209
+ this.Name = Name;
210
+ this.SubstanceName = SubstanceName;
211
+ this.NdcCode = NdcCode;
212
+ this.Category = Category;
213
+ this.Severity = Severity;
214
+ this.Reactions = Reactions;
215
+ this.Remedy = Remedy;
216
+ this.OnsetTiming = OnsetTiming;
217
+ this.StaffOnly = StaffOnly;
218
+ this.Notes = Notes;
219
+ }
220
+ }
221
+
222
+ export function AllergyFinderField_AllergyEntry_$reflection(): TypeInfo {
223
+ return record_type("Fable.Form.Simple.Bulma.Fields.AllergyFinderField.AllergyFinderField.AllergyEntry", [], AllergyFinderField_AllergyEntry, () => [["Id", string_type], ["Name", string_type], ["SubstanceName", string_type], ["NdcCode", option_type(string_type)], ["Category", AllergyCategory_$reflection()], ["Severity", AllergyFinderField_AllergySeverity_$reflection()], ["Reactions", list_type(string_type)], ["Remedy", option_type(string_type)], ["OnsetTiming", option_type(string_type)], ["StaffOnly", bool_type], ["Notes", option_type(string_type)]]);
224
+ }
225
+
226
+ export const AllergyFinderField_commonReactions: string[] = ["Rash", "Hives", "Itching", "Swelling", "Nausea", "Vomiting", "Diarrhea", "Difficulty Breathing", "Wheezing", "Anaphylaxis", "Dizziness", "Headache", "Fever", "Joint Pain", "Congestion", "Sneezing", "Watery Eyes"];
227
+
228
+ function AllergyFinderField_allergyEncoder(a: AllergyFinderField_AllergyEntry): any {
229
+ return object([["id", a.Id] as [string, any], ["name", a.Name] as [string, any], ["substanceName", a.SubstanceName] as [string, any], ["ndcCode", option_15<string>((value_3: string): any => value_3)(a.NdcCode)] as [string, any], ["category", AllergyFinderField_categoryToString(a.Category)] as [string, any], ["severity", AllergyFinderField_severityToString(a.Severity)] as [string, any], ["reactions", list_7(map<string, any>((value_7: string): any => value_7, a.Reactions))] as [string, any], ["remedy", option_15<string>((value_9: string): any => value_9)(a.Remedy)] as [string, any], ["onsetTiming", option_15<string>((value_11: string): any => value_11)(a.OnsetTiming)] as [string, any], ["staffOnly", a.StaffOnly] as [string, any], ["notes", option_15<string>((value_14: string): any => value_14)(a.Notes)] as [string, any]]);
230
+ }
231
+
232
+ const AllergyFinderField_allergyDecoder = (path_13: string): ((arg0: any) => FSharpResult$2_$union<AllergyFinderField_AllergyEntry, [string, ErrorReason_$union]>) => ((v: any): FSharpResult$2_$union<AllergyFinderField_AllergyEntry, [string, ErrorReason_$union]> => object_1<AllergyFinderField_AllergyEntry>((get$: IGetters): AllergyFinderField_AllergyEntry => {
233
+ let objectArg: IOptionalGetter, copyOfStruct: string, objectArg_1: IRequiredGetter, objectArg_2: IOptionalGetter, objectArg_4: IOptionalGetter, objectArg_5: IOptionalGetter, objectArg_6: IOptionalGetter, objectArg_7: IOptionalGetter, objectArg_8: IOptionalGetter, objectArg_9: IOptionalGetter, objectArg_10: IOptionalGetter, objectArg_11: IOptionalGetter;
234
+ return new AllergyFinderField_AllergyEntry(defaultArg((objectArg = get$.Optional, objectArg.Field<string>("id", string)), (copyOfStruct = newGuid(), copyOfStruct)), (objectArg_1 = get$.Required, objectArg_1.Field<string>("name", string)), defaultArgWith<string>((objectArg_2 = get$.Optional, objectArg_2.Field<string>("substanceName", string)), (): string => {
235
+ const objectArg_3: IRequiredGetter = get$.Required;
236
+ return objectArg_3.Field<string>("name", string);
237
+ }), (objectArg_4 = get$.Optional, objectArg_4.Field<string>("ndcCode", string)), AllergyFinderField_categoryFromString(defaultArg((objectArg_5 = get$.Optional, objectArg_5.Field<string>("category", string)), "drug")), AllergyFinderField_severityFromString(defaultArg((objectArg_6 = get$.Optional, objectArg_6.Field<string>("severity", string)), "unknown")), defaultArg((objectArg_7 = get$.Optional, objectArg_7.Field<FSharpList<string>>("reactions", (path_8: string, value_11: any): FSharpResult$2_$union<FSharpList<string>, [string, ErrorReason_$union]> => list_8<string>(string, path_8, value_11))), empty<string>()), (objectArg_8 = get$.Optional, objectArg_8.Field<string>("remedy", string)), (objectArg_9 = get$.Optional, objectArg_9.Field<string>("onsetTiming", string)), defaultArg((objectArg_10 = get$.Optional, objectArg_10.Field<boolean>("staffOnly", bool)), false), (objectArg_11 = get$.Optional, objectArg_11.Field<string>("notes", string)));
238
+ }, path_13, v));
239
+
240
+ export function AllergyFinderField_serializeAllergies(allergies: FSharpList<AllergyFinderField_AllergyEntry>): string {
241
+ return toString(0, list_7(map<AllergyFinderField_AllergyEntry, any>(AllergyFinderField_allergyEncoder, allergies)));
242
+ }
243
+
244
+ export function AllergyFinderField_parseAllergies(value: string): FSharpList<AllergyFinderField_AllergyEntry> {
245
+ if (isNullOrWhiteSpace(value) ? true : (value === "[]")) {
246
+ return empty<AllergyFinderField_AllergyEntry>();
247
+ }
248
+ else {
249
+ const matchValue: FSharpResult$2_$union<FSharpList<AllergyFinderField_AllergyEntry>, string> = fromString<FSharpList<AllergyFinderField_AllergyEntry>>((path: string, value_1: any): FSharpResult$2_$union<FSharpList<AllergyFinderField_AllergyEntry>, [string, ErrorReason_$union]> => list_8<AllergyFinderField_AllergyEntry>(uncurry2(AllergyFinderField_allergyDecoder), path, value_1), value);
250
+ if (matchValue.tag === /* Error */ 1) {
251
+ const err: string = matchValue.fields[0];
252
+ console.warn(some("AllergyFinder: failed to decode allergies:"), err);
253
+ return empty<AllergyFinderField_AllergyEntry>();
254
+ }
255
+ else {
256
+ return matchValue.fields[0];
257
+ }
258
+ }
259
+ }
260
+
261
+ export class AllergyFinderField_Attributes extends Record implements IAttributes {
262
+ readonly FieldId: string;
263
+ readonly Label: string;
264
+ readonly ApiFetch: ((arg0: string) => Promise<string>);
265
+ constructor(FieldId: string, Label: string, ApiFetch: ((arg0: string) => Promise<string>)) {
266
+ super();
267
+ this.FieldId = FieldId;
268
+ this.Label = Label;
269
+ this.ApiFetch = ApiFetch;
270
+ }
271
+ GetFieldId(): string {
272
+ const this$: AllergyFinderField_Attributes = this;
273
+ return this$.FieldId;
274
+ }
275
+ }
276
+
277
+ export function AllergyFinderField_Attributes_$reflection(): TypeInfo {
278
+ return record_type("Fable.Form.Simple.Bulma.Fields.AllergyFinderField.AllergyFinderField.Attributes", [], AllergyFinderField_Attributes, () => [["FieldId", string_type], ["Label", string_type], ["ApiFetch", lambda_type(string_type, class_type("Fable.Core.JS.Promise`1", [string_type]))]]);
279
+ }
280
+
281
+ export function AllergyFinderField_form<Values, Field, Output>(): ((arg0: ((arg0: Field$3<AllergyFinderField_Attributes, string, Values>) => Field)) => ((arg0: FieldConfig$4<AllergyFinderField_Attributes, string, Values, Output>) => Form$3<Values, Output, Field>)) {
282
+ return (build: ((arg0: Field$3<AllergyFinderField_Attributes, string, Values>) => Field)): ((arg0: FieldConfig$4<AllergyFinderField_Attributes, string, Values, Output>) => Form$3<Values, Output, Field>) => ((config: FieldConfig$4<AllergyFinderField_Attributes, string, Values, Output>): Form$3<Values, Output, Field> => field_1<string, AllergyFinderField_Attributes, Values, Field, Output>((v: string): boolean => {
283
+ if (isNullOrEmpty(v)) {
284
+ return true;
285
+ }
286
+ else {
287
+ return v === "[]";
288
+ }
289
+ }, build, config));
290
+ }
291
+
292
+ export type AllergyFinderField_DetailModalState_$union =
293
+ | AllergyFinderField_DetailModalState<0>
294
+ | AllergyFinderField_DetailModalState<1>
295
+ | AllergyFinderField_DetailModalState<2>
296
+
297
+ export type AllergyFinderField_DetailModalState_$cases = {
298
+ 0: ["Closed", []],
299
+ 1: ["Adding", [Option<OpenFdaSearchResult>]],
300
+ 2: ["Editing", [AllergyFinderField_AllergyEntry]]
301
+ }
302
+
303
+ export function AllergyFinderField_DetailModalState_Closed() {
304
+ return new AllergyFinderField_DetailModalState<0>(0, []);
305
+ }
306
+
307
+ export function AllergyFinderField_DetailModalState_Adding(Item: Option<OpenFdaSearchResult>) {
308
+ return new AllergyFinderField_DetailModalState<1>(1, [Item]);
309
+ }
310
+
311
+ export function AllergyFinderField_DetailModalState_Editing(Item: AllergyFinderField_AllergyEntry) {
312
+ return new AllergyFinderField_DetailModalState<2>(2, [Item]);
313
+ }
314
+
315
+ export class AllergyFinderField_DetailModalState<Tag extends keyof AllergyFinderField_DetailModalState_$cases> extends Union<Tag, AllergyFinderField_DetailModalState_$cases[Tag][0]> {
316
+ constructor(readonly tag: Tag, readonly fields: AllergyFinderField_DetailModalState_$cases[Tag][1]) {
317
+ super();
318
+ }
319
+ cases() {
320
+ return ["Closed", "Adding", "Editing"];
321
+ }
322
+ }
323
+
324
+ export function AllergyFinderField_DetailModalState_$reflection(): TypeInfo {
325
+ return union_type("Fable.Form.Simple.Bulma.Fields.AllergyFinderField.AllergyFinderField.DetailModalState", [], AllergyFinderField_DetailModalState, () => [[], [["Item", option_type(OpenFdaSearchResult_$reflection())]], [["Item", AllergyFinderField_AllergyEntry_$reflection()]]]);
326
+ }
327
+
328
+ /**
329
+ * Severity badge
330
+ */
331
+ export function AllergyFinderField_SeverityBadge(allergyFinderField_SeverityBadgeInputProps: any): ReactElement {
332
+ const severity: AllergyFinderField_AllergySeverity_$union = allergyFinderField_SeverityBadgeInputProps.severity;
333
+ return createElement<any>("span", {
334
+ className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium border ${AllergyFinderField_severityColor(severity)}`,
335
+ children: AllergyFinderField_severityLabel(severity),
336
+ });
337
+ }
338
+
339
+ /**
340
+ * Category badge
341
+ */
342
+ export function AllergyFinderField_CategoryBadge(allergyFinderField_CategoryBadgeInputProps: any): ReactElement {
343
+ let value: string;
344
+ const category: AllergyCategory_$union = allergyFinderField_CategoryBadgeInputProps.category;
345
+ return createElement<any>("span", createObj(ofArray([(value = "inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-blue-50 text-blue-700 border border-blue-200", ["className", value] as [string, any]), ["children", AllergyFinderField_categoryLabel(category)] as [string, any]])));
346
+ }
347
+
348
+ export function AllergyFinderField_FdaInsightsPanel(allergyFinderField_FdaInsightsPanelInputProps: any): ReactElement {
349
+ let ins: AllergenInsights, elems_5: Iterable<ReactElement>;
350
+ const substanceName: string = allergyFinderField_FdaInsightsPanelInputProps.substanceName;
351
+ const apiFetch: ((arg0: string) => Promise<string>) = allergyFinderField_FdaInsightsPanelInputProps.apiFetch;
352
+ const patternInput: [Option<AllergenInsights>, ((arg0: Option<AllergenInsights>) => void)] = reactApi.useState<Option<AllergenInsights>, Option<AllergenInsights>>(undefined);
353
+ const insights: Option<AllergenInsights> = patternInput[0];
354
+ const patternInput_1: [boolean, ((arg0: boolean) => void)] = reactApi.useState<boolean, boolean>(true);
355
+ const setLoading: ((arg0: boolean) => void) = patternInput_1[1];
356
+ const dependencies: any[] = [substanceName];
357
+ reactApi.useEffect((): void => {
358
+ setLoading(true);
359
+ const pr: Promise<void> = PromiseBuilder__Run_212F1D4B<void>(promise, PromiseBuilder__Delay_62FBFDE1<void>(promise, (): Promise<void> => (getAllergenInsights(apiFetch, substanceName).then((_arg: AllergenInsights): Promise<void> => {
360
+ patternInput[1](_arg);
361
+ setLoading(false);
362
+ return Promise.resolve();
363
+ }))));
364
+ void pr;
365
+ }, dependencies);
366
+ if (patternInput_1[0]) {
367
+ return createElement<any>("div", {
368
+ className: "rounded-lg border border-slate-200 bg-slate-50 p-3 text-sm text-slate-500",
369
+ children: "Loading FDA insights...",
370
+ });
371
+ }
372
+ else if (insights != null) {
373
+ if ((ins = value_284(insights), isEmpty_1(ins.Reactions) && (ins.LabelWarnings == null))) {
374
+ const ins_1: AllergenInsights = value_284(insights);
375
+ return defaultOf();
376
+ }
377
+ else {
378
+ const ins_2: AllergenInsights = value_284(insights);
379
+ return createElement<any>("div", createObj(ofArray([["className", "rounded-lg border border-slate-200 bg-slate-50 p-3 space-y-3"] as [string, any], (elems_5 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("div", {
380
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-500",
381
+ children: "FDA Insights",
382
+ })), delay<ReactElement>((): Iterable<ReactElement> => {
383
+ let top5: FSharpList<CountResult>, maxCount: float64, elems_2: Iterable<ReactElement>;
384
+ return append<ReactElement>(!isEmpty_1(ins_2.Reactions) ? ((top5 = truncate<CountResult>(5, ins_2.Reactions), (maxCount = max<int32>(map<CountResult, int32>((r: CountResult): int32 => r.Count, top5), {
385
+ Compare: comparePrimitives,
386
+ }), singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-1"] as [string, any], (elems_2 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("div", {
387
+ className: "text-xs font-medium text-slate-600 mb-1",
388
+ children: `Top Adverse Reactions (FAERS) — ${ins_2.TotalEvents} total reports`,
389
+ })), delay<ReactElement>((): Iterable<ReactElement> => map_1<CountResult, ReactElement>((r_1: CountResult): ReactElement => {
390
+ let elems_1: Iterable<ReactElement>, elems: Iterable<ReactElement>;
391
+ return createElement<any>("div", createObj(ofArray([["className", "flex items-center gap-2"] as [string, any], (elems_1 = [createElement<any>("div", {
392
+ className: "w-28 text-xs text-slate-600 truncate",
393
+ children: r_1.Term,
394
+ }), createElement<any>("div", createObj(ofArray([["className", "flex-1 bg-slate-200 rounded-full h-2"] as [string, any], (elems = [createElement<any>("div", {
395
+ className: "bg-blue-500 rounded-full h-2",
396
+ style: {
397
+ width: ((r_1.Count / maxCount) * 100) + "%",
398
+ },
399
+ })], ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])]))), createElement<any>("div", {
400
+ className: "w-12 text-xs text-slate-500 text-right",
401
+ children: int32ToString(r_1.Count),
402
+ })], ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any])])));
403
+ }, top5))))), ["children", reactApi.Children.toArray(Array.from(elems_2))] as [string, any])]))))))) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => {
404
+ let matchValue_2: Option<string>, c: string, c_1: string, elems_3: Iterable<ReactElement>;
405
+ const matchValue_1: Option<LabelWarnings> = ins_2.LabelWarnings;
406
+ if (matchValue_1 == null) {
407
+ return empty_1<ReactElement>();
408
+ }
409
+ else {
410
+ const warnings: LabelWarnings = value_284(matchValue_1);
411
+ return append<ReactElement>((matchValue_2 = warnings.Contraindications, (matchValue_2 != null) ? (((c = value_284(matchValue_2), c.length > 0)) ? ((c_1 = value_284(matchValue_2), singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "text-xs space-y-1"] as [string, any], (elems_3 = [createElement<any>("div", {
412
+ className: "font-semibold text-slate-600",
413
+ children: "Contraindications",
414
+ }), createElement<any>("div", {
415
+ className: "text-slate-500 line-clamp-3",
416
+ children: c_1,
417
+ })], ["children", reactApi.Children.toArray(Array.from(elems_3))] as [string, any])])))))) : (empty_1<ReactElement>())) : (empty_1<ReactElement>())), delay<ReactElement>((): Iterable<ReactElement> => {
418
+ let elems_4: Iterable<ReactElement>, w: string;
419
+ const matchValue_3: Option<string> = warnings.Warnings;
420
+ let matchResult: int32, w_1: string;
421
+ if (matchValue_3 != null) {
422
+ if ((w = value_284(matchValue_3), w.length > 0)) {
423
+ matchResult = 0;
424
+ w_1 = value_284(matchValue_3);
425
+ }
426
+ else {
427
+ matchResult = 1;
428
+ }
429
+ }
430
+ else {
431
+ matchResult = 1;
432
+ }
433
+ switch (matchResult) {
434
+ case 0:
435
+ return singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "text-xs space-y-1"] as [string, any], (elems_4 = [createElement<any>("div", {
436
+ className: "font-semibold text-slate-600",
437
+ children: "Warnings",
438
+ }), createElement<any>("div", {
439
+ className: "text-slate-500 line-clamp-3",
440
+ children: w_1!,
441
+ })], ["children", reactApi.Children.toArray(Array.from(elems_4))] as [string, any])]))));
442
+ default: {
443
+ return empty_1<ReactElement>();
444
+ }
445
+ }
446
+ }));
447
+ }
448
+ }));
449
+ })))), ["children", reactApi.Children.toArray(Array.from(elems_5))] as [string, any])])));
450
+ }
451
+ }
452
+ else {
453
+ return defaultOf();
454
+ }
455
+ }
456
+
457
+ export function AllergyFinderField_ReactionCheckboxes(allergyFinderField_ReactionCheckboxesInputProps: any): ReactElement {
458
+ let elems_3: Iterable<ReactElement>, elems_1: Iterable<ReactElement>, elems_2: Iterable<ReactElement>, value_16: string;
459
+ const onChange: ((arg0: FSharpList<string>) => void) = allergyFinderField_ReactionCheckboxesInputProps.onChange;
460
+ const selected: FSharpList<string> = allergyFinderField_ReactionCheckboxesInputProps.selected;
461
+ const substanceName: Option<string> = allergyFinderField_ReactionCheckboxesInputProps.substanceName;
462
+ const apiFetch: ((arg0: string) => Promise<string>) = allergyFinderField_ReactionCheckboxesInputProps.apiFetch;
463
+ const patternInput: [FSharpList<string>, ((arg0: FSharpList<string>) => void)] = reactApi.useState<FSharpList<string>, FSharpList<string>>(empty<string>());
464
+ const fdaReactions: FSharpList<string> = patternInput[0];
465
+ const patternInput_1: [string, ((arg0: string) => void)] = reactApi.useState<string, string>("");
466
+ const setCustomReaction: ((arg0: string) => void) = patternInput_1[1];
467
+ const customReaction: string = patternInput_1[0];
468
+ const dependencies: any[] = [substanceName];
469
+ reactApi.useEffect((): void => {
470
+ let sub: string;
471
+ let matchResult: int32, sub_1: string;
472
+ if (substanceName != null) {
473
+ if ((sub = value_284(substanceName), sub.length > 0)) {
474
+ matchResult = 0;
475
+ sub_1 = value_284(substanceName);
476
+ }
477
+ else {
478
+ matchResult = 1;
479
+ }
480
+ }
481
+ else {
482
+ matchResult = 1;
483
+ }
484
+ switch (matchResult) {
485
+ case 0: {
486
+ const pr: Promise<void> = PromiseBuilder__Run_212F1D4B<void>(promise, PromiseBuilder__Delay_62FBFDE1<void>(promise, (): Promise<void> => (getAllergenInsights(apiFetch, sub_1!).then((_arg: AllergenInsights): Promise<void> => {
487
+ patternInput[1](map<CountResult, string>((r: CountResult): string => r.Term, truncate<CountResult>(8, _arg.Reactions)));
488
+ return Promise.resolve();
489
+ }))));
490
+ void pr;
491
+ break;
492
+ }
493
+ case 1: {
494
+ break;
495
+ }
496
+ }
497
+ }, dependencies);
498
+ const allReactions: FSharpList<[string, boolean]> = append_1(map<string, [string, boolean]>((r_1: string): [string, boolean] => ([r_1, true] as [string, boolean]), fdaReactions), map<string, [string, boolean]>((r_2: string): [string, boolean] => ([r_2, false] as [string, boolean]), filter<string>((c: string): boolean => !exists<string>((f: string): boolean => (compare(f, c, 5) === 0), fdaReactions), ofArray<string>(AllergyFinderField_commonReactions))));
499
+ const addCustomReaction = (): void => {
500
+ const trimmed: string = customReaction.trim();
501
+ if ((trimmed.length > 0) && !contains<string>(trimmed, selected, {
502
+ Equals: (x_1: string, y_1: string): boolean => (x_1 === y_1),
503
+ GetHashCode: stringHash,
504
+ })) {
505
+ onChange(append_1(selected, singleton_1(trimmed)));
506
+ setCustomReaction("");
507
+ }
508
+ };
509
+ return createElement<any>("div", createObj(ofArray([["className", "space-y-2"] as [string, any], (elems_3 = [createElement<any>("label", {
510
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
511
+ children: "Reactions",
512
+ }), createElement<any>("div", createObj(ofArray([["className", "flex flex-wrap gap-2"] as [string, any], (elems_1 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => collect<[string, boolean], Iterable<ReactElement>, ReactElement>((matchValue: [string, boolean]): Iterable<ReactElement> => {
513
+ let elems: Iterable<ReactElement>;
514
+ const reaction_1: string = matchValue[0];
515
+ const isChecked: boolean = contains<string>(reaction_1, selected, {
516
+ Equals: (x_2: string, y_2: string): boolean => (x_2 === y_2),
517
+ GetHashCode: stringHash,
518
+ });
519
+ return singleton<ReactElement>(createElement<any>("button", createObj(ofArray([["className", isChecked ? "rounded-full px-2.5 py-1 text-xs font-medium border bg-blue-100 text-blue-700 border-blue-300" : "rounded-full px-2.5 py-1 text-xs font-medium border bg-white text-slate-600 border-slate-200 hover:bg-slate-50"] as [string, any], ["onClick", (_arg_1: MouseEvent): void => {
520
+ const reaction: string = reaction_1;
521
+ if (contains<string>(reaction, selected, {
522
+ Equals: (x: string, y: string): boolean => (x === y),
523
+ GetHashCode: stringHash,
524
+ })) {
525
+ onChange(filter<string>((r_3: string): boolean => (r_3 !== reaction), selected));
526
+ }
527
+ else {
528
+ onChange(append_1(selected, singleton_1(reaction)));
529
+ }
530
+ }] as [string, any], (elems = [(matchValue[1] && !isChecked) ? (`* ${reaction_1}`) : reaction_1], ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])]))));
531
+ }, allReactions))), ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any])]))), createElement<any>("div", createObj(ofArray([["className", "flex gap-2"] as [string, any], (elems_2 = [createElement<any>("input", createObj(ofArray([(value_16 = "flex-1 rounded-md border border-slate-300 px-2.5 py-1.5 text-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30", ["className", value_16] as [string, any]), ["placeholder", "Add custom reaction..."] as [string, any], ["value", customReaction] as [string, any], ["onChange", (ev: Event): void => {
532
+ setCustomReaction(ev.target.value);
533
+ }] as [string, any], ["onKeyDown", (e: KeyboardEvent): void => {
534
+ if (e.key === "Enter") {
535
+ e.preventDefault();
536
+ addCustomReaction();
537
+ }
538
+ }] as [string, any]]))), createElement<any>("button", {
539
+ className: "rounded-md bg-slate-100 px-3 py-1.5 text-sm font-medium text-slate-600 hover:bg-slate-200",
540
+ children: "Add",
541
+ onClick: (_arg_2: MouseEvent): void => {
542
+ addCustomReaction();
543
+ },
544
+ })], ["children", reactApi.Children.toArray(Array.from(elems_2))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_3))] as [string, any])])));
545
+ }
546
+
547
+ export function AllergyFinderField_AllergyDetailModal(allergyFinderField_AllergyDetailModalInputProps: any): ReactElement {
548
+ let elems_14: Iterable<ReactElement>, elems_13: Iterable<ReactElement>, elems_28: Iterable<ReactElement>, elems_27: Iterable<ReactElement>;
549
+ const onSave: ((arg0: AllergyFinderField_AllergyEntry) => void) = allergyFinderField_AllergyDetailModalInputProps.onSave;
550
+ const onClose: (() => void) = allergyFinderField_AllergyDetailModalInputProps.onClose;
551
+ const modalState: AllergyFinderField_DetailModalState_$union = allergyFinderField_AllergyDetailModalInputProps.modalState;
552
+ const apiFetch: ((arg0: string) => Promise<string>) = allergyFinderField_AllergyDetailModalInputProps.apiFetch;
553
+ switch (modalState.tag) {
554
+ case /* Adding */ 1: {
555
+ const fdaResult: Option<OpenFdaSearchResult> = modalState.fields[0];
556
+ const initialName: string = defaultArg(map_2<OpenFdaSearchResult, string>((r: OpenFdaSearchResult): string => r.Name, fdaResult), "");
557
+ const initialSubstance: string = defaultArg(map_2<OpenFdaSearchResult, string>((r_1: OpenFdaSearchResult): string => r_1.SubstanceName, fdaResult), "");
558
+ const initialCategory: AllergyCategory_$union = defaultArg(map_2<OpenFdaSearchResult, AllergyCategory_$union>((r_2: OpenFdaSearchResult): AllergyCategory_$union => r_2.Category, fdaResult), AllergyCategory_Drug());
559
+ const initialNdc: Option<string> = bind<OpenFdaSearchResult, string>((r_3: OpenFdaSearchResult): Option<string> => r_3.NdcCode, fdaResult);
560
+ const patternInput: [string, ((arg0: string) => void)] = reactApi.useState<string, string>(initialName);
561
+ const name: string = patternInput[0];
562
+ const patternInput_1: [AllergyFinderField_AllergySeverity_$union, ((arg0: AllergyFinderField_AllergySeverity_$union) => void)] = reactApi.useState<AllergyFinderField_AllergySeverity_$union, AllergyFinderField_AllergySeverity_$union>(AllergyFinderField_AllergySeverity_Moderate());
563
+ const severity: AllergyFinderField_AllergySeverity_$union = patternInput_1[0];
564
+ const patternInput_2: [FSharpList<string>, ((arg0: FSharpList<string>) => void)] = reactApi.useState<FSharpList<string>, FSharpList<string>>(empty<string>());
565
+ const reactions: FSharpList<string> = patternInput_2[0];
566
+ const patternInput_3: [string, ((arg0: string) => void)] = reactApi.useState<string, string>("");
567
+ const remedy: string = patternInput_3[0];
568
+ const patternInput_4: [string, ((arg0: string) => void)] = reactApi.useState<string, string>("unknown");
569
+ const onset: string = patternInput_4[0];
570
+ const patternInput_5: [boolean, ((arg0: boolean) => void)] = reactApi.useState<boolean, boolean>(false);
571
+ const staffOnly: boolean = patternInput_5[0];
572
+ const patternInput_6: [string, ((arg0: string) => void)] = reactApi.useState<string, string>("");
573
+ const notes: string = patternInput_6[0];
574
+ const meta: string = defaultArg(map_2<OpenFdaSearchResult, string>((r_4: OpenFdaSearchResult): string => join(" · ", choose<Option<string>, string>((x: Option<string>): Option<string> => x, ofArray([r_4.DosageForm, r_4.Route, r_4.Strength]))), fdaResult), "");
575
+ const provenance: string = defaultArg(map_2<OpenFdaSearchResult, string>((r_5: OpenFdaSearchResult): string => join(" · ", choose<Option<string>, string>((x_1: Option<string>): Option<string> => x_1, ofArray([r_5.Manufacturer, map_2<string, string>((n: string): string => (`NDC ${n}`), r_5.NdcCode)]))), fdaResult), "");
576
+ return createElement<any>("div", createObj(ofArray([["className", "fixed inset-0 z-50 flex items-center justify-center bg-black/50"] as [string, any], ["onClick", (e: MouseEvent): void => {
577
+ if (equals(e.target, e.currentTarget)) {
578
+ onClose();
579
+ }
580
+ }] as [string, any], (elems_14 = [createElement<any>("div", createObj(ofArray([["className", "bg-white rounded-xl shadow-xl max-w-lg w-full max-h-[90vh] overflow-y-auto mx-4 p-5 space-y-4"] as [string, any], ["onClick", (e_1: MouseEvent): void => {
581
+ e_1.stopPropagation();
582
+ }] as [string, any], (elems_13 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => {
583
+ let elems: Iterable<ReactElement>;
584
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex items-center justify-between"] as [string, any], (elems = [createElement<any>("h3", {
585
+ className: "text-lg font-semibold text-slate-900",
586
+ children: "Add Allergy",
587
+ }), createElement<any>("button", {
588
+ className: "text-slate-400 hover:text-slate-600 text-xl",
589
+ dangerouslySetInnerHTML: {
590
+ __html: "&times;",
591
+ },
592
+ onClick: (_arg: MouseEvent): void => {
593
+ onClose();
594
+ },
595
+ })], ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
596
+ let matchValue: Option<OpenFdaSearchResult>, elems_3: Iterable<ReactElement>, value_50: string, r_6: OpenFdaSearchResult, elems_2: Iterable<ReactElement>;
597
+ return append<ReactElement>((matchValue = fdaResult, (matchValue == null) ? singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-1"] as [string, any], (elems_3 = [createElement<any>("label", {
598
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
599
+ children: "Allergen Name",
600
+ }), createElement<any>("input", createObj(ofArray([(value_50 = "w-full rounded-md border border-slate-300 px-2.5 py-1.5 text-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30", ["className", value_50] as [string, any]), ["value", name] as [string, any], ["onChange", (ev: Event): void => {
601
+ patternInput[1](ev.target.value);
602
+ }] as [string, any], ["placeholder", "Enter allergen name"] as [string, any]])))], ["children", reactApi.Children.toArray(Array.from(elems_3))] as [string, any])])))) : ((r_6 = value_284(matchValue), singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "rounded-lg border border-slate-200 bg-slate-50 p-3 space-y-1"] as [string, any], (elems_2 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => {
603
+ let elems_1: Iterable<ReactElement>;
604
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex items-start justify-between gap-2"] as [string, any], (elems_1 = [createElement<any>("span", {
605
+ className: "font-semibold text-sm text-slate-900",
606
+ children: name,
607
+ }), createElement(AllergyFinderField_CategoryBadge, {
608
+ category: initialCategory,
609
+ })], ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((initialSubstance !== name) ? singleton<ReactElement>(createElement<any>("p", {
610
+ className: "text-xs text-slate-500",
611
+ children: initialSubstance,
612
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((meta.length > 0) ? singleton<ReactElement>(createElement<any>("p", {
613
+ className: "text-[11px] text-slate-400",
614
+ children: meta,
615
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => ((provenance.length > 0) ? singleton<ReactElement>(createElement<any>("p", {
616
+ className: "text-[11px] text-slate-400",
617
+ children: provenance,
618
+ })) : empty_1<ReactElement>())))))));
619
+ })), ["children", reactApi.Children.toArray(Array.from(elems_2))] as [string, any])]))))))), delay<ReactElement>((): Iterable<ReactElement> => {
620
+ let elems_4: Iterable<ReactElement>;
621
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("label", createObj(ofArray([["className", "flex items-center gap-2 text-sm cursor-pointer"] as [string, any], (elems_4 = [createElement<any>("input", {
622
+ type: "checkbox",
623
+ checked: staffOnly,
624
+ onChange: (ev_1: Event): void => {
625
+ const _arg_1: boolean = ev_1.target.checked;
626
+ patternInput_5[1](!staffOnly);
627
+ },
628
+ className: "rounded border-slate-300",
629
+ }), "Medical Staff Only"], ["children", reactApi.Children.toArray(Array.from(elems_4))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
630
+ let elems_6: Iterable<ReactElement>, elems_5: Iterable<ReactElement>;
631
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-2"] as [string, any], (elems_6 = [createElement<any>("label", {
632
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
633
+ children: "Severity",
634
+ }), createElement<any>("div", createObj(ofArray([["className", "flex flex-wrap gap-2"] as [string, any], (elems_5 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => collect<AllergyFinderField_AllergySeverity_$union, Iterable<ReactElement>, ReactElement>((sev: AllergyFinderField_AllergySeverity_$union): Iterable<ReactElement> => singleton<ReactElement>(createElement<any>("button", {
635
+ className: equals(severity, sev) ? (`rounded-full px-3 py-1 text-xs font-medium border-2 ${AllergyFinderField_severityColor(sev)}`) : "rounded-full px-3 py-1 text-xs font-medium border border-slate-200 bg-white text-slate-600 hover:bg-slate-50",
636
+ onClick: (_arg_2: MouseEvent): void => {
637
+ patternInput_1[1](sev);
638
+ },
639
+ children: AllergyFinderField_severityLabel(sev),
640
+ })), [AllergyFinderField_AllergySeverity_Unknown(), AllergyFinderField_AllergySeverity_Mild(), AllergyFinderField_AllergySeverity_Moderate(), AllergyFinderField_AllergySeverity_Severe(), AllergyFinderField_AllergySeverity_LifeThreatening()]))), ["children", reactApi.Children.toArray(Array.from(elems_5))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_6))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
641
+ const substanceForInsights: Option<string> = (initialCategory.tag === /* Drug */ 0) ? ((initialSubstance.length > 0) ? initialSubstance : undefined) : ((initialCategory.tag === /* Environmental */ 2) ? ((initialSubstance.length > 0) ? initialSubstance : undefined) : undefined);
642
+ return append<ReactElement>(singleton<ReactElement>(createElement(AllergyFinderField_ReactionCheckboxes, {
643
+ apiFetch: apiFetch,
644
+ substanceName: unwrap(substanceForInsights),
645
+ selected: reactions,
646
+ onChange: patternInput_2[1],
647
+ })), delay<ReactElement>((): Iterable<ReactElement> => {
648
+ let elems_7: Iterable<ReactElement>, value_89: string;
649
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-1"] as [string, any], (elems_7 = [createElement<any>("label", {
650
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
651
+ children: "Remedy",
652
+ }), createElement<any>("textarea", createObj(ofArray([(value_89 = "w-full rounded-md border border-slate-300 px-2.5 py-1.5 text-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30", ["className", value_89] as [string, any]), ["value", remedy] as [string, any], ["onChange", (ev_2: Event): void => {
653
+ patternInput_3[1](ev_2.target.value);
654
+ }] as [string, any], ["placeholder", "e.g., Epipen, Benadryl 50mg, avoid exposure..."] as [string, any], ["rows", 2] as [string, any]])))], ["children", reactApi.Children.toArray(Array.from(elems_7))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
655
+ let elems_10: Iterable<ReactElement>, elems_9: Iterable<ReactElement>;
656
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-2"] as [string, any], (elems_10 = [createElement<any>("label", {
657
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
658
+ children: "Onset Timing",
659
+ }), createElement<any>("div", createObj(ofArray([["className", "flex flex-wrap gap-3"] as [string, any], (elems_9 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => collect<[string, string], Iterable<ReactElement>, ReactElement>((matchValue_1: [string, string]): Iterable<ReactElement> => {
660
+ let elems_8: Iterable<ReactElement>;
661
+ const value_107: string = matchValue_1[0];
662
+ return singleton<ReactElement>(createElement<any>("label", createObj(ofArray([["className", "flex items-center gap-1.5 text-sm cursor-pointer"] as [string, any], (elems_8 = [createElement<any>("input", {
663
+ type: "radio",
664
+ name: "onset",
665
+ value: value_107,
666
+ checked: onset === value_107,
667
+ onChange: (ev_3: Event): void => {
668
+ const _arg_3: string = ev_3.target.value;
669
+ patternInput_4[1](value_107);
670
+ },
671
+ }), matchValue_1[1]], ["children", reactApi.Children.toArray(Array.from(elems_8))] as [string, any])]))));
672
+ }, [["immediate", "Immediate (<1hr)"] as [string, string], ["delayed", "Delayed (1-72hr)"] as [string, string], ["unknown", "Unknown"] as [string, string]]))), ["children", reactApi.Children.toArray(Array.from(elems_9))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_10))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
673
+ let elems_11: Iterable<ReactElement>, value_128: string;
674
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-1"] as [string, any], (elems_11 = [createElement<any>("label", {
675
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
676
+ children: "Notes (optional)",
677
+ }), createElement<any>("textarea", createObj(ofArray([(value_128 = "w-full rounded-md border border-slate-300 px-2.5 py-1.5 text-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30", ["className", value_128] as [string, any]), ["value", notes] as [string, any], ["onChange", (ev_4: Event): void => {
678
+ patternInput_6[1](ev_4.target.value);
679
+ }] as [string, any], ["placeholder", "e.g., Diagnosed at age 12, confirmed by allergist..."] as [string, any], ["rows", 2] as [string, any]])))], ["children", reactApi.Children.toArray(Array.from(elems_11))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(((equals(initialCategory, AllergyCategory_Drug()) ? true : equals(initialCategory, AllergyCategory_Environmental())) && (initialSubstance.length > 0)) ? singleton<ReactElement>(createElement(AllergyFinderField_FdaInsightsPanel, {
680
+ apiFetch: apiFetch,
681
+ substanceName: initialSubstance,
682
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => {
683
+ let elems_12: Iterable<ReactElement>;
684
+ return singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex justify-end gap-2 pt-2"] as [string, any], (elems_12 = [createElement<any>("button", {
685
+ className: "rounded-md border border-slate-200 px-4 py-2 text-sm font-medium text-slate-600 hover:bg-slate-50",
686
+ children: "Cancel",
687
+ onClick: (_arg_4: MouseEvent): void => {
688
+ onClose();
689
+ },
690
+ }), createElement<any>("button", {
691
+ className: "rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700",
692
+ children: "Save Allergy",
693
+ onClick: (_arg_5: MouseEvent): void => {
694
+ let copyOfStruct: string;
695
+ onSave(new AllergyFinderField_AllergyEntry((copyOfStruct = newGuid(), copyOfStruct), isNullOrWhiteSpace(name) ? "Unknown Allergen" : name, isNullOrWhiteSpace(initialSubstance) ? name : initialSubstance, initialNdc, initialCategory, severity, reactions, isNullOrWhiteSpace(remedy) ? undefined : remedy, onset, staffOnly, isNullOrWhiteSpace(notes) ? undefined : notes));
696
+ },
697
+ })], ["children", reactApi.Children.toArray(Array.from(elems_12))] as [string, any])]))));
698
+ }))));
699
+ }));
700
+ }));
701
+ }));
702
+ }));
703
+ }));
704
+ }));
705
+ }));
706
+ })), ["children", reactApi.Children.toArray(Array.from(elems_13))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_14))] as [string, any])])));
707
+ }
708
+ case /* Editing */ 2: {
709
+ const existingEntry: AllergyFinderField_AllergyEntry = modalState.fields[0];
710
+ const name_69: string = reactApi.useState<string, string>(existingEntry.Name)[0];
711
+ const patternInput_8: [AllergyFinderField_AllergySeverity_$union, ((arg0: AllergyFinderField_AllergySeverity_$union) => void)] = reactApi.useState<AllergyFinderField_AllergySeverity_$union, AllergyFinderField_AllergySeverity_$union>(existingEntry.Severity);
712
+ const severity_1: AllergyFinderField_AllergySeverity_$union = patternInput_8[0];
713
+ const patternInput_9: [FSharpList<string>, ((arg0: FSharpList<string>) => void)] = reactApi.useState<FSharpList<string>, FSharpList<string>>(existingEntry.Reactions);
714
+ const reactions_1: FSharpList<string> = patternInput_9[0];
715
+ let patternInput_10: [string, ((arg0: string) => void)];
716
+ const initial_10: string = defaultArg(existingEntry.Remedy, "");
717
+ patternInput_10 = reactApi.useState<string, string>(initial_10);
718
+ const remedy_1: string = patternInput_10[0];
719
+ let patternInput_11: [string, ((arg0: string) => void)];
720
+ const initial_11: string = defaultArg(existingEntry.OnsetTiming, "unknown");
721
+ patternInput_11 = reactApi.useState<string, string>(initial_11);
722
+ const onset_1: string = patternInput_11[0];
723
+ const patternInput_12: [boolean, ((arg0: boolean) => void)] = reactApi.useState<boolean, boolean>(existingEntry.StaffOnly);
724
+ const staffOnly_1: boolean = patternInput_12[0];
725
+ let patternInput_13: [string, ((arg0: string) => void)];
726
+ const initial_13: string = defaultArg(existingEntry.Notes, "");
727
+ patternInput_13 = reactApi.useState<string, string>(initial_13);
728
+ const notes_1: string = patternInput_13[0];
729
+ return createElement<any>("div", createObj(ofArray([["className", "fixed inset-0 z-50 flex items-center justify-center bg-black/50"] as [string, any], ["onClick", (e_2: MouseEvent): void => {
730
+ if (equals(e_2.target, e_2.currentTarget)) {
731
+ onClose();
732
+ }
733
+ }] as [string, any], (elems_28 = [createElement<any>("div", createObj(ofArray([["className", "bg-white rounded-xl shadow-xl max-w-lg w-full max-h-[90vh] overflow-y-auto mx-4 p-5 space-y-4"] as [string, any], ["onClick", (e_3: MouseEvent): void => {
734
+ e_3.stopPropagation();
735
+ }] as [string, any], (elems_27 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => {
736
+ let elems_15: Iterable<ReactElement>;
737
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex items-center justify-between"] as [string, any], (elems_15 = [createElement<any>("h3", {
738
+ className: "text-lg font-semibold text-slate-900",
739
+ children: "Edit Allergy",
740
+ }), createElement<any>("button", {
741
+ className: "text-slate-400 hover:text-slate-600 text-xl",
742
+ dangerouslySetInnerHTML: {
743
+ __html: "&times;",
744
+ },
745
+ onClick: (_arg_6: MouseEvent): void => {
746
+ onClose();
747
+ },
748
+ })], ["children", reactApi.Children.toArray(Array.from(elems_15))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
749
+ let elems_17: Iterable<ReactElement>;
750
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "rounded-lg border border-slate-200 bg-slate-50 p-3 space-y-1"] as [string, any], (elems_17 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => {
751
+ let elems_16: Iterable<ReactElement>;
752
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex items-start justify-between gap-2"] as [string, any], (elems_16 = [createElement<any>("span", {
753
+ className: "font-semibold text-sm text-slate-900",
754
+ children: existingEntry.Name,
755
+ }), createElement(AllergyFinderField_CategoryBadge, {
756
+ category: existingEntry.Category,
757
+ })], ["children", reactApi.Children.toArray(Array.from(elems_16))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((existingEntry.SubstanceName !== existingEntry.Name) ? singleton<ReactElement>(createElement<any>("p", {
758
+ className: "text-xs text-slate-500",
759
+ children: existingEntry.SubstanceName,
760
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => {
761
+ const matchValue_2: Option<string> = existingEntry.NdcCode;
762
+ if (matchValue_2 == null) {
763
+ return empty_1<ReactElement>();
764
+ }
765
+ else {
766
+ return singleton<ReactElement>(createElement<any>("p", {
767
+ className: "text-[11px] text-slate-400",
768
+ children: `NDC ${value_284(matchValue_2)}`,
769
+ }));
770
+ }
771
+ }))));
772
+ })), ["children", reactApi.Children.toArray(Array.from(elems_17))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
773
+ let elems_18: Iterable<ReactElement>;
774
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("label", createObj(ofArray([["className", "flex items-center gap-2 text-sm cursor-pointer"] as [string, any], (elems_18 = [createElement<any>("input", {
775
+ type: "checkbox",
776
+ checked: staffOnly_1,
777
+ onChange: (ev_5: Event): void => {
778
+ const _arg_7: boolean = ev_5.target.checked;
779
+ patternInput_12[1](!staffOnly_1);
780
+ },
781
+ className: "rounded border-slate-300",
782
+ }), "Medical Staff Only"], ["children", reactApi.Children.toArray(Array.from(elems_18))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
783
+ let elems_20: Iterable<ReactElement>, elems_19: Iterable<ReactElement>;
784
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-2"] as [string, any], (elems_20 = [createElement<any>("label", {
785
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
786
+ children: "Severity",
787
+ }), createElement<any>("div", createObj(ofArray([["className", "flex flex-wrap gap-2"] as [string, any], (elems_19 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => collect<AllergyFinderField_AllergySeverity_$union, Iterable<ReactElement>, ReactElement>((sev_1: AllergyFinderField_AllergySeverity_$union): Iterable<ReactElement> => singleton<ReactElement>(createElement<any>("button", {
788
+ className: equals(severity_1, sev_1) ? (`rounded-full px-3 py-1 text-xs font-medium border-2 ${AllergyFinderField_severityColor(sev_1)}`) : "rounded-full px-3 py-1 text-xs font-medium border border-slate-200 bg-white text-slate-600 hover:bg-slate-50",
789
+ onClick: (_arg_8: MouseEvent): void => {
790
+ patternInput_8[1](sev_1);
791
+ },
792
+ children: AllergyFinderField_severityLabel(sev_1),
793
+ })), [AllergyFinderField_AllergySeverity_Unknown(), AllergyFinderField_AllergySeverity_Mild(), AllergyFinderField_AllergySeverity_Moderate(), AllergyFinderField_AllergySeverity_Severe(), AllergyFinderField_AllergySeverity_LifeThreatening()]))), ["children", reactApi.Children.toArray(Array.from(elems_19))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_20))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
794
+ let substanceForInsights_1: Option<string>;
795
+ const matchValue_3: AllergyCategory_$union = existingEntry.Category;
796
+ switch (matchValue_3.tag) {
797
+ case /* Drug */ 0:
798
+ case /* Environmental */ 2: {
799
+ substanceForInsights_1 = ((existingEntry.SubstanceName.length > 0) ? existingEntry.SubstanceName : undefined);
800
+ break;
801
+ }
802
+ default:
803
+ substanceForInsights_1 = undefined;
804
+ }
805
+ return append<ReactElement>(singleton<ReactElement>(createElement(AllergyFinderField_ReactionCheckboxes, {
806
+ apiFetch: apiFetch,
807
+ substanceName: unwrap(substanceForInsights_1),
808
+ selected: reactions_1,
809
+ onChange: patternInput_9[1],
810
+ })), delay<ReactElement>((): Iterable<ReactElement> => {
811
+ let elems_21: Iterable<ReactElement>, value_222: string;
812
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-1"] as [string, any], (elems_21 = [createElement<any>("label", {
813
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
814
+ children: "Remedy",
815
+ }), createElement<any>("textarea", createObj(ofArray([(value_222 = "w-full rounded-md border border-slate-300 px-2.5 py-1.5 text-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30", ["className", value_222] as [string, any]), ["value", remedy_1] as [string, any], ["onChange", (ev_6: Event): void => {
816
+ patternInput_10[1](ev_6.target.value);
817
+ }] as [string, any], ["placeholder", "e.g., Epipen, Benadryl 50mg..."] as [string, any], ["rows", 2] as [string, any]])))], ["children", reactApi.Children.toArray(Array.from(elems_21))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
818
+ let elems_24: Iterable<ReactElement>, elems_23: Iterable<ReactElement>;
819
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-2"] as [string, any], (elems_24 = [createElement<any>("label", {
820
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
821
+ children: "Onset Timing",
822
+ }), createElement<any>("div", createObj(ofArray([["className", "flex flex-wrap gap-3"] as [string, any], (elems_23 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => collect<[string, string], Iterable<ReactElement>, ReactElement>((matchValue_4: [string, string]): Iterable<ReactElement> => {
823
+ let elems_22: Iterable<ReactElement>;
824
+ const value_240: string = matchValue_4[0];
825
+ return singleton<ReactElement>(createElement<any>("label", createObj(ofArray([["className", "flex items-center gap-1.5 text-sm cursor-pointer"] as [string, any], (elems_22 = [createElement<any>("input", createObj(toList<IReactProperty>(delay<IReactProperty>((): Iterable<IReactProperty> => append<IReactProperty>(singleton<IReactProperty>(["type", "radio"] as [string, any]), delay<IReactProperty>((): Iterable<IReactProperty> => append<IReactProperty>(singleton<IReactProperty>(["name", "onset-edit"] as [string, any]), delay<IReactProperty>((): Iterable<IReactProperty> => append<IReactProperty>(singleton<IReactProperty>(["value", value_240] as [string, any]), delay<IReactProperty>((): Iterable<IReactProperty> => append<IReactProperty>(singleton<IReactProperty>(["checked", onset_1 === value_240] as [string, any]), delay<IReactProperty>((): Iterable<IReactProperty> => singleton<IReactProperty>(["onChange", (ev_7: Event): void => {
826
+ const _arg_9: string = ev_7.target.value;
827
+ patternInput_11[1](value_240);
828
+ }] as [string, any]))))))))))))), matchValue_4[1]], ["children", reactApi.Children.toArray(Array.from(elems_22))] as [string, any])]))));
829
+ }, [["immediate", "Immediate (<1hr)"] as [string, string], ["delayed", "Delayed (1-72hr)"] as [string, string], ["unknown", "Unknown"] as [string, string]]))), ["children", reactApi.Children.toArray(Array.from(elems_23))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_24))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
830
+ let elems_25: Iterable<ReactElement>, value_261: string;
831
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-1"] as [string, any], (elems_25 = [createElement<any>("label", {
832
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
833
+ children: "Notes (optional)",
834
+ }), createElement<any>("textarea", createObj(ofArray([(value_261 = "w-full rounded-md border border-slate-300 px-2.5 py-1.5 text-sm placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-500/30", ["className", value_261] as [string, any]), ["value", notes_1] as [string, any], ["onChange", (ev_8: Event): void => {
835
+ patternInput_13[1](ev_8.target.value);
836
+ }] as [string, any], ["rows", 2] as [string, any]])))], ["children", reactApi.Children.toArray(Array.from(elems_25))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(((equals(existingEntry.Category, AllergyCategory_Drug()) ? true : equals(existingEntry.Category, AllergyCategory_Environmental())) && (existingEntry.SubstanceName.length > 0)) ? singleton<ReactElement>(createElement(AllergyFinderField_FdaInsightsPanel, {
837
+ apiFetch: apiFetch,
838
+ substanceName: existingEntry.SubstanceName,
839
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => {
840
+ let elems_26: Iterable<ReactElement>;
841
+ return singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex justify-end gap-2 pt-2"] as [string, any], (elems_26 = [createElement<any>("button", {
842
+ className: "rounded-md border border-slate-200 px-4 py-2 text-sm font-medium text-slate-600 hover:bg-slate-50",
843
+ children: "Cancel",
844
+ onClick: (_arg_10: MouseEvent): void => {
845
+ onClose();
846
+ },
847
+ }), createElement<any>("button", {
848
+ className: "rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700",
849
+ children: "Update",
850
+ onClick: (_arg_11: MouseEvent): void => {
851
+ onSave(new AllergyFinderField_AllergyEntry(existingEntry.Id, isNullOrWhiteSpace(name_69) ? existingEntry.Name : name_69, existingEntry.SubstanceName, existingEntry.NdcCode, existingEntry.Category, severity_1, reactions_1, isNullOrWhiteSpace(remedy_1) ? undefined : remedy_1, onset_1, staffOnly_1, isNullOrWhiteSpace(notes_1) ? undefined : notes_1));
852
+ },
853
+ })], ["children", reactApi.Children.toArray(Array.from(elems_26))] as [string, any])]))));
854
+ }))));
855
+ }));
856
+ }));
857
+ }));
858
+ }));
859
+ }));
860
+ }));
861
+ }));
862
+ })), ["children", reactApi.Children.toArray(Array.from(elems_27))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_28))] as [string, any])])));
863
+ }
864
+ default:
865
+ return defaultOf();
866
+ }
867
+ }
868
+
869
+ export function AllergyFinderField_AllergySearchPopover(allergyFinderField_AllergySearchPopoverInputProps: any): ReactElement {
870
+ let elems_6: Iterable<ReactElement>, elems_5: Iterable<ReactElement>, elems_2: Iterable<ReactElement>, elems_3: Iterable<ReactElement>, elems_4: Iterable<ReactElement>;
871
+ const onClose: (() => void) = allergyFinderField_AllergySearchPopoverInputProps.onClose;
872
+ const onSelect: ((arg0: Option<OpenFdaSearchResult>) => void) = allergyFinderField_AllergySearchPopoverInputProps.onSelect;
873
+ const apiFetch: ((arg0: string) => Promise<string>) = allergyFinderField_AllergySearchPopoverInputProps.apiFetch;
874
+ const patternInput: [string, ((arg0: string) => void)] = reactApi.useState<string, string>("");
875
+ const query: string = patternInput[0];
876
+ const patternInput_1: [FSharpList<OpenFdaSearchResult>, ((arg0: FSharpList<OpenFdaSearchResult>) => void)] = reactApi.useState<FSharpList<OpenFdaSearchResult>, FSharpList<OpenFdaSearchResult>>(empty<OpenFdaSearchResult>());
877
+ const setResults: ((arg0: FSharpList<OpenFdaSearchResult>) => void) = patternInput_1[1];
878
+ const results: FSharpList<OpenFdaSearchResult> = patternInput_1[0];
879
+ const patternInput_2: [boolean, ((arg0: boolean) => void)] = reactApi.useState<boolean, boolean>(false);
880
+ const setIsSearching: ((arg0: boolean) => void) = patternInput_2[1];
881
+ const isSearching: boolean = patternInput_2[0];
882
+ const searchIdRef: IRefValue$1<int32> = reactApi.useRef(0);
883
+ const cleanupRef: IRefValue$1<Option<(() => void)>> = reactApi.useRef(undefined);
884
+ const dependencies: any[] = [query];
885
+ reactApi.useEffect((): void => {
886
+ const matchValue: Option<(() => void)> = cleanupRef.current;
887
+ if (matchValue == null) {
888
+ }
889
+ else {
890
+ value_284(matchValue)();
891
+ }
892
+ cleanupRef.current = undefined;
893
+ if (query.trim().length < 2) {
894
+ setResults(empty<OpenFdaSearchResult>());
895
+ setIsSearching(false);
896
+ }
897
+ else {
898
+ setIsSearching(true);
899
+ searchIdRef.current = (searchIdRef.current + 1);
900
+ const thisSearchId: int32 = searchIdRef.current | 0;
901
+ const timerId: int32 = setTimeout((): void => {
902
+ const pr: Promise<void> = PromiseBuilder__Run_212F1D4B<void>(promise, PromiseBuilder__Delay_62FBFDE1<void>(promise, (): Promise<void> => (searchAllergens(apiFetch, query).then((_arg: FSharpList<OpenFdaSearchResult>): Promise<void> => {
903
+ if (searchIdRef.current === thisSearchId) {
904
+ setResults(_arg);
905
+ setIsSearching(false);
906
+ return Promise.resolve();
907
+ }
908
+ else {
909
+ return Promise.resolve();
910
+ }
911
+ }))));
912
+ void pr;
913
+ }, 300) | 0;
914
+ cleanupRef.current = ((): void => {
915
+ clearTimeout(timerId);
916
+ });
917
+ }
918
+ }, dependencies);
919
+ const drugResults: FSharpList<OpenFdaSearchResult> = filter<OpenFdaSearchResult>((r: OpenFdaSearchResult): boolean => equals(r.Category, AllergyCategory_Drug()), results);
920
+ const foodResults: FSharpList<OpenFdaSearchResult> = filter<OpenFdaSearchResult>((r_1: OpenFdaSearchResult): boolean => equals(r_1.Category, AllergyCategory_Food()), results);
921
+ const envResults: FSharpList<OpenFdaSearchResult> = filter<OpenFdaSearchResult>((r_2: OpenFdaSearchResult): boolean => equals(r_2.Category, AllergyCategory_Environmental()), results);
922
+ const renderGroup = (label: string, items: FSharpList<OpenFdaSearchResult>): ReactElement => {
923
+ let elems_1: Iterable<ReactElement>;
924
+ if (isEmpty_1(items)) {
925
+ return defaultOf();
926
+ }
927
+ else {
928
+ return createElement<any>("div", createObj(singleton_1((elems_1 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("div", {
929
+ className: "px-3 py-1.5 text-[11px] font-semibold uppercase tracking-wider text-slate-400 bg-slate-50",
930
+ children: label,
931
+ })), delay<ReactElement>((): Iterable<ReactElement> => map_1<OpenFdaSearchResult, ReactElement>((r_4: OpenFdaSearchResult): ReactElement => {
932
+ let elems: Iterable<ReactElement>;
933
+ const r_3: OpenFdaSearchResult = r_4;
934
+ const meta: string = join(" · ", choose<Option<string>, string>((x: Option<string>): Option<string> => x, ofArray([r_3.DosageForm, r_3.Route, r_3.Strength])));
935
+ const provenance: string = join(" · ", choose<Option<string>, string>((x_1: Option<string>): Option<string> => x_1, ofArray([r_3.Manufacturer, map_2<string, string>((n: string): string => (`NDC ${n}`), r_3.NdcCode), map_2<int32, string>((c: int32): string => (`${c} reports`), r_3.ReportCount)])));
936
+ return createElement<any>("div", createObj(ofArray([["className", "px-3 py-2 cursor-pointer hover:bg-blue-50 border-b border-slate-100 last:border-0"] as [string, any], ["onClick", (_arg_1: MouseEvent): void => {
937
+ onSelect(r_3);
938
+ }] as [string, any], (elems = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("div", {
939
+ className: "text-sm font-medium text-slate-900",
940
+ children: r_3.Name,
941
+ })), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((r_3.SubstanceName !== r_3.Name) ? singleton<ReactElement>(createElement<any>("div", {
942
+ className: "text-xs text-slate-500",
943
+ children: r_3.SubstanceName,
944
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((meta.length > 0) ? singleton<ReactElement>(createElement<any>("div", {
945
+ className: "text-[11px] text-slate-400",
946
+ children: meta,
947
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => ((provenance.length > 0) ? singleton<ReactElement>(createElement<any>("div", {
948
+ className: "text-[11px] text-slate-400",
949
+ children: provenance,
950
+ })) : empty_1<ReactElement>()))))))))), ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])])));
951
+ }, items))))), ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any]))));
952
+ }
953
+ };
954
+ return createElement<any>("div", createObj(ofArray([["className", "fixed inset-0 z-50 flex items-start justify-center pt-[15vh] bg-black/50"] as [string, any], ["onClick", (e: MouseEvent): void => {
955
+ if (equals(e.target, e.currentTarget)) {
956
+ onClose();
957
+ }
958
+ }] as [string, any], (elems_6 = [createElement<any>("div", createObj(ofArray([["className", "bg-white rounded-xl shadow-xl max-w-md w-full mx-4 overflow-hidden"] as [string, any], ["onClick", (e_1: MouseEvent): void => {
959
+ e_1.stopPropagation();
960
+ }] as [string, any], (elems_5 = [createElement<any>("div", createObj(ofArray([["className", "flex items-center gap-2 border-b border-slate-200 px-3 py-2"] as [string, any], (elems_2 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("span", {
961
+ className: "text-slate-400 text-sm",
962
+ children: "Search",
963
+ })), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("input", {
964
+ className: "flex-1 border-0 bg-transparent text-sm focus:outline-none placeholder:text-slate-400",
965
+ value: query,
966
+ onChange: (ev: Event): void => {
967
+ patternInput[1](ev.target.value);
968
+ },
969
+ placeholder: "Search allergies...",
970
+ autoFocus: true,
971
+ })), delay<ReactElement>((): Iterable<ReactElement> => (isSearching ? singleton<ReactElement>(createElement<any>("span", {
972
+ className: "text-xs text-slate-400 animate-pulse",
973
+ children: "...",
974
+ })) : empty_1<ReactElement>()))))))), ["children", reactApi.Children.toArray(Array.from(elems_2))] as [string, any])]))), createElement<any>("div", createObj(ofArray([["className", "max-h-[50vh] overflow-y-auto"] as [string, any], (elems_3 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => ((((query.trim().length >= 2) && !isSearching) && isEmpty_1(results)) ? singleton<ReactElement>(createElement<any>("div", {
975
+ className: "px-3 py-4 text-sm text-slate-500 text-center",
976
+ children: `No allergies found for "${query}"`,
977
+ })) : append<ReactElement>(singleton<ReactElement>(renderGroup("Drugs", drugResults)), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(renderGroup("Environmental", envResults)), delay<ReactElement>((): Iterable<ReactElement> => singleton<ReactElement>(renderGroup("Foods", foodResults))))))))), ["children", reactApi.Children.toArray(Array.from(elems_3))] as [string, any])]))), createElement<any>("div", createObj(ofArray([["className", "border-t border-slate-200 px-3 py-2"] as [string, any], (elems_4 = [createElement<any>("button", {
978
+ className: "w-full text-left text-sm text-blue-600 hover:text-blue-700 font-medium",
979
+ children: "+ Add custom allergen",
980
+ onClick: (_arg_2: MouseEvent): void => {
981
+ onSelect(undefined);
982
+ },
983
+ })], ["children", reactApi.Children.toArray(Array.from(elems_4))] 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])])));
984
+ }
985
+
986
+ export function AllergyFinderField_AllergyCard(allergyFinderField_AllergyCardInputProps: any): ReactElement {
987
+ let elems_3: Iterable<ReactElement>;
988
+ const onRemove: (() => void) = allergyFinderField_AllergyCardInputProps.onRemove;
989
+ const onEdit: (() => void) = allergyFinderField_AllergyCardInputProps.onEdit;
990
+ const readOnly: boolean = allergyFinderField_AllergyCardInputProps.readOnly;
991
+ const entry: AllergyFinderField_AllergyEntry = allergyFinderField_AllergyCardInputProps.entry;
992
+ let reactionsPreview: string;
993
+ if (isEmpty_1(entry.Reactions)) {
994
+ reactionsPreview = "";
995
+ }
996
+ else {
997
+ const shown: string = join(", ", truncate<string>(3, entry.Reactions));
998
+ const overflow: int32 = (length(entry.Reactions) - 3) | 0;
999
+ reactionsPreview = ((overflow > 0) ? (`${shown} and ${overflow} more`) : shown);
1000
+ }
1001
+ return createElement<any>("div", createObj(ofArray([["className", `rounded-lg border border-slate-200 bg-white p-3 shadow-sm border-l-4 ${AllergyFinderField_severityBorderColor(entry.Severity)}`] as [string, any], (elems_3 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => {
1002
+ let elems_1: Iterable<ReactElement>, elems: Iterable<ReactElement>;
1003
+ return append<ReactElement>(singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex items-start justify-between gap-2 mb-1"] as [string, any], (elems_1 = [createElement<any>("span", {
1004
+ className: "font-semibold text-sm text-slate-900",
1005
+ children: entry.Name,
1006
+ }), createElement<any>("div", createObj(ofArray([["className", "flex gap-1.5 shrink-0"] as [string, any], (elems = [createElement(AllergyFinderField_SeverityBadge, {
1007
+ severity: entry.Severity,
1008
+ }), createElement(AllergyFinderField_CategoryBadge, {
1009
+ category: entry.Category,
1010
+ })], ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])])))], ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((entry.SubstanceName !== entry.Name) ? singleton<ReactElement>(createElement<any>("p", {
1011
+ className: "text-xs text-slate-500 mb-1",
1012
+ children: entry.SubstanceName,
1013
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>((reactionsPreview.length > 0) ? singleton<ReactElement>(createElement<any>("p", {
1014
+ className: "text-xs text-slate-600",
1015
+ children: `Reactions: ${reactionsPreview}`,
1016
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => {
1017
+ let matchValue: Option<string>;
1018
+ return append<ReactElement>((matchValue = entry.Remedy, (matchValue == null) ? (empty_1<ReactElement>()) : singleton<ReactElement>(createElement<any>("p", {
1019
+ className: "text-xs text-slate-600",
1020
+ children: `Remedy: ${value_284(matchValue)}`,
1021
+ }))), delay<ReactElement>((): Iterable<ReactElement> => {
1022
+ let value_24: string;
1023
+ return append<ReactElement>(entry.StaffOnly ? singleton<ReactElement>(createElement<any>("span", createObj(ofArray([(value_24 = "inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium bg-purple-50 text-purple-700 border border-purple-200 mt-1", ["className", value_24] as [string, any]), ["children", "Staff Only"] as [string, any]])))) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => {
1024
+ let elems_2: Iterable<ReactElement>;
1025
+ return !readOnly ? singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "flex justify-end gap-2 mt-2 pt-2 border-t border-slate-100"] as [string, any], (elems_2 = [createElement<any>("button", {
1026
+ className: "text-xs font-medium text-blue-600 hover:text-blue-700",
1027
+ children: "Edit",
1028
+ onClick: (_arg: MouseEvent): void => {
1029
+ onEdit();
1030
+ },
1031
+ }), createElement<any>("button", {
1032
+ className: "text-xs font-medium text-red-500 hover:text-red-600",
1033
+ children: "Remove",
1034
+ onClick: (_arg_1: MouseEvent): void => {
1035
+ onRemove();
1036
+ },
1037
+ })], ["children", reactApi.Children.toArray(Array.from(elems_2))] as [string, any])])))) : empty_1<ReactElement>();
1038
+ }));
1039
+ }));
1040
+ }))))));
1041
+ })), ["children", reactApi.Children.toArray(Array.from(elems_3))] as [string, any])])));
1042
+ }
1043
+
1044
+ export function AllergyFinderField_AllergyFinderFieldComponent(config: StandardRenderFieldConfig$2<string, AllergyFinderField_Attributes>): ReactElement {
1045
+ let elems_1: Iterable<ReactElement>;
1046
+ const patternInput: [FSharpList<AllergyFinderField_AllergyEntry>, ((arg0: FSharpList<AllergyFinderField_AllergyEntry>) => void)] = reactApi.useState<(() => FSharpList<AllergyFinderField_AllergyEntry>), FSharpList<AllergyFinderField_AllergyEntry>>((): FSharpList<AllergyFinderField_AllergyEntry> => AllergyFinderField_parseAllergies(config.Value));
1047
+ const allergies: FSharpList<AllergyFinderField_AllergyEntry> = patternInput[0];
1048
+ const patternInput_1: [boolean, ((arg0: boolean) => void)] = reactApi.useState<boolean, boolean>(false);
1049
+ const setShowSearch: ((arg0: boolean) => void) = patternInput_1[1];
1050
+ const patternInput_2: [AllergyFinderField_DetailModalState_$union, ((arg0: AllergyFinderField_DetailModalState_$union) => void)] = reactApi.useState<AllergyFinderField_DetailModalState_$union, AllergyFinderField_DetailModalState_$union>(AllergyFinderField_DetailModalState_Closed());
1051
+ const setDetailModal: ((arg0: AllergyFinderField_DetailModalState_$union) => void) = patternInput_2[1];
1052
+ const detailModal: AllergyFinderField_DetailModalState_$union = patternInput_2[0];
1053
+ const updateAndNotify = (newAllergies: FSharpList<AllergyFinderField_AllergyEntry>): void => {
1054
+ patternInput[1](newAllergies);
1055
+ config.OnChange(AllergyFinderField_serializeAllergies(newAllergies));
1056
+ };
1057
+ const readOnly: boolean = config.Disabled ? true : config.IsReadOnly;
1058
+ return createElement<any>("div", createObj(ofArray([["className", "space-y-2"] as [string, any], (elems_1 = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement<any>("label", {
1059
+ className: "text-xs font-semibold uppercase tracking-wide text-slate-700",
1060
+ children: config.Attributes.Label,
1061
+ })), delay<ReactElement>((): Iterable<ReactElement> => {
1062
+ let elems: Iterable<ReactElement>;
1063
+ return append<ReactElement>(isEmpty_1(allergies) ? singleton<ReactElement>(createElement<any>("div", {
1064
+ className: "rounded-lg border border-dashed border-slate-300 bg-slate-50 p-4 text-center text-sm text-slate-500",
1065
+ children: "No allergies added",
1066
+ })) : singleton<ReactElement>(createElement<any>("div", createObj(ofArray([["className", "space-y-2"] as [string, any], (elems = toList<ReactElement>(delay<ReactElement>((): Iterable<ReactElement> => map_1<AllergyFinderField_AllergyEntry, ReactElement>((entry_1: AllergyFinderField_AllergyEntry): ReactElement => createElement(AllergyFinderField_AllergyCard, {
1067
+ entry: entry_1,
1068
+ readOnly: readOnly,
1069
+ onEdit: (): void => {
1070
+ setDetailModal(AllergyFinderField_DetailModalState_Editing(entry_1));
1071
+ },
1072
+ onRemove: (): void => {
1073
+ updateAndNotify(filter<AllergyFinderField_AllergyEntry>((a_2: AllergyFinderField_AllergyEntry): boolean => (a_2.Id !== entry_1.Id), allergies));
1074
+ },
1075
+ }), allergies))), ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])])))), delay<ReactElement>((): Iterable<ReactElement> => {
1076
+ let value_13: string;
1077
+ return append<ReactElement>(!readOnly ? singleton<ReactElement>(createElement<any>("button", createObj(ofArray([(value_13 = "inline-flex items-center gap-1.5 rounded-md bg-blue-50 px-3 py-1.5 text-sm font-medium text-blue-600 hover:bg-blue-100 border border-blue-200", ["className", value_13] as [string, any]), ["children", "+ Add Allergy"] as [string, any], ["onClick", (_arg: MouseEvent): void => {
1078
+ setShowSearch(true);
1079
+ }] as [string, any]])))) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(patternInput_1[0] ? singleton<ReactElement>(createElement(AllergyFinderField_AllergySearchPopover, {
1080
+ apiFetch: config.Attributes.ApiFetch,
1081
+ onSelect: (fdaResult: Option<OpenFdaSearchResult>): void => {
1082
+ setShowSearch(false);
1083
+ setDetailModal(AllergyFinderField_DetailModalState_Adding(fdaResult));
1084
+ },
1085
+ onClose: (): void => {
1086
+ setShowSearch(false);
1087
+ },
1088
+ })) : empty_1<ReactElement>(), delay<ReactElement>((): Iterable<ReactElement> => append<ReactElement>(singleton<ReactElement>(createElement(AllergyFinderField_AllergyDetailModal, {
1089
+ apiFetch: config.Attributes.ApiFetch,
1090
+ modalState: detailModal,
1091
+ onClose: (): void => {
1092
+ setDetailModal(AllergyFinderField_DetailModalState_Closed());
1093
+ },
1094
+ onSave: (entry: AllergyFinderField_AllergyEntry): void => {
1095
+ switch (detailModal.tag) {
1096
+ case /* Adding */ 1: {
1097
+ if (!exists<AllergyFinderField_AllergyEntry>((a_1: AllergyFinderField_AllergyEntry): boolean => (compare(a_1.SubstanceName, entry.SubstanceName, 5) === 0), allergies)) {
1098
+ updateAndNotify(append_1(allergies, singleton_1(entry)));
1099
+ }
1100
+ break;
1101
+ }
1102
+ case /* Closed */ 0: {
1103
+ break;
1104
+ }
1105
+ default: {
1106
+ const existing: AllergyFinderField_AllergyEntry = detailModal.fields[0];
1107
+ updateAndNotify(map<AllergyFinderField_AllergyEntry, AllergyFinderField_AllergyEntry>((a: AllergyFinderField_AllergyEntry): AllergyFinderField_AllergyEntry => {
1108
+ if (a.Id === existing.Id) {
1109
+ return entry;
1110
+ }
1111
+ else {
1112
+ return a;
1113
+ }
1114
+ }, allergies));
1115
+ }
1116
+ }
1117
+ setDetailModal(AllergyFinderField_DetailModalState_Closed());
1118
+ },
1119
+ })), delay<ReactElement>((): Iterable<ReactElement> => ((config.ShowError && (config.Error != null)) ? singleton<ReactElement>(createElement<any>("p", {
1120
+ className: "text-xs text-red-600 mt-1",
1121
+ children: toString_1(value_284(config.Error)),
1122
+ })) : empty_1<ReactElement>())))))));
1123
+ }));
1124
+ })))), ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any])])));
1125
+ }
1126
+
1127
+ export class AllergyFinderField_Field$1<Values> extends IStandardField$3<Values, string, AllergyFinderField_Attributes> implements IField$1<Values> {
1128
+ readonly innerField_1: Field$3<AllergyFinderField_Attributes, string, Values>;
1129
+ constructor(innerField: Field$3<AllergyFinderField_Attributes, string, Values>) {
1130
+ super(innerField);
1131
+ this.innerField_1 = innerField;
1132
+ }
1133
+ "Fable.Form.Simple.Bulma.IStandardField`3.RenderFieldZ43FEF6DC"(config: StandardRenderFieldConfig$2<string, AllergyFinderField_Attributes>): ReactElement {
1134
+ return createElement(AllergyFinderField_AllergyFinderFieldComponent, config);
1135
+ }
1136
+ MapFieldValues<NewValues>(update: ((arg0: Values) => $a)): IField$1<$a> {
1137
+ const _: AllergyFinderField_Field$1<Values> = this;
1138
+ return AllergyFinderField_Field$1_$ctor_2F8EC839<$a>(mapValues<Values, $a, AllergyFinderField_Attributes, string>(update, _.innerField_1));
1139
+ }
1140
+ }
1141
+
1142
+ export function AllergyFinderField_Field$1_$reflection(gen0: TypeInfo): TypeInfo {
1143
+ return class_type("Fable.Form.Simple.Bulma.Fields.AllergyFinderField.AllergyFinderField.Field`1", [gen0], AllergyFinderField_Field$1, IStandardField$3_$reflection(gen0, string_type, AllergyFinderField_Attributes_$reflection()));
1144
+ }
1145
+
1146
+ export function AllergyFinderField_Field$1_$ctor_2F8EC839<Values>(innerField: Field$3<AllergyFinderField_Attributes, string, Values>): AllergyFinderField_Field$1<Values> {
1147
+ return new AllergyFinderField_Field$1(innerField);
1148
+ }
1149
+
1150
+ export function Form_allergyFinderField<Values, Output>(config: FieldConfig$4<AllergyFinderField_Attributes, string, Values, Output>): Form$3<Values, Output, IField$1<Values>> {
1151
+ return AllergyFinderField_form<Values, IField$1<Values>, Output>()(AllergyFinderField_Field$1_$ctor_2F8EC839)(config);
1152
+ }
1153
+
1154
+ export const Form_pluginConfig: Spec_PluginFieldConfig = new Spec_PluginFieldConfig("Fable.Form.Simple.Bulma.Fields.AllergyFinderField", undefined, undefined);
1155
+
1156
+ export const Form_PropertyKeys_AllergyCount: Shared_PluginPropertyKey = new Shared_PluginPropertyKey("af100001-af10-af10-af10-af10af10af10");
1157
+
1158
+ export const Form_PropertyKeys_HasSevereAllergy: Shared_PluginPropertyKey = new Shared_PluginPropertyKey("af100002-af10-af10-af10-af10af10af10");
1159
+
1160
+ export const Form_PropertyKeys_AllergiesJson: Shared_PluginPropertyKey = new Shared_PluginPropertyKey("af100003-af10-af10-af10-af10af10af10");
1161
+
1162
+ export const Form_enhancedAllergyConverter: IPluginValueConverter = new IPluginValueConverter((fieldKey: Shared_FieldKey, pluginValue: any): Option<Shared_FieldValue_$union> => {
1163
+ const json: string = toString_1(pluginValue);
1164
+ const allergies: FSharpList<AllergyFinderField_AllergyEntry> = AllergyFinderField_parseAllergies(json);
1165
+ return Shared_FieldValue_PluginData(ofArray([new Shared_PluginDataProperty(Form_PropertyKeys_AllergyCount, "allergy_count", "int", int32ToString(length(allergies)), "Allergy Count", undefined, "Number of recorded allergies"), new Shared_PluginDataProperty(Form_PropertyKeys_HasSevereAllergy, "has_severe_allergy", "bool", toString_1(exists<AllergyFinderField_AllergyEntry>((a: AllergyFinderField_AllergyEntry): boolean => {
1166
+ if (equals(a.Severity, AllergyFinderField_AllergySeverity_Severe())) {
1167
+ return true;
1168
+ }
1169
+ else {
1170
+ return equals(a.Severity, AllergyFinderField_AllergySeverity_LifeThreatening());
1171
+ }
1172
+ }, allergies)), "Has Severe Allergy", undefined, "Whether patient has any severe or life-threatening allergies"), new Shared_PluginDataProperty(Form_PropertyKeys_AllergiesJson, "allergies_json", "json", json, "Allergies Data", undefined, "Full allergy data as JSON")]));
1173
+ }, (fieldValue: Shared_FieldValue_$union): Option<any> => ((fieldValue.tag === /* PluginData */ 3) ? orElseWith<any>(map_2<Shared_PluginDataProperty, any>((p_1: Shared_PluginDataProperty): any => p_1.Value, tryFind<Shared_PluginDataProperty>((p: Shared_PluginDataProperty): boolean => (p.Name === "allergies_json"), fieldValue.fields[0])), (): Option<any> => some("[]")) : ((fieldValue.tag === /* Single */ 0) ? some(fieldValue.fields[0].Value) : some("[]"))), (): Option<FSharpList<Shared_FieldOption>> => undefined, (): FSharpList<string> => ofArray(["allergy_count", "has_severe_allergy", "allergies_json"]), (propertyName: string): Option<Shared_PluginDataProperty> => ((propertyName === "allergy_count") ? (new Shared_PluginDataProperty(Form_PropertyKeys_AllergyCount, "allergy_count", "int", "0", "Allergy Count", undefined, "Number of recorded allergies")) : ((propertyName === "has_severe_allergy") ? (new Shared_PluginDataProperty(Form_PropertyKeys_HasSevereAllergy, "has_severe_allergy", "bool", "false", "Has Severe Allergy", undefined, "Whether patient has any severe or life-threatening allergies")) : ((propertyName === "allergies_json") ? (new Shared_PluginDataProperty(Form_PropertyKeys_AllergiesJson, "allergies_json", "json", "[]", "Allergies Data", undefined, "Full allergy data as JSON")) : undefined))), (propertyKey: Shared_PluginPropertyKey): Option<Shared_PluginDataProperty> => (equals(propertyKey, Form_PropertyKeys_AllergyCount) ? (new Shared_PluginDataProperty(Form_PropertyKeys_AllergyCount, "allergy_count", "int", "0", "Allergy Count", undefined, "Number of recorded allergies")) : (equals(propertyKey, Form_PropertyKeys_HasSevereAllergy) ? (new Shared_PluginDataProperty(Form_PropertyKeys_HasSevereAllergy, "has_severe_allergy", "bool", "false", "Has Severe Allergy", undefined, "Whether patient has any severe or life-threatening allergies")) : (equals(propertyKey, Form_PropertyKeys_AllergiesJson) ? (new Shared_PluginDataProperty(Form_PropertyKeys_AllergiesJson, "allergies_json", "json", "[]", "Allergies Data", undefined, "Full allergy data as JSON")) : undefined))), (propertyName_1: string, fieldValue_1: Shared_FieldValue_$union): Option<Shared_PluginDataProperty> => {
1174
+ switch (fieldValue_1.tag) {
1175
+ case /* PluginData */ 3:
1176
+ return tryFind<Shared_PluginDataProperty>((p_2: Shared_PluginDataProperty): boolean => (p_2.Name === propertyName_1), fieldValue_1.fields[0]);
1177
+ case /* Single */ 0: {
1178
+ const answer_1: Shared_FieldAnswer = fieldValue_1.fields[0];
1179
+ const allergies_1: FSharpList<AllergyFinderField_AllergyEntry> = AllergyFinderField_parseAllergies(answer_1.Value);
1180
+ return (propertyName_1 === "allergy_count") ? (new Shared_PluginDataProperty(Form_PropertyKeys_AllergyCount, "allergy_count", "int", int32ToString(length(allergies_1)), "Allergy Count", undefined, "Number of recorded allergies")) : ((propertyName_1 === "has_severe_allergy") ? (new Shared_PluginDataProperty(Form_PropertyKeys_HasSevereAllergy, "has_severe_allergy", "bool", toString_1(exists<AllergyFinderField_AllergyEntry>((a_1: AllergyFinderField_AllergyEntry): boolean => {
1181
+ if (equals(a_1.Severity, AllergyFinderField_AllergySeverity_Severe())) {
1182
+ return true;
1183
+ }
1184
+ else {
1185
+ return equals(a_1.Severity, AllergyFinderField_AllergySeverity_LifeThreatening());
1186
+ }
1187
+ }, allergies_1)), "Has Severe Allergy", undefined, "Whether patient has any severe or life-threatening allergies")) : ((propertyName_1 === "allergies_json") ? (new Shared_PluginDataProperty(Form_PropertyKeys_AllergiesJson, "allergies_json", "json", answer_1.Value, "Allergies Data", undefined, "Full allergy data as JSON")) : undefined));
1188
+ }
1189
+ default:
1190
+ return undefined;
1191
+ }
1192
+ }, (propertyKey_1: Shared_PluginPropertyKey, fieldValue_2: Shared_FieldValue_$union): Option<Shared_PluginDataProperty> => ((fieldValue_2.tag === /* PluginData */ 3) ? tryFind<Shared_PluginDataProperty>((p_3: Shared_PluginDataProperty): boolean => equals(p_3.PropertyKey, propertyKey_1), fieldValue_2.fields[0]) : undefined), (propertyName_2: string, value: string): FSharpResult$2_$union<void, string> => {
1193
+ switch (propertyName_2) {
1194
+ case "allergy_count": {
1195
+ let matchValue: [boolean, int32];
1196
+ let outArg = 0;
1197
+ matchValue = ([tryParse(value, 511, false, 32, new FSharpRef<int32>((): int32 => outArg, (v: int32): void => {
1198
+ outArg = (v | 0);
1199
+ })), outArg] as [boolean, int32]);
1200
+ let matchResult: int32;
1201
+ if (matchValue[0]) {
1202
+ if (matchValue[1] >= 0) {
1203
+ matchResult = 0;
1204
+ }
1205
+ else {
1206
+ matchResult = 1;
1207
+ }
1208
+ }
1209
+ else {
1210
+ matchResult = 1;
1211
+ }
1212
+ switch (matchResult) {
1213
+ case 0:
1214
+ return FSharpResult$2_Ok<void, string>(undefined);
1215
+ default:
1216
+ return FSharpResult$2_Error<void, string>("Allergy count must be a non-negative integer");
1217
+ }
1218
+ }
1219
+ case "has_severe_allergy": {
1220
+ const matchValue_1: string = value.toLowerCase();
1221
+ switch (matchValue_1) {
1222
+ case "true":
1223
+ case "false":
1224
+ return FSharpResult$2_Ok<void, string>(undefined);
1225
+ default:
1226
+ return FSharpResult$2_Error<void, string>("Must be true or false");
1227
+ }
1228
+ }
1229
+ case "allergies_json":
1230
+ return FSharpResult$2_Ok<void, string>(undefined);
1231
+ default:
1232
+ return FSharpResult$2_Error<void, string>(`Unknown property: ${propertyName_2}`);
1233
+ }
1234
+ }, (fieldValue_3: Shared_FieldValue_$union): FSharpList<Shared_PluginDataProperty> => {
1235
+ switch (fieldValue_3.tag) {
1236
+ case /* PluginData */ 3:
1237
+ return fieldValue_3.fields[0];
1238
+ case /* Single */ 0: {
1239
+ const answer_2: Shared_FieldAnswer = fieldValue_3.fields[0];
1240
+ const allergies_2: FSharpList<AllergyFinderField_AllergyEntry> = AllergyFinderField_parseAllergies(answer_2.Value);
1241
+ const hasSevere_2: boolean = exists<AllergyFinderField_AllergyEntry>((a_2: AllergyFinderField_AllergyEntry): boolean => {
1242
+ if (equals(a_2.Severity, AllergyFinderField_AllergySeverity_Severe())) {
1243
+ return true;
1244
+ }
1245
+ else {
1246
+ return equals(a_2.Severity, AllergyFinderField_AllergySeverity_LifeThreatening());
1247
+ }
1248
+ }, allergies_2);
1249
+ return ofArray([new Shared_PluginDataProperty(Form_PropertyKeys_AllergyCount, "allergy_count", "int", int32ToString(length(allergies_2)), "Allergy Count", undefined, "Number of recorded allergies"), new Shared_PluginDataProperty(Form_PropertyKeys_HasSevereAllergy, "has_severe_allergy", "bool", toString_1(hasSevere_2), "Has Severe Allergy", undefined, "Whether patient has any severe or life-threatening allergies"), new Shared_PluginDataProperty(Form_PropertyKeys_AllergiesJson, "allergies_json", "json", answer_2.Value, "Allergies Data", undefined, "Full allergy data as JSON")]);
1250
+ }
1251
+ default:
1252
+ return empty<Shared_PluginDataProperty>();
1253
+ }
1254
+ });
1255
+
1256
+ export function Form_designerPreview(props: RenderPreviewProps$1<Spec_FieldType_$union>): ReactElement {
1257
+ let elems_3: Iterable<ReactElement>, elems_2: Iterable<ReactElement>, elems: Iterable<ReactElement>, elems_1: Iterable<ReactElement>;
1258
+ const children: Iterable<ReactElement> = [createElement<any>("div", createObj(Helpers_combineClasses("box", ofArray([["style", {
1259
+ border: (((1 + "px ") + "dashed") + " ") + "hsl(0, 0%, 86%)",
1260
+ backgroundColor: "hsl(0, 0%, 98%)",
1261
+ padding: 16,
1262
+ }] as [string, any], (elems_3 = [createElement<any>("div", {
1263
+ className: "has-text-weight-bold",
1264
+ children: "Allergy Finder",
1265
+ style: {
1266
+ marginBottom: 8,
1267
+ },
1268
+ }), createElement<any>("div", createObj(ofArray([["style", {
1269
+ fontSize: 11 + "px",
1270
+ color: "hsl(0, 0%, 50%)",
1271
+ }] as [string, any], (elems_2 = [createElement<any>("div", createObj(ofArray([["style", {
1272
+ borderLeft: (((3 + "px ") + "solid") + " ") + "#ef4444",
1273
+ paddingLeft: 8,
1274
+ marginBottom: 6,
1275
+ }] as [string, any], (elems = [createElement<any>("div", {
1276
+ children: "Penicillin — Severe",
1277
+ }), createElement<any>("div", {
1278
+ style: {
1279
+ fontSize: 9 + "px",
1280
+ },
1281
+ children: "Reactions: Rash, Hives, Anaphylaxis",
1282
+ })], ["children", reactApi.Children.toArray(Array.from(elems))] as [string, any])]))), createElement<any>("div", createObj(ofArray([["style", {
1283
+ borderLeft: (((3 + "px ") + "solid") + " ") + "#f59e0b",
1284
+ paddingLeft: 8,
1285
+ marginBottom: 6,
1286
+ }] as [string, any], (elems_1 = [createElement<any>("div", {
1287
+ children: "Pollen — Moderate",
1288
+ }), createElement<any>("div", {
1289
+ style: {
1290
+ fontSize: 9 + "px",
1291
+ },
1292
+ children: "Reactions: Sneezing, Congestion",
1293
+ })], ["children", reactApi.Children.toArray(Array.from(elems_1))] as [string, any])]))), createElement<any>("div", {
1294
+ style: {
1295
+ marginTop: 8,
1296
+ color: "hsl(217, 91%, 60%)",
1297
+ fontWeight: 600,
1298
+ },
1299
+ children: "+ Add Allergy",
1300
+ })], ["children", reactApi.Children.toArray(Array.from(elems_2))] as [string, any])]))), createElement<any>("div", {
1301
+ style: {
1302
+ fontSize: 10 + "px",
1303
+ color: "hsl(0, 0%, 60%)",
1304
+ marginTop: 8,
1305
+ },
1306
+ children: "OpenFDA-powered allergy search with detailed profiles",
1307
+ })], ["children", reactApi.Children.toArray(Array.from(elems_3))] as [string, any])]))))];
1308
+ return createElement<any>("div", {
1309
+ className: "control",
1310
+ children: reactApi.Children.toArray(Array.from(children)),
1311
+ });
1312
+ }
1313
+
1314
+ export function Form_markdownRenderer(field: Spec_FormField$1<Spec_FieldType_$union>, fieldDetails: FieldDetails): string {
1315
+ let matchValue: Shared_FieldValue_$union;
1316
+ const allergies: FSharpList<AllergyFinderField_AllergyEntry> = AllergyFinderField_parseAllergies((matchValue = fieldDetails.FieldValue, (matchValue.tag === /* Single */ 0) ? matchValue.fields[0].Value : ((matchValue.tag === /* PluginData */ 3) ? defaultArg(map_2<Shared_PluginDataProperty, string>((p_1: Shared_PluginDataProperty): string => p_1.Value, tryFind<Shared_PluginDataProperty>((p: Shared_PluginDataProperty): boolean => (p.Name === "allergies_json"), matchValue.fields[0])), "[]") : "[]")));
1317
+ if (isEmpty_1(allergies)) {
1318
+ return `**${field.Label}:** *[No allergies recorded]*`;
1319
+ }
1320
+ else {
1321
+ let rows: FSharpList<string> = ofArray([`**${field.Label}**`, "", "| Allergen | Severity | Category | Reactions | Remedy |", "|----------|----------|----------|-----------|--------|"]);
1322
+ const enumerator: IEnumerator<AllergyFinderField_AllergyEntry> = getEnumerator(allergies);
1323
+ try {
1324
+ while (enumerator["System.Collections.IEnumerator.MoveNext"]()) {
1325
+ const a: AllergyFinderField_AllergyEntry = enumerator["System.Collections.Generic.IEnumerator`1.get_Current"]();
1326
+ let sevEmoji: string;
1327
+ const matchValue_1: AllergyFinderField_AllergySeverity_$union = a.Severity;
1328
+ sevEmoji = ((matchValue_1.tag === /* Severe */ 3) ? "🟠" : ((matchValue_1.tag === /* Moderate */ 2) ? "🟡" : ((matchValue_1.tag === /* Mild */ 1) ? "🟢" : ((matchValue_1.tag === /* Unknown */ 0) ? "⚪" : "🔴"))));
1329
+ const reactions: string = isEmpty_1(a.Reactions) ? "--" : join(", ", truncate<string>(3, a.Reactions));
1330
+ const remedy: string = defaultArg(a.Remedy, "--");
1331
+ rows = append_1(rows, singleton_1(`| **${a.Name}** | ${sevEmoji} ${AllergyFinderField_severityLabel(a.Severity)} | ${AllergyFinderField_categoryLabel(a.Category)} | ${reactions} | ${remedy} |`));
1332
+ }
1333
+ }
1334
+ finally {
1335
+ disposeSafe(enumerator as IDisposable);
1336
+ }
1337
+ return join("\n", rows);
1338
+ }
1339
+ }
1340
+
1341
+ //# sourceMappingURL=AllergyFinderField.ts.map