@boobooking/dashboard-ui-components 0.11.1 → 0.13.0
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/README.md +243 -62
- package/dist/index.js +813 -357
- package/dist/style.css +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -15,16 +15,19 @@ import '@boobooking/dashboard-ui-components/style.css'
|
|
|
15
15
|
|
|
16
16
|
### Подключение к приложению
|
|
17
17
|
|
|
18
|
-
Плагин `dashboardUi` задаёт
|
|
19
|
-
|
|
18
|
+
Плагин `dashboardUi` задаёт язык, переход по ссылкам пакета и адрес
|
|
19
|
+
страницы на экране. Все параметры необязательны; без плагина компоненты
|
|
20
|
+
русскоязычные, ссылки — обычные `<a>`, а `PageCard` закрывается только на
|
|
21
|
+
`fallback-url`.
|
|
20
22
|
|
|
21
23
|
```js
|
|
22
24
|
import { dashboardUi } from '@boobooking/dashboard-ui-components'
|
|
23
|
-
import { router } from '@inertiajs/vue3'
|
|
25
|
+
import { router, usePage } from '@inertiajs/vue3'
|
|
24
26
|
|
|
25
27
|
createApp(App).use(dashboardUi, {
|
|
26
28
|
lang: 'en',
|
|
27
29
|
navigate: (href) => router.visit(href),
|
|
30
|
+
currentUrl: () => usePage().url,
|
|
28
31
|
})
|
|
29
32
|
```
|
|
30
33
|
|
|
@@ -35,9 +38,21 @@ createApp(App).use(dashboardUi, {
|
|
|
35
38
|
настоящий `<a href>` и отдают `navigate` только обычный клик левой кнопкой;
|
|
36
39
|
клики с Ctrl/Cmd/Shift/Alt, средней кнопкой и ссылки с `target` остаются
|
|
37
40
|
браузеру. Без `navigate` браузер идёт по ссылке сам.
|
|
41
|
+
- `currentUrl()` — адрес страницы на экране, по нему `PageCard` знает,
|
|
42
|
+
откуда его открыли. Для Inertia — `() => usePage().url` (проверено на
|
|
43
|
+
`@inertiajs/vue3` 3.6.1). Договор для другого роутера: функция читает
|
|
44
|
+
реактивное состояние роутера; её значение меняется при каждом показе
|
|
45
|
+
страницы с новым адресом, в том числе при замене записи истории,
|
|
46
|
+
«Назад»/«Вперёд» и первой загрузке, и меняется до создания компонентов
|
|
47
|
+
новой страницы; неуспешный или отменённый переход значения не меняет;
|
|
48
|
+
пока роутер не готов, функция возвращает `null` или `undefined`.
|
|
49
|
+
У Vue Router, например, до первой навигации `currentRoute` —
|
|
50
|
+
`START_LOCATION` с `fullPath === '/'`, и его надо отдавать как `null`.
|
|
51
|
+
Плагин следит за адресом только в браузере и перестаёт при
|
|
52
|
+
размонтировании приложения.
|
|
38
53
|
|
|
39
54
|
`navigate` получает адрес ровно таким, каким он лежит в компоненте:
|
|
40
|
-
`
|
|
55
|
+
пагинация `DataTable` отдаёт `links` Laravel как есть, а это абсолютные URL. С Vue
|
|
41
56
|
Router приложение само превращает их в маршрут, например
|
|
42
57
|
`new URL(href).pathname + search`, и только потом зовёт `router.push`.
|
|
43
58
|
|
|
@@ -50,12 +65,15 @@ Vue не ниже 3.5, ESM, сборщик, умеющий импорт CSS из
|
|
|
50
65
|
Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в CSS приложения
|
|
51
66
|
пакету не нужны.
|
|
52
67
|
|
|
68
|
+
Меню `DropdownButtonWithAction` стоит на Popover API браузера: Safari 17+,
|
|
69
|
+
Chrome 114+, Firefox 125+. В браузерах старше меню видно в потоке всегда.
|
|
70
|
+
|
|
53
71
|
## Компоненты
|
|
54
72
|
|
|
55
73
|
Пакет экспортирует семнадцать компонентов: `Popup`, `Dot`, `PickDay`,
|
|
56
74
|
`RussianMobileFilter`, `Search`, `SelectDateInterval`, `SelectSingle`,
|
|
57
75
|
`SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`,
|
|
58
|
-
`ConfirmationModal`, `DropdownButtonWithAction`, `
|
|
76
|
+
`ConfirmationModal`, `DropdownButtonWithAction`, `DataTable`,
|
|
59
77
|
`NavigationMenuElement`, `PageCard`, `NotificationMessage` и плагин
|
|
60
78
|
`dashboardUi`. В архив пакета (`files: ["dist"]`) исходники не попадают,
|
|
61
79
|
поэтому контракт каждого компонента — здесь и в playground, а не в исходном
|
|
@@ -312,28 +330,95 @@ ConfirmationModal нет v-model».
|
|
|
312
330
|
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
313
331
|
|
|
314
332
|
Событие: `update:modelValue` — только когда меню открыл или закрыл сам
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
333
|
+
компонент или браузер: клик по стрелке, клик вне меню, Escape, клик
|
|
334
|
+
по пункту меню, прокрутка, изменение размера окна. Значение, пришедшее
|
|
335
|
+
от родителя, компонент принимает молча: ответное событие вернуло бы
|
|
336
|
+
родителю его же решение. Без `v-model` меню работает само по себе.
|
|
337
|
+
|
|
338
|
+
Меню открывается в верхнем слое браузера (Popover API): его не обрезает
|
|
339
|
+
таблица с горизонтальной прокруткой, и оно стоит поверх страницы. Правый
|
|
340
|
+
край меню — по правому краю стрелки; меню открывается вниз или вверх —
|
|
341
|
+
где больше места, сужается у левого края окна и закрывается кликом
|
|
342
|
+
по любому пункту, прокруткой страницы или таблицы и изменением размера
|
|
343
|
+
окна. Открытие другого меню закрывает предыдущее.
|
|
344
|
+
|
|
345
|
+
### DataTable
|
|
346
|
+
|
|
347
|
+
Список данных: бейдж «Найдено X: N», таблица в карточке с горизонтальной
|
|
348
|
+
прокруткой, пустое состояние и пагинация — по ответу Laravel API Resource
|
|
349
|
+
`{ data, meta, links }`. Особые ячейки — слотами.
|
|
350
|
+
|
|
351
|
+
<data-table
|
|
352
|
+
:rows="orderObjects"
|
|
353
|
+
:columns="columns"
|
|
354
|
+
row-key="uuid"
|
|
355
|
+
:meta="orders.meta"
|
|
356
|
+
:links="orders.links"
|
|
357
|
+
found-text="Найдено ордеров"
|
|
358
|
+
empty-text="Не найдено ордеров"
|
|
359
|
+
>
|
|
360
|
+
<template #results-actions>
|
|
361
|
+
<download-link :url="exportUrl" title="скачать xlsx" />
|
|
362
|
+
</template>
|
|
363
|
+
<template #cell-status="{ row }">
|
|
364
|
+
<small-badge :text="row.statusLabel" :color="row.statusColor" />
|
|
365
|
+
</template>
|
|
366
|
+
</data-table>
|
|
367
|
+
|
|
368
|
+
columns: [
|
|
369
|
+
{ key: 'phone', label: 'Телефон' },
|
|
370
|
+
{ key: 'vendor', label: 'Вендор / Сертификат', secondary: (row) => row.certificate },
|
|
371
|
+
{ key: 'amount', label: 'Номинал', align: 'right', muted: true },
|
|
372
|
+
{ key: 'status', label: 'Статус' },
|
|
373
|
+
{ key: 'cost', label: 'Стоимость', align: 'right', visible: isAdmin },
|
|
374
|
+
{ key: 'actions', align: 'right', narrow: true },
|
|
375
|
+
]
|
|
325
376
|
|
|
326
377
|
| Проп | Тип | По умолчанию | Описание |
|
|
327
378
|
| --- | --- | --- | --- |
|
|
328
|
-
| `
|
|
329
|
-
| `
|
|
330
|
-
| `
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
`
|
|
335
|
-
`
|
|
336
|
-
|
|
379
|
+
| `rows` | `Array` | обязателен | Строки: обычные объекты или модели страницы |
|
|
380
|
+
| `columns` | `Array` | обязателен | Столбцы, см. ниже |
|
|
381
|
+
| `rowKey` | `String`, `Function` | обязателен | Имя поля ключа строки или `row => ключ` |
|
|
382
|
+
| `meta` | `Object` | `null` | `{ from, to, total }` пагинации Laravel; есть — внизу пагинация, а число в бейдже — `total` |
|
|
383
|
+
| `links` | `Object` | `null` | `{ prev, next }` пагинации Laravel |
|
|
384
|
+
| `foundText` | `String` | `null` | «Найдено ордеров» → бейдж «Найдено ордеров: 100», когда записи есть |
|
|
385
|
+
| `emptyText` | `String` | `null` | «Не найдено ордеров» — бейдж, когда записей нет |
|
|
386
|
+
| `variant` | `String` | `"page"` | `"page"` — отдельная карточка с тенью; `"card"` — таблица внутри карточки страницы, только линия сверху |
|
|
387
|
+
| `rowColor` | `Function` | `null` | `row => 'red' \| 'green' \| null` — цвет строки вместо полосатости |
|
|
388
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` — тексты пагинации |
|
|
389
|
+
|
|
390
|
+
Столбец:
|
|
391
|
+
|
|
392
|
+
| Поле | По умолчанию | Описание |
|
|
393
|
+
| --- | --- | --- |
|
|
394
|
+
| `key` | обязателен | Имя слота `cell-<key>` и поле значения по умолчанию |
|
|
395
|
+
| `label` | `""` | Заголовок; пустой — у столбца действий |
|
|
396
|
+
| `value` | `row => row[key]` | Основной текст ячейки. У моделей с геттерами — `(row) => row.getName()` |
|
|
397
|
+
| `secondary` | нет | `row => текст` — серая вторая строка |
|
|
398
|
+
| `muted` | `false` | Основной текст серый — даты, статусы, суммы |
|
|
399
|
+
| `align` | `"left"` | `"left"`, `"center"` или `"right"` — для заголовка и ячеек |
|
|
400
|
+
| `wrap` | `false` | Текст ячеек переносится |
|
|
401
|
+
| `narrow` | `false` | Ширина по содержимому — столбцы действий и иконок |
|
|
402
|
+
| `visible` | `true` | `false` — столбца нет вовсе: ни заголовка, ни ячеек, ни слота |
|
|
403
|
+
|
|
404
|
+
Скрытый столбец — только отображение: данные, которые пользователю видеть
|
|
405
|
+
нельзя, сервер не отдаёт.
|
|
406
|
+
|
|
407
|
+
Слоты: `#cell-<key>="{ row, index }"` — своя разметка ячейки (отступы,
|
|
408
|
+
выравнивание и перенос ячейки остаются за компонентом);
|
|
409
|
+
`#results-actions` — рядом с бейджем, только когда записи есть.
|
|
410
|
+
|
|
411
|
+
Пагинация: строка «Показаны результаты X - Y из Z» есть, только когда
|
|
412
|
+
`meta.from` и `meta.to` — числа; «Предыдущая» и «Следующая» — только когда
|
|
413
|
+
`links.prev` и `links.next` — непустые строки (`null`, пустая строка и
|
|
414
|
+
отсутствующий ключ — кнопки нет). Пагинации нет вовсе, когда `meta` не
|
|
415
|
+
передан или `meta.total` не больше нуля.
|
|
416
|
+
|
|
417
|
+
Записей нет — только бейдж с `emptyText`, без таблицы и пагинации; без
|
|
418
|
+
текстов — ничего. Страница за последней (`total` больше нуля, `rows` пуст) —
|
|
419
|
+
бейдж и пагинация без таблицы. Строки выравниваются по верху. Широкая
|
|
420
|
+
таблица прокручивается в своей карточке. Ссылки пагинации — через
|
|
421
|
+
`navigate` плагина. Событий нет.
|
|
337
422
|
|
|
338
423
|
### NavigationMenuElement
|
|
339
424
|
|
|
@@ -351,64 +436,137 @@ ConfirmationModal нет v-model».
|
|
|
351
436
|
|
|
352
437
|
### PageCard
|
|
353
438
|
|
|
354
|
-
Карточка отдельной страницы — формы или просмотра записи — по центру
|
|
355
|
-
|
|
439
|
+
Карточка отдельной страницы — формы или просмотра записи — по центру
|
|
440
|
+
с крестиком, который ведёт туда, откуда карточку открыли.
|
|
356
441
|
|
|
357
|
-
<page-card class="px-4 pt-4 sm:px-6 sm:pt-6">
|
|
442
|
+
<page-card class="px-4 pt-4 sm:px-6 sm:pt-6" :fallback-url="route('users')">
|
|
358
443
|
<h3 class="pr-(--bb-closer-space) text-lg font-medium">Создание администратора</h3>
|
|
359
444
|
…поля формы…
|
|
360
445
|
</page-card>
|
|
361
446
|
|
|
362
447
|
Страница просмотра, у секций которой свои отступы:
|
|
363
448
|
|
|
364
|
-
<page-card>
|
|
449
|
+
<page-card :fallback-url="route('payments')">
|
|
365
450
|
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
|
|
366
451
|
<h3 class="pr-(--bb-closer-space) text-lg font-medium">{{ name }}</h3>
|
|
367
452
|
</div>
|
|
368
453
|
<div class="overflow-hidden sm:rounded-b-lg">…строки…</div>
|
|
369
454
|
</page-card>
|
|
370
455
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
456
|
+
**Куда ведёт крестик.** Плагин `dashboardUi` с `currentUrl` (см.
|
|
457
|
+
«Подключение к приложению») помнит адрес страницы, которая была на экране
|
|
458
|
+
перед карточкой, со всеми её фильтрами и номером страницы, и крестик
|
|
459
|
+
ведёт ровно туда. Адрес не попадает ни в адрес страницы, ни в хранилища
|
|
460
|
+
браузера, ни в историю: он живёт в памяти приложения. «Как было» — это
|
|
461
|
+
адрес: прокрутку, несохранённый ввод и раскрытые элементы
|
|
462
|
+
страницы-источника карточка не возвращает.
|
|
463
|
+
|
|
464
|
+
Если адреса нет — карточку открыли в новой вкладке, прямой ссылкой, после
|
|
465
|
+
F5 или в приложении без `currentUrl`, — крестик ведёт на `fallback-url`.
|
|
466
|
+
Без `fallback-url` крестика нет. Истории браузера карточка не касается.
|
|
467
|
+
|
|
468
|
+
**Окна.** Открытая карточка — окно. Карточка, открытая со страницы
|
|
469
|
+
другой карточки (например, форма с таба), — вложенное окно: её крестик
|
|
470
|
+
ведёт на страницу, с которой её открыли, а крестик внешней карточки —
|
|
471
|
+
по-прежнему туда, откуда открыли её. Окно закрывается, когда показана
|
|
472
|
+
страница, куда оно возвращает: крестиком, «Отменой», после успешного
|
|
473
|
+
действия или кнопкой «Назад» браузера.
|
|
474
|
+
|
|
475
|
+
**Карточка из нескольких страниц** (табы) — постоянный макет этих страниц
|
|
476
|
+
Inertia с общим ключом окна:
|
|
477
|
+
|
|
478
|
+
export default {
|
|
479
|
+
layout: (props) => [PageCard, {
|
|
480
|
+
width: '7xl',
|
|
481
|
+
windowKey: `group:${props.group.data.uuid}`,
|
|
482
|
+
fallbackUrl: route('groups'),
|
|
483
|
+
class: 'px-4 py-4 sm:px-6 sm:py-6',
|
|
484
|
+
}],
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
`layout` — стрелочная функция одного аргумента или кортеж: обычную
|
|
488
|
+
функцию Inertia примет за компонент. Пока соседние страницы объявляют тот
|
|
489
|
+
же макет, карточка не пересоздаётся, и смена таба, фильтров и страницы
|
|
490
|
+
таблицы окна не меняет. Ключ окна по умолчанию — путь страницы без query:
|
|
491
|
+
отдельной странице-карточке его задавать не нужно, а если роутер
|
|
492
|
+
переиспользовал её для другой записи (`/users/1/edit` → `/users/2/edit`),
|
|
493
|
+
у неё новое окно. Ключ меняется только вместе со сменой страницы: смена
|
|
494
|
+
без неё оставляет карточку в прежнем окне и пишет предупреждение
|
|
495
|
+
в консоль. Рецепт проверен на `@inertiajs/vue3` 3.6.1.
|
|
496
|
+
|
|
497
|
+
**«Отмена» и закрытие из кода.** `close()` делает то же, что крестик.
|
|
498
|
+
Он доступен пропом слота по умолчанию и методом компонента:
|
|
499
|
+
|
|
500
|
+
<page-card ref="card" v-slot="{ close }" :fallback-url="route('users')">
|
|
501
|
+
…
|
|
502
|
+
<button type="button" @click="close">Отмена</button>
|
|
503
|
+
</page-card>
|
|
504
|
+
|
|
505
|
+
// после успешного сохранения
|
|
506
|
+
this.$refs.card.close()
|
|
507
|
+
|
|
508
|
+
`close()` переходит через `navigate` плагина, без него — полной загрузкой
|
|
509
|
+
страницы. Без адреса возврата и `fallback-url` он ничего не делает.
|
|
510
|
+
|
|
511
|
+
**Ширина и крестик.** От `width` зависят ширина карточки и порог, от
|
|
512
|
+
которого крестик стоит снаружи, на `1rem` правее её края; ниже порога —
|
|
513
|
+
в правом верхнем углу:
|
|
514
|
+
|
|
515
|
+
| `width` | Ширина от `sm` | Крестик снаружи |
|
|
516
|
+
| --- | --- | --- |
|
|
517
|
+
| `xl` (по умолчанию) | `max-w-xl` (36rem) | от `md` |
|
|
518
|
+
| `4xl` | `max-w-4xl` (56rem) | от `lg` |
|
|
519
|
+
| `7xl` | `max-w-7xl` (80rem) | от `2xl` |
|
|
520
|
+
|
|
521
|
+
Пороги рассчитаны на карточку по центру области на всю ширину страницы:
|
|
522
|
+
в узкой колонке или рядом с боковой панелью места снаружи может не
|
|
523
|
+
хватить.
|
|
391
524
|
|
|
392
525
|
Заголовок оставляет место под крестик правым отступом из переменной
|
|
393
|
-
`--bb-closer-space`: `3.5rem`, пока крестик в углу, `0` — когда он снаружи
|
|
394
|
-
его нет. В Tailwind это `pr-(--bb-closer-space)`; без Tailwind 4 —
|
|
395
|
-
`padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
|
|
526
|
+
`--bb-closer-space`: `3.5rem`, пока крестик в углу, `0` — когда он снаружи
|
|
527
|
+
или его нет. В Tailwind это `pr-(--bb-closer-space)`; без Tailwind 4 —
|
|
528
|
+
обычный CSS `padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
|
|
396
529
|
`pr-[var(--bb-closer-space)]`. Вне `PageCard` отступ равен нулю.
|
|
397
530
|
|
|
398
|
-
Карточка
|
|
399
|
-
|
|
400
|
-
|
|
531
|
+
**Атрибуты.** Карточка — `relative my-6 mx-auto bg-white shadow-xl
|
|
532
|
+
sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: форма
|
|
533
|
+
передаёт их классом на корень, страница просмотра — не передаёт. На корень
|
|
534
|
+
попадают `class`, `style`, `data-*` и `aria-*` приложения; классы
|
|
535
|
+
приложения сильнее классов пакета. Остальные атрибуты, в том числе `id`,
|
|
536
|
+
не переносятся: в роли макета карточка получает атрибутами пропы
|
|
537
|
+
страницы. Пропы страницы с именами пропов карточки — `lang`, `width`,
|
|
538
|
+
`fallbackUrl`, `windowKey` — приходят ей пропами, а не атрибутами; кортеж
|
|
539
|
+
макета перекрывает только те, что задаёт сам. Ресет пакета на карточку и её содержимое не распространяется:
|
|
540
|
+
разметка страницы, в том числе поля `@tailwindcss/forms`, выглядит так же,
|
|
541
|
+
как вне карточки.
|
|
542
|
+
|
|
543
|
+
Карточка не обрезает содержимое, как у `ConfirmationModal`: выпадающие
|
|
544
|
+
списки и календари могут выходить за её край. Блок со своим фоном у края
|
|
545
|
+
карточки скругляет свои углы сам — например, нижний блок строк:
|
|
401
546
|
`overflow-hidden sm:rounded-b-lg`.
|
|
402
547
|
|
|
403
|
-
Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции
|
|
404
|
-
идёт после содержимого карточки; при фокусе с клавиатуры
|
|
405
|
-
|
|
548
|
+
Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции
|
|
549
|
+
крестик идёт после содержимого карточки; при фокусе с клавиатуры вокруг
|
|
550
|
+
него кольцо. Доступное имя — «Назад» / «Back».
|
|
406
551
|
|
|
407
552
|
| Проп | Тип | По умолчанию | Описание |
|
|
408
553
|
| --- | --- | --- | --- |
|
|
554
|
+
| `width` | `String` | `"xl"` | `"xl"`, `"4xl"` или `"7xl"` |
|
|
555
|
+
| `fallback-url` | `String` | `null` | куда закрываться без адреса возврата; `""` — как `null` |
|
|
556
|
+
| `window-key` | `String` | путь страницы | общий ключ окна карточки из нескольких страниц |
|
|
409
557
|
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
410
558
|
|
|
411
|
-
Событий нет.
|
|
559
|
+
Событий нет. Проп слота по умолчанию — `close`.
|
|
560
|
+
|
|
561
|
+
Ограничения:
|
|
562
|
+
|
|
563
|
+
- память плагина не переживает F5 и новую вкладку: тогда работает
|
|
564
|
+
`fallback-url`;
|
|
565
|
+
- адреса сравниваются строкой: равнозначный адрес с другим порядком
|
|
566
|
+
параметров или с лишним `page=1` — другой адрес;
|
|
567
|
+
- если вернуться в карточку «Назад» или «Вперёд» после ухода из неё не
|
|
568
|
+
через крестик, адрес возврата — страница, с которой пришли в этот раз;
|
|
569
|
+
- на одной странице — одна карточка.
|
|
412
570
|
|
|
413
571
|
### NotificationMessage
|
|
414
572
|
|
|
@@ -465,7 +623,7 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
|
|
|
465
623
|
| `DropdownButtonWithAction` — подпись стрелки для скринридера | Открыть меню | Open menu |
|
|
466
624
|
| `PickDay` — месяцы, дни недели, кнопки календаря | по-русски | in English |
|
|
467
625
|
| `SelectDateInterval` — подсказки полей | от / до | from / to |
|
|
468
|
-
| `
|
|
626
|
+
| `DataTable` — пагинация | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
|
|
469
627
|
| `PageCard` — доступное имя крестика | Назад | Back |
|
|
470
628
|
| `NotificationMessage` — подпись крестика для скринридера | Закрыть | Close |
|
|
471
629
|
|
|
@@ -479,8 +637,9 @@ sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: ф
|
|
|
479
637
|
Inertia SSR), а серверная разметка гидратируется без расхождений. К API
|
|
480
638
|
браузера компоненты обращаются только после монтирования, поэтому:
|
|
481
639
|
|
|
482
|
-
- `PageCard` на сервере рисует
|
|
483
|
-
|
|
640
|
+
- `PageCard` на сервере рисует крестик, только если задан `fallback-url`:
|
|
641
|
+
адрес возврата известен только в браузере, и крестик, ведущий на него,
|
|
642
|
+
появляется после монтирования;
|
|
484
643
|
- `PickDay` загружает Pikaday в браузере при монтировании: календарь
|
|
485
644
|
появляется, когда загрузка закончится;
|
|
486
645
|
- остальные компоненты рендерятся на сервере так же, как в браузере.
|
|
@@ -522,7 +681,7 @@ Inertia SSR), а серверная разметка гидратируется
|
|
|
522
681
|
`followLink($event, href)` миксина `withNavigation`, который отдаёт его
|
|
523
682
|
`navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Исключение —
|
|
524
683
|
`DownloadLink`: это обычная ссылка браузера, скачивающая файл, и через
|
|
525
|
-
`navigate` она не идёт. Через `navigate` ходят `
|
|
684
|
+
`navigate` она не идёт. Через `navigate` ходят `DataTable` (его пагинация) и
|
|
526
685
|
`NavigationMenuElement`.
|
|
527
686
|
- Компонент обращается к `window`, `document` и другим API браузера только
|
|
528
687
|
в `mounted()`, `beforeUnmount()` и обработчиках событий; загрузка модуля,
|
|
@@ -580,6 +739,28 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
|
|
|
580
739
|
Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
|
|
581
740
|
задаётся, см. «Языки».
|
|
582
741
|
|
|
742
|
+
## Обновление с 0.12
|
|
743
|
+
|
|
744
|
+
- Крестик `PageCard` больше не ходит по истории: подключите `currentUrl`
|
|
745
|
+
к плагину и дайте карточкам `fallback-url`. Без них крестика нет.
|
|
746
|
+
- На корень `PageCard` переносятся только `class`, `style`, `data-*`
|
|
747
|
+
и `aria-*`.
|
|
748
|
+
- Карточка из нескольких страниц объявляет `PageCard` постоянным макетом
|
|
749
|
+
с `window-key` (см. раздел `PageCard`).
|
|
750
|
+
|
|
751
|
+
## Обновление с 0.11
|
|
752
|
+
|
|
753
|
+
- `Pagination` больше не экспортируется. Страница, импортирующая её
|
|
754
|
+
из пакета, переводит свой список на `DataTable`: бейдж «Найдено»,
|
|
755
|
+
таблица, пустое состояние и пагинация теперь в одном компоненте.
|
|
756
|
+
- Меню `DropdownButtonWithAction` открывается в верхнем слое браузера
|
|
757
|
+
и закрывается кликом по пункту. Страницы, которые сами закрывали меню
|
|
758
|
+
через `v-model` перед открытием модалки, работают как раньше. Клик по пункту
|
|
759
|
+
теперь закрывает меню и эмитит `update:modelValue(false)`: если обработчик
|
|
760
|
+
закрытия на странице сбрасывает состояние, на которое опирается модалка,
|
|
761
|
+
цель модалки держат в отдельном поле (как certificates: `editUser` отдельно
|
|
762
|
+
от `activeUser`).
|
|
763
|
+
|
|
583
764
|
## Ограничение
|
|
584
765
|
|
|
585
766
|
Утилиты пакета собраны с префиксом `bb`: классы внутри компонентов — вида
|