@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.
- package/README.md +56 -5
- package/bindings/bindingRegistry.ts +52 -4
- package/bindings/for_bindingRegistry/when_registering_query_identities.ts +81 -0
- package/bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx +4 -2
- package/cratisComponents.ts +2 -0
- package/cratisComponentsPackage.ts +2 -1
- package/data/SingleResultRuntime.tsx +17 -3
- package/data/for_SceneDataTable/when_forwarding_query_arguments.tsx +19 -0
- package/dist/cjs/bindings/bindingRegistry.js +52 -4
- package/dist/cjs/bindings/bindingRegistry.js.map +1 -1
- package/dist/cjs/cratisComponents.js +2 -0
- package/dist/cjs/cratisComponents.js.map +1 -1
- package/dist/cjs/cratisComponentsPackage.js +2 -1
- package/dist/cjs/cratisComponentsPackage.js.map +1 -1
- package/dist/cjs/data/SingleResultRuntime.js +16 -1
- package/dist/cjs/data/SingleResultRuntime.js.map +1 -1
- package/dist/cjs/forms/CommandFormRuntime.js +81 -0
- package/dist/cjs/forms/CommandFormRuntime.js.map +1 -0
- package/dist/cjs/forms/CommandFormSubmit.js +19 -0
- package/dist/cjs/forms/CommandFormSubmit.js.map +1 -0
- package/dist/cjs/forms/ExplicitCommandField.js +109 -0
- package/dist/cjs/forms/ExplicitCommandField.js.map +1 -0
- package/dist/cjs/forms/SceneCommandForm.js +26 -21
- package/dist/cjs/forms/SceneCommandForm.js.map +1 -1
- package/dist/cjs/forms/SceneQueryInputForm.js +141 -0
- package/dist/cjs/forms/SceneQueryInputForm.js.map +1 -0
- package/dist/cjs/forms/commandInputs.js +35 -0
- package/dist/cjs/forms/commandInputs.js.map +1 -0
- package/dist/cjs/forms/queryInputs.js +50 -0
- package/dist/cjs/forms/queryInputs.js.map +1 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/bindings/bindingRegistry.d.ts +4 -0
- package/dist/esm/bindings/bindingRegistry.d.ts.map +1 -1
- package/dist/esm/bindings/bindingRegistry.js +49 -5
- package/dist/esm/bindings/bindingRegistry.js.map +1 -1
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts +2 -0
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js +73 -0
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js +2 -2
- package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js.map +1 -1
- package/dist/esm/cratisComponents.d.ts.map +1 -1
- package/dist/esm/cratisComponents.js +2 -0
- package/dist/esm/cratisComponents.js.map +1 -1
- package/dist/esm/cratisComponentsPackage.d.ts.map +1 -1
- package/dist/esm/cratisComponentsPackage.js +2 -1
- package/dist/esm/cratisComponentsPackage.js.map +1 -1
- package/dist/esm/data/SingleResultRuntime.d.ts +2 -1
- package/dist/esm/data/SingleResultRuntime.d.ts.map +1 -1
- package/dist/esm/data/SingleResultRuntime.js +16 -1
- package/dist/esm/data/SingleResultRuntime.js.map +1 -1
- package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js +17 -0
- package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js.map +1 -1
- package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.d.ts +2 -0
- package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.d.ts.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.js +16 -0
- package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.js.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts +2 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js +14 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js.map +1 -0
- package/dist/esm/forms/CommandFormRuntime.d.ts +11 -0
- package/dist/esm/forms/CommandFormRuntime.d.ts.map +1 -0
- package/dist/esm/forms/CommandFormRuntime.js +77 -0
- package/dist/esm/forms/CommandFormRuntime.js.map +1 -0
- package/dist/esm/forms/CommandFormSubmit.d.ts +6 -0
- package/dist/esm/forms/CommandFormSubmit.d.ts.map +1 -0
- package/dist/esm/forms/CommandFormSubmit.js +17 -0
- package/dist/esm/forms/CommandFormSubmit.js.map +1 -0
- package/dist/esm/forms/ExplicitCommandField.d.ts +5 -0
- package/dist/esm/forms/ExplicitCommandField.d.ts.map +1 -0
- package/dist/esm/forms/ExplicitCommandField.js +107 -0
- package/dist/esm/forms/ExplicitCommandField.js.map +1 -0
- package/dist/esm/forms/SceneCommandForm.d.ts.map +1 -1
- package/dist/esm/forms/SceneCommandForm.js +27 -22
- package/dist/esm/forms/SceneCommandForm.js.map +1 -1
- package/dist/esm/forms/SceneQueryInputForm.d.ts +3 -0
- package/dist/esm/forms/SceneQueryInputForm.d.ts.map +1 -0
- package/dist/esm/forms/SceneQueryInputForm.js +139 -0
- package/dist/esm/forms/SceneQueryInputForm.js.map +1 -0
- package/dist/esm/forms/commandInputs.d.ts +7 -0
- package/dist/esm/forms/commandInputs.d.ts.map +1 -0
- package/dist/esm/forms/commandInputs.js +33 -0
- package/dist/esm/forms/commandInputs.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.d.ts +22 -0
- package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.js +30 -0
- package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/given/StartProject.d.ts +32 -0
- package/dist/esm/forms/for_SceneCommandForm/given/StartProject.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/given/StartProject.js +32 -0
- package/dist/esm/forms/for_SceneCommandForm/given/StartProject.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.d.ts +2 -0
- package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.js +66 -0
- package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.d.ts +2 -0
- package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js +26 -0
- package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.d.ts +2 -0
- package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.js +44 -0
- package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.d.ts +2 -0
- package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.js +49 -0
- package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.d.ts +2 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.js +176 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.js.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.d.ts +2 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.js +110 -0
- package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.js.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts +26 -0
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js +44 -0
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts +2 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js +175 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts +2 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js +413 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js.map +1 -0
- package/dist/esm/forms/index.d.ts +2 -0
- package/dist/esm/forms/index.d.ts.map +1 -1
- package/dist/esm/forms/index.js +1 -0
- package/dist/esm/forms/index.js.map +1 -1
- package/dist/esm/forms/queryInputs.d.ts +10 -0
- package/dist/esm/forms/queryInputs.d.ts.map +1 -0
- package/dist/esm/forms/queryInputs.js +47 -0
- package/dist/esm/forms/queryInputs.js.map +1 -0
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/for_cratisComponentsPackage/when_declaring_command_form_peers.ts +26 -0
- package/for_cratisComponentsPackage/when_describing_query_input_form.ts +17 -0
- package/forms/CommandFormRuntime.tsx +71 -0
- package/forms/CommandFormSubmit.tsx +16 -0
- package/forms/ExplicitCommandField.tsx +86 -0
- package/forms/SceneCommandForm.tsx +30 -27
- package/forms/SceneQueryInputForm.tsx +79 -0
- package/forms/commandInputs.ts +29 -0
- package/forms/for_SceneCommandForm/given/RecordNote.ts +37 -0
- package/forms/for_SceneCommandForm/given/StartProject.ts +41 -0
- package/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.tsx +69 -0
- package/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.tsx +33 -0
- package/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.tsx +50 -0
- package/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.tsx +56 -0
- package/forms/for_SceneCommandForm/when_submitting_explicit_inputs.tsx +189 -0
- package/forms/for_SceneCommandForm/when_submitting_the_native_form.tsx +120 -0
- package/forms/for_SceneQueryInputForm/ProjectLookup.ts +54 -0
- package/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.tsx +188 -0
- package/forms/for_SceneQueryInputForm/when_submitting_native_queries.tsx +423 -0
- package/forms/index.ts +2 -0
- package/forms/queryInputs.ts +50 -0
- 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 @@
|
|
|
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":""}
|
package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js
ADDED
|
@@ -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
|
package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|