@boobooking/dashboard-ui-components 0.1.0 → 1.0.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 +6 -143
- package/dist/index.js +21 -28
- package/package.json +2 -11
package/README.md
CHANGED
|
@@ -14,6 +14,9 @@ import '@boobooking/dashboard-ui-components/style.css'
|
|
|
14
14
|
|
|
15
15
|
Стили пакета подключаются **до** стилей приложения.
|
|
16
16
|
|
|
17
|
+
Пример использует только экспорты, доступные в этой версии, — полным списком он
|
|
18
|
+
не является и обновляется вместе с составом экспортов.
|
|
19
|
+
|
|
17
20
|
## Требования
|
|
18
21
|
|
|
19
22
|
Vue не ниже 3.2, ESM, сборщик, умеющий импорт CSS из пакета.
|
|
@@ -21,127 +24,7 @@ Vue не ниже 3.2, ESM, сборщик, умеющий импорт CSS из
|
|
|
21
24
|
Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в CSS приложения
|
|
22
25
|
пакету не нужны.
|
|
23
26
|
|
|
24
|
-
##
|
|
25
|
-
|
|
26
|
-
Пакет экспортирует семь компонентов: `Popup`, `Dot`, `PickDay`,
|
|
27
|
-
`RussianMobileFilter`, `Search`, `SelectDateInterval`, `SelectSingle`. В
|
|
28
|
-
архив пакета (`files: ["dist"]`) исходники не попадают, поэтому контракт
|
|
29
|
-
каждого компонента — здесь и в playground, а не в исходном коде.
|
|
30
|
-
|
|
31
|
-
### Popup
|
|
32
|
-
|
|
33
|
-
Всплывающее меню с оверлеем, закрывающим по клику вне, и переходом на
|
|
34
|
-
открытие/закрытие. `PickDay` и `SelectSingle` держат его внутри как обёртку
|
|
35
|
-
над своим содержимым.
|
|
36
|
-
|
|
37
|
-
<popup v-model:is-open="isOpen" align="right">
|
|
38
|
-
…содержимое меню…
|
|
39
|
-
</popup>
|
|
40
|
-
|
|
41
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
42
|
-
| --- | --- | --- | --- |
|
|
43
|
-
| `isOpen` | `Boolean` | `false` | Открыто ли меню |
|
|
44
|
-
| `align` | `String` | `"left"` | `"left"` или `"right"` — с какой стороны прижать меню |
|
|
45
|
-
|
|
46
|
-
Событие: `update:isOpen` — при каждом открытии и закрытии, включая клик по
|
|
47
|
-
оверлею.
|
|
48
|
-
|
|
49
|
-
### Dot
|
|
50
|
-
|
|
51
|
-
Индикатор-точка: красная или зелёная, с пульсацией или без.
|
|
52
|
-
|
|
53
|
-
<dot color="green" :add-pulse="isLive" />
|
|
54
|
-
|
|
55
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
56
|
-
| --- | --- | --- | --- |
|
|
57
|
-
| `color` | `String` | обязателен | `"red"` или `"green"` |
|
|
58
|
-
| `addPulse` | `Boolean` | `false` | Добавляет анимацию пульсации |
|
|
59
|
-
|
|
60
|
-
Событий нет.
|
|
61
|
-
|
|
62
|
-
### PickDay
|
|
63
|
-
|
|
64
|
-
Поле выбора одной даты на Pikaday, с ластиком очистки.
|
|
65
|
-
|
|
66
|
-
<pick-day v-model="date" placeholder-text="от" />
|
|
67
|
-
|
|
68
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
69
|
-
| --- | --- | --- | --- |
|
|
70
|
-
| `modelValue` | `String` | обязателен | Текущая дата |
|
|
71
|
-
| `withEraser` | `Boolean` | `true` | Показывать ли ластик очистки |
|
|
72
|
-
| `placeholderText` | `String` | `""` | Текст подсказки в пустом поле |
|
|
73
|
-
|
|
74
|
-
События: `update:modelValue` — при выборе даты в календаре и при очистке
|
|
75
|
-
(пустой строкой); `changed` — в тех же двух случаях, для использования наравне
|
|
76
|
-
с остальными фильтрами.
|
|
77
|
-
|
|
78
|
-
### RussianMobileFilter
|
|
79
|
-
|
|
80
|
-
Поле ввода российского мобильного номера с маской `+7 (000) 000 00 00` и
|
|
81
|
-
дебаунсом перед отправкой.
|
|
82
|
-
|
|
83
|
-
<russian-mobile-filter v-model="phone" header="Телефон" @changed="reload" />
|
|
84
|
-
|
|
85
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
86
|
-
| --- | --- | --- | --- |
|
|
87
|
-
| `modelValue` | `String` | `""` | Номер: цифры вместе с кодом страны, без «+» (например, `79031234567`), либо пустая строка |
|
|
88
|
-
| `header` | `String` | обязателен | Подпись поля |
|
|
89
|
-
| `isRequired` | `Boolean` | `false` | Пометка обязательности в заголовке |
|
|
90
|
-
| `isLoading` | `Boolean` | `false` | Индикатор загрузки в заголовке |
|
|
91
|
-
|
|
92
|
-
«+» — неудачный символ для URL, поэтому в параметре только цифры; плюс к
|
|
93
|
-
номеру дописывает бэкенд.
|
|
94
|
-
|
|
95
|
-
События: `update:modelValue` — на каждое принятое маской изменение;
|
|
96
|
-
`changed` — через 400 мс паузы после ввода, начиная с третьей цифры (раньше
|
|
97
|
-
событие не летит вовсе), а также сразу — без дебаунса — при опустевшем поле,
|
|
98
|
-
по клику на ластик, по Enter и по уходу фокуса. Дублей не бывает: компонент
|
|
99
|
-
помнит последнее отправленное значение и не шлёт его повторно.
|
|
100
|
-
|
|
101
|
-
### Search
|
|
102
|
-
|
|
103
|
-
Текстовое поле поиска с ластиком очистки.
|
|
104
|
-
|
|
105
|
-
<search v-model="query" header="Поиск" @changed="reload" />
|
|
106
|
-
|
|
107
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
108
|
-
| --- | --- | --- | --- |
|
|
109
|
-
| `modelValue` | `String` | `""` | Текущий текст поиска |
|
|
110
|
-
| `header` | `String` | обязателен | Подпись поля |
|
|
111
|
-
| `isRequired` | `Boolean` | `false` | Пометка обязательности в заголовке |
|
|
112
|
-
| `isLoading` | `Boolean` | `false` | Индикатор загрузки в заголовке |
|
|
113
|
-
|
|
114
|
-
События: `update:modelValue` и `changed` — оба на каждый ввод.
|
|
115
|
-
|
|
116
|
-
### SelectDateInterval
|
|
117
|
-
|
|
118
|
-
Пара `PickDay` под одним заголовком — интервал дат «от» и «до».
|
|
119
|
-
|
|
120
|
-
<select-date-interval
|
|
121
|
-
header="Период"
|
|
122
|
-
:date-from="dateFrom"
|
|
123
|
-
:date-to="dateTo"
|
|
124
|
-
@update:date-from="dateFrom = $event"
|
|
125
|
-
@update:date-to="dateTo = $event"
|
|
126
|
-
@changed="reload"
|
|
127
|
-
/>
|
|
128
|
-
|
|
129
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
130
|
-
| --- | --- | --- | --- |
|
|
131
|
-
| `dateFrom` | `String` | обязателен | Начало интервала |
|
|
132
|
-
| `dateTo` | `String` | обязателен | Конец интервала |
|
|
133
|
-
| `header` | `String` | обязателен | Подпись поля |
|
|
134
|
-
| `isRequired` | `Boolean` | `false` | Пометка обязательности в заголовке |
|
|
135
|
-
| `isLoading` | `Boolean` | `false` | Индикатор загрузки в заголовке |
|
|
136
|
-
|
|
137
|
-
`dateFrom` и `dateTo` обязательны без умолчания — потребитель должен
|
|
138
|
-
передавать обе даты явно.
|
|
139
|
-
|
|
140
|
-
События: `update:dateFrom`, `update:dateTo` — на каждый выбор в
|
|
141
|
-
соответствующем `PickDay`; `changed` — когда новое значение отличается от
|
|
142
|
-
переданного пропса (отдельно для каждой из двух дат).
|
|
143
|
-
|
|
144
|
-
### SelectSingle
|
|
27
|
+
## SelectSingle
|
|
145
28
|
|
|
146
29
|
<select-single
|
|
147
30
|
header="Вендор"
|
|
@@ -151,28 +34,8 @@ Tailwind, `@tailwindcss/forms`, Inertia и какие-либо токены в C
|
|
|
151
34
|
/>
|
|
152
35
|
|
|
153
36
|
`items` — массив объектов `{ id, name }`. `v-model` держит `id` выбранного или
|
|
154
|
-
`null`, если не выбрано.
|
|
155
|
-
|
|
156
|
-
| Проп | Тип | По умолчанию | Описание |
|
|
157
|
-
| --- | --- | --- | --- |
|
|
158
|
-
| `items` | `Array` | обязателен | Массив `{ id, name }` |
|
|
159
|
-
| `modelValue` | `String \| Number` | `null` | `id` выбранного элемента или `null` |
|
|
160
|
-
| `header` | `String` | обязателен | Подпись поля |
|
|
161
|
-
| `isRequired` | `Boolean` | `false` | Пометка обязательности в заголовке |
|
|
162
|
-
| `isLoading` | `Boolean` | `false` | Индикатор загрузки в заголовке |
|
|
163
|
-
|
|
164
|
-
События: `update:modelValue` и `changed` — при выборе элемента (повторный
|
|
165
|
-
клик по уже выбранному снимает выбор) и при очистке через ластик.
|
|
166
|
-
|
|
167
|
-
## Playground
|
|
168
|
-
|
|
169
|
-
npm run playground
|
|
170
|
-
|
|
171
|
-
Поднимает демо-страницы со всеми семью компонентами в двух окружениях:
|
|
172
|
-
голом (без Tailwind и стилей приложения) и в окружении приложения (с
|
|
173
|
-
Tailwind, `@tailwindcss/forms` и типографикой, как у потребителя). Это
|
|
174
|
-
основной способ посмотреть, как компоненты выглядят и ведут себя, а не
|
|
175
|
-
угадывать по исходникам или по этому README.
|
|
37
|
+
`null`, если не выбрано. Событие `changed` приходит на каждое изменение выбора,
|
|
38
|
+
включая очистку.
|
|
176
39
|
|
|
177
40
|
## Что пакет берёт у приложения
|
|
178
41
|
|
package/dist/index.js
CHANGED
|
@@ -171,9 +171,9 @@ var I = {
|
|
|
171
171
|
Popup: D,
|
|
172
172
|
Eraser: N
|
|
173
173
|
},
|
|
174
|
-
emits: ["update:
|
|
174
|
+
emits: ["update:day"],
|
|
175
175
|
props: {
|
|
176
|
-
|
|
176
|
+
day: {
|
|
177
177
|
type: String,
|
|
178
178
|
required: !0
|
|
179
179
|
},
|
|
@@ -235,7 +235,7 @@ var I = {
|
|
|
235
235
|
]
|
|
236
236
|
},
|
|
237
237
|
onSelect: (e) => {
|
|
238
|
-
this.popupIsOpen = !1, this.$emit("update:
|
|
238
|
+
this.popupIsOpen = !1, this.$emit("update:day", P(e));
|
|
239
239
|
}
|
|
240
240
|
});
|
|
241
241
|
},
|
|
@@ -245,10 +245,10 @@ var I = {
|
|
|
245
245
|
data() {
|
|
246
246
|
return {
|
|
247
247
|
popupIsOpen: !1,
|
|
248
|
-
dayValue: this.
|
|
248
|
+
dayValue: this.day
|
|
249
249
|
};
|
|
250
250
|
},
|
|
251
|
-
watch: {
|
|
251
|
+
watch: { day(e) {
|
|
252
252
|
this.dayValue = e, this.syncPicker(e);
|
|
253
253
|
} },
|
|
254
254
|
methods: {
|
|
@@ -261,12 +261,12 @@ var I = {
|
|
|
261
261
|
this.picker.setDate(t, !0);
|
|
262
262
|
},
|
|
263
263
|
clearPicker() {
|
|
264
|
-
this.$emit("update:
|
|
264
|
+
this.$emit("update:day", ""), this.dayValue = "", this.picker.clear();
|
|
265
265
|
}
|
|
266
266
|
},
|
|
267
267
|
computed: {
|
|
268
268
|
hasValue() {
|
|
269
|
-
return this.
|
|
269
|
+
return this.day.length > 0;
|
|
270
270
|
},
|
|
271
271
|
needsEraser() {
|
|
272
272
|
return !this.withEraser || this.popupIsOpen ? !1 : this.hasValue;
|
|
@@ -368,11 +368,7 @@ var ne = 400, re = 3, ie = {
|
|
|
368
368
|
},
|
|
369
369
|
header: {
|
|
370
370
|
type: String,
|
|
371
|
-
|
|
372
|
-
},
|
|
373
|
-
isRequired: {
|
|
374
|
-
type: Boolean,
|
|
375
|
-
default: !1
|
|
371
|
+
default: "Телефон"
|
|
376
372
|
},
|
|
377
373
|
isLoading: {
|
|
378
374
|
type: Boolean,
|
|
@@ -449,13 +445,8 @@ function le(e, t, n, r, s, c) {
|
|
|
449
445
|
let u = f("element-header"), d = f("eraser");
|
|
450
446
|
return l(), i("div", ae, [a("div", oe, [o(u, {
|
|
451
447
|
text: n.header,
|
|
452
|
-
"is-required": n.isRequired,
|
|
453
448
|
"is-loading": n.isLoading
|
|
454
|
-
}, null, 8, [
|
|
455
|
-
"text",
|
|
456
|
-
"is-required",
|
|
457
|
-
"is-loading"
|
|
458
|
-
]), a("div", se, [a("label", ce, [a("input", {
|
|
449
|
+
}, null, 8, ["text", "is-loading"]), a("div", se, [a("label", ce, [a("input", {
|
|
459
450
|
ref: "input",
|
|
460
451
|
type: "tel",
|
|
461
452
|
inputmode: "tel",
|
|
@@ -484,7 +475,7 @@ var ue = /*#__PURE__*/ x(ie, [["render", le]]), de = {
|
|
|
484
475
|
},
|
|
485
476
|
header: {
|
|
486
477
|
type: String,
|
|
487
|
-
|
|
478
|
+
default: ""
|
|
488
479
|
},
|
|
489
480
|
isRequired: {
|
|
490
481
|
type: Boolean,
|
|
@@ -543,15 +534,17 @@ var _e = /*#__PURE__*/ x(de, [["render", ge]]), ve = {
|
|
|
543
534
|
emits: [
|
|
544
535
|
"update:dateFrom",
|
|
545
536
|
"update:dateTo",
|
|
546
|
-
"
|
|
537
|
+
"updated"
|
|
547
538
|
],
|
|
548
539
|
props: {
|
|
549
540
|
dateFrom: {
|
|
550
541
|
type: String,
|
|
542
|
+
default: "",
|
|
551
543
|
required: !0
|
|
552
544
|
},
|
|
553
545
|
dateTo: {
|
|
554
546
|
type: String,
|
|
547
|
+
default: "",
|
|
555
548
|
required: !0
|
|
556
549
|
},
|
|
557
550
|
header: {
|
|
@@ -581,10 +574,10 @@ var _e = /*#__PURE__*/ x(de, [["render", ge]]), ve = {
|
|
|
581
574
|
this.userDateTo = e;
|
|
582
575
|
},
|
|
583
576
|
userDateFrom(e) {
|
|
584
|
-
this.$emit("update:dateFrom", e), this.dateFrom !== e && this.$emit("
|
|
577
|
+
this.$emit("update:dateFrom", e), this.dateFrom !== e && this.$emit("updated");
|
|
585
578
|
},
|
|
586
579
|
userDateTo(e) {
|
|
587
|
-
this.$emit("update:dateTo", e), this.dateTo !== e && this.$emit("
|
|
580
|
+
this.$emit("update:dateTo", e), this.dateTo !== e && this.$emit("updated");
|
|
588
581
|
}
|
|
589
582
|
}
|
|
590
583
|
}, ye = { class: "bb-dashboard-ui flex" }, be = { class: "flex border border-white" }, xe = { class: "flex flex-col min-w-72 w-72 bg-white h-full" }, Se = { class: "flex h-full divide-x divide-gray-200" };
|
|
@@ -599,16 +592,16 @@ function Ce(e, t, n, r, s, c) {
|
|
|
599
592
|
"is-required",
|
|
600
593
|
"is-loading"
|
|
601
594
|
]), a("div", Se, [o(d, {
|
|
602
|
-
|
|
603
|
-
"onUpdate:
|
|
595
|
+
day: s.userDateFrom,
|
|
596
|
+
"onUpdate:day": t[0] ||= (e) => s.userDateFrom = e,
|
|
604
597
|
class: "flex-1 min-w-36 pl-3",
|
|
605
598
|
"placeholder-text": "от"
|
|
606
|
-
}, null, 8, ["
|
|
607
|
-
|
|
608
|
-
"onUpdate:
|
|
599
|
+
}, null, 8, ["day"]), o(d, {
|
|
600
|
+
day: s.userDateTo,
|
|
601
|
+
"onUpdate:day": t[1] ||= (e) => s.userDateTo = e,
|
|
609
602
|
class: "flex-1 min-w-36 pl-3",
|
|
610
603
|
"placeholder-text": "до"
|
|
611
|
-
}, null, 8, ["
|
|
604
|
+
}, null, 8, ["day"])])])])]);
|
|
612
605
|
}
|
|
613
606
|
var we = /*#__PURE__*/ x(ve, [["render", Ce]]), Te = {
|
|
614
607
|
components: {
|
package/package.json
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@boobooking/dashboard-ui-components",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Компоненты фильтров дашборда на Vue 3",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"vue",
|
|
7
|
-
"vue3",
|
|
8
|
-
"components",
|
|
9
|
-
"dashboard",
|
|
10
|
-
"filters",
|
|
11
|
-
"tailwind"
|
|
12
|
-
],
|
|
13
5
|
"license": "MIT",
|
|
14
6
|
"repository": {
|
|
15
7
|
"type": "git",
|
|
@@ -21,8 +13,7 @@
|
|
|
21
13
|
],
|
|
22
14
|
"exports": {
|
|
23
15
|
".": "./dist/index.js",
|
|
24
|
-
"./style.css": "./dist/style.css"
|
|
25
|
-
"./package.json": "./package.json"
|
|
16
|
+
"./style.css": "./dist/style.css"
|
|
26
17
|
},
|
|
27
18
|
"scripts": {
|
|
28
19
|
"build": "vite build",
|