@boobooking/dashboard-ui-components 0.7.0 → 0.8.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 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
- Пакет экспортирует четырнадцать компонентов: `Popup`, `Dot`, `PickDay`,
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` и плагин `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,66 @@ 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
+ ## Языки
375
+
376
+ Тексты пакета есть на русском и английском. Язык компонента — проп `lang`, если
377
+ он задан, иначе язык плагина `dashboardUi`, иначе русский. Явно переданный текст
378
+ главнее языка: `cancel-button-text` у `ConfirmationModal`, `title` у
379
+ `DownloadLink`.
380
+
381
+ | Компонент | `ru` | `en` |
382
+ | --- | --- | --- |
383
+ | `ConfirmationModal` — кнопка отмены | Отмена | Cancel |
384
+ | `DownloadLink` — подпись | Скачать | Download |
385
+ | `DropdownButtonWithAction` — подпись стрелки для скринридера | Открыть меню | Open menu |
386
+ | `PickDay` — месяцы, дни недели, кнопки календаря | по-русски | in English |
387
+ | `SelectDateInterval` — подсказки полей | от / до | from / to |
388
+ | `Pagination` | Предыдущая / Следующая / Показаны результаты X - Y из Z | Previous / Next / Showing X - Y of Z results |
389
+
390
+ Формат даты — `дд.мм.гггг` в обоих языках: это формат значения, а не текст.
391
+ Неделя начинается с понедельника. Календарь `PickDay` берёт язык при
392
+ монтировании: смена языка после монтирования в нём не отражается.
393
+
305
394
  ## Правила API пакета
306
395
 
307
396
  Компонент, добавляемый в пакет, следует тем же правилам, что и уже
@@ -332,6 +421,15 @@ ConfirmationModal нет v-model».
332
421
  префикса не сгенерируется. Классы в `:class` пишутся литералами — ключами
333
422
  объекта, ветками тернарного оператора, элементами массива. Оба правила
334
423
  проверяет `tests/utilityPrefix.test.js`.
424
+ - Тексты интерфейса — только в `src/i18n.js`, в словарях `ru` и `en` с
425
+ одинаковыми ключами; компонент берёт их через миксин `withLang`
426
+ (`this.texts`) и получает проп `lang`.
427
+ - Ссылка компонента — настоящий `<a href>`; обычный клик — через
428
+ `followLink($event, href)` миксина `withNavigation`, который отдаёт его
429
+ `navigate` плагина. Ни Inertia, ни роутер пакет не импортирует. Исключение —
430
+ `DownloadLink`: это обычная ссылка браузера, скачивающая файл, и через
431
+ `navigate` она не идёт. Через `navigate` ходят `Pagination` и
432
+ `NavigationMenuElement`.
335
433
 
336
434
  ## Почему у Popup и Dot нет события changed
337
435
 
@@ -366,7 +464,7 @@ ConfirmationModal нет v-model».
366
464
 
367
465
  npm run playground
368
466
 
369
- Поднимает демо-страницы со всеми четырнадцатью компонентами в двух окружениях:
467
+ Поднимает демо-страницы со всеми шестнадцатью компонентами в двух окружениях:
370
468
  голом (без Tailwind и стилей приложения) и в окружении приложения (с
371
469
  Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
372
470
  основной способ посмотреть, как компоненты выглядят и ведут себя, а не
@@ -379,8 +477,8 @@ Tailwind, `@tailwindcss/forms` и типографикой, как у потре
379
477
  которое типографику не задаёт, компоненты отрисуются браузерными умолчаниями:
380
478
  рабочими, но чужими на вид.
381
479
 
382
- Компоненты русскоязычные: названия месяцев, подписи и правила номера телефона
383
- зашиты.
480
+ Правила номера телефона в `RussianMobileFilter` — российские; язык текстов
481
+ задаётся, см. «Языки».
384
482
 
385
483
  ## Ограничение
386
484