vgapp 1.2.5 → 1.2.6
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/CHANGELOG.md +58 -35
- package/agents.md +2 -2
- package/app/modules/base-module.js +87 -10
- package/app/modules/vgalert/js/vgalert.js +3 -3
- package/app/modules/vgdynamictable/index.js +5 -0
- package/app/modules/vgdynamictable/js/editable.js +438 -0
- package/app/modules/vgdynamictable/js/expandable.js +248 -0
- package/app/modules/vgdynamictable/js/filters.js +450 -0
- package/app/modules/vgdynamictable/js/fixed.js +566 -0
- package/app/modules/vgdynamictable/js/options.js +646 -0
- package/app/modules/vgdynamictable/js/pagination.js +623 -0
- package/app/modules/vgdynamictable/js/search.js +82 -0
- package/app/modules/vgdynamictable/js/skeleton.js +136 -0
- package/app/modules/vgdynamictable/js/sortable.js +442 -0
- package/app/modules/vgdynamictable/js/summary-footer.js +284 -0
- package/app/modules/vgdynamictable/js/table-remote.js +821 -0
- package/app/modules/vgdynamictable/js/table-state.js +243 -0
- package/app/modules/vgdynamictable/js/table-url-state.js +444 -0
- package/app/modules/vgdynamictable/js/utils/common.js +48 -0
- package/app/modules/vgdynamictable/js/vgdynamictable.js +3829 -0
- package/app/modules/vgdynamictable/js/viewport.js +322 -0
- package/app/modules/vgdynamictable/readme.md +251 -0
- package/app/modules/vgdynamictable/scss/_actions.scss +193 -0
- package/app/modules/vgdynamictable/scss/_pagination.scss +183 -0
- package/app/modules/vgdynamictable/scss/_skeleton.scss +60 -0
- package/app/modules/vgdynamictable/scss/_sortable.scss +63 -0
- package/app/modules/vgdynamictable/scss/_table.scss +157 -0
- package/app/modules/vgdynamictable/scss/_variables.scss +130 -0
- package/app/modules/vgdynamictable/scss/vgdynamictable.scss +267 -0
- package/app/modules/vgrangeslider/index.js +3 -0
- package/app/modules/vgrangeslider/js/skins.js +222 -0
- package/app/modules/vgrangeslider/js/vgrangeslider.js +704 -0
- package/app/modules/vgrangeslider/readme.md +523 -0
- package/app/modules/vgrangeslider/scss/_variables.scss +53 -0
- package/app/modules/vgrangeslider/scss/vgrangeslider.scss +240 -0
- package/app/utils/js/components/ajax.js +116 -7
- package/build/vgapp.css +2 -3246
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +2 -30
- package/index.js +2 -0
- package/index.scss +6 -0
- package/package.json +1 -1
|
@@ -0,0 +1,646 @@
|
|
|
1
|
+
const DEFAULT_OPTIONS = {
|
|
2
|
+
// Режим темы таблицы.
|
|
3
|
+
// data-атрибуты: data-theme
|
|
4
|
+
theme: 'auto', // auto | light | dark
|
|
5
|
+
|
|
6
|
+
// Ключ локали для выбора словаря i18n.
|
|
7
|
+
// data-атрибуты: data-locale
|
|
8
|
+
locale: 'ru',
|
|
9
|
+
|
|
10
|
+
// Локализованные словари интерфейса.
|
|
11
|
+
// data-атрибуты: нет прямого (обычно задается из JS)
|
|
12
|
+
i18n: {
|
|
13
|
+
ru: {
|
|
14
|
+
pagination: {
|
|
15
|
+
// Подпись блока per-page.
|
|
16
|
+
// data-атрибуты: data-pagination-per-page-label
|
|
17
|
+
perPageLabel: 'Строк на странице',
|
|
18
|
+
// Суффикс варианта per-page.
|
|
19
|
+
// data-атрибуты: data-pagination-per-page-option-suffix
|
|
20
|
+
perPageOptionSuffix: 'на страницу',
|
|
21
|
+
// Текст кнопки "назад".
|
|
22
|
+
// data-атрибуты: data-pagination-prev-label
|
|
23
|
+
prevLabel: 'Назад',
|
|
24
|
+
// Текст кнопки "вперед".
|
|
25
|
+
// data-атрибуты: data-pagination-next-label
|
|
26
|
+
nextLabel: 'Вперед',
|
|
27
|
+
// Текст кнопки быстрого перехода.
|
|
28
|
+
// data-атрибуты: data-pagination-quick-jump-button-label
|
|
29
|
+
quickJumpButtonLabel: 'Перейти',
|
|
30
|
+
},
|
|
31
|
+
table: {
|
|
32
|
+
// Текст состояния загрузки.
|
|
33
|
+
// data-атрибуты: data-table-loading-label
|
|
34
|
+
loading: 'Загрузка данных...',
|
|
35
|
+
// Текст пустого состояния.
|
|
36
|
+
// data-атрибуты: data-table-empty-label
|
|
37
|
+
empty: 'Нет данных.',
|
|
38
|
+
// Текст состояния ошибки.
|
|
39
|
+
// data-атрибуты: data-table-error-label
|
|
40
|
+
error: 'Не удалось загрузить данные.',
|
|
41
|
+
// Текст кнопки повторного запроса при ошибке.
|
|
42
|
+
// data-атрибуты: data-table-retry-label
|
|
43
|
+
retry: 'Повторить',
|
|
44
|
+
// Подсказка для горизонтальной прокрутки таблицы.
|
|
45
|
+
// data-атрибуты: data-table-shift-drag-hint
|
|
46
|
+
shiftDragHint: 'Зажмите Shift и тяните мышью для прокрутки таблицы.',
|
|
47
|
+
},
|
|
48
|
+
sortable: {
|
|
49
|
+
// Подсказка сортировки по возрастанию.
|
|
50
|
+
// data-атрибуты: data-sort-asc-label
|
|
51
|
+
ascLabel: 'Сортировка по возрастанию',
|
|
52
|
+
// Подсказка сортировки по убыванию.
|
|
53
|
+
// data-атрибуты: data-sort-desc-label
|
|
54
|
+
descLabel: 'Сортировка по убыванию',
|
|
55
|
+
},
|
|
56
|
+
summary: {
|
|
57
|
+
// Подпись общего количества.
|
|
58
|
+
// data-атрибуты: data-summary-found-label
|
|
59
|
+
foundLabel: 'Найдено',
|
|
60
|
+
// Подпись активного поиска.
|
|
61
|
+
// data-атрибуты: data-summary-search-label
|
|
62
|
+
searchLabel: 'Поиск',
|
|
63
|
+
// Подпись видимых строк.
|
|
64
|
+
// data-атрибуты: data-summary-visible-rows-label
|
|
65
|
+
visibleRowsLabel: 'Строк на странице',
|
|
66
|
+
// Подпись суммы цен.
|
|
67
|
+
// data-атрибуты: data-summary-page-price-sum-label
|
|
68
|
+
pagePriceSumLabel: 'Сумма цен',
|
|
69
|
+
// Подпись суммарного остатка.
|
|
70
|
+
// data-атрибуты: data-summary-page-stock-sum-label
|
|
71
|
+
pageStockSumLabel: 'Суммарный остаток',
|
|
72
|
+
// Подпись среднего рейтинга.
|
|
73
|
+
// data-атрибуты: data-summary-page-avg-rating-label
|
|
74
|
+
pageAvgRatingLabel: 'Средний рейтинг',
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
en: {
|
|
78
|
+
pagination: {
|
|
79
|
+
perPageLabel: 'Rows per page',
|
|
80
|
+
perPageOptionSuffix: 'page',
|
|
81
|
+
prevLabel: 'Prev',
|
|
82
|
+
nextLabel: 'Next',
|
|
83
|
+
quickJumpButtonLabel: 'Go',
|
|
84
|
+
},
|
|
85
|
+
table: {
|
|
86
|
+
loading: 'Loading data...',
|
|
87
|
+
empty: 'No data available.',
|
|
88
|
+
error: 'Failed to load data.',
|
|
89
|
+
retry: 'Retry',
|
|
90
|
+
shiftDragHint: 'Hold Shift and drag to scroll the table.',
|
|
91
|
+
},
|
|
92
|
+
sortable: {
|
|
93
|
+
ascLabel: 'Sort ascending',
|
|
94
|
+
descLabel: 'Sort descending',
|
|
95
|
+
},
|
|
96
|
+
summary: {
|
|
97
|
+
foundLabel: 'Found',
|
|
98
|
+
searchLabel: 'Search',
|
|
99
|
+
visibleRowsLabel: 'Rows on page',
|
|
100
|
+
pagePriceSumLabel: 'Price sum',
|
|
101
|
+
pageStockSumLabel: 'Total stock',
|
|
102
|
+
pageAvgRatingLabel: 'Average rating',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
// Локальный источник строк (без remote API).
|
|
108
|
+
// data-атрибуты: нет прямого
|
|
109
|
+
data: [],
|
|
110
|
+
|
|
111
|
+
fixed: {
|
|
112
|
+
// data-attributes: data-fixed-columns
|
|
113
|
+
columns: '',
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
views: {
|
|
117
|
+
storage: {
|
|
118
|
+
// data-attributes: data-views-storage-key
|
|
119
|
+
key: '',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
request: {
|
|
124
|
+
// URL endpoint для remote-запросов.
|
|
125
|
+
// data-атрибуты: data-request-route
|
|
126
|
+
route: '',
|
|
127
|
+
// HTTP-метод запроса.
|
|
128
|
+
// data-атрибуты: data-request-method
|
|
129
|
+
method: 'GET',
|
|
130
|
+
// Режим credentials для fetch.
|
|
131
|
+
// data-атрибуты: data-request-credentials
|
|
132
|
+
credentials: 'same-origin',
|
|
133
|
+
// Базовые HTTP-заголовки.
|
|
134
|
+
// data-атрибуты: нет прямого
|
|
135
|
+
headers: { 'Accept': 'application/json' },
|
|
136
|
+
// Базовые query-параметры для каждого запроса.
|
|
137
|
+
// data-атрибуты: data-request-params (json)
|
|
138
|
+
params: {},
|
|
139
|
+
// Маппинг внутренних параметров в backend-имена (например, q -> search).
|
|
140
|
+
// data-атрибуты: data-request-parammap
|
|
141
|
+
parammap: {},
|
|
142
|
+
// Режим чтения ответа: data | view | auto.
|
|
143
|
+
// data-атрибуты: data-request-responsemode
|
|
144
|
+
responsemode: 'data',
|
|
145
|
+
// Dot-path до массива строк в JSON.
|
|
146
|
+
// data-атрибуты: data-request-datapath
|
|
147
|
+
datapath: 'data',
|
|
148
|
+
// Dot-path до meta в JSON.
|
|
149
|
+
// data-атрибуты: data-request-metapath
|
|
150
|
+
metapath: 'meta',
|
|
151
|
+
// Dot-path до server-rendered HTML строк.
|
|
152
|
+
// data-атрибуты: data-request-viewpath
|
|
153
|
+
viewpath: 'view.tbody',
|
|
154
|
+
// Имя параметра для запроса server-rendered view.
|
|
155
|
+
// data-атрибуты: data-request-viewparam
|
|
156
|
+
viewparam: 'view',
|
|
157
|
+
// Значение параметра для server-rendered view.
|
|
158
|
+
// data-атрибуты: data-request-viewvalue
|
|
159
|
+
viewvalue: 'rows',
|
|
160
|
+
// Имя параметра списка полей для view-режима.
|
|
161
|
+
// data-атрибуты: data-request-fieldsparam
|
|
162
|
+
fieldsparam: 'fields',
|
|
163
|
+
cache: {
|
|
164
|
+
// data-attributes: data-request-cache-enable
|
|
165
|
+
enable: true,
|
|
166
|
+
// data-attributes: data-request-cache-ttl
|
|
167
|
+
ttl: 30000,
|
|
168
|
+
// data-attributes: data-request-cache-max
|
|
169
|
+
max: 30,
|
|
170
|
+
},
|
|
171
|
+
export: {
|
|
172
|
+
// data-attributes: data-request-export-route
|
|
173
|
+
route: '',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
pagination: {
|
|
178
|
+
// Canonical key for enable flag.
|
|
179
|
+
// data-attributes: data-pagination-enable
|
|
180
|
+
enable: false,
|
|
181
|
+
// Начальная страница.
|
|
182
|
+
// data-атрибуты: data-pagination-page
|
|
183
|
+
page: 1,
|
|
184
|
+
// Начальный per-page.
|
|
185
|
+
// data-атрибуты: data-pagination-perPage | data-pagination-per-page
|
|
186
|
+
perPage: 10,
|
|
187
|
+
// Canonical key for page size.
|
|
188
|
+
// data-attributes: data-pagination-per
|
|
189
|
+
per: 10,
|
|
190
|
+
// Максимально допустимый per-page.
|
|
191
|
+
// data-атрибуты: data-pagination-maxPerPage | data-pagination-max-per-page
|
|
192
|
+
maxPerPage: 100,
|
|
193
|
+
// Canonical key for max page size.
|
|
194
|
+
// data-attributes: data-pagination-max
|
|
195
|
+
max: 100,
|
|
196
|
+
// Сохранять страницу в localStorage.
|
|
197
|
+
// data-атрибуты: data-pagination-persist-page
|
|
198
|
+
persistPage: true,
|
|
199
|
+
// Сохранять per-page в localStorage.
|
|
200
|
+
// data-атрибуты: data-pagination-persist-per-page
|
|
201
|
+
persistPerPage: true,
|
|
202
|
+
persist: {
|
|
203
|
+
// data-attributes: data-pagination-persist-page
|
|
204
|
+
page: true,
|
|
205
|
+
// data-attributes: data-pagination-persist-per
|
|
206
|
+
per: true,
|
|
207
|
+
},
|
|
208
|
+
// Ключ storage для per-page.
|
|
209
|
+
// data-атрибуты: data-pagination-storage-key
|
|
210
|
+
storageKey: '',
|
|
211
|
+
// Ключ storage для page.
|
|
212
|
+
// data-атрибуты: data-pagination-page-storage-key
|
|
213
|
+
pageStorageKey: '',
|
|
214
|
+
storage: {
|
|
215
|
+
// data-attributes: data-pagination-storage-key
|
|
216
|
+
key: '',
|
|
217
|
+
},
|
|
218
|
+
pageStorage: {
|
|
219
|
+
storage: {
|
|
220
|
+
// data-attributes: data-pagination-page-storage-key
|
|
221
|
+
key: '',
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
// Фиксированное число страниц (опционально).
|
|
225
|
+
// data-атрибуты: data-pagination-totalPages | data-pagination-total-pages
|
|
226
|
+
totalPages: null,
|
|
227
|
+
// Позиция пагинатора.
|
|
228
|
+
// data-атрибуты: data-pagination-position
|
|
229
|
+
position: 'bottom', // top | bottom | both
|
|
230
|
+
// Выравнивание пагинатора.
|
|
231
|
+
// data-атрибуты: data-pagination-align
|
|
232
|
+
align: 'left', // left | center | right | between
|
|
233
|
+
// Режим рендера контролов.
|
|
234
|
+
// data-атрибуты: data-pagination-renderMode | data-pagination-render-mode
|
|
235
|
+
renderMode: 'auto', // auto | class | markup
|
|
236
|
+
// Использовать многоточия.
|
|
237
|
+
// data-атрибуты: data-pagination-ellipsis
|
|
238
|
+
ellipsis: true,
|
|
239
|
+
// Порог появления многоточий.
|
|
240
|
+
// data-атрибуты: data-pagination-ellipsisAfter | data-pagination-ellipsis-after
|
|
241
|
+
ellipsisAfter: 5,
|
|
242
|
+
// Максимум видимых кнопок страниц.
|
|
243
|
+
// data-атрибуты: data-pagination-maxVisiblePages | data-pagination-max-visible-pages
|
|
244
|
+
maxVisiblePages: 5,
|
|
245
|
+
// Показывать контрол per-page.
|
|
246
|
+
// data-атрибуты: data-pagination-showPerPage | data-pagination-show-per-page
|
|
247
|
+
showPerPage: true,
|
|
248
|
+
// Показывать подпись рядом с per-page.
|
|
249
|
+
// data-атрибуты: data-pagination-showPerPageLabel | data-pagination-show-per-page-label
|
|
250
|
+
showPerPageLabel: false,
|
|
251
|
+
// Прокручивать к началу таблицы при смене страницы.
|
|
252
|
+
// data-атрибуты: data-pagination-scrollToTop | data-pagination-scroll-to-top
|
|
253
|
+
scrollToTop: true,
|
|
254
|
+
// Прокручивать страницу к началу окна браузера при смене страницы.
|
|
255
|
+
// data-атрибуты: data-pagination-scrollToWindowTop | data-pagination-scroll-to-window-top
|
|
256
|
+
scrollToWindowTop: false,
|
|
257
|
+
// Режим быстрого перехода.
|
|
258
|
+
// data-атрибуты: data-pagination-quickJump | data-pagination-quick-jump
|
|
259
|
+
quickJump: false, // auto | true | false
|
|
260
|
+
// Подпись кнопки быстрого перехода.
|
|
261
|
+
// data-атрибуты: data-pagination-quickJumpButtonLabel | data-pagination-quick-jump-button-label
|
|
262
|
+
quickJumpButtonLabel: 'Перейти',
|
|
263
|
+
// Доступные варианты per-page.
|
|
264
|
+
// data-атрибуты: data-pagination-perPageOptions | data-pagination-per-page-options
|
|
265
|
+
perPageOptions: [10, 25, 50, 100],
|
|
266
|
+
// Колбек смены страницы.
|
|
267
|
+
// data-атрибуты: нет прямого
|
|
268
|
+
onChange: null,
|
|
269
|
+
// Колбек смены per-page.
|
|
270
|
+
// data-атрибуты: нет прямого
|
|
271
|
+
onPerPageChange: null,
|
|
272
|
+
},
|
|
273
|
+
|
|
274
|
+
sortable: {
|
|
275
|
+
// Canonical key for enable flag.
|
|
276
|
+
// data-attributes: data-sortable-enable
|
|
277
|
+
enable: true,
|
|
278
|
+
// Начальное поле сортировки.
|
|
279
|
+
// data-атрибуты: data-sort
|
|
280
|
+
initialField: '',
|
|
281
|
+
// Начальное направление сортировки.
|
|
282
|
+
// data-атрибуты: data-dir
|
|
283
|
+
initialDir: 'asc',
|
|
284
|
+
// Включить мультисортировку.
|
|
285
|
+
// data-атрибуты: data-sort-multi | data-sortmulti
|
|
286
|
+
multi: false,
|
|
287
|
+
// Мультисортировка только с Shift.
|
|
288
|
+
// data-атрибуты: data-sort-multi-with-shift | data-sortmultiWithShift
|
|
289
|
+
multiWithShift: true,
|
|
290
|
+
// Белый список сортируемых полей.
|
|
291
|
+
// data-атрибуты: data-sort-fields
|
|
292
|
+
fields: [],
|
|
293
|
+
// Скрывать стрелки у несортированных колонок.
|
|
294
|
+
// data-атрибуты: data-sort-hide-unsorted-arrows
|
|
295
|
+
hideUnsortedArrows: true,
|
|
296
|
+
// Пользовательская проверка сортируемости колонки.
|
|
297
|
+
// data-атрибуты: нет прямого
|
|
298
|
+
isColumnSortable: () => true,
|
|
299
|
+
},
|
|
300
|
+
|
|
301
|
+
columnReorder: {
|
|
302
|
+
// Canonical key for enable flag.
|
|
303
|
+
// data-attributes: data-column-reorder-enable
|
|
304
|
+
enable: false,
|
|
305
|
+
// Сохранять порядок колонок.
|
|
306
|
+
// data-атрибуты: data-column-reorder-persist
|
|
307
|
+
persist: false,
|
|
308
|
+
// Ключ storage для порядка колонок.
|
|
309
|
+
// data-атрибуты: data-column-reorder-storage-key
|
|
310
|
+
storageKey: '',
|
|
311
|
+
},
|
|
312
|
+
|
|
313
|
+
columnResize: {
|
|
314
|
+
// Canonical key for enable flag.
|
|
315
|
+
// data-attributes: data-column-resize-enable
|
|
316
|
+
enable: false,
|
|
317
|
+
// Минимальная ширина колонки.
|
|
318
|
+
// data-атрибуты: data-column-resize-min-width
|
|
319
|
+
minWidth: 80,
|
|
320
|
+
// Максимальная ширина колонки.
|
|
321
|
+
// data-атрибуты: data-column-resize-max-width
|
|
322
|
+
maxWidth: 600,
|
|
323
|
+
},
|
|
324
|
+
|
|
325
|
+
virtual: {
|
|
326
|
+
// Canonical key for enable flag.
|
|
327
|
+
// data-attributes: data-virtual-enable
|
|
328
|
+
enable: false,
|
|
329
|
+
// Ожидаемая высота строки (px).
|
|
330
|
+
// data-атрибуты: data-virtual-row-height
|
|
331
|
+
rowHeight: 44,
|
|
332
|
+
// Запас строк вне viewport.
|
|
333
|
+
// data-атрибуты: data-virtual-overscan
|
|
334
|
+
overscan: 8,
|
|
335
|
+
// Порог числа строк для активации виртуализации.
|
|
336
|
+
// data-атрибуты: data-virtual-threshold
|
|
337
|
+
threshold: 500,
|
|
338
|
+
},
|
|
339
|
+
|
|
340
|
+
expandable: {
|
|
341
|
+
// Enable tree-like expandable rows.
|
|
342
|
+
// data-attributes: data-expandable-enable
|
|
343
|
+
enable: false,
|
|
344
|
+
// Attribute name with unique row id.
|
|
345
|
+
// data-attributes: data-expandable-id-attr
|
|
346
|
+
idAttr: 'data-expand-id',
|
|
347
|
+
// Attribute name with parent row id.
|
|
348
|
+
// data-attributes: data-expandable-parent-attr
|
|
349
|
+
parentAttr: 'data-expand-parent-id',
|
|
350
|
+
// Selector for toggle control inside row.
|
|
351
|
+
// data-attributes: data-expandable-toggle-selector
|
|
352
|
+
toggleSelector: '[data-expand-toggle]',
|
|
353
|
+
// Collapse groups by default.
|
|
354
|
+
// data-attributes: data-expandable-collapsed
|
|
355
|
+
collapsed: true,
|
|
356
|
+
},
|
|
357
|
+
|
|
358
|
+
loading: {
|
|
359
|
+
// Canonical key for minimum loading delay.
|
|
360
|
+
// data-attributes: data-loading-min-delay
|
|
361
|
+
minDelay: 500,
|
|
362
|
+
// Количество skeleton-строк.
|
|
363
|
+
// data-атрибуты: data-loading-skeleton | data-loading-skeleton-rows
|
|
364
|
+
skeleton: 10,
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
summary: {
|
|
368
|
+
// Canonical key for enable flag.
|
|
369
|
+
// data-attributes: data-summary-enable
|
|
370
|
+
enable: false,
|
|
371
|
+
},
|
|
372
|
+
|
|
373
|
+
footer: {
|
|
374
|
+
// Canonical key for enable flag.
|
|
375
|
+
// data-attributes: data-footer-enable
|
|
376
|
+
enable: false,
|
|
377
|
+
},
|
|
378
|
+
|
|
379
|
+
state: {
|
|
380
|
+
// SVG/URL для иллюстрации error-state.
|
|
381
|
+
// data-атрибуты: data-state-error-illustration
|
|
382
|
+
errorIllustration: '<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="36" stroke="currentColor" stroke-opacity="0.32" stroke-width="4"/><path d="M50 30V56" stroke="currentColor" stroke-opacity="0.7" stroke-width="6" stroke-linecap="round"/><circle cx="50" cy="68" r="4" fill="currentColor" fill-opacity="0.7"/></svg>',
|
|
383
|
+
// SVG/URL для иллюстрации empty-state.
|
|
384
|
+
// data-атрибуты: data-state-empty-illustration
|
|
385
|
+
emptyIllustration: '<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="18" y="24" width="64" height="52" rx="8" stroke="currentColor" stroke-opacity="0.32" stroke-width="4"/><path d="M30 40H70M30 50H62M30 60H54" stroke="currentColor" stroke-opacity="0.55" stroke-width="4" stroke-linecap="round"/><circle cx="72" cy="68" r="10" stroke="currentColor" stroke-opacity="0.6" stroke-width="4"/><path d="M79 75L86 82" stroke="currentColor" stroke-opacity="0.6" stroke-width="4" stroke-linecap="round"/></svg>',
|
|
386
|
+
},
|
|
387
|
+
|
|
388
|
+
panHint: {
|
|
389
|
+
// Canonical key for dismiss days.
|
|
390
|
+
// data-attributes: data-pan-hint-dismiss
|
|
391
|
+
dismiss: 60,
|
|
392
|
+
// Сколько дней скрывать подсказку "Shift + drag" после закрытия.
|
|
393
|
+
// data-атрибуты: data-pan-hint-dismiss-days
|
|
394
|
+
dismissDays: 60,
|
|
395
|
+
},
|
|
396
|
+
|
|
397
|
+
stickyHeader: {
|
|
398
|
+
// Canonical key for enable flag.
|
|
399
|
+
// data-attributes: data-sticky-header-enable
|
|
400
|
+
enable: false,
|
|
401
|
+
// Отступ сверху для sticky-header (px).
|
|
402
|
+
// data-атрибуты: data-sticky-header-top-offset | data-stickyHeader-top
|
|
403
|
+
top: 0,
|
|
404
|
+
// Максимальная высота viewport таблицы.
|
|
405
|
+
// data-атрибуты: data-sticky-header-max-height | data-stickyHeader-max
|
|
406
|
+
max: 0,
|
|
407
|
+
},
|
|
408
|
+
|
|
409
|
+
search: {
|
|
410
|
+
// Canonical key for enable flag.
|
|
411
|
+
// data-attributes: data-search-enable
|
|
412
|
+
enable: false,
|
|
413
|
+
// Debounce поиска.
|
|
414
|
+
// data-атрибуты: data-search-debounce | data-search-debounce-ms
|
|
415
|
+
debounce: 300,
|
|
416
|
+
// Имя query-параметра поиска.
|
|
417
|
+
// data-атрибуты: data-search-param
|
|
418
|
+
param: 'q',
|
|
419
|
+
// CSS-селектор input поиска.
|
|
420
|
+
// data-атрибуты: data-search-input | data-search-input-selector
|
|
421
|
+
input: '',
|
|
422
|
+
},
|
|
423
|
+
|
|
424
|
+
filters: {
|
|
425
|
+
// Canonical key for enable flag.
|
|
426
|
+
// data-attributes: data-filters-enable
|
|
427
|
+
enable: false,
|
|
428
|
+
// CSS-селектор формы фильтров.
|
|
429
|
+
// data-атрибуты: data-filters-form | data-filters-form-selector
|
|
430
|
+
form: '',
|
|
431
|
+
// Debounce фильтров.
|
|
432
|
+
// data-атрибуты: data-filters-debounce | data-filters-debounce-ms
|
|
433
|
+
debounce: 300,
|
|
434
|
+
// Режим применения фильтров.
|
|
435
|
+
// data-атрибуты: data-filters-apply | data-filters-apply-mode
|
|
436
|
+
apply: 'auto', // auto | manual
|
|
437
|
+
// Селекторы кнопок применения/сброса.
|
|
438
|
+
// data-attributes: data-filters-button-apply | data-filters-button-reset
|
|
439
|
+
button: {
|
|
440
|
+
apply: '[data-filter-apply]',
|
|
441
|
+
reset: '[data-filter-reset]',
|
|
442
|
+
},
|
|
443
|
+
// Отдельный route для фильтрации (опционально).
|
|
444
|
+
// data-атрибуты: data-filters-route
|
|
445
|
+
route: '',
|
|
446
|
+
// Атрибут ключа фильтра (канонический field id).
|
|
447
|
+
// data-атрибуты: data-filters-field-attr
|
|
448
|
+
fieldAttr: 'data-filter-field',
|
|
449
|
+
// Атрибут части фильтра (value|operator).
|
|
450
|
+
// data-атрибуты: data-filters-part-attr
|
|
451
|
+
partAttr: 'data-filter-part',
|
|
452
|
+
// Атрибут типа сравнения (eq|contains|gt|...).
|
|
453
|
+
// data-атрибуты: data-filters-type-attr
|
|
454
|
+
typeAttr: 'data-filter-type',
|
|
455
|
+
// Атрибут значения по умолчанию для фильтра.
|
|
456
|
+
// data-атрибуты: data-filters-value-attr
|
|
457
|
+
valueAttr: 'data-filter-value',
|
|
458
|
+
// Атрибут оператора по умолчанию для фильтра.
|
|
459
|
+
// data-атрибуты: data-filters-operator-attr
|
|
460
|
+
operatorAttr: 'data-filter-operator',
|
|
461
|
+
// Оператор по умолчанию.
|
|
462
|
+
// data-атрибуты: data-filters-default-operator
|
|
463
|
+
defaultOperator: 'eq',
|
|
464
|
+
// Сбрасывать страницу при изменении фильтров.
|
|
465
|
+
// data-атрибуты: data-filters-reset-page-on-change
|
|
466
|
+
resetPageOnChange: true,
|
|
467
|
+
// Пропускать пустые значения фильтров.
|
|
468
|
+
// data-атрибуты: data-filters-skip-empty
|
|
469
|
+
skipEmpty: true,
|
|
470
|
+
// Trim текстовых значений.
|
|
471
|
+
// data-атрибуты: data-filters-trim-values
|
|
472
|
+
trimValues: true,
|
|
473
|
+
// Всегда эмитить полный контекст sent/received для callbacks/events.
|
|
474
|
+
// data-атрибуты: data-filters-emit-full-context
|
|
475
|
+
emitFullContext: true,
|
|
476
|
+
// URL-state для фильтров.
|
|
477
|
+
urlState: {
|
|
478
|
+
// data-атрибуты: data-filters-urlstate-enable
|
|
479
|
+
enable: false,
|
|
480
|
+
// data-атрибуты: data-filters-urlstate-read-on-init
|
|
481
|
+
readOnInit: true,
|
|
482
|
+
// data-атрибуты: data-filters-urlstate-write-on-change
|
|
483
|
+
writeOnChange: true,
|
|
484
|
+
// data-атрибуты: data-filters-urlstate-history-mode
|
|
485
|
+
historyMode: 'replace', // replace | push
|
|
486
|
+
// data-атрибуты: data-filters-urlstate-prefix
|
|
487
|
+
paramPrefix: 'f.',
|
|
488
|
+
// data-атрибуты: data-filters-urlstate-page-key
|
|
489
|
+
pageKey: 'page',
|
|
490
|
+
// data-атрибуты: data-filters-urlstate-per-page-key
|
|
491
|
+
perPageKey: 'perPage',
|
|
492
|
+
// data-атрибуты: data-filters-urlstate-sort-key
|
|
493
|
+
sortKey: 'sort',
|
|
494
|
+
},
|
|
495
|
+
// Конфигурация транспортного payload.
|
|
496
|
+
transport: {
|
|
497
|
+
// data-атрибуты: data-filters-payload-key
|
|
498
|
+
payloadKey: 'filters',
|
|
499
|
+
// data-атрибуты: data-filters-include-meta
|
|
500
|
+
includeMeta: true,
|
|
501
|
+
// data-атрибуты: data-filters-include-urlstate
|
|
502
|
+
includeUrlState: true,
|
|
503
|
+
},
|
|
504
|
+
// Конфигурация response mapping.
|
|
505
|
+
response: {
|
|
506
|
+
// data-атрибуты: data-filters-response-rows-path
|
|
507
|
+
rowsPath: 'data.rows',
|
|
508
|
+
// data-атрибуты: data-filters-response-total-path
|
|
509
|
+
totalPath: 'data.total',
|
|
510
|
+
// data-атрибуты: data-filters-response-meta-path
|
|
511
|
+
metaPath: 'meta',
|
|
512
|
+
// data-атрибуты: data-filters-response-applied-filters-path
|
|
513
|
+
appliedFiltersPath: 'meta.appliedFilters',
|
|
514
|
+
},
|
|
515
|
+
},
|
|
516
|
+
|
|
517
|
+
urlState: {
|
|
518
|
+
// Canonical key for enable flag.
|
|
519
|
+
// data-attributes: data-url-state-enable
|
|
520
|
+
enable: false,
|
|
521
|
+
// Режим history обновлений.
|
|
522
|
+
// data-атрибуты: data-url-state-mode | data-url-state-mode
|
|
523
|
+
mode: 'replace', // replace | push
|
|
524
|
+
include: {
|
|
525
|
+
// data-attributes: data-urlstate-include-pagination
|
|
526
|
+
pagination: false,
|
|
527
|
+
// data-attributes: data-urlstate-include-sort
|
|
528
|
+
sort: false,
|
|
529
|
+
},
|
|
530
|
+
listen: {
|
|
531
|
+
// data-attributes: data-url-state-listen-popstate
|
|
532
|
+
popstate: false,
|
|
533
|
+
},
|
|
534
|
+
},
|
|
535
|
+
|
|
536
|
+
editable: {
|
|
537
|
+
// Enable editable mode.
|
|
538
|
+
// data-attributes: data-editable-enable
|
|
539
|
+
enable: false,
|
|
540
|
+
// Enable drag-and-drop row reorder.
|
|
541
|
+
// data-attributes: data-row-reorder-enable
|
|
542
|
+
rowReorder: true,
|
|
543
|
+
// Row reorder drag mode.
|
|
544
|
+
// data-attributes: data-row-reorder-mode
|
|
545
|
+
rowReorderMode: 'row', // row | handle
|
|
546
|
+
// CSS selector for explicit drag handle inside row.
|
|
547
|
+
// data-attributes: data-row-reorder-handle-selector
|
|
548
|
+
rowReorderHandleSelector: '[data-row-reorder-handle]',
|
|
549
|
+
},
|
|
550
|
+
|
|
551
|
+
callbacks: {
|
|
552
|
+
// Событие инициализации.
|
|
553
|
+
onInit: null,
|
|
554
|
+
// Начало remote-загрузки.
|
|
555
|
+
onBeforeLoad: null,
|
|
556
|
+
// Успешная загрузка данных.
|
|
557
|
+
onDataLoaded: null,
|
|
558
|
+
// Ошибка загрузки.
|
|
559
|
+
onError: null,
|
|
560
|
+
// Успех HTTP-запроса (расширенный контекст sent/received).
|
|
561
|
+
onRequestSuccess: null,
|
|
562
|
+
// Ошибка HTTP-запроса (расширенный контекст sent/error).
|
|
563
|
+
onRequestError: null,
|
|
564
|
+
// Пришел устаревший ответ и был отброшен.
|
|
565
|
+
onStaleResponse: null,
|
|
566
|
+
// Синхронизация urlState: чтение.
|
|
567
|
+
onUrlStateRead: null,
|
|
568
|
+
// Синхронизация urlState: запись.
|
|
569
|
+
onUrlStateWrite: null,
|
|
570
|
+
// Ошибка чтения/записи urlState.
|
|
571
|
+
onUrlStateError: null,
|
|
572
|
+
// Пустой результат после загрузки.
|
|
573
|
+
onEmptyResult: null,
|
|
574
|
+
// Завершение рендера после ответа сервера.
|
|
575
|
+
onAfterRender: null,
|
|
576
|
+
// Синхронизация финального состояния таблицы.
|
|
577
|
+
onStateSync: null,
|
|
578
|
+
// Изменение сортировки.
|
|
579
|
+
onSortChange: null,
|
|
580
|
+
// Изменение страницы.
|
|
581
|
+
onPageChange: null,
|
|
582
|
+
// Изменение per-page.
|
|
583
|
+
onPerPageChange: null,
|
|
584
|
+
// Изменение поискового запроса.
|
|
585
|
+
onSearch: null,
|
|
586
|
+
// Изменение фильтров.
|
|
587
|
+
onFiltersChange: null,
|
|
588
|
+
// Сброс фильтров/поиска.
|
|
589
|
+
onReset: null,
|
|
590
|
+
// Изменение чекбокса строки в editable-режиме.
|
|
591
|
+
onRowCheck: null,
|
|
592
|
+
// Изменение чекбокса "выбрать все" в editable-режиме.
|
|
593
|
+
onCheckAll: null,
|
|
594
|
+
// Ручная перестановка строк в editable-режиме.
|
|
595
|
+
onRowReorder: null,
|
|
596
|
+
// Запуск экспорта.
|
|
597
|
+
onExport: null,
|
|
598
|
+
// Операции сохраненных видов.
|
|
599
|
+
onViewChange: null,
|
|
600
|
+
// Раскрытие строки в tree-data.
|
|
601
|
+
onRowExpand: null,
|
|
602
|
+
// Коллапс строки в tree-data.
|
|
603
|
+
onRowCollapse: null,
|
|
604
|
+
// Переключение состояния строки в tree-data.
|
|
605
|
+
onRowToggle: null,
|
|
606
|
+
// Перестановка колонок.
|
|
607
|
+
onColumnReorder: null,
|
|
608
|
+
// Изменение ширины колонки.
|
|
609
|
+
onColumnResize: null,
|
|
610
|
+
onColumnFixed: null,
|
|
611
|
+
},
|
|
612
|
+
|
|
613
|
+
events: {
|
|
614
|
+
// Включить dispatch CustomEvent-событий.
|
|
615
|
+
// data-атрибуты: data-events-enabled
|
|
616
|
+
enable: true,
|
|
617
|
+
// Префикс событий (например, vgdt:dataloaded).
|
|
618
|
+
// data-атрибуты: data-events-prefix
|
|
619
|
+
prefix: 'vgdt',
|
|
620
|
+
// Распространять события вверх по DOM (bubbles).
|
|
621
|
+
// data-атрибуты: data-events-bubbles
|
|
622
|
+
bubbles: true,
|
|
623
|
+
},
|
|
624
|
+
|
|
625
|
+
persistence: {
|
|
626
|
+
// Глобальный toggle persistence.
|
|
627
|
+
// data-атрибуты: data-persistence-enabled
|
|
628
|
+
enable: false,
|
|
629
|
+
// Общий ключ storage для persistence.
|
|
630
|
+
// data-атрибуты: data-persistence-storage-key
|
|
631
|
+
storageKey: '',
|
|
632
|
+
// Сохранять тему.
|
|
633
|
+
// data-атрибуты: data-persistence-theme
|
|
634
|
+
theme: false,
|
|
635
|
+
// Сохранять локаль.
|
|
636
|
+
// data-атрибуты: data-persistence-locale
|
|
637
|
+
locale: false,
|
|
638
|
+
// Сохранять режим применения фильтров.
|
|
639
|
+
// data-атрибуты: data-persistence-filters-apply-mode
|
|
640
|
+
filtersApply: false,
|
|
641
|
+
},
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
export default DEFAULT_OPTIONS;
|
|
645
|
+
|
|
646
|
+
|