ballerina-core 1.0.228 → 1.0.230

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 (37) hide show
  1. package/package.json +1 -1
  2. package/src/forms/domains/dispatched-forms/deserializer/state.ts +292 -94
  3. package/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.ts +37 -32
  4. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/list/state.ts +1 -1
  5. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/lookup/state.ts +1 -1
  6. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/map/state.ts +1 -1
  7. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/multiSelection/state.ts +1 -1
  8. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/nestedDispatcher/state.ts +1 -1
  9. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/one/state.ts +1 -1
  10. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/primitive/state.ts +1 -1
  11. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/readOnly/state.ts +1 -1
  12. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/record/recordField/state.ts +1 -1
  13. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/record/state.ts +1 -1
  14. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/singleSelectionDispatcher/state.ts +1 -1
  15. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/sum/state.ts +1 -1
  16. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/table/state.ts +1 -1
  17. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/tupleDispatcher/state.ts +1 -1
  18. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/domains/unionDispatcher/state.ts +1 -1
  19. package/src/forms/domains/dispatched-forms/runner/domains/dispatcher/state.ts +1 -1
  20. package/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/_init.ts +279 -0
  21. package/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/_sync.ts +103 -0
  22. package/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/builder.ts +24 -0
  23. package/src/forms/domains/dispatched-forms/runner/domains/kind/create/coroutines/runner.ts +44 -0
  24. package/src/forms/domains/dispatched-forms/runner/domains/kind/create/state.ts +100 -0
  25. package/src/forms/domains/dispatched-forms/runner/domains/kind/create/template.tsx +116 -0
  26. package/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/_init.ts +272 -0
  27. package/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/_sync.ts +101 -0
  28. package/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/builder.ts +24 -0
  29. package/src/forms/domains/dispatched-forms/runner/domains/kind/edit/coroutines/runner.ts +43 -0
  30. package/src/forms/domains/dispatched-forms/runner/domains/kind/edit/state.ts +96 -0
  31. package/src/forms/domains/dispatched-forms/runner/domains/kind/edit/template.tsx +115 -0
  32. package/src/forms/domains/dispatched-forms/runner/{coroutines → domains/kind/passthrough/coroutines}/runner.ts +49 -45
  33. package/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/state.ts +45 -0
  34. package/src/forms/domains/dispatched-forms/runner/domains/kind/passthrough/template.tsx +118 -0
  35. package/src/forms/domains/dispatched-forms/runner/state.ts +141 -11
  36. package/src/forms/domains/dispatched-forms/runner/template.tsx +102 -59
  37. package/src/value-infinite-data-stream/coroutines/infiniteLoader.ts +1 -1
@@ -18,7 +18,7 @@ import { TupleDispatcher } from "./domains/tupleDispatcher/state";
18
18
  import { UnionDispatcher } from "./domains/unionDispatcher/state";
19
19
  import { PrimitiveDispatcher } from "./domains/primitive/state";
20
20
  import { LookupRenderer } from "../../../deserializer/domains/specification/domains/forms/domains/renderer/domains/lookup/state";
21
- import { DispatcherContextWithApiSources } from "../../coroutines/runner";
21
+ import { DispatcherContextWithApiSources } from "../../state";
22
22
 
