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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flameresttable",
3
- "version": "1.0.90",
3
+ "version": "1.0.91",
4
4
  "main": "./src/plugin.ts",
5
5
  "repository": {
6
6
  "type": "git",
package/src/App.vue CHANGED
@@ -47,6 +47,8 @@ opts.Remove.can = true;
47
47
 
48
48
  opts.onRowClickOpenSlot = 'rowspace';
49
49
 
50
+ opts.Pagination.type = 'scrollable';
51
+
50
52
  opts.LoadParams.sort = ['-dt1'];
51
53
 
52
54
  </script>
@@ -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
- this.Rows.rows = (rows.data ?? []) as any;
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
- const rows: Rows<T> = await (this.model as any).constructor.all(merge({}, this.opts.LoadParams, filters, { page: this.Pager.page, perPage: this.Pager.perPage }));
242
+ // Запускаем прогрузку
243
+ this.loadingStatus = 'process';
225
244
 
226
- if (exportFilename === null) {
245
+ // совмещаем все параметры загрузки
246
+ const allParams = merge({}, { page: this.Pager.page, perPage: this.Pager.perPage }, this.opts.LoadParams, filters);
227
247
 
228
- // Строки: загружаем
229
- this.load(rows);
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
  /**
@@ -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
 
@@ -98,7 +98,7 @@ const update = (col?: Column) => {
98
98
  col.Filter.valueRange = (col.Filter.valueString as any).map((r: ITableSelectorItem) => r.id);
99
99
  }
100
100
 
101
- props.table.update();
101
+ props.table.update({}, null, 'filters');
102
102
 
103
103
  }
104
104
 
@@ -138,13 +138,12 @@ export default class TableOpts {
138
138
 
139
139
  }
140
140
 
141
-
142
141
  /**
143
- * Запрос на поиск записей
142
+ * Постраничная разбивка
144
143
  */
145
- public find = () => {
146
-
147
- }
144
+ public Pagination: {
145
+ type: 'scrollable' | 'pages'
146
+ } = { type: 'pages' }
148
147
 
149
148
 
150
149
  }