@nocobase/client-v2 2.1.0-beta.23 → 2.1.0-beta.24
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/es/flow/components/Grid/index.d.ts +5 -3
- package/es/flow/models/base/GridModel.d.ts +19 -2
- package/es/flow/models/blocks/filter-form/FilterFormGridModel.d.ts +1 -0
- package/es/index.mjs +88 -88
- package/lib/index.js +82 -82
- package/package.json +5 -5
- package/src/flow/components/Grid/index.tsx +66 -20
- package/src/flow/models/base/BlockGridModel.tsx +2 -2
- package/src/flow/models/base/GridModel.tsx +428 -195
- package/src/flow/models/base/__tests__/BlockGridModel.dragOverlayConfig.test.ts +44 -0
- package/src/flow/models/base/__tests__/GridModel.computeOverlayRect.test.ts +29 -0
- package/src/flow/models/base/__tests__/GridModel.dragSnapshotContainer.test.ts +181 -2
- package/src/flow/models/base/__tests__/GridModel.resizeLayout.test.ts +124 -0
- package/src/flow/models/base/__tests__/GridModel.visibleLayout.test.ts +55 -15
- package/src/flow/models/blocks/details/DetailsGridModel.tsx +6 -6
- package/src/flow/models/blocks/filter-form/FilterFormGridModel.tsx +54 -14
- package/src/flow/models/blocks/filter-form/__tests__/FilterFormGridModel.toggleFormFieldsCollapse.test.ts +45 -0
- package/src/flow/models/blocks/form/FormGridModel.tsx +6 -6
|
@@ -8,13 +8,22 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { SettingOutlined } from '@ant-design/icons';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
AddSubModelButton,
|
|
13
|
+
DragOverlayConfig,
|
|
14
|
+
FlowSettingsButton,
|
|
15
|
+
GridLayoutV2,
|
|
16
|
+
normalizeGridLayout,
|
|
17
|
+
observable,
|
|
18
|
+
projectLayoutToLegacyRows,
|
|
19
|
+
} from '@nocobase/flow-engine';
|
|
12
20
|
import React from 'react';
|
|
13
21
|
import { CollectionBlockModel, GRID_FLOW_KEY, GRID_STEP, GridModel } from '../../base';
|
|
14
22
|
import { getAllDataModels } from '../filter-manager/utils';
|
|
15
23
|
import { FilterFormItemModel } from './FilterFormItemModel';
|
|
16
24
|
|
|
17
25
|
export class FilterFormGridModel extends GridModel {
|
|
26
|
+
private fullLayoutBeforeCollapse?: GridLayoutV2;
|
|
18
27
|
itemSettingsMenuLevel = 2;
|
|
19
28
|
itemFlowSettings = {
|
|
20
29
|
showBackground: true,
|
|
@@ -28,8 +37,8 @@ export class FilterFormGridModel extends GridModel {
|
|
|
28
37
|
dragOverlayConfig: DragOverlayConfig = {
|
|
29
38
|
// 列内插入
|
|
30
39
|
columnInsert: {
|
|
31
|
-
before: { offsetTop: -
|
|
32
|
-
after: { offsetTop:
|
|
40
|
+
before: { offsetTop: -6, height: 24 },
|
|
41
|
+
after: { offsetTop: 3, height: 24 },
|
|
33
42
|
},
|
|
34
43
|
// 列边缘
|
|
35
44
|
columnEdge: {
|
|
@@ -38,8 +47,8 @@ export class FilterFormGridModel extends GridModel {
|
|
|
38
47
|
},
|
|
39
48
|
// 行间隙
|
|
40
49
|
rowGap: {
|
|
41
|
-
above: { offsetTop:
|
|
42
|
-
below: { offsetTop: -
|
|
50
|
+
above: { offsetTop: -2, height: 24 },
|
|
51
|
+
below: { offsetTop: -12, height: 24 },
|
|
43
52
|
},
|
|
44
53
|
};
|
|
45
54
|
|
|
@@ -62,8 +71,16 @@ export class FilterFormGridModel extends GridModel {
|
|
|
62
71
|
*/
|
|
63
72
|
private getFullLayout() {
|
|
64
73
|
const params = this.getStepParams(GRID_FLOW_KEY, GRID_STEP) || {};
|
|
65
|
-
const
|
|
66
|
-
const
|
|
74
|
+
const currentLayout = this.props.layout ? this.getGridLayout() : undefined;
|
|
75
|
+
const savedLayout = params.layout ? this.normalizeLayoutFromSource(params) : undefined;
|
|
76
|
+
const currentProjection = currentLayout
|
|
77
|
+
? projectLayoutToLegacyRows(currentLayout)
|
|
78
|
+
: { rows: this.props.rows || {}, rowOrder: this.props.rowOrder };
|
|
79
|
+
const savedProjection = savedLayout
|
|
80
|
+
? projectLayoutToLegacyRows(savedLayout)
|
|
81
|
+
: { rows: params.rows || {}, rowOrder: params.rowOrder };
|
|
82
|
+
const rawCurrentRows = currentProjection.rows as Record<string, string[][]>;
|
|
83
|
+
const rawSavedRows = (savedProjection.rows || {}) as Record<string, string[][]>;
|
|
67
84
|
const currentCount = Object.keys(rawCurrentRows).length;
|
|
68
85
|
const savedCount = Object.keys(rawSavedRows).length;
|
|
69
86
|
const getItemCount = (rows: Record<string, string[][]>) =>
|
|
@@ -77,10 +94,13 @@ export class FilterFormGridModel extends GridModel {
|
|
|
77
94
|
currentCount > savedCount || (currentCount === savedCount && currentItemCount >= savedItemCount);
|
|
78
95
|
const sourceRows = this.mergeRowsWithItems(useCurrentLayout ? rawCurrentRows : rawSavedRows);
|
|
79
96
|
const sourceRowOrder = useCurrentLayout
|
|
80
|
-
? this.props.rowOrder || params.rowOrder
|
|
81
|
-
: params.rowOrder || this.props.rowOrder;
|
|
97
|
+
? currentProjection.rowOrder || this.props.rowOrder || params.rowOrder
|
|
98
|
+
: savedProjection.rowOrder || params.rowOrder || this.props.rowOrder;
|
|
82
99
|
|
|
83
|
-
return
|
|
100
|
+
return {
|
|
101
|
+
...this.normalizeRowsWithOrder(sourceRows, sourceRowOrder),
|
|
102
|
+
layout: useCurrentLayout ? currentLayout : savedLayout,
|
|
103
|
+
};
|
|
84
104
|
}
|
|
85
105
|
|
|
86
106
|
/**
|
|
@@ -115,17 +135,37 @@ export class FilterFormGridModel extends GridModel {
|
|
|
115
135
|
}
|
|
116
136
|
|
|
117
137
|
toggleFormFieldsCollapse(collapse: boolean, visibleRows: number) {
|
|
118
|
-
const { rows: fullRows, rowOrder } = this.getFullLayout();
|
|
138
|
+
const { rows: fullRows, rowOrder, layout } = this.getFullLayout();
|
|
119
139
|
|
|
120
140
|
if (!collapse) {
|
|
121
|
-
this.
|
|
122
|
-
|
|
141
|
+
const restoredLayout = this.fullLayoutBeforeCollapse || layout;
|
|
142
|
+
if (restoredLayout) {
|
|
143
|
+
this.syncLayoutProps(restoredLayout);
|
|
144
|
+
} else {
|
|
145
|
+
this.setProps('rows', fullRows);
|
|
146
|
+
this.setProps('rowOrder', rowOrder);
|
|
147
|
+
}
|
|
148
|
+
this.fullLayoutBeforeCollapse = undefined;
|
|
123
149
|
return;
|
|
124
150
|
}
|
|
125
151
|
|
|
152
|
+
if (!this.fullLayoutBeforeCollapse) {
|
|
153
|
+
this.fullLayoutBeforeCollapse =
|
|
154
|
+
layout ||
|
|
155
|
+
normalizeGridLayout({
|
|
156
|
+
rows: fullRows,
|
|
157
|
+
rowOrder,
|
|
158
|
+
itemUids: this.getItemUids(),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
126
162
|
const limitedRows = this.limitRowsByVisibleCount(fullRows, rowOrder, visibleRows);
|
|
163
|
+
const limitedLayout = normalizeGridLayout({
|
|
164
|
+
rows: limitedRows,
|
|
165
|
+
rowOrder,
|
|
166
|
+
});
|
|
127
167
|
|
|
128
|
-
this.
|
|
168
|
+
this.syncLayoutProps(limitedLayout);
|
|
129
169
|
this.setProps('rowOrder', rowOrder);
|
|
130
170
|
}
|
|
131
171
|
|
|
@@ -102,6 +102,51 @@ describe('FilterFormGridModel.toggleFormFieldsCollapse', () => {
|
|
|
102
102
|
expect(model.props.rowOrder).toEqual(['first']);
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
+
it('updates render layout when collapsing a v2 layout', () => {
|
|
106
|
+
const model = engine.createModel<FilterFormGridModel>({
|
|
107
|
+
uid: 'filter-grid-collapse-v2',
|
|
108
|
+
use: 'FilterFormGridModel',
|
|
109
|
+
props: {
|
|
110
|
+
layout: {
|
|
111
|
+
version: 2,
|
|
112
|
+
rows: [
|
|
113
|
+
{
|
|
114
|
+
id: 'first',
|
|
115
|
+
cells: [{ id: 'first-cell', items: ['field-1', 'field-2', 'field-3'] }],
|
|
116
|
+
sizes: [24],
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
structure: {} as any,
|
|
122
|
+
});
|
|
123
|
+
(model as any).subModels = {
|
|
124
|
+
items: [
|
|
125
|
+
engine.createModel({ use: 'FlowModel', uid: 'field-1' }),
|
|
126
|
+
engine.createModel({ use: 'FlowModel', uid: 'field-2' }),
|
|
127
|
+
engine.createModel({ use: 'FlowModel', uid: 'field-3' }),
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
model.setStepParams(GRID_FLOW_KEY, GRID_STEP, {
|
|
132
|
+
layout: model.props.layout,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
model.toggleFormFieldsCollapse(true, 1);
|
|
136
|
+
|
|
137
|
+
expect(model.props.rows).toEqual({
|
|
138
|
+
first: [['field-1']],
|
|
139
|
+
});
|
|
140
|
+
expect(model.props.layout.rows[0].cells[0].items).toEqual(['field-1']);
|
|
141
|
+
|
|
142
|
+
model.toggleFormFieldsCollapse(false, 1);
|
|
143
|
+
|
|
144
|
+
expect(model.props.rows).toEqual({
|
|
145
|
+
first: [['field-1', 'field-2', 'field-3']],
|
|
146
|
+
});
|
|
147
|
+
expect(model.props.layout.rows[0].cells[0].items).toEqual(['field-1', 'field-2', 'field-3']);
|
|
148
|
+
});
|
|
149
|
+
|
|
105
150
|
it('restores the persisted full layout when current props rows were already truncated', () => {
|
|
106
151
|
const model = engine.createModel<FilterFormGridModel>({
|
|
107
152
|
uid: 'filter-grid-collapse-restore',
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { SettingOutlined } from '@ant-design/icons';
|
|
11
|
-
import { AddSubModelButton,
|
|
11
|
+
import { AddSubModelButton, DragOverlayConfig, FlowSettingsButton } from '@nocobase/flow-engine';
|
|
12
|
+
import { Skeleton } from 'antd';
|
|
12
13
|
import React from 'react';
|
|
13
14
|
import { FieldModel } from '../../base/FieldModel';
|
|
14
15
|
import { GridModel } from '../../base/GridModel';
|
|
15
16
|
import { FormBlockModel } from './FormBlockModel';
|
|
16
|
-
import { Skeleton } from 'antd';
|
|
17
17
|
|
|
18
18
|
export type DefaultFormGridStructure = {
|
|
19
19
|
parent: FormBlockModel;
|
|
@@ -35,8 +35,8 @@ export class FormGridModel<T extends DefaultFormGridStructure = DefaultFormGridS
|
|
|
35
35
|
dragOverlayConfig: DragOverlayConfig = {
|
|
36
36
|
// 列内插入
|
|
37
37
|
columnInsert: {
|
|
38
|
-
before: { offsetTop: -
|
|
39
|
-
after: { offsetTop:
|
|
38
|
+
before: { offsetTop: -6, height: 24 },
|
|
39
|
+
after: { offsetTop: 3, height: 24 },
|
|
40
40
|
},
|
|
41
41
|
// 列边缘
|
|
42
42
|
columnEdge: {
|
|
@@ -45,8 +45,8 @@ export class FormGridModel<T extends DefaultFormGridStructure = DefaultFormGridS
|
|
|
45
45
|
},
|
|
46
46
|
// 行间隙
|
|
47
47
|
rowGap: {
|
|
48
|
-
above: { offsetTop:
|
|
49
|
-
below: { offsetTop: -
|
|
48
|
+
above: { offsetTop: -2, height: 24 },
|
|
49
|
+
below: { offsetTop: -12, height: 24 },
|
|
50
50
|
},
|
|
51
51
|
};
|
|
52
52
|
renderAddSubModelButton() {
|