@f1studio/form-spec 5.0.0-alpha.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Designer.d.ts +89 -0
- package/FormSpec.TS/Components/HelloComponent.js +68 -0
- package/FormSpec.TS/Components/HelloComponent.js.map +1 -0
- package/FormSpec.TS/Components/HelloComponent.ts.map +1 -0
- package/FormSpec.TS/Designer.js +526 -0
- package/FormSpec.TS/Designer.js.map +1 -0
- package/FormSpec.TS/Designer.ts.map +1 -0
- package/FormSpec.TS/FormSpec.js +5400 -0
- package/FormSpec.TS/FormSpec.js.map +1 -0
- package/FormSpec.TS/FormSpec.ts.map +1 -0
- package/FormSpec.TS/FormSpecHelpers.js +382 -0
- package/FormSpec.TS/FormSpecHelpers.js.map +1 -0
- package/FormSpec.TS/FormSpecHelpers.ts.map +1 -0
- package/FormSpec.TS/Helpers.js +732 -0
- package/FormSpec.TS/Helpers.js.map +1 -0
- package/FormSpec.TS/Helpers.ts.map +1 -0
- package/FormSpec.TS/Interfaces.js +257 -0
- package/FormSpec.TS/Interfaces.js.map +1 -0
- package/FormSpec.TS/Interfaces.ts.map +1 -0
- package/FormSpec.TS/Interop/FormSpec.Api.Helpers.js +854 -0
- package/FormSpec.TS/Interop/FormSpec.Api.Helpers.js.map +1 -0
- package/FormSpec.TS/Interop/FormSpec.Api.Helpers.ts.map +1 -0
- package/FormSpec.TS/Interop/FormSpec.Api.Option.js +1961 -0
- package/FormSpec.TS/Interop/FormSpec.Api.Option.js.map +1 -0
- package/FormSpec.TS/Interop/FormSpec.Api.Option.ts.map +1 -0
- package/FormSpec.TS/Interop/FormSpec.Values.Api.Option.js +1367 -0
- package/FormSpec.TS/Interop/FormSpec.Values.Api.Option.js.map +1 -0
- package/FormSpec.TS/Interop/FormSpec.Values.Api.Option.ts.map +1 -0
- package/FormSpec.TS/Logging/LogTypes.js +347 -0
- package/FormSpec.TS/Logging/LogTypes.js.map +1 -0
- package/FormSpec.TS/Logging/LogTypes.ts.map +1 -0
- package/FormSpec.TS/Migrator.js +230 -0
- package/FormSpec.TS/Migrator.js.map +1 -0
- package/FormSpec.TS/Migrator.ts.map +1 -0
- package/FormSpec.TS/PathwayDataExtractor.js +361 -0
- package/FormSpec.TS/PathwayDataExtractor.js.map +1 -0
- package/FormSpec.TS/PathwayDataExtractor.ts.map +1 -0
- package/FormSpec.TS/PathwayExecutor.js +1321 -0
- package/FormSpec.TS/PathwayExecutor.js.map +1 -0
- package/FormSpec.TS/PathwayExecutor.ts.map +1 -0
- package/FormSpec.TS/PathwayValidator.js +346 -0
- package/FormSpec.TS/PathwayValidator.js.map +1 -0
- package/FormSpec.TS/PathwayValidator.ts.map +1 -0
- package/FormSpec.TS/PluginInterface.js +171 -0
- package/FormSpec.TS/PluginInterface.js.map +1 -0
- package/FormSpec.TS/PluginInterface.ts.map +1 -0
- package/FormSpec.TS/Prelude.js +59 -0
- package/FormSpec.TS/Prelude.js.map +1 -0
- package/FormSpec.TS/Prelude.ts.map +1 -0
- package/FormSpec.TS/Renderers/FormSpecMarkdownRenderer.js +958 -0
- package/FormSpec.TS/Renderers/FormSpecMarkdownRenderer.js.map +1 -0
- package/FormSpec.TS/Renderers/FormSpecMarkdownRenderer.ts.map +1 -0
- package/FormSpec.TS/Renderers/MermaidRenderer.js +228 -0
- package/FormSpec.TS/Renderers/MermaidRenderer.js.map +1 -0
- package/FormSpec.TS/Renderers/MermaidRenderer.ts.map +1 -0
- package/FormSpec.TS/Renderers/PathwayRenderers.js +190 -0
- package/FormSpec.TS/Renderers/PathwayRenderers.js.map +1 -0
- package/FormSpec.TS/Renderers/PathwayRenderers.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Base.fs +511 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Base.fs.js +437 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Base.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Base.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Error.fs +16 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Error.fs.js +73 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Error.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Error.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Extensions.fs +50 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Extensions.fs.js +72 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Extensions.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Extensions.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Fable.Form.fableproj +28 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Field.fs +24 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Field.fs.js +56 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Field.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.3.0.0/Field.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.Simple.5.0.1/Fable.Form.Simple.fableproj +31 -0
- package/FormSpec.TS/fable_modules/Fable.Form.Simple.5.0.1/Form.fs +178 -0
- package/FormSpec.TS/fable_modules/Fable.Form.Simple.5.0.1/Form.fs.js +464 -0
- package/FormSpec.TS/fable_modules/Fable.Form.Simple.5.0.1/Form.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.Form.Simple.5.0.1/Form.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.Extensions.fs +17 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.Hooks.fs +152 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.Hooks.fs.js +25 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.Hooks.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.Hooks.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.Types.fableproj +28 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.fs +218 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.fs.js +37 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.React.Types.18.3.0/Fable.React.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.ReactDom.Types.18.2.0/Fable.ReactDom.Types.fableproj +27 -0
- package/FormSpec.TS/fable_modules/Fable.ReactDom.Types.18.2.0/Fable.ReactDom.fs +82 -0
- package/FormSpec.TS/fable_modules/Fable.ReactDom.Types.18.2.0/Fable.ReactDom.fs.js +7 -0
- package/FormSpec.TS/fable_modules/Fable.ReactDom.Types.18.2.0/Fable.ReactDom.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Fable.ReactDom.Types.18.2.0/Fable.ReactDom.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/BorderStyle.fs +59 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Colors.fs +154 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Colors.fs.js +32 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Colors.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Colors.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Feliz.fableproj +42 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Fonts.fs +240 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/GridTypes.fs +24 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Html.fs +826 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Interop.fs +83 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Interop.fs.js +292 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Interop.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Interop.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Key.fs +65 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Key.fs.js +229 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Key.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Key.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Length.fs +91 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Locale.fs +876 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Properties.fs +4080 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Properties.fs.js +133 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Properties.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Properties.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/React.fs +656 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/React.fs.js +561 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/React.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/React.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactDOM.fs +25 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactDOM.fs.js +46 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactDOM.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactDOM.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactInterop.js +63 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactInterop.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactTypes.fs +41 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactTypes.fs.js +7 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactTypes.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/ReactTypes.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/StyleTypes.fs +53 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/StyleTypes.fs.js +7 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/StyleTypes.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/StyleTypes.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Styles.fs +5740 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Svg.fs +1455 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Svg.fs.js +39 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Svg.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Svg.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/TextDecorationLine.fs +13 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/TextDecorationStyle.fs +33 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Transform.fs +181 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/TransformOrigin.fs +17 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/TransitionProperty.fs +162 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Types.fs +13 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Types.fs.js +7 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Types.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Feliz.2.7.0/Types.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Decode.fs +1768 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Decode.fs.js +2337 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Decode.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Decode.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Encode.fs +811 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Encode.fs.js +465 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Encode.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Encode.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Extra.fs +47 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Extra.fs.js +18 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Extra.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Extra.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Thoth.Json.fableproj +34 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Types.fs +68 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Types.fs.js +355 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Types.fs.js.map +1 -0
- package/FormSpec.TS/fable_modules/Thoth.Json.10.4.1/Types.fs.ts.map +1 -0
- package/FormSpec.TS/fable_modules/project_cracked.json +1 -0
- package/FormSpec.d.ts +1257 -0
- package/FormSpecHelpers.d.ts +50 -0
- package/Helpers.d.ts +147 -0
- package/Interfaces.d.ts +70 -0
- package/Interop/FormSpec.Api.Helpers.d.ts +247 -0
- package/Interop/FormSpec.Api.Helpers.d.ts.map +1 -0
- package/Interop/FormSpec.Api.Option.d.ts +384 -0
- package/Interop/FormSpec.Api.Option.d.ts.map +1 -0
- package/Interop/FormSpec.Values.Api.Option.d.ts +324 -0
- package/Interop/FormSpec.Values.Api.Option.d.ts.map +1 -0
- package/Migrator.d.ts +59 -0
- package/PathwayDataExtractor.d.ts +19 -0
- package/PathwayExecutor.d.ts +210 -0
- package/PathwayValidator.d.ts +52 -0
- package/PluginInterface.d.ts +36 -0
- package/Prelude.d.ts +11 -0
- package/README.TS.md +622 -0
- package/README.md +85 -0
- package/package.json +39 -0
- package/src/Components/HelloComponent.ts +48 -0
- package/src/Components/HelloComponent.ts.map +1 -0
- package/src/Designer.ts +389 -0
- package/src/Designer.ts.map +1 -0
- package/src/FormSpec.ts +3114 -0
- package/src/FormSpec.ts.map +1 -0
- package/src/FormSpecHelpers.ts +374 -0
- package/src/FormSpecHelpers.ts.map +1 -0
- package/src/Helpers.ts +765 -0
- package/src/Helpers.ts.map +1 -0
- package/src/Interfaces.ts +166 -0
- package/src/Interfaces.ts.map +1 -0
- package/src/Interop/FormSpec.Api.Helpers.ts +872 -0
- package/src/Interop/FormSpec.Api.Helpers.ts.map +1 -0
- package/src/Interop/FormSpec.Api.Option.ts +1618 -0
- package/src/Interop/FormSpec.Api.Option.ts.map +1 -0
- package/src/Interop/FormSpec.Values.Api.Option.ts +1214 -0
- package/src/Interop/FormSpec.Values.Api.Option.ts.map +1 -0
- package/src/Logging/LogTypes.ts +212 -0
- package/src/Logging/LogTypes.ts.map +1 -0
- package/src/Migrator.ts +156 -0
- package/src/Migrator.ts.map +1 -0
- package/src/PathwayDataExtractor.ts +290 -0
- package/src/PathwayDataExtractor.ts.map +1 -0
- package/src/PathwayExecutor.ts +1102 -0
- package/src/PathwayExecutor.ts.map +1 -0
- package/src/PathwayValidator.ts +244 -0
- package/src/PathwayValidator.ts.map +1 -0
- package/src/PluginInterface.ts +79 -0
- package/src/PluginInterface.ts.map +1 -0
- package/src/Prelude.ts +21 -0
- package/src/Prelude.ts.map +1 -0
- package/src/Renderers/FormSpecMarkdownRenderer.ts +874 -0
- package/src/Renderers/FormSpecMarkdownRenderer.ts.map +1 -0
- package/src/Renderers/MermaidRenderer.ts +218 -0
- package/src/Renderers/MermaidRenderer.ts.map +1 -0
- package/src/Renderers/PathwayRenderers.ts +200 -0
- package/src/Renderers/PathwayRenderers.ts.map +1 -0
package/src/Helpers.ts
ADDED
|
@@ -0,0 +1,765 @@
|
|
|
1
|
+
import { Values_StepOrder, Shared_FieldValue_Multiple, Shared_FieldValue_Single, Shared_FieldAnswer, Shared_FieldValue_$union, Values_FieldDetails$1, Shared_FieldOption, Spec_FieldType_$union, Spec_FieldType, Spec_FormSpec$1, Spec_FormField$1, Spec_FormStep$1, Shared_FieldKey } from "./FormSpec.js";
|
|
2
|
+
import { arrayToGuid, parse } from "@fable-org/fable-library-js/Guid.js";
|
|
3
|
+
import { toConsole, isNullOrEmpty, trimEnd, trim, isNullOrWhiteSpace } from "@fable-org/fable-library-js/String.js";
|
|
4
|
+
import { replace } from "@fable-org/fable-library-js/RegExp.js";
|
|
5
|
+
import { compare, safeHash, comparePrimitives, equals, stringHash } from "@fable-org/fable-library-js/Util.js";
|
|
6
|
+
import { uint8, int32 } from "@fable-org/fable-library-js/Int32.js";
|
|
7
|
+
import { item, setItem, fill } from "@fable-org/fable-library-js/Array.js";
|
|
8
|
+
import { value as value_1, Option, map, defaultArg } from "@fable-org/fable-library-js/Option.js";
|
|
9
|
+
import { splitAt, tryFindIndex, forAll, sortBy, find, insertAt, mapIndexed, singleton, append, head, tail, isEmpty, collect, empty, tryFind, FSharpList, filter, map as map_1 } from "@fable-org/fable-library-js/List.js";
|
|
10
|
+
import { Result_Map, FSharpResult$2_$union, FSharpResult$2_Error, FSharpResult$2_Ok } from "@fable-org/fable-library-js/Result.js";
|
|
11
|
+
import { List_distinct } from "@fable-org/fable-library-js/Seq2.js";
|
|
12
|
+
import { map as map_2, tryFind as tryFind_1 } from "@fable-org/fable-library-js/Seq.js";
|
|
13
|
+
import { FSharpMap__Change, ofList, toList, FSharpMap__get_Count, FSharpMap__get_IsEmpty, FSharpMap__ContainsKey, filter as filter_1, FSharpMap__Add, FSharpMap__Remove, FSharpMap, FSharpMap__get_Item, toSeq } from "@fable-org/fable-library-js/Map.js";
|
|
14
|
+
import { FSharpSet, empty as empty_1, map as map_3 } from "@fable-org/fable-library-js/Set.js";
|
|
15
|
+
|
|
16
|
+
export function Converters_fieldKeyToString(key: Shared_FieldKey): string {
|
|
17
|
+
return key.fields[0];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function Converters_stringToFieldKey(s: string): Shared_FieldKey {
|
|
21
|
+
return new Shared_FieldKey(parse(s));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Canonicalize a field label or key to snake_case for consistent field key generation
|
|
26
|
+
* Converts: "Patient Refused Administration of test" → "patient_refused_administration_of_test"
|
|
27
|
+
* This is the single source of truth for field name canonicalization
|
|
28
|
+
*/
|
|
29
|
+
export function Helpers_canonicalizeFieldKey(input: string): string {
|
|
30
|
+
if (isNullOrWhiteSpace(input)) {
|
|
31
|
+
return "field_unknown";
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const s_5: string = trim(replace(replace(replace(trimEnd(input.toLowerCase().trim(), ":"), "[\\s\\-]+", "_"), "[^a-z0-9_]", ""), "_+", "_"), "_");
|
|
35
|
+
if (isNullOrEmpty(s_5)) {
|
|
36
|
+
return "field_unknown";
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return s_5;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function Helpers_generateDeterministicGuid(fieldName: string): string {
|
|
45
|
+
const hash: int32 = stringHash(Helpers_canonicalizeFieldKey(fieldName)) | 0;
|
|
46
|
+
const bytes: uint8[] = fill(new Array(16), 0, 16, 0);
|
|
47
|
+
for (let i = 0; i <= 3; i++) {
|
|
48
|
+
setItem(bytes, i, (hash >> (i * 8)) & 0xFF);
|
|
49
|
+
setItem(bytes, i + 4, ((hash >> 1) >> (i * 8)) & 0xFF);
|
|
50
|
+
setItem(bytes, i + 8, ((hash >> 2) >> (i * 8)) & 0xFF);
|
|
51
|
+
setItem(bytes, i + 12, ((hash >> 3) >> (i * 8)) & 0xFF);
|
|
52
|
+
}
|
|
53
|
+
setItem(bytes, 6, (item(6, bytes) & 15) | 64);
|
|
54
|
+
setItem(bytes, 8, (item(8, bytes) & 63) | 128);
|
|
55
|
+
return arrayToGuid(bytes);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Finds a form field by its label string in a specific step.
|
|
60
|
+
*/
|
|
61
|
+
export function Helpers_FieldFinders_findFormFieldInStepByLabelString<FieldType>(label: string, stepNumber: int32, formSpec: Spec_FormSpec$1<FieldType>): FSharpList<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]> {
|
|
62
|
+
return defaultArg(map<Spec_FormStep$1<FieldType>, FSharpList<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]>>((step_1: Spec_FormStep$1<FieldType>): FSharpList<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]> => map_1<Spec_FormField$1<FieldType>, [Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]>((field_1: Spec_FormField$1<FieldType>): [Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>] => ([step_1, field_1] as [Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]), filter<Spec_FormField$1<FieldType>>((field: Spec_FormField$1<FieldType>): boolean => (field.Label === label), step_1.Fields)), tryFind<Spec_FormStep$1<FieldType>>((step: Spec_FormStep$1<FieldType>): boolean => (step.StepOrder === stepNumber), formSpec.Steps)), empty<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]>());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Finds a form field by its label string across all steps in the form.
|
|
67
|
+
*/
|
|
68
|
+
export function Helpers_FieldFinders_findFormFieldInFormByLabelString<FieldType>(label: string, formSpec: Spec_FormSpec$1<FieldType>): FSharpList<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]> {
|
|
69
|
+
return collect<Spec_FormStep$1<FieldType>, [Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]>((step: Spec_FormStep$1<FieldType>): FSharpList<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]> => map_1<Spec_FormField$1<FieldType>, [Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]>((field_1: Spec_FormField$1<FieldType>): [Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>] => ([step, field_1] as [Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]), filter<Spec_FormField$1<FieldType>>((field: Spec_FormField$1<FieldType>): boolean => (field.Label === label), step.Fields)), formSpec.Steps);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Finds a unique form field by its label string in a specific step.
|
|
74
|
+
* Returns Ok with the field if exactly one is found, Error otherwise.
|
|
75
|
+
*/
|
|
76
|
+
export function Helpers_FieldFinders_findUniqueFormFieldInStepByLabelString<FieldType>(label: string, stepNumber: int32, formSpec: Spec_FormSpec$1<FieldType>): FSharpResult$2_$union<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string> {
|
|
77
|
+
const fields: FSharpList<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]> = Helpers_FieldFinders_findFormFieldInStepByLabelString<FieldType>(label, stepNumber, formSpec);
|
|
78
|
+
if (!isEmpty(fields)) {
|
|
79
|
+
if (isEmpty(tail(fields))) {
|
|
80
|
+
return FSharpResult$2_Ok<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string>(head(fields));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
return FSharpResult$2_Error<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string>(`Multiple fields found with label '${label}' in step ${stepNumber}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
return FSharpResult$2_Error<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string>(`No field found with label '${label}' in step ${stepNumber}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Finds a unique form field by its label string across all steps in the form.
|
|
93
|
+
* Returns Ok with the field if exactly one is found, Error otherwise.
|
|
94
|
+
*/
|
|
95
|
+
export function Helpers_FieldFinders_findUniqueFormFieldInFormByLabelString<FieldType>(label: string, formSpec: Spec_FormSpec$1<FieldType>): FSharpResult$2_$union<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string> {
|
|
96
|
+
const fields: FSharpList<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>]> = Helpers_FieldFinders_findFormFieldInFormByLabelString<FieldType>(label, formSpec);
|
|
97
|
+
if (!isEmpty(fields)) {
|
|
98
|
+
if (isEmpty(tail(fields))) {
|
|
99
|
+
return FSharpResult$2_Ok<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string>(head(fields));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
return FSharpResult$2_Error<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string>(`Multiple fields found with label '${label}' across all steps`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return FSharpResult$2_Error<[Spec_FormStep$1<FieldType>, Spec_FormField$1<FieldType>], string>(`No field found with label '${label}' in any step`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Finds a form field by its FieldKey across all steps in a FormSpec.
|
|
112
|
+
*/
|
|
113
|
+
export function Helpers_FieldFinders_tryFindFieldByKey<UserField>(fieldKey: Shared_FieldKey, formSpec: Spec_FormSpec$1<UserField>): Option<Spec_FormField$1<UserField>> {
|
|
114
|
+
return tryFind<Spec_FormField$1<UserField>>((field: Spec_FormField$1<UserField>): boolean => equals(field.FieldKey, fieldKey), collect<Spec_FormStep$1<UserField>, Spec_FormField$1<UserField>>((step: Spec_FormStep$1<UserField>): FSharpList<Spec_FormField$1<UserField>> => step.Fields, formSpec.Steps));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Finds a form step by its step number.
|
|
119
|
+
*/
|
|
120
|
+
export function Helpers_FieldFinders_tryFindFormStepByStepNumber<UserField>(stepNumber: int32, formSpec: Spec_FormSpec$1<UserField>): Option<Spec_FormStep$1<UserField>> {
|
|
121
|
+
return tryFind<Spec_FormStep$1<UserField>>((step: Spec_FormStep$1<UserField>): boolean => (step.StepOrder === stepNumber), formSpec.Steps);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Finds a form field by its field order number within a specific step.
|
|
126
|
+
*/
|
|
127
|
+
export function Helpers_FieldFinders_tryFindFieldInSpec<UserField>(fieldNumber: int32, stepNumber: int32, formSpec: Spec_FormSpec$1<UserField>): Option<Spec_FormField$1<UserField>> {
|
|
128
|
+
const stepOpt: Option<Spec_FormStep$1<UserField>> = tryFind<Spec_FormStep$1<UserField>>((step: Spec_FormStep$1<UserField>): boolean => (step.StepOrder === stepNumber), formSpec.Steps);
|
|
129
|
+
if (stepOpt != null) {
|
|
130
|
+
const fieldOpt: Option<Spec_FormField$1<UserField>> = tryFind<Spec_FormField$1<UserField>>((field: Spec_FormField$1<UserField>): boolean => (field.FieldOrder === fieldNumber), value_1(stepOpt).Fields);
|
|
131
|
+
if (fieldOpt != null) {
|
|
132
|
+
return value_1(fieldOpt);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Gets all unique field labels from a FormSpec.
|
|
145
|
+
*/
|
|
146
|
+
export function Helpers_FieldFinders_getAllFieldNames<UserField>(formSpec: Spec_FormSpec$1<UserField>): FSharpList<string> {
|
|
147
|
+
return List_distinct<string>(map_1<Spec_FormField$1<UserField>, string>((field: Spec_FormField$1<UserField>): string => field.Label, collect<Spec_FormStep$1<UserField>, Spec_FormField$1<UserField>>((step: Spec_FormStep$1<UserField>): FSharpList<Spec_FormField$1<UserField>> => step.Fields, formSpec.Steps)), {
|
|
148
|
+
Equals: (x: string, y: string): boolean => (x === y),
|
|
149
|
+
GetHashCode: stringHash,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Gets all step names/identifiers from a FormSpec.
|
|
155
|
+
*/
|
|
156
|
+
export function Helpers_FieldFinders_getAllStepNames<UserField>(formSpec: Spec_FormSpec$1<UserField>): FSharpList<string> {
|
|
157
|
+
return map_1<Spec_FormStep$1<UserField>, string>((step: Spec_FormStep$1<UserField>): string => (`Step ${step.StepOrder}`), formSpec.Steps);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Converts a FieldType discriminated union to its string representation.
|
|
162
|
+
*/
|
|
163
|
+
export function Helpers_FieldTypeUtils_getFieldTypeName(fieldType: any): string {
|
|
164
|
+
if (fieldType instanceof Spec_FieldType) {
|
|
165
|
+
const ft = fieldType as Spec_FieldType_$union;
|
|
166
|
+
switch (ft.tag) {
|
|
167
|
+
case /* TextArea */ 1:
|
|
168
|
+
return "TextArea";
|
|
169
|
+
case /* Email */ 2:
|
|
170
|
+
return "Email";
|
|
171
|
+
case /* Password */ 3:
|
|
172
|
+
return "Password";
|
|
173
|
+
case /* Search */ 4:
|
|
174
|
+
return "Search";
|
|
175
|
+
case /* Color */ 5:
|
|
176
|
+
return "Color";
|
|
177
|
+
case /* Number */ 6:
|
|
178
|
+
return "Number";
|
|
179
|
+
case /* Tel */ 7:
|
|
180
|
+
return "Tel";
|
|
181
|
+
case /* Date */ 8:
|
|
182
|
+
return "Date";
|
|
183
|
+
case /* DateTimeLocal */ 9:
|
|
184
|
+
return "DateTimeLocal";
|
|
185
|
+
case /* Time */ 10:
|
|
186
|
+
return "Time";
|
|
187
|
+
case /* Checkbox */ 11:
|
|
188
|
+
return "Checkbox";
|
|
189
|
+
case /* Radio */ 12:
|
|
190
|
+
return "Radio";
|
|
191
|
+
case /* SingleChoice */ 13:
|
|
192
|
+
return "SingleChoice";
|
|
193
|
+
case /* Dropdown */ 14:
|
|
194
|
+
return "Dropdown";
|
|
195
|
+
case /* MultiChoice */ 15:
|
|
196
|
+
return "MultiChoice";
|
|
197
|
+
case /* CheckboxList */ 16:
|
|
198
|
+
return "CheckboxList";
|
|
199
|
+
case /* TagList */ 17:
|
|
200
|
+
return "TagList";
|
|
201
|
+
case /* TextAutoComplete */ 18:
|
|
202
|
+
return "TextAutoComplete";
|
|
203
|
+
case /* Matrix */ 19:
|
|
204
|
+
return "Matrix";
|
|
205
|
+
case /* Signature */ 20:
|
|
206
|
+
return "Signature";
|
|
207
|
+
case /* Message */ 21:
|
|
208
|
+
return "Message";
|
|
209
|
+
case /* PluginField */ 22:
|
|
210
|
+
return `PluginField(${ft.fields[0].PluginId})`;
|
|
211
|
+
default:
|
|
212
|
+
return "Text";
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
return "Unknown";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Checks if two FieldType values match by discriminated union case name.
|
|
222
|
+
* This allows matching field types with different data content (e.g., Message fields with different Heading/Message).
|
|
223
|
+
*/
|
|
224
|
+
export function Helpers_FieldTypeUtils_fieldTypesMatchByCaseName(fieldType1: any, fieldType2: any): boolean {
|
|
225
|
+
let matchResult: int32, ft1: Spec_FieldType_$union, ft2: Spec_FieldType_$union;
|
|
226
|
+
if (fieldType1 instanceof Spec_FieldType) {
|
|
227
|
+
if (fieldType2 instanceof Spec_FieldType) {
|
|
228
|
+
matchResult = 0;
|
|
229
|
+
ft1 = (fieldType1 as Spec_FieldType_$union);
|
|
230
|
+
ft2 = (fieldType2 as Spec_FieldType_$union);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
matchResult = 1;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
matchResult = 1;
|
|
238
|
+
}
|
|
239
|
+
switch (matchResult) {
|
|
240
|
+
case 0: {
|
|
241
|
+
let matchResult_1: int32;
|
|
242
|
+
switch (ft1!.tag) {
|
|
243
|
+
case /* Message */ 21: {
|
|
244
|
+
if (ft2!.tag === /* Message */ 21) {
|
|
245
|
+
matchResult_1 = 0;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
matchResult_1 = 10;
|
|
249
|
+
}
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case /* Matrix */ 19: {
|
|
253
|
+
if (ft2!.tag === /* Matrix */ 19) {
|
|
254
|
+
matchResult_1 = 1;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
matchResult_1 = 10;
|
|
258
|
+
}
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case /* SingleChoice */ 13: {
|
|
262
|
+
if (ft2!.tag === /* SingleChoice */ 13) {
|
|
263
|
+
matchResult_1 = 2;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
matchResult_1 = 10;
|
|
267
|
+
}
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
case /* MultiChoice */ 15: {
|
|
271
|
+
if (ft2!.tag === /* MultiChoice */ 15) {
|
|
272
|
+
matchResult_1 = 3;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
matchResult_1 = 10;
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
case /* Radio */ 12: {
|
|
280
|
+
if (ft2!.tag === /* Radio */ 12) {
|
|
281
|
+
matchResult_1 = 4;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
matchResult_1 = 10;
|
|
285
|
+
}
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
case /* Dropdown */ 14: {
|
|
289
|
+
if (ft2!.tag === /* Dropdown */ 14) {
|
|
290
|
+
matchResult_1 = 5;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
matchResult_1 = 10;
|
|
294
|
+
}
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
case /* Checkbox */ 11: {
|
|
298
|
+
if (ft2!.tag === /* Checkbox */ 11) {
|
|
299
|
+
matchResult_1 = 6;
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
matchResult_1 = 10;
|
|
303
|
+
}
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
case /* CheckboxList */ 16: {
|
|
307
|
+
if (ft2!.tag === /* CheckboxList */ 16) {
|
|
308
|
+
matchResult_1 = 7;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
matchResult_1 = 10;
|
|
312
|
+
}
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
case /* TagList */ 17: {
|
|
316
|
+
if (ft2!.tag === /* TagList */ 17) {
|
|
317
|
+
matchResult_1 = 8;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
matchResult_1 = 10;
|
|
321
|
+
}
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case /* TextAutoComplete */ 18: {
|
|
325
|
+
if (ft2!.tag === /* TextAutoComplete */ 18) {
|
|
326
|
+
matchResult_1 = 9;
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
matchResult_1 = 10;
|
|
330
|
+
}
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
default:
|
|
334
|
+
matchResult_1 = 10;
|
|
335
|
+
}
|
|
336
|
+
switch (matchResult_1) {
|
|
337
|
+
case 0:
|
|
338
|
+
return true;
|
|
339
|
+
case 1:
|
|
340
|
+
return true;
|
|
341
|
+
case 2:
|
|
342
|
+
return true;
|
|
343
|
+
case 3:
|
|
344
|
+
return true;
|
|
345
|
+
case 4:
|
|
346
|
+
return true;
|
|
347
|
+
case 5:
|
|
348
|
+
return true;
|
|
349
|
+
case 6:
|
|
350
|
+
return true;
|
|
351
|
+
case 7:
|
|
352
|
+
return true;
|
|
353
|
+
case 8:
|
|
354
|
+
return true;
|
|
355
|
+
case 9:
|
|
356
|
+
return true;
|
|
357
|
+
default:
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
default:
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Updates a form field within a specific step in a FormSpec.
|
|
368
|
+
*/
|
|
369
|
+
export function Helpers_FormSpecMutators_updateFormFieldInFormSpecStep<UserField>(inField: Spec_FormField$1<UserField>, formStep: Spec_FormStep$1<UserField>, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
370
|
+
const outStep: Spec_FormStep$1<UserField> = new Spec_FormStep$1(formStep.StepOrder, formStep.StepLabel, map_1<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((f: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => {
|
|
371
|
+
if (equals(f.FieldKey, inField.FieldKey)) {
|
|
372
|
+
return inField;
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
return f;
|
|
376
|
+
}
|
|
377
|
+
}, formStep.Fields));
|
|
378
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
379
|
+
if (s.StepOrder === formStep.StepOrder) {
|
|
380
|
+
return outStep;
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
return s;
|
|
384
|
+
}
|
|
385
|
+
}, formSpec.Steps), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Updates a form step within a FormSpec.
|
|
390
|
+
*/
|
|
391
|
+
export function Helpers_FormSpecMutators_updateFormStepInFormSpec<UserField>(formStep: Spec_FormStep$1<UserField>, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
392
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
393
|
+
if (s.StepOrder === formStep.StepOrder) {
|
|
394
|
+
return formStep;
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
return s;
|
|
398
|
+
}
|
|
399
|
+
}, formSpec.Steps), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Adds a form field to a specific step in a FormSpec.
|
|
404
|
+
*/
|
|
405
|
+
export function Helpers_FormSpecMutators_addFormFieldToStep<UserField>(formStep: Spec_FormStep$1<UserField>, formSpec: Spec_FormSpec$1<UserField>, formField: Spec_FormField$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
406
|
+
const outStep: Spec_FormStep$1<UserField> = new Spec_FormStep$1(formStep.StepOrder, formStep.StepLabel, append(formStep.Fields, singleton(formField)));
|
|
407
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
408
|
+
if (s.StepOrder === formStep.StepOrder) {
|
|
409
|
+
return outStep;
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
return s;
|
|
413
|
+
}
|
|
414
|
+
}, formSpec.Steps), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Removes a form field from a specific step in a FormSpec.
|
|
419
|
+
*/
|
|
420
|
+
export function Helpers_FormSpecMutators_removeFormFieldFromFormSpec<UserField>(formStepOrder: int32, formField: Spec_FormField$1<UserField>, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
421
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
422
|
+
if (s.StepOrder === formStepOrder) {
|
|
423
|
+
return new Spec_FormStep$1(s.StepOrder, s.StepLabel, mapIndexed<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((i: int32, f_1: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => (new Spec_FormField$1(i + 1, f_1.FieldKey, f_1.Label, f_1.Notes, f_1.DependsOn, f_1.IsOptional, f_1.IsDeprecated, f_1.FieldType)), filter<Spec_FormField$1<UserField>>((f: Spec_FormField$1<UserField>): boolean => (f.FieldOrder !== formField.FieldOrder), s.Fields)));
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
return s;
|
|
427
|
+
}
|
|
428
|
+
}, formSpec.Steps), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Inserts a form field at a specific position within a step.
|
|
433
|
+
*/
|
|
434
|
+
export function Helpers_FormSpecMutators_insertFormFieldToStepAt<UserField>(formStep: Spec_FormStep$1<UserField>, newPositionFieldOrder: int32, fieldKey: Shared_FieldKey): FSharpList<Spec_FormField$1<UserField>> {
|
|
435
|
+
return mapIndexed<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((index_1: int32, f_1: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => (new Spec_FormField$1(index_1 + 1, f_1.FieldKey, f_1.Label, f_1.Notes, f_1.DependsOn, f_1.IsOptional, f_1.IsDeprecated, f_1.FieldType)), insertAt<Spec_FormField$1<UserField>>(newPositionFieldOrder - 1, find<Spec_FormField$1<UserField>>((f: Spec_FormField$1<UserField>): boolean => equals(f.FieldKey, fieldKey), formStep.Fields), formStep.Fields));
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Moves a form field up in order within a step.
|
|
440
|
+
*/
|
|
441
|
+
export function Helpers_FormSpecMutators_moveFormFieldUpInFormSpec<UserField>(formStepOrder: int32, formField: Spec_FormField$1<UserField>, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
442
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
443
|
+
if (s.StepOrder === formStepOrder) {
|
|
444
|
+
return new Spec_FormStep$1(s.StepOrder, s.StepLabel, mapIndexed<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((index: int32, f_2: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => (new Spec_FormField$1(index + 1, f_2.FieldKey, f_2.Label, f_2.Notes, f_2.DependsOn, f_2.IsOptional, f_2.IsDeprecated, f_2.FieldType)), sortBy<Spec_FormField$1<UserField>, int32>((f_1: Spec_FormField$1<UserField>): int32 => f_1.FieldOrder, map_1<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((f: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => {
|
|
445
|
+
if (f.FieldOrder === formField.FieldOrder) {
|
|
446
|
+
return new Spec_FormField$1(formField.FieldOrder - 1, f.FieldKey, f.Label, f.Notes, f.DependsOn, f.IsOptional, f.IsDeprecated, f.FieldType);
|
|
447
|
+
}
|
|
448
|
+
else if (f.FieldOrder === (formField.FieldOrder - 1)) {
|
|
449
|
+
return new Spec_FormField$1(formField.FieldOrder, f.FieldKey, f.Label, f.Notes, f.DependsOn, f.IsOptional, f.IsDeprecated, f.FieldType);
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
return f;
|
|
453
|
+
}
|
|
454
|
+
}, s.Fields), {
|
|
455
|
+
Compare: comparePrimitives,
|
|
456
|
+
})));
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
return s;
|
|
460
|
+
}
|
|
461
|
+
}, formSpec.Steps), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Moves a form field down in order within a step.
|
|
466
|
+
*/
|
|
467
|
+
export function Helpers_FormSpecMutators_moveFormFieldDownInFormSpec<UserField>(formStepOrder: int32, formField: Spec_FormField$1<UserField>, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
468
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
469
|
+
if (s.StepOrder === formStepOrder) {
|
|
470
|
+
return new Spec_FormStep$1(s.StepOrder, s.StepLabel, mapIndexed<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((index: int32, f_2: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => (new Spec_FormField$1(index + 1, f_2.FieldKey, f_2.Label, f_2.Notes, f_2.DependsOn, f_2.IsOptional, f_2.IsDeprecated, f_2.FieldType)), sortBy<Spec_FormField$1<UserField>, int32>((f_1: Spec_FormField$1<UserField>): int32 => f_1.FieldOrder, map_1<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((f: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => {
|
|
471
|
+
if (f.FieldOrder === formField.FieldOrder) {
|
|
472
|
+
return new Spec_FormField$1(formField.FieldOrder + 1, f.FieldKey, f.Label, f.Notes, f.DependsOn, f.IsOptional, f.IsDeprecated, f.FieldType);
|
|
473
|
+
}
|
|
474
|
+
else if (f.FieldOrder === (formField.FieldOrder + 1)) {
|
|
475
|
+
return new Spec_FormField$1(formField.FieldOrder, f.FieldKey, f.Label, f.Notes, f.DependsOn, f.IsOptional, f.IsDeprecated, f.FieldType);
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
return f;
|
|
479
|
+
}
|
|
480
|
+
}, s.Fields), {
|
|
481
|
+
Compare: comparePrimitives,
|
|
482
|
+
})));
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
return s;
|
|
486
|
+
}
|
|
487
|
+
}, formSpec.Steps), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Moves a form field to a specific position within a step by its FieldKey.
|
|
492
|
+
*/
|
|
493
|
+
export function Helpers_FormSpecMutators_moveFieldByKeyToPositionInFormStepSpec<UserField>(fieldKey: Shared_FieldKey, newPositionFieldOrder: int32, formStepOrder: int32, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
494
|
+
const formStep: Option<Spec_FormStep$1<UserField>> = Helpers_FieldFinders_tryFindFormStepByStepNumber<UserField>(formStepOrder, formSpec);
|
|
495
|
+
if (formStep != null) {
|
|
496
|
+
const formStep_1: Spec_FormStep$1<UserField> = value_1(formStep);
|
|
497
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
498
|
+
if (s.StepOrder === formStep_1.StepOrder) {
|
|
499
|
+
return new Spec_FormStep$1(s.StepOrder, s.StepLabel, mapIndexed<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((index_1: int32, f_1: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => (new Spec_FormField$1(index_1 + 1, f_1.FieldKey, f_1.Label, f_1.Notes, f_1.DependsOn, f_1.IsOptional, f_1.IsDeprecated, f_1.FieldType)), List_distinct<Spec_FormField$1<UserField>>(insertAt<Spec_FormField$1<UserField>>(newPositionFieldOrder - 1, find<Spec_FormField$1<UserField>>((f: Spec_FormField$1<UserField>): boolean => equals(f.FieldKey, fieldKey), s.Fields), s.Fields), {
|
|
500
|
+
Equals: equals,
|
|
501
|
+
GetHashCode: safeHash,
|
|
502
|
+
})));
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
return s;
|
|
506
|
+
}
|
|
507
|
+
}, formSpec.Steps), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
return formSpec;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Moves a form step up in order.
|
|
516
|
+
*/
|
|
517
|
+
export function Helpers_FormSpecMutators_moveFormStepUpInFormSpec<UserField>(formStepOrder: int32, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
518
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, mapIndexed<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((i: int32, s_1: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => (new Spec_FormStep$1(i + 1, s_1.StepLabel, s_1.Fields)), sortBy<Spec_FormStep$1<UserField>, int32>((s: Spec_FormStep$1<UserField>): int32 => s.StepOrder, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((innerStep: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
519
|
+
if (innerStep.StepOrder === (formStepOrder - 1)) {
|
|
520
|
+
return new Spec_FormStep$1(formStepOrder + 1, innerStep.StepLabel, innerStep.Fields);
|
|
521
|
+
}
|
|
522
|
+
else if (innerStep.StepOrder === formStepOrder) {
|
|
523
|
+
return new Spec_FormStep$1(formStepOrder - 1, innerStep.StepLabel, innerStep.Fields);
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
return innerStep;
|
|
527
|
+
}
|
|
528
|
+
}, formSpec.Steps), {
|
|
529
|
+
Compare: comparePrimitives,
|
|
530
|
+
})), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Moves a form step down in order.
|
|
535
|
+
*/
|
|
536
|
+
export function Helpers_FormSpecMutators_moveFormStepDownInFormSpec<UserField>(formStepOrder: int32, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
537
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, mapIndexed<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((i: int32, s_1: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => (new Spec_FormStep$1(i + 1, s_1.StepLabel, s_1.Fields)), sortBy<Spec_FormStep$1<UserField>, int32>((s: Spec_FormStep$1<UserField>): int32 => s.StepOrder, map_1<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((innerStep: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => {
|
|
538
|
+
if (innerStep.StepOrder === (formStepOrder + 1)) {
|
|
539
|
+
return new Spec_FormStep$1(formStepOrder - 1, innerStep.StepLabel, innerStep.Fields);
|
|
540
|
+
}
|
|
541
|
+
else if (innerStep.StepOrder === formStepOrder) {
|
|
542
|
+
return new Spec_FormStep$1(formStepOrder + 1, innerStep.StepLabel, innerStep.Fields);
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
return innerStep;
|
|
546
|
+
}
|
|
547
|
+
}, formSpec.Steps), {
|
|
548
|
+
Compare: comparePrimitives,
|
|
549
|
+
})), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Removes a form step from a FormSpec.
|
|
554
|
+
*/
|
|
555
|
+
export function Helpers_FormSpecMutators_removeFormStepFromFormSpec<UserField>(formStepOrder: int32, formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
556
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, mapIndexed<Spec_FormStep$1<UserField>, Spec_FormStep$1<UserField>>((i: int32, s_1: Spec_FormStep$1<UserField>): Spec_FormStep$1<UserField> => (new Spec_FormStep$1(i + 1, s_1.StepLabel, s_1.Fields)), filter<Spec_FormStep$1<UserField>>((s: Spec_FormStep$1<UserField>): boolean => (s.StepOrder !== formStepOrder), formSpec.Steps)), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Flattens a multi-step FormSpec into a single step with all fields.
|
|
561
|
+
* Field orders are adjusted to be unique across all steps.
|
|
562
|
+
*/
|
|
563
|
+
export function Helpers_FormSpecTransformers_flattenSpecSteps<UserField>(formSpec: Spec_FormSpec$1<UserField>): Spec_FormSpec$1<UserField> {
|
|
564
|
+
const flatten = (steps_mut: FSharpList<Spec_FormStep$1<UserField>>, acc_mut: FSharpList<Spec_FormField$1<UserField>>): FSharpList<Spec_FormField$1<UserField>> => {
|
|
565
|
+
flatten:
|
|
566
|
+
while (true) {
|
|
567
|
+
const steps: FSharpList<Spec_FormStep$1<UserField>> = steps_mut, acc: FSharpList<Spec_FormField$1<UserField>> = acc_mut;
|
|
568
|
+
if (!isEmpty(steps)) {
|
|
569
|
+
const step: Spec_FormStep$1<UserField> = head(steps);
|
|
570
|
+
steps_mut = tail(steps);
|
|
571
|
+
acc_mut = append(acc, map_1<Spec_FormField$1<UserField>, Spec_FormField$1<UserField>>((field: Spec_FormField$1<UserField>): Spec_FormField$1<UserField> => (new Spec_FormField$1((step.StepOrder * 1000) + field.FieldOrder, field.FieldKey, field.Label, field.Notes, field.DependsOn, field.IsOptional, field.IsDeprecated, field.FieldType)), step.Fields));
|
|
572
|
+
continue flatten;
|
|
573
|
+
}
|
|
574
|
+
else {
|
|
575
|
+
return acc;
|
|
576
|
+
}
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
};
|
|
580
|
+
return new Spec_FormSpec$1(formSpec.Id, formSpec.Code, formSpec.Title, formSpec.Abstract, formSpec.Version, formSpec.FormSpecVersion, singleton(new Spec_FormStep$1(1, "Complete Form", flatten(formSpec.Steps, empty<Spec_FormField$1<UserField>>()))), formSpec.CategoryTags, formSpec.Score, formSpec.AssociatedCodes, formSpec.RequiresReview, formSpec.RequiresReviewAndApproval, formSpec.ClinicalPathway);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* Validates that all steps in a FormSpec have at least one field.
|
|
585
|
+
*/
|
|
586
|
+
export function Helpers_FormSpecValidators_allStepsHaveFields<UserField>(formSpec: Spec_FormSpec$1<UserField>): boolean {
|
|
587
|
+
return forAll<Spec_FormStep$1<UserField>>((step: Spec_FormStep$1<UserField>): boolean => !isEmpty(step.Fields), formSpec.Steps);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Checks if a FormSpec has a ClinicalPathway configured.
|
|
592
|
+
*/
|
|
593
|
+
export function Helpers_FormSpecValidators_hasClinicalPathway<UserField>(formSpec: Spec_FormSpec$1<UserField>): boolean {
|
|
594
|
+
return formSpec.ClinicalPathway != null;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
export function Helpers_specFieldOptionsToValueOptions(options: FSharpList<Shared_FieldOption>): FSharpList<Shared_FieldOption> {
|
|
598
|
+
return map_1<Shared_FieldOption, Shared_FieldOption>((o: Shared_FieldOption): Shared_FieldOption => (new Shared_FieldOption(o.Description, o.Value, o.OptionKey)), options);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
export function Helpers_optionsFromSpecField(field: Spec_FormField$1<Spec_FieldType_$union>): FSharpList<Shared_FieldOption> {
|
|
602
|
+
const matchValue: Spec_FieldType_$union = field.FieldType;
|
|
603
|
+
switch (matchValue.tag) {
|
|
604
|
+
case /* PluginField */ 22:
|
|
605
|
+
return empty<Shared_FieldOption>();
|
|
606
|
+
case /* CheckboxList */ 16:
|
|
607
|
+
return matchValue.fields[0].Options;
|
|
608
|
+
case /* MultiChoice */ 15:
|
|
609
|
+
return matchValue.fields[0].Options;
|
|
610
|
+
case /* TagList */ 17:
|
|
611
|
+
return matchValue.fields[0].Options;
|
|
612
|
+
case /* Dropdown */ 14:
|
|
613
|
+
return matchValue.fields[0].Options;
|
|
614
|
+
case /* Radio */ 12:
|
|
615
|
+
return matchValue.fields[0].Options;
|
|
616
|
+
case /* SingleChoice */ 13:
|
|
617
|
+
return matchValue.fields[0].Options;
|
|
618
|
+
case /* TextAutoComplete */ 18:
|
|
619
|
+
return matchValue.fields[0].Options;
|
|
620
|
+
case /* Matrix */ 19:
|
|
621
|
+
return matchValue.fields[0].Options;
|
|
622
|
+
default:
|
|
623
|
+
return empty<Shared_FieldOption>();
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
export function Helpers_readValue<FieldType>(field: Spec_FormField$1<FieldType>, values: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<FieldType>>): string {
|
|
628
|
+
const matchValue: Option<Shared_FieldKey> = tryFind_1<Shared_FieldKey>((k: Shared_FieldKey): boolean => equals(k, field.FieldKey), map_2<[Shared_FieldKey, Values_FieldDetails$1<FieldType>], Shared_FieldKey>((tuple: [Shared_FieldKey, Values_FieldDetails$1<FieldType>]): Shared_FieldKey => tuple[0], toSeq<Shared_FieldKey, Values_FieldDetails$1<FieldType>>(values)));
|
|
629
|
+
if (matchValue != null) {
|
|
630
|
+
const matchValue_1: Shared_FieldValue_$union = FSharpMap__get_Item(values, value_1(matchValue)).FieldValue;
|
|
631
|
+
if (matchValue_1.tag === /* Single */ 0) {
|
|
632
|
+
return matchValue_1.fields[0].Value;
|
|
633
|
+
}
|
|
634
|
+
else {
|
|
635
|
+
return "";
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
else {
|
|
639
|
+
return "";
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
export function Helpers_readManyValue<FieldType>(fieldKey: Shared_FieldKey, values: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<FieldType>>): FSharpSet<string> {
|
|
644
|
+
const matchValue: Option<Shared_FieldKey> = tryFind_1<Shared_FieldKey>((k: Shared_FieldKey): boolean => equals(k, fieldKey), map_2<[Shared_FieldKey, Values_FieldDetails$1<FieldType>], Shared_FieldKey>((tuple: [Shared_FieldKey, Values_FieldDetails$1<FieldType>]): Shared_FieldKey => tuple[0], toSeq<Shared_FieldKey, Values_FieldDetails$1<FieldType>>(values)));
|
|
645
|
+
if (matchValue != null) {
|
|
646
|
+
const matchValue_1: Shared_FieldValue_$union = FSharpMap__get_Item(values, value_1(matchValue)).FieldValue;
|
|
647
|
+
if (matchValue_1.tag === /* Multiple */ 1) {
|
|
648
|
+
return map_3<Shared_FieldAnswer, string>((v_1: Shared_FieldAnswer): string => v_1.Value, matchValue_1.fields[0], {
|
|
649
|
+
Compare: comparePrimitives,
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
else {
|
|
653
|
+
return empty_1<string>({
|
|
654
|
+
Compare: comparePrimitives,
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
return empty_1<string>({
|
|
660
|
+
Compare: comparePrimitives,
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
export function Helpers_updateSingleFunc(formatter: ((arg0: string) => string), specField: Spec_FormField$1<Spec_FieldType_$union>, newValue: string, values: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>): FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>> {
|
|
666
|
+
let Value: string, matchValue: Option<Shared_FieldOption>;
|
|
667
|
+
const fieldOptions: FSharpList<Shared_FieldOption> = Helpers_optionsFromSpecField(specField);
|
|
668
|
+
const newFieldDetails: Values_FieldDetails$1<Spec_FieldType_$union> = new Values_FieldDetails$1(specField.FieldOrder, specField.FieldKey, specField.Label, Shared_FieldValue_Single((Value = formatter(newValue), new Shared_FieldAnswer(specField.FieldKey, (matchValue = tryFind<Shared_FieldOption>((o: Shared_FieldOption): boolean => (o.Value === newValue), fieldOptions), (matchValue == null) ? newValue : value_1(matchValue).Description), Value))), specField.FieldType, Helpers_specFieldOptionsToValueOptions(fieldOptions));
|
|
669
|
+
const matchValue_1: Option<Shared_FieldKey> = tryFind_1<Shared_FieldKey>((k: Shared_FieldKey): boolean => equals(k, newFieldDetails.Key), map_2<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>], Shared_FieldKey>((tuple: [Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]): Shared_FieldKey => tuple[0], toSeq<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>(values)));
|
|
670
|
+
if (matchValue_1 != null) {
|
|
671
|
+
const key: Shared_FieldKey = value_1(matchValue_1);
|
|
672
|
+
const f: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>> = FSharpMap__Remove(values, key);
|
|
673
|
+
return FSharpMap__Add(values, key, newFieldDetails);
|
|
674
|
+
}
|
|
675
|
+
else {
|
|
676
|
+
return FSharpMap__Add(values, newFieldDetails.Key, newFieldDetails);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
export function Helpers_updateManyFunc(formatter: ((arg0: string) => string), specField: Spec_FormField$1<Spec_FieldType_$union>, newValue: FSharpSet<string>, values: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>): FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>> {
|
|
681
|
+
const newFieldDetails: Values_FieldDetails$1<Spec_FieldType_$union> = new Values_FieldDetails$1(specField.FieldOrder, specField.FieldKey, specField.Label, Shared_FieldValue_Multiple(map_3<string, Shared_FieldAnswer>((v: string): Shared_FieldAnswer => {
|
|
682
|
+
let matchValue: Option<Shared_FieldOption>;
|
|
683
|
+
const Value: string = formatter(v);
|
|
684
|
+
return new Shared_FieldAnswer(specField.FieldKey, (matchValue = tryFind<Shared_FieldOption>((o: Shared_FieldOption): boolean => (o.Value === v), Helpers_optionsFromSpecField(specField)), (matchValue == null) ? v : value_1(matchValue).Description), Value);
|
|
685
|
+
}, newValue, {
|
|
686
|
+
Compare: compare,
|
|
687
|
+
})), specField.FieldType, Helpers_specFieldOptionsToValueOptions(Helpers_optionsFromSpecField(specField)));
|
|
688
|
+
const matchValue_1: Option<Shared_FieldKey> = tryFind_1<Shared_FieldKey>((k: Shared_FieldKey): boolean => equals(k, newFieldDetails.Key), map_2<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>], Shared_FieldKey>((tuple: [Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]): Shared_FieldKey => tuple[0], toSeq<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>(values)));
|
|
689
|
+
if (matchValue_1 != null) {
|
|
690
|
+
const key: Shared_FieldKey = value_1(matchValue_1);
|
|
691
|
+
return FSharpMap__Add(FSharpMap__Remove(values, newFieldDetails.Key), newFieldDetails.Key, newFieldDetails);
|
|
692
|
+
}
|
|
693
|
+
else {
|
|
694
|
+
return FSharpMap__Add(values, newFieldDetails.Key, newFieldDetails);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* It adds OR updates a form field's value based on its type
|
|
700
|
+
* Returns the updated DynamicStepValues
|
|
701
|
+
*/
|
|
702
|
+
export function Helpers_updateFormFieldValue(field: Spec_FormField$1<Spec_FieldType_$union>, newValue: any, values: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>): FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>> {
|
|
703
|
+
const newFieldDetails: Values_FieldDetails$1<Spec_FieldType_$union> = new Values_FieldDetails$1(field.FieldOrder, field.FieldKey, field.Label, (() => {
|
|
704
|
+
throw new Error("updateFormFieldValue: Field type handling not implemented.");
|
|
705
|
+
})(), field.FieldType, Helpers_specFieldOptionsToValueOptions(Helpers_optionsFromSpecField(field)));
|
|
706
|
+
const matchValue_1: Option<Shared_FieldKey> = tryFind_1<Shared_FieldKey>((k: Shared_FieldKey): boolean => equals(k, newFieldDetails.Key), map_2<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>], Shared_FieldKey>((tuple: [Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]): Shared_FieldKey => tuple[0], toSeq<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>(values)));
|
|
707
|
+
if (matchValue_1 != null) {
|
|
708
|
+
const key: Shared_FieldKey = value_1(matchValue_1);
|
|
709
|
+
return FSharpMap__Add(FSharpMap__Remove(values, key), key, newFieldDetails);
|
|
710
|
+
}
|
|
711
|
+
else {
|
|
712
|
+
return FSharpMap__Add(values, newFieldDetails.Key, newFieldDetails);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
/**
|
|
717
|
+
* Updates a form's values with a new field value
|
|
718
|
+
* Returns the updated form
|
|
719
|
+
*/
|
|
720
|
+
export function Helpers_updateFormValuesWithField<T>(fieldKeyAndValue_: Shared_FieldKey, fieldKeyAndValue__1: Values_FieldDetails$1<Spec_FieldType_$union>, form: T, getSteps: ((arg0: T) => FSharpMap<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>), setSteps: ((arg0: FSharpMap<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>, arg1: T) => T)): T {
|
|
721
|
+
let patternInput: [FSharpList<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]>, FSharpList<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]>];
|
|
722
|
+
const fieldKeyAndValue = [fieldKeyAndValue_, fieldKeyAndValue__1] as [Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>];
|
|
723
|
+
let stepOrderResult: FSharpResult$2_$union<Values_StepOrder, string>;
|
|
724
|
+
const filteredFormSteps: FSharpMap<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>> = filter_1<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>((_arg: Values_StepOrder, fieldValues: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>): boolean => FSharpMap__ContainsKey(fieldValues, fieldKeyAndValue[0]), getSteps(form));
|
|
725
|
+
stepOrderResult = (FSharpMap__get_IsEmpty(filteredFormSteps) ? FSharpResult$2_Error<Values_StepOrder, string>("No fields found") : ((FSharpMap__get_Count(filteredFormSteps) > 1) ? FSharpResult$2_Error<Values_StepOrder, string>("More than one field found") : FSharpResult$2_Ok<Values_StepOrder, string>(head<[Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>]>(toList<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>(filteredFormSteps))[0])));
|
|
726
|
+
if (stepOrderResult.tag === /* Ok */ 0) {
|
|
727
|
+
const stepOrd: Values_StepOrder = stepOrderResult.fields[0];
|
|
728
|
+
const foundStepValues: FSharpList<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]> = toList<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>(FSharpMap__get_Item(getSteps(form), stepOrd));
|
|
729
|
+
const foundField: Option<int32> = tryFindIndex<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]>((tupledArg_1: [Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]): boolean => equals(tupledArg_1[0], fieldKeyAndValue[0]), foundStepValues);
|
|
730
|
+
const dynamicStepValues: FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>> = ofList<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>(append<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]>(singleton(fieldKeyAndValue), (foundField == null) ? foundStepValues : ((patternInput = splitAt<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]>(value_1(foundField), foundStepValues), append(patternInput[0], tail<[Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>]>(patternInput[1]))))), {
|
|
731
|
+
Compare: compare,
|
|
732
|
+
});
|
|
733
|
+
return setSteps(FSharpMap__Change(getSteps(form), stepOrd, (_arg_3: Option<FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>): Option<FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>> => dynamicStepValues), form);
|
|
734
|
+
}
|
|
735
|
+
else {
|
|
736
|
+
toConsole(`ERROR updating value: ${stepOrderResult.fields[0]}`);
|
|
737
|
+
return form;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
* Finds and updates a form field's value by its label string in a specific step
|
|
743
|
+
* Returns Ok with the updated form if successful, Error otherwise
|
|
744
|
+
*/
|
|
745
|
+
export function Helpers_findAndUpdateFormField<T>(label: string, stepNumber: int32, newValue: any, formSpec: Spec_FormSpec$1<Spec_FieldType_$union>, form: T, getSteps: ((arg0: T) => FSharpMap<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>), setSteps: ((arg0: FSharpMap<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>, arg1: T) => T)): FSharpResult$2_$union<T, string> {
|
|
746
|
+
return Result_Map<[Spec_FormStep$1<Spec_FieldType_$union>, Spec_FormField$1<Spec_FieldType_$union>], T, string>((tupledArg: [Spec_FormStep$1<Spec_FieldType_$union>, Spec_FormField$1<Spec_FieldType_$union>]): T => {
|
|
747
|
+
const field: Spec_FormField$1<Spec_FieldType_$union> = tupledArg[1];
|
|
748
|
+
const fieldKeyAndValue = [field.FieldKey, FSharpMap__get_Item(Helpers_updateFormFieldValue(field, newValue, FSharpMap__get_Item(getSteps(form), new Values_StepOrder(tupledArg[0].StepOrder))), field.FieldKey)] as [Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>];
|
|
749
|
+
return Helpers_updateFormValuesWithField<T>(fieldKeyAndValue[0], fieldKeyAndValue[1], form, getSteps, setSteps);
|
|
750
|
+
}, Helpers_FieldFinders_findUniqueFormFieldInStepByLabelString<Spec_FieldType_$union>(label, stepNumber, formSpec));
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* Finds and updates a form field's value by its label string across all steps
|
|
755
|
+
* Returns Ok with the updated form if successful, Error otherwise
|
|
756
|
+
*/
|
|
757
|
+
export function Helpers_findAndUpdateFormFieldInAnyStep<T>(label: string, newValue: any, formSpec: Spec_FormSpec$1<Spec_FieldType_$union>, form: T, getSteps: ((arg0: T) => FSharpMap<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>), setSteps: ((arg0: FSharpMap<Values_StepOrder, FSharpMap<Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>>>, arg1: T) => T)): FSharpResult$2_$union<T, string> {
|
|
758
|
+
return Result_Map<[Spec_FormStep$1<Spec_FieldType_$union>, Spec_FormField$1<Spec_FieldType_$union>], T, string>((tupledArg: [Spec_FormStep$1<Spec_FieldType_$union>, Spec_FormField$1<Spec_FieldType_$union>]): T => {
|
|
759
|
+
const field: Spec_FormField$1<Spec_FieldType_$union> = tupledArg[1];
|
|
760
|
+
const fieldKeyAndValue = [field.FieldKey, FSharpMap__get_Item(Helpers_updateFormFieldValue(field, newValue, FSharpMap__get_Item(getSteps(form), new Values_StepOrder(tupledArg[0].StepOrder))), field.FieldKey)] as [Shared_FieldKey, Values_FieldDetails$1<Spec_FieldType_$union>];
|
|
761
|
+
return Helpers_updateFormValuesWithField<T>(fieldKeyAndValue[0], fieldKeyAndValue[1], form, getSteps, setSteps);
|
|
762
|
+
}, Helpers_FieldFinders_findUniqueFormFieldInFormByLabelString<Spec_FieldType_$union>(label, formSpec));
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
//# sourceMappingURL=Helpers.ts.map
|