@ramathibodi/nuxt-commons 4.0.12 → 4.0.13

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 (27) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/dialog/ImportProgress.d.vue.ts +35 -0
  3. package/dist/runtime/components/dialog/ImportProgress.vue +53 -0
  4. package/dist/runtime/components/dialog/ImportProgress.vue.d.ts +35 -0
  5. package/dist/runtime/components/document/TemplateBuilder.vue +112 -7
  6. package/dist/runtime/components/model/Pad.vue +2 -1
  7. package/dist/runtime/components/model/Table.d.vue.ts +79 -12
  8. package/dist/runtime/components/model/Table.vue +106 -3
  9. package/dist/runtime/components/model/Table.vue.d.ts +79 -12
  10. package/dist/runtime/components/model/iterator.d.vue.ts +117 -29
  11. package/dist/runtime/components/model/iterator.vue +117 -5
  12. package/dist/runtime/components/model/iterator.vue.d.ts +117 -29
  13. package/dist/runtime/composables/apiModel.d.ts +20 -1
  14. package/dist/runtime/composables/apiModel.js +24 -16
  15. package/dist/runtime/composables/document/template.d.ts +61 -0
  16. package/dist/runtime/composables/document/template.js +59 -0
  17. package/dist/runtime/composables/document/validateTemplate.d.ts +62 -0
  18. package/dist/runtime/composables/document/validateTemplate.js +378 -0
  19. package/dist/runtime/composables/graphqlModel.d.ts +20 -1
  20. package/dist/runtime/composables/graphqlModel.js +24 -16
  21. package/dist/runtime/composables/graphqlModelOperation.d.ts +1 -0
  22. package/dist/runtime/composables/importProgress.d.ts +34 -0
  23. package/dist/runtime/composables/importProgress.js +50 -0
  24. package/dist/runtime/utils/virtualize.d.ts +15 -0
  25. package/dist/runtime/utils/virtualize.js +10 -0
  26. package/package.json +2 -1
  27. package/scripts/validate-document-template.mjs +158 -0
@@ -32,6 +32,12 @@ interface Props extends /* @vue-ignore */ InstanceType<typeof VDataIterator['$pr
32
32
  autoRefresh?: number | boolean;
33
33
  autoRefreshDefault?: number;
34
34
  autoRefreshControl?: boolean;
35
+ importConcurrency?: number;
36
+ virtual?: boolean;
37
+ virtualThreshold?: number;
38
+ virtualHeight?: number | string;
39
+ virtualItemHeight?: number;
40
+ virtualItemsPerRow?: number;
35
41
  }
