@cratis/scene.components 3.3.1 → 3.5.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 (145) hide show
  1. package/README.md +51 -2
  2. package/bindings/ArcBoundComponents.tsx +40 -0
  3. package/bindings/BoundConstructor.ts +5 -5
  4. package/bindings/for_requireArcProxy/NativeProxies.ts +28 -0
  5. package/bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx +71 -0
  6. package/bindings/for_requireArcProxy/when_previewing_without_arc.tsx +37 -0
  7. package/bindings/for_requireArcProxy/when_validating_a_proxy.ts +44 -0
  8. package/bindings/requireArcProxy.ts +24 -0
  9. package/cratisComponents.ts +2 -1
  10. package/cratisComponentsPackage.ts +2 -1
  11. package/data/SceneDataTable.tsx +12 -2
  12. package/data/SceneObservableDataTable.tsx +1 -1
  13. package/data/SceneSingleResult.tsx +29 -0
  14. package/data/SingleResultRuntime.tsx +89 -0
  15. package/data/SingleResultStatus.tsx +13 -0
  16. package/data/for_SceneDataTable/when_forwarding_query_arguments.tsx +104 -0
  17. package/data/for_SceneSingleResult/when_executing_a_native_query.tsx +290 -0
  18. package/data/for_SceneSingleResult/when_gating_the_lazy_runtime.tsx +60 -0
  19. package/data/index.ts +1 -0
  20. package/dialogs/SceneCommandDialog.tsx +1 -1
  21. package/dialogs/SceneStepperCommandDialog.tsx +1 -1
  22. package/dist/cjs/bindings/ArcBoundComponents.js +55 -0
  23. package/dist/cjs/bindings/ArcBoundComponents.js.map +1 -0
  24. package/dist/cjs/bindings/requireArcProxy.js +25 -0
  25. package/dist/cjs/bindings/requireArcProxy.js.map +1 -0
  26. package/dist/cjs/cratisComponents.js +2 -0
  27. package/dist/cjs/cratisComponents.js.map +1 -1
  28. package/dist/cjs/cratisComponentsPackage.js +2 -1
  29. package/dist/cjs/cratisComponentsPackage.js.map +1 -1
  30. package/dist/cjs/data/SceneDataTable.js +15 -1
  31. package/dist/cjs/data/SceneDataTable.js.map +1 -1
  32. package/dist/cjs/data/SceneObservableDataTable.js +1 -1
  33. package/dist/cjs/data/SceneObservableDataTable.js.map +1 -1
  34. package/dist/cjs/data/SceneSingleResult.js +41 -0
  35. package/dist/cjs/data/SceneSingleResult.js.map +1 -0
  36. package/dist/cjs/data/SingleResultRuntime.js +122 -0
  37. package/dist/cjs/data/SingleResultRuntime.js.map +1 -0
  38. package/dist/cjs/data/SingleResultStatus.js +23 -0
  39. package/dist/cjs/data/SingleResultStatus.js.map +1 -0
  40. package/dist/cjs/dialogs/SceneCommandDialog.js +1 -1
  41. package/dist/cjs/dialogs/SceneCommandDialog.js.map +1 -1
  42. package/dist/cjs/dialogs/SceneStepperCommandDialog.js +1 -1
  43. package/dist/cjs/dialogs/SceneStepperCommandDialog.js.map +1 -1
  44. package/dist/cjs/forms/fields/SceneRadioButtonField.js +4 -1
  45. package/dist/cjs/forms/fields/SceneRadioButtonField.js.map +1 -1
  46. package/dist/cjs/index.js +2 -0
  47. package/dist/cjs/index.js.map +1 -1
  48. package/dist/cjs/pages/SceneDataPage.js +1 -1
  49. package/dist/cjs/pages/SceneDataPage.js.map +1 -1
  50. package/dist/esm/bindings/ArcBoundComponents.d.ts +18 -0
  51. package/dist/esm/bindings/ArcBoundComponents.d.ts.map +1 -0
  52. package/dist/esm/bindings/ArcBoundComponents.js +49 -0
  53. package/dist/esm/bindings/ArcBoundComponents.js.map +1 -0
  54. package/dist/esm/bindings/for_requireArcProxy/NativeProxies.d.ts +25 -0
  55. package/dist/esm/bindings/for_requireArcProxy/NativeProxies.d.ts.map +1 -0
  56. package/dist/esm/bindings/for_requireArcProxy/NativeProxies.js +23 -0
  57. package/dist/esm/bindings/for_requireArcProxy/NativeProxies.js.map +1 -0
  58. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.d.ts +2 -0
  59. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.d.ts.map +1 -0
  60. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js +56 -0
  61. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js.map +1 -0
  62. package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.d.ts +2 -0
  63. package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.d.ts.map +1 -0
  64. package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.js +32 -0
  65. package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.js.map +1 -0
  66. package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.d.ts +2 -0
  67. package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.d.ts.map +1 -0
  68. package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.js +45 -0
  69. package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.js.map +1 -0
  70. package/dist/esm/bindings/requireArcProxy.d.ts +5 -0
  71. package/dist/esm/bindings/requireArcProxy.d.ts.map +1 -0
  72. package/dist/esm/bindings/requireArcProxy.js +23 -0
  73. package/dist/esm/bindings/requireArcProxy.js.map +1 -0
  74. package/dist/esm/cratisComponents.d.ts.map +1 -1
  75. package/dist/esm/cratisComponents.js +2 -0
  76. package/dist/esm/cratisComponents.js.map +1 -1
  77. package/dist/esm/cratisComponentsPackage.d.ts.map +1 -1
  78. package/dist/esm/cratisComponentsPackage.js +2 -1
  79. package/dist/esm/cratisComponentsPackage.js.map +1 -1
  80. package/dist/esm/data/SceneDataTable.d.ts.map +1 -1
  81. package/dist/esm/data/SceneDataTable.js +16 -2
  82. package/dist/esm/data/SceneDataTable.js.map +1 -1
  83. package/dist/esm/data/SceneObservableDataTable.js +1 -1
  84. package/dist/esm/data/SceneObservableDataTable.js.map +1 -1
  85. package/dist/esm/data/SceneSingleResult.d.ts +3 -0
  86. package/dist/esm/data/SceneSingleResult.d.ts.map +1 -0
  87. package/dist/esm/data/SceneSingleResult.js +39 -0
  88. package/dist/esm/data/SceneSingleResult.js.map +1 -0
  89. package/dist/esm/data/SingleResultRuntime.d.ts +9 -0
  90. package/dist/esm/data/SingleResultRuntime.d.ts.map +1 -0
  91. package/dist/esm/data/SingleResultRuntime.js +118 -0
  92. package/dist/esm/data/SingleResultRuntime.js.map +1 -0
  93. package/dist/esm/data/SingleResultStatus.d.ts +7 -0
  94. package/dist/esm/data/SingleResultStatus.d.ts.map +1 -0
  95. package/dist/esm/data/SingleResultStatus.js +21 -0
  96. package/dist/esm/data/SingleResultStatus.js.map +1 -0
  97. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.d.ts +2 -0
  98. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.d.ts.map +1 -0
  99. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js +90 -0
  100. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js.map +1 -0
  101. package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.d.ts +2 -0
  102. package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.d.ts.map +1 -0
  103. package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.js +255 -0
  104. package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.js.map +1 -0
  105. package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.d.ts +2 -0
  106. package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.d.ts.map +1 -0
  107. package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.js +54 -0
  108. package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.js.map +1 -0
  109. package/dist/esm/data/index.d.ts +1 -0
  110. package/dist/esm/data/index.d.ts.map +1 -1
  111. package/dist/esm/data/index.js +1 -0
  112. package/dist/esm/data/index.js.map +1 -1
  113. package/dist/esm/dialogs/SceneCommandDialog.js +1 -1
  114. package/dist/esm/dialogs/SceneCommandDialog.js.map +1 -1
  115. package/dist/esm/dialogs/SceneStepperCommandDialog.js +1 -1
  116. package/dist/esm/dialogs/SceneStepperCommandDialog.js.map +1 -1
  117. package/dist/esm/for_cratisComponentsPackage/when_describing_query_arguments.d.ts +2 -0
  118. package/dist/esm/for_cratisComponentsPackage/when_describing_query_arguments.d.ts.map +1 -0
  119. package/dist/esm/for_cratisComponentsPackage/when_describing_query_arguments.js +11 -0
  120. package/dist/esm/for_cratisComponentsPackage/when_describing_query_arguments.js.map +1 -0
  121. package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.d.ts +2 -0
  122. package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.d.ts.map +1 -0
  123. package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.js +16 -0
  124. package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.js.map +1 -0
  125. package/dist/esm/forms/fields/SceneRadioButtonField.d.ts.map +1 -1
  126. package/dist/esm/forms/fields/SceneRadioButtonField.js +4 -1
  127. package/dist/esm/forms/fields/SceneRadioButtonField.js.map +1 -1
  128. package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.d.ts +2 -0
  129. package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.d.ts.map +1 -0
  130. package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.js +38 -0
  131. package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.js.map +1 -0
  132. package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js +4 -0
  133. package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js.map +1 -1
  134. package/dist/esm/index.js +1 -0
  135. package/dist/esm/index.js.map +1 -1
  136. package/dist/esm/pages/SceneDataPage.js +1 -1
  137. package/dist/esm/pages/SceneDataPage.js.map +1 -1
  138. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  139. package/for_cratisComponentsPackage/when_describing_query_arguments.ts +15 -0
  140. package/for_cratisComponentsPackage/when_describing_single_result.ts +20 -0
  141. package/forms/fields/SceneRadioButtonField.tsx +4 -1
  142. package/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.tsx +45 -0
  143. package/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.ts +6 -0
  144. package/package.json +20 -8
  145. package/pages/SceneDataPage.tsx +1 -1
