aio-table 13.0.0 → 14.0.1

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 (5) hide show
  1. package/filter.css +100 -63
  2. package/index.css +11 -31
  3. package/index.d.ts +144 -97
  4. package/index.js +418 -441
  5. package/package.json +1 -1
package/filter.css CHANGED
@@ -1,36 +1,25 @@
1
- .aio-filter-modal-size>.aio-popup {
1
+ .aio-table-filter-modal-size>.aio-popup {
2
2
  padding: 12px;
3
3
  width: 100vw;
4
4
  max-width: 772px;
5
5
  max-height: 100vh;
6
6
  }
7
7
 
8
- .aio-filter-add-button {
8
+ .aio-table-filter-button {
9
9
  display: flex;
10
10
  align-items: center;
11
11
  gap: 3px;
12
12
  border: none;
13
13
  background: none;
14
14
  height: 24px;
15
- font-size: 12px;
16
- cursor: pointer;
17
- }
18
-
19
- .aio-filter-icon-button {
20
- display: flex;
21
- align-items: center;
22
- justify-content: center;
23
- width: 36px;
24
- height: 36px;
25
- border-radius: 4px;
26
- border: none;
15
+ font-size: inherit;
27
16
  cursor: pointer;
28
17
  }
29
- .aio-filter-remove-button{
18
+ .aio-table-filter-remove-button{
30
19
  background:none;
31
20
  flex-shrink:0;
32
21
  }
33
- .aio-filter-button {
22
+ .aio-table-filter-button {
34
23
  background: none;
35
24
  border: none;
36
25
  display: flex;
@@ -46,7 +35,7 @@
46
35
  position: relative;
47
36
  }
48
37
 
49
- .aio-filter-badge {
38
+ .aio-table-filter-badge {
50
39
  background: orange;
51
40
  color: #fff;
52
41
  min-width: 16px;
@@ -61,40 +50,41 @@
61
50
  right: -3px;
62
51
  }
63
52
 
64
- .aio-filter-modal .aio-popup-header {
53
+ .aio-table-filter-modal .aio-popup-header {
65
54
  height: 36px;
66
55
  }
67
56
 
68
- .aio-filter-body {
69
- padding: 6px;
70
- gap: 12px;
57
+ .aio-table-filter-body {
58
+ gap: 0.8em;
71
59
  display: flex;
72
60
  flex-direction: column;
61
+ padding:0.8em;
73
62
  }
74
- .aio-filter-body-rtl{
63
+ .aio-table-filter-body-rtl{
75
64
  direction:rtl;
76
65
  }
77
66
 
78
- .aio-filter-body .af-current-filters {
67
+ .aio-table-filter-body .aio-table-current-filters {
79
68
  display: flex;
80
69
  flex-direction: column;
81
70
  }
82
- .aio-filter-body .af-current-filters .aio-input{
71
+ .aio-table-filter-body .aio-table-current-filters .aio-input{
83
72
  min-height:36px;
84
73
  }
85
74
 
86
- .aio-filter-body .af-filter-collections {
75
+ .aio-table-filter-body .aio-table-saved-filters {
87
76
  width: 100%;
88
77
  display: flex;
89
78
  flex-direction: column;
90
79
  gap: 6px;
91
80
  height: 100%;
81
+ padding:0.4em;
92
82
  }
93
83
 
94
- .aio-filter-body .af-filter-collections .af-collection {
84
+ .aio-table-filter-body .aio-table-saved-filters .aio-table-saved-filter {
95
85
  display: flex;
96
86
  flex-direction: column;
97
- background: #f8f8f8;
87
+ background: #eee;
98
88
  flex-shrink: 0;
99
89
  border: 1px solid #f4f4f4;
100
90
  border-radius: 6px;
@@ -102,69 +92,63 @@
102
92
  color: #333;
103
93
  }
104
94
 
105
- .aio-filter-button:disabled {
95
+ .aio-table-filter-button:disabled {
106
96
  opacity: 0.5;
107
97
  cursor: not-allowed;
108
98
  }
109
99
 
110
- .aio-filter-active-button {
100
+ .aio-table-filter-active-button {
111
101
  background: #0069ff;
112
102
  color: #fff;
113
103
  }
114
104
 
115
- .aio-filter-panel {
105
+ .aio-table-filter-panel {
116
106
  position: relative;
117
- padding: 6px;
118
107
  display: flex;
119
108
  flex-direction: column;
120
109
  border: 1px solid #ddd;
121
110
  border-radius: 6px;
122
111
  }
123
- .aio-filter-panel button{
124
- color:inherit;
125
- }
126
-
127
- .af-collections-empty {
112
+ .aio-table-saved-filters-empty {
128
113
  font-size: 12px;
129
114
  width: 100%;
130
115
  display: flex;
131
116
  justify-content: center;
132
117
  }
133
118
 
134
- .aio-filter-panel-header {
119
+ .aio-table-filter-panel-header {
135
120
  display: flex;
136
121
  align-items: center;
122
+ padding:0 0.8em;
123
+ height:3em;
137
124
  }
138
125
 
139
- .aio-filter-panel-label {
126
+ .aio-table-filter-panel-label {
140
127
  flex: 1;
141
- font-weight: bold;
142
- font-size: 12px;
143
- margin-bottom:12px;
144
128
  }
145
129
 
146
- .aio-filter-row {
130
+ .aio-table-filter-row {
147
131
  display: flex;
148
132
  align-items: center;
149
- gap: 3px;
150
- padding:3px;
133
+ gap: 0.4em;
134
+ padding:0.4em;
135
+ margin:0.4em;
136
+ margin-top:0;
151
137
  background:#f2f2f2;
152
138
  border-radius:6px;
153
139
  position: relative;
154
- margin-bottom:6px;
155
- overflow-x: hidden;
156
140
  }
157
141
 
158
- .aio-filter-row .aio-input {
142
+ .aio-table-filter-row .aio-input {
159
143
  flex: 1;
160
144
  padding:0 12px;
161
145
  }
162
- .aio-filter-row .aio-input.aio-filter-operator-select{
146
+ .aio-table-filter-row .aio-input.aio-table-filter-operator-select{
163
147
  flex:none;
164
- width:108px;
148
+ width:10em;
165
149
  }
166
150
 
167
- .aio-filter-toolbar {
151
+ .aio-table-filter-toolbar {
168
152
  display: flex;
169
153
  align-items: center;
170
154
  justify-content: center;
@@ -172,34 +156,60 @@
172
156
  }
173
157
 
174
158
 
175
- .aio-filter-save-modal {
159
+ .aio-table-filter-save-modal {
176
160
  padding: 12px;
177
161
  display: flex;
178
162
  flex-direction: column;
179
163
  gap: 12px;
180
164
  }
181
165
 
182
- .aio-filter-save-modal-footer {
166
+ .aio-table-filter-save-modal-footer {
183
167
  display: flex;
184
168
  gap: 6px;
185
169
  }
186
170
 
187
171
 
188
- .aio-filter-backdrop {
172
+ .aio-table-filter-backdrop {
189
173
  background: rgba(0, 0, 0, 0.7);
190
174
  }
191
175
 
192
176
 
193
177
 
194
178
 
195
- .aio-filter-row .aio-input{
179
+ .aio-table-filter-row .aio-input{
196
180
  border:none;
197
181
  }
198
182
 
199
183
  /*******************************tags**************************************/
184
+ .aio-table-filter-tags{
185
+ padding:0.4em;
186
+ border-radius:4px;
187
+ display:flex;
188
+ flex-wrap:wrap;
189
+ gap:0.4em
190
+ }
191
+ .aio-table-filter-tag{
192
+ color: #666;
193
+ width: fit-content;
194
+ display: flex;
195
+ align-items: center;
196
+ overflow: hidden;
197
+ white-space: nowrap;
198
+ max-width: 100%;
199
+ cursor: pointer;
200
+ background: #fff;
201
+ flex-shrink: 0;
202
+ gap: 0.4em;
203
+ font-size:0.9em;
204
+ border-radius:0.2em;
205
+ padding:0.2em 0.8em;
206
+ }
207
+ .aio-table-filter-panel{
208
+ background:#fff;
209
+ }
200
210
  /*************************************************************************/
201
211
  /*******************************saved filter******************************/
202
- .af-collection {
212
+ .aio-table-saved-filter {
203
213
  display: flex;
204
214
  flex-direction: column;
205
215
  background: #f8f8f8;
@@ -210,15 +220,20 @@
210
220
  color: #333;
211
221
  }
212
222
 
213
- .af-collection-header {
214
- height: 36px;
223
+ .aio-table-saved-filter-header {
224
+ height: 3em;
215
225
  display: flex;
216
226
  align-items: center;
217
- gap: 6px;
227
+ gap: 0.4em;
218
228
  padding: 0 12px;
219
229
  }
220
-
221
- .af-collection-remove {
230
+ .aio-table-saved-filters-empty{
231
+ height:4em;
232
+ display:flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ }
236
+ .aio-table-filter-remove-button {
222
237
  position: absolute;
223
238
  background: #fff;
224
239
  width: 24px;
@@ -232,14 +247,36 @@
232
247
  cursor:pointer;
233
248
  }
234
249
 
235
- .af-collection-body {
250
+ .aio-table-saved-filter-body {
236
251
  display: flex;
237
252
  gap: 6px;
238
- padding: 6px;
253
+ padding: 0.4em;
254
+ padding-top:0;
239
255
  }
240
256
 
241
- .af-collection-name {
257
+ .aio-table-saved-filter-name {
242
258
  flex: 1;
243
259
  padding-inline-start: 16px;
244
260
  }
245
261
  /*************************************************************************/
262
+ .aio-table-saved-filter .ai-form-tags{
263
+ padding:0.4em;
264
+ border-radius:4px;
265
+ }
266
+
267
+
268
+ .aio-table-filter-inline-label{
269
+ flex:1;
270
+ padding:0 12px;
271
+ box-sizing: border-box;
272
+ }
273
+ .aio-table-filter-label{
274
+ top:0;
275
+ z-index:10;
276
+ padding:0 12px;
277
+ box-sizing: border-box;
278
+ }
279
+ .aio-table-filter-modal .aio-popup{
280
+ background:#ddd;
281
+ max-width: 772px !important;
282
+ }
package/index.css CHANGED
@@ -3,7 +3,6 @@
3
3
  --aio-table-color: #0069ff;
4
4
  --aio-table-transition: 0.3s;
5
5
  }
6
-
7
6
  .aio-table-rtl {
8
7
  direction: rtl;
9
8
  }
@@ -35,7 +34,6 @@
35
34
  .aio-table {
36
35
  box-sizing: border-box;
37
36
  border-radius: 4px;
38
- font-size: 12px;
39
37
  height: fit-content;
40
38
  display: flex;
41
39
  flex-direction: column;
@@ -72,7 +70,8 @@
72
70
  .aio-table-title {
73
71
  padding: 0 12px;
74
72
  font-weight: bold;
75
- height: 36px;
73
+ height: 3em;
74
+ gap:0.4em;
76
75
  display: flex;
77
76
  align-items: center;
78
77
  box-sizing: border-box;
@@ -92,7 +91,7 @@
92
91
  .aio-table-row {
93
92
  display: flex;
94
93
  min-width: fit-content;
95
- height:40px;
94
+ height:3em;
96
95
  }
97
96
  .aio-table-cell {
98
97
  padding: 6px 12px;
@@ -164,9 +163,9 @@
164
163
  background: #f8f8f8;
165
164
  z-index: 100;
166
165
  box-sizing: border-box;
167
- min-height: 36px;
168
- gap: 6px;
169
- padding: 6px;
166
+ height:3em;
167
+ gap: 0.4em;
168
+ padding: 0.4em;
170
169
  }
171
170
 
172
171
  .aio-table-toolbar-content {
@@ -178,16 +177,17 @@
178
177
  }
179
178
 
180
179
  .aio-table-toolbar-button {
181
- height: 36px;
180
+ width:3em;
181
+ height: 3em;
182
182
  display: flex;
183
183
  align-items: center;
184
184
  justify-content: center;
185
- width: 36px;
186
185
  border: 1px solid #ddd;
187
186
  background:#fff;
188
187
  border-radius:100%;
189
- width:36px;
190
188
  padding:0 !important;
189
+ font-size:inherit;
190
+ flex-shrink:0;
191
191
  }
192
192
  .aio-table-remove {
193
193
  border: none;
@@ -218,32 +218,12 @@
218
218
  .aio-table-search {
219
219
  flex: 1;
220
220
  height: 100%;
221
- padding: 6px;
222
221
  box-sizing: border-box;
222
+ border:none;
223
223
  }
224
224
 
225
225
  .aio-table-search .aio-input {
226
226
  background: #fff;
227
227
  border: none;
228
- min-height: 30px;
229
228
  }
230
229
 
231
- .aio-filter-inline-label{
232
- flex:1;
233
- padding:0 12px;
234
- box-sizing: border-box;
235
- }
236
- .aio-filter-label{
237
- top:0;
238
- z-index:10;
239
- padding:0 12px;
240
- font-size:12px;
241
- box-sizing: border-box;
242
- }
243
- .aio-filter-modal .aio-popup{
244
- background:#ddd;
245
- max-width: 772px !important;
246
- }
247
- .af-current-filters .aio-input{
248
- min-width:168px;
249
- }
package/index.d.ts CHANGED
@@ -1,90 +1,149 @@
1
1
  import { type ReactNode } from "react";
2
- import { I_AIOInput,I_formInput } from "aio-input";
2
+ import { type I_AIOInput } from "aio-input";
3
3
  import "./index.css";
4
4
  type I_rowOption<T, R> = (p: I_rowDetail<T>) => R;
5
- type I_cellOption<T, R> = ((p: I_cellDetail<T>) => R) | string;
6
5
  type I_rowDetail<T> = {
7
6
  row: T;
8
7
  rowIndex: number;
9
- isFirst: boolean;
10
- isLast: boolean;
11
- };
12
- type I_cellDetail<T> = I_rowDetail<T> & {
13
- column: I_table_column<T>;
14
- change: (newRow: T) => void;
15
- date: number[];
16
8
  };
17
9
  export type I_table_column<T> = {
18
- jalali?: boolean;
19
10
  title?: any;
20
11
  sort?: true | I_table_sort<T>;
21
12
  filter?: boolean;
22
13
  search?: boolean;
23
- id: string;
24
14
  width?: any;
25
15
  minWidth?: any;
16
+ id: string;
26
17
  excel?: string | boolean;
27
18
  justify?: boolean;
28
- value?: string;
29
- attrs?: I_cellOption<T, {
30
- [attrs: string]: any;
31
- }>;
32
- before?: I_cellOption<T, ReactNode>;
33
- after?: I_cellOption<T, ReactNode>;
34
- subtext?: I_cellOption<T, ReactNode>;
35
- template?: I_cellOption<T, ReactNode>;
36
- titleAttrs?: {
37
- [attrs: string]: any;
38
- };
39
- type?: 'text' | 'number' | 'date' | 'select' | 'multiSelect' | 'checkbox';
40
19
  filterInput?: I_AIOInput & {
41
20
  type: I_table_column<any>["type"];
42
21
  label?: string;
43
22
  };
44
23
  filterOperators?: ('less' | 'lessequal' | 'more' | 'moreequal' | 'equal' | 'notEqual' | 'contain' | 'notContain')[];
45
24
  show?: boolean;
46
- pattern?: string;
47
- data?: any;
48
25
  toggle?: boolean;
26
+ data?: any;
27
+ type?: 'text' | 'number' | 'date' | 'jalaliDate' | 'select' | 'multiSelect' | 'checkbox';
28
+ template?: string | ((p: {
29
+ row: T;
30
+ column: I_table_column<T>;
31
+ rowIndex: number;
32
+ change: (newRow: T) => void;
33
+ value: any;
34
+ dateObject?: {
35
+ year: number;
36
+ month: number;
37
+ day: number;
38
+ hour: number;
39
+ minute: number;
40
+ second: number;
41
+ };
42
+ }) => ReactNode | undefined);
43
+ before?: string | ((p: {
44
+ row: T;
45
+ column: I_table_column<T>;
46
+ rowIndex: number;
47
+ change: (newRow: T) => void;
48
+ value: any;
49
+ dateObject?: {
50
+ year: number;
51
+ month: number;
52
+ day: number;
53
+ hour: number;
54
+ minute: number;
55
+ second: number;
56
+ };
57
+ }) => ReactNode | undefined);
58
+ after?: string | ((p: {
59
+ row: T;
60
+ column: I_table_column<T>;
61
+ rowIndex: number;
62
+ change: (newRow: T) => void;
63
+ value: any;
64
+ dateObject?: {
65
+ year: number;
66
+ month: number;
67
+ day: number;
68
+ hour: number;
69
+ minute: number;
70
+ second: number;
71
+ };
72
+ }) => ReactNode | undefined);
73
+ subtext?: string | ((p: {
74
+ row: T;
75
+ column: I_table_column<T>;
76
+ rowIndex: number;
77
+ change: (newRow: T) => void;
78
+ value: any;
79
+ dateObject?: {
80
+ year: number;
81
+ month: number;
82
+ day: number;
83
+ hour: number;
84
+ minute: number;
85
+ second: number;
86
+ };
87
+ }) => ReactNode | undefined);
88
+ value?: string | ((p: {
89
+ row: T;
90
+ column: I_table_column<T>;
91
+ rowIndex: number;
92
+ }) => string | undefined);
93
+ pattern?: string;
94
+ affix?: string;
95
+ prefix?: string;
96
+ cellAttrs?: (p: {
97
+ row: T;
98
+ column: I_table_column<T>;
99
+ value: any;
100
+ rowIndex: number;
101
+ }) => any;
102
+ titleAttrs?: (column: I_table_column<T>) => any;
103
+ };
104
+ export type I_table_filter_saved = {
105
+ name: string;
106
+ data: any;
107
+ };
108
+ export type I_table_filter = {
109
+ onChange?: (newFilters: I_table_filter_item[]) => boolean;
110
+ getSavedItems?: () => Promise<{
111
+ name: string;
112
+ data: any;
113
+ }[]>;
114
+ setSavedItems?: (savedItems: {
115
+ name: string;
116
+ data: any;
117
+ }[]) => Promise<boolean>;
118
+ items?: I_table_filter_item[];
119
+ modalAttrs?: any;
120
+ cache?: string;
121
+ };
122
+ export type I_table_filter_item = {
123
+ columnId: string;
124
+ value: any;
125
+ operator?: 'less' | 'lessequal' | 'more' | 'moreequal' | 'equal' | 'notEqual' | 'contain' | 'notContain';
126
+ id: string;
49
127
  };
50
128
  export type I_table<T> = {
129
+ inlineSort?: boolean;
51
130
  fa?: boolean;
52
131
  addText?: ReactNode | ((value: any) => ReactNode);
53
132
  columns?: I_table_column<T>[];
54
133
  excel?: string | ((value: any[]) => any[]);
55
- getValue?: {
56
- [key: string]: (p: {
57
- row: T;
58
- column: I_table_column<T>;
59
- rowIndex: number;
60
- change: (newRow: T) => void;
61
- }) => any;
62
- };
63
134
  headerAttrs?: any;
64
- onAdd?: () => Promise<T | undefined>;
65
- onRemove?: (p: {
66
- row: T;
67
- rowIndex?: number;
68
- }) => Promise<boolean>;
69
135
  onChangePaging?: (newPaging: I_table_paging) => void;
70
136
  onChangeSort?: (sorts: I_table_sort<T>[]) => Promise<boolean>;
71
- onSwap?: true | ((newValue: T[], startRow: T, endRow: T) => void);
137
+ onSwap?: (newValue: T[], startRow: T, endRow: T) => void;
72
138
  onSearch?: true | ((searchValue: string) => void);
73
139
  paging?: I_table_paging;
74
140
  removeText?: string;
75
- rowOption?: {
76
- before?: I_rowOption<T, ReactNode>;
77
- after?: I_rowOption<T, ReactNode>;
78
- attrs?: I_rowOption<T, {
79
- [attrs: string]: any;
80
- }>;
81
- template?: I_rowOption<T, ReactNode>;
82
- };
83
- cellAttrs?: string | ((p: {
84
- row: T;
85
- column: I_table_column<T>;
86
- rowIndex: number;
87
- }) => any);
141
+ rowAttrs?: I_rowOption<T, {
142
+ [attrs: string]: any;
143
+ }>;
144
+ rowBefore?: I_rowOption<T, ReactNode>;
145
+ rowAfter?: I_rowOption<T, ReactNode>;
146
+ rowTemplate?: I_rowOption<T, ReactNode>;
88
147
  rowsTemplate?: (rows: T[]) => ReactNode;
89
148
  toolbar?: ReactNode | (() => ReactNode);
90
149
  toolbarAttrs?: any;
@@ -95,14 +154,41 @@ export type I_table<T> = {
95
154
  style?: any;
96
155
  attrs?: any;
97
156
  placeholder?: ReactNode;
98
- columnsFilter?: I_table_columns_filter;
99
- formFilter?: I_table_form_filter;
157
+ filter?: I_table_filter;
100
158
  gap?: [number, number];
101
159
  striped?: [string, string];
160
+ onChangeColumns?: (v: I_table_column<any>[]) => void;
102
161
  columnOption?: {
103
- [key in keyof I_table_column<any>]?: (p: I_cellDetail<any>) => any;
162
+ [key in keyof I_table_column<T>]?: (p: {
163
+ column: I_table_column<T>;
164
+ row: T;
165
+ rowIndex: number;
166
+ }) => any;
104
167
  };
105
- onChangeColumns?: (v: I_table_column<any>[]) => void;
168
+ templates?: {
169
+ [key: string]: (p: {
170
+ row: T;
171
+ column: I_table_column<T>;
172
+ rowIndex: number;
173
+ change: (newRow: T) => void;
174
+ value: any;
175
+ dateObject?: {
176
+ year: number;
177
+ month: number;
178
+ day: number;
179
+ hour: number;
180
+ minute: number;
181
+ second: number;
182
+ };
183
+ }) => ReactNode;
184
+ };
185
+ cellAttrs?: (p: {
186
+ row: T;
187
+ column: I_table_column<T>;
188
+ value: any;
189
+ rowIndex: number;
190
+ }) => any;
191
+ titleAttrs?: (column: I_table_column<T>) => any;
106
192
  };
107
193
  declare const AIOTable: <T>(props: I_table<T>) => import("react/jsx-runtime").JSX.Element;
108
194
  export default AIOTable;
@@ -126,6 +212,8 @@ export declare const useSort: <T>(p: {
126
212
  getSortedRows: (rows: T[]) => T[];
127
213
  changeSort: (sortId: string, changeObject: Partial<I_table_sort<T>>) => void;
128
214
  changeSorts: (sorts: I_table_sort<T>[]) => Promise<void>;
215
+ renderSortArrow: (option: I_table_sort<T> | false, inline?: boolean) => import("react/jsx-runtime").JSX.Element;
216
+ getSortByColumn: (column: I_table_column<T>) => I_table_sort<T> | false;
129
217
  };
130
218
  export type I_table_paging = {
131
219
  serverSide?: boolean;
@@ -139,44 +227,3 @@ export type I_pagingHook<T> = {
139
227
  getPagedRows: (rows: T[]) => T[];
140
228
  changePaging: (obj: Partial<I_table_paging>) => void;
141
229
  };
142
- export declare const usePaging: <T>(p: {
143
- rows: T[];
144
- paging?: I_table_paging;
145
- onChange?: (newPaging: I_table_paging) => void;
146
- }) => I_pagingHook<T>;
147
- export type I_table_filter_saved = {
148
- name: string;
149
- data: any;
150
- };
151
- export type I_table_columns_filter = {
152
- onChange?: (newFilters: I_table_columns_filter_item[]) => boolean;
153
- getSavedItems?: () => Promise<{
154
- name: string;
155
- data: any;
156
- }[]>;
157
- setSavedItems?: (savedItems: {
158
- name: string;
159
- data: any;
160
- }[]) => Promise<boolean>;
161
- items?: I_table_columns_filter_item[];
162
- after?: () => ReactNode;
163
- };
164
- export type I_table_form_filter = {
165
- onChange?: (obj: any) => boolean;
166
- getSavedItems?: () => Promise<{
167
- name: string;
168
- data: any;
169
- }[]>;
170
- setSavedItems?: (saved: {
171
- name: string;
172
- data: any;
173
- }[]) => Promise<boolean>;
174
- items?: I_formInput<any>[];
175
- value?: any;
176
- };
177
- export type I_table_columns_filter_item = {
178
- columnId: string;
179
- value: any;
180
- operator?: 'less' | 'lessequal' | 'more' | 'moreequal' | 'equal' | 'notEqual' | 'contain' | 'notContain';
181
- id: string;
182
- };