@smartos-lib/components 1.7.0-beta.0 → 1.8.0-beta.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintrc-auto-import.json +0 -3
- package/dist/smart-docx-editor/index.js +2 -2
- package/dist/smart-file-preview/index.js +2 -2
- package/dist/smart-upload/index.d.ts +12 -1
- package/dist/smart-upload/index.js +2 -800
- package/package.json +1 -1
- package/src/composables/useNaiveTheme.ts +1 -54
- package/src/shared/naiveThemeOverrides.ts +54 -0
- package/src/web-components/smart-upload/index.ts +34 -1
- package/src/web-components/smart-upload/index.vue +24 -3
- package/src/web-components/smart-upload/types.ts +8 -0
- package/types/auto-imports.d.ts +0 -9
package/package.json
CHANGED
@@ -1,58 +1,5 @@
|
|
1
|
-
import type { GlobalThemeOverrides } from 'naive-ui';
|
2
1
|
import { darkTheme, dateZhCN, zhCN } from 'naive-ui';
|
3
|
-
import {
|
4
|
-
import { colors, fontFamily } from '@/shared/unocss.theme';
|
5
|
-
|
6
|
-
/** 通用主题变量覆盖 */
|
7
|
-
export const commonOverrides: GlobalThemeOverrides = {
|
8
|
-
common: {
|
9
|
-
// 默认字体
|
10
|
-
fontFamily: fontFamily.sans,
|
11
|
-
// 等宽字体
|
12
|
-
fontFamilyMono: fontFamily.mono,
|
13
|
-
|
14
|
-
// Primary 颜色
|
15
|
-
primaryColor: colors.primary,
|
16
|
-
primaryColorHover: colors['primary-hover'],
|
17
|
-
primaryColorPressed: colors['primary-active'],
|
18
|
-
primaryColorSuppl: colors.primary,
|
19
|
-
// Info 颜色
|
20
|
-
infoColor: colors.info,
|
21
|
-
infoColorHover: colors['info-hover'],
|
22
|
-
infoColorPressed: colors['info-active'],
|
23
|
-
infoColorSuppl: colors.info,
|
24
|
-
// Success 颜色
|
25
|
-
successColor: colors.success,
|
26
|
-
successColorHover: colors['success-hover'],
|
27
|
-
successColorPressed: colors['success-active'],
|
28
|
-
successColorSuppl: colors.success,
|
29
|
-
// Warning 颜色
|
30
|
-
warningColor: colors.warning,
|
31
|
-
warningColorHover: colors['warning-hover'],
|
32
|
-
warningColorPressed: colors['warning-active'],
|
33
|
-
warningColorSuppl: colors.warning,
|
34
|
-
// Error 颜色
|
35
|
-
errorColor: colors.error,
|
36
|
-
errorColorHover: colors['error-hover'],
|
37
|
-
errorColorPressed: colors['error-active'],
|
38
|
-
errorColorSuppl: colors.error,
|
39
|
-
},
|
40
|
-
};
|
41
|
-
|
42
|
-
/** 亮色主题变量覆盖 */
|
43
|
-
export const lightThemeOverrides: GlobalThemeOverrides = deepMerge({}, commonOverrides, {
|
44
|
-
|
45
|
-
});
|
46
|
-
/** 深色主题变量覆盖 */
|
47
|
-
export const darkThemeOverrides: GlobalThemeOverrides = deepMerge({}, commonOverrides, {
|
48
|
-
Button: {
|
49
|
-
textColorPrimary: '#FFF',
|
50
|
-
textColorHoverPrimary: '#FFF',
|
51
|
-
textColorPressedPrimary: '#FFF',
|
52
|
-
textColorFocusPrimary: '#FFF',
|
53
|
-
textColorDisabledPrimary: '#FFF',
|
54
|
-
},
|
55
|
-
});
|
2
|
+
import { darkThemeOverrides, lightThemeOverrides } from '@/shared/naiveThemeOverrides';
|
56
3
|
|
57
4
|
export const useNaiveTheme = createSharedComposable(() => {
|
58
5
|
const themeStore = useThemeStore();
|
@@ -0,0 +1,54 @@
|
|
1
|
+
import type { GlobalThemeOverrides } from 'naive-ui';
|
2
|
+
import { deepMerge } from 'mixte';
|
3
|
+
import { colors, fontFamily } from './unocss.theme';
|
4
|
+
|
5
|
+
/** 通用主题变量覆盖 */
|
6
|
+
export const commonOverrides: GlobalThemeOverrides = {
|
7
|
+
common: {
|
8
|
+
// 默认字体
|
9
|
+
fontFamily: fontFamily.sans,
|
10
|
+
// 等宽字体
|
11
|
+
fontFamilyMono: fontFamily.mono,
|
12
|
+
|
13
|
+
// Primary 颜色
|
14
|
+
primaryColor: colors.primary,
|
15
|
+
primaryColorHover: colors['primary-hover'],
|
16
|
+
primaryColorPressed: colors['primary-active'],
|
17
|
+
primaryColorSuppl: colors.primary,
|
18
|
+
// Info 颜色
|
19
|
+
infoColor: colors.info,
|
20
|
+
infoColorHover: colors['info-hover'],
|
21
|
+
infoColorPressed: colors['info-active'],
|
22
|
+
infoColorSuppl: colors.info,
|
23
|
+
// Success 颜色
|
24
|
+
successColor: colors.success,
|
25
|
+
successColorHover: colors['success-hover'],
|
26
|
+
successColorPressed: colors['success-active'],
|
27
|
+
successColorSuppl: colors.success,
|
28
|
+
// Warning 颜色
|
29
|
+
warningColor: colors.warning,
|
30
|
+
warningColorHover: colors['warning-hover'],
|
31
|
+
warningColorPressed: colors['warning-active'],
|
32
|
+
warningColorSuppl: colors.warning,
|
33
|
+
// Error 颜色
|
34
|
+
errorColor: colors.error,
|
35
|
+
errorColorHover: colors['error-hover'],
|
36
|
+
errorColorPressed: colors['error-active'],
|
37
|
+
errorColorSuppl: colors.error,
|
38
|
+
},
|
39
|
+
};
|
40
|
+
|
41
|
+
/** 亮色主题变量覆盖 */
|
42
|
+
export const lightThemeOverrides: GlobalThemeOverrides = deepMerge({}, commonOverrides, {
|
43
|
+
|
44
|
+
});
|
45
|
+
/** 深色主题变量覆盖 */
|
46
|
+
export const darkThemeOverrides: GlobalThemeOverrides = deepMerge({}, commonOverrides, {
|
47
|
+
Button: {
|
48
|
+
textColorPrimary: '#FFF',
|
49
|
+
textColorHoverPrimary: '#FFF',
|
50
|
+
textColorPressedPrimary: '#FFF',
|
51
|
+
textColorFocusPrimary: '#FFF',
|
52
|
+
textColorDisabledPrimary: '#FFF',
|
53
|
+
},
|
54
|
+
});
|
@@ -1,5 +1,38 @@
|
|
1
|
+
import type { NUpload, UploadFileInfo } from 'naive-ui';
|
2
|
+
import { defineCustomElement } from 'vue';
|
1
3
|
import VueComponent from './index.vue';
|
2
4
|
import { tag } from './info';
|
3
5
|
import { defineCustomElements } from '@/utils/defineCustomElements';
|
6
|
+
import { getCustomElementExposed } from '@/utils/callCustomElementExposed';
|
4
7
|
|
5
|
-
|
8
|
+
type UploadRef = InstanceType<typeof NUpload>;
|
9
|
+
|
10
|
+
// 组件转为 Vue 自定义元素
|
11
|
+
const VueCustomElement = defineCustomElement(VueComponent);
|
12
|
+
|
13
|
+
// 暴露组件属性/方法
|
14
|
+
Object.assign(VueCustomElement.prototype, {
|
15
|
+
getUploadRef() {
|
16
|
+
return (getCustomElementExposed(this, 'uploadRef') as Ref<UploadRef>).value;
|
17
|
+
},
|
18
|
+
getFileList() {
|
19
|
+
return (getCustomElementExposed(this, 'fileList') as Ref<UploadFileInfo[]>).value;
|
20
|
+
},
|
21
|
+
submit() {
|
22
|
+
return this.getUploadRef().submit();
|
23
|
+
},
|
24
|
+
clear() {
|
25
|
+
return this.getUploadRef().clear();
|
26
|
+
},
|
27
|
+
});
|
28
|
+
|
29
|
+
// 注册组件
|
30
|
+
defineCustomElements(tag, VueCustomElement);
|
31
|
+
|
32
|
+
// 暴露组件类型
|
33
|
+
export type SmartUploadElement = typeof VueCustomElement & {
|
34
|
+
getUploadRef: () => UploadRef
|
35
|
+
getFileList: () => UploadFileInfo[]
|
36
|
+
submit: UploadRef['submit']
|
37
|
+
clear: UploadRef['clear']
|
38
|
+
};
|
@@ -1,7 +1,8 @@
|
|
1
1
|
<template>
|
2
2
|
<NConfigProvider :cls-prefix="classPrefix" :theme-overrides="commonOverrides" :locale="zhCN" abstract>
|
3
3
|
<NUpload
|
4
|
-
|
4
|
+
ref="uploadRef"
|
5
|
+
v-bind="bindProps"
|
5
6
|
v-model:file-list="fileList"
|
6
7
|
:custom-request="customRequest"
|
7
8
|
@remove="onRemoved"
|
@@ -19,14 +20,21 @@
|
|
19
20
|
import { NButton, NConfigProvider, NUpload, zhCN } from 'naive-ui';
|
20
21
|
import { getConfigProvider } from '@smartos-lib/core';
|
21
22
|
import type { Props } from './types';
|
23
|
+
import { commonOverrides } from '@/shared/naiveThemeOverrides';
|
22
24
|
|
23
25
|
const props = defineProps<Props>();
|
24
26
|
const list = defineModel<UploadFieldValueItem[]>('fileList', {
|
25
27
|
default: () => [],
|
26
28
|
});
|
27
29
|
|
30
|
+
const uploadRef = ref<InstanceType<typeof NUpload>>();
|
31
|
+
|
28
32
|
const { classPrefix } = useSmart();
|
29
33
|
|
34
|
+
const bindProps = reactiveOmit(props, [
|
35
|
+
'beforeUpload',
|
36
|
+
]);
|
37
|
+
|
30
38
|
/** 内部维护的文件列表 */
|
31
39
|
const fileList = ref<UploadFileInfo[]>(
|
32
40
|
list.value.map(({ fileName: url }) => ({ id: url, name: url, url, status: 'finished' })),
|
@@ -35,11 +43,12 @@
|
|
35
43
|
/** 自定义上传 */
|
36
44
|
function customRequest({ file, onFinish, onError, onProgress }: UploadCustomRequestOptions) {
|
37
45
|
const originFile = file.file as File;
|
46
|
+
const beforeUpload = props.beforeUpload ?? (c => c);
|
38
47
|
|
39
48
|
const form = new FormData();
|
40
49
|
form.set('file', originFile);
|
41
50
|
|
42
|
-
|
51
|
+
const config = beforeUpload({
|
43
52
|
method: 'post',
|
44
53
|
url: '/admin/sys-file/upload',
|
45
54
|
data: form,
|
@@ -49,14 +58,21 @@
|
|
49
58
|
onUploadProgress({ loaded, total }) {
|
50
59
|
onProgress({ percent: total ? Math.ceil((loaded / total) * 100) : 0 });
|
51
60
|
},
|
52
|
-
})
|
61
|
+
});
|
62
|
+
|
63
|
+
getConfigProvider('request')!(config)
|
53
64
|
.then((res) => {
|
54
65
|
const data = res.data.data;
|
55
66
|
|
56
67
|
file.url = data.url;
|
68
|
+
file.status = 'finished';
|
57
69
|
onFinish();
|
58
70
|
|
59
71
|
nextTick(() => {
|
72
|
+
// fix: 手动上传完成时, fileList 中的文件信息不会更新
|
73
|
+
if (!props.defaultUpload)
|
74
|
+
fileList.value.splice(fileList.value.findIndex(({ id }) => id === file.id), 1, file);
|
75
|
+
|
60
76
|
list.value.includes(data.url) || list.value.push({ fileName: data.url, originalFileName: originFile.name });
|
61
77
|
});
|
62
78
|
})
|
@@ -98,4 +114,9 @@
|
|
98
114
|
i++;
|
99
115
|
}
|
100
116
|
});
|
117
|
+
|
118
|
+
defineExpose({
|
119
|
+
uploadRef,
|
120
|
+
fileList,
|
121
|
+
});
|
101
122
|
</script>
|
@@ -1,6 +1,12 @@
|
|
1
|
+
import type { AxiosRequestConfig } from 'axios';
|
1
2
|
import type { UploadProps } from 'naive-ui';
|
2
3
|
|
3
4
|
export interface Props {
|
5
|
+
/** 发起请求前的钩子, 用于修改请求配置 */
|
6
|
+
beforeUpload?: <T extends AxiosRequestConfig>(config: T) => T
|
7
|
+
|
8
|
+
/* ------------------ 以下为 NaiveUI 上传组件原有 Props ------------------ */
|
9
|
+
|
4
10
|
accept?: UploadProps['accept']
|
5
11
|
defaultFileList?: UploadProps['defaultFileList']
|
6
12
|
defaultUpload?: UploadProps['defaultUpload']
|
@@ -25,4 +31,6 @@ export interface Props {
|
|
25
31
|
showTrigger?: UploadProps['showTrigger']
|
26
32
|
triggerClass?: UploadProps['triggerClass']
|
27
33
|
triggerStyle?: UploadProps['triggerStyle']
|
34
|
+
onError?: UploadProps['onError']
|
35
|
+
onFinish?: UploadProps['onFinish']
|
28
36
|
};
|
package/types/auto-imports.d.ts
CHANGED
@@ -8,7 +8,6 @@ declare global {
|
|
8
8
|
const EffectScope: typeof import('vue')['EffectScope']
|
9
9
|
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
|
10
10
|
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
|
11
|
-
const commonOverrides: typeof import('../src/composables/useNaiveTheme')['commonOverrides']
|
12
11
|
const computed: typeof import('vue')['computed']
|
13
12
|
const computedAsync: typeof import('@vueuse/core')['computedAsync']
|
14
13
|
const computedEager: typeof import('@vueuse/core')['computedEager']
|
@@ -29,7 +28,6 @@ declare global {
|
|
29
28
|
const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise']
|
30
29
|
const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
|
31
30
|
const customRef: typeof import('vue')['customRef']
|
32
|
-
const darkThemeOverrides: typeof import('../src/composables/useNaiveTheme')['darkThemeOverrides']
|
33
31
|
const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
|
34
32
|
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
|
35
33
|
const deepUnref: typeof import('@mixte/use')['deepUnref']
|
@@ -49,7 +47,6 @@ declare global {
|
|
49
47
|
const isReactive: typeof import('vue')['isReactive']
|
50
48
|
const isReadonly: typeof import('vue')['isReadonly']
|
51
49
|
const isRef: typeof import('vue')['isRef']
|
52
|
-
const lightThemeOverrides: typeof import('../src/composables/useNaiveTheme')['lightThemeOverrides']
|
53
50
|
const logicAnd: typeof import('@vueuse/math')['logicAnd']
|
54
51
|
const logicNot: typeof import('@vueuse/math')['logicNot']
|
55
52
|
const logicOr: typeof import('@vueuse/math')['logicOr']
|
@@ -336,7 +333,6 @@ declare module 'vue' {
|
|
336
333
|
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
|
337
334
|
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
|
338
335
|
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
|
339
|
-
readonly commonOverrides: UnwrapRef<typeof import('../src/composables/useNaiveTheme')['commonOverrides']>
|
340
336
|
readonly computed: UnwrapRef<typeof import('vue')['computed']>
|
341
337
|
readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
|
342
338
|
readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']>
|
@@ -357,7 +353,6 @@ declare module 'vue' {
|
|
357
353
|
readonly createTemplatePromise: UnwrapRef<typeof import('@vueuse/core')['createTemplatePromise']>
|
358
354
|
readonly createUnrefFn: UnwrapRef<typeof import('@vueuse/core')['createUnrefFn']>
|
359
355
|
readonly customRef: UnwrapRef<typeof import('vue')['customRef']>
|
360
|
-
readonly darkThemeOverrides: UnwrapRef<typeof import('../src/composables/useNaiveTheme')['darkThemeOverrides']>
|
361
356
|
readonly debouncedRef: UnwrapRef<typeof import('@vueuse/core')['debouncedRef']>
|
362
357
|
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
|
363
358
|
readonly deepUnref: UnwrapRef<typeof import('@mixte/use')['deepUnref']>
|
@@ -377,7 +372,6 @@ declare module 'vue' {
|
|
377
372
|
readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']>
|
378
373
|
readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']>
|
379
374
|
readonly isRef: UnwrapRef<typeof import('vue')['isRef']>
|
380
|
-
readonly lightThemeOverrides: UnwrapRef<typeof import('../src/composables/useNaiveTheme')['lightThemeOverrides']>
|
381
375
|
readonly logicAnd: UnwrapRef<typeof import('@vueuse/math')['logicAnd']>
|
382
376
|
readonly logicNot: UnwrapRef<typeof import('@vueuse/math')['logicNot']>
|
383
377
|
readonly logicOr: UnwrapRef<typeof import('@vueuse/math')['logicOr']>
|
@@ -657,7 +651,6 @@ declare module '@vue/runtime-core' {
|
|
657
651
|
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
|
658
652
|
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
|
659
653
|
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
|
660
|
-
readonly commonOverrides: UnwrapRef<typeof import('../src/composables/useNaiveTheme')['commonOverrides']>
|
661
654
|
readonly computed: UnwrapRef<typeof import('vue')['computed']>
|
662
655
|
readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
|
663
656
|
readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']>
|
@@ -678,7 +671,6 @@ declare module '@vue/runtime-core' {
|
|
678
671
|
readonly createTemplatePromise: UnwrapRef<typeof import('@vueuse/core')['createTemplatePromise']>
|
679
672
|
readonly createUnrefFn: UnwrapRef<typeof import('@vueuse/core')['createUnrefFn']>
|
680
673
|
readonly customRef: UnwrapRef<typeof import('vue')['customRef']>
|
681
|
-
readonly darkThemeOverrides: UnwrapRef<typeof import('../src/composables/useNaiveTheme')['darkThemeOverrides']>
|
682
674
|
readonly debouncedRef: UnwrapRef<typeof import('@vueuse/core')['debouncedRef']>
|
683
675
|
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
|
684
676
|
readonly deepUnref: UnwrapRef<typeof import('@mixte/use')['deepUnref']>
|
@@ -698,7 +690,6 @@ declare module '@vue/runtime-core' {
|
|
698
690
|
readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']>
|
699
691
|
readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']>
|
700
692
|
readonly isRef: UnwrapRef<typeof import('vue')['isRef']>
|
701
|
-
readonly lightThemeOverrides: UnwrapRef<typeof import('../src/composables/useNaiveTheme')['lightThemeOverrides']>
|
702
693
|
readonly logicAnd: UnwrapRef<typeof import('@vueuse/math')['logicAnd']>
|
703
694
|
readonly logicNot: UnwrapRef<typeof import('@vueuse/math')['logicNot']>
|
704
695
|
readonly logicOr: UnwrapRef<typeof import('@vueuse/math')['logicOr']>
|