@boobooking/dashboard-ui-components 0.7.0 → 0.9.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 +164 -7
- package/dist/index.js +564 -286
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,6 +13,30 @@ import '@boobooking/dashboard-ui-components/style.css'
|
|
|
13
13
|
|
|
14
14
|
Стили пакета подключаются **до** стилей приложения.
|
|
15
15
|
|
|
16
|
+
### Подключение к приложению
|
|
17
|
+
|
|
18
|
+
Плагин `dashboardUi` задаёт язык и переход по ссылкам пакета. Оба параметра
|
|
19
|
+
необязательны; без плагина компоненты русскоязычные, а ссылки — обычные `<a>`.
|
|
20
|
+
|
|
21
|
+
```js
|
|
22
|
+
import { dashboardUi } from '@boobooking/dashboard-ui-components'
|
|
23
|
+
import { router } from '@inertiajs/vue3'
|
|
24
|
+
|
|
25
|
+
createApp(App).use(dashboardUi, {
|
|
26
|
+
lang: 'en',
|
|
27
|
+
navigate: (href) => router.visit(href),
|
|
28
|
+
})
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- `lang` — `'ru'` (по умолчанию) или `'en'`; другое значение — ошибка в `app.use`.
|
|
32
|
+
- `navigate(href)` — переход приложения по адресу: для Inertia
|
|
33
|
+
`router.visit(href)`, для Vue Router `router.push(href)`. Компоненты рисуют
|
|
34
|
+
настоящий `<a href>` и отдают `navigate` только обычный клик левой кнопкой;
|
|
35
|
+
клики с Ctrl/Cmd/Shift/Alt, средней кнопкой и ссылки с `target` остаются
|
|
36
|
+
браузеру. Без `navigate` браузер идёт по ссылке сам.
|
|
37
|
+
|
|
38
|
+
`navigate` получает адрес ровно таким, каким он лежит в компоненте: `Pagination` отдаёт `links` Laravel как есть, а это абсолютные URL. С Vue Router приложение само превращает их в маршрут, например `new URL(href).pathname + search`, и только потом зовёт `router.push`.
|
|
39
|
+
|
|
16
40
|
## Требования
|
|
17
41
|
|
|
18
42
|
Vue не ниже 3.5, ESM, сборщик, умеющий импорт CSS из пакета. Версия 3.5 нужна
|
|
@@ -24,10 +48,11 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
24
48
|
|
|
25
49
|
## Компоненты
|
|
26
50
|
|
|
27
|
-
Пакет экспортирует
|
|
51
|
+
Пакет экспортирует семнадцать компонентов: `Popup`, `Dot`, `PickDay`,
|
|
28
52
|
`RussianMobileFilter`, `Search`, `SelectDateInterval`, `SelectSingle`,
|
|
29
53
|
`SmallBadge`, `ErrorMessages`, `Closer`, `DownloadLink`, `Modal`,
|
|
30
|
-
`ConfirmationModal`, `DropdownButtonWithAction
|
|
54
|
+
`ConfirmationModal`, `DropdownButtonWithAction`, `Pagination`,
|
|
55
|
+
`NavigationMenuElement`, `PageCard` и плагин `dashboardUi`. В архив пакета
|
|
31
56
|
(`files: ["dist"]`) исходники не
|
|
32
57
|
попадают, поэтому контракт каждого компонента — здесь и в playground, а не в
|
|
33
58
|
исходном коде.
|
|
@@ -79,6 +104,7 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
79
104
|
| `modelValue` | `String` | `""` | Текущая дата |
|
|
80
105
|
| `withEraser` | `Boolean` | `true` | Показывать ли ластик очистки |
|
|
81
106
|
| `placeholderText` | `String` | `""` | Текст подсказки в пустом поле |
|
|
107
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"`; календарь берёт язык при монтировании |
|
|
82
108
|
|
|
83
109
|
События: `update:modelValue` — при выборе даты в календаре и при очистке
|
|
84
110
|
(пустой строкой); `changed` — в тех же двух случаях, для использования наравне
|
|
@@ -144,6 +170,7 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
144
170
|
| `header` | `String` | обязателен | Подпись поля |
|
|
145
171
|
| `isRequired` | `Boolean` | `false` | Пометка обязательности в заголовке |
|
|
146
172
|
| `isLoading` | `Boolean` | `false` | Индикатор загрузки в заголовке |
|
|
173
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"`; действует и на подсказки полей, и на оба календаря |
|
|
147
174
|
|
|
148
175
|
События: `update:dateFrom`, `update:dateTo` — на каждый выбор в
|
|
149
176
|
соответствующем `PickDay`; `changed` — когда новое значение отличается от
|
|
@@ -218,7 +245,8 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
218
245
|
| Проп | Тип | По умолчанию | Описание |
|
|
219
246
|
| --- | --- | --- | --- |
|
|
220
247
|
| `url` | `String` | обязателен | Адрес файла |
|
|
221
|
-
| `title` | `String` | `
|
|
248
|
+
| `title` | `String` | `null` | Подпись и всплывающая подсказка; без него — «Скачать» / «Download» по языку |
|
|
249
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
222
250
|
|
|
223
251
|
Событий нет.
|
|
224
252
|
|
|
@@ -254,6 +282,12 @@ Escape: видимостью управляет родитель, как у `Con
|
|
|
254
282
|
`<modal>` попадают на полноэкранный корень, а не на панель: размер панели и
|
|
255
283
|
атрибуты диалога вроде `aria-describedby` снаружи не задаются.
|
|
256
284
|
|
|
285
|
+
Панель не обрезает содержимое, чтобы выпадающие списки и календари внутри
|
|
286
|
+
модалки могли выходить за её край. Поэтому блок слота со своим фоном у края
|
|
287
|
+
панели сам скругляет внешние углы — верхний `rounded-t-lg`, нижний
|
|
288
|
+
`rounded-b-lg`, — иначе его квадратные углы закроют скругление панели. Так
|
|
289
|
+
сделано у `ConfirmationModal`.
|
|
290
|
+
|
|
257
291
|
### ConfirmationModal
|
|
258
292
|
|
|
259
293
|
Модалка подтверждения действия: заголовок, текст, кнопка действия и кнопка
|
|
@@ -275,8 +309,9 @@ Escape: видимостью управляет родитель, как у `Con
|
|
|
275
309
|
| `type` | `String` | `"warning"` | `"warning"` (жёлтая) или `"dangerous"` (красная) |
|
|
276
310
|
| `confirmationHeading` | `String` | `""` | Заголовок |
|
|
277
311
|
| `confirmationText` | `String` | `""` | Текст под заголовком |
|
|
278
|
-
| `cancelButtonText` | `String` | `
|
|
312
|
+
| `cancelButtonText` | `String` | `null` | Подпись кнопки отмены; без него — «Отмена» / «Cancel» по языку |
|
|
279
313
|
| `actionButtonText` | `String` | обязателен | Подпись кнопки действия |
|
|
314
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
280
315
|
|
|
281
316
|
События: `actionConfirmed` — по кнопке действия, `actionCanceled` — по кнопке
|
|
282
317
|
отмены. Ни одна из кнопок модалку не закрывает — см. раздел «Почему у
|
|
@@ -296,12 +331,125 @@ ConfirmationModal нет v-model».
|
|
|
296
331
|
| Проп | Тип | По умолчанию | Описание |
|
|
297
332
|
| --- | --- | --- | --- |
|
|
298
333
|
| `modelValue` | `Boolean` | `false` | Открыто ли меню |
|
|
334
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
299
335
|
|
|
300
336
|
Событие: `update:modelValue` — только когда меню открыл или закрыл сам
|
|
301
337
|
компонент: клик по стрелке, клик вне меню, Escape. Значение, пришедшее от
|
|
302
338
|
родителя, компонент принимает молча: ответное событие вернуло бы родителю его
|
|
303
339
|
же решение. Без `v-model` меню работает само по себе.
|
|
304
340
|
|
|
341
|
+
### Pagination
|
|
342
|
+
|
|
343
|
+
Переход на предыдущую и следующую страницу и строка «Показаны результаты X - Y
|
|
344
|
+
из Z» для списков на Laravel API Resource.
|
|
345
|
+
|
|
346
|
+
<pagination class="mt-6" :links="orders.links" :meta="orders.meta" />
|
|
347
|
+
|
|
348
|
+
| Проп | Тип | По умолчанию | Описание |
|
|
349
|
+
| --- | --- | --- | --- |
|
|
350
|
+
| `links` | `Object` | обязателен | `{ prev, next }` — адреса соседних страниц или `null` |
|
|
351
|
+
| `meta` | `Object` | обязателен | `{ from, to, total }` |
|
|
352
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
353
|
+
|
|
354
|
+
Если записей нет — `meta` не задан или `meta.total` не больше нуля, —
|
|
355
|
+
компонент ничего не рисует. Строка «Показаны результаты» — только когда в
|
|
356
|
+
`meta` есть числовые `from` и `to`. Кнопка — только при непустом адресе в
|
|
357
|
+
`links.prev` / `links.next`; при `links: null` остаётся одна строка
|
|
358
|
+
результатов. Ссылки — через `navigate` плагина. Событий нет.
|
|
359
|
+
|
|
360
|
+
### NavigationMenuElement
|
|
361
|
+
|
|
362
|
+
Пункт меню шапки: ссылка с подчёркиванием активного раздела.
|
|
363
|
+
|
|
364
|
+
<navigation-menu-element name="Заказы" :url="route('orders')" :is-active="isOrders" />
|
|
365
|
+
|
|
366
|
+
| Проп | Тип | По умолчанию | Описание |
|
|
367
|
+
| --- | --- | --- | --- |
|
|
368
|
+
| `url` | `String` | обязателен | Адрес раздела |
|
|
369
|
+
| `name` | `String` | обязателен | Подпись |
|
|
370
|
+
| `isActive` | `Boolean` | `false` | Активный раздел |
|
|
371
|
+
|
|
372
|
+
Ссылка — через `navigate` плагина. Событий нет.
|
|
373
|
+
|
|
374
|
+
### PageCard
|
|
375
|
+
|
|
376
|
+
Карточка отдельной страницы — формы или просмотра записи — по центру с
|
|
377
|
+
крестиком «назад по истории».
|
|
378
|
+
|
|
379
|
+
<page-card class="px-4 pt-4 sm:px-6 sm:pt-6">
|
|
380
|
+
<h3 class="pr-(--bb-closer-space) text-lg font-medium">Создание администратора</h3>
|
|
381
|
+
…поля формы…
|
|
382
|
+
</page-card>
|
|
383
|
+
|
|
384
|
+
Страница просмотра, у секций которой свои отступы:
|
|
385
|
+
|
|
386
|
+
<page-card>
|
|
387
|
+
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
|
|
388
|
+
<h3 class="pr-(--bb-closer-space) text-lg font-medium">{{ name }}</h3>
|
|
389
|
+
</div>
|
|
390
|
+
<div class="overflow-hidden sm:rounded-b-lg">…строки…</div>
|
|
391
|
+
</page-card>
|
|
392
|
+
|
|
393
|
+
Карточка — `relative my-6 mx-auto bg-white shadow-xl sm:max-w-xl
|
|
394
|
+
sm:rounded-lg`, `box-sizing: border-box`. Отступов у неё нет: форма передаёт
|
|
395
|
+
их классом на корень, страница просмотра — не передаёт. Классы и атрибуты
|
|
396
|
+
приложения попадают на корень и сильнее классов пакета. Ресет пакета на
|
|
397
|
+
карточку и её содержимое не распространяется: разметка страницы, в том числе
|
|
398
|
+
поля `@tailwindcss/forms`, выглядит так же, как вне карточки.
|
|
399
|
+
|
|
400
|
+
Крестик показан, если в истории вкладки больше одной записи
|
|
401
|
+
(`history.length > 1`, значение читается при создании компонента), и по клику
|
|
402
|
+
возвращает назад (`history.back()`). `PageCard` читает историю браузера при
|
|
403
|
+
создании компонента, поэтому ему нужен браузер: серверный рендеринг (SSR) не
|
|
404
|
+
поддерживается. `history.length` считает и записи впереди
|
|
405
|
+
текущей, поэтому это не гарантия, что назад есть куда. От `md` крестик стоит
|
|
406
|
+
снаружи карточки, на `1rem` правее её края; ниже `md` — в её правом верхнем
|
|
407
|
+
углу. Порог рассчитан на карточку по центру области на всю ширину страницы: в
|
|
408
|
+
узкой колонке или рядом с боковой панелью места снаружи может не хватить. Он
|
|
409
|
+
рассчитан и на ширину карточки по умолчанию (`max-w-xl`, 36rem): если передать
|
|
410
|
+
классом на корень более широкую, места снаружи тоже может не хватить.
|
|
411
|
+
|
|
412
|
+
Заголовок оставляет место под крестик правым отступом из переменной
|
|
413
|
+
`--bb-closer-space`: `3.5rem`, пока крестик в углу, `0` — когда он снаружи или
|
|
414
|
+
его нет. В Tailwind это `pr-(--bb-closer-space)`; без Tailwind 4 — обычный CSS
|
|
415
|
+
`padding-right: var(--bb-closer-space)`, а в Tailwind 3 —
|
|
416
|
+
`pr-[var(--bb-closer-space)]`. Вне `PageCard` отступ равен нулю.
|
|
417
|
+
|
|
418
|
+
Карточка не обрезает содержимое, как `Modal`: выпадающие списки и календари
|
|
419
|
+
могут выходить за её край. Блок со своим фоном у края карточки скругляет свои
|
|
420
|
+
углы сам — например, нижний блок строк: `overflow-hidden sm:rounded-b-lg`.
|
|
421
|
+
|
|
422
|
+
Крестик доступен с клавиатуры: Tab, Enter, пробел; в порядке табуляции крестик
|
|
423
|
+
идёт после содержимого карточки; при фокусе с клавиатуры
|
|
424
|
+
вокруг него кольцо. Доступное имя — «Назад» / «Back».
|
|
425
|
+
|
|
426
|
+
| Проп | Тип | По умолчанию | Описание |
|
|
427
|
+
| --- | --- | --- | --- |
|
|
428
|
+
| `lang` | `String` | язык плагина | `"ru"` или `"en"` |
|
|
429
|
+
|
|
430
|
+
Событий нет.
|
|
431
|
+
|
|
432
|
+
## Языки
|
|
433
|
+
|
|
434
|
+
Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
|
|
435
|
+
он задан, иначе язык плагина `dashboardUi`, иначе русский. Явно переданный текст
|
|
436
|
+
главнее языка: `cancel-button-text` у `ConfirmationModal`, `title` у
|
|
437
|
+
`DownloadLink`.
|
|
438
|
+
|
|
439
|
+
| Компонент | `ru` | `en` |
|
|
440
|
+
| --- | --- | --- |
|
|
441
|
+
| `ConfirmationModal` — кнопка отмены | Отмена | Cancel |
|
|
442
|
+
| `DownloadLink` — подпись | Скачать | Download |
|
|
443
|
+
| `DropdownButtonWithAction` — подпись стрелки для скринридера | Открыть меню | Open menu |
|
|
444
|
+
| `PickDay` — месяцы, дни недели, кнопки календаря | по-русски | in English |
|
|
445
|
+
| `SelectDateInterval` — подсказки полей | от / до | from / to |
|
|
446
|
+
| `Pagination` | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
|
|
447
|
+
| `PageCard` — доступное имя крестика | Назад | Back |
|
|
448
|
+
|
|
449
|
+
Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
|
|
450
|
+
Неделя начинается с понедельника. Календарь `PickDay` берёт язык при
|
|
451
|
+
монтировании: смена языка после монтирования в нём не отражается.
|
|
452
|
+
|
|
305
453
|
## Правила API пакета
|
|
306
454
|
|
|
307
455
|
Компонент, добавляемый в пакет, следует тем же правилам, что и уже
|
|
@@ -332,6 +480,15 @@ ConfirmationModal нет v-model».
|
|
|
332
480
|
префикса не сгенерируется. Классы в `:class` пишутся литералами — ключами
|
|
333
481
|
объекта, ветками тернарного оператора, элементами массива. Оба правила
|
|
334
482
|
проверяет `tests/utilityPrefix.test.js`.
|
|
483
|
+
- Тексты интерфейса — только в `src/i18n.js`, в словарях `ru` и `en` с
|
|
484
|
+
одинаковыми ключами; компонент берёт их через миксин `withLang`
|
|
485
|
+
(`this.texts`) и получает проп `lang`.
|
|
486
|
+
- Ссылка компонента — настоящий `<a href>`; обычный клик — через
|
|
487
|
+
`followLink($event, href)` миксина `withNavigation`, который отдаёт его
|
|
488
|
+
`navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Исключение —
|
|
489
|
+
`DownloadLink`: это обычная ссылка браузера, скачивающая файл, и через
|
|
490
|
+
`navigate` она не идёт. Через `navigate` ходят `Pagination` и
|
|
491
|
+
`NavigationMenuElement`.
|
|
335
492
|
|
|
336
493
|
## Почему у Popup и Dot нет события changed
|
|
337
494
|
|
|
@@ -366,7 +523,7 @@ ConfirmationModal нет v-model».
|
|
|
366
523
|
|
|
367
524
|
npm run playground
|
|
368
525
|
|
|
369
|
-
Поднимает демо-страницы со всеми
|
|
526
|
+
Поднимает демо-страницы со всеми семнадцатью компонентами в двух окружениях:
|
|
370
527
|
голом (без Tailwind и стилей приложения) и в окружении приложения (с
|
|
371
528
|
Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
|
|
372
529
|
основной способ посмотреть, как компоненты выглядят и ведут себя, а не
|
|
@@ -379,8 +536,8 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
|
|
|
379
536
|
которое типографику не задаёт, компоненты отрисуются браузерными умолчаниями:
|
|
380
537
|
рабочими, но чужими на вид.
|
|
381
538
|
|
|
382
|
-
|
|
383
|
-
|
|
539
|
+
Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
|
|
540
|
+
задаётся, см. «Языки».
|
|
384
541
|
|
|
385
542
|
## Ограничение
|
|
386
543
|
|