startup-ui 0.12.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/AGENTS.md +18 -0
- package/CHANGELOG.md +39 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +21 -0
- package/README.md +54 -0
- package/dist/defaults.css +83 -0
- package/dist/index.css +1 -1
- package/dist/startup-ui.cjs.js +33 -586
- package/dist/startup-ui.cjs.js.map +1 -1
- package/dist/startup-ui.es.js +7109 -8839
- package/dist/startup-ui.es.js.map +1 -1
- package/dist/types/components/SActionIcon.d.ts +2 -1
- package/dist/types/components/SActionIcon.d.ts.map +1 -1
- package/dist/types/components/SCanvas.d.ts +0 -1
- package/dist/types/components/SCanvas.d.ts.map +1 -1
- package/dist/types/components/SCheckbox.d.ts.map +1 -1
- package/dist/types/components/SCheckboxGroup.d.ts +4 -0
- package/dist/types/components/SCheckboxGroup.d.ts.map +1 -1
- package/dist/types/components/SColumnSettings.d.ts +4 -4
- package/dist/types/components/SColumnSettings.d.ts.map +1 -1
- package/dist/types/components/SConfirm/SConfirm.d.ts +2 -0
- package/dist/types/components/SConfirm/SConfirm.d.ts.map +1 -1
- package/dist/types/components/SCopyText.d.ts.map +1 -1
- package/dist/types/components/SDatePicker.d.ts +3 -4
- package/dist/types/components/SDatePicker.d.ts.map +1 -1
- package/dist/types/components/SDialog.d.ts.map +1 -1
- package/dist/types/components/SFilterGroup.d.ts +3 -3
- package/dist/types/components/SFilterGroup.d.ts.map +1 -1
- package/dist/types/components/SFooter.d.ts.map +1 -1
- package/dist/types/components/SForm.d.ts.map +1 -1
- package/dist/types/components/SFormRow.d.ts.map +1 -1
- package/dist/types/components/SHtmlEditor.d.ts +20 -0
- package/dist/types/components/SHtmlEditor.d.ts.map +1 -1
- package/dist/types/components/SImagePreview.d.ts.map +1 -1
- package/dist/types/components/SInput.d.ts +9 -2
- package/dist/types/components/SInput.d.ts.map +1 -1
- package/dist/types/components/SMenu.d.ts +39 -0
- package/dist/types/components/SMenu.d.ts.map +1 -0
- package/dist/types/components/SNote.d.ts.map +1 -1
- package/dist/types/components/SPagination.d.ts.map +1 -1
- package/dist/types/components/SProgressbar.d.ts.map +1 -1
- package/dist/types/components/SRadio.d.ts.map +1 -1
- package/dist/types/components/SRadioGroup.d.ts +4 -0
- package/dist/types/components/SRadioGroup.d.ts.map +1 -1
- package/dist/types/components/SSelect.d.ts +6 -0
- package/dist/types/components/SSelect.d.ts.map +1 -1
- package/dist/types/components/SStatus.d.ts.map +1 -1
- package/dist/types/components/STable.d.ts +4 -4
- package/dist/types/components/STable.d.ts.map +1 -1
- package/dist/types/components/SToggle.d.ts.map +1 -1
- package/dist/types/components/STooltip.d.ts +0 -1
- package/dist/types/components/STooltip.d.ts.map +1 -1
- package/dist/types/components/STree.d.ts +11 -5
- package/dist/types/components/STree.d.ts.map +1 -1
- package/dist/types/components/SUpload.d.ts +5 -4
- package/dist/types/components/SUpload.d.ts.map +1 -1
- package/dist/types/components/SVerticalMenu.d.ts.map +1 -1
- package/dist/types/components/htmlEditor/contentStyle.d.ts +9 -0
- package/dist/types/components/htmlEditor/contentStyle.d.ts.map +1 -0
- package/dist/types/components/icons.d.ts +24 -0
- package/dist/types/components/icons.d.ts.map +1 -0
- package/dist/types/config.d.ts +49 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/global-components.d.ts +3 -6
- package/dist/types/global-components.d.ts.map +1 -1
- package/dist/types/index.d.ts +12 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/locale/index.d.ts +49 -0
- package/dist/types/locale/index.d.ts.map +1 -0
- package/dist/types/locale/messages/en-US.d.ts +4 -0
- package/dist/types/locale/messages/en-US.d.ts.map +1 -0
- package/dist/types/locale/messages/en.d.ts +4 -0
- package/dist/types/locale/messages/en.d.ts.map +1 -0
- package/dist/types/locale/messages/ru.d.ts +4 -0
- package/dist/types/locale/messages/ru.d.ts.map +1 -0
- package/dist/types/locale/types.d.ts +74 -0
- package/dist/types/locale/types.d.ts.map +1 -0
- package/dist/types/plugin.d.ts +2 -1
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/utils/deepMerge.d.ts +9 -0
- package/dist/types/utils/deepMerge.d.ts.map +1 -0
- package/dist/types/utils/options.d.ts +25 -0
- package/dist/types/utils/options.d.ts.map +1 -0
- package/llms/components/data/sfilter.md +194 -0
- package/llms/components/data/spagination.md +114 -0
- package/llms/components/data/stable.md +638 -0
- package/llms/components/data/stree.md +213 -0
- package/llms/components/forms/scheckbox.md +139 -0
- package/llms/components/forms/sdatepicker.md +161 -0
- package/llms/components/forms/sform.md +240 -0
- package/llms/components/forms/shtmleditor.md +143 -0
- package/llms/components/forms/sinput.md +165 -0
- package/llms/components/forms/sradio.md +164 -0
- package/llms/components/forms/sselect.md +149 -0
- package/llms/components/forms/sswitch.md +69 -0
- package/llms/components/forms/supload.md +189 -0
- package/llms/components/interfaces/sactionbar.md +40 -0
- package/llms/components/interfaces/sactionicon.md +126 -0
- package/llms/components/interfaces/salert.md +87 -0
- package/llms/components/interfaces/sbutton.md +167 -0
- package/llms/components/interfaces/scolumnsettings.md +204 -0
- package/llms/components/interfaces/sconfirm.md +57 -0
- package/llms/components/interfaces/scopytext.md +67 -0
- package/llms/components/interfaces/sdashboard.md +130 -0
- package/llms/components/interfaces/sdialog.md +158 -0
- package/llms/components/interfaces/simagepreview.md +98 -0
- package/llms/components/interfaces/snote.md +64 -0
- package/llms/components/interfaces/sprogressbar.md +48 -0
- package/llms/components/interfaces/sstat.md +79 -0
- package/llms/components/interfaces/sstatus.md +76 -0
- package/llms/components/interfaces/stag.md +70 -0
- package/llms/components/interfaces/stimeline.md +47 -0
- package/llms/components/interfaces/stoggle.md +120 -0
- package/llms/components/interfaces/stooltip.md +88 -0
- package/llms/components/template/scanvas.md +61 -0
- package/llms/components/template/smenu.md +88 -0
- package/llms/components/template/sverticalmenu.md +113 -0
- package/llms/llms.txt +49 -0
- package/package.json +37 -4
- package/dist/types/components/SDropdownMenu.d.ts +0 -39
- package/dist/types/components/SDropdownMenu.d.ts.map +0 -1
- package/dist/types/components/SHorizontalMenu.d.ts +0 -33
- package/dist/types/components/SHorizontalMenu.d.ts.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# STree
|
|
2
|
+
|
|
3
|
+
Дерево элементов.
|
|
4
|
+
|
|
5
|
+
<SToggleGroup>
|
|
6
|
+
<SToggle title="Что будет ценно улучшить?">
|
|
7
|
+
<ol>
|
|
8
|
+
<li>Если сейчас перетаскивать элементы, но ничего не делать по drop-событию, то они не перетаскиваются.</li>
|
|
9
|
+
</ol>
|
|
10
|
+
</SToggle>
|
|
11
|
+
</SToggleGroup>
|
|
12
|
+
|
|
13
|
+
## Базовый пример
|
|
14
|
+
|
|
15
|
+
```vue
|
|
16
|
+
<template>
|
|
17
|
+
<STree :data="pages" />
|
|
18
|
+
</template>
|
|
19
|
+
<script setup>
|
|
20
|
+
const pages = [
|
|
21
|
+
{ id: 1, label: 'Главная' },
|
|
22
|
+
{ id: 2, label: 'Каталог', children: [
|
|
23
|
+
{ id: 3, label: 'Электроника' },
|
|
24
|
+
{ id: 4, label: 'Одежда' },
|
|
25
|
+
] },
|
|
26
|
+
{ id: 5, label: 'Контакты' },
|
|
27
|
+
]
|
|
28
|
+
</script>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Где `pages` — это массив вида: `[{id, label, children: [...]}, ...]`
|
|
32
|
+
|
|
33
|
+
## Выбор элемента
|
|
34
|
+
|
|
35
|
+
Для возможности выбора элемента добавляем атрибут <strong>selectable</strong>
|
|
36
|
+
|
|
37
|
+
```vue
|
|
38
|
+
<template>
|
|
39
|
+
<STree :data="pages" selectable v-model="value" />
|
|
40
|
+
<p>В модель подставляется ID. Текущее значение: <code>{{ value ?? 'null' }}</code></p>
|
|
41
|
+
</template>
|
|
42
|
+
<script setup>
|
|
43
|
+
import { ref } from 'vue'
|
|
44
|
+
const value = ref(null)
|
|
45
|
+
const pages = [
|
|
46
|
+
{ id: 1, label: 'Главная' },
|
|
47
|
+
{ id: 2, label: 'Каталог', children: [
|
|
48
|
+
{ id: 3, label: 'Электроника' },
|
|
49
|
+
{ id: 4, label: 'Одежда' },
|
|
50
|
+
] },
|
|
51
|
+
{ id: 5, label: 'Контакты' },
|
|
52
|
+
]
|
|
53
|
+
</script>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Также изменения можно отслеживать с помощью change-события:
|
|
57
|
+
|
|
58
|
+
```vue
|
|
59
|
+
<template>
|
|
60
|
+
<STree :data="pages" selectable @change="(node) => console.log(node)" />
|
|
61
|
+
</template>
|
|
62
|
+
<script setup>
|
|
63
|
+
const pages = [
|
|
64
|
+
{ id: 1, label: 'Главная' },
|
|
65
|
+
{ id: 2, label: 'Каталог' },
|
|
66
|
+
{ id: 5, label: 'Контакты' },
|
|
67
|
+
]
|
|
68
|
+
</script>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Кастомный шаблон элемента
|
|
72
|
+
|
|
73
|
+
```vue
|
|
74
|
+
<template>
|
|
75
|
+
<STree :data="pages">
|
|
76
|
+
<template #node="{ node }">
|
|
77
|
+
<FontAwesomeIcon :icon="node.icon" v-if="node.icon" /> {{ node.label }}
|
|
78
|
+
</template>
|
|
79
|
+
</STree>
|
|
80
|
+
</template>
|
|
81
|
+
<script setup>
|
|
82
|
+
const pages = [
|
|
83
|
+
{ id: 1, label: 'Главная', icon: 'house' },
|
|
84
|
+
{ id: 2, label: 'Каталог', icon: 'folder' },
|
|
85
|
+
{ id: 5, label: 'Контакты', icon: 'envelope' },
|
|
86
|
+
]
|
|
87
|
+
</script>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Раскрытые корневые элементы
|
|
91
|
+
|
|
92
|
+
Набор раскрытых корневых элементов передаём с помощью атрибута <strong>expanded-keys</strong>
|
|
93
|
+
|
|
94
|
+
```vue
|
|
95
|
+
<template>
|
|
96
|
+
<STree :data="pages" :expanded-keys="[2]" />
|
|
97
|
+
</template>
|
|
98
|
+
<script setup>
|
|
99
|
+
const pages = [
|
|
100
|
+
{ id: 1, label: 'Главная' },
|
|
101
|
+
{ id: 2, label: 'Каталог', children: [
|
|
102
|
+
{ id: 3, label: 'Электроника' },
|
|
103
|
+
{ id: 4, label: 'Одежда' },
|
|
104
|
+
] },
|
|
105
|
+
{ id: 5, label: 'Контакты' },
|
|
106
|
+
]
|
|
107
|
+
</script>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Перетаскивание элементов
|
|
111
|
+
|
|
112
|
+
Для поддержки перетаскивания элементов добавляем атрибут <strong>draggable</strong>
|
|
113
|
+
|
|
114
|
+
```vue
|
|
115
|
+
<template>
|
|
116
|
+
<STree :data="pages" draggable @drop="onDrop" />
|
|
117
|
+
</template>
|
|
118
|
+
<script setup>
|
|
119
|
+
const pages = [
|
|
120
|
+
{ id: 1, label: 'Главная' },
|
|
121
|
+
{ id: 2, label: 'Каталог', children: [
|
|
122
|
+
{ id: 3, label: 'Электроника' },
|
|
123
|
+
{ id: 4, label: 'Одежда' },
|
|
124
|
+
] },
|
|
125
|
+
{ id: 5, label: 'Контакты' },
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
function onDrop(targetNode, event, dropType) {
|
|
129
|
+
console.log('Dropped on:', targetNode.label, 'Type:', dropType)
|
|
130
|
+
// Your node-reordering logic on the pages array goes here
|
|
131
|
+
}
|
|
132
|
+
</script>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
При этом выполняются события:
|
|
136
|
+
|
|
137
|
+
<ul>
|
|
138
|
+
<li><strong>dragstart(node, event)</strong> — при начале перетаскивания;</li>
|
|
139
|
+
<li><strong>drop(targetNode, event, dropType)</strong> — при заверешнии перетаскивания.</li>
|
|
140
|
+
</ul>
|
|
141
|
+
|
|
142
|
+
## Чек-боксы
|
|
143
|
+
|
|
144
|
+
Для поддержки чек-боксов у элементов добавляем атрибут <strong>checkboxes</strong>
|
|
145
|
+
|
|
146
|
+
```vue
|
|
147
|
+
<template>
|
|
148
|
+
<STree v-model="selectedPageIds" :data="pages" checkboxes />
|
|
149
|
+
<p>Выбрано: <code>{{ selectedPageIds }}</code></p>
|
|
150
|
+
</template>
|
|
151
|
+
<script setup>
|
|
152
|
+
import { ref } from 'vue'
|
|
153
|
+
const selectedPageIds = ref([])
|
|
154
|
+
const pages = [
|
|
155
|
+
{ id: 1, label: 'Главная' },
|
|
156
|
+
{ id: 2, label: 'Каталог', children: [
|
|
157
|
+
{ id: 3, label: 'Электроника' },
|
|
158
|
+
{ id: 4, label: 'Одежда' },
|
|
159
|
+
] },
|
|
160
|
+
{ id: 5, label: 'Контакты' },
|
|
161
|
+
]
|
|
162
|
+
</script>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Если нужно, чтобы при выборе чек-бокса автоматически выбирались чек-боксы вложенных элементов, добавьте атрибут **select-with-children**:
|
|
166
|
+
|
|
167
|
+
```vue
|
|
168
|
+
<template>
|
|
169
|
+
<STree v-model="selectedPageIds" :data="pages" checkboxes select-with-children />
|
|
170
|
+
<p>Выбрано: <code>{{ selectedPageIds }}</code></p>
|
|
171
|
+
</template>
|
|
172
|
+
<script setup>
|
|
173
|
+
import { ref } from 'vue'
|
|
174
|
+
const selectedPageIds = ref([])
|
|
175
|
+
const pages = [
|
|
176
|
+
{ id: 1, label: 'Главная' },
|
|
177
|
+
{ id: 2, label: 'Каталог', children: [
|
|
178
|
+
{ id: 3, label: 'Электроника' },
|
|
179
|
+
{ id: 4, label: 'Одежда' },
|
|
180
|
+
] },
|
|
181
|
+
{ id: 5, label: 'Контакты' },
|
|
182
|
+
]
|
|
183
|
+
</script>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Интерфейс компонента
|
|
187
|
+
|
|
188
|
+
### Свойства (Props)
|
|
189
|
+
|
|
190
|
+
| Название | Тип | По умолчанию | Описание |
|
|
191
|
+
|----------|-----|--------------|----------|
|
|
192
|
+
| data | `STreeNode[]` | - | Массив данных дерева. |
|
|
193
|
+
| expandedKeys | `(string \| number)[]` | `[]` | Список ID раскрытых узлов. |
|
|
194
|
+
| draggable | boolean | `false` | Разрешить перетаскивание узлов. |
|
|
195
|
+
| selectable | boolean | `false` | Разрешить выбор одного узла (через клик). |
|
|
196
|
+
| checkboxes | boolean | `false` | Отображать чекбоксы для множественного выбора. |
|
|
197
|
+
| selectWithChildren | boolean | `false` | При выборе родителя выбирать всех его детей. |
|
|
198
|
+
| storeExpandedKeysTo | string | - | Ключ в `localStorage` для сохранения состояния раскрытых узлов. |
|
|
199
|
+
| bordered | boolean | `false` | Добавить границы вокруг ячеек. |
|
|
200
|
+
|
|
201
|
+
### События (Events)
|
|
202
|
+
|
|
203
|
+
| Название | Параметры | Описание |
|
|
204
|
+
|----------|-----------|----------|
|
|
205
|
+
| dragstart | `(node: STreeNode, event: DragEvent)` | Вызывается при начале перетаскивания узла. |
|
|
206
|
+
| drop | `(targetNode: STreeNode, event: DragEvent, dropType: string \| undefined)` | Вызывается при завершении перетаскивания. |
|
|
207
|
+
| change | `(node: STreeNode)` | Вызывается при смене выбранного узла (если `selectable`). |
|
|
208
|
+
|
|
209
|
+
### Слоты (Slots)
|
|
210
|
+
|
|
211
|
+
| Название | Параметры | Описание |
|
|
212
|
+
|----------|-----------|----------|
|
|
213
|
+
| node | `{ node: STreeNode }` | Кастомный шаблон для содержимого узла дерева. |
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# SCheckboxGroup > SCheckbox
|
|
2
|
+
|
|
3
|
+
Одиночная галочка или набор галочек.
|
|
4
|
+
|
|
5
|
+
<SToggleGroup>
|
|
6
|
+
<SToggle title="В чем отличие от аналогов?">
|
|
7
|
+
<p>В отличие от популярных библиотек компонентов для Vue3:</p>
|
|
8
|
+
<ol>
|
|
9
|
+
<li>Сразу идет с кликабельным стандартизированным лейблом в качестве простого атрибута. Это унифицирует код и внешний вид компонентов, упрощается поддержка и взаимозаменяемость.</li>
|
|
10
|
+
<li>Поддерживает три формата передачи опций в группы чекбоксов, что удобно в зависимости от кейса:
|
|
11
|
+
<ol>
|
|
12
|
+
<li><code><SCheckbox /></code> — там где опции являются частью дизайна, их можно и удобно хардкодить в шаблон;</li>
|
|
13
|
+
<li><code>{value1: title1, value2: title2}</code> — что удобно для быстрого получения из key-value конфигов, а также из моделей — <code>User::pluck('name', 'id')</code>;</li>
|
|
14
|
+
<li><code>[[value1, title1], [value2, title2]]</code> — что удобно для выгрузки там, где важен порядок. Это минимизирует код в контроллерах, помогая сохранять принцип «тонкого контроллера», которого мы придерживаемся.</li>
|
|
15
|
+
</ol>
|
|
16
|
+
</li>
|
|
17
|
+
<li>Взаимозаменяемость формата опций с другими выбиралками из вариантов. Это позволяет легко заменять SCheckboxGroup на <a href="/pages/components/forms/sselect.html">SSelect</a> или <a href="/pages/components/forms/sradio.html">SRadioGroup</a>, не трогая бэкенд код.</li>
|
|
18
|
+
</ol>
|
|
19
|
+
</SToggle>
|
|
20
|
+
</SToggleGroup>
|
|
21
|
+
|
|
22
|
+
## Одиночная галочка
|
|
23
|
+
|
|
24
|
+
```vue
|
|
25
|
+
<template>
|
|
26
|
+
<SCheckbox v-model="isAccepted">Я согласен</SCheckbox>
|
|
27
|
+
</template>
|
|
28
|
+
<script setup>
|
|
29
|
+
import { ref } from 'vue'
|
|
30
|
+
const isAccepted = ref(false)
|
|
31
|
+
</script>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Модель принимает значение true/false.
|
|
35
|
+
|
|
36
|
+
## Группа галочек
|
|
37
|
+
|
|
38
|
+
```vue
|
|
39
|
+
<template>
|
|
40
|
+
<SCheckboxGroup v-model="types">
|
|
41
|
+
<SCheckbox value="bug">Ошибка</SCheckbox>
|
|
42
|
+
<SCheckbox value="question">Вопрос</SCheckbox>
|
|
43
|
+
<SCheckbox value="idea">Идея</SCheckbox>
|
|
44
|
+
</SCheckboxGroup>
|
|
45
|
+
<p>В модели будет храниться массив выбранных значений: <code>{{ types }}</code></p>
|
|
46
|
+
</template>
|
|
47
|
+
<script setup>
|
|
48
|
+
import { ref } from 'vue'
|
|
49
|
+
const types = ref([])
|
|
50
|
+
</script>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Динамический набор значений
|
|
54
|
+
|
|
55
|
+
В предыдущем примере набор вариантов хардкодился в шаблоне, что удобно, когда набор значений относится к логическому уровню интерфейса. Но когда набор вариантов идет из базы данных или конфига, очень неудобно каждый раз формировать набор элементов через v-for, и вместо этого используем атрибут `options`.
|
|
56
|
+
|
|
57
|
+
```vue
|
|
58
|
+
<template>
|
|
59
|
+
<SCheckboxGroup v-model="users" :options="userOptions" />
|
|
60
|
+
</template>
|
|
61
|
+
<script setup>
|
|
62
|
+
import { ref } from 'vue'
|
|
63
|
+
const users = ref([])
|
|
64
|
+
const userOptions = { 1: 'Иванов', 2: 'Петров', 3: 'Сидоров' }
|
|
65
|
+
</script>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Где options — это объект вариантов выбора в формате <code>{value1: title1, value2: title2}</code> или массив в формате <code>[[value1, title1], [value2, title2]]</code>
|
|
69
|
+
|
|
70
|
+
## Вертикальный список галочек
|
|
71
|
+
|
|
72
|
+
Чтобы выводить группу галочек вертикальным списком, добавляем атрибут `vertical`:
|
|
73
|
+
|
|
74
|
+
```vue
|
|
75
|
+
<template>
|
|
76
|
+
<SCheckboxGroup v-model="users" :options="userOptions" vertical />
|
|
77
|
+
</template>
|
|
78
|
+
<script setup>
|
|
79
|
+
import { ref } from 'vue'
|
|
80
|
+
const users = ref([])
|
|
81
|
+
const userOptions = { 1: 'Иванов', 2: 'Петров', 3: 'Сидоров' }
|
|
82
|
+
</script>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Недоступное значение
|
|
86
|
+
|
|
87
|
+
Добавляем атрибут `disabled` значению, которое должно быть недоступно для переключения.
|
|
88
|
+
|
|
89
|
+
```vue
|
|
90
|
+
<template>
|
|
91
|
+
<SCheckboxGroup v-model="types">
|
|
92
|
+
<SCheckbox value="bug" disabled>Ошибка</SCheckbox>
|
|
93
|
+
<SCheckbox value="question">Вопрос</SCheckbox>
|
|
94
|
+
<SCheckbox value="idea">Идея</SCheckbox>
|
|
95
|
+
</SCheckboxGroup>
|
|
96
|
+
</template>
|
|
97
|
+
<script setup>
|
|
98
|
+
import { ref } from 'vue'
|
|
99
|
+
const types = ref([])
|
|
100
|
+
</script>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Интерфейс компонента SCheckboxGroup
|
|
104
|
+
|
|
105
|
+
### Свойства (Props)
|
|
106
|
+
|
|
107
|
+
| Название | Тип | По умолчанию | Описание |
|
|
108
|
+
|----------|-----|--------------|----------|
|
|
109
|
+
| v-model | `any[]` | `[]` | Массив выбранных значений. |
|
|
110
|
+
| options | Record \| Array | `{}` | Список вариантов (объект или массив пар). |
|
|
111
|
+
| vertical | boolean | `false` | Расположение элементов в колонку. |
|
|
112
|
+
|
|
113
|
+
### Слоты (Slots)
|
|
114
|
+
|
|
115
|
+
| Название | Описание |
|
|
116
|
+
|----------|----------|
|
|
117
|
+
| default | Содержимое группы (обычно компоненты `SCheckbox`). |
|
|
118
|
+
|
|
119
|
+
## Интерфейс компонента SCheckbox
|
|
120
|
+
|
|
121
|
+
### Свойства (Props)
|
|
122
|
+
|
|
123
|
+
| Название | Тип | По умолчанию | Описание |
|
|
124
|
+
|----------|-----|--------------|----------|
|
|
125
|
+
| v-model | any | - | Значение (для одиночного использования). |
|
|
126
|
+
| value | any | `undefined` | Значение элемента (для использования в группе). |
|
|
127
|
+
| disabled | boolean | `false` | Отключает возможность выбора. |
|
|
128
|
+
|
|
129
|
+
### Слоты (Slots)
|
|
130
|
+
|
|
131
|
+
| Название | Описание |
|
|
132
|
+
|----------|----------|
|
|
133
|
+
| default | Текст лейбла рядом с галочкой. |
|
|
134
|
+
|
|
135
|
+
### События (Events)
|
|
136
|
+
|
|
137
|
+
| Название | Параметры | Описание |
|
|
138
|
+
|----------|-----------|----------|
|
|
139
|
+
| change | `(value: any)` | Вызывается при изменении состояния. |
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# SDatePicker
|
|
2
|
+
|
|
3
|
+
Поле выбора даты.
|
|
4
|
+
|
|
5
|
+
<SToggleGroup>
|
|
6
|
+
<SToggle title="В чем отличие от аналогов?">
|
|
7
|
+
<p>В отличие от популярных библиотек компонентов для Vue3:</p>
|
|
8
|
+
<ol>
|
|
9
|
+
<li>Сразу поддерживает на уровне атрибута <a href="#выбор-вариантов-кнопками">кнопки с готовыми наборами значений</a>, которые часто нужны в фильтрах по диапазону дат.</li>
|
|
10
|
+
<li>Сразу из коробки по дефолту заточено под русскоязычную локализацию.</li>
|
|
11
|
+
<li>В отличие от западных библиотек — позволяет выбирать диапазон дат, начиная с более поздней даты. Удобно, когда нужно выбрать несколько последних месяцев.</li>
|
|
12
|
+
</ol>
|
|
13
|
+
</SToggle>
|
|
14
|
+
</SToggleGroup>
|
|
15
|
+
|
|
16
|
+
## Стандартный пример
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<template>
|
|
20
|
+
<SDatePicker v-model="value" />
|
|
21
|
+
<p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script setup>
|
|
25
|
+
import { ref } from 'vue'
|
|
26
|
+
|
|
27
|
+
const value = ref(null)
|
|
28
|
+
</script>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Выбирает значение в формате `YYYY-MM-DD`.
|
|
32
|
+
|
|
33
|
+
## Минимальное и максимальное значения
|
|
34
|
+
|
|
35
|
+
```vue
|
|
36
|
+
<template>
|
|
37
|
+
<SDatePicker v-model="value" :min="minDate" :max="maxDate" />
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<script setup>
|
|
41
|
+
import { ref } from 'vue'
|
|
42
|
+
|
|
43
|
+
const value = ref(null)
|
|
44
|
+
const minDate = '2026-06-01'
|
|
45
|
+
const maxDate = '2026-06-30'
|
|
46
|
+
</script>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Кастомный формат значения
|
|
50
|
+
|
|
51
|
+
```vue
|
|
52
|
+
<template>
|
|
53
|
+
<SDatePicker v-model="value" value-format="YYYYMMDD" />
|
|
54
|
+
<p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
|
|
55
|
+
</template>
|
|
56
|
+
<script setup>
|
|
57
|
+
import { ref } from 'vue'
|
|
58
|
+
const value = ref(null)
|
|
59
|
+
</script>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Независимо от этого атрибуты min/max всегда идут в своём стандартном формате `YYYY-MM-DD`.
|
|
63
|
+
|
|
64
|
+
## Выбор периода
|
|
65
|
+
|
|
66
|
+
Для выбора периода добавляем атрибут `range`:
|
|
67
|
+
|
|
68
|
+
```vue
|
|
69
|
+
<template>
|
|
70
|
+
<SDatePicker range v-model="value" value-format="YYYYMMDD" />
|
|
71
|
+
<p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
|
|
72
|
+
</template>
|
|
73
|
+
<script setup>
|
|
74
|
+
import { ref } from 'vue'
|
|
75
|
+
const value = ref(null)
|
|
76
|
+
</script>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
В модель подставляется массив из двух дат в формате, указанном в `value-format`.
|
|
80
|
+
|
|
81
|
+
## Выбор вариантов кнопками
|
|
82
|
+
|
|
83
|
+
Очень часто в фильтрах по диапазону дат удобно использовать однокликовый выбор предзаданного диапазона. Набор таких диапазонов мы устанавливаем через атрибут `buttons`.
|
|
84
|
+
|
|
85
|
+
```vue
|
|
86
|
+
<template>
|
|
87
|
+
<SDatePicker range v-model="value" value-format="YYYYMMDD" :buttons="buttons" />
|
|
88
|
+
</template>
|
|
89
|
+
<script setup>
|
|
90
|
+
import { ref } from 'vue'
|
|
91
|
+
const value = ref(null)
|
|
92
|
+
const buttons = {
|
|
93
|
+
'2 недели': '20250901-20250914',
|
|
94
|
+
'Месяц': '20250815-20250914',
|
|
95
|
+
}
|
|
96
|
+
</script>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Набор доступных кнопок задается в формате <code>{title: value.join('-')}</code>, например: <code>{"2 недели": "20250901-20250914", "Месяц": "20250815-20250914"}</code>
|
|
100
|
+
|
|
101
|
+
Именно в этом формате backend-класс DateInterval возвращает набор доступных кнопок: `(new DateInterval(request()->period))->titles`
|
|
102
|
+
|
|
103
|
+
## Выбор времени
|
|
104
|
+
|
|
105
|
+
Чтобы выбирать время, добавляем атрибут `with-time`. При этом, выходное значение будет в формате <strong>2025-12-22 12:27</strong>:
|
|
106
|
+
|
|
107
|
+
```vue
|
|
108
|
+
<template>
|
|
109
|
+
<SDatePicker with-time v-model="value" value-format="YYYYMMDD HH:mm" />
|
|
110
|
+
</template>
|
|
111
|
+
<script setup>
|
|
112
|
+
import { ref } from 'vue'
|
|
113
|
+
const value = ref(null)
|
|
114
|
+
</script>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Часы и минуты — это `SSelect` с фильтрацией, поэтому значение можно как выбрать мышью, так и набрать с клавиатуры. В локалях с 12-часовым форматом (например `en-US`) вместо часов 0–23 показываются часы 1–12 и переключатель AM/PM.
|
|
118
|
+
|
|
119
|
+
## Очистка значения
|
|
120
|
+
|
|
121
|
+
Атрибут `clearable` добавляет кнопку очистки (×), которая появляется, когда значение выбрано:
|
|
122
|
+
|
|
123
|
+
```vue
|
|
124
|
+
<template>
|
|
125
|
+
<SDatePicker clearable v-model="value" />
|
|
126
|
+
<p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
|
|
127
|
+
</template>
|
|
128
|
+
<script setup>
|
|
129
|
+
import { ref } from 'vue'
|
|
130
|
+
const value = ref('2026-06-18')
|
|
131
|
+
</script>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Интерфейс компонента
|
|
135
|
+
|
|
136
|
+
### Свойства (Props)
|
|
137
|
+
|
|
138
|
+
| Название | Тип | По умолчанию | Описание |
|
|
139
|
+
|----------|-----|--------------|----------|
|
|
140
|
+
| v-model | `string \| string[]` | `null` | Выбранное значение (строка для одиночного выбора, массив для диапазона). |
|
|
141
|
+
| range | `boolean` | `false` | Режим выбора периода (диапазона дат). |
|
|
142
|
+
| value-format | `string` | `'YYYY-MM-DD'` | Формат значения в модели. Если `with-time` включен, по умолчанию `'YYYY-MM-DD HH:mm'`. |
|
|
143
|
+
| input-format | `string` | `'DD.MM.YYYY'` | Формат отображения даты в текстовом поле. |
|
|
144
|
+
| min | `string` | `undefined` | Минимально допустимая дата (в формате `YYYY-MM-DD`). |
|
|
145
|
+
| max | `string` | `undefined` | Максимально допустимая дата (в формате `YYYY-MM-DD`). |
|
|
146
|
+
| number-of-months | `number` | `1 \| 2` | Количество отображаемых месяцев в календаре (по умолчанию 2 для `range`, иначе 1). |
|
|
147
|
+
| buttons | `Record<string, string>` | `undefined` | Набор кнопок быстрого выбора диапазона (`{ название: 'date1-date2' }`). |
|
|
148
|
+
| with-time | `boolean` | `false` | Позволяет выбирать время (часы и минуты). Только для одиночного выбора. |
|
|
149
|
+
| clearable | `boolean` | `false` | Показывает кнопку очистки (×), когда значение выбрано. |
|
|
150
|
+
| first-day | `number` | (из локали) | Первый день недели: `0` — воскресенье, `1` — понедельник. |
|
|
151
|
+
| icon | `string \| string[]` | `undefined` | Необязательная FontAwesome-иконка календаря (например `['far', 'calendar']`). По умолчанию используется встроенная SVG-иконка — компонент не требует FontAwesome. |
|
|
152
|
+
|
|
153
|
+
Названия дней недели и месяцев, а также 12/24-часовой формат времени больше не задаются атрибутами per-instance — они берутся из активной локали и переопределяются глобально через параметры локализации (`configureStartupUi`). Подробнее — в разделе [Локализация](/pages/welcome/basics/localization).
|
|
154
|
+
|
|
155
|
+
Иконки (календарь и стрелки переключения месяца) — встроенные SVG, поэтому FontAwesome для `SDatePicker` не обязателен. Дни соседних месяцев в сетке кликабельны. Поддерживается управление с клавиатуры: в фокусе стрелка вниз открывает календарь, стрелки двигают маркер по датам, Enter фиксирует выбор, Esc закрывает.
|
|
156
|
+
|
|
157
|
+
<style lang="scss" scoped>
|
|
158
|
+
.s-datepicker {
|
|
159
|
+
color: var(--s-text);
|
|
160
|
+
}
|
|
161
|
+
</style>
|