36
42
  /**
37
43
  * Public props accepted by ModelIterator.
@@ -43,7 +49,7 @@ declare var __VLS_15: {
43
49
  operation: {
44
50
  openDialog: typeof openDialog;
45
51
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
46
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
52
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
47
53
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
48
54
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
49
55
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -80,7 +86,7 @@ declare var __VLS_15: {
80
86
  operation: {
81
87
  openDialog: typeof openDialog;
82
88
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
83
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
89
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
84
90
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
85
91
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
86
92
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -92,15 +98,32 @@ declare var __VLS_15: {
92
98
  canDelete: boolean;
93
99
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
94
100
  };
95
- }, __VLS_38: {
101
+ }, __VLS_62: {
102
+ item: any;
103
+ operation: {
104
+ openDialog: typeof openDialog;
105
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
106
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
107
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
108
+ deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
109
+ reload: (() => Promise<void> | undefined) | (() => Promise<void>);
110
+ setSearch: ((keyword: string) => void) | ((keyword: string) => void);
111
+ canServerPageable: boolean;
112
+ canServerSearch: boolean;
113
+ canCreate: boolean;
114
+ canUpdate: boolean;
115
+ canDelete: boolean;
116
+ autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
117
+ };
118
+ }, __VLS_65: {
96
119
  color: string | undefined;
97
120
  isActive: boolean;
98
- }, __VLS_58: {}, __VLS_66: {
121
+ }, __VLS_85: {}, __VLS_93: {
99
122
  items: Record<string, any>[];
100
123
  operation: {
101
124
  openDialog: typeof openDialog;
102
125
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
103
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
126
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
104
127
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
105
128
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
106
129
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -131,9 +154,9 @@ declare var __VLS_15: {
131
154
  toggleGroup: ReturnType<typeof import("vuetify/lib/components/VDataTable/composables/group.mjs").provideGroupBy>["toggleGroup"];
132
155
  itemsCount: number;
133
156
  groupedItems: readonly (import("vuetify/lib/components/VDataIterator/composables/items.mjs").DataIteratorItem<Record<string, any>> | import("vuetify/lib/components/VDataTable/composables/group.mjs").Group<import("vuetify/lib/components/VDataIterator/composables/items.mjs").DataIteratorItem<Record<string, any>>> | import("vuetify/lib/components/VDataTable/composables/group.mjs").GroupSummary<import("vuetify/lib/components/VDataIterator/composables/items.mjs").DataIteratorItem<Record<string, any>>>)[];
134
- }, __VLS_92: {
157
+ }, __VLS_119: {
135
158
  reload: () => void;
136
- }, __VLS_102: {
159
+ }, __VLS_129: {
137
160
  enabled: import("vue").ComputedRef<boolean>;
138
161
  isActive: import("vue").ComputedRef<boolean>;
139
162
  isLoading: import("vue").ComputedRef<boolean>;
@@ -143,12 +166,12 @@ declare var __VLS_15: {
143
166
  togglePause: () => void;
144
167
  reset: () => void;
145
168
  reload: () => void | Promise<void>;
146
- }, __VLS_115: {
169
+ }, __VLS_142: {
147
170
  items: Record<string, any>[];
148
171
  operation: {
149
172
  openDialog: typeof openDialog;
150
173
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
151
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
174
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
152
175
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
153
176
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
154
177
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -160,12 +183,12 @@ declare var __VLS_15: {
160
183
  canDelete: boolean;
161
184
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
162
185
  };
163
- }, __VLS_128: {
186
+ }, __VLS_155: {
164
187
  items: Record<string, any>[];
165
188
  operation: {
166
189
  openDialog: typeof openDialog;
167
190
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
168
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
191
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
169
192
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
170
193
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
171
194
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -177,11 +200,11 @@ declare var __VLS_15: {
177
200
  canDelete: boolean;
178
201
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
179
202
  };
180
- }, __VLS_182: never, __VLS_183: {
203
+ }, __VLS_209: never, __VLS_210: {
181
204
  operation: {
182
205
  openDialog: typeof openDialog;
183
206
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
184
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
207
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
185
208
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
186
209
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
187
210
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -193,11 +216,11 @@ declare var __VLS_15: {
193
216
  canDelete: boolean;
194
217
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
195
218
  };
196
- }, __VLS_208: never, __VLS_209: {
219
+ }, __VLS_235: never, __VLS_236: {
197
220
  operation: {
198
221
  openDialog: typeof openDialog;
199
222
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
200
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
223
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
201
224
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
202
225
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
203
226
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -209,31 +232,60 @@ declare var __VLS_15: {
209
232
  canDelete: boolean;
210
233
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
211
234
  };
212
- }, __VLS_277: any;
235
+ }, __VLS_261: never, __VLS_262: {
236
+ operation: {
237
+ openDialog: typeof openDialog;
238
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
239
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
240
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
241
+ deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
242
+ reload: (() => Promise<void> | undefined) | (() => Promise<void>);
243
+ setSearch: ((keyword: string) => void) | ((keyword: string) => void);
244
+ canServerPageable: boolean;
245
+ canServerSearch: boolean;
246
+ canCreate: boolean;
247
+ canUpdate: boolean;
248
+ canDelete: boolean;
249
+ autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
250
+ };
251
+ }, __VLS_330: any, __VLS_332: {
252
+ isImporting: boolean;
253
+ total: number;
254
+ processed: number;
255
+ succeeded: number;
256
+ failed: number;
257
+ percent: number;
258
+ };
213
259
  type __VLS_Slots = {} & {
214
- [K in NonNullable<typeof __VLS_182>]?: (props: typeof __VLS_183) => any;
260
+ [K in NonNullable<typeof __VLS_209>]?: (props: typeof __VLS_210) => any;
215
261
  } & {
216
- [K in NonNullable<typeof __VLS_208>]?: (props: typeof __VLS_209) => any;
262
+ [K in NonNullable<typeof __VLS_235>]?: (props: typeof __VLS_236) => any;
263
+ } & {
264
+ [K in NonNullable<typeof __VLS_261>]?: (props: typeof __VLS_262) => any;
217
265
  } & {
218
266
  default?: (props: typeof __VLS_15) => any;
219
267
  } & {
220
268
  item?: (props: typeof __VLS_35) => any;
221
269
  } & {
222
- loader?: (props: typeof __VLS_38) => any;
270
+ item?: (props: typeof __VLS_62) => any;
271
+ } & {
272
+ loader?: (props: typeof __VLS_65) => any;
223
273
  } & {
224
- loaderItem?: (props: typeof __VLS_58) => any;
274
+ loaderItem?: (props: typeof __VLS_85) => any;
225
275
  } & {
226
- header?: (props: typeof __VLS_66) => any;
276
+ header?: (props: typeof __VLS_93) => any;
227
277
  } & {
228
- title?: (props: typeof __VLS_92) => any;
278
+ title?: (props: typeof __VLS_119) => any;
229
279
  } & {
230
- autoRefreshControl?: (props: typeof __VLS_102) => any;
280
+ autoRefreshControl?: (props: typeof __VLS_129) => any;
231
281
  } & {
232
- search?: (props: typeof __VLS_115) => any;
282
+ search?: (props: typeof __VLS_142) => any;
233
283
  } & {
234
- toolbarItems?: (props: typeof __VLS_128) => any;
284
+ toolbarItems?: (props: typeof __VLS_155) => any;
235
285
  } & {
236
- form?: (props: typeof __VLS_277) => any;
286
+ form?: (props: typeof __VLS_330) => any;
287
+ } & {
288
+ importProgress?: (props: typeof __VLS_332) => any;
237
289
  };
238
290
  declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
239
291
  noDataText: string;
@@ -260,12 +312,18 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
260
312
  autoRefresh: boolean;
261
313
  autoRefreshDefault: number;
262
314
  autoRefreshControl: boolean;
315
+ importConcurrency: number;
316
+ virtual: undefined;
317
+ virtualThreshold: number;
318
+ virtualHeight: string;
319
+ virtualItemHeight: number;
320
+ virtualItemsPerRow: undefined;
263
321
  }>>, {
264
322
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
265
323
  operation: import("vue").Ref<{
266
324
  openDialog: typeof openDialog;
267
325
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
268
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
326
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
269
327
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
270
328
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
271
329
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -279,7 +337,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
279
337
  }, {
280
338
  openDialog: typeof openDialog;
281
339
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
282
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
340
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
283
341
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
284
342
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
285
343
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -293,7 +351,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
293
351
  } | {
294
352
  openDialog: typeof openDialog;
295
353
  createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean) => Promise<any>);
296
- importItems: ((importItems: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importItemsList: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
354
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
297
355
  updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
298
356
  deleteItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback) => Promise<any>);
299
357
  reload: (() => Promise<void> | undefined) | (() => Promise<void>);
@@ -306,6 +364,30 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
306
364
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
307
365
  }>;
308
366
  autoRefresh: import("../../composables/autoRefresh.js").UseAutoRefreshHandle;
367
+ importProgress: {
368
+ isImporting: import("vue").Ref<boolean, boolean>;
369
+ total: import("vue").Ref<number, number>;
370
+ processed: import("vue").Ref<number, number>;
371
+ succeeded: import("vue").Ref<number, number>;
372
+ failed: import("vue").Ref<number, number>;
373
+ errors: import("vue").Ref<{
374
+ index: number;
375
+ message: string;
376
+ }[], import("../../composables/importProgress.js").ImportError[] | {
377
+ index: number;
378
+ message: string;
379
+ }[]>;
380
+ percent: import("vue").ComputedRef<number>;
381
+ reset: () => void;
382
+ run: <T = any>(items: T[], worker: import("../../composables/importProgress.js").ImportWorker<T>, options?: {
383
+ concurrency
384
+ /**
385
+ * ModelIterator connects model metadata to reusable selection, labeling, iterator, or table UI patterns.
386
+ * This doc block is consumed by vue-docgen for generated API documentation.
387
+ */
388
+ ?: number;
389
+ }) => Promise<import("../../composables/importProgress.js").ImportSummary>;
390
+ };
309
391
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
310
392
  noDataText: string;
