flameresttable 1.0.90 → 1.0.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/App.vue +2 -0
- package/src/Table/FlameTable.ts +38 -7
- package/src/Table/Table.vue +40 -3
- package/src/Table/TableFilters.vue +1 -1
- package/src/Table/TableOpts.ts +4 -5
package/package.json
CHANGED
package/src/App.vue
CHANGED
package/src/Table/FlameTable.ts
CHANGED
|
@@ -70,6 +70,16 @@ export default class FlameTable<T> {
|
|
|
70
70
|
*/
|
|
71
71
|
public exportStatus: 'completed' | 'exportprocess' | string = 'completed';
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Состояние загрузки
|
|
75
|
+
*/
|
|
76
|
+
public loadingStatus: 'completed' | 'process' | string = 'process';
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Последний прогруженный элемент
|
|
80
|
+
*/
|
|
81
|
+
public lastLoadedID: number = 0;
|
|
82
|
+
|
|
73
83
|
/**
|
|
74
84
|
* Проинициализировать модели
|
|
75
85
|
*/
|
|
@@ -116,18 +126,26 @@ export default class FlameTable<T> {
|
|
|
116
126
|
// Предзагружаем колонки
|
|
117
127
|
this.preloadRelated()
|
|
118
128
|
|
|
129
|
+
|
|
130
|
+
|
|
119
131
|
}
|
|
120
132
|
|
|
121
133
|
/**
|
|
122
134
|
* Загрузить результаты от RESTа в таблицу
|
|
123
135
|
* @param rows Отданный объект
|
|
124
136
|
*/
|
|
125
|
-
public load(rows: Rows<T
|
|
137
|
+
public load(rows: Rows<T>, isAppend: boolean) {
|
|
126
138
|
|
|
127
139
|
rows.pages = rows.pages ?? { count: 0, page: 1, perPage: 1, total: 0 };
|
|
128
140
|
|
|
129
141
|
if (rows.data) {
|
|
130
|
-
|
|
142
|
+
|
|
143
|
+
// Заполняем массив
|
|
144
|
+
if (isAppend)
|
|
145
|
+
this.Rows.rows.push(...(rows.data ?? []) as any);
|
|
146
|
+
else
|
|
147
|
+
this.Rows.rows = (rows.data ?? []) as any;
|
|
148
|
+
|
|
131
149
|
Object.keys(this.Pager).forEach((key) => (this.Pager as any)[key] = (rows.pages as any)[key])
|
|
132
150
|
|
|
133
151
|
// удаляем чтобы при перезагрузке не сохранялось состояние пред. строк
|
|
@@ -212,7 +230,7 @@ export default class FlameTable<T> {
|
|
|
212
230
|
* @param CustomLoadParams Применить кастомные параметры загрузки
|
|
213
231
|
* @param exportFilename имя файла для экспорта, если указано, данные будут выгружены
|
|
214
232
|
*/
|
|
215
|
-
public async update(CustomLoadParams: ITableLoadParams = {}, exportFilename: string | null = null) {
|
|
233
|
+
public async update(CustomLoadParams: ITableLoadParams = {}, exportFilename: string | null = null, from: 'pager' | 'filters' = 'pager') {
|
|
216
234
|
|
|
217
235
|
// Дополняем загрузочные параметры фильтрами
|
|
218
236
|
const filters = merge(this.applyFiltersParams(), CustomLoadParams);
|
|
@@ -221,14 +239,25 @@ export default class FlameTable<T> {
|
|
|
221
239
|
const isNeedUpdate = this.opts.onBeforeUpdate(filters, exportFilename !== null);
|
|
222
240
|
if (!isNeedUpdate) return;
|
|
223
241
|
|
|
224
|
-
|
|
242
|
+
// Запускаем прогрузку
|
|
243
|
+
this.loadingStatus = 'process';
|
|
225
244
|
|
|
226
|
-
|
|
245
|
+
// совмещаем все параметры загрузки
|
|
246
|
+
const allParams = merge({}, { page: this.Pager.page, perPage: this.Pager.perPage }, this.opts.LoadParams, filters);
|
|
227
247
|
|
|
228
|
-
|
|
229
|
-
|
|
248
|
+
// Если всё уже загружено
|
|
249
|
+
if (this.Pager.total !== 0 && allParams.page > this.Pager.total / this.Pager.perPage) return;
|
|
250
|
+
|
|
251
|
+
const rows: Rows<T> = await (this.model as any).constructor.all(allParams);
|
|
230
252
|
|
|
253
|
+
if (exportFilename === null) {
|
|
254
|
+
|
|
255
|
+
// Режим прогрузки
|
|
256
|
+
let loadModeAppend: boolean = false;
|
|
257
|
+
if (this.opts.Pagination.type === 'scrollable' && from === 'pager') loadModeAppend = true;
|
|
231
258
|
|
|
259
|
+
// Строки: загружаем
|
|
260
|
+
this.load(rows, loadModeAppend);
|
|
232
261
|
|
|
233
262
|
}
|
|
234
263
|
|
|
@@ -254,6 +283,8 @@ export default class FlameTable<T> {
|
|
|
254
283
|
}
|
|
255
284
|
}
|
|
256
285
|
|
|
286
|
+
this.loadingStatus = 'completed'
|
|
287
|
+
|
|
257
288
|
}
|
|
258
289
|
|
|
259
290
|
/**
|
package/src/Table/Table.vue
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
</TableTasksPanel>
|
|
19
19
|
|
|
20
20
|
<!-- ТАБЛИЦА-->
|
|
21
|
-
<div class="mt-2 table table-fixed w-full ">
|
|
21
|
+
<div ref="MainTableElement" class="mt-2 table table-fixed w-full ">
|
|
22
22
|
|
|
23
23
|
<!-- ЗАГОЛОВКИ СТОЛБЦОВ-->
|
|
24
24
|
<div class="table-header-group">
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
</div>
|
|
102
102
|
|
|
103
103
|
<!-- ПОСТРАНИЧНАЯ РАЗБИВКА -->
|
|
104
|
-
<Paginator class="mt-3" :table="Table" />
|
|
104
|
+
<Paginator class="mt-3" :table="Table" v-if="opts.Pagination.type === 'pages'" />
|
|
105
105
|
|
|
106
106
|
<!-- МОДАЛКА ДОБАВЛЕНИЯ-->
|
|
107
107
|
<ModalVue ref="FlameTableModal">
|
|
@@ -258,6 +258,8 @@ export default defineComponent({
|
|
|
258
258
|
|
|
259
259
|
const ColumnNames = Object.keys(Table.model as any);
|
|
260
260
|
|
|
261
|
+
// Добавляем событие скролла
|
|
262
|
+
|
|
261
263
|
/**
|
|
262
264
|
* Добавление новой записи
|
|
263
265
|
*/
|
|
@@ -370,6 +372,9 @@ export default defineComponent({
|
|
|
370
372
|
return Table.RowsParams[row[primaryKey]].collapsed
|
|
371
373
|
}
|
|
372
374
|
|
|
375
|
+
const MainTableElement = ref();
|
|
376
|
+
|
|
377
|
+
|
|
373
378
|
|
|
374
379
|
return {
|
|
375
380
|
Table,
|
|
@@ -383,11 +388,43 @@ export default defineComponent({
|
|
|
383
388
|
getSelector,
|
|
384
389
|
primaryKey,
|
|
385
390
|
columnClick,
|
|
386
|
-
isRowCollapsed
|
|
391
|
+
isRowCollapsed,
|
|
392
|
+
MainTableElement
|
|
387
393
|
}
|
|
388
394
|
|
|
389
395
|
},
|
|
396
|
+
|
|
397
|
+
mounted() {
|
|
398
|
+
window.addEventListener('scroll', this.handleScroll);
|
|
399
|
+
},
|
|
400
|
+
|
|
401
|
+
beforeUnmount() {
|
|
402
|
+
window.removeEventListener('scroll', this.handleScroll);
|
|
403
|
+
},
|
|
404
|
+
|
|
390
405
|
methods: {
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
// подскролл таблицы при докручивании до низа
|
|
409
|
+
handleScroll() {
|
|
410
|
+
|
|
411
|
+
if (this.opts.Pagination.type !== 'scrollable') return;
|
|
412
|
+
if (this.Table.loadingStatus === 'process') return;
|
|
413
|
+
|
|
414
|
+
const rect = this.MainTableElement.getBoundingClientRect();
|
|
415
|
+
const bottom = rect.bottom;
|
|
416
|
+
|
|
417
|
+
// Получаем высоту окна просмотра
|
|
418
|
+
const windowHeight = window.innerHeight;
|
|
419
|
+
|
|
420
|
+
// Проверяем, достиг ли скролл нижней грани элемента
|
|
421
|
+
if (bottom <= windowHeight) {
|
|
422
|
+
// Грузим на одну страницу дальше, т.к. тут отсчёт начинается с 0, то +2
|
|
423
|
+
this.Table.update({ page: this.Table.Pager.page + 2, perPage: 20 });
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
},
|
|
427
|
+
|
|
391
428
|
fileGetData(thisArr: any, getSource: boolean = true) {
|
|
392
429
|
|
|
393
430
|
|
package/src/Table/TableOpts.ts
CHANGED
|
@@ -138,13 +138,12 @@ export default class TableOpts {
|
|
|
138
138
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
|
|
142
141
|
/**
|
|
143
|
-
*
|
|
142
|
+
* Постраничная разбивка
|
|
144
143
|
*/
|
|
145
|
-
public
|
|
146
|
-
|
|
147
|
-
}
|
|
144
|
+
public Pagination: {
|
|
145
|
+
type: 'scrollable' | 'pages'
|
|
146
|
+
} = { type: 'pages' }
|
|
148
147
|
|
|
149
148
|
|
|
150
149
|
}
|