@boobooking/dashboard-ui-components 0.17.0 → 0.18.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
@@ -90,9 +90,9 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
90
90
 
91
91
  ## Компоненты
92
92
 
93
- Пакет экспортирует семнадцать компонентов: `Dot`, `RussianMobileFilter`,
93
+ Пакет экспортирует восемнадцать компонентов: `Dot`, `RussianMobileFilter`,
94
94
  `Search`, `SelectDateInterval`, `SelectSingle`, `InfoPill`,
95
- `ErrorMessages`, `ActionPill`, `ConfirmationModal`,
95
+ `ErrorMessages`, `FormInput`, `ActionPill`, `ConfirmationModal`,
96
96
  `DropdownButtonWithAction`, `HamburgerMenu`, `DataTable`,
97
97
  `NavigationMenuElement`, `PageTabs`, `PageCard`, `NotificationMessage`,
98
98
  `TextPopover`, функцию `downloadFile` и плагин `dashboardUi`. В архив пакета
@@ -164,6 +164,65 @@ Enter, пробелом, расширением клавиатурной нав
164
164
  изменённое родителем, поле показывает сразу и без событий: ответный
165
165
  `update:modelValue` вернул бы родителю его же значение.
166
166
 
167
+ ### FormInput
168
+
169
+ Поле формы с подписью над ним. Значение забирает форма: у поля нет
170
+ события `changed`.
171
+
172
+ <form-input v-model="name" label="Имя" :is-required="markNameRequired" />
173
+ <form-input v-model="email" label="Email" type="email" :is-required="markEmailRequired" />
174
+ <form-input v-model="password" label="Пароль" type="password" :is-required="markPasswordRequired" />
175
+
176
+ | Проп | Тип | По умолчанию | Описание |
177
+ | --- | --- | --- | --- |
178
+ | `modelValue` | `String` | `""` | Значение поля |
179
+ | `label` | `String` | обязателен | Подпись над полем |
180
+ | `type` | `String` | `"text"` | `"text"`, `"email"`, `"password"`, `"tel"`, `"url"` или `"search"` |
181
+ | `isRequired` | `Boolean` | `false` | Красная точка у подписи |
182
+
183
+ Событие `update:modelValue` уходит на каждый ввод со строкой из поля как
184
+ есть: пробелы не обрезаются, это решение формы. Исключение — `type="email"`
185
+ и `type="url"`: браузер сам убирает пробелы по краям значения, и Email из
186
+ одних пробелов приходит пустой строкой. Формы, которые проверяют
187
+ `length > 0`, оставляют у Email `type="text"`. Значение, изменённое
188
+ родителем, поле показывает сразу и без события. Набор через IME
189
+ (composition) отдаёт значение по его окончании.
190
+
191
+ Используйте `v-model` без модификаторов: модификаторы (`.trim`, `.number`,
192
+ `.lazy`) не входят в API `FormInput`; пробелы форма обрезает сама при
193
+ отправке.
194
+
195
+ Другой `type`, не из списка, отклоняется предупреждением Vue, а поле
196
+ рисуется с `type="text"`.
197
+
198
+ `class` и `style` ложатся на корень компонента, все остальные атрибуты
199
+ и слушатели (`autocomplete`, `placeholder`, `name`, `disabled`, `@blur`,
200
+ `@keydown.enter`) — на `<input>`. `id` поля создаётся сам, `for` подписи
201
+ указывает на него, поэтому две копии на странице не делят один `id`.
202
+ Атрибут `id` от формы заменяет созданный и в поле, и в `for`.
203
+
204
+ Красная точка значит «не заполнено»; когда её показывать, решает форма.
205
+ Основной способ: точки появляются после попытки отправить, ввод в поле
206
+ снимает свою, а стирание поля ставит точку снова (так делает watcher
207
+ из примера).
208
+
209
+ watch: {
210
+ name() { this.markNameRequired = this.name.length === 0 },
211
+ },
212
+ methods: {
213
+ create() {
214
+ this.markNameRequired = this.name.length === 0
215
+ // то же для остальных полей
216
+ },
217
+ },
218
+
219
+ Способ «сразу», точка видна, пока поле пусто:
220
+
221
+ <form-input v-model="number" label="Номер" :is-required="number.trim() === ''" />
222
+
223
+ `isRequired` только показывает точку: атрибут `required` и `aria-*` полю
224
+ он не ставит.
225
+
167
226
  ### SelectDateInterval
