@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.
@@ -8,13 +8,22 @@
8
8
  */
9
9
 
10
10
  import { SettingOutlined } from '@ant-design/icons';
11
- import { AddSubModelButton, DragOverlayConfig, FlowSettingsButton, observable } from '@nocobase/flow-engine';
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: -12, height: 24 },
32
- after: { offsetTop: 7, height: 24 },
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: 0, height: 24 },
42
- below: { offsetTop: -14, height: 24 },
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 rawCurrentRows = (this.props.rows || {}) as Record<string, string[][]>;
66
- const rawSavedRows = (params.rows || {}) as Record<string, string[][]>;
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 this.normalizeRowsWithOrder(sourceRows, sourceRowOrder);
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.setProps('rows', fullRows);
122
- this.setProps('rowOrder', rowOrder);
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.setProps('rows', limitedRows);
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, FlowSettingsButton, DragOverlayConfig } from '@nocobase/flow-engine';
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: -12, height: 24 },
39
- after: { offsetTop: 7, height: 24 },
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: 0, height: 24 },
49
- below: { offsetTop: -14, height: 24 },
48
+ above: { offsetTop: -2, height: 24 },
49
+ below: { offsetTop: -12, height: 24 },
50
50
  },
51
51
  };
52
52
  renderAddSubModelButton() {