23
23
  export const Dispatcher = {
24
24
  Operations: {
@@ -0,0 +1,279 @@
1
+ import { List } from "immutable";
2
+ import {
3
+ replaceWith,
4
+ id,
5
+ Synchronize,
6
+ Unit,
7
+ HandleApiResponse,
8
+ Synchronized,
9
+ unit,
10
+ DispatchParsedCreateLauncher,
11
+ } from "../../../../../../../../../main";
12
+ import { ApiResponseChecker } from "../../../../../../../../api-response-handler/state";
13
+ import { AsyncState } from "../../../../../../../../async/state";
14
+ import { PredicateValue } from "../../../../../../parser/domains/predicates/state";
15
+ import {
16
+ DispatcherContextWithApiSources,
17
+ DispatchFormRunnerStatus,
18
+ } from "../../../../state";
19
+ import { DispatchInjectablesTypes } from "../../../abstract-renderers/injectables/state";
20
+ import { Co } from "../../../abstract-renderers/table/coroutines/builder";
21
+ import { Dispatcher } from "../../../dispatcher/state";
22
+ import {
23
+ DispatchCreateFormLauncherState,
24
+ DispatchCreateFormLauncherContext,
25
+ } from "../state";
26
+ import { CreateCoBuilder } from "./builder";
27
+
28
+ export const initCo = <
29
+ T extends DispatchInjectablesTypes<T>,
30
+ Flags,
31
+ CustomPresentationContexts,
32
+ ExtraContext,
33
+ >(
34
+ Co: ReturnType<
35
+ typeof CreateCoBuilder<T, Flags, CustomPresentationContexts, ExtraContext>
36
+ >,
37
+ ) => {
38
+ const setChecked = (checked: boolean) =>
39
+ Co.SetState(
40
+ DispatchCreateFormLauncherState<
41
+ T,
42
+ Flags
43
+ >().Updaters.Core.apiChecker.children.init(
44
+ checked
45
+ ? ApiResponseChecker.Updaters().toChecked()
46
+ : ApiResponseChecker.Updaters().toUnchecked(),
47
+ ),
48
+ );
49
+
50
+ const defaultValueCo = (
51
+ defaultApi: () => Promise<PredicateValue>,
52
+ createFormLauncher: DispatchParsedCreateLauncher<T>,
53
+ ) =>
54
+ Synchronize<Unit, PredicateValue>(
55
+ () =>
56
+ defaultApi().then((raw) => {
57
+ const result = createFormLauncher.fromApiParser(raw);
58
+ return result.kind == "errors"
59
+ ? Promise.reject(result.errors)
60
+ : Promise.resolve(result.value);
61
+ }),
62
+ (_) => "transient failure",
63
+ 5,
64
+ 50,
65
+ ).embed(
66
+ (_: DispatchCreateFormLauncherState<T, Flags>) => _.entity,
67
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.entity,
68
+ );
69
+
70
+ const configValueCo = (
71
+ getGlobalConfig: () => Promise<PredicateValue>,
72
+ createFormLauncher: DispatchParsedCreateLauncher<T>,
73
+ current: DispatchCreateFormLauncherContext<
74
+ T,
75
+ Flags,
76
+ CustomPresentationContexts,
77
+ ExtraContext
78
+ >,
79
+ ) =>
80
+ current.launcherRef.config.source == "api"
81
+ ? Synchronize<Unit, PredicateValue>(() =>
82
+ getGlobalConfig().then((raw) => {
83
+ const result =
84
+ createFormLauncher.parseGlobalConfigurationFromApi(raw);
85
+ return result.kind == "errors"
86
+ ? Promise.reject(result.errors)
87
+ : Promise.resolve(result.value);
88
+ }),
89
+ ).embed(
90
+ (_: DispatchCreateFormLauncherState<T, Flags>) => _.config,
91
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.config,
92
+ )
93
+ : Co.SetState(
94
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.config(
95
+ replaceWith(
96
+ current.launcherRef.config.value.kind == "l" &&
97
+ current.launcherRef.config.value.value.kind == "value"
98
+ ? Synchronized.Default(
99
+ unit,
100
+ AsyncState.Default.loaded(
101
+ current.launcherRef.config.value.value.value,
102
+ ),
103
+ )
104
+ : Synchronized.Default(unit),
105
+ ),
106
+ ),
107
+ );
108
+
109
+ const errorUpd = (errors: List<string>) =>
110
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.status(
111
+ replaceWith<DispatchFormRunnerStatus<T, Flags>>({
112
+ kind: "error",
113
+ errors,
114
+ }),
115
+ );
116
+
117
+ return Co.Seq([
118
+ Co.SetState(
119
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.status(
120
+ replaceWith<DispatchFormRunnerStatus<T, Flags>>({ kind: "loading" }),
121
+ ),
122
+ ),
123
+ setChecked(false),
124
+ Co.GetState().then((current) => {
125
+ if (
126
+ !AsyncState.Operations.hasValue(current.deserializedSpecification.sync)
127
+ ) {
128
+ return Co.SetState(id);
129
+ }
130
+
131
+ if (current.deserializedSpecification.sync.value.kind == "errors") {
132
+ return Co.SetState(
133
+ errorUpd(current.deserializedSpecification.sync.value.errors),
134
+ );
135
+ }
136
+
137
+ const dispatcherContext =
138
+ current.deserializedSpecification.sync.value.value.dispatcherContext;
139
+
140
+ const createFormLauncher =
141
+ current.deserializedSpecification.sync.value.value.launchers.create.get(
142
+ current.launcherRef.name,
143
+ );
144
+
145
+ if (createFormLauncher == undefined) {
146
+ console.error(
147
+ `Cannot find form '${current.launcherRef.name}' in the create launchers`,
148
+ );
149
+
150
+ return Co.SetState(
151
+ errorUpd(
152
+ List([
153
+ `Cannot find form '${current.launcherRef.name}' in the create launchers`,
154
+ ]),
155
+ ),
156
+ );
157
+ }
158
+
159
+ const defaultApi = () =>
160
+ current.launcherRef.apiSources.entityApis.default(
161
+ createFormLauncher.api,
162
+ )("");
163
+ const getGlobalConfig =
164
+ current.launcherRef.config.source == "api" &&
165
+ current.launcherRef.config.getGlobalConfig
166
+ ? current.launcherRef.config.getGlobalConfig
167
+ : () =>
168
+ current.launcherRef.apiSources.entityApis.get(
169
+ createFormLauncher.configApi,
170
+ )("");
171
+
172
+ return Co.Seq([
173
+ Co.Seq([
174
+ Co.All([
175
+ defaultValueCo(defaultApi, createFormLauncher),
176
+ configValueCo(getGlobalConfig, createFormLauncher, current),
177
+ ]),
178
+ Co.UpdateState((_) => {
179
+ if (_.entity.sync.kind == "error") {
180
+ return errorUpd(List([_.entity.sync.error]));
181
+ }
182
+
183
+ if (_.config.sync.kind == "error") {
184
+ return errorUpd(List([_.config.sync.error]));
185
+ }
186
+
187
+ if (
188
+ _.config.sync.kind == "loading" ||
189
+ _.config.sync.kind == "reloading"
190
+ ) {
191
+ return id;
192
+ }
193
+
194
+ if (
195
+ _.entity.sync.kind == "loading" ||
196
+ _.entity.sync.kind == "unloaded" ||
197
+ _.entity.sync.kind == "reloading"
198
+ ) {
199
+ return id;
200
+ }
201
+
202
+ const dispatcherContextWithApiSources: DispatcherContextWithApiSources<
203
+ T,
204
+ Flags,
205
+ CustomPresentationContexts,
206
+ ExtraContext
207
+ > = {
208
+ ...dispatcherContext,
209
+ ...current.launcherRef.apiSources,
210
+ defaultState: dispatcherContext.defaultState(
211
+ current.launcherRef.apiSources.infiniteStreamSources,
212
+ current.launcherRef.apiSources.lookupSources,
213
+ current.launcherRef.apiSources.tableApiSources,
214
+ ),
215
+ };
216
+
217
+ const Form = Dispatcher.Operations.Dispatch(
218
+ createFormLauncher.renderer,
219
+ dispatcherContextWithApiSources,
220
+ false,
221
+ false,
222
+ undefined,
223
+ );
224
+
225
+ if (Form.kind == "errors") {
226
+ console.error(Form.errors.valueSeq().toArray().join("\n"));
227
+ return errorUpd(Form.errors);
228
+ }
229
+
230
+ const initialState = dispatcherContext.defaultState(
231
+ current.launcherRef.apiSources.infiniteStreamSources,
232
+ current.launcherRef.apiSources.lookupSources,
233
+ current.launcherRef.apiSources.tableApiSources,
234
+ )(createFormLauncher.type, createFormLauncher.renderer);
235
+
236
+ if (initialState.kind == "errors") {
237
+ console.error(
238
+ initialState.errors.valueSeq().toArray().join("\n"),
239
+ );
240
+ return errorUpd(initialState.errors);
241
+ }
242
+
243
+ return DispatchCreateFormLauncherState<T, Flags>()
244
+ .Updaters.Core.formState(replaceWith(initialState.value))
245
+ .thenMany([
246
+ DispatchCreateFormLauncherState<
247
+ T,
248
+ Flags
249
+ >().Updaters.Core.status(
250
+ replaceWith<DispatchFormRunnerStatus<T, Flags>>({
251
+ kind: "loaded",
252
+ Form: Form.value,
253
+ }),
254
+ ),
255
+ DispatchCreateFormLauncherState<
256
+ T,
257
+ Flags
258
+ >().Updaters.Core.config(replaceWith(_.config)),
259
+ ]);
260
+ }),
261
+ ]),
262
+ HandleApiResponse<
263
+ DispatchCreateFormLauncherState<T, Flags>,
264
+ DispatchCreateFormLauncherContext<
265
+ T,
266
+ Flags,
267
+ CustomPresentationContexts,
268
+ ExtraContext
269
+ >,
270
+ any
271
+ >((_) => _.entity.sync, {
272
+ handleSuccess: current.launcherRef.apiHandlers?.onDefaultSuccess,
273
+ handleError: current.launcherRef.apiHandlers?.onDefaultError,
274
+ }),
275
+ setChecked(true),
276
+ ]);
277
+ }),
278
+ ]);
279
+ };
@@ -0,0 +1,103 @@
1
+ import {
2
+ ApiErrors,
3
+ ApiResponseChecker,
4
+ AsyncState,
5
+ HandleApiResponse,
6
+ id,
7
+ Synchronize,
8
+ Synchronized,
9
+ Unit,
10
+ } from "../../../../../../../../../main";
11
+ import { DispatchInjectablesTypes } from "../../../abstract-renderers/injectables/state";
12
+ import {
13
+ DispatchCreateFormLauncherContext,
14
+ DispatchCreateFormLauncherState,
15
+ } from "../state";
16
+ import { CreateCoBuilder } from "./builder";
17
+
18
+ export const syncCo = <
19
+ T extends DispatchInjectablesTypes<T>,
20
+ Flags,
21
+ CustomPresentationContexts,
22
+ ExtraContext,
23
+ >(
24
+ Co: ReturnType<
25
+ typeof CreateCoBuilder<T, Flags, CustomPresentationContexts, ExtraContext>
26
+ >,
27
+ ) => {
28
+ const setChecked = (checked: boolean) =>
29
+ Co.SetState(
30
+ DispatchCreateFormLauncherState<
31
+ T,
32
+ Flags
33
+ >().Updaters.Core.apiChecker.children.create(
34
+ checked
35
+ ? ApiResponseChecker.Updaters().toChecked()
36
+ : ApiResponseChecker.Updaters().toUnchecked(),
37
+ ),
38
+ );
39
+
40
+ return Co.GetState().then((current) => {
41
+ if (current.deserializedSpecification.sync.kind !== "loaded") {
42
+ return Co.SetState(id);
43
+ }
44
+
45
+ if (current.deserializedSpecification.sync.value.kind == "errors") {
46
+ return Co.SetState(id);
47
+ }
48
+
49
+ const createFormLauncher =
50
+ current.deserializedSpecification.sync.value.value.launchers.create.get(
51
+ current.launcherRef.name,
52
+ );
53
+
54
+ if (!createFormLauncher) {
55
+ return Co.SetState(id);
56
+ }
57
+
58
+ const create = current.launcherRef.apiSources.entityApis.create(
59
+ createFormLauncher.api,
60
+ );
61
+
62
+ return Co.Seq([
63
+ setChecked(false),
64
+ Synchronize<Unit, ApiErrors, Unit>(
65
+ (_) => {
66
+ if (current.entity.sync.kind !== "loaded") {
67
+ return Promise.resolve([]);
68
+ }
69
+
70
+ const parsed = createFormLauncher?.toApiParser(
71
+ current.entity.sync.value,
72
+ createFormLauncher?.type,
73
+ current.formState,
74
+ );
75
+
76
+ return !parsed || parsed?.kind == "errors"
77
+ ? Promise.reject(parsed?.errors)
78
+ : create(parsed.value).then(() => []);
79
+ },
80
+ (_) => "transient failure",
81
+ 3,
82
+ 50,
83
+ ).embed(
84
+ (_) => _.apiRunner,
85
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.apiRunner,
86
+ ),
87
+ HandleApiResponse<
88
+ DispatchCreateFormLauncherState<T, Flags>,
89
+ DispatchCreateFormLauncherContext<
90
+ T,
91
+ Flags,
92
+ CustomPresentationContexts,
93
+ ExtraContext
94
+ >,
95
+ ApiErrors
96
+ >((_) => _.apiRunner.sync, {
97
+ handleSuccess: current.launcherRef.apiHandlers?.onCreateSuccess,
98
+ handleError: current.launcherRef.apiHandlers?.onCreateError,
99
+ }),
100
+ setChecked(true),
101
+ ]);
102
+ });
103
+ };
@@ -0,0 +1,24 @@
1
+ import {
2
+ CoTypedFactory,
3
+ DispatchInjectablesTypes,
4
+ } from "../../../../../../../../../main";
5
+ import {
6
+ DispatchCreateFormLauncherContext,
7
+ DispatchCreateFormLauncherState,
8
+ } from "../state";
9
+
10
+ export const CreateCoBuilder = <
11
+ T extends DispatchInjectablesTypes<T>,
12
+ Flags,
13
+ CustomPresentationContexts,
14
+ ExtraContext,
15
+ >() =>
16
+ CoTypedFactory<
17
+ DispatchCreateFormLauncherContext<
18
+ T,
19
+ Flags,
20
+ CustomPresentationContexts,
21
+ ExtraContext
22
+ >,
23
+ DispatchCreateFormLauncherState<T, Flags>
24
+ >();
@@ -0,0 +1,44 @@
1
+ import {
2
+ DispatchInjectablesTypes,
3
+ Debounced,
4
+ ApiResponseChecker,
5
+ } from "../../../../../../../../../main";
6
+ import { DispatchCreateFormLauncherForeignMutationsExpected } from "../state";
7
+ import { CreateCoBuilder } from "./builder";
8
+ import { initCo } from "./_init";
9
+ import { syncCo } from "./_sync";
10
+
11
+ export const DispatchCreateFormRunner = <
12
+ T extends DispatchInjectablesTypes<T>,
13
+ Flags,
14
+ CustomPresentationContexts,
15
+ ExtraContext,
16
+ >() => {
17
+ const Co = CreateCoBuilder<
18
+ T,
19
+ Flags,
20
+ CustomPresentationContexts,
21
+ ExtraContext
22
+ >();
23
+
24
+ const init = initCo<T, Flags, CustomPresentationContexts, ExtraContext>(Co);
25
+ const sync = syncCo<T, Flags, CustomPresentationContexts, ExtraContext>(Co);
26
+
27
+ return Co.Template<DispatchCreateFormLauncherForeignMutationsExpected<T>>(
28
+ init,
29
+ {
30
+ runFilter: (_) =>
31
+ !ApiResponseChecker.Operations.checked(_.context.apiChecker.init) ||
32
+ _.context.entity.sync.kind != "loaded",
33
+ },
34
+ ).any([
35
+ Co.Template<DispatchCreateFormLauncherForeignMutationsExpected<T>>(sync, {
36
+ runFilter: (_) =>
37
+ _.context.entity.sync.kind == "loaded" &&
38
+ (_.context.apiRunner.sync.kind === "loading" ||
39
+ _.context.apiRunner.sync.kind === "reloading" ||
40
+ _.context.apiRunner.sync.kind === "loaded") &&
41
+ !ApiResponseChecker.Operations.checked(_.context.apiChecker.create),
42
+ }),
43
+ ]);
44
+ };
@@ -0,0 +1,100 @@
1
+ import {
2
+ DispatchFormRunnerContext,
3
+ DispatchInjectablesTypes,
4
+ CreateLauncherRef,
5
+ Unit,
6
+ ApiErrors,
7
+ Synchronized,
8
+ PredicateValue,
9
+ unit,
10
+ simpleUpdater,
11
+ ApiResponseChecker,
12
+ DispatchCommonFormRunnerState,
13
+ AsyncState,
14
+ BasicUpdater,
15
+ Updater,
16
+ simpleUpdaterWithChildren,
17
+ } from "../../../../../../../../main";
18
+
19
+ export type DispatchCreateFormLauncherApi = {
20
+ default: () => Promise<any>;
21
+ create: (raw: any) => Promise<ApiErrors>;
22
+ };
23
+
24
+ export type DispatchCreateFormLauncherContext<
25
+ T extends DispatchInjectablesTypes<T>,
26
+ Flags = Unit,
27
+ CustomPresentationContexts = Unit,
28
+ ExtraContext = Unit,
29
+ > = Omit<
30
+ DispatchFormRunnerContext<T, Flags, CustomPresentationContexts, ExtraContext>,
31
+ "launcherRef"
32
+ > & {
33
+ launcherRef: CreateLauncherRef;
34
+ };
35
+
36
+ export type DispatchCreateFormLauncherState<
37
+ T extends DispatchInjectablesTypes<T>,
38
+ Flags = Unit,
39
+ > = DispatchCommonFormRunnerState<T, Flags> & {
40
+ entity: Synchronized<Unit, PredicateValue>;
41
+ config: Synchronized<Unit, PredicateValue>;
42
+ apiChecker: {
43
+ init: ApiResponseChecker;
44
+ create: ApiResponseChecker;
45
+ };
46
+ apiRunner: Synchronized<Unit, ApiErrors>;
47
+ };
48
+
49
+ export const DispatchCreateFormLauncherState = <
50
+ T extends DispatchInjectablesTypes<T>,
51
+ Flags,
52
+ >() => ({
53
+ Default: (): DispatchCreateFormLauncherState<T, Flags> => ({
54
+ ...DispatchCommonFormRunnerState<T, Flags>().Default(),
55
+ entity: Synchronized.Default(unit),
56
+ config: Synchronized.Default(unit),
57
+ apiChecker: {
58
+ init: ApiResponseChecker.Default(false),
59
+ create: ApiResponseChecker.Default(false),
60
+ },
61
+ apiRunner: Synchronized.Default(unit),
62
+ }),
63
+ Updaters: {
64
+ Core: {
65
+ ...simpleUpdater<DispatchCreateFormLauncherState<T, Flags>>()("status"),
66
+ ...simpleUpdater<DispatchCreateFormLauncherState<T, Flags>>()(
67
+ "formState",
68
+ ),
69
+ ...simpleUpdater<DispatchCreateFormLauncherState<T, Flags>>()("entity"),
70
+ ...simpleUpdater<DispatchCreateFormLauncherState<T, Flags>>()("config"),
71
+ ...simpleUpdater<DispatchCreateFormLauncherState<T, Flags>>()(
72
+ "apiRunner",
73
+ ),
74
+ ...simpleUpdaterWithChildren<DispatchCreateFormLauncherState<T, Flags>>()(
75
+ {
76
+ ...simpleUpdater<
77
+ DispatchCreateFormLauncherState<T, Flags>["apiChecker"]
78
+ >()("init"),
79
+ ...simpleUpdater<
80
+ DispatchCreateFormLauncherState<T, Flags>["apiChecker"]
81
+ >()("create"),
82
+ },
83
+ )("apiChecker"),
84
+ },
85
+ Template: {
86
+ entity: (
87
+ _: BasicUpdater<PredicateValue>,
88
+ ): Updater<DispatchCreateFormLauncherState<T, Flags>> =>
89
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.entity(
90
+ Synchronized.Updaters.sync(AsyncState.Operations.map(_)),
91
+ ),
92
+ submit: (): Updater<DispatchCreateFormLauncherState<T, Flags>> =>
93
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.apiRunner(
94
+ Synchronized.Updaters.sync(AsyncState.Updaters.toLoading()),
95
+ ),
96
+ },
97
+ },
98
+ });
99
+
100
+ export type DispatchCreateFormLauncherForeignMutationsExpected<T> = {};
@@ -0,0 +1,116 @@
1
+ import {
2
+ DispatchCreateFormLauncherContext,
3
+ DispatchCreateFormLauncherState,
4
+ DispatchCreateFormLauncherForeignMutationsExpected,
5
+ } from "./state";
6
+ import {
7
+ DispatchInjectablesTypes,
8
+ Template,
9
+ Unit,
10
+ AsyncState,
11
+ unit,
12
+ Bindings,
13
+ PredicateValue,
14
+ Synchronized,
15
+ } from "../../../../../../../../main";
16
+ import { DispatchCreateFormRunner } from "./coroutines/runner";
17
+ import { Map } from "immutable";
18
+
19
+ export const DispatchCreateFormLauncherTemplate = <
20
+ T extends DispatchInjectablesTypes<T>,
21
+ Flags,
22
+ CustomPresentationContexts,
23
+ ExtraContext,
24
+ >() =>
25
+ Template.Default<
26
+ DispatchCreateFormLauncherContext<
27
+ T,
28
+ Flags,
29
+ CustomPresentationContexts,
30
+ ExtraContext
31
+ >,
32
+ DispatchCreateFormLauncherState<T, Flags>,
33
+ DispatchCreateFormLauncherForeignMutationsExpected<T>
34
+ >((props) => {
35
+ const entity = props.context.entity.sync;
36
+ const config = props.context.config.sync;
37
+
38
+ if (
39
+ !AsyncState.Operations.hasValue(entity) ||
40
+ !AsyncState.Operations.hasValue(config) ||
41
+ props.context.status.kind == "not initialized"
42
+ ) {
43
+ return <></>;
44
+ }
45
+
46
+ if (props.context.status.kind == "error") {
47
+ console.error(
48
+ props.context.status.errors.map((error) => error).join("\n"),
49
+ );
50
+ return (
51
+ props.context.errorComponent ?? <>Error: Check console for details</>
52
+ );
53
+ }
54
+
55
+ if (config.kind == "failed-reload") {
56
+ console.error(config.error);
57
+ return (
58
+ props.context.errorComponent ?? <>Error: Check console for details</>
59
+ );
60
+ }
61
+
62
+ if (props.context.status.kind == "loading" || config.kind == "reloading") {
63
+ return props.context.loadingComponent ?? <></>;
64
+ }
65
+
66
+ const bindings: Bindings = Map([
67
+ ["global", config.value],
68
+ ["root", entity.value],
69
+ ["local", entity.value],
70
+ ]);
71
+
72
+ return (
73
+ <props.context.status.Form
74
+ context={{
75
+ ...props.context.formState,
76
+ value: entity.value,
77
+ locked: false,
78
+ disabled: false,
79
+ bindings,
80
+ extraContext: props.context.extraContext,
81
+ remoteEntityVersionIdentifier:
82
+ props.context.remoteEntityVersionIdentifier,
83
+ domNodeAncestorPath: "",
84
+ lookupTypeAncestorNames: [],
85
+ }}
86
+ setState={(stateUpdater) =>
87
+ props.setState(
88
+ DispatchCreateFormLauncherState<T, Flags>().Updaters.Core.formState(
89
+ stateUpdater,
90
+ ),
91
+ )
92
+ }
93
+ view={unit}
94
+ foreignMutations={{
95
+ ...props.foreignMutations,
96
+ onChange: (pvUpdater, delta) => {
97
+ if (pvUpdater.kind == "l") return;
98
+
99
+ props.setState(
100
+ DispatchCreateFormLauncherState<
101
+ T,
102
+ Flags
103
+ >().Updaters.Template.entity(pvUpdater.value),
104
+ );
105
+ },
106
+ }}
107
+ />
108
+ );
109
+ }).any([
110
+ DispatchCreateFormRunner<
111
+ T,
112
+ Flags,
113
+ CustomPresentationContexts,
114
+ ExtraContext
115
+ >(),
116
+ ]);