plugin-ui-for-kzt 0.0.62 → 0.0.63
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/.claude/settings.local.json +7 -0
- package/dist/components/BaseBadge/BaseBadge.vue.d.ts +2 -2
- package/dist/components/BaseButton/BaseButton.vue.d.ts +3 -7
- package/dist/components/BaseCalendar/BaseCalendar.vue.d.ts +3 -3
- package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +3 -7
- package/dist/components/BaseDropdown/BaseDropdown.vue.d.ts +2 -6
- package/dist/components/BaseField/BaseField.vue.d.ts +3 -3
- package/dist/components/BaseInput/BaseInput.vue.d.ts +5 -5
- package/dist/components/BaseInputCalendar/BaseInputCalendar.vue.d.ts +6 -6
- package/dist/components/BaseInputCurrency/BaseInputCurrency.vue.d.ts +6 -6
- package/dist/components/BaseInputEmail/BaseInputEmail.vue.d.ts +4 -4
- package/dist/components/BaseInputPhone/BaseInputPhone.vue.d.ts +4 -4
- package/dist/components/BaseInputWithSelector/BaseInputWithSelector.vue.d.ts +1 -1
- package/dist/components/BaseOpenedListItem/BaseOpenedListItem.vue.d.ts +2 -6
- package/dist/components/BasePagination/BasePagination.vue.d.ts +1 -1
- package/dist/components/BaseRadio/BaseRadio.vue.d.ts +3 -7
- package/dist/components/BaseSegmentedButtons/BaseSegmentedButtons.vue.d.ts +2 -6
- package/dist/components/BaseSelect/BaseSelect.vue.d.ts +4 -12
- package/dist/components/BaseSiteInput/BaseSiteInput.vue.d.ts +1 -1
- package/dist/components/BaseTag/BaseTag.vue.d.ts +1 -1
- package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +4 -4
- package/dist/components/BaseToast/BaseToast.vue.d.ts +1 -1
- package/dist/components/BaseToggle/BaseToggle.vue.d.ts +3 -7
- package/dist/components/BaseUpload/BaseUpload.vue.d.ts +6 -4
- package/dist/index.js +1 -1
- package/dist/sprite.svg +1 -1
- package/dist/store/modal.d.ts +13 -13
- package/dist/utils/viewPort.d.ts +5 -0
- package/example/App.vue +1 -0
- package/package.json +1 -1
- package/src/assets/icons/upload-2.svg +7 -0
- package/src/assets/icons/upload.svg +3 -3
- package/src/components/BaseInputPhone/README.md +78 -0
- package/src/components/BaseModal/README.md +88 -0
- package/src/components/BaseSiteInput/README.md +76 -0
- package/src/components/BaseSwiper/README.md +88 -0
- package/src/components/BaseTabs/README.md +110 -0
- package/src/components/BaseUpload/BaseUpload.vue +132 -18
- package/src/components/BaseUpload/README.md +126 -0
- package/src/types/uploadedFile.d.ts +10 -2
- package/src/utils/viewPort.ts +50 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# BaseUpload
|
|
2
|
+
|
|
3
|
+
Компонент для загрузки файлов с поддержкой drag & drop, предпросмотра изображений и обрезки (crop).
|
|
4
|
+
|
|
5
|
+
## Использование
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<template>
|
|
9
|
+
<BaseUpload
|
|
10
|
+
:accepted-formats="['.pdf', '.docx', '.jpg', '.png']"
|
|
11
|
+
:multiple="true"
|
|
12
|
+
:max-file-size="25 * 1024 * 1024"
|
|
13
|
+
title="Перетащите или кликните для загрузки"
|
|
14
|
+
subtitle="Допустимый формат файлов: pdf, docx, jpeg до 25 MB"
|
|
15
|
+
@update:files="onFilesUpdate"
|
|
16
|
+
@download-file="onDownload"
|
|
17
|
+
@remove-file="onRemove"
|
|
18
|
+
/>
|
|
19
|
+
</template>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Пропсы
|
|
23
|
+
|
|
24
|
+
| Пропс | Тип | По умолчанию | Обязательный | Описание |
|
|
25
|
+
|------------------|------------------|--------------------|:------------:|--------------------------------------------------------------------------|
|
|
26
|
+
| `acceptedFormats`| `string[]` | — | Да | Список допустимых расширений файлов, например `['.pdf', '.jpg', '.png']` |
|
|
27
|
+
| `title` | `string` | — | Да | Заголовок зоны загрузки |
|
|
28
|
+
| `subtitle` | `string` | — | Да | Подзаголовок / описание зоны загрузки |
|
|
29
|
+
| `multiple` | `boolean` | `true` | Нет | Разрешить загрузку нескольких файлов одновременно |
|
|
30
|
+
| `maxFileSize` | `number` | `26214400` (25 MB) | Нет | Максимальный допустимый размер файла в байтах |
|
|
31
|
+
| `enableCrop` | `boolean` | `false` | Нет | Включить обрезку изображений перед загрузкой |
|
|
32
|
+
| `cropTexts` | `CropTexts` | — | Нет | Тексты кнопок модального окна обрезки (`cancel`, `confirm`) |
|
|
33
|
+
| `files` | `UploadedFile[]` | — | Нет | Начальный список файлов (для внешнего управления состоянием) |
|
|
34
|
+
|
|
35
|
+
### Тип `CropTexts`
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
interface CropTexts {
|
|
39
|
+
cancel?: string;
|
|
40
|
+
confirm?: string;
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Тип `UploadedFile`
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
interface UploadedFile {
|
|
48
|
+
name: string;
|
|
49
|
+
size: number;
|
|
50
|
+
file: File;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## События
|
|
55
|
+
|
|
56
|
+
| Событие | Payload | Описание |
|
|
57
|
+
|-----------------|--------------------|--------------------------------------------------------------------------------------------|
|
|
58
|
+
| `update:files` | `UploadedFile[]` | Вызывается при добавлении файла. Передаёт актуальный список всех загруженных файлов |
|
|
59
|
+
| `download-file` | `UploadedFile` | Вызывается при клике на скачивание файла, у которого нет локального объекта `File` (ранее загруженные с сервера файлы) |
|
|
60
|
+
| `remove-file` | `UploadedFile` | Вызывается при удалении файла, у которого нет `lastModified` (серверный файл) |
|
|
61
|
+
|
|
62
|
+
## Слоты
|
|
63
|
+
|
|
64
|
+
| Слот | Описание |
|
|
65
|
+
|---------------|---------------------------------------|
|
|
66
|
+
| `title` | Переопределяет заголовок зоны загрузки |
|
|
67
|
+
| `description` | Переопределяет описание зоны загрузки |
|
|
68
|
+
|
|
69
|
+
```vue
|
|
70
|
+
<BaseUpload :accepted-formats="['.png']" title="" subtitle="">
|
|
71
|
+
<template #title>Загрузите аватар</template>
|
|
72
|
+
<template #description>PNG, до 5 MB</template>
|
|
73
|
+
</BaseUpload>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Поведение
|
|
77
|
+
|
|
78
|
+
- **Drag & Drop** — файлы можно перетаскивать в зону загрузки. При наведении зона подсвечивается синим.
|
|
79
|
+
- **Медиафайлы** (`.jpg`, `.jpeg`, `.png`, `.svg`) — отображаются в виде сетки миниатюр с кнопками предпросмотра (zoom) и удаления.
|
|
80
|
+
- **Остальные файлы** — отображаются в виде списка с именем, размером и кнопками скачивания и удаления.
|
|
81
|
+
- **Одиночный режим** (`multiple: false`) — при загрузке нового файла предыдущий заменяется автоматически.
|
|
82
|
+
- **Обрезка** (`enableCrop: true`) — перед добавлением изображения открывается модальное окно `CropModal`.
|
|
83
|
+
- **Валидация** — проверяется расширение файла и его размер. При ошибке под зоной загрузки отображается сообщение.
|
|
84
|
+
- **Внешнее управление** — при передаче пропса `files` список файлов синхронизируется с внешним состоянием через `watch`.
|
|
85
|
+
|
|
86
|
+
## Примеры
|
|
87
|
+
|
|
88
|
+
### Только изображения с обрезкой
|
|
89
|
+
|
|
90
|
+
```vue
|
|
91
|
+
<BaseUpload
|
|
92
|
+
:accepted-formats="['.jpg', '.jpeg', '.png']"
|
|
93
|
+
:enable-crop="true"
|
|
94
|
+
:crop-texts="{ cancel: 'Отмена', confirm: 'Обрезать' }"
|
|
95
|
+
title="Загрузите фото"
|
|
96
|
+
subtitle="JPG, PNG до 5 MB"
|
|
97
|
+
@update:files="files = $event"
|
|
98
|
+
/>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Загрузка одного документа
|
|
102
|
+
|
|
103
|
+
```vue
|
|
104
|
+
<BaseUpload
|
|
105
|
+
:accepted-formats="['.pdf', '.docx']"
|
|
106
|
+
:multiple="false"
|
|
107
|
+
:max-file-size="10 * 1024 * 1024"
|
|
108
|
+
title="Прикрепите документ"
|
|
109
|
+
subtitle="PDF или DOCX до 10 MB"
|
|
110
|
+
@update:files="files = $event"
|
|
111
|
+
/>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### С внешним управлением файлами
|
|
115
|
+
|
|
116
|
+
```vue
|
|
117
|
+
<BaseUpload
|
|
118
|
+
:accepted-formats="['.pdf']"
|
|
119
|
+
:files="initialFiles"
|
|
120
|
+
title="Загрузите файлы"
|
|
121
|
+
subtitle="PDF до 25 MB"
|
|
122
|
+
@update:files="onUpdate"
|
|
123
|
+
@download-file="onDownload"
|
|
124
|
+
@remove-file="onRemove"
|
|
125
|
+
/>
|
|
126
|
+
```
|
|
@@ -15,7 +15,15 @@ export interface IpropsUpload {
|
|
|
15
15
|
maxFileSize?: number; // Максимальный размер файла в байтах
|
|
16
16
|
enableCrop?: boolean; // Включить функциональность кропа для изображений
|
|
17
17
|
cropTexts?: CropTexts; // Тексты для кнопок в модальном окне кропа
|
|
18
|
-
onUpload?: (files: UploadedFile[]) => void; // Callback при загрузке файлов
|
|
19
|
-
onError?: (error: string) => void; // Callback при ошибке загрузки
|
|
20
18
|
files?: UploadedFile[];
|
|
19
|
+
title: string
|
|
20
|
+
subtitle: string;
|
|
21
|
+
texts?: {
|
|
22
|
+
upload?: string; // 'Загрузить фото'
|
|
23
|
+
photo?: string; // 'Загрузить фото'
|
|
24
|
+
documents?: string; // 'Документы'
|
|
25
|
+
loadMore?: string; // 'Загрузить ещё'
|
|
26
|
+
errorFormat?: string; // used in error template
|
|
27
|
+
errorSize?: string; // used in error template
|
|
28
|
+
}
|
|
21
29
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { readonly, ref } from 'vue';
|
|
2
|
+
|
|
3
|
+
export const breakpoints = {
|
|
4
|
+
mobile: 768,
|
|
5
|
+
desktop: 1200,
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const isMobileRef = ref<boolean>(false);
|
|
9
|
+
|
|
10
|
+
if (typeof window !== 'undefined') {
|
|
11
|
+
const mobileQuery = window.matchMedia(`(max-width: ${breakpoints.mobile}px)`);
|
|
12
|
+
const apply = (queryOrEvent: MediaQueryList | MediaQueryListEvent) =>
|
|
13
|
+
(isMobileRef.value =
|
|
14
|
+
'matches' in queryOrEvent
|
|
15
|
+
? queryOrEvent.matches
|
|
16
|
+
: // @ts-ignore
|
|
17
|
+
((queryOrEvent as MediaQueryListEvent).currentTarget?.matches ??
|
|
18
|
+
false));
|
|
19
|
+
|
|
20
|
+
apply(mobileQuery);
|
|
21
|
+
mobileQuery.addEventListener?.('change', apply);
|
|
22
|
+
mobileQuery.addListener?.(apply);
|
|
23
|
+
|
|
24
|
+
// HMR cleanup
|
|
25
|
+
const cleanup = () => {
|
|
26
|
+
mobileQuery.removeEventListener?.('change', apply);
|
|
27
|
+
mobileQuery.removeListener?.(apply);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const webpackHot = (
|
|
31
|
+
import.meta as ImportMeta & {
|
|
32
|
+
webpackHot?: { dispose: (callback: () => void) => void };
|
|
33
|
+
}
|
|
34
|
+
)?.webpackHot;
|
|
35
|
+
if (webpackHot) {
|
|
36
|
+
webpackHot.dispose(cleanup);
|
|
37
|
+
} else {
|
|
38
|
+
const modAny =
|
|
39
|
+
typeof module !== 'undefined'
|
|
40
|
+
? (module as NodeModule & {
|
|
41
|
+
hot?: { dispose: (callback: () => void) => void };
|
|
42
|
+
})
|
|
43
|
+
: undefined;
|
|
44
|
+
if (modAny?.hot) {
|
|
45
|
+
modAny.hot.dispose(cleanup);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const isMobile = readonly(isMobileRef);
|