311
393
  dialogFullscreen: boolean;
@@ -331,6 +413,12 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
331
413
  autoRefresh: boolean;
332
414
  autoRefreshDefault: number;
333
415
  autoRefreshControl: boolean;
416
+ importConcurrency: number;
417
+ virtual: undefined;
418
+ virtualThreshold: number;
419
+ virtualHeight: string;
420
+ virtualItemHeight: number;
421
+ virtualItemsPerRow: undefined;
334
422
  }>>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
335
423
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
336
424
  declare const _default: typeof __VLS_export;
@@ -3,7 +3,8 @@ import { computed, nextTick, ref, markRaw, useAttrs, useSlots, watch } from "vue
3
3
  import { useModelAutoRefresh } from "../../composables/modelAutoRefresh";
4
4
  import { VDataIterator } from "vuetify/components/VDataIterator";
5
5
  import { VDataTable } from "vuetify/components/VDataTable";
6
- import { omit } from "lodash-es";
6
+ import { omit, chunk } from "lodash-es";
7
+ import { shouldVirtualize, itemsPerRowForSpan } from "../../utils/virtualize";
7
8
  import { useGraphqlModel } from "../../composables/graphqlModel";
8
9
  import { useApiModel } from "../../composables/apiModel";
9
10
  import { usePerPagePreference } from "../../composables/perPagePreference";