168
227
 
169
228
  Два поля даты под одним заголовком — интервал дат «от» и «до». Дата
@@ -396,8 +455,8 @@ exportOrders() {
396
455
  | `lang` | `String` | язык плагина | `"ru"` или `"en"` |
397
456
 
398
457
  События: `actionConfirmed` — по кнопке действия, `actionCanceled` — по кнопке
399
- отмены. Ни одна из кнопок модалку не закрывает — см. раздел «Почему у
400
- ConfirmationModal нет v-model».
458
+ отмены и по Escape. Ни одна из кнопок модалку не закрывает — см. раздел
459
+ «Почему у ConfirmationModal нет v-model».
401
460
 
402
461
  Панель модалки — белая, со скруглением `rounded-lg`, стоит по центру и
403
462
  занимает `max-w-lg`. `class` и другие атрибуты на `<confirmation-modal>`
@@ -405,6 +464,13 @@ ConfirmationModal нет v-model».
405
464
  содержимое, поэтому блоки текста и кнопок со своим фоном скругляют внешние
406
465
  углы сами — верхний `rounded-t-lg`, нижний `rounded-b-lg`.
407
466
 
467
+ Открытая модалка держит фокус: в первом кадре после открытия он встаёт на
468
+ кнопку отмены, Tab и Shift+Tab ходят по её кнопкам по кругу, Escape —
469
+ `actionCanceled`, как кнопка отмены. После закрытия фокус возвращается туда,
470
+ где был до открытия, если страница не поставила его в другое место и тот
471
+ элемент ещё на странице. Кадр нужен модалкам, которые открывает пункт меню:
472
+ меню закрывается позже в том же клике и возвращает фокус на свою кнопку.
473
+
408
474
  ### DropdownButtonWithAction
409
475
 
410
476
  Кнопка из списка действий `actions`. Первое действие — основная кнопка,
@@ -978,9 +1044,9 @@ Inertia SSR), а серверная разметка гидратируется
978
1044
  Правило пакета — значение через `v-model` — относится к состоянию, которое
979
1045
  компонент меняет сам: меню `DropdownButtonWithAction` закрывается по клику
980
1046
  вне, `SelectSingle` меняет выбор. `ConfirmationModal` свою видимость не меняет
981
- никогда. Обе кнопки только сообщают родителю решение пользователя, а закрыть
982
- модалку, оставить её открытой на время запроса или открыть следующую — решает
983
- родитель.
1047
+ никогда. Обе кнопки и Escape только сообщают родителю решение пользователя,
1048
+ а закрыть модалку, оставить её открытой на время запроса или открыть
1049
+ следующую — решает родитель.
984
1050
 
985
1051
  `v-model` обещал бы двустороннюю связь, которой нет, поэтому видимость
986
1052
  передаётся пропом `isOpen`.
@@ -999,7 +1065,7 @@ Inertia SSR), а серверная разметка гидратируется
999
1065
 
1000
1066
  npm run playground
1001
1067
 
1002
- Поднимает демо-страницы со всеми семнадцатью компонентами в двух окружениях:
1068
+ Поднимает демо-страницы со всеми восемнадцатью компонентами в двух окружениях:
1003
1069
  голом (без Tailwind и стилей приложения) и в окружении приложения (с
1004
1070
  Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
1005
1071
  основной способ посмотреть, как компоненты выглядят и ведут себя, а не
@@ -1300,7 +1366,3 @@ exportOrders() {
1300
1366
  Например, чекбоксу: `border border-gray-300 bg-white text-indigo-600
1301
1367
  checked:bg-current checked:border-transparent focus:ring-2
1302
1368
  focus:ring-offset-2`.
1303
-
1304
- `ConfirmationModal` не переносит фокус внутрь при открытии, не удерживает его
1305
- внутри, не возвращает на прежнее место после закрытия и не закрывается по
1306
- Escape.