@ramathibodi/nuxt-commons 4.0.12 → 4.0.14

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 (40) 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/dialog/ImportResult.d.vue.ts +28 -0
  6. package/dist/runtime/components/dialog/ImportResult.vue +122 -0
  7. package/dist/runtime/components/dialog/ImportResult.vue.d.ts +28 -0
  8. package/dist/runtime/components/document/TemplateBuilder.vue +112 -7
  9. package/dist/runtime/components/model/Pad.vue +2 -1
  10. package/dist/runtime/components/model/Table.d.vue.ts +104 -28
  11. package/dist/runtime/components/model/Table.vue +118 -3
  12. package/dist/runtime/components/model/Table.vue.d.ts +104 -28
  13. package/dist/runtime/components/model/iterator.d.vue.ts +146 -49
  14. package/dist/runtime/components/model/iterator.vue +129 -5
  15. package/dist/runtime/components/model/iterator.vue.d.ts +146 -49
  16. package/dist/runtime/composables/api.d.ts +7 -0
  17. package/dist/runtime/composables/api.js +3 -2
  18. package/dist/runtime/composables/apiModel.d.ts +31 -3
  19. package/dist/runtime/composables/apiModel.js +30 -21
  20. package/dist/runtime/composables/apiModelOperation.d.ts +17 -3
  21. package/dist/runtime/composables/apiModelOperation.js +6 -6
  22. package/dist/runtime/composables/document/template.d.ts +61 -0
  23. package/dist/runtime/composables/document/template.js +59 -0
  24. package/dist/runtime/composables/document/validateTemplate.d.ts +62 -0
  25. package/dist/runtime/composables/document/validateTemplate.js +378 -0
  26. package/dist/runtime/composables/graphql.d.ts +3 -3
  27. package/dist/runtime/composables/graphql.js +6 -6
  28. package/dist/runtime/composables/graphqlModel.d.ts +31 -3
  29. package/dist/runtime/composables/graphqlModel.js +28 -20
  30. package/dist/runtime/composables/graphqlModelOperation.d.ts +1 -0
  31. package/dist/runtime/composables/graphqlOperation.d.ts +2 -1
  32. package/dist/runtime/composables/graphqlOperation.js +3 -3
  33. package/dist/runtime/composables/importProgress.d.ts +58 -0
  34. package/dist/runtime/composables/importProgress.js +130 -0
  35. package/dist/runtime/types/graphqlOperation.d.ts +12 -1
  36. package/dist/runtime/utils/virtualize.d.ts +15 -0
  37. package/dist/runtime/utils/virtualize.js +10 -0
  38. package/package.json +2 -1
  39. package/scripts/validate-document-template.mjs +158 -0
  40. package/templates/.codegen/plugin-schema-object.cjs +10 -13
@@ -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.
@@ -42,9 +48,9 @@ declare function openDialog(item?: object): void;
42
48
  declare var __VLS_15: {
43
49
  operation: {
44
50
  openDialog: typeof openDialog;
45
- 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);
47
- 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>);
51
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
52
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
53
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
50
56
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -79,9 +85,9 @@ declare var __VLS_15: {
79
85
  item: import("vuetify/lib/components/VDataIterator/composables/items.mjs").DataIteratorItem<Record<string, any>>;
80
86
  operation: {
81
87
  openDialog: typeof openDialog;
82
- 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);
84
- 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>);
88
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
89
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
90
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
87
93
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -92,16 +98,33 @@ 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, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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
- 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);
104
- 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>);
125
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
126
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
127
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
107
130
  setSearch: ((keyword: string) => void) | ((keyword: string) => 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,13 +166,13 @@ 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
- 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);
152
- 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>);
173
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
174
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
175
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
155
178
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -160,13 +183,13 @@ 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
- 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);
169
- 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>);
190
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
191
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
192
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
172
195
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -177,12 +200,12 @@ 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
- 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);
185
- 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>);
206
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
207
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
208
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
188
211
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -193,12 +216,12 @@ 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
- 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);
201
- 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>);
222
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
223
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
224
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
204
227
  setSearch: ((keyword: string) => void) | ((keyword: string) => 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, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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;
261
+ } & {
262
+ [K in NonNullable<typeof __VLS_235>]?: (props: typeof __VLS_236) => any;
215
263
  } & {
216
- [K in NonNullable<typeof __VLS_208>]?: (props: typeof __VLS_209) => any;
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;
223
271
  } & {
224
- loaderItem?: (props: typeof __VLS_58) => any;
272
+ loader?: (props: typeof __VLS_65) => any;
225
273
  } & {
226
- header?: (props: typeof __VLS_66) => any;
274
+ loaderItem?: (props: typeof __VLS_85) => any;
227
275
  } & {
228
- title?: (props: typeof __VLS_92) => any;
276
+ header?: (props: typeof __VLS_93) => any;
229
277
  } & {
230
- autoRefreshControl?: (props: typeof __VLS_102) => any;
278
+ title?: (props: typeof __VLS_119) => any;
231
279
  } & {
232
- search?: (props: typeof __VLS_115) => any;
280
+ autoRefreshControl?: (props: typeof __VLS_129) => any;
233
281
  } & {
234
- toolbarItems?: (props: typeof __VLS_128) => any;
282
+ search?: (props: typeof __VLS_142) => any;
235
283
  } & {
236
- form?: (props: typeof __VLS_277) => any;
284
+ toolbarItems?: (props: typeof __VLS_155) => any;
285
+ } & {
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,13 +312,19 @@ 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
- 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);
269
- 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>);
325
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
326
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
327
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
272
330
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -278,9 +336,9 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
278
336
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
279
337
  }, {
280
338
  openDialog: typeof openDialog;
281
- 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);
283
- 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>);
339
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
340
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
341
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
286
344
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -292,9 +350,9 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
292
350
  autoRefresh: import("vue").Raw<import("../../composables/autoRefresh.js").UseAutoRefreshHandle>;