@@ -0,0 +1,15 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { cratisComponentsPackageManifest } from '../cratisComponentsPackage';
5
+
6
+ describe('when describing query arguments', () => {
7
+ it('should keep both collection table names in the manifest', () => {
8
+ cratisComponentsPackageManifest.components.should.include('dataTable');
9
+ cratisComponentsPackageManifest.components.should.include('table');
10
+ });
11
+
12
+ it('should describe the optional object property without promising single-result support', () => {
13
+ (cratisComponentsPackageManifest.description ?? '').should.contain('dataTable and table accept optional object-valued queryArguments for collection queries');
14
+ });
15
+ });
@@ -0,0 +1,20 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { expect } from 'vitest';
5
+ import { componentRegistryKey } from '@cratis/scene.react';
6
+ import { cratisComponents, cratisComponentsPackageName } from '../cratisComponents';
7
+ import { cratisComponentsPackageManifest } from '../cratisComponentsPackage';
8
+ import { SceneSingleResult } from '../data/SceneSingleResult';
9
+
10
+ describe('when describing the single result view', () => {
11
+ it('registers the same component advertised by the manifest', () => {
12
+ expect(cratisComponentsPackageManifest.components).toContain('singleResult');
13
+ expect(cratisComponents[componentRegistryKey(cratisComponentsPackageName, 'singleResult')]).toBe(SceneSingleResult);
14
+ });
15
+
16
+ it('describes an explicitly enabled read-only own-field capability', () => {
17
+ expect(cratisComponentsPackageManifest.description).toContain('read-only scalar own resultField');
18
+ expect(cratisComponentsPackageManifest.description).toContain('enabled: true');
19
+ });
20
+ });
@@ -20,13 +20,16 @@ const RadioButtonField = lazy(async () => ({ default: (await import('@cratis/com
20
20
  * numeric code is common enough that forcing it through as `'1'` would bind the wrong value.
21
21
  */
22
22
  export function SceneRadioButtonField({ element }: RegisteredComponentProps) {
23
+ // Use the same reader as CommandFormField's binding gate; that gate owns missing-property feedback.
24
+ const name = stringProperty(element.properties, 'property');
23
25
  const buttonValue = stringProperty(element.properties, 'buttonValue') ?? numberProperty(element.properties, 'buttonValue') ?? '';
24
26
 
25
27
  return (
26
28
  <CommandFormField element={element}>
27
- {binding => (
29
+ {binding => name !== undefined && (
28
30
  <RadioButtonField
29
31
  {...binding}
32
+ name={name}
30
33
  buttonValue={buttonValue}
31
34
  label={stringProperty(element.properties, 'label')}
32
35
  className={stringProperty(element.properties, 'className')}
@@ -0,0 +1,45 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { act, cleanup, render, screen } from '@testing-library/react';
5
+ import { expect, vi } from 'vitest';
6
+ import { externalComponent } from '../../../given';
7
+
8
+ // The public Components radio props require a native group name independently of the display title.
9
+ describe('when mapping the radio group name', () => {
10
+ const received = vi.fn<(props: { name: string; title: string; value: (instance: Record<string, unknown>) => unknown }) => void>();
11
+ let SceneRadioButtonField: typeof import('../SceneRadioButtonField').SceneRadioButtonField;
12
+
13
+ beforeEach(async () => {
14
+ vi.resetModules();
15
+ received.mockClear();
16
+ vi.doMock('@cratis/components/CommandForm', () => ({
17
+ RadioButtonField: (props: Parameters<typeof received>[0]) => { received(props); return <input type='radio' name={props.name} />; },
18
+ }));
19
+ ({ SceneRadioButtonField } = await import('../SceneRadioButtonField'));
20
+ });
21
+
22
+ afterEach(() => {
23
+ cleanup();
24
+ vi.doUnmock('@cratis/components/CommandForm');
25
+ vi.resetModules();
26
+ });
27
+
28
+ it('should group options by the explicit property, regardless of titles or labels', async () => {
29
+ await act(async () => {
30
+ render(<>{['First title', 'Second title'].map((title, index) => <SceneRadioButtonField key={title} element={externalComponent('Cratis.Components:radioButtonField', { property: 'choice', title, label: 'Display label', buttonValue: index })} slots={{}} />)}</>);
31
+ });
32
+ expect(screen.getAllByRole('radio').map(radio => radio.getAttribute('name'))).toEqual(['choice', 'choice']);
33
+ expect(received.mock.calls.map(([props]) => props.value({ choice: 2 }))).toEqual([2, 2]);
34
+ });
35
+
36
+ for (const property of [undefined, 42, null, {}, []]) {
37
+ it(`should visibly reject malformed property ${JSON.stringify(property)} instead of using the title`, async () => {
38
+ await act(async () => {
39
+ render(<SceneRadioButtonField element={externalComponent('Cratis.Components:radioButtonField', { property, title: 'Not a binding' })} slots={{}} />);
40
+ });
41
+ expect(screen.getByText("Missing 'property' on Cratis.Components:radioButtonField")).toBeTruthy();
42
+ expect(received).not.toHaveBeenCalled();
43
+ });
44
+ }
45
+ });
@@ -3,8 +3,14 @@
3
3
 
4
4
  import { externalComponent } from '../../../given';
5
5
  import { resolveFieldBinding } from '../resolveFieldBinding';
6
+ import type { FieldBinding } from '../FieldBinding';
6
7
 
7
8
  describe('when resolving a field binding', () => {
9
+ it('should preserve manually constructed field bindings without a native group name', () => {
10
+ const binding: FieldBinding = { value: instance => instance.customerName, title: 'Customer' };
11
+ binding.value({ customerName: 'Acme' })!.should.equal('Acme');
12
+ });
13
+
8
14
  describe('and the element names a property with a title and description', () => {
9
15
  const binding = resolveFieldBinding(
10
16
  externalComponent('Cratis.Components:inputTextField', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/scene.components",
3
- "version": "3.3.1",
3
+ "version": "3.5.0",
4
4
  "description": "The Cratis Components package: exposes @cratis/components' Arc-bound data, form and dialog composites as Scene components. Built on PrimeReact and Tailwind, and declares both as dependencies.",
5
5
  "keywords": [
6
6
  "cratis",
@@ -53,15 +53,17 @@
53
53
  "build-storybook": "storybook build"
54
54
  },
55
55
  "dependencies": {
56
- "@cratis/scene.engine": "3.3.1",
57
- "@cratis/scene.model": "3.3.1",
58
- "@cratis/scene.react": "3.3.1"
56
+ "@cratis/scene.engine": "3.5.0",
57
+ "@cratis/scene.model": "3.5.0",
58
+ "@cratis/scene.react": "3.5.0"
59
59
  },
60
60
  "devDependencies": {
61
- "@cratis/components": "^4.2.2",
62
- "@cratis/scene.engine": "3.3.1",
63
- "@cratis/scene.model": "3.3.1",
64
- "@cratis/scene.react": "3.3.1",
61
+ "@cratis/arc": "22.16.1",
62
+ "@cratis/arc.react": "22.16.1",
63
+ "@cratis/components": "^4.6.0",
64
+ "@cratis/scene.engine": "3.5.0",
65
+ "@cratis/scene.model": "3.5.0",
66
+ "@cratis/scene.react": "3.5.0",
65
67
  "@storybook/addon-links": "^10.6.0",
66
68
  "@storybook/react": "^10.6.0",
67
69
  "@storybook/react-vite": "^10.6.0",
@@ -71,8 +73,18 @@
71
73
  "storybook": "^10.6.0"
72
74
  },
73
75
  "peerDependencies": {
76
+ "@cratis/arc": "^22.16.1",
77
+ "@cratis/arc.react": "^22.16.1",
74
78
  "@cratis/components": "^4.1.1",
75
79
  "react": "^19.0.0",
76
80
  "react-dom": "^19.0.0"
81
+ },
82
+ "peerDependenciesMeta": {
83
+ "@cratis/arc": {
84
+ "optional": true
85
+ },
86
+ "@cratis/arc.react": {
87
+ "optional": true
88
+ }
77
89
  }
78
90
  }
@@ -6,7 +6,7 @@ import { RegisteredComponentProps } from '@cratis/scene.react';
6
6
  import { ArcRuntimeBoundary, BindingKind, MissingBinding, resolveElementBinding } from '../bindings';
7
7
  import { stringArrayProperty, stringProperty } from '../properties';
8
8
 
9
- const DataPage = lazy(async () => ({ default: (await import('@cratis/components/DataPage')).DataPage }));
9
+ const DataPage = lazy(async () => ({ default: (await import('../bindings/ArcBoundComponents')).BoundDataPage }));
10
10
 
11
11
  /**
12
12
  * The `Cratis.Components:dataPage` component - `DataPage` from `@cratis/components/DataPage`.