@cratis/scene.components 3.5.0 → 3.7.0

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 (162) hide show
  1. package/README.md +56 -5
  2. package/bindings/bindingRegistry.ts +52 -4
  3. package/bindings/for_bindingRegistry/when_registering_query_identities.ts +81 -0
  4. package/bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx +4 -2
  5. package/cratisComponents.ts +2 -0
  6. package/cratisComponentsPackage.ts +2 -1
  7. package/data/SingleResultRuntime.tsx +17 -3
  8. package/data/for_SceneDataTable/when_forwarding_query_arguments.tsx +19 -0
  9. package/dist/cjs/bindings/bindingRegistry.js +52 -4
  10. package/dist/cjs/bindings/bindingRegistry.js.map +1 -1
  11. package/dist/cjs/cratisComponents.js +2 -0
  12. package/dist/cjs/cratisComponents.js.map +1 -1
  13. package/dist/cjs/cratisComponentsPackage.js +2 -1
  14. package/dist/cjs/cratisComponentsPackage.js.map +1 -1
  15. package/dist/cjs/data/SingleResultRuntime.js +16 -1
  16. package/dist/cjs/data/SingleResultRuntime.js.map +1 -1
  17. package/dist/cjs/forms/CommandFormRuntime.js +81 -0
  18. package/dist/cjs/forms/CommandFormRuntime.js.map +1 -0
  19. package/dist/cjs/forms/CommandFormSubmit.js +19 -0
  20. package/dist/cjs/forms/CommandFormSubmit.js.map +1 -0
  21. package/dist/cjs/forms/ExplicitCommandField.js +109 -0
  22. package/dist/cjs/forms/ExplicitCommandField.js.map +1 -0
  23. package/dist/cjs/forms/SceneCommandForm.js +26 -21
  24. package/dist/cjs/forms/SceneCommandForm.js.map +1 -1
  25. package/dist/cjs/forms/SceneQueryInputForm.js +141 -0
  26. package/dist/cjs/forms/SceneQueryInputForm.js.map +1 -0
  27. package/dist/cjs/forms/commandInputs.js +35 -0
  28. package/dist/cjs/forms/commandInputs.js.map +1 -0
  29. package/dist/cjs/forms/queryInputs.js +50 -0
  30. package/dist/cjs/forms/queryInputs.js.map +1 -0
  31. package/dist/cjs/index.js +6 -0
  32. package/dist/cjs/index.js.map +1 -1
  33. package/dist/esm/bindings/bindingRegistry.d.ts +4 -0
  34. package/dist/esm/bindings/bindingRegistry.d.ts.map +1 -1
  35. package/dist/esm/bindings/bindingRegistry.js +49 -5
  36. package/dist/esm/bindings/bindingRegistry.js.map +1 -1
  37. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts +2 -0
  38. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts.map +1 -0
  39. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js +73 -0
  40. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js.map +1 -0
  41. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js +2 -2
  42. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js.map +1 -1
  43. package/dist/esm/cratisComponents.d.ts.map +1 -1
  44. package/dist/esm/cratisComponents.js +2 -0
  45. package/dist/esm/cratisComponents.js.map +1 -1
  46. package/dist/esm/cratisComponentsPackage.d.ts.map +1 -1
  47. package/dist/esm/cratisComponentsPackage.js +2 -1
  48. package/dist/esm/cratisComponentsPackage.js.map +1 -1
  49. package/dist/esm/data/SingleResultRuntime.d.ts +2 -1
  50. package/dist/esm/data/SingleResultRuntime.d.ts.map +1 -1
  51. package/dist/esm/data/SingleResultRuntime.js +16 -1
  52. package/dist/esm/data/SingleResultRuntime.js.map +1 -1
  53. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js +17 -0
  54. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js.map +1 -1
  55. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.d.ts +2 -0
  56. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.d.ts.map +1 -0
  57. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.js +16 -0
  58. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.js.map +1 -0
  59. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts +2 -0
  60. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts.map +1 -0
  61. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js +14 -0
  62. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js.map +1 -0
  63. package/dist/esm/forms/CommandFormRuntime.d.ts +11 -0
  64. package/dist/esm/forms/CommandFormRuntime.d.ts.map +1 -0
  65. package/dist/esm/forms/CommandFormRuntime.js +77 -0
  66. package/dist/esm/forms/CommandFormRuntime.js.map +1 -0
  67. package/dist/esm/forms/CommandFormSubmit.d.ts +6 -0
  68. package/dist/esm/forms/CommandFormSubmit.d.ts.map +1 -0
  69. package/dist/esm/forms/CommandFormSubmit.js +17 -0
  70. package/dist/esm/forms/CommandFormSubmit.js.map +1 -0
  71. package/dist/esm/forms/ExplicitCommandField.d.ts +5 -0
  72. package/dist/esm/forms/ExplicitCommandField.d.ts.map +1 -0
  73. package/dist/esm/forms/ExplicitCommandField.js +107 -0
  74. package/dist/esm/forms/ExplicitCommandField.js.map +1 -0
  75. package/dist/esm/forms/SceneCommandForm.d.ts.map +1 -1
  76. package/dist/esm/forms/SceneCommandForm.js +27 -22
  77. package/dist/esm/forms/SceneCommandForm.js.map +1 -1
  78. package/dist/esm/forms/SceneQueryInputForm.d.ts +3 -0
  79. package/dist/esm/forms/SceneQueryInputForm.d.ts.map +1 -0
  80. package/dist/esm/forms/SceneQueryInputForm.js +139 -0
  81. package/dist/esm/forms/SceneQueryInputForm.js.map +1 -0
  82. package/dist/esm/forms/commandInputs.d.ts +7 -0
  83. package/dist/esm/forms/commandInputs.d.ts.map +1 -0
  84. package/dist/esm/forms/commandInputs.js +33 -0
  85. package/dist/esm/forms/commandInputs.js.map +1 -0
  86. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.d.ts +22 -0
  87. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.d.ts.map +1 -0
  88. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.js +30 -0
  89. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.js.map +1 -0
  90. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.d.ts +32 -0
  91. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.d.ts.map +1 -0
  92. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.js +32 -0
  93. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.js.map +1 -0
  94. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.d.ts +2 -0
  95. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.d.ts.map +1 -0
  96. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.js +66 -0
  97. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.js.map +1 -0
  98. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.d.ts +2 -0
  99. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.d.ts.map +1 -0
  100. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js +26 -0
  101. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js.map +1 -0
  102. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.d.ts +2 -0
  103. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.d.ts.map +1 -0
  104. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.js +44 -0
  105. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.js.map +1 -0
  106. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.d.ts +2 -0
  107. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.d.ts.map +1 -0
  108. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.js +49 -0
  109. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.js.map +1 -0
  110. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.d.ts +2 -0
  111. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.d.ts.map +1 -0
  112. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.js +176 -0
  113. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.js.map +1 -0
  114. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.d.ts +2 -0
  115. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.d.ts.map +1 -0
  116. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.js +110 -0
  117. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.js.map +1 -0
  118. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts +26 -0
  119. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts.map +1 -0
  120. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js +44 -0
  121. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js.map +1 -0
  122. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts +2 -0
  123. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts.map +1 -0
  124. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js +175 -0
  125. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js.map +1 -0
  126. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts +2 -0
  127. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts.map +1 -0
  128. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js +413 -0
  129. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js.map +1 -0
  130. package/dist/esm/forms/index.d.ts +2 -0
  131. package/dist/esm/forms/index.d.ts.map +1 -1
  132. package/dist/esm/forms/index.js +1 -0
  133. package/dist/esm/forms/index.js.map +1 -1
  134. package/dist/esm/forms/queryInputs.d.ts +10 -0
  135. package/dist/esm/forms/queryInputs.d.ts.map +1 -0
  136. package/dist/esm/forms/queryInputs.js +47 -0
  137. package/dist/esm/forms/queryInputs.js.map +1 -0
  138. package/dist/esm/index.js +2 -1
  139. package/dist/esm/index.js.map +1 -1
  140. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  141. package/for_cratisComponentsPackage/when_declaring_command_form_peers.ts +26 -0
  142. package/for_cratisComponentsPackage/when_describing_query_input_form.ts +17 -0
  143. package/forms/CommandFormRuntime.tsx +71 -0
  144. package/forms/CommandFormSubmit.tsx +16 -0
  145. package/forms/ExplicitCommandField.tsx +86 -0
  146. package/forms/SceneCommandForm.tsx +30 -27
  147. package/forms/SceneQueryInputForm.tsx +79 -0
  148. package/forms/commandInputs.ts +29 -0
  149. package/forms/for_SceneCommandForm/given/RecordNote.ts +37 -0
  150. package/forms/for_SceneCommandForm/given/StartProject.ts +41 -0
  151. package/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.tsx +69 -0
  152. package/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.tsx +33 -0
  153. package/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.tsx +50 -0
  154. package/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.tsx +56 -0
  155. package/forms/for_SceneCommandForm/when_submitting_explicit_inputs.tsx +189 -0
  156. package/forms/for_SceneCommandForm/when_submitting_the_native_form.tsx +120 -0
  157. package/forms/for_SceneQueryInputForm/ProjectLookup.ts +54 -0
  158. package/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.tsx +188 -0
  159. package/forms/for_SceneQueryInputForm/when_submitting_native_queries.tsx +423 -0
  160. package/forms/index.ts +2 -0
  161. package/forms/queryInputs.ts +50 -0
  162. package/package.json +17 -13
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { act, cleanup, render, screen } from '@testing-library/react';
3
+ import { vi } from 'vitest';
4
+ import { externalComponent } from '../../given';
5
+ describe('when forwarding command forms to the lazy runtime', () => {
6
+ const received = vi.fn();
7
+ const loaded = vi.fn();
8
+ let bindings;
9
+ let Form;
10
+ class Original {
11
+ }
12
+ class Replacement {
13
+ }
14
+ beforeEach(async () => {
15
+ vi.resetModules();
16
+ received.mockClear();
17
+ loaded.mockClear();
18
+ vi.doMock('../CommandFormRuntime', () => {
19
+ loaded();
20
+ return { default: (props) => { received(props); return _jsx("span", { children: "Runtime boundary" }); } };
21
+ });
22
+ bindings = await import('../../bindings/bindingRegistry');
23
+ bindings.clearBindings();
24
+ ({ SceneCommandForm: Form } = await import('../SceneCommandForm'));
25
+ });
26
+ afterEach(() => {
27
+ cleanup();
28
+ bindings.clearBindings();
29
+ vi.doUnmock('../CommandFormRuntime');
30
+ vi.resetModules();
31
+ });
32
+ it('should preserve the exact registered constructor, exclusions and explicit label', async () => {
33
+ bindings.registerCommand('RecordNote', Original);
34
+ const exclude = ['internalValue'];
35
+ await act(async () => {
36
+ render(_jsx(Form, { element: externalComponent('Cratis.Components:commandForm', {
37
+ command: 'RecordNote', exclude, submitLabel: 'Record note',
38
+ }), slots: {} }));
39
+ });
40
+ received.mock.calls.at(-1)[0].should.deep.equal({ command: Original, exclude, inputs: undefined, submitLabel: 'Record note' });
41
+ });
42
+ for (const submitLabel of [undefined, 42, false]) {
43
+ it(`should default a missing or non-string label (${String(submitLabel)}) to Submit`, async () => {
44
+ bindings.registerCommand('RecordNote', Original);
45
+ await act(async () => {
46
+ render(_jsx(Form, { element: externalComponent('Cratis.Components:commandForm', {
47
+ command: 'RecordNote', exclude: 'not-an-array', submitLabel,
48
+ }), slots: {} }));
49
+ });
50
+ received.mock.calls.at(-1)[0].should.deep.equal({ command: Original, exclude: undefined, inputs: undefined, submitLabel: 'Submit' });
51
+ });
52
+ }
53
+ it('should preserve legacy last-registration-wins command binding', async () => {
54
+ bindings.registerCommand('RecordNote', Original);
55
+ bindings.registerCommand('RecordNote', Replacement);
56
+ await act(async () => { render(_jsx(Form, { element: externalComponent('Cratis.Components:commandForm', { command: 'RecordNote' }), slots: {} })); });
57
+ (received.mock.calls.at(-1)[0].command === Replacement).should.equal(true);
58
+ });
59
+ it('should keep an unbound preview Arc-free even when a query has that name', async () => {
60
+ bindings.registerQuery('RecordNote', Original);
61
+ await act(async () => { render(_jsx(Form, { element: externalComponent('Cratis.Components:commandForm', { command: 'RecordNote' }), slots: {} })); });
62
+ Boolean(screen.getByText("Unresolved command binding 'RecordNote' on Cratis.Components:commandForm")).should.equal(true);
63
+ loaded.mock.calls.should.have.lengthOf(0);
64
+ });
65
+ });
66
+ //# sourceMappingURL=when_forwarding_to_the_lazy_runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_forwarding_to_the_lazy_runtime.js","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=when_native_custom_field_errors_block_submission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_native_custom_field_errors_block_submission.d.ts","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { act, cleanup, fireEvent, render, screen } from '@testing-library/react';
3
+ import { vi } from 'vitest';
4
+ import { CommandForm } from '@cratis/arc.react/commands';
5
+ import { InputTextField } from '@cratis/components/CommandForm';
6
+ import { CommandFormSubmit } from '../CommandFormSubmit';
7
+ import { RecordNote, successfulResponse } from './given/RecordNote';
8
+ describe('when native custom field errors block submission', () => {
9
+ const fetch = vi.fn();
10
+ beforeEach(() => { fetch.mockReset(); fetch.mockResolvedValue(successfulResponse()); vi.stubGlobal('fetch', fetch); });
11
+ afterEach(() => { cleanup(); vi.unstubAllGlobals(); });
12
+ it('should leave submit enabled for feedback but let the native form reject a custom field error', async () => {
13
+ await act(async () => {
14
+ render(_jsxs(CommandForm, { command: RecordNote, onFieldValidate: () => 'Subject is rejected by the field', children: [_jsx(InputTextField, { value: (command) => command.subject, title: 'Subject' }), _jsx(CommandFormSubmit, { label: 'Record note' })] }));
15
+ });
16
+ const input = screen.getByRole('textbox', { name: 'Subject' });
17
+ fireEvent.change(input, { target: { value: 'Passes the command validator' } });
18
+ await act(async () => { fireEvent.blur(input); });
19
+ (await screen.findAllByText('Subject is rejected by the field')).length.should.be.greaterThan(0);
20
+ const button = screen.getByRole('button', { name: 'Record note' });
21
+ button.disabled.should.equal(false);
22
+ await act(async () => { fireEvent.click(button); });
23
+ fetch.mock.calls.should.have.lengthOf(0);
24
+ });
25
+ });
26
+ //# sourceMappingURL=when_native_custom_field_errors_block_submission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_native_custom_field_errors_block_submission.js","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIpE,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC9D,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAA2B,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvH,SAAS,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,EAAE,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YAAG,MAAM,CAAC,MAAC,WAAW,IAAC,OAAO,EAAE,UAAU,EAC3D,eAAe,EAAE,GAAG,EAAE,CAAC,kCAAkC,aACzD,KAAC,cAAc,IAAC,KAAK,EAAE,CAAC,OAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAC,SAAS,GAAG,EACnF,KAAC,iBAAiB,IAAC,KAAK,EAAC,aAAa,GAAG,IAC/B,CAAC,CAAC;QAAC,CAAC,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,kCAAkC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAoB,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=when_preserving_guid_error_ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_preserving_guid_error_ownership.d.ts","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_preserving_guid_error_ownership.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { act, cleanup, fireEvent, render, screen } from '@testing-library/react';
3
+ import { CommandForm, useCommandFormContext } from '@cratis/arc.react/commands';
4
+ import { Guid } from '@cratis/fundamentals';
5
+ import { PropertyDescriptor } from '@cratis/arc/reflection';
6
+ import { ExplicitCommandField } from '../ExplicitCommandField';
7
+ import { StartProject } from './given/StartProject';
8
+ class OptionalProject extends StartProject {
9
+ propertyDescriptors = [new PropertyDescriptor('projectId', Guid, true), new PropertyDescriptor('name', String)];
10
+ }
11
+ const input = { property: 'projectId', type: 'guid', label: 'Project ID' };
12
+ describe('native explicit Guid field error ownership', () => {
13
+ afterEach(cleanup);
14
+ it('leaves a caller-owned error intact when the invalid field unmounts in the same event', async () => {
15
+ let context;
16
+ function Capture() { context = useCommandFormContext(); return null; }
17
+ function form(show) {
18
+ return _jsxs(CommandForm, { command: StartProject, children: [_jsx(Capture, {}), show && _jsx(ExplicitCommandField, { input: input })] });
19
+ }
20
+ const result = render(form(true));
21
+ fireEvent.change(screen.getByRole('textbox', { name: 'Project ID' }), { target: { value: 'bad' } });
22
+ context.getFieldError('projectId').should.equal('Project ID must be a valid GUID');
23
+ await act(async () => {
24
+ context.setCustomFieldError('projectId', 'Caller-owned error');
25
+ result.rerender(form(false));
26
+ });
27
+ context.getFieldError('projectId').should.equal('Caller-owned error');
28
+ });
29
+ it('clears its own malformed optional Guid error on unmount', async () => {
30
+ let context;
31
+ function Capture() { context = useCommandFormContext(); return null; }
32
+ function form(show) {
33
+ return _jsxs(CommandForm, { command: OptionalProject, children: [_jsx(Capture, {}), show && _jsx(ExplicitCommandField, { input: input })] });
34
+ }
35
+ const result = render(form(true));
36
+ await act(async () => {
37
+ fireEvent.change(screen.getByRole('textbox', { name: 'Project ID' }), { target: { value: 'bad' } });
38
+ context.getFieldError('projectId').should.equal('Project ID must be a valid GUID');
39
+ result.rerender(form(false));
40
+ });
41
+ (Object.hasOwn(context.customFieldErrors, 'projectId')).should.equal(false);
42
+ });
43
+ });
44
+ //# sourceMappingURL=when_preserving_guid_error_ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_preserving_guid_error_ownership.js","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_preserving_guid_error_ownership.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=when_rendering_submit_in_native_context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_rendering_submit_in_native_context.d.ts","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_rendering_submit_in_native_context.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
3
+ import { vi } from 'vitest';
4
+ import { CommandForm } from '@cratis/arc.react/commands';
5
+ import { InputTextField } from '@cratis/components/CommandForm';
6
+ import { CommandFormSubmit } from '../CommandFormSubmit';
7
+ import { RecordNote, RestrictedNote, successfulResponse } from './given/RecordNote';
8
+ describe('when rendering the submit child inside native CommandForm', () => {
9
+ const fetch = vi.fn();
10
+ beforeEach(() => { fetch.mockReset(); fetch.mockResolvedValue(successfulResponse()); vi.stubGlobal('fetch', fetch); });
11
+ afterEach(() => { cleanup(); vi.unstubAllGlobals(); });
12
+ it('should let native submit expose invalid untouched fields without HTTP', async () => {
13
+ await act(async () => {
14
+ render(_jsxs(CommandForm, { command: RecordNote, children: [_jsx(InputTextField, { value: (command) => command.subject, title: 'Subject' }), _jsx(CommandFormSubmit, { label: 'Record note' })] }));
15
+ });
16
+ const button = screen.getByRole('button', { name: 'Record note' });
17
+ button.disabled.should.equal(false);
18
+ await act(async () => { fireEvent.click(button); });
19
+ (await screen.findAllByText('Subject is required')).length.should.be.greaterThan(0);
20
+ fetch.mock.calls.should.have.lengthOf(0);
21
+ });
22
+ it('should follow native busy state through completion without executing directly', async () => {
23
+ let complete;
24
+ fetch.mockReturnValueOnce(new Promise(resolve => { complete = resolve; }));
25
+ await act(async () => {
26
+ render(_jsx(CommandForm, { command: RecordNote, initialValues: { subject: 'Valid' }, children: _jsx(CommandFormSubmit, { label: 'Record note' }) }));
27
+ });
28
+ const button = screen.getByRole('button', { name: 'Record note' });
29
+ button.disabled.should.equal(false);
30
+ await act(async () => { fireEvent.click(button); });
31
+ await waitFor(() => button.disabled.should.equal(true));
32
+ button.getAttribute('aria-busy').should.equal('true');
33
+ fireEvent.click(button);
34
+ fetch.mock.calls.should.have.lengthOf(1);
35
+ await act(async () => { complete(successfulResponse()); });
36
+ await waitFor(() => button.disabled.should.equal(false));
37
+ button.getAttribute('aria-busy').should.equal('false');
38
+ });
39
+ it('should respect native role authorization instead of deriving it in Scene', async () => {
40
+ await act(async () => {
41
+ render(_jsx(CommandForm, { command: RestrictedNote, children: _jsx(CommandFormSubmit, { label: 'Record note' }) }));
42
+ });
43
+ const button = screen.getByRole('button', { name: 'Record note' });
44
+ button.disabled.should.equal(true);
45
+ fireEvent.click(button);
46
+ fetch.mock.calls.should.have.lengthOf(0);
47
+ });
48
+ });
49
+ //# sourceMappingURL=when_rendering_submit_in_native_context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_rendering_submit_in_native_context.js","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_rendering_submit_in_native_context.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=when_submitting_explicit_inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_submitting_explicit_inputs.d.ts","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_submitting_explicit_inputs.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,176 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
3
+ import { vi } from 'vitest';
4
+ import { ArcContext } from '@cratis/arc.react';
5
+ import { SceneElementView } from '@cratis/scene.react';
6
+ import { clearBindings, registerCommand } from '../../bindings';
7
+ import { cratisComponents } from '../../cratisComponents';
8
+ import { externalComponent } from '../../given';
9
+ import { AmbiguousProject, OptionalUnsupported, RequiredUnsupported, RestrictedProject, StartProject } from './given/StartProject';
10
+ import { RecordNote, successfulResponse } from './given/RecordNote';
11
+ const inputs = [{ property: 'projectId', type: 'guid', label: 'Project ID' }, { property: 'name', type: 'string', label: 'Name' }];
12
+ const guid = 'AABBCCDD-1234-5678-9ABC-001122334455';
13
+ function view(properties = {}, explicit = true) {
14
+ return _jsx(ArcContext.Provider, { value: { origin: 'https://example.test', apiBasePath: '/backend', microservice: 'projects', httpHeadersCallback: () => ({ 'x-host': 'scene' }) }, children: _jsx(SceneElementView, { element: externalComponent('Cratis.Components:commandForm', { command: 'StartProject', ...(explicit ? { inputs } : {}), submitLabel: 'Create project', ...properties }), registry: cratisComponents, resolveBinding: () => undefined }) });
15
+ }
16
+ describe('explicit Scene command form using native Arc proxy and execution', () => {
17
+ const fetch = vi.fn();
18
+ beforeEach(() => { clearBindings(); registerCommand('StartProject', StartProject); fetch.mockReset(); fetch.mockResolvedValue(successfulResponse()); vi.stubGlobal('fetch', fetch); });
19
+ afterEach(() => { cleanup(); clearBindings(); vi.unstubAllGlobals(); });
20
+ it('rejects untouched, blank and malformed GUIDs, and blank name without HTTP; corrected fields submit the typed payload', async () => {
21
+ render(view());
22
+ const button = await screen.findByRole('button', { name: 'Create project' });
23
+ const id = screen.getByRole('textbox', { name: 'Project ID' });
24
+ const name = screen.getByRole('textbox', { name: 'Name' });
25
+ (button.form === id.closest('form')).should.equal(true);
26
+ await act(async () => { fireEvent.submit(button.form); });
27
+ (await screen.findAllByText('Project ID is required')).length.should.be.greaterThan(0);
28
+ fetch.mock.calls.should.have.lengthOf(0);
29
+ fireEvent.change(id, { target: { value: 'not-a-guid' } });
30
+ fireEvent.change(name, { target: { value: '' } });
31
+ await act(async () => { fireEvent.submit(button.form); });
32
+ (await screen.findAllByText('Project ID must be a valid GUID')).length.should.be.greaterThan(0);
33
+ fetch.mock.calls.should.have.lengthOf(0);
34
+ fireEvent.change(id, { target: { value: guid } });
35
+ await act(async () => { fireEvent.submit(button.form); });
36
+ (await screen.findAllByText('Name is required')).length.should.be.greaterThan(0);
37
+ fetch.mock.calls.should.have.lengthOf(0);
38
+ fireEvent.change(name, { target: { value: ' My Project ' } });
39
+ await act(async () => { fireEvent.click(button); });
40
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(1));
41
+ const [url, request] = fetch.mock.calls[0];
42
+ String(url).should.equal('https://example.test/backend/synthetic/projects');
43
+ request.method.should.equal('POST');
44
+ JSON.parse(String(request.body)).should.deep.equal({ projectId: guid.toLowerCase(), name: ' My Project ' });
45
+ new Headers(request.headers).get('x-host').should.equal('scene');
46
+ new Headers(request.headers).get('x-cratis-microservice').should.equal('projects');
47
+ fireEvent.change(id, { target: { value: 'broken again' } });
48
+ await act(async () => { fireEvent.submit(button.form); });
49
+ fetch.mock.calls.should.have.lengthOf(1);
50
+ });
51
+ it('keeps a typed Guid valid across a label change and executes exactly once', async () => {
52
+ const result = render(view());
53
+ await screen.findByRole('button', { name: 'Create project' });
54
+ fireEvent.change(screen.getByRole('textbox', { name: 'Project ID' }), { target: { value: guid } });
55
+ fireEvent.change(screen.getByRole('textbox', { name: 'Name' }), { target: { value: 'Renamed label' } });
56
+ result.rerender(view({ inputs: [{ ...inputs[0], label: 'Project identifier' }, inputs[1]] }));
57
+ const id = screen.getByRole('textbox', { name: 'Project identifier' });
58
+ id.value.should.equal(guid);
59
+ await act(async () => { fireEvent.click(screen.getByRole('button', { name: 'Create project' })); });
60
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(1));
61
+ JSON.parse(String(fetch.mock.calls[0][1].body)).should.deep.equal({ projectId: guid.toLowerCase(), name: 'Renamed label' });
62
+ });
63
+ it('keeps a malformed Guid blocked when its label changes, then submits the corrected typed value', async () => {
64
+ const result = render(view());
65
+ await screen.findByRole('button', { name: 'Create project' });
66
+ fireEvent.change(screen.getByRole('textbox', { name: 'Name' }), { target: { value: 'After correction' } });
67
+ fireEvent.change(screen.getByRole('textbox', { name: 'Project ID' }), { target: { value: 'not-a-guid' } });
68
+ (await screen.findAllByText('Project ID must be a valid GUID')).length.should.be.greaterThan(0);
69
+ result.rerender(view({ inputs: [{ ...inputs[0], label: 'Project identifier' }, inputs[1]] }));
70
+ const id = screen.getByRole('textbox', { name: 'Project identifier' });
71
+ id.value.should.equal('not-a-guid');
72
+ (await screen.findAllByText('Project identifier must be a valid GUID')).length.should.be.greaterThan(0);
73
+ (screen.queryByText('Project ID must be a valid GUID') === null).should.equal(true);
74
+ await act(async () => { fireEvent.submit(id.closest('form')); });
75
+ fetch.mock.calls.should.have.lengthOf(0);
76
+ fireEvent.change(id, { target: { value: guid } });
77
+ await act(async () => { fireEvent.submit(id.closest('form')); });
78
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(1));
79
+ JSON.parse(String(fetch.mock.calls[0][1].body)).should.deep.equal({ projectId: guid.toLowerCase(), name: 'After correction' });
80
+ });
81
+ it('remounts the native explicit proxy on a binding switch and same-name hot replacement', async () => {
82
+ class MovedProject extends StartProject {
83
+ route = '/synthetic/moved-projects';
84
+ }
85
+ class HotProject extends StartProject {
86
+ route = '/synthetic/hot-projects';
87
+ }
88
+ registerCommand('MovedProject', MovedProject);
89
+ const result = render(view());
90
+ await screen.findByRole('button', { name: 'Create project' });
91
+ result.rerender(view({ command: 'MovedProject' }));
92
+ await screen.findByRole('textbox', { name: 'Project ID' });
93
+ fireEvent.change(screen.getByRole('textbox', { name: 'Project ID' }), { target: { value: guid } });
94
+ fireEvent.change(screen.getByRole('textbox', { name: 'Name' }), { target: { value: 'Moved' } });
95
+ await act(async () => { fireEvent.click(screen.getByRole('button', { name: 'Create project' })); });
96
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(1));
97
+ String(fetch.mock.calls[0][0]).should.equal('https://example.test/backend/synthetic/moved-projects');
98
+ registerCommand('MovedProject', RestrictedProject);
99
+ result.rerender(view({ command: 'MovedProject' }));
100
+ const denied = await screen.findByRole('button', { name: 'Create project' });
101
+ denied.disabled.should.equal(true);
102
+ fireEvent.click(denied);
103
+ fetch.mock.calls.should.have.lengthOf(1);
104
+ registerCommand('MovedProject', HotProject);
105
+ result.rerender(view({ command: 'MovedProject' }));
106
+ const allowed = await screen.findByRole('button', { name: 'Create project' });
107
+ allowed.disabled.should.equal(false);
108
+ fireEvent.change(screen.getByRole('textbox', { name: 'Project ID' }), { target: { value: guid } });
109
+ fireEvent.change(screen.getByRole('textbox', { name: 'Name' }), { target: { value: 'Hot' } });
110
+ await act(async () => { fireEvent.click(allowed); });
111
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(2));
112
+ String(fetch.mock.calls[1][0]).should.equal('https://example.test/backend/synthetic/hot-projects');
113
+ });
114
+ it('uses native authorization and executing state', async () => {
115
+ registerCommand('StartProject', RestrictedProject);
116
+ render(view());
117
+ const button = await screen.findByRole('button', { name: 'Create project' });
118
+ button.disabled.should.equal(true);
119
+ fireEvent.click(button);
120
+ fetch.mock.calls.should.have.lengthOf(0);
121
+ });
122
+ it('reflects native execution state and blocks a second button click while pending', async () => {
123
+ let complete;
124
+ fetch.mockReturnValueOnce(new Promise(resolve => { complete = resolve; }));
125
+ render(view());
126
+ const button = await screen.findByRole('button', { name: 'Create project' });
127
+ fireEvent.change(screen.getByRole('textbox', { name: 'Project ID' }), { target: { value: guid } });
128
+ fireEvent.change(screen.getByRole('textbox', { name: 'Name' }), { target: { value: 'Pending' } });
129
+ await act(async () => { fireEvent.click(button); });
130
+ await waitFor(() => button.disabled.should.equal(true));
131
+ button.getAttribute('aria-busy').should.equal('true');
132
+ fireEvent.click(button);
133
+ fetch.mock.calls.should.have.lengthOf(1);
134
+ await act(async () => { complete(successfulResponse()); });
135
+ await waitFor(() => button.disabled.should.equal(false));
136
+ });
137
+ it('blocks malformed declarations, unknown names, mismatches, uncovered and ambiguous required descriptors', async () => {
138
+ const invalid = [
139
+ { inputs: [] }, { inputs: [{ property: 'name', type: 'string', label: 'Name' }, { property: 'name', type: 'string', label: 'Again' }] },
140
+ { inputs: [{ property: 'PROJECTID', type: 'guid', label: 'ID' }, inputs[1]] },
141
+ { inputs: [{ ...inputs[0], type: 'string' }, inputs[1]] },
142
+ { inputs: [inputs[1]] }, { inputs: [{ ...inputs[0], type: 'number' }, inputs[1]] },
143
+ ];
144
+ for (const properties of invalid) {
145
+ const result = render(view(properties));
146
+ (await screen.findByRole('alert')).textContent.length.should.be.greaterThan(0);
147
+ (screen.queryByRole('button', { name: 'Create project' }) === null).should.equal(true);
148
+ result.unmount();
149
+ }
150
+ registerCommand('StartProject', AmbiguousProject);
151
+ render(view());
152
+ (await screen.findByRole('alert')).textContent.should.contain('Ambiguous');
153
+ fetch.mock.calls.should.have.lengthOf(0);
154
+ });
155
+ it('accepts optional unsupported descriptors when unbound but rejects required unsupported descriptors', async () => {
156
+ registerCommand('StartProject', OptionalUnsupported);
157
+ const result = render(view());
158
+ Boolean(await screen.findByRole('button', { name: 'Create project' })).should.equal(true);
159
+ result.unmount();
160
+ registerCommand('StartProject', RequiredUnsupported);
161
+ render(view());
162
+ (await screen.findByRole('alert')).textContent.should.contain("Required command property 'details'");
163
+ });
164
+ it('refuses automatic forms with required GUID rather than silently dropping it', async () => {
165
+ render(view({}, false));
166
+ (await screen.findByRole('alert')).textContent.should.contain("Required command property 'projectId'");
167
+ fetch.mock.calls.should.have.lengthOf(0);
168
+ });
169
+ it('does not allow auto exclusions to hide required supported fields', async () => {
170
+ registerCommand('StartProject', RecordNote);
171
+ render(view({ exclude: ['subject'] }, false));
172
+ (await screen.findByRole('alert')).textContent.should.contain("Required command property 'subject'");
173
+ fetch.mock.calls.should.have.lengthOf(0);
174
+ });
175
+ });
176
+ //# sourceMappingURL=when_submitting_explicit_inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_submitting_explicit_inputs.js","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_submitting_explicit_inputs.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=when_submitting_the_native_form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_submitting_the_native_form.d.ts","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_submitting_the_native_form.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
3
+ import { vi } from 'vitest';
4
+ import { ArcContext } from '@cratis/arc.react';
5
+ import { SceneElementView } from '@cratis/scene.react';
6
+ import { clearBindings, registerCommand } from '../../bindings';
7
+ import { cratisComponents } from '../../cratisComponents';
8
+ import { externalComponent } from '../../given';
9
+ import { RecordNote, RestrictedNote, successfulResponse } from './given/RecordNote';
10
+ function view(properties = {}) {
11
+ return _jsx(ArcContext.Provider, { value: { origin: 'https://example.test', apiBasePath: '/backend', microservice: 'notes', httpHeadersCallback: () => ({ 'x-host': 'scene' }) }, children: _jsx(SceneElementView, { element: externalComponent('Cratis.Components:commandForm', {
12
+ command: 'RecordNote', exclude: ['internalValue'], ...properties,
13
+ }), registry: cratisComponents, resolveBinding: () => undefined }) });
14
+ }
15
+ describe('when submitting a Scene command form through native AutoCommandForm', () => {
16
+ const fetch = vi.fn();
17
+ beforeEach(() => {
18
+ clearBindings();
19
+ registerCommand('RecordNote', RecordNote);
20
+ fetch.mockReset();
21
+ fetch.mockResolvedValue(successfulResponse());
22
+ vi.stubGlobal('fetch', fetch);
23
+ });
24
+ afterEach(() => { cleanup(); clearBindings(); vi.unstubAllGlobals(); });
25
+ it('should submit the actual form with a labeled button and preserve native payload and context', async () => {
26
+ render(view({ submitLabel: 'Record note' }));
27
+ const button = await screen.findByRole('button', { name: 'Record note' });
28
+ button.type.should.equal('submit');
29
+ (button.form === screen.getByRole('textbox', { name: 'Subject' }).closest('form')).should.equal(true);
30
+ screen.queryAllByRole('textbox').should.have.lengthOf(1);
31
+ fireEvent.change(screen.getByRole('textbox', { name: 'Subject' }), { target: { value: 'A synthetic note' } });
32
+ fetch.mock.calls.should.have.lengthOf(0);
33
+ await act(async () => { fireEvent.click(button); });
34
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(1));
35
+ const [url, request] = fetch.mock.calls[0];
36
+ String(url).should.equal('https://example.test/backend/synthetic/notes');
37
+ request.method.should.equal('POST');
38
+ JSON.parse(String(request.body)).should.deep.equal({ subject: 'A synthetic note', internalValue: 'proxy default' });
39
+ new Headers(request.headers).get('x-host').should.equal('scene');
40
+ new Headers(request.headers).get('x-cratis-microservice').should.equal('notes');
41
+ });
42
+ it('should allow untouched invalid submit to reveal native feedback and correction to execute', async () => {
43
+ render(view());
44
+ const button = await screen.findByRole('button', { name: 'Submit' });
45
+ button.disabled.should.equal(false);
46
+ (screen.queryByText('Subject is required') === null).should.equal(true);
47
+ await act(async () => { fireEvent.click(button); });
48
+ (await screen.findAllByText('Subject is required')).length.should.be.greaterThan(0);
49
+ fetch.mock.calls.should.have.lengthOf(0);
50
+ button.disabled.should.equal(false);
51
+ fireEvent.change(screen.getByRole('textbox', { name: 'Subject' }), { target: { value: 'Corrected' } });
52
+ await act(async () => { fireEvent.click(button); });
53
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(1));
54
+ });
55
+ it('should reflect native execution until HTTP settles and prevent a second button click', async () => {
56
+ let complete;
57
+ fetch.mockReturnValueOnce(new Promise(resolve => { complete = resolve; }));
58
+ render(view());
59
+ const button = await screen.findByRole('button', { name: 'Submit' });
60
+ fireEvent.change(screen.getByRole('textbox', { name: 'Subject' }), { target: { value: 'Pending' } });
61
+ await act(async () => { fireEvent.click(button); });
62
+ await waitFor(() => button.disabled.should.equal(true));
63
+ button.getAttribute('aria-busy').should.equal('true');
64
+ fireEvent.click(button);
65
+ fetch.mock.calls.should.have.lengthOf(1);
66
+ await act(async () => { complete(successfulResponse()); });
67
+ await waitFor(() => button.disabled.should.equal(false));
68
+ button.getAttribute('aria-busy').should.equal('false');
69
+ });
70
+ it('remounts the automatic native form on binding switches and same-name hot replacement', async () => {
71
+ class MovedNote extends RecordNote {
72
+ route = '/synthetic/moved-notes';
73
+ }
74
+ class HotNote extends RecordNote {
75
+ route = '/synthetic/hot-notes';
76
+ }
77
+ registerCommand('MovedNote', MovedNote);
78
+ const result = render(view());
79
+ await screen.findByRole('button', { name: 'Submit' });
80
+ result.rerender(view({ command: 'MovedNote' }));
81
+ await screen.findByRole('textbox', { name: 'Subject' });
82
+ fireEvent.change(screen.getByRole('textbox', { name: 'Subject' }), { target: { value: 'Moved' } });
83
+ await act(async () => { fireEvent.click(screen.getByRole('button', { name: 'Submit' })); });
84
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(1));
85
+ String(fetch.mock.calls[0][0]).should.equal('https://example.test/backend/synthetic/moved-notes');
86
+ registerCommand('MovedNote', RestrictedNote);
87
+ result.rerender(view({ command: 'MovedNote' }));
88
+ const denied = await screen.findByRole('button', { name: 'Submit' });
89
+ denied.disabled.should.equal(true);
90
+ fireEvent.click(denied);
91
+ fetch.mock.calls.should.have.lengthOf(1);
92
+ registerCommand('MovedNote', HotNote);
93
+ result.rerender(view({ command: 'MovedNote' }));
94
+ const allowed = await screen.findByRole('button', { name: 'Submit' });
95
+ allowed.disabled.should.equal(false);
96
+ fireEvent.change(screen.getByRole('textbox', { name: 'Subject' }), { target: { value: 'Hot' } });
97
+ await act(async () => { fireEvent.click(allowed); });
98
+ await waitFor(() => fetch.mock.calls.should.have.lengthOf(2));
99
+ String(fetch.mock.calls[1][0]).should.equal('https://example.test/backend/synthetic/hot-notes');
100
+ });
101
+ it('should disable the button when native command authorization denies the identity', async () => {
102
+ registerCommand('RecordNote', RestrictedNote);
103
+ render(view());
104
+ const button = await screen.findByRole('button', { name: 'Submit' });
105
+ button.disabled.should.equal(true);
106
+ fireEvent.click(button);
107
+ fetch.mock.calls.should.have.lengthOf(0);
108
+ });
109
+ });
110
+ //# sourceMappingURL=when_submitting_the_native_form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_submitting_the_native_form.js","sourceRoot":"","sources":["../../../../forms/for_SceneCommandForm/when_submitting_the_native_form.tsx"],"names":[],"mappings":"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"}