293
351
  } | {
294
352
  openDialog: typeof openDialog;
295
- 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);
297
- 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>);
353
+ createItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => Promise<any>);
354
+ importItems: ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void) | ((importData: Record<string, any>[], callback?: import("../../types/formDialog.js").FormDialogCallback) => void);
355
+ updateItem: ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, idempotencySalt?: string | number) => Promise<void>) | ((item: Record<string, any>, callback?: import("../../types/formDialog.js").FormDialogCallback, importing?: boolean, idempotencySalt?: string | number) => 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>);
300
358
  setSearch: ((keyword: string) => void) | ((keyword: string) => void);
@@ -306,6 +364,39 @@ 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
+ item: any;
376
+ errorType: import("../../composables/importProgress.js").ImportErrorType;
377
+ message: string;
378
+ detail?: any;
379
+ }[], import("../../composables/importProgress.js").ImportError[] | {
380
+ index: number;
381
+ item: any;
382
+ errorType: import("../../composables/importProgress.js").ImportErrorType;
383
+ message: string;
384
+ detail?: any;
385
+ }[]>;
386
+ percent: import("vue").ComputedRef<number>;
387
+ resultVisible: import("vue").Ref<boolean, boolean>;
388
+ reset: () => void;
389
+ run: <T = any>(items: T[], worker: import("../../composables/importProgress.js").ImportWorker<T>, options?: {
390
+ concurrency
391
+ /**
392
+ * ModelIterator connects model metadata to reusable selection, labeling, iterator, or table UI patterns.
393
+ * This doc block is consumed by vue-docgen for generated API documentation.
394
+ */
395
+ ?: number;
396
+ }) => Promise<import("../../composables/importProgress.js").ImportSummary>;
397
+ retry: (indices?: number[]) => Promise<import("../../composables/importProgress.js").ImportSummary>;
398
+ dismissResult: () => void;
399
+ };
309
400
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
310
401
  noDataText: string;
311
402
  dialogFullscreen: boolean;
@@ -331,6 +422,12 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
331
422
  autoRefresh: boolean;
332
423
  autoRefreshDefault: number;
333
424
  autoRefreshControl: boolean;
425
+ importConcurrency: number;
426
+ virtual: undefined;
427
+ virtualThreshold: number;
428
+ virtualHeight: string;
429
+ virtualItemHeight: number;
430
+ virtualItemsPerRow: undefined;
334
431
  }>>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
335
432
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
336
433
  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,35 @@ 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>
601
+ <DialogImportResult
602
+ :model-value="importProgress.resultVisible.value"
603
+ :errors="importProgress.errors.value"
604
+ :total="importProgress.total.value"
605
+ :failed="importProgress.failed.value"
606
+ :is-importing="importProgress.isImporting.value"
607
+ @update:model-value="(v) => {
608
+ if (!v) importProgress.dismissResult();
609
+ }"
610
+ @retry-all="() => importProgress.retry().then(reload)"
611
+ @retry="(i) => importProgress.retry([i]).then(reload)"
612
+ />
489
613
  </v-card>
490
614
  </template>