@@ -43,6 +44,12 @@ const props = defineProps({
43
44
  autoRefresh: { type: [Number, Boolean], required: false, default: false },
44
45
  autoRefreshDefault: { type: Number, required: false, default: 60 },
45
46
  autoRefreshControl: { type: Boolean, required: false, default: true },
47
+ importConcurrency: { type: Number, required: false, default: 3 },
48
+ virtual: { type: Boolean, required: false, default: void 0 },
49
+ virtualThreshold: { type: Number, required: false, default: 500 },
50
+ virtualHeight: { type: [Number, String], required: false, default: "70vh" },
51
+ virtualItemHeight: { type: Number, required: false, default: 80 },
52
+ virtualItemsPerRow: { type: Number, required: false, default: void 0 },
46
53
  modelName: { type: String, required: true },
47
54
  modelKey: { type: String, required: false, default: "id" },
48
55
  modelBy: { type: Object, required: false, default: void 0 },
@@ -116,13 +123,24 @@ const {
116
123
  deleteItem,
117
124
  loadItems,
118
125
  reload,
119
- isLoading
126
+ isLoading,
127
+ importProgress
120
128
  } = props.api ? useApiModel(props) : useGraphqlModel(props);
121
129
  const { autoRefresh, manualReload } = useModelAutoRefresh(props, {
122
130
  reload,
123
131
  isLoading,
124
132
  isDialogOpen
125
133
  });
134
+ const useVirtual = computed(() => shouldVirtualize(items.value.length, props.virtual, props.virtualThreshold));
135
+ const itemsPerRow = computed(() => {
136
+ if (props.virtualItemsPerRow && props.virtualItemsPerRow > 0) return props.virtualItemsPerRow;
137
+ const bp = display.name?.value;
138
+ const span = (bp === "xxl" && props.xxl !== false ? props.xxl : void 0) ?? (["xxl", "xl"].includes(bp) && props.xl !== false ? props.xl : void 0) ?? (["xxl", "xl", "lg"].includes(bp) && props.lg !== false ? props.lg : void 0) ?? (["xxl", "xl", "lg", "md"].includes(bp) && props.md !== false ? props.md : void 0) ?? (["xxl", "xl", "lg", "md", "sm"].includes(bp) && props.sm !== false ? props.sm : void 0) ?? props.cols;
139
+ return itemsPerRowForSpan(span);
140
+ });
141
+ function chunkRows(slotItems) {
142
+ return chunk([...slotItems ?? []], itemsPerRow.value);
143
+ }
126
144
  function openDialog(item) {
127
145
  currentItem.value = item;
128
146
  nextTick(() => {
@@ -178,7 +196,7 @@ const computedSkeletonPerPage = computed(() => {
178
196
  watch(() => props.search, () => {
179
197
  search.value = props.search;
180
198
  }, { immediate: true });
181
- defineExpose({ reload, operation, autoRefresh });
199
+ defineExpose({ reload, operation, autoRefresh, importProgress });
182
200
  </script>
183
201
 
184
202
  <template>
@@ -191,13 +209,14 @@ defineExpose({ reload, operation, autoRefresh });
191
209
  :item-value="modelKey"
192
210
  :search="search"
193
211
  :loading="isLoading"
212
+ :transition="false"
194
213
  >
195
214
  <template #default="defaultProps" v-if="viewType.includes('iterator')">
196
215
  <slot
197
216
  v-bind="defaultProps"
198
217
  :operation="operation"
199
218
  >
200
- <v-container fluid>
219
+ <v-container fluid v-if="!useVirtual">
201
220
  <v-row>
202
221
  <v-col
203
222
  v-for="(item, index) in defaultProps.items"
@@ -217,6 +236,38 @@ defineExpose({ reload, operation, autoRefresh });
217
236
  </v-col>
218
237
  </v-row>
219
238
  </v-container>
239
+ <v-virtual-scroll
240
+ v-else
241
+ :items="chunkRows(defaultProps.items)"
242
+ :item-height="props.virtualItemHeight"
243
+ :height="props.virtualHeight"
244
+ >
245
+ <template #default="{ item: rowItems }">
246
+ <!-- pt-0 pb-6: reproduce the grid's 24px row gap as bottom padding so the
247
+ measured virtual-row height includes it and VVirtualScroll spaces rows
248
+ the same as the non-virtual <v-row gap="24"> grid. -->
249
+ <v-container fluid class="pt-0 pb-6">
250
+ <v-row>
251
+ <v-col
252
+ v-for="(item, index) in rowItems"
253
+ :key="index"
254
+ :cols="cols"
255
+ :sm="sm"
256
+ :md="md"
257
+ :lg="lg"
258
+ :xl="xl"
259
+ :xxl="xxl"
260
+ >
261
+ <slot
262
+ name="item"
263
+ :item="item"
264
+ :operation="operation"
265
+ />
266
+ </v-col>
267
+ </v-row>
268
+ </v-container>
269
+ </template>
270
+ </v-virtual-scroll>
220
271
  </slot>
221
272
  </template>
222
273
  <template #loader="loaderProps" v-if="viewType.includes('iterator')">
@@ -339,7 +390,7 @@ defineExpose({ reload, operation, autoRefresh });
339
390
  </slot>
340
391
  <template v-if="viewType.includes('table')">
341
392
  <v-data-table-server
342
- v-if="canServerPageable"
393
+ v-if="canServerPageable && !useVirtual"
343
394
  v-bind="plainAttrs"
344
395
  color="primary"
345
396
  :items="items"
@@ -381,6 +432,49 @@ defineExpose({ reload, operation, autoRefresh });
381
432
  />
382
433
  </template>
383
434
  </v-data-table-server>
435
+ <v-data-table-virtual
436
+ v-else-if="useVirtual"
437
+ v-bind="plainAttrs"
438
+ color="primary"
439
+ :items="items"
440
+ :item-value="props.modelKey"
441
+ :search="search"
442
+ :loading="isLoading"
443
+ :height="props.virtualHeight"
444
+ fixed-header
445
+ >
446
+ <!-- @ts-ignore -->
447
+ <template
448
+ v-for="(_, name, index) in tableSlots"
449
+ :key="index"
450
+ #[name]="slotData"
451
+ >
452
+ <slot
453
+ :name="name"
454
+ v-bind="slotData || {}"
455
+ :operation="operation"
456
+ />
457
+ </template>
458
+ <template
459
+ v-if="!$slots['item.action']"
460
+ #item.action="{ item }"
461
+ >
462
+ <v-btn
463
+ v-if="canUpdate"
464
+ variant="flat"
465
+ density="compact"
466
+ icon="mdi mdi-note-edit"
467
+ @click="openDialog(item)"
468
+ />
469
+ <v-btn
470
+ v-if="canDelete"
471
+ variant="flat"
472
+ density="compact"
473
+ icon="mdi mdi-delete"
474
+ @click="deleteItem(item)"
475
+ />
476
+ </template>
477
+ </v-data-table-virtual>
384
478
  <v-data-table
385
479
  v-else
386
480
  v-bind="plainAttrs"
@@ -486,5 +580,23 @@ defineExpose({ reload, operation, autoRefresh });
486
580
  />
487
581
  </template>
488
582
  </FormDialog>
583
+ <slot
584
+ name="importProgress"
585
+ :is-importing="importProgress.isImporting.value"
586
+ :total="importProgress.total.value"
587
+ :processed="importProgress.processed.value"
588
+ :succeeded="importProgress.succeeded.value"
589
+ :failed="importProgress.failed.value"
590
+ :percent="importProgress.percent.value"
591
+ >
592
+ <DialogImportProgress
593
+ :model-value="importProgress.isImporting.value"
594
+ :total="importProgress.total.value"
595
+ :processed="importProgress.processed.value"
596
+ :succeeded="importProgress.succeeded.value"
597
+ :failed="importProgress.failed.value"
598
+ :percent="importProgress.percent.value"
599
+ />
600
+ </slot>
489
601
  </v-card>
490
602
  </template>