@dxos/react-ui-form 0.8.4-main.67995b8 → 0.8.4-main.72ec0f3
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/dist/lib/browser/index.mjs +874 -621
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +874 -621
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/ControlSection/ControlSection.d.ts +2 -2
- package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +1 -1
- package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts +80 -5
- package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +1 -1
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +2 -2
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
- package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +75 -5
- package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/Form/ArrayField.d.ts +2 -2
- package/dist/types/src/components/Form/ArrayField.d.ts.map +1 -1
- package/dist/types/src/components/Form/Defaults.d.ts +5 -5
- package/dist/types/src/components/Form/Defaults.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.d.ts +8 -6
- package/dist/types/src/components/Form/Form.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.stories.d.ts +128 -32
- package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
- package/dist/types/src/components/Form/FormActions.d.ts.map +1 -1
- package/dist/types/src/components/Form/FormContent.d.ts +17 -11
- package/dist/types/src/components/Form/FormContent.d.ts.map +1 -1
- package/dist/types/src/components/Form/FormContext.d.ts +3 -3
- package/dist/types/src/components/Form/FormContext.d.ts.map +1 -1
- package/dist/types/src/components/Form/Input.d.ts +5 -2
- package/dist/types/src/components/Form/Input.d.ts.map +1 -1
- package/dist/types/src/components/Form/RefField.d.ts +15 -5
- package/dist/types/src/components/Form/RefField.d.ts.map +1 -1
- package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +1 -1
- package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +1 -1
- package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +1 -1
- package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +1 -1
- package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts +75 -4
- package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +1 -1
- package/dist/types/src/components/Form/custom/TupleInput.d.ts +1 -1
- package/dist/types/src/components/Form/factory.d.ts +1 -1
- package/dist/types/src/components/Form/factory.d.ts.map +1 -1
- package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +41 -0
- package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -0
- package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +81 -0
- package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -0
- package/dist/types/src/components/ObjectPicker/index.d.ts +2 -0
- package/dist/types/src/components/ObjectPicker/index.d.ts.map +1 -0
- package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +20 -6
- package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
- package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +79 -8
- package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +6 -3
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/hooks/useForm.d.ts +3 -3
- package/dist/types/src/hooks/useForm.d.ts.map +1 -1
- package/dist/types/src/hooks/useQueryRefOptions.d.ts +9 -3
- package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +1 -1
- package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +13 -8
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/util/field.d.ts +1 -1
- package/dist/types/src/util/field.d.ts.map +1 -1
- package/dist/types/src/util/formatting.d.ts +1 -1
- package/dist/types/src/util/formatting.d.ts.map +1 -1
- package/dist/types/src/util/refs.d.ts +1 -1
- package/dist/types/src/util/refs.d.ts.map +1 -1
- package/dist/types/src/util/schema.d.ts +1 -1
- package/dist/types/src/util/schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -38
- package/src/components/ControlSection/ControlSection.stories.tsx +11 -14
- package/src/components/ControlSection/ControlSection.tsx +26 -12
- package/src/components/FieldEditor/FieldEditor.stories.tsx +14 -14
- package/src/components/FieldEditor/FieldEditor.test.tsx +3 -2
- package/src/components/FieldEditor/FieldEditor.tsx +26 -18
- package/src/components/Form/ArrayField.tsx +12 -11
- package/src/components/Form/Defaults.tsx +23 -21
- package/src/components/Form/Form.stories.tsx +135 -99
- package/src/components/Form/Form.tsx +30 -16
- package/src/components/Form/FormActions.tsx +4 -3
- package/src/components/Form/FormContent.tsx +171 -49
- package/src/components/Form/FormContext.tsx +8 -8
- package/src/components/Form/Input.tsx +5 -2
- package/src/components/Form/RefField.tsx +111 -41
- package/src/components/Form/custom/GeoPointInput.tsx +29 -21
- package/src/components/Form/custom/SelectOptionsInput.stories.tsx +11 -11
- package/src/components/Form/custom/SelectOptionsInput.tsx +31 -32
- package/src/components/Form/custom/TupleInput.tsx +2 -2
- package/src/components/Form/factory.tsx +2 -2
- package/src/components/ObjectPicker/ObjectPicker.stories.tsx +207 -0
- package/src/components/ObjectPicker/ObjectPicker.tsx +161 -0
- package/src/components/ObjectPicker/index.ts +5 -0
- package/src/components/ViewEditor/ViewEditor.stories.tsx +125 -50
- package/src/components/ViewEditor/ViewEditor.test.tsx +13 -15
- package/src/components/ViewEditor/ViewEditor.tsx +282 -219
- package/src/components/index.ts +1 -2
- package/src/components/testing.tsx +15 -9
- package/src/hooks/useForm.ts +11 -6
- package/src/hooks/useQueryRefOptions.ts +15 -6
- package/src/hooks/useRefQueryLookupHandler.ts +3 -3
- package/src/translations.ts +15 -9
- package/src/util/field.ts +9 -19
- package/src/util/formatting.ts +1 -1
- package/src/util/refs.ts +7 -7
- package/src/util/schema.ts +2 -4
- package/dist/types/src/components/deprecated/Form.d.ts +0 -15
- package/dist/types/src/components/deprecated/Form.d.ts.map +0 -1
- package/dist/types/src/components/deprecated/Form.stories.d.ts +0 -13
- package/dist/types/src/components/deprecated/Form.stories.d.ts.map +0 -1
- package/dist/types/src/components/deprecated/FormInput.d.ts +0 -16
- package/dist/types/src/components/deprecated/FormInput.d.ts.map +0 -1
- package/dist/types/src/components/deprecated/index.d.ts +0 -2
- package/dist/types/src/components/deprecated/index.d.ts.map +0 -1
- package/src/components/deprecated/Form.stories.tsx +0 -62
- package/src/components/deprecated/Form.tsx +0 -119
- package/src/components/deprecated/FormInput.tsx +0 -71
- package/src/components/deprecated/index.ts +0 -5
|
@@ -2,93 +2,142 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos-theme';
|
|
6
|
-
|
|
7
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
|
-
import
|
|
9
|
-
import React, { useCallback, useMemo,
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
10
8
|
|
|
11
|
-
import { Obj, Type } from '@dxos/echo';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { withClientProvider } from '@dxos/react-client/testing';
|
|
9
|
+
import { DXN, Filter, Obj, Query, type QueryAST, Tag, Type } from '@dxos/echo';
|
|
10
|
+
import { type EchoSchema, Format } from '@dxos/echo/internal';
|
|
11
|
+
import { useQuery } from '@dxos/react-client/echo';
|
|
12
|
+
import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
|
|
15
13
|
import { useAsyncEffect } from '@dxos/react-ui';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
14
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
15
|
+
import { type ProjectionModel, View, getTypenameFromQuery } from '@dxos/schema';
|
|
16
|
+
import { Employer, Organization, Person, Project } from '@dxos/types';
|
|
18
17
|
|
|
19
|
-
import { ViewEditor, type ViewEditorProps } from './ViewEditor';
|
|
20
18
|
import { translations } from '../../translations';
|
|
21
19
|
import { TestLayout, TestPanel, VIEW_EDITOR_DEBUG_SYMBOL } from '../testing';
|
|
22
20
|
|
|
21
|
+
import { ViewEditor, type ViewEditorProps } from './ViewEditor';
|
|
22
|
+
|
|
23
|
+
const types = [
|
|
24
|
+
// TODO(burdon): Get label from annotation.
|
|
25
|
+
{ value: Organization.Organization.typename, label: 'Organization' },
|
|
26
|
+
{ value: Person.Person.typename, label: 'Person' },
|
|
27
|
+
{ value: Type.getTypename(Project.Project), label: 'Project' },
|
|
28
|
+
{ value: Employer.Employer.typename, label: 'Employer' },
|
|
29
|
+
];
|
|
30
|
+
|
|
23
31
|
// Type definition for debug objects exposed to tests.
|
|
24
32
|
export type ViewEditorDebugObjects = {
|
|
25
33
|
schema: EchoSchema;
|
|
26
|
-
view:
|
|
34
|
+
view: View.View;
|
|
27
35
|
projection: ProjectionModel;
|
|
28
36
|
};
|
|
29
37
|
|
|
30
|
-
type StoryProps = Pick<ViewEditorProps, 'readonly'>;
|
|
38
|
+
type StoryProps = Pick<ViewEditorProps, 'readonly' | 'mode'>;
|
|
31
39
|
|
|
32
40
|
const DefaultStory = (props: StoryProps) => {
|
|
33
|
-
const space =
|
|
41
|
+
const { space } = useClientProvider();
|
|
34
42
|
const [schema, setSchema] = useState<EchoSchema>();
|
|
35
|
-
const [view, setView] = useState<
|
|
36
|
-
const
|
|
43
|
+
const [view, setView] = useState<View.View>();
|
|
44
|
+
const projectionRef = useRef<ProjectionModel>(null);
|
|
45
|
+
|
|
46
|
+
const tags = useQuery(space, Filter.type(Tag.Tag));
|
|
47
|
+
|
|
37
48
|
useAsyncEffect(async () => {
|
|
38
49
|
if (space) {
|
|
39
|
-
|
|
50
|
+
const TestSchema = Schema.Struct({
|
|
40
51
|
name: Schema.String,
|
|
41
52
|
email: Format.Email,
|
|
42
53
|
salary: Format.Currency(),
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
54
|
+
}).pipe(
|
|
55
|
+
Type.Obj({
|
|
56
|
+
typename: 'example.com/type/Test',
|
|
57
|
+
version: '0.1.0',
|
|
58
|
+
}),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const AlternateSchema = Schema.Struct({
|
|
62
|
+
title: Schema.String,
|
|
63
|
+
description: Schema.String,
|
|
64
|
+
completed: Schema.Boolean,
|
|
65
|
+
}).pipe(
|
|
66
|
+
Type.Obj({
|
|
67
|
+
typename: 'example.com/type/Alternate',
|
|
68
|
+
version: '0.1.0',
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const [testSchema] = await space.db.schemaRegistry.register([TestSchema, AlternateSchema]);
|
|
73
|
+
const view = View.make({
|
|
47
74
|
name: 'Test',
|
|
48
|
-
|
|
49
|
-
jsonSchema: toJsonSchema(TestSchema),
|
|
75
|
+
query: Query.select(Filter.type(TestSchema)),
|
|
76
|
+
jsonSchema: Type.toJsonSchema(TestSchema),
|
|
50
77
|
presentation: Obj.make(Type.Expando, {}),
|
|
51
78
|
});
|
|
52
|
-
const projection = new ProjectionModel(schema.jsonSchema, view.projection);
|
|
53
79
|
|
|
54
|
-
setSchema(
|
|
80
|
+
setSchema(testSchema);
|
|
55
81
|
setView(view);
|
|
56
|
-
setProjection(projection);
|
|
57
82
|
}
|
|
58
83
|
}, [space]);
|
|
59
84
|
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
(newTypename: string) => {
|
|
64
|
-
if (!schema) {
|
|
85
|
+
const updateViewQuery = useCallback(
|
|
86
|
+
async (newQuery: QueryAST.Query, target?: string) => {
|
|
87
|
+
if (!schema || !view || !space) {
|
|
65
88
|
return;
|
|
66
89
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
90
|
+
|
|
91
|
+
if (props.mode === 'query') {
|
|
92
|
+
const queue = target && DXN.tryParse(target) ? target : undefined;
|
|
93
|
+
const query = queue ? Query.fromAst(newQuery).options({ queues: [queue] }) : Query.fromAst(newQuery);
|
|
94
|
+
view.query.ast = query.ast;
|
|
95
|
+
|
|
96
|
+
const typename = getTypenameFromQuery(query.ast);
|
|
97
|
+
const [newSchema] = await space.db.schemaRegistry.query({ typename }).run();
|
|
98
|
+
if (!newSchema) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const newView = View.make({
|
|
103
|
+
query,
|
|
104
|
+
jsonSchema: newSchema.jsonSchema,
|
|
105
|
+
presentation: Obj.make(Type.Expando, {}),
|
|
106
|
+
});
|
|
107
|
+
view.projection = Obj.getSnapshot(newView).projection;
|
|
108
|
+
setSchema(() => newSchema);
|
|
109
|
+
} else {
|
|
110
|
+
console.log('updateViewQuery', { newQuery });
|
|
111
|
+
view.query.ast = newQuery;
|
|
112
|
+
schema.updateTypename(getTypenameFromQuery(newQuery));
|
|
70
113
|
}
|
|
71
|
-
schema.updateTypename(newTypename);
|
|
72
114
|
},
|
|
73
|
-
[
|
|
115
|
+
[view, schema],
|
|
74
116
|
);
|
|
75
117
|
|
|
76
|
-
const handleDelete = useCallback(
|
|
118
|
+
const handleDelete = useCallback(
|
|
119
|
+
(property: string) => projectionRef.current?.deleteFieldProjection(property),
|
|
120
|
+
[projectionRef],
|
|
121
|
+
);
|
|
77
122
|
|
|
78
123
|
// Expose objects on window for test access.
|
|
79
124
|
useEffect(() => {
|
|
80
|
-
if (typeof window !== 'undefined' && schema && view &&
|
|
81
|
-
(window as any)[VIEW_EDITOR_DEBUG_SYMBOL] = {
|
|
125
|
+
if (typeof window !== 'undefined' && schema && view && projectionRef.current) {
|
|
126
|
+
(window as any)[VIEW_EDITOR_DEBUG_SYMBOL] = {
|
|
127
|
+
schema,
|
|
128
|
+
view,
|
|
129
|
+
projection: projectionRef.current,
|
|
130
|
+
} satisfies ViewEditorDebugObjects;
|
|
82
131
|
}
|
|
83
|
-
}, [schema, view
|
|
132
|
+
}, [schema, view]);
|
|
84
133
|
|
|
85
134
|
// NOTE(ZaymonFC): This looks awkward but it resolves an infinite parsing issue with sb.
|
|
86
135
|
const json = useMemo(
|
|
87
|
-
() => JSON.parse(JSON.stringify({ schema, view, projection })),
|
|
88
|
-
[JSON.stringify(schema), JSON.stringify(view)
|
|
136
|
+
() => JSON.parse(JSON.stringify({ schema, view, projection: projectionRef.current })),
|
|
137
|
+
[JSON.stringify(schema), JSON.stringify(view)],
|
|
89
138
|
);
|
|
90
139
|
|
|
91
|
-
if (!schema || !view
|
|
140
|
+
if (!schema || !view) {
|
|
92
141
|
return <div />;
|
|
93
142
|
}
|
|
94
143
|
|
|
@@ -96,11 +145,15 @@ const DefaultStory = (props: StoryProps) => {
|
|
|
96
145
|
<TestLayout json={json}>
|
|
97
146
|
<TestPanel>
|
|
98
147
|
<ViewEditor
|
|
148
|
+
ref={projectionRef}
|
|
99
149
|
schema={schema}
|
|
100
150
|
view={view}
|
|
101
151
|
registry={space?.db.schemaRegistry}
|
|
152
|
+
mode={props.mode}
|
|
102
153
|
readonly={props.readonly}
|
|
103
|
-
|
|
154
|
+
types={types}
|
|
155
|
+
tags={tags}
|
|
156
|
+
onQueryChanged={updateViewQuery}
|
|
104
157
|
onDelete={handleDelete}
|
|
105
158
|
/>
|
|
106
159
|
</TestPanel>
|
|
@@ -108,19 +161,41 @@ const DefaultStory = (props: StoryProps) => {
|
|
|
108
161
|
);
|
|
109
162
|
};
|
|
110
163
|
|
|
111
|
-
const meta
|
|
164
|
+
const meta = {
|
|
112
165
|
title: 'ui/react-ui-form/ViewEditor',
|
|
113
166
|
render: DefaultStory,
|
|
114
|
-
decorators: [
|
|
115
|
-
|
|
116
|
-
|
|
167
|
+
decorators: [
|
|
168
|
+
withClientProvider({
|
|
169
|
+
createSpace: true,
|
|
170
|
+
types: [Tag.Tag],
|
|
171
|
+
onCreateSpace: ({ space }) => {
|
|
172
|
+
space.db.add(Tag.make({ label: 'Important' }));
|
|
173
|
+
space.db.add(Tag.make({ label: 'Investor' }));
|
|
174
|
+
space.db.add(Tag.make({ label: 'New' }));
|
|
175
|
+
},
|
|
176
|
+
}),
|
|
177
|
+
withTheme,
|
|
178
|
+
],
|
|
179
|
+
parameters: {
|
|
180
|
+
layout: 'fullscreen',
|
|
181
|
+
translations,
|
|
182
|
+
},
|
|
183
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
117
184
|
|
|
118
185
|
export default meta;
|
|
119
186
|
|
|
120
|
-
type Story = StoryObj<
|
|
187
|
+
type Story = StoryObj<typeof meta>;
|
|
121
188
|
|
|
122
189
|
export const Default: Story = {};
|
|
123
190
|
|
|
124
191
|
export const Readonly: Story = {
|
|
125
|
-
args: {
|
|
192
|
+
args: {
|
|
193
|
+
readonly: true,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
export const QueryMode: Story = {
|
|
198
|
+
args: {
|
|
199
|
+
mode: 'query',
|
|
200
|
+
},
|
|
126
201
|
};
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { composeStories } from '@storybook/react';
|
|
6
|
-
import {
|
|
6
|
+
import { cleanup, fireEvent, screen, waitFor } from '@testing-library/react';
|
|
7
7
|
import { afterEach, describe, expect, test } from 'vitest';
|
|
8
8
|
|
|
9
|
-
import { EchoSchema, isInstanceOf } from '@dxos/echo
|
|
10
|
-
import {
|
|
9
|
+
import { EchoSchema, isInstanceOf } from '@dxos/echo/internal';
|
|
10
|
+
import { ProjectionModel, View } from '@dxos/schema';
|
|
11
|
+
|
|
12
|
+
import { VIEW_EDITOR_DEBUG_SYMBOL } from '../testing';
|
|
11
13
|
|
|
12
14
|
import * as stories from './ViewEditor.stories';
|
|
13
15
|
import { type ViewEditorDebugObjects } from './ViewEditor.stories';
|
|
14
|
-
import { VIEW_EDITOR_DEBUG_SYMBOL } from '../testing';
|
|
15
16
|
|
|
16
17
|
const { Default } = composeStories(stories);
|
|
17
18
|
|
|
@@ -19,7 +20,7 @@ const getViewEditorDebugObjects = (): ViewEditorDebugObjects => {
|
|
|
19
20
|
const debugObjects = (window as any)[VIEW_EDITOR_DEBUG_SYMBOL] as ViewEditorDebugObjects;
|
|
20
21
|
expect(debugObjects).toBeDefined();
|
|
21
22
|
expect(debugObjects.schema).toBeInstanceOf(EchoSchema);
|
|
22
|
-
expect(isInstanceOf(
|
|
23
|
+
expect(isInstanceOf(View.View, debugObjects.view)).toBeTruthy();
|
|
23
24
|
expect(debugObjects.projection).toBeInstanceOf(ProjectionModel);
|
|
24
25
|
return debugObjects;
|
|
25
26
|
};
|
|
@@ -41,7 +42,7 @@ describe('ViewEditor', () => {
|
|
|
41
42
|
test('renders view editor', async () => {
|
|
42
43
|
await Default.run();
|
|
43
44
|
await waitForViewEditor();
|
|
44
|
-
expect(screen.getByText('
|
|
45
|
+
expect(screen.getByText('Record type')).toBeInTheDocument();
|
|
45
46
|
});
|
|
46
47
|
|
|
47
48
|
test('change property name', async () => {
|
|
@@ -133,14 +134,15 @@ describe('ViewEditor', () => {
|
|
|
133
134
|
expect(addedPropertyProjection!.props.property).toBe('added_property');
|
|
134
135
|
});
|
|
135
136
|
|
|
136
|
-
|
|
137
|
+
// TODO(mykola): Fix flaky test.
|
|
138
|
+
test('delete property', { retry: 2 }, async () => {
|
|
137
139
|
await Default.run();
|
|
138
140
|
await waitForViewEditor();
|
|
139
141
|
|
|
140
142
|
// Find the delete button for the 'name' property.
|
|
141
143
|
const nameProperty = screen.getByText('name');
|
|
142
144
|
const propertyRow = nameProperty.closest('[role="listitem"]');
|
|
143
|
-
const deleteButton = propertyRow?.querySelector('
|
|
145
|
+
const deleteButton = propertyRow?.querySelector('[data-testid="field.delete"]');
|
|
144
146
|
|
|
145
147
|
if (!deleteButton) {
|
|
146
148
|
throw new Error('Delete button not found');
|
|
@@ -188,19 +190,15 @@ describe('ViewEditor', () => {
|
|
|
188
190
|
// Access the live objects directly from window using symbol.
|
|
189
191
|
const debugObjects = getViewEditorDebugObjects();
|
|
190
192
|
|
|
191
|
-
// Check that hiddenFields is non-empty.
|
|
192
|
-
expect(debugObjects.view.projection.hiddenFields).toBeDefined();
|
|
193
|
-
expect(debugObjects.view.projection.hiddenFields!.length).toBeGreaterThan(0);
|
|
194
|
-
|
|
195
193
|
// Click the show button
|
|
196
194
|
fireEvent.click(screen.getByTestId('show-field-button'));
|
|
197
195
|
|
|
198
196
|
// Wait for the data to update and check that hiddenFields is empty.
|
|
199
197
|
await waitFor(() => {
|
|
200
|
-
expect(debugObjects.view.projection.
|
|
198
|
+
expect(debugObjects.view.projection.fields.filter(({ visible }) => visible === false)!.length).toBe(0);
|
|
201
199
|
});
|
|
202
200
|
|
|
203
201
|
// Also verify that the field is back in the visible fields list.
|
|
204
|
-
expect(debugObjects.view.projection.fields.length).toBeGreaterThan(0);
|
|
202
|
+
expect(debugObjects.view.projection.fields.filter(({ visible }) => visible !== false).length).toBeGreaterThan(0);
|
|
205
203
|
});
|
|
206
|
-
});
|
|
204
|
+
}, 30_000);
|