Commit 73c8e0c1583afa83353ff36d1d9ec847776d3016
1 parent
19011296
perf: perf component
Showing
80 changed files
with
528 additions
and
630 deletions
CHANGELOG.zh_CN.md
1 | ## Wip | 1 | ## Wip |
2 | 2 | ||
3 | +## (破坏性更新) Breaking changes | ||
4 | + | ||
5 | +- ClickOutSide 组件引入方式由 `import ClickOutSide from '/@/components/ClickOutSide/index.vue'`变更为`import { ClickOutSide } from '/@/components/ClickOutSide'` | ||
6 | +- Button 组件引入方式由 `import ClickOutSide from '/@/components/Button/index.vue'`变更为`import { Button } from '/@/components/Button'` | ||
7 | +- StrengthMeter 组件引入方式由 `import StrengthMeter from '/@/components/StrengthMeter'`变更为`import { StrengthMeter } from '/@/components/StrengthMeter'` | ||
8 | +- 除示例外加入全局国际化功能,支持中文与英文 | ||
9 | + | ||
3 | ### ✨ Refactor | 10 | ### ✨ Refactor |
4 | 11 | ||
5 | - 重构整体 layout。更改代码实现方式。代码更精简 | 12 | - 重构整体 layout。更改代码实现方式。代码更精简 |
6 | - 配置项重构 | 13 | - 配置项重构 |
7 | - 移除 messageSetting 配置 | 14 | - 移除 messageSetting 配置 |
15 | +- BasicTitle 组件 `showSpan`=> `span` | ||
8 | 16 | ||
9 | ### ✨ Features | 17 | ### ✨ Features |
10 | 18 | ||
11 | - 缓存可以配置是否加密,默认生产环境开启 Aes 加密 | 19 | - 缓存可以配置是否加密,默认生产环境开启 Aes 加密 |
12 | - 新增标签页拖拽排序 | 20 | - 新增标签页拖拽排序 |
13 | -- 除示例外加入全局国际化功能,支持中文与英文 | ||
14 | 21 | ||
15 | ### 🎫 Chores | 22 | ### 🎫 Chores |
16 | 23 |
README.md
package.json
@@ -38,6 +38,7 @@ | @@ -38,6 +38,7 @@ | ||
38 | "vue": "^3.0.3", | 38 | "vue": "^3.0.3", |
39 | "vue-i18n": "^9.0.0-beta.8", | 39 | "vue-i18n": "^9.0.0-beta.8", |
40 | "vue-router": "^4.0.0-rc.5", | 40 | "vue-router": "^4.0.0-rc.5", |
41 | + "vue-types": "^3.0.1", | ||
41 | "vuex": "^4.0.0-rc.2", | 42 | "vuex": "^4.0.0-rc.2", |
42 | "vuex-module-decorators": "^1.0.1", | 43 | "vuex-module-decorators": "^1.0.1", |
43 | "xlsx": "^0.16.9", | 44 | "xlsx": "^0.16.9", |
src/components/Application/index.ts
1 | import AppLocalePicker from './src/AppLocalePicker.vue'; | 1 | import AppLocalePicker from './src/AppLocalePicker.vue'; |
2 | -import AppPageFooter from './src/AppPageFooter.vue'; | ||
3 | import AppLogo from './src/AppLogo.vue'; | 2 | import AppLogo from './src/AppLogo.vue'; |
4 | import { withInstall } from '../util'; | 3 | import { withInstall } from '../util'; |
5 | 4 | ||
6 | -export { AppLocalePicker, AppPageFooter, AppLogo }; | 5 | +export { AppLocalePicker, AppLogo }; |
7 | 6 | ||
8 | -export default withInstall(AppLocalePicker, AppPageFooter, AppLogo); | 7 | +export default withInstall(AppLocalePicker, AppLogo); |
src/components/Application/src/AppLocalePicker.vue
@@ -23,18 +23,16 @@ | @@ -23,18 +23,16 @@ | ||
23 | 23 | ||
24 | import { LocaleType } from '/@/locales/types'; | 24 | import { LocaleType } from '/@/locales/types'; |
25 | 25 | ||
26 | + import { propTypes } from '/@/utils/propTypes'; | ||
27 | + | ||
26 | export default defineComponent({ | 28 | export default defineComponent({ |
27 | name: 'AppLocalPicker', | 29 | name: 'AppLocalPicker', |
28 | components: { GlobalOutlined, Dropdown }, | 30 | components: { GlobalOutlined, Dropdown }, |
29 | props: { | 31 | props: { |
30 | - showText: { | ||
31 | - type: Boolean, | ||
32 | - default: true, | ||
33 | - }, | ||
34 | - reload: { | ||
35 | - type: Boolean, | ||
36 | - default: false, | ||
37 | - }, | 32 | + // Whether to display text |
33 | + showText: propTypes.bool.def(true), | ||
34 | + // Whether to refresh the interface when changing | ||
35 | + reload: propTypes.bool, | ||
38 | }, | 36 | }, |
39 | setup(props) { | 37 | setup(props) { |
40 | const { localeList } = useLocaleSetting(); | 38 | const { localeList } = useLocaleSetting(); |
src/components/Application/src/AppLogo.vue
@@ -9,7 +9,6 @@ | @@ -9,7 +9,6 @@ | ||
9 | </div> | 9 | </div> |
10 | </template> | 10 | </template> |
11 | <script lang="ts"> | 11 | <script lang="ts"> |
12 | - import type { PropType } from 'vue'; | ||
13 | import { defineComponent } from 'vue'; | 12 | import { defineComponent } from 'vue'; |
14 | 13 | ||
15 | import { useGlobSetting } from '/@/hooks/setting'; | 14 | import { useGlobSetting } from '/@/hooks/setting'; |
@@ -18,23 +17,23 @@ | @@ -18,23 +17,23 @@ | ||
18 | 17 | ||
19 | import { PageEnum } from '/@/enums/pageEnum'; | 18 | import { PageEnum } from '/@/enums/pageEnum'; |
20 | 19 | ||
20 | + import { propTypes } from '/@/utils/propTypes'; | ||
21 | + | ||
21 | export default defineComponent({ | 22 | export default defineComponent({ |
22 | name: 'AppLogo', | 23 | name: 'AppLogo', |
23 | props: { | 24 | props: { |
24 | /** | 25 | /** |
25 | * The theme of the current parent component | 26 | * The theme of the current parent component |
26 | */ | 27 | */ |
27 | - theme: { | ||
28 | - type: String as PropType<string>, | ||
29 | - }, | ||
30 | - showTitle: { | ||
31 | - type: Boolean, | ||
32 | - default: true, | ||
33 | - }, | 28 | + theme: propTypes.oneOf(['light', 'dark']), |
29 | + // Whether to show title | ||
30 | + showTitle: propTypes.bool.def(true), | ||
34 | }, | 31 | }, |
35 | setup() { | 32 | setup() { |
36 | const { getCollapsedShowTitle } = useMenuSetting(); | 33 | const { getCollapsedShowTitle } = useMenuSetting(); |
34 | + | ||
37 | const globSetting = useGlobSetting(); | 35 | const globSetting = useGlobSetting(); |
36 | + | ||
38 | const go = useGo(); | 37 | const go = useGo(); |
39 | 38 | ||
40 | function handleGoHome(): void { | 39 | function handleGoHome(): void { |
src/components/Basic/index.ts
1 | -export { default as BasicArrow } from './src/BasicArrow.vue'; | ||
2 | -export { default as BasicHelp } from './src/BasicHelp.vue'; | ||
3 | -export { default as BasicTitle } from './src/BasicTitle.vue'; | 1 | +import BasicArrow from './src/BasicArrow.vue'; |
2 | +import BasicHelp from './src/BasicHelp.vue'; | ||
3 | +import BasicTitle from './src/BasicTitle.vue'; | ||
4 | + | ||
5 | +import { withInstall } from '../util'; | ||
6 | + | ||
7 | +export { BasicArrow, BasicHelp, BasicTitle }; | ||
8 | + | ||
9 | +export default withInstall(BasicArrow, BasicHelp, BasicTitle); |
src/components/Basic/src/BasicArrow.vue
@@ -8,27 +8,30 @@ | @@ -8,27 +8,30 @@ | ||
8 | </span> | 8 | </span> |
9 | </template> | 9 | </template> |
10 | <script lang="ts"> | 10 | <script lang="ts"> |
11 | - import type { PropType } from 'vue'; | ||
12 | - | ||
13 | import { defineComponent, computed } from 'vue'; | 11 | import { defineComponent, computed } from 'vue'; |
14 | import { RightOutlined } from '@ant-design/icons-vue'; | 12 | import { RightOutlined } from '@ant-design/icons-vue'; |
13 | + import { propTypes } from '/@/utils/propTypes'; | ||
15 | 14 | ||
16 | export default defineComponent({ | 15 | export default defineComponent({ |
17 | name: 'BasicArrow', | 16 | name: 'BasicArrow', |
18 | components: { RightOutlined }, | 17 | components: { RightOutlined }, |
19 | props: { | 18 | props: { |
20 | // Expand contract, expand by default | 19 | // Expand contract, expand by default |
21 | - expand: { | ||
22 | - type: Boolean as PropType<boolean>, | ||
23 | - default: true, | ||
24 | - }, | 20 | + expand: propTypes.bool, |
21 | + top: propTypes.bool, | ||
22 | + bottom: propTypes.bool, | ||
25 | }, | 23 | }, |
26 | setup(props) { | 24 | setup(props) { |
27 | const getClass = computed(() => { | 25 | const getClass = computed(() => { |
28 | - const preCls = 'base-arrow'; | ||
29 | - const cls = [preCls]; | ||
30 | - props.expand && cls.push(`${preCls}__active`); | ||
31 | - return cls; | 26 | + const { expand, top, bottom } = props; |
27 | + return [ | ||
28 | + 'base-arrow', | ||
29 | + { | ||
30 | + 'base-arrow__active': expand, | ||
31 | + top, | ||
32 | + bottom, | ||
33 | + }, | ||
34 | + ]; | ||
32 | }); | 35 | }); |
33 | 36 | ||
34 | return { | 37 | return { |
@@ -39,26 +42,29 @@ | @@ -39,26 +42,29 @@ | ||
39 | </script> | 42 | </script> |
40 | <style lang="less" scoped> | 43 | <style lang="less" scoped> |
41 | .base-arrow { | 44 | .base-arrow { |
42 | - transform: rotate(-90deg); | 45 | + display: inline-block; |
46 | + transform: rotate(0deg); | ||
43 | transition: all 0.3s ease 0.1s; | 47 | transition: all 0.3s ease 0.1s; |
44 | transform-origin: center center; | 48 | transform-origin: center center; |
45 | 49 | ||
46 | - &.right { | ||
47 | - transform: rotate(0deg); | 50 | + &__active { |
51 | + transform: rotate(90deg); | ||
52 | + } | ||
53 | + | ||
54 | + &.top { | ||
55 | + transform: rotate(-90deg); | ||
56 | + } | ||
48 | 57 | ||
49 | - > span { | ||
50 | - transition: all 0.3s ease 0.1s !important; | ||
51 | - } | 58 | + &.bottom { |
59 | + transform: rotate(90deg); | ||
52 | } | 60 | } |
53 | 61 | ||
54 | - &__active { | 62 | + &.top.base-arrow__active { |
55 | transform: rotate(90deg); | 63 | transform: rotate(90deg); |
56 | } | 64 | } |
57 | 65 | ||
58 | - &.right.base-arrow__active { | ||
59 | - span { | ||
60 | - transform: rotate(90deg); | ||
61 | - } | 66 | + &.bottom.base-arrow__active { |
67 | + transform: rotate(-90deg); | ||
62 | } | 68 | } |
63 | } | 69 | } |
64 | </style> | 70 | </style> |
src/components/Basic/src/BasicHelp.vue
1 | <script lang="ts"> | 1 | <script lang="ts"> |
2 | - import type { PropType } from 'vue'; | 2 | + import type { CSSProperties, PropType } from 'vue'; |
3 | import { defineComponent, computed, unref, h } from 'vue'; | 3 | import { defineComponent, computed, unref, h } from 'vue'; |
4 | 4 | ||
5 | import { Tooltip } from 'ant-design-vue'; | 5 | import { Tooltip } from 'ant-design-vue'; |
@@ -8,37 +8,24 @@ | @@ -8,37 +8,24 @@ | ||
8 | import { getPopupContainer } from '/@/utils'; | 8 | import { getPopupContainer } from '/@/utils'; |
9 | import { isString, isArray } from '/@/utils/is'; | 9 | import { isString, isArray } from '/@/utils/is'; |
10 | import { getSlot } from '/@/utils/helper/tsxHelper'; | 10 | import { getSlot } from '/@/utils/helper/tsxHelper'; |
11 | + import { propTypes } from '/@/utils/propTypes'; | ||
11 | export default defineComponent({ | 12 | export default defineComponent({ |
12 | name: 'BasicHelp', | 13 | name: 'BasicHelp', |
13 | components: { Tooltip }, | 14 | components: { Tooltip }, |
14 | props: { | 15 | props: { |
15 | // max-width | 16 | // max-width |
16 | - maxWidth: { | ||
17 | - type: String as PropType<string>, | ||
18 | - default: '600px', | ||
19 | - }, | 17 | + maxWidth: propTypes.string.def('600px'), |
20 | // Whether to display the serial number | 18 | // Whether to display the serial number |
21 | - showIndex: { | ||
22 | - type: Boolean as PropType<boolean>, | ||
23 | - default: false, | ||
24 | - }, | 19 | + showIndex: propTypes.bool, |
20 | + // color | ||
21 | + color: propTypes.string.def('#ffffff'), | ||
22 | + fontSize: propTypes.string.def('14px'), | ||
23 | + placement: propTypes.string.def('right'), | ||
24 | + absolute: propTypes.bool, | ||
25 | // Text list | 25 | // Text list |
26 | text: { | 26 | text: { |
27 | type: [Array, String] as PropType<string[] | string>, | 27 | type: [Array, String] as PropType<string[] | string>, |
28 | }, | 28 | }, |
29 | - // color | ||
30 | - color: { | ||
31 | - type: String as PropType<string>, | ||
32 | - default: '#ffffff', | ||
33 | - }, | ||
34 | - fontSize: { | ||
35 | - type: String as PropType<string>, | ||
36 | - default: '14px', | ||
37 | - }, | ||
38 | - absolute: { | ||
39 | - type: Boolean as PropType<boolean>, | ||
40 | - default: false, | ||
41 | - }, | ||
42 | // 定位 | 29 | // 定位 |
43 | position: { | 30 | position: { |
44 | type: [Object] as PropType<any>, | 31 | type: [Object] as PropType<any>, |
@@ -48,24 +35,24 @@ | @@ -48,24 +35,24 @@ | ||
48 | bottom: 0, | 35 | bottom: 0, |
49 | }), | 36 | }), |
50 | }, | 37 | }, |
51 | - placement: { | ||
52 | - type: String as PropType<string>, | ||
53 | - defualt: 'right', | ||
54 | - }, | ||
55 | }, | 38 | }, |
56 | setup(props, { slots }) { | 39 | setup(props, { slots }) { |
57 | - const getOverlayStyleRef = computed(() => { | ||
58 | - return { | ||
59 | - maxWidth: props.maxWidth, | ||
60 | - }; | ||
61 | - }); | 40 | + const getOverlayStyleRef = computed( |
41 | + (): CSSProperties => { | ||
42 | + return { | ||
43 | + maxWidth: props.maxWidth, | ||
44 | + }; | ||
45 | + } | ||
46 | + ); | ||
62 | 47 | ||
63 | - const getWrapStyleRef = computed(() => { | ||
64 | - return { | ||
65 | - color: props.color, | ||
66 | - fontSize: props.fontSize, | ||
67 | - }; | ||
68 | - }); | 48 | + const getWrapStyleRef = computed( |
49 | + (): CSSProperties => { | ||
50 | + return { | ||
51 | + color: props.color, | ||
52 | + fontSize: props.fontSize, | ||
53 | + }; | ||
54 | + } | ||
55 | + ); | ||
69 | 56 | ||
70 | const getMainStyleRef = computed(() => { | 57 | const getMainStyleRef = computed(() => { |
71 | return props.absolute ? props.position : {}; | 58 | return props.absolute ? props.position : {}; |
@@ -73,14 +60,17 @@ | @@ -73,14 +60,17 @@ | ||
73 | 60 | ||
74 | const renderTitle = () => { | 61 | const renderTitle = () => { |
75 | const list = props.text; | 62 | const list = props.text; |
63 | + | ||
76 | if (isString(list)) { | 64 | if (isString(list)) { |
77 | return h('p', list); | 65 | return h('p', list); |
78 | } | 66 | } |
67 | + | ||
79 | if (isArray(list)) { | 68 | if (isArray(list)) { |
80 | return list.map((item, index) => { | 69 | return list.map((item, index) => { |
81 | return h('p', { key: item }, [props.showIndex ? `${index + 1}. ` : '', item]); | 70 | return h('p', { key: item }, [props.showIndex ? `${index + 1}. ` : '', item]); |
82 | }); | 71 | }); |
83 | } | 72 | } |
73 | + | ||
84 | return null; | 74 | return null; |
85 | }; | 75 | }; |
86 | 76 | ||
@@ -95,7 +85,7 @@ | @@ -95,7 +85,7 @@ | ||
95 | style: unref(getWrapStyleRef), | 85 | style: unref(getWrapStyleRef), |
96 | }, | 86 | }, |
97 | [renderTitle()] | 87 | [renderTitle()] |
98 | - ) as any, | 88 | + ), |
99 | overlayClassName: 'base-help__wrap', | 89 | overlayClassName: 'base-help__wrap', |
100 | autoAdjustOverflow: true, | 90 | autoAdjustOverflow: true, |
101 | overlayStyle: unref(getOverlayStyleRef), | 91 | overlayStyle: unref(getOverlayStyleRef), |
src/components/Basic/src/BasicTitle.vue
1 | <template> | 1 | <template> |
2 | - <span class="base-title" :class="{ 'show-span': showSpan && $slots.default }"> | 2 | + <span class="base-title" :class="{ 'show-span': span && $slots.default }"> |
3 | <slot /> | 3 | <slot /> |
4 | <BasicHelp class="base-title__help" v-if="helpMessage" :text="helpMessage" /> | 4 | <BasicHelp class="base-title__help" v-if="helpMessage" :text="helpMessage" /> |
5 | </span> | 5 | </span> |
@@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
10 | import { defineComponent } from 'vue'; | 10 | import { defineComponent } from 'vue'; |
11 | 11 | ||
12 | import BasicHelp from './BasicHelp.vue'; | 12 | import BasicHelp from './BasicHelp.vue'; |
13 | + import { propTypes } from '/@/utils/propTypes'; | ||
13 | 14 | ||
14 | export default defineComponent({ | 15 | export default defineComponent({ |
15 | name: 'BasicTitle', | 16 | name: 'BasicTitle', |
@@ -19,13 +20,7 @@ | @@ -19,13 +20,7 @@ | ||
19 | type: [String, Array] as PropType<string | string[]>, | 20 | type: [String, Array] as PropType<string | string[]>, |
20 | default: '', | 21 | default: '', |
21 | }, | 22 | }, |
22 | - showSpan: { | ||
23 | - type: Boolean as PropType<boolean>, | ||
24 | - default: false, | ||
25 | - }, | ||
26 | - }, | ||
27 | - setup() { | ||
28 | - return {}; | 23 | + span: propTypes.bool, |
29 | }, | 24 | }, |
30 | }); | 25 | }); |
31 | </script> | 26 | </script> |
src/components/Breadcrumb/index.ts
0 → 100644
src/components/Breadcrumb/Breadcrumb.vue renamed to src/components/Breadcrumb/src/Breadcrumb.vue
@@ -5,20 +5,14 @@ | @@ -5,20 +5,14 @@ | ||
5 | </template> | 5 | </template> |
6 | 6 | ||
7 | <script lang="ts"> | 7 | <script lang="ts"> |
8 | - import type { PropType } from 'vue'; | ||
9 | import { defineComponent, provide, ref } from 'vue'; | 8 | import { defineComponent, provide, ref } from 'vue'; |
9 | + import { propTypes } from '/@/utils/propTypes'; | ||
10 | 10 | ||
11 | export default defineComponent({ | 11 | export default defineComponent({ |
12 | name: 'Breadcrumb', | 12 | name: 'Breadcrumb', |
13 | props: { | 13 | props: { |
14 | - separator: { | ||
15 | - type: String as PropType<string>, | ||
16 | - default: '/', | ||
17 | - }, | ||
18 | - separatorClass: { | ||
19 | - type: String as PropType<string>, | ||
20 | - default: '', | ||
21 | - }, | 14 | + separator: propTypes.string.def('/'), |
15 | + separatorClass: propTypes.string, | ||
22 | }, | 16 | }, |
23 | setup(props) { | 17 | setup(props) { |
24 | const breadcrumbRef = ref<Nullable<HTMLElement>>(null); | 18 | const breadcrumbRef = ref<Nullable<HTMLElement>>(null); |
@@ -32,7 +26,7 @@ | @@ -32,7 +26,7 @@ | ||
32 | }); | 26 | }); |
33 | </script> | 27 | </script> |
34 | <style lang="less"> | 28 | <style lang="less"> |
35 | - @import (reference) '../../design/index.less'; | 29 | + @import (reference) '../../../design/index.less'; |
36 | 30 | ||
37 | .breadcrumb { | 31 | .breadcrumb { |
38 | .unselect(); | 32 | .unselect(); |
src/components/Breadcrumb/BreadcrumbItem.vue renamed to src/components/Breadcrumb/src/BreadcrumbItem.vue
@@ -13,21 +13,14 @@ | @@ -13,21 +13,14 @@ | ||
13 | import { useRouter } from 'vue-router'; | 13 | import { useRouter } from 'vue-router'; |
14 | import { useEventListener } from '/@/hooks/event/useEventListener'; | 14 | import { useEventListener } from '/@/hooks/event/useEventListener'; |
15 | 15 | ||
16 | + import { propTypes } from '/@/utils/propTypes'; | ||
17 | + | ||
16 | export default defineComponent({ | 18 | export default defineComponent({ |
17 | name: 'BreadcrumbItem', | 19 | name: 'BreadcrumbItem', |
18 | props: { | 20 | props: { |
19 | - to: { | ||
20 | - type: [String, Object], | ||
21 | - default: '', | ||
22 | - }, | ||
23 | - replace: { | ||
24 | - type: Boolean, | ||
25 | - default: false, | ||
26 | - }, | ||
27 | - isLink: { | ||
28 | - type: Boolean, | ||
29 | - default: false, | ||
30 | - }, | 21 | + to: propTypes.oneOfType([propTypes.string, propTypes.object]), |
22 | + replace: propTypes.bool, | ||
23 | + isLink: propTypes.bool, | ||
31 | }, | 24 | }, |
32 | setup(props) { | 25 | setup(props) { |
33 | const linkRef = ref<Nullable<HTMLElement>>(null); | 26 | const linkRef = ref<Nullable<HTMLElement>>(null); |
src/components/Button/index.ts
0 → 100644
src/components/Button/index.vue renamed to src/components/Button/src/BasicButton.vue
@@ -8,51 +8,33 @@ | @@ -8,51 +8,33 @@ | ||
8 | </Button> | 8 | </Button> |
9 | </template> | 9 | </template> |
10 | <script lang="ts"> | 10 | <script lang="ts"> |
11 | - import { PropType } from 'vue'; | ||
12 | - | ||
13 | import { defineComponent, computed } from 'vue'; | 11 | import { defineComponent, computed } from 'vue'; |
12 | + | ||
14 | import { Button } from 'ant-design-vue'; | 13 | import { Button } from 'ant-design-vue'; |
15 | import Icon from '/@/components/Icon'; | 14 | import Icon from '/@/components/Icon'; |
15 | + import { propTypes } from '/@/utils/propTypes'; | ||
16 | + | ||
16 | export default defineComponent({ | 17 | export default defineComponent({ |
17 | name: 'AButton', | 18 | name: 'AButton', |
18 | inheritAttrs: false, | 19 | inheritAttrs: false, |
19 | components: { Button, Icon }, | 20 | components: { Button, Icon }, |
20 | props: { | 21 | props: { |
21 | - type: { | ||
22 | - type: String as PropType<'primary' | 'default' | 'danger' | 'dashed' | 'link'>, | ||
23 | - default: 'default', | ||
24 | - }, | ||
25 | - color: { | ||
26 | - type: String as PropType<'error' | 'warning' | 'success' | ''>, | ||
27 | - }, | ||
28 | - loading: { | ||
29 | - type: Boolean as PropType<boolean>, | ||
30 | - default: false, | ||
31 | - }, | ||
32 | - disabled: { | ||
33 | - type: Boolean as PropType<boolean>, | ||
34 | - default: false, | ||
35 | - }, | ||
36 | - preIcon: { | ||
37 | - type: String as PropType<string>, | ||
38 | - }, | ||
39 | - postIcon: { | ||
40 | - type: String as PropType<string>, | ||
41 | - }, | 22 | + type: propTypes.oneOf(['primary', 'default', 'danger', 'dashed', 'link']).def('default'), |
23 | + color: propTypes.oneOf(['error', 'warning', 'success', '']), | ||
24 | + loading: propTypes.bool, | ||
25 | + disabled: propTypes.bool, | ||
26 | + preIcon: propTypes.string, | ||
27 | + postIcon: propTypes.string, | ||
42 | }, | 28 | }, |
43 | setup(props, { attrs }) { | 29 | setup(props, { attrs }) { |
44 | - const getIsCircleBtn = computed(() => { | ||
45 | - return attrs.shape === 'circle'; | ||
46 | - }); | 30 | + const getIsCircleBtn = computed(() => attrs.shape === 'circle'); |
47 | 31 | ||
48 | const getColor = computed(() => { | 32 | const getColor = computed(() => { |
49 | const { color, disabled } = props; | 33 | const { color, disabled } = props; |
50 | - return [ | ||
51 | - { | ||
52 | - [`ant-btn-${color}`]: !!color, | ||
53 | - [`is-disabled`]: disabled, | ||
54 | - }, | ||
55 | - ]; | 34 | + return { |
35 | + [`ant-btn-${color}`]: !!color, | ||
36 | + [`is-disabled`]: disabled, | ||
37 | + }; | ||
56 | }); | 38 | }); |
57 | 39 | ||
58 | const getBindValue = computed((): any => { | 40 | const getBindValue = computed((): any => { |
src/components/Button/types.ts deleted
100644 → 0
1 | -import { VNodeChild } from 'vue'; | ||
2 | - | ||
3 | -export interface BasicButtonProps { | ||
4 | - /** | ||
5 | - * can be set to primary ghost dashed danger(added in 2.7) or omitted (meaning default) | ||
6 | - * @default 'default' | ||
7 | - * @type string | ||
8 | - */ | ||
9 | - type?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; | ||
10 | - | ||
11 | - /** | ||
12 | - * set the original html type of button | ||
13 | - * @default 'button' | ||
14 | - * @type string | ||
15 | - */ | ||
16 | - htmlType?: 'button' | 'submit' | 'reset' | 'menu'; | ||
17 | - | ||
18 | - /** | ||
19 | - * set the icon of button | ||
20 | - * @type string | ||
21 | - */ | ||
22 | - icon?: VNodeChild | JSX.Element; | ||
23 | - | ||
24 | - /** | ||
25 | - * can be set to circle or circle-outline or omitted | ||
26 | - * @type string | ||
27 | - */ | ||
28 | - shape?: 'circle' | 'circle-outline'; | ||
29 | - | ||
30 | - /** | ||
31 | - * can be set to small large or omitted | ||
32 | - * @default 'default' | ||
33 | - * @type string | ||
34 | - */ | ||
35 | - size?: 'small' | 'large' | 'default'; | ||
36 | - | ||
37 | - /** | ||
38 | - * set the loading status of button | ||
39 | - * @default false | ||
40 | - * @type boolean | { delay: number } | ||
41 | - */ | ||
42 | - loading?: boolean | { delay: number }; | ||
43 | - | ||
44 | - /** | ||
45 | - * disabled state of button | ||
46 | - * @default false | ||
47 | - * @type boolean | ||
48 | - */ | ||
49 | - disabled?: boolean; | ||
50 | - | ||
51 | - /** | ||
52 | - * make background transparent and invert text and border colors, added in 2.7 | ||
53 | - * @default false | ||
54 | - * @type boolean | ||
55 | - */ | ||
56 | - ghost?: boolean; | ||
57 | - | ||
58 | - /** | ||
59 | - * option to fit button width to its parent width | ||
60 | - * @default false | ||
61 | - * @type boolean | ||
62 | - */ | ||
63 | - block?: boolean; | ||
64 | - | ||
65 | - onClick?: (e?: Event) => void; | ||
66 | -} |
src/components/ClickOutSide/index.ts
0 → 100644
src/components/ClickOutSide/index.vue renamed to src/components/ClickOutSide/src/index.vue
@@ -9,9 +9,8 @@ | @@ -9,9 +9,8 @@ | ||
9 | 9 | ||
10 | export default defineComponent({ | 10 | export default defineComponent({ |
11 | name: 'ClickOutSide', | 11 | name: 'ClickOutSide', |
12 | - | ||
13 | setup(_, { emit }) { | 12 | setup(_, { emit }) { |
14 | - const wrapRef = ref<Nullable<HTMLDivElement | null>>(null); | 13 | + const wrapRef = ref<ElRef>(null); |
15 | 14 | ||
16 | useClickOutside(wrapRef as Ref<HTMLDivElement>, () => { | 15 | useClickOutside(wrapRef as Ref<HTMLDivElement>, () => { |
17 | emit('clickOutside'); | 16 | emit('clickOutside'); |
src/components/Container/index.ts
1 | -export { default as ScrollContainer } from './src/ScrollContainer.vue'; | ||
2 | -export { default as CollapseContainer } from './src/collapse/CollapseContainer.vue'; | ||
3 | -export { default as LazyContainer } from './src/LazyContainer.vue'; | 1 | +import ScrollContainer from './src/ScrollContainer.vue'; |
2 | +import CollapseContainer from './src/collapse/CollapseContainer.vue'; | ||
3 | +import LazyContainer from './src/LazyContainer.vue'; | ||
4 | +import { withInstall } from '../util'; | ||
4 | 5 | ||
5 | -export * from './src/types.d'; | 6 | +export * from './src/types'; |
7 | + | ||
8 | +export { ScrollContainer, CollapseContainer, LazyContainer }; | ||
9 | + | ||
10 | +export default withInstall(ScrollContainer, CollapseContainer, LazyContainer); |
src/components/Container/src/LazyContainer.vue
@@ -24,19 +24,20 @@ | @@ -24,19 +24,20 @@ | ||
24 | import { Skeleton } from 'ant-design-vue'; | 24 | import { Skeleton } from 'ant-design-vue'; |
25 | import { useTimeoutFn } from '/@/hooks/core/useTimeout'; | 25 | import { useTimeoutFn } from '/@/hooks/core/useTimeout'; |
26 | import { useIntersectionObserver } from '/@/hooks/event/useIntersectionObserver'; | 26 | import { useIntersectionObserver } from '/@/hooks/event/useIntersectionObserver'; |
27 | + import { propTypes } from '/@/utils/propTypes'; | ||
28 | + | ||
27 | interface State { | 29 | interface State { |
28 | isInit: boolean; | 30 | isInit: boolean; |
29 | loading: boolean; | 31 | loading: boolean; |
30 | intersectionObserverInstance: IntersectionObserver | null; | 32 | intersectionObserverInstance: IntersectionObserver | null; |
31 | } | 33 | } |
34 | + | ||
32 | export default defineComponent({ | 35 | export default defineComponent({ |
33 | name: 'LazyContainer', | 36 | name: 'LazyContainer', |
34 | components: { Skeleton }, | 37 | components: { Skeleton }, |
35 | props: { | 38 | props: { |
36 | // Waiting time, if the time is specified, whether visible or not, it will be automatically loaded after the specified time | 39 | // Waiting time, if the time is specified, whether visible or not, it will be automatically loaded after the specified time |
37 | - timeout: { | ||
38 | - type: Number as PropType<number>, | ||
39 | - }, | 40 | + timeout: propTypes.number, |
40 | 41 | ||
41 | // The viewport where the component is located. If the component is scrolling in the page container, the viewport is the container | 42 | // The viewport where the component is located. If the component is scrolling in the page container, the viewport is the container |
42 | viewport: { | 43 | viewport: { |
@@ -47,33 +48,18 @@ | @@ -47,33 +48,18 @@ | ||
47 | }, | 48 | }, |
48 | 49 | ||
49 | // Preload threshold, css unit | 50 | // Preload threshold, css unit |
50 | - threshold: { | ||
51 | - type: String as PropType<string>, | ||
52 | - default: '0px', | ||
53 | - }, | 51 | + threshold: propTypes.string.def('0px'), |
54 | 52 | ||
55 | // The scroll direction of the viewport, vertical represents the vertical direction, horizontal represents the horizontal direction | 53 | // The scroll direction of the viewport, vertical represents the vertical direction, horizontal represents the horizontal direction |
56 | - direction: { | ||
57 | - type: String as PropType<'vertical' | 'horizontal'>, | ||
58 | - default: 'vertical', | ||
59 | - }, | 54 | + direction: propTypes.oneOf(['vertical', 'horizontal']).def('vertical'), |
60 | 55 | ||
61 | // The label name of the outer container that wraps the component | 56 | // The label name of the outer container that wraps the component |
62 | - tag: { | ||
63 | - type: String as PropType<string>, | ||
64 | - default: 'div', | ||
65 | - }, | 57 | + tag: propTypes.string.def('div'), |
66 | 58 | ||
67 | - maxWaitingTime: { | ||
68 | - type: Number as PropType<number>, | ||
69 | - default: 80, | ||
70 | - }, | 59 | + maxWaitingTime: propTypes.number.def(80), |
71 | 60 | ||
72 | // transition name | 61 | // transition name |
73 | - transitionName: { | ||
74 | - type: String as PropType<string>, | ||
75 | - default: 'lazy-container', | ||
76 | - }, | 62 | + transitionName: propTypes.string.def('lazy-container'), |
77 | }, | 63 | }, |
78 | emits: ['init'], | 64 | emits: ['init'], |
79 | setup(props, { emit }) { | 65 | setup(props, { emit }) { |
src/components/Container/src/ScrollContainer.vue
@@ -10,11 +10,9 @@ | @@ -10,11 +10,9 @@ | ||
10 | </template> | 10 | </template> |
11 | 11 | ||
12 | <script lang="ts"> | 12 | <script lang="ts"> |
13 | - // component | ||
14 | import { defineComponent, ref, unref, nextTick } from 'vue'; | 13 | import { defineComponent, ref, unref, nextTick } from 'vue'; |
15 | import { Scrollbar } from '/@/components/Scrollbar'; | 14 | import { Scrollbar } from '/@/components/Scrollbar'; |
16 | 15 | ||
17 | - // hook | ||
18 | import { useScrollTo } from '/@/hooks/event/useScrollTo'; | 16 | import { useScrollTo } from '/@/hooks/event/useScrollTo'; |
19 | 17 | ||
20 | export default defineComponent({ | 18 | export default defineComponent({ |
@@ -26,6 +24,7 @@ | @@ -26,6 +24,7 @@ | ||
26 | function scrollTo(to: number, duration = 500) { | 24 | function scrollTo(to: number, duration = 500) { |
27 | const scrollbar = unref(scrollbarRef); | 25 | const scrollbar = unref(scrollbarRef); |
28 | if (!scrollbar) return; | 26 | if (!scrollbar) return; |
27 | + | ||
29 | nextTick(() => { | 28 | nextTick(() => { |
30 | const { start } = useScrollTo({ | 29 | const { start } = useScrollTo({ |
31 | el: unref(scrollbar.$.wrap), | 30 | el: unref(scrollbar.$.wrap), |
@@ -45,6 +44,7 @@ | @@ -45,6 +44,7 @@ | ||
45 | function scrollBottom() { | 44 | function scrollBottom() { |
46 | const scrollbar = unref(scrollbarRef); | 45 | const scrollbar = unref(scrollbarRef); |
47 | if (!scrollbar) return; | 46 | if (!scrollbar) return; |
47 | + | ||
48 | nextTick(() => { | 48 | nextTick(() => { |
49 | const scrollHeight = scrollbar.$.wrap.scrollHeight as number; | 49 | const scrollHeight = scrollbar.$.wrap.scrollHeight as number; |
50 | const { start } = useScrollTo({ | 50 | const { start } = useScrollTo({ |
@@ -54,6 +54,7 @@ | @@ -54,6 +54,7 @@ | ||
54 | start(); | 54 | start(); |
55 | }); | 55 | }); |
56 | } | 56 | } |
57 | + | ||
57 | return { | 58 | return { |
58 | scrollbarRef, | 59 | scrollbarRef, |
59 | scrollTo, | 60 | scrollTo, |
src/components/Container/src/collapse/CollapseContainer.vue
@@ -5,6 +5,7 @@ | @@ -5,6 +5,7 @@ | ||
5 | <slot name="title" /> | 5 | <slot name="title" /> |
6 | </template> | 6 | </template> |
7 | </CollapseHeader> | 7 | </CollapseHeader> |
8 | + | ||
8 | <CollapseTransition :enable="canExpan"> | 9 | <CollapseTransition :enable="canExpan"> |
9 | <Skeleton v-if="loading" /> | 10 | <Skeleton v-if="loading" /> |
10 | <div class="collapse-container__body" v-else v-show="show"> | 11 | <div class="collapse-container__body" v-else v-show="show"> |
@@ -22,36 +23,31 @@ | @@ -22,36 +23,31 @@ | ||
22 | <script lang="ts"> | 23 | <script lang="ts"> |
23 | import type { PropType } from 'vue'; | 24 | import type { PropType } from 'vue'; |
24 | 25 | ||
25 | - import { defineComponent, ref, unref } from 'vue'; | 26 | + import { defineComponent, ref } from 'vue'; |
27 | + | ||
26 | // component | 28 | // component |
29 | + import { Skeleton } from 'ant-design-vue'; | ||
27 | import { CollapseTransition } from '/@/components/Transition/index'; | 30 | import { CollapseTransition } from '/@/components/Transition/index'; |
28 | import CollapseHeader from './CollapseHeader.vue'; | 31 | import CollapseHeader from './CollapseHeader.vue'; |
29 | - import { Skeleton } from 'ant-design-vue'; | ||
30 | - | ||
31 | import LazyContainer from '../LazyContainer.vue'; | 32 | import LazyContainer from '../LazyContainer.vue'; |
32 | 33 | ||
33 | import { triggerWindowResize } from '/@/utils/event/triggerWindowResizeEvent'; | 34 | import { triggerWindowResize } from '/@/utils/event/triggerWindowResizeEvent'; |
34 | // hook | 35 | // hook |
35 | import { useTimeoutFn } from '/@/hooks/core/useTimeout'; | 36 | import { useTimeoutFn } from '/@/hooks/core/useTimeout'; |
37 | + import { propTypes } from '/@/utils/propTypes'; | ||
36 | 38 | ||
37 | export default defineComponent({ | 39 | export default defineComponent({ |
40 | + name: 'CollapseContainer', | ||
38 | components: { | 41 | components: { |
39 | Skeleton, | 42 | Skeleton, |
40 | LazyContainer, | 43 | LazyContainer, |
41 | CollapseHeader, | 44 | CollapseHeader, |
42 | CollapseTransition, | 45 | CollapseTransition, |
43 | }, | 46 | }, |
44 | - name: 'CollapseContainer', | ||
45 | props: { | 47 | props: { |
46 | - title: { | ||
47 | - type: String as PropType<string>, | ||
48 | - default: '', | ||
49 | - }, | 48 | + title: propTypes.string.def(''), |
50 | // Can it be expanded | 49 | // Can it be expanded |
51 | - canExpan: { | ||
52 | - type: Boolean as PropType<boolean>, | ||
53 | - default: true, | ||
54 | - }, | 50 | + canExpan: propTypes.bool.def(true), |
55 | // Warm reminder on the right side of the title | 51 | // Warm reminder on the right side of the title |
56 | helpMessage: { | 52 | helpMessage: { |
57 | type: [Array, String] as PropType<string[] | string>, | 53 | type: [Array, String] as PropType<string[] | string>, |
@@ -59,41 +55,27 @@ | @@ -59,41 +55,27 @@ | ||
59 | }, | 55 | }, |
60 | // Whether to trigger window.resize when expanding and contracting, | 56 | // Whether to trigger window.resize when expanding and contracting, |
61 | // Can adapt to tables and forms, when the form shrinks, the form triggers resize to adapt to the height | 57 | // Can adapt to tables and forms, when the form shrinks, the form triggers resize to adapt to the height |
62 | - triggerWindowResize: { | ||
63 | - type: Boolean as PropType<boolean>, | ||
64 | - default: false, | ||
65 | - }, | ||
66 | - loading: { | ||
67 | - type: Boolean as PropType<boolean>, | ||
68 | - default: false, | ||
69 | - }, | 58 | + triggerWindowResize: propTypes.bool, |
59 | + loading: propTypes.bool, | ||
70 | // Delayed loading | 60 | // Delayed loading |
71 | - lazy: { | ||
72 | - type: Boolean as PropType<boolean>, | ||
73 | - default: false, | ||
74 | - }, | 61 | + lazy: propTypes.bool, |
75 | // Delayed loading time | 62 | // Delayed loading time |
76 | - lazyTime: { | ||
77 | - type: Number as PropType<number>, | ||
78 | - default: 0, | ||
79 | - }, | 63 | + lazyTime: propTypes.number.def(0), |
80 | }, | 64 | }, |
81 | setup(props) { | 65 | setup(props) { |
82 | - const showRef = ref(true); | 66 | + const show = ref(true); |
83 | /** | 67 | /** |
84 | * @description: Handling development events | 68 | * @description: Handling development events |
85 | */ | 69 | */ |
86 | function handleExpand() { | 70 | function handleExpand() { |
87 | - const hasShow = !unref(showRef); | ||
88 | - showRef.value = hasShow; | ||
89 | - | 71 | + show.value = !show.value; |
90 | if (props.triggerWindowResize) { | 72 | if (props.triggerWindowResize) { |
91 | // 200 milliseconds here is because the expansion has animation, | 73 | // 200 milliseconds here is because the expansion has animation, |
92 | useTimeoutFn(triggerWindowResize, 200); | 74 | useTimeoutFn(triggerWindowResize, 200); |
93 | } | 75 | } |
94 | } | 76 | } |
95 | return { | 77 | return { |
96 | - show: showRef, | 78 | + show, |
97 | handleExpand, | 79 | handleExpand, |
98 | }; | 80 | }; |
99 | }, | 81 | }, |
src/components/Container/src/collapse/CollapseHeader.vue
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | 11 | ||
12 | <div class="collapse-container__action"> | 12 | <div class="collapse-container__action"> |
13 | <slot name="action" /> | 13 | <slot name="action" /> |
14 | - <BasicArrow v-if="$attrs.canExpan" :expand="$attrs.show" @click="$emit('expand')" /> | 14 | + <BasicArrow v-if="$attrs.canExpan" top :expand="$attrs.show" @click="$emit('expand')" /> |
15 | </div> | 15 | </div> |
16 | </div> | 16 | </div> |
17 | </template> | 17 | </template> |
src/components/Container/src/types.d.ts renamed to src/components/Container/src/types.ts
src/components/ContextMenu/index.ts
src/components/ContextMenu/src/props.ts
1 | -import type { PropType, CSSProperties } from 'vue'; | 1 | +import type { PropType } from 'vue'; |
2 | import type { Axis, ContextMenuItem } from './types'; | 2 | import type { Axis, ContextMenuItem } from './types'; |
3 | +import { propTypes } from '/@/utils/propTypes'; | ||
3 | export const props = { | 4 | export const props = { |
4 | - width: { | ||
5 | - type: Number as PropType<number>, | ||
6 | - default: 156, | ||
7 | - }, | 5 | + width: propTypes.number.def(156), |
8 | customEvent: { | 6 | customEvent: { |
9 | type: Object as PropType<Event>, | 7 | type: Object as PropType<Event>, |
10 | default: null, | 8 | default: null, |
11 | }, | 9 | }, |
12 | - styles: { | ||
13 | - type: Object as PropType<CSSProperties>, | ||
14 | - default: null, | ||
15 | - }, | ||
16 | - showIcon: { | ||
17 | - type: Boolean as PropType<boolean>, | ||
18 | - default: true, | ||
19 | - }, | 10 | + styles: propTypes.style, |
11 | + showIcon: propTypes.bool.def(true), | ||
20 | axis: { | 12 | axis: { |
21 | // The position of the right mouse button click | 13 | // The position of the right mouse button click |
22 | type: Object as PropType<Axis>, | 14 | type: Object as PropType<Axis>, |
src/components/ContextMenu/src/types.ts
@@ -29,7 +29,7 @@ export interface ContextMenuProps { | @@ -29,7 +29,7 @@ export interface ContextMenuProps { | ||
29 | } | 29 | } |
30 | 30 | ||
31 | export interface ItemContentProps { | 31 | export interface ItemContentProps { |
32 | - showIcon: boolean; | 32 | + showIcon: boolean | undefined; |
33 | item: ContextMenuItem; | 33 | item: ContextMenuItem; |
34 | handler: Fn; | 34 | handler: Fn; |
35 | } | 35 | } |
src/components/CountTo/index.ts
1 | // Transform vue-count-to to support vue3 version | 1 | // Transform vue-count-to to support vue3 version |
2 | -export { default as CountTo } from './src/index.vue'; | 2 | + |
3 | +import CountTo from './src/index.vue'; | ||
4 | +import { withInstall } from '../util'; | ||
5 | + | ||
6 | +export { CountTo }; | ||
7 | + | ||
8 | +export default withInstall(CountTo); |
src/components/CountTo/src/props.ts
1 | import { PropType } from 'vue'; | 1 | import { PropType } from 'vue'; |
2 | +import { propTypes } from '/@/utils/propTypes'; | ||
2 | export const countToProps = { | 3 | export const countToProps = { |
3 | - startVal: { | ||
4 | - type: Number as PropType<number>, | ||
5 | - required: false, | ||
6 | - default: 0, | ||
7 | - }, | ||
8 | - endVal: { | ||
9 | - type: Number as PropType<number>, | ||
10 | - required: false, | ||
11 | - default: 2017, | ||
12 | - }, | ||
13 | - duration: { | ||
14 | - type: Number as PropType<number>, | ||
15 | - required: false, | ||
16 | - default: 3000, | ||
17 | - }, | ||
18 | - autoplay: { | ||
19 | - type: Boolean as PropType<boolean>, | ||
20 | - required: false, | ||
21 | - default: true, | ||
22 | - }, | 4 | + startVal: propTypes.number.def(0), |
5 | + endVal: propTypes.number.def(2020), | ||
6 | + duration: propTypes.number.def(1300), | ||
7 | + autoplay: propTypes.bool.def(true), | ||
23 | decimals: { | 8 | decimals: { |
24 | type: Number as PropType<number>, | 9 | type: Number as PropType<number>, |
25 | required: false, | 10 | required: false, |
@@ -28,31 +13,11 @@ export const countToProps = { | @@ -28,31 +13,11 @@ export const countToProps = { | ||
28 | return value >= 0; | 13 | return value >= 0; |
29 | }, | 14 | }, |
30 | }, | 15 | }, |
31 | - decimal: { | ||
32 | - type: String as PropType<string>, | ||
33 | - required: false, | ||
34 | - default: '.', | ||
35 | - }, | ||
36 | - separator: { | ||
37 | - type: String as PropType<string>, | ||
38 | - required: false, | ||
39 | - default: ',', | ||
40 | - }, | ||
41 | - prefix: { | ||
42 | - type: String as PropType<string>, | ||
43 | - required: false, | ||
44 | - default: '', | ||
45 | - }, | ||
46 | - suffix: { | ||
47 | - type: String as PropType<string>, | ||
48 | - required: false, | ||
49 | - default: '', | ||
50 | - }, | ||
51 | - useEasing: { | ||
52 | - type: Boolean as PropType<boolean>, | ||
53 | - required: false, | ||
54 | - default: true, | ||
55 | - }, | 16 | + decimal: propTypes.string.def('.'), |
17 | + separator: propTypes.string.def(','), | ||
18 | + prefix: propTypes.string.def(''), | ||
19 | + suffix: propTypes.string.def(''), | ||
20 | + useEasing: propTypes.bool.def(true), | ||
56 | easingFn: { | 21 | easingFn: { |
57 | type: Function as PropType<(t: number, b: number, c: number, d: number) => number>, | 22 | type: Function as PropType<(t: number, b: number, c: number, d: number) => number>, |
58 | default(t: number, b: number, c: number, d: number) { | 23 | default(t: number, b: number, c: number, d: number) { |
src/components/Description/src/index.tsx
1 | -import { defineComponent, computed, ref, unref } from 'vue'; | 1 | +import type { DescOptions, DescInstance, DescItem } from './types'; |
2 | + | ||
3 | +import { defineComponent, computed, ref, unref, CSSProperties } from 'vue'; | ||
2 | import { Descriptions } from 'ant-design-vue'; | 4 | import { Descriptions } from 'ant-design-vue'; |
3 | import { CollapseContainer, CollapseContainerOptions } from '/@/components/Container/index'; | 5 | import { CollapseContainer, CollapseContainerOptions } from '/@/components/Container/index'; |
4 | -import type { DescOptions, DescInstance, DescItem } from './types'; | ||
5 | import descProps from './props'; | 6 | import descProps from './props'; |
6 | 7 | ||
7 | import { isFunction } from '/@/utils/is'; | 8 | import { isFunction } from '/@/utils/is'; |
@@ -11,6 +12,7 @@ import { deepMerge } from '/@/utils'; | @@ -11,6 +12,7 @@ import { deepMerge } from '/@/utils'; | ||
11 | 12 | ||
12 | const prefixCls = 'description'; | 13 | const prefixCls = 'description'; |
13 | export default defineComponent({ | 14 | export default defineComponent({ |
15 | + name: 'Description', | ||
14 | props: descProps, | 16 | props: descProps, |
15 | emits: ['register'], | 17 | emits: ['register'], |
16 | setup(props, { attrs, slots, emit }) { | 18 | setup(props, { attrs, slots, emit }) { |
@@ -72,17 +74,13 @@ export default defineComponent({ | @@ -72,17 +74,13 @@ export default defineComponent({ | ||
72 | if (!labelStyle && !labelMinWidth) { | 74 | if (!labelStyle && !labelMinWidth) { |
73 | return label; | 75 | return label; |
74 | } | 76 | } |
75 | - return ( | ||
76 | - <div | ||
77 | - style={{ | ||
78 | - ...labelStyle, | ||
79 | 77 | ||
80 | - minWidth: `${labelMinWidth}px`, | ||
81 | - }} | ||
82 | - > | ||
83 | - {label} | ||
84 | - </div> | ||
85 | - ); | 78 | + const labelStyles: CSSProperties = { |
79 | + ...labelStyle, | ||
80 | + | ||
81 | + minWidth: `${labelMinWidth}px `, | ||
82 | + }; | ||
83 | + return <div style={labelStyles}>{label}</div>; | ||
86 | } | 84 | } |
87 | 85 | ||
88 | function renderItem() { | 86 | function renderItem() { |
@@ -90,9 +88,11 @@ export default defineComponent({ | @@ -90,9 +88,11 @@ export default defineComponent({ | ||
90 | return unref(schema).map((item) => { | 88 | return unref(schema).map((item) => { |
91 | const { render, field, span, show, contentMinWidth } = item; | 89 | const { render, field, span, show, contentMinWidth } = item; |
92 | const { data } = unref(getProps) as any; | 90 | const { data } = unref(getProps) as any; |
91 | + | ||
93 | if (show && isFunction(show) && !show(data)) { | 92 | if (show && isFunction(show) && !show(data)) { |
94 | return null; | 93 | return null; |
95 | } | 94 | } |
95 | + | ||
96 | const getContent = () => | 96 | const getContent = () => |
97 | isFunction(render) | 97 | isFunction(render) |
98 | ? render(data && data[field], data) | 98 | ? render(data && data[field], data) |
@@ -130,12 +130,9 @@ export default defineComponent({ | @@ -130,12 +130,9 @@ export default defineComponent({ | ||
130 | const renderContainer = () => { | 130 | const renderContainer = () => { |
131 | const content = props.useCollapse ? renderDesc() : <div>{renderDesc()}</div>; | 131 | const content = props.useCollapse ? renderDesc() : <div>{renderDesc()}</div>; |
132 | // Reduce the dom level | 132 | // Reduce the dom level |
133 | + const { title, canExpand, helpMessage } = unref(getCollapseOptions); | ||
133 | return props.useCollapse ? ( | 134 | return props.useCollapse ? ( |
134 | - <CollapseContainer | ||
135 | - title={unref(getMergeProps).title} | ||
136 | - canExpan={unref(getCollapseOptions).canExpand} | ||
137 | - helpMessage={unref(getCollapseOptions).helpMessage} | ||
138 | - > | 135 | + <CollapseContainer title={title} canExpan={canExpand} helpMessage={helpMessage}> |
139 | {{ | 136 | {{ |
140 | default: () => content, | 137 | default: () => content, |
141 | action: () => getSlot(slots, 'action'), | 138 | action: () => getSlot(slots, 'action'), |
src/components/Description/src/props.ts
1 | import type { PropType } from 'vue'; | 1 | import type { PropType } from 'vue'; |
2 | +import type { CollapseContainerOptions } from '/@/components/Container'; | ||
2 | import type { DescItem } from './types'; | 3 | import type { DescItem } from './types'; |
3 | 4 | ||
5 | +import { propTypes } from '/@/utils/propTypes'; | ||
4 | export default { | 6 | export default { |
5 | - useCollapse: { | ||
6 | - type: Boolean as PropType<boolean>, | ||
7 | - default: true, | ||
8 | - }, | ||
9 | - title: { | ||
10 | - type: String as PropType<string>, | ||
11 | - default: '', | ||
12 | - }, | ||
13 | - size: { | ||
14 | - type: String as PropType<'small' | 'default' | 'middle' | undefined>, | ||
15 | - default: 'small', | ||
16 | - }, | ||
17 | - bordered: { | ||
18 | - type: Boolean as PropType<boolean>, | ||
19 | - default: true, | ||
20 | - }, | 7 | + useCollapse: propTypes.bool.def(true), |
8 | + title: propTypes.string.def(''), | ||
9 | + size: propTypes.oneOf(['small', 'default', 'middle', undefined]).def('small'), | ||
10 | + bordered: propTypes.bool.def(true), | ||
21 | column: { | 11 | column: { |
22 | type: [Number, Object] as PropType<number | any>, | 12 | type: [Number, Object] as PropType<number | any>, |
23 | default: () => { | 13 | default: () => { |
@@ -25,15 +15,12 @@ export default { | @@ -25,15 +15,12 @@ export default { | ||
25 | }, | 15 | }, |
26 | }, | 16 | }, |
27 | collapseOptions: { | 17 | collapseOptions: { |
28 | - type: Object as PropType<any>, | 18 | + type: Object as PropType<CollapseContainerOptions>, |
29 | default: null, | 19 | default: null, |
30 | }, | 20 | }, |
31 | schema: { | 21 | schema: { |
32 | type: Array as PropType<Array<DescItem>>, | 22 | type: Array as PropType<Array<DescItem>>, |
33 | default: () => [], | 23 | default: () => [], |
34 | }, | 24 | }, |
35 | - data: { | ||
36 | - type: Object as PropType<any>, | ||
37 | - default: null, | ||
38 | - }, | 25 | + data: propTypes.object, |
39 | }; | 26 | }; |
src/components/Description/src/types.ts
@@ -88,6 +88,7 @@ export interface DescInstance { | @@ -88,6 +88,7 @@ export interface DescInstance { | ||
88 | } | 88 | } |
89 | 89 | ||
90 | export type Register = (descInstance: DescInstance) => void; | 90 | export type Register = (descInstance: DescInstance) => void; |
91 | + | ||
91 | /** | 92 | /** |
92 | * @description: | 93 | * @description: |
93 | */ | 94 | */ |
src/components/Description/src/useDescription.ts
@@ -7,13 +7,11 @@ export function useDescription(props?: Partial<DescOptions>): UseDescReturnType | @@ -7,13 +7,11 @@ export function useDescription(props?: Partial<DescOptions>): UseDescReturnType | ||
7 | if (!getCurrentInstance()) { | 7 | if (!getCurrentInstance()) { |
8 | throw new Error('Please put useDescription function in the setup function!'); | 8 | throw new Error('Please put useDescription function in the setup function!'); |
9 | } | 9 | } |
10 | - const descRef = ref<DescInstance | null>(null); | 10 | + const descRef = ref<Nullable<DescInstance>>(null); |
11 | const loadedRef = ref(false); | 11 | const loadedRef = ref(false); |
12 | 12 | ||
13 | function register(instance: DescInstance) { | 13 | function register(instance: DescInstance) { |
14 | - if (unref(loadedRef) && isProdMode()) { | ||
15 | - return; | ||
16 | - } | 14 | + if (unref(loadedRef) && isProdMode()) return; |
17 | descRef.value = instance; | 15 | descRef.value = instance; |
18 | props && instance.setDescProps(props); | 16 | props && instance.setDescProps(props); |
19 | loadedRef.value = true; | 17 | loadedRef.value = true; |
@@ -24,5 +22,6 @@ export function useDescription(props?: Partial<DescOptions>): UseDescReturnType | @@ -24,5 +22,6 @@ export function useDescription(props?: Partial<DescOptions>): UseDescReturnType | ||
24 | unref(descRef)!.setDescProps(descProps); | 22 | unref(descRef)!.setDescProps(descProps); |
25 | }, | 23 | }, |
26 | }; | 24 | }; |
25 | + | ||
27 | return [register, methods]; | 26 | return [register, methods]; |
28 | } | 27 | } |
src/components/Dropdown/index.ts
src/components/Dropdown/src/Dropdown.tsx
@@ -2,7 +2,6 @@ import type { Trigger } from './types'; | @@ -2,7 +2,6 @@ import type { Trigger } from './types'; | ||
2 | 2 | ||
3 | import { defineComponent, computed, unref } from 'vue'; | 3 | import { defineComponent, computed, unref } from 'vue'; |
4 | import { Dropdown, Menu } from 'ant-design-vue'; | 4 | import { Dropdown, Menu } from 'ant-design-vue'; |
5 | - | ||
6 | import Icon from '/@/components/Icon/index'; | 5 | import Icon from '/@/components/Icon/index'; |
7 | 6 | ||
8 | import { basicDropdownProps } from './props'; | 7 | import { basicDropdownProps } from './props'; |
src/components/Excel/index.ts
1 | -export { default as ImportExcel } from './src/ImportExcel.vue'; | ||
2 | -export { default as ExportExcelModel } from './src/ExportExcelModel.vue'; | 1 | +import ImportExcel from './src/ImportExcel.vue'; |
2 | +import ExportExcelModel from './src/ExportExcelModel.vue'; | ||
3 | 3 | ||
4 | -export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel'; | 4 | +import { withInstall } from '../util'; |
5 | 5 | ||
6 | export * from './src/types'; | 6 | export * from './src/types'; |
7 | + | ||
8 | +export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel'; | ||
9 | + | ||
10 | +export { ImportExcel, ExportExcelModel }; | ||
11 | + | ||
12 | +export default withInstall(ImportExcel, ExportExcelModel); |
src/components/Excel/src/Export2Excel.ts
1 | import xlsx from 'xlsx'; | 1 | import xlsx from 'xlsx'; |
2 | import type { WorkBook } from 'xlsx'; | 2 | import type { WorkBook } from 'xlsx'; |
3 | import type { JsonToSheet, AoAToSheet } from './types'; | 3 | import type { JsonToSheet, AoAToSheet } from './types'; |
4 | -// import { isObject } from '@/src/utils/is'; | ||
5 | 4 | ||
6 | const { utils, writeFile } = xlsx; | 5 | const { utils, writeFile } = xlsx; |
7 | 6 | ||
7 | +const DEF_FILE_NAME = 'excel-list.xlsx'; | ||
8 | export function jsonToSheetXlsx<T = any>({ | 8 | export function jsonToSheetXlsx<T = any>({ |
9 | data, | 9 | data, |
10 | header, | 10 | header, |
11 | - filename = 'excel-list.xlsx', | 11 | + filename = DEF_FILE_NAME, |
12 | json2sheetOpts = {}, | 12 | json2sheetOpts = {}, |
13 | write2excelOpts = { bookType: 'xlsx' }, | 13 | write2excelOpts = { bookType: 'xlsx' }, |
14 | }: JsonToSheet<T>) { | 14 | }: JsonToSheet<T>) { |
@@ -34,7 +34,7 @@ export function jsonToSheetXlsx<T = any>({ | @@ -34,7 +34,7 @@ export function jsonToSheetXlsx<T = any>({ | ||
34 | export function aoaToSheetXlsx<T = any>({ | 34 | export function aoaToSheetXlsx<T = any>({ |
35 | data, | 35 | data, |
36 | header, | 36 | header, |
37 | - filename = 'excel-list.xlsx', | 37 | + filename = DEF_FILE_NAME, |
38 | write2excelOpts = { bookType: 'xlsx' }, | 38 | write2excelOpts = { bookType: 'xlsx' }, |
39 | }: AoAToSheet<T>) { | 39 | }: AoAToSheet<T>) { |
40 | const arrData = [...data]; | 40 | const arrData = [...data]; |
src/components/Excel/src/ExportExcelModel.vue
@@ -72,7 +72,6 @@ | @@ -72,7 +72,6 @@ | ||
72 | async function handleOk() { | 72 | async function handleOk() { |
73 | const res = (await validateFields()) as ExportModalResult; | 73 | const res = (await validateFields()) as ExportModalResult; |
74 | const { filename, bookType } = res; | 74 | const { filename, bookType } = res; |
75 | - | ||
76 | emit('success', { | 75 | emit('success', { |
77 | filename: `${filename.split('.').shift()}.${bookType}`, | 76 | filename: `${filename.split('.').shift()}.${bookType}`, |
78 | bookType, | 77 | bookType, |
src/components/Form/src/FormAction.tsx
@@ -2,7 +2,7 @@ import type { ColEx } from './types/index'; | @@ -2,7 +2,7 @@ import type { ColEx } from './types/index'; | ||
2 | 2 | ||
3 | import { defineComponent, unref, computed, PropType } from 'vue'; | 3 | import { defineComponent, unref, computed, PropType } from 'vue'; |
4 | import { Form, Col } from 'ant-design-vue'; | 4 | import { Form, Col } from 'ant-design-vue'; |
5 | -import Button from '/@/components/Button/index.vue'; | 5 | +import { Button } from '/@/components/Button'; |
6 | import { BasicArrow } from '/@/components/Basic/index'; | 6 | import { BasicArrow } from '/@/components/Basic/index'; |
7 | 7 | ||
8 | import { getSlot } from '/@/utils/helper/tsxHelper'; | 8 | import { getSlot } from '/@/utils/helper/tsxHelper'; |
@@ -12,7 +12,6 @@ const { t } = useI18n('component.form'); | @@ -12,7 +12,6 @@ const { t } = useI18n('component.form'); | ||
12 | 12 | ||
13 | export default defineComponent({ | 13 | export default defineComponent({ |
14 | name: 'BasicFormAction', | 14 | name: 'BasicFormAction', |
15 | - emits: ['toggle-advanced'], | ||
16 | props: { | 15 | props: { |
17 | show: { | 16 | show: { |
18 | type: Boolean, | 17 | type: Boolean, |
@@ -55,6 +54,7 @@ export default defineComponent({ | @@ -55,6 +54,7 @@ export default defineComponent({ | ||
55 | default: false, | 54 | default: false, |
56 | }, | 55 | }, |
57 | }, | 56 | }, |
57 | + emits: ['toggle-advanced'], | ||
58 | setup(props, { slots, emit }) { | 58 | setup(props, { slots, emit }) { |
59 | const getResetBtnOptionsRef = computed(() => { | 59 | const getResetBtnOptionsRef = computed(() => { |
60 | return { | 60 | return { |
@@ -112,7 +112,7 @@ export default defineComponent({ | @@ -112,7 +112,7 @@ export default defineComponent({ | ||
112 | {() => ( | 112 | {() => ( |
113 | <> | 113 | <> |
114 | {isAdvanced ? t('putAway') : t('unfold')} | 114 | {isAdvanced ? t('putAway') : t('unfold')} |
115 | - <BasicArrow expand={!isAdvanced} /> | 115 | + <BasicArrow expand={!isAdvanced} top /> |
116 | </> | 116 | </> |
117 | )} | 117 | )} |
118 | </Button> | 118 | </Button> |
src/components/Form/src/types/form.ts
1 | import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface'; | 1 | import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface'; |
2 | import type { VNode } from 'vue'; | 2 | import type { VNode } from 'vue'; |
3 | -import type { BasicButtonProps } from '/@/components/Button/types'; | 3 | +import type { ButtonProps as AntdButtonProps } from 'ant-design-vue/es/button/buttonTypes'; |
4 | + | ||
4 | import type { FormItem } from './formItem'; | 5 | import type { FormItem } from './formItem'; |
5 | import type { ColEx, ComponentType } from './index'; | 6 | import type { ColEx, ComponentType } from './index'; |
6 | -import { TableActionType } from '../../../Table/src/types/table'; | 7 | +import type { TableActionType } from '/@/components/Table/src/types/table'; |
7 | 8 | ||
8 | export type FieldMapToTime = [string, [string, string], string?][]; | 9 | export type FieldMapToTime = [string, [string, string], string?][]; |
9 | 10 | ||
@@ -18,7 +19,7 @@ export interface RenderCallbackParams { | @@ -18,7 +19,7 @@ export interface RenderCallbackParams { | ||
18 | field: string; | 19 | field: string; |
19 | } | 20 | } |
20 | 21 | ||
21 | -export interface ButtonProps extends BasicButtonProps { | 22 | +export interface ButtonProps extends AntdButtonProps { |
22 | text?: string; | 23 | text?: string; |
23 | } | 24 | } |
24 | 25 |
src/components/Icon/index.tsx
1 | +import './index.less'; | ||
2 | + | ||
1 | import type { PropType } from 'vue'; | 3 | import type { PropType } from 'vue'; |
2 | -import { defineComponent, ref, watch, onMounted, nextTick, unref, computed } from 'vue'; | 4 | +import { |
5 | + defineComponent, | ||
6 | + ref, | ||
7 | + watch, | ||
8 | + onMounted, | ||
9 | + nextTick, | ||
10 | + unref, | ||
11 | + computed, | ||
12 | + CSSProperties, | ||
13 | +} from 'vue'; | ||
3 | import Iconify from '@purge-icons/generated'; | 14 | import Iconify from '@purge-icons/generated'; |
4 | import { isString } from '/@/utils/is'; | 15 | import { isString } from '/@/utils/is'; |
5 | -import './index.less'; | 16 | +import { propTypes } from '/@/utils/propTypes'; |
6 | export default defineComponent({ | 17 | export default defineComponent({ |
7 | name: 'GIcon', | 18 | name: 'GIcon', |
8 | props: { | 19 | props: { |
9 | // icon name | 20 | // icon name |
10 | - icon: { | ||
11 | - type: String as PropType<string>, | ||
12 | - required: true, | ||
13 | - }, | 21 | + icon: propTypes.string, |
14 | // icon color | 22 | // icon color |
15 | - color: { | ||
16 | - type: String as PropType<string>, | ||
17 | - }, | 23 | + color: propTypes.string, |
18 | // icon size | 24 | // icon size |
19 | size: { | 25 | size: { |
20 | type: [String, Number] as PropType<string | number>, | 26 | type: [String, Number] as PropType<string | number>, |
21 | default: 16, | 27 | default: 16, |
22 | }, | 28 | }, |
23 | - prefix: { | ||
24 | - type: String as PropType<string>, | ||
25 | - default: '', | ||
26 | - }, | 29 | + prefix: propTypes.string.def(''), |
27 | }, | 30 | }, |
28 | setup(props, { attrs }) { | 31 | setup(props, { attrs }) { |
29 | - const elRef = ref<Nullable<HTMLElement>>(null); | 32 | + const elRef = ref<ElRef>(null); |
30 | 33 | ||
31 | const getIconRef = computed(() => { | 34 | const getIconRef = computed(() => { |
32 | const { icon, prefix } = props; | 35 | const { icon, prefix } = props; |
@@ -54,18 +57,20 @@ export default defineComponent({ | @@ -54,18 +57,20 @@ export default defineComponent({ | ||
54 | } | 57 | } |
55 | }; | 58 | }; |
56 | 59 | ||
57 | - const wrapStyleRef = computed((): any => { | ||
58 | - const { size, color } = props; | ||
59 | - let fs = size; | ||
60 | - if (isString(size)) { | ||
61 | - fs = parseInt(size, 10); | 60 | + const wrapStyleRef = computed( |
61 | + (): CSSProperties => { | ||
62 | + const { size, color } = props; | ||
63 | + let fs = size; | ||
64 | + if (isString(size)) { | ||
65 | + fs = parseInt(size, 10); | ||
66 | + } | ||
67 | + return { | ||
68 | + fontSize: `${fs}px`, | ||
69 | + color, | ||
70 | + display: 'inline-flex', | ||
71 | + }; | ||
62 | } | 72 | } |
63 | - return { | ||
64 | - fontSize: `${fs}px`, | ||
65 | - color, | ||
66 | - display: 'inline-flex', | ||
67 | - }; | ||
68 | - }); | 73 | + ); |
69 | 74 | ||
70 | watch(() => props.icon, update, { flush: 'post' }); | 75 | watch(() => props.icon, update, { flush: 'post' }); |
71 | 76 |
src/components/Markdown/index.ts
src/components/Markdown/src/index.vue
@@ -2,39 +2,27 @@ | @@ -2,39 +2,27 @@ | ||
2 | <div class="markdown" ref="wrapRef" /> | 2 | <div class="markdown" ref="wrapRef" /> |
3 | </template> | 3 | </template> |
4 | <script lang="ts"> | 4 | <script lang="ts"> |
5 | - import { | ||
6 | - defineComponent, | ||
7 | - ref, | ||
8 | - onMounted, | ||
9 | - unref, | ||
10 | - PropType, | ||
11 | - onUnmounted, | ||
12 | - nextTick, | ||
13 | - watchEffect, | ||
14 | - } from 'vue'; | 5 | + import { defineComponent, ref, onMounted, unref, onUnmounted, nextTick, watchEffect } from 'vue'; |
15 | import Vditor from 'vditor'; | 6 | import Vditor from 'vditor'; |
16 | import 'vditor/dist/index.css'; | 7 | import 'vditor/dist/index.css'; |
8 | + | ||
9 | + import { propTypes } from '/@/utils/propTypes'; | ||
10 | + | ||
17 | export default defineComponent({ | 11 | export default defineComponent({ |
18 | emits: ['update:value'], | 12 | emits: ['update:value'], |
19 | props: { | 13 | props: { |
20 | - height: { | ||
21 | - type: Number as PropType<number>, | ||
22 | - default: 360, | ||
23 | - }, | ||
24 | - value: { | ||
25 | - type: String, | ||
26 | - default: '', | ||
27 | - }, | 14 | + height: propTypes.number.def(360), |
15 | + value: propTypes.string.def(''), | ||
28 | }, | 16 | }, |
29 | setup(props, { attrs, emit }) { | 17 | setup(props, { attrs, emit }) { |
30 | - const wrapRef = ref<Nullable<HTMLDivElement>>(null); | 18 | + const wrapRef = ref<ElRef>(null); |
31 | const vditorRef = ref<Nullable<Vditor>>(null); | 19 | const vditorRef = ref<Nullable<Vditor>>(null); |
32 | const initedRef = ref(false); | 20 | const initedRef = ref(false); |
33 | 21 | ||
34 | function init() { | 22 | function init() { |
35 | const wrapEl = unref(wrapRef); | 23 | const wrapEl = unref(wrapRef); |
36 | if (!wrapEl) return; | 24 | if (!wrapEl) return; |
37 | - const data = { ...attrs, ...props }; | 25 | + const bindValue = { ...attrs, ...props }; |
38 | vditorRef.value = new Vditor(wrapEl, { | 26 | vditorRef.value = new Vditor(wrapEl, { |
39 | mode: 'sv', | 27 | mode: 'sv', |
40 | preview: { | 28 | preview: { |
@@ -43,7 +31,7 @@ | @@ -43,7 +31,7 @@ | ||
43 | input: (v) => { | 31 | input: (v) => { |
44 | emit('update:value', v); | 32 | emit('update:value', v); |
45 | }, | 33 | }, |
46 | - ...data, | 34 | + ...bindValue, |
47 | cache: { | 35 | cache: { |
48 | enable: false, | 36 | enable: false, |
49 | }, | 37 | }, |
src/components/Modal/src/BasicModal.tsx
@@ -3,7 +3,7 @@ import type { ModalProps, ModalMethods } from './types'; | @@ -3,7 +3,7 @@ import type { ModalProps, ModalMethods } from './types'; | ||
3 | import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue'; | 3 | import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue'; |
4 | 4 | ||
5 | import Modal from './Modal'; | 5 | import Modal from './Modal'; |
6 | -import Button from '/@/components/Button/index.vue'; | 6 | +import { Button } from '/@/components/Button'; |
7 | import ModalWrapper from './ModalWrapper'; | 7 | import ModalWrapper from './ModalWrapper'; |
8 | import { BasicTitle } from '/@/components/Basic'; | 8 | import { BasicTitle } from '/@/components/Basic'; |
9 | import { FullscreenExitOutlined, FullscreenOutlined, CloseOutlined } from '@ant-design/icons-vue'; | 9 | import { FullscreenExitOutlined, FullscreenOutlined, CloseOutlined } from '@ant-design/icons-vue'; |
src/components/Page/index.ts
0 → 100644
src/components/Application/src/AppPageFooter.vue renamed to src/components/Page/src/PageFooter.vue
@@ -14,10 +14,9 @@ | @@ -14,10 +14,9 @@ | ||
14 | import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; | 14 | import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; |
15 | 15 | ||
16 | export default defineComponent({ | 16 | export default defineComponent({ |
17 | - name: 'AppFooterToolbar', | 17 | + name: 'PageFooter', |
18 | setup() { | 18 | setup() { |
19 | const { getCalcContentWidth } = useMenuSetting(); | 19 | const { getCalcContentWidth } = useMenuSetting(); |
20 | - | ||
21 | return { getCalcContentWidth }; | 20 | return { getCalcContentWidth }; |
22 | }, | 21 | }, |
23 | }); | 22 | }); |
src/components/StrengthMeter/index.tsx
1 | -import { PropType } from 'vue'; | 1 | +import StrengthMeter from './src/index'; |
2 | +import { withInstall } from '../util'; | ||
2 | 3 | ||
3 | -import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue'; | 4 | +export { StrengthMeter }; |
4 | 5 | ||
5 | -import { Input } from 'ant-design-vue'; | ||
6 | - | ||
7 | -import zxcvbn from 'zxcvbn'; | ||
8 | -import { extendSlots } from '/@/utils/helper/tsxHelper'; | ||
9 | - | ||
10 | -import './index.less'; | ||
11 | -const prefixCls = 'strength-meter'; | ||
12 | -export default defineComponent({ | ||
13 | - name: 'StrengthMeter', | ||
14 | - emits: ['score-change', 'change'], | ||
15 | - props: { | ||
16 | - value: { | ||
17 | - type: String as PropType<string>, | ||
18 | - default: undefined, | ||
19 | - }, | ||
20 | - | ||
21 | - userInputs: { | ||
22 | - type: Array as PropType<string[]>, | ||
23 | - default: () => [], | ||
24 | - }, | ||
25 | - | ||
26 | - showInput: { | ||
27 | - type: Boolean as PropType<boolean>, | ||
28 | - default: true, | ||
29 | - }, | ||
30 | - disabled: { | ||
31 | - type: Boolean as PropType<boolean>, | ||
32 | - default: false, | ||
33 | - }, | ||
34 | - }, | ||
35 | - setup(props, { emit, attrs, slots }) { | ||
36 | - const innerValueRef = ref(''); | ||
37 | - const getPasswordStrength = computed(() => { | ||
38 | - const { userInputs, disabled } = props; | ||
39 | - if (disabled) return null; | ||
40 | - const innerValue = unref(innerValueRef); | ||
41 | - const score = innerValue | ||
42 | - ? zxcvbn(unref(innerValueRef), (userInputs as string[]) || null).score | ||
43 | - : null; | ||
44 | - emit('score-change', score); | ||
45 | - return score; | ||
46 | - }); | ||
47 | - | ||
48 | - function handleChange(e: ChangeEvent) { | ||
49 | - innerValueRef.value = e.target.value; | ||
50 | - } | ||
51 | - | ||
52 | - watchEffect(() => { | ||
53 | - innerValueRef.value = props.value || ''; | ||
54 | - }); | ||
55 | - watch( | ||
56 | - () => unref(innerValueRef), | ||
57 | - (val) => { | ||
58 | - emit('change', val); | ||
59 | - } | ||
60 | - ); | ||
61 | - | ||
62 | - return () => { | ||
63 | - const { showInput, disabled } = props; | ||
64 | - return ( | ||
65 | - <div class={prefixCls}> | ||
66 | - {showInput && ( | ||
67 | - <Input.Password | ||
68 | - {...attrs} | ||
69 | - allowClear={true} | ||
70 | - value={unref(innerValueRef)} | ||
71 | - onChange={handleChange} | ||
72 | - disabled={disabled} | ||
73 | - > | ||
74 | - {extendSlots(slots)} | ||
75 | - </Input.Password> | ||
76 | - )} | ||
77 | - <div class={`${prefixCls}-bar`}> | ||
78 | - <div class={`${prefixCls}-bar__fill`} data-score={unref(getPasswordStrength)}></div> | ||
79 | - </div> | ||
80 | - </div> | ||
81 | - ); | ||
82 | - }; | ||
83 | - }, | ||
84 | -}); | 6 | +export default withInstall(StrengthMeter); |
src/components/StrengthMeter/index.less renamed to src/components/StrengthMeter/src/index.less
src/components/StrengthMeter/src/index.tsx
0 → 100644
1 | +import './index.less'; | ||
2 | + | ||
3 | +import { PropType } from 'vue'; | ||
4 | + | ||
5 | +import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue'; | ||
6 | + | ||
7 | +import { Input } from 'ant-design-vue'; | ||
8 | + | ||
9 | +import zxcvbn from 'zxcvbn'; | ||
10 | +import { extendSlots } from '/@/utils/helper/tsxHelper'; | ||
11 | +import { propTypes } from '/@/utils/propTypes'; | ||
12 | + | ||
13 | +const prefixCls = 'strength-meter'; | ||
14 | +export default defineComponent({ | ||
15 | + name: 'StrengthMeter', | ||
16 | + props: { | ||
17 | + value: propTypes.string, | ||
18 | + | ||
19 | + userInputs: { | ||
20 | + type: Array as PropType<string[]>, | ||
21 | + default: () => [], | ||
22 | + }, | ||
23 | + | ||
24 | + showInput: propTypes.bool.def(true), | ||
25 | + disabled: propTypes.bool, | ||
26 | + }, | ||
27 | + emits: ['score-change', 'change'], | ||
28 | + setup(props, { emit, attrs, slots }) { | ||
29 | + const innerValueRef = ref(''); | ||
30 | + const getPasswordStrength = computed(() => { | ||
31 | + const { userInputs, disabled } = props; | ||
32 | + if (disabled) return null; | ||
33 | + const innerValue = unref(innerValueRef); | ||
34 | + const score = innerValue | ||
35 | + ? zxcvbn(unref(innerValueRef), (userInputs as string[]) || null).score | ||
36 | + : null; | ||
37 | + emit('score-change', score); | ||
38 | + return score; | ||
39 | + }); | ||
40 | + | ||
41 | + function handleChange(e: ChangeEvent) { | ||
42 | + innerValueRef.value = e.target.value; | ||
43 | + } | ||
44 | + | ||
45 | + watchEffect(() => { | ||
46 | + innerValueRef.value = props.value || ''; | ||
47 | + }); | ||
48 | + watch( | ||
49 | + () => unref(innerValueRef), | ||
50 | + (val) => { | ||
51 | + emit('change', val); | ||
52 | + } | ||
53 | + ); | ||
54 | + | ||
55 | + return () => { | ||
56 | + const { showInput, disabled } = props; | ||
57 | + return ( | ||
58 | + <div class={prefixCls}> | ||
59 | + {showInput && ( | ||
60 | + <Input.Password | ||
61 | + {...attrs} | ||
62 | + allowClear={true} | ||
63 | + value={unref(innerValueRef)} | ||
64 | + onChange={handleChange} | ||
65 | + disabled={disabled} | ||
66 | + > | ||
67 | + {extendSlots(slots)} | ||
68 | + </Input.Password> | ||
69 | + )} | ||
70 | + <div class={`${prefixCls}-bar`}> | ||
71 | + <div class={`${prefixCls}-bar__fill`} data-score={unref(getPasswordStrength)}></div> | ||
72 | + </div> | ||
73 | + </div> | ||
74 | + ); | ||
75 | + }; | ||
76 | + }, | ||
77 | +}); |
src/components/Table/src/components/TableAction.tsx
@@ -3,7 +3,7 @@ import { Dropdown, Menu, Popconfirm } from 'ant-design-vue'; | @@ -3,7 +3,7 @@ import { Dropdown, Menu, Popconfirm } from 'ant-design-vue'; | ||
3 | import Icon from '/@/components/Icon/index'; | 3 | import Icon from '/@/components/Icon/index'; |
4 | import { DownOutlined } from '@ant-design/icons-vue'; | 4 | import { DownOutlined } from '@ant-design/icons-vue'; |
5 | import { ActionItem } from '/@/components/Table'; | 5 | import { ActionItem } from '/@/components/Table'; |
6 | -import Button from '/@/components/Button/index.vue'; | 6 | +import { Button } from '/@/components/Button'; |
7 | const prefixCls = 'basic-table-action'; | 7 | const prefixCls = 'basic-table-action'; |
8 | export default defineComponent({ | 8 | export default defineComponent({ |
9 | name: 'TableAction', | 9 | name: 'TableAction', |
src/components/Table/src/components/renderEditable.tsx
1 | +import '../style/editable-cell.less'; | ||
2 | + | ||
1 | import { defineComponent, PropType, ref, unref, nextTick, watchEffect } from 'vue'; | 3 | import { defineComponent, PropType, ref, unref, nextTick, watchEffect } from 'vue'; |
2 | -import ClickOutSide from '/@/components/ClickOutSide/index.vue'; | 4 | +import { ClickOutSide } from '/@/components/ClickOutSide'; |
3 | 5 | ||
4 | import { RenderEditableCellParams } from '../types/table'; | 6 | import { RenderEditableCellParams } from '../types/table'; |
5 | import { ComponentType } from '../types/componentType'; | 7 | import { ComponentType } from '../types/componentType'; |
@@ -8,8 +10,6 @@ import { componentMap } from '../componentMap'; | @@ -8,8 +10,6 @@ import { componentMap } from '../componentMap'; | ||
8 | import { isString, isBoolean } from '/@/utils/is'; | 10 | import { isString, isBoolean } from '/@/utils/is'; |
9 | import { FormOutlined, CloseOutlined, CheckOutlined } from '@ant-design/icons-vue'; | 11 | import { FormOutlined, CloseOutlined, CheckOutlined } from '@ant-design/icons-vue'; |
10 | 12 | ||
11 | -import '../style/editable-cell.less'; | ||
12 | - | ||
13 | const prefixCls = 'editable-cell'; | 13 | const prefixCls = 'editable-cell'; |
14 | const EditableCell = defineComponent({ | 14 | const EditableCell = defineComponent({ |
15 | name: 'EditableCell', | 15 | name: 'EditableCell', |
src/components/Table/src/components/renderExpandIcon.tsx
src/components/Tinymce/index.ts
src/components/Tinymce/src/Editor.vue
@@ -8,7 +8,6 @@ | @@ -8,7 +8,6 @@ | ||
8 | import { | 8 | import { |
9 | defineComponent, | 9 | defineComponent, |
10 | computed, | 10 | computed, |
11 | - onMounted, | ||
12 | nextTick, | 11 | nextTick, |
13 | ref, | 12 | ref, |
14 | unref, | 13 | unref, |
@@ -24,6 +23,7 @@ | @@ -24,6 +23,7 @@ | ||
24 | import { snowUuid } from '/@/utils/uuid'; | 23 | import { snowUuid } from '/@/utils/uuid'; |
25 | import { bindHandlers } from './helper'; | 24 | import { bindHandlers } from './helper'; |
26 | import lineHeight from './lineHeight'; | 25 | import lineHeight from './lineHeight'; |
26 | + import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'; | ||
27 | 27 | ||
28 | const CDN_URL = 'https://cdn.bootcdn.net/ajax/libs/tinymce/5.5.1'; | 28 | const CDN_URL = 'https://cdn.bootcdn.net/ajax/libs/tinymce/5.5.1'; |
29 | 29 | ||
@@ -91,8 +91,7 @@ | @@ -91,8 +91,7 @@ | ||
91 | editor.setMode(attrs.disabled ? 'readonly' : 'design'); | 91 | editor.setMode(attrs.disabled ? 'readonly' : 'design'); |
92 | } | 92 | } |
93 | ); | 93 | ); |
94 | - | ||
95 | - onMounted(() => { | 94 | + onMountedOrActivated(() => { |
96 | nextTick(() => { | 95 | nextTick(() => { |
97 | init(); | 96 | init(); |
98 | }); | 97 | }); |
src/components/Transition/src/CreateTransition.tsx
@@ -13,14 +13,6 @@ export function createSimpleTransition(name: string, origin = 'top center 0', mo | @@ -13,14 +13,6 @@ export function createSimpleTransition(name: string, origin = 'top center 0', mo | ||
13 | type: Boolean as PropType<boolean>, | 13 | type: Boolean as PropType<boolean>, |
14 | default: false, | 14 | default: false, |
15 | }, | 15 | }, |
16 | - // hideOnLeave: { | ||
17 | - // type: Boolean as PropType<boolean>, | ||
18 | - // default: false, | ||
19 | - // }, | ||
20 | - // leaveAbsolute: { | ||
21 | - // type: Boolean as PropType<boolean>, | ||
22 | - // default: false, | ||
23 | - // }, | ||
24 | mode: { | 16 | mode: { |
25 | type: String as PropType<Mode>, | 17 | type: String as PropType<Mode>, |
26 | default: mode, | 18 | default: mode, |
src/components/Verify/index.ts
1 | -export { default as BasicDragVerify } from './src/DragVerify'; | ||
2 | -export { default as RotateDragVerify } from './src/ImgRotate'; | 1 | +import BasicDragVerify from './src/DragVerify'; |
2 | +import RotateDragVerify from './src/ImgRotate'; | ||
3 | +import { withInstall } from '../util'; | ||
3 | 4 | ||
4 | export * from './src/types'; | 5 | export * from './src/types'; |
6 | + | ||
7 | +export { RotateDragVerify, BasicDragVerify }; | ||
8 | + | ||
9 | +export default withInstall(RotateDragVerify, BasicDragVerify); |
src/components/VirtualScroll/index.ts
src/components/VirtualScroll/src/index.tsx
1 | -import { defineComponent, computed, ref, unref, reactive, onMounted, watch, nextTick } from 'vue'; | 1 | +import { |
2 | + defineComponent, | ||
3 | + computed, | ||
4 | + ref, | ||
5 | + unref, | ||
6 | + reactive, | ||
7 | + onMounted, | ||
8 | + watch, | ||
9 | + nextTick, | ||
10 | + CSSProperties, | ||
11 | +} from 'vue'; | ||
2 | import { useEventListener } from '/@/hooks/event/useEventListener'; | 12 | import { useEventListener } from '/@/hooks/event/useEventListener'; |
3 | 13 | ||
4 | import { convertToUnit } from '/@/components/util'; | 14 | import { convertToUnit } from '/@/components/util'; |
@@ -34,29 +44,33 @@ export default defineComponent({ | @@ -34,29 +44,33 @@ export default defineComponent({ | ||
34 | return Math.min((props.items || []).length, state.last + unref(getBenchRef)); | 44 | return Math.min((props.items || []).length, state.last + unref(getBenchRef)); |
35 | }); | 45 | }); |
36 | 46 | ||
37 | - const getContainerStyleRef = computed(() => { | ||
38 | - return { | ||
39 | - height: convertToUnit((props.items || []).length * unref(getItemHeightRef)), | ||
40 | - }; | ||
41 | - }); | 47 | + const getContainerStyleRef = computed( |
48 | + (): CSSProperties => { | ||
49 | + return { | ||
50 | + height: convertToUnit((props.items || []).length * unref(getItemHeightRef)), | ||
51 | + }; | ||
52 | + } | ||
53 | + ); | ||
42 | 54 | ||
43 | - const getWrapStyleRef = computed((): object => { | ||
44 | - const styles: Record<string, string> = {}; | ||
45 | - const height = convertToUnit(props.height); | ||
46 | - const minHeight = convertToUnit(props.minHeight); | ||
47 | - const minWidth = convertToUnit(props.minWidth); | ||
48 | - const maxHeight = convertToUnit(props.maxHeight); | ||
49 | - const maxWidth = convertToUnit(props.maxWidth); | ||
50 | - const width = convertToUnit(props.width); | ||
51 | - | ||
52 | - if (height) styles.height = height; | ||
53 | - if (minHeight) styles.minHeight = minHeight; | ||
54 | - if (minWidth) styles.minWidth = minWidth; | ||
55 | - if (maxHeight) styles.maxHeight = maxHeight; | ||
56 | - if (maxWidth) styles.maxWidth = maxWidth; | ||
57 | - if (width) styles.width = width; | ||
58 | - return styles; | ||
59 | - }); | 55 | + const getWrapStyleRef = computed( |
56 | + (): CSSProperties => { | ||
57 | + const styles: Record<string, string> = {}; | ||
58 | + const height = convertToUnit(props.height); | ||
59 | + const minHeight = convertToUnit(props.minHeight); | ||
60 | + const minWidth = convertToUnit(props.minWidth); | ||
61 | + const maxHeight = convertToUnit(props.maxHeight); | ||
62 | + const maxWidth = convertToUnit(props.maxWidth); | ||
63 | + const width = convertToUnit(props.width); | ||
64 | + | ||
65 | + if (height) styles.height = height; | ||
66 | + if (minHeight) styles.minHeight = minHeight; | ||
67 | + if (minWidth) styles.minWidth = minWidth; | ||
68 | + if (maxHeight) styles.maxHeight = maxHeight; | ||
69 | + if (maxWidth) styles.maxWidth = maxWidth; | ||
70 | + if (width) styles.width = width; | ||
71 | + return styles; | ||
72 | + } | ||
73 | + ); | ||
60 | 74 | ||
61 | watch([() => props.itemHeight, () => props.height], () => { | 75 | watch([() => props.itemHeight, () => props.height], () => { |
62 | onScroll(); | 76 | onScroll(); |
src/components/registerGlobComp.ts
src/components/util.ts
@@ -6,6 +6,7 @@ export function withInstall(...components: Component[]) { | @@ -6,6 +6,7 @@ export function withInstall(...components: Component[]) { | ||
6 | components.forEach((comp) => { | 6 | components.forEach((comp) => { |
7 | comp.name && app.component(comp.name, comp); | 7 | comp.name && app.component(comp.name, comp); |
8 | }); | 8 | }); |
9 | + return app; | ||
9 | }; | 10 | }; |
10 | } | 11 | } |
11 | 12 |
src/layouts/default/LayoutTrigger.tsx
1 | -import type { PropType, FunctionalComponent } from 'vue'; | 1 | +import type { FunctionalComponent } from 'vue'; |
2 | 2 | ||
3 | import { defineComponent, unref } from 'vue'; | 3 | import { defineComponent, unref } from 'vue'; |
4 | + | ||
4 | import { | 5 | import { |
5 | DoubleRightOutlined, | 6 | DoubleRightOutlined, |
6 | DoubleLeftOutlined, | 7 | DoubleLeftOutlined, |
@@ -9,6 +10,7 @@ import { | @@ -9,6 +10,7 @@ import { | ||
9 | } from '@ant-design/icons-vue'; | 10 | } from '@ant-design/icons-vue'; |
10 | 11 | ||
11 | import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; | 12 | import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; |
13 | +import { propTypes } from '/@/utils/propTypes'; | ||
12 | 14 | ||
13 | const SiderTrigger: FunctionalComponent = () => { | 15 | const SiderTrigger: FunctionalComponent = () => { |
14 | const { getCollapsed } = useMenuSetting(); | 16 | const { getCollapsed } = useMenuSetting(); |
@@ -29,13 +31,8 @@ const HeaderTrigger: FunctionalComponent<{ | @@ -29,13 +31,8 @@ const HeaderTrigger: FunctionalComponent<{ | ||
29 | export default defineComponent({ | 31 | export default defineComponent({ |
30 | name: 'LayoutTrigger', | 32 | name: 'LayoutTrigger', |
31 | props: { | 33 | props: { |
32 | - sider: { | ||
33 | - type: Boolean as PropType<boolean>, | ||
34 | - default: true, | ||
35 | - }, | ||
36 | - theme: { | ||
37 | - type: String as PropType<string>, | ||
38 | - }, | 34 | + sider: propTypes.bool.def(true), |
35 | + theme: propTypes.oneOf(['light', 'dark']), | ||
39 | }, | 36 | }, |
40 | setup(props) { | 37 | setup(props) { |
41 | return () => { | 38 | return () => { |
src/layouts/default/header/LayoutBreadcrumb.tsx
@@ -3,9 +3,9 @@ import type { RouteLocationMatched } from 'vue-router'; | @@ -3,9 +3,9 @@ import type { RouteLocationMatched } from 'vue-router'; | ||
3 | import type { PropType } from 'vue'; | 3 | import type { PropType } from 'vue'; |
4 | 4 | ||
5 | import { defineComponent, TransitionGroup, unref, watch, ref } from 'vue'; | 5 | import { defineComponent, TransitionGroup, unref, watch, ref } from 'vue'; |
6 | -import Breadcrumb from '/@/components/Breadcrumb/Breadcrumb.vue'; | ||
7 | import Icon from '/@/components/Icon'; | 6 | import Icon from '/@/components/Icon'; |
8 | -import BreadcrumbItem from '/@/components/Breadcrumb/BreadcrumbItem.vue'; | 7 | + |
8 | +import { Breadcrumb, BreadcrumbItem } from '/@/components/Breadcrumb'; | ||
9 | 9 | ||
10 | import { useRouter } from 'vue-router'; | 10 | import { useRouter } from 'vue-router'; |
11 | 11 |
src/layouts/default/header/LayoutHeader.tsx
@@ -38,6 +38,7 @@ import { PageEnum } from '/@/enums/pageEnum'; | @@ -38,6 +38,7 @@ import { PageEnum } from '/@/enums/pageEnum'; | ||
38 | import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum'; | 38 | import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum'; |
39 | import { AppLocalePicker } from '/@/components/Application'; | 39 | import { AppLocalePicker } from '/@/components/Application'; |
40 | import { useI18n } from '/@/hooks/web/useI18n'; | 40 | import { useI18n } from '/@/hooks/web/useI18n'; |
41 | +import { propTypes } from '/@/utils/propTypes'; | ||
41 | 42 | ||
42 | interface TooltipItemProps { | 43 | interface TooltipItemProps { |
43 | title: string; | 44 | title: string; |
@@ -57,10 +58,7 @@ const TooltipItem: FunctionalComponent<TooltipItemProps> = (props, { slots }) => | @@ -57,10 +58,7 @@ const TooltipItem: FunctionalComponent<TooltipItemProps> = (props, { slots }) => | ||
57 | export default defineComponent({ | 58 | export default defineComponent({ |
58 | name: 'LayoutHeader', | 59 | name: 'LayoutHeader', |
59 | props: { | 60 | props: { |
60 | - fixed: { | ||
61 | - type: Boolean, | ||
62 | - default: false, | ||
63 | - }, | 61 | + fixed: propTypes.bool, |
64 | }, | 62 | }, |
65 | setup(props) { | 63 | setup(props) { |
66 | let logoEl: Element | null | undefined; | 64 | let logoEl: Element | null | undefined; |
src/layouts/default/header/notice/NoticeList.vue
@@ -37,7 +37,7 @@ | @@ -37,7 +37,7 @@ | ||
37 | export default defineComponent({ | 37 | export default defineComponent({ |
38 | props: { | 38 | props: { |
39 | list: { | 39 | list: { |
40 | - type: Array as PropType<Array<ListItem>>, | 40 | + type: Array as PropType<ListItem[]>, |
41 | default: () => [], | 41 | default: () => [], |
42 | }, | 42 | }, |
43 | }, | 43 | }, |
src/layouts/default/lock/LockAction.tsx
@@ -2,7 +2,7 @@ import './LockAction.less'; | @@ -2,7 +2,7 @@ import './LockAction.less'; | ||
2 | 2 | ||
3 | import { defineComponent } from 'vue'; | 3 | import { defineComponent } from 'vue'; |
4 | import { BasicModal, useModalInner } from '/@/components/Modal/index'; | 4 | import { BasicModal, useModalInner } from '/@/components/Modal/index'; |
5 | -import Button from '/@/components/Button/index.vue'; | 5 | +import { Button } from '/@/components/Button'; |
6 | import { BasicForm, useForm } from '/@/components/Form/index'; | 6 | import { BasicForm, useForm } from '/@/components/Form/index'; |
7 | 7 | ||
8 | import headerImg from '/@/assets/images/header.jpg'; | 8 | import headerImg from '/@/assets/images/header.jpg'; |
src/layouts/default/menu/index.tsx
@@ -15,32 +15,25 @@ import { useRootSetting } from '/@/hooks/setting/useRootSetting'; | @@ -15,32 +15,25 @@ import { useRootSetting } from '/@/hooks/setting/useRootSetting'; | ||
15 | import { useGo } from '/@/hooks/web/usePage'; | 15 | import { useGo } from '/@/hooks/web/usePage'; |
16 | import { useSplitMenu } from './useLayoutMenu'; | 16 | import { useSplitMenu } from './useLayoutMenu'; |
17 | import { openWindow } from '/@/utils'; | 17 | import { openWindow } from '/@/utils'; |
18 | +import { propTypes } from '/@/utils/propTypes'; | ||
18 | 19 | ||
19 | export default defineComponent({ | 20 | export default defineComponent({ |
20 | name: 'LayoutMenu', | 21 | name: 'LayoutMenu', |
21 | props: { | 22 | props: { |
22 | - theme: { | ||
23 | - type: String as PropType<string>, | ||
24 | - default: '', | ||
25 | - }, | 23 | + theme: propTypes.oneOf(['light', 'dark']), |
24 | + | ||
26 | splitType: { | 25 | splitType: { |
27 | type: Number as PropType<MenuSplitTyeEnum>, | 26 | type: Number as PropType<MenuSplitTyeEnum>, |
28 | default: MenuSplitTyeEnum.NONE, | 27 | default: MenuSplitTyeEnum.NONE, |
29 | }, | 28 | }, |
30 | - parentMenuPath: { | ||
31 | - type: String as PropType<string>, | ||
32 | - default: '', | ||
33 | - }, | ||
34 | - showSearch: { | ||
35 | - type: Boolean as PropType<boolean>, | ||
36 | - default: true, | ||
37 | - }, | ||
38 | - isHorizontal: { | ||
39 | - type: Boolean as PropType<boolean>, | ||
40 | - default: false, | ||
41 | - }, | 29 | + |
30 | + // Whether to show search box | ||
31 | + showSearch: propTypes.bool.def(true), | ||
32 | + | ||
33 | + isHorizontal: propTypes.bool, | ||
34 | + // menu Mode | ||
42 | menuMode: { | 35 | menuMode: { |
43 | - type: [String] as PropType<MenuModeEnum | null>, | 36 | + type: [String] as PropType<Nullable<MenuModeEnum>>, |
44 | default: '', | 37 | default: '', |
45 | }, | 38 | }, |
46 | }, | 39 | }, |
src/layouts/default/setting/SettingDrawer.tsx
@@ -5,7 +5,7 @@ import defaultSetting from '/@/settings/projectSetting'; | @@ -5,7 +5,7 @@ import defaultSetting from '/@/settings/projectSetting'; | ||
5 | import { defineComponent, computed, unref, FunctionalComponent } from 'vue'; | 5 | import { defineComponent, computed, unref, FunctionalComponent } from 'vue'; |
6 | import { BasicDrawer } from '/@/components/Drawer/index'; | 6 | import { BasicDrawer } from '/@/components/Drawer/index'; |
7 | import { Divider, Switch, Tooltip, InputNumber, Select } from 'ant-design-vue'; | 7 | import { Divider, Switch, Tooltip, InputNumber, Select } from 'ant-design-vue'; |
8 | -import Button from '/@/components/Button/index.vue'; | 8 | +import { Button } from '/@/components/Button'; |
9 | import { CopyOutlined, RedoOutlined, CheckOutlined } from '@ant-design/icons-vue'; | 9 | import { CopyOutlined, RedoOutlined, CheckOutlined } from '@ant-design/icons-vue'; |
10 | 10 | ||
11 | import { MenuTypeEnum } from '/@/enums/menuEnum'; | 11 | import { MenuTypeEnum } from '/@/enums/menuEnum'; |
src/locales/index.ts
src/main.ts
1 | import { createApp } from 'vue'; | 1 | import { createApp } from 'vue'; |
2 | +import App from './App.vue'; | ||
2 | 3 | ||
3 | import router, { setupRouter } from '/@/router'; | 4 | import router, { setupRouter } from '/@/router'; |
4 | import { setupStore } from '/@/store'; | 5 | import { setupStore } from '/@/store'; |
@@ -6,12 +7,9 @@ import { setupAntd } from '/@/setup/ant-design-vue'; | @@ -6,12 +7,9 @@ import { setupAntd } from '/@/setup/ant-design-vue'; | ||
6 | import { setupErrorHandle } from '/@/setup/error-handle'; | 7 | import { setupErrorHandle } from '/@/setup/error-handle'; |
7 | import { setupGlobDirectives } from '/@/setup/directives'; | 8 | import { setupGlobDirectives } from '/@/setup/directives'; |
8 | import { setupI18n } from '/@/setup/i18n'; | 9 | import { setupI18n } from '/@/setup/i18n'; |
9 | - | ||
10 | import { setupProdMockServer } from '../mock/_createProductionServer'; | 10 | import { setupProdMockServer } from '../mock/_createProductionServer'; |
11 | import { setApp } from '/@/setup/App'; | 11 | import { setApp } from '/@/setup/App'; |
12 | 12 | ||
13 | -import App from './App.vue'; | ||
14 | - | ||
15 | import { isDevMode, isProdMode, isUseMock } from '/@/utils/env'; | 13 | import { isDevMode, isProdMode, isUseMock } from '/@/utils/env'; |
16 | 14 | ||
17 | import '/@/design/index.less'; | 15 | import '/@/design/index.less'; |
src/router/routes/modules/demo/form.ts
@@ -10,7 +10,7 @@ const form: AppRouteModule = { | @@ -10,7 +10,7 @@ const form: AppRouteModule = { | ||
10 | redirect: '/form/basic', | 10 | redirect: '/form/basic', |
11 | meta: { | 11 | meta: { |
12 | icon: 'ant-design:table-outlined', | 12 | icon: 'ant-design:table-outlined', |
13 | - title: 'rroutes.demo.form.form', | 13 | + title: 'routes.demo.form.form', |
14 | }, | 14 | }, |
15 | }, | 15 | }, |
16 | 16 | ||
@@ -20,7 +20,7 @@ const form: AppRouteModule = { | @@ -20,7 +20,7 @@ const form: AppRouteModule = { | ||
20 | name: 'FormBasicDemo', | 20 | name: 'FormBasicDemo', |
21 | component: () => import('/@/views/demo/form/index.vue'), | 21 | component: () => import('/@/views/demo/form/index.vue'), |
22 | meta: { | 22 | meta: { |
23 | - title: 'rroutes.demo.form.basic', | 23 | + title: 'routes.demo.form.basic', |
24 | }, | 24 | }, |
25 | }, | 25 | }, |
26 | { | 26 | { |
@@ -28,7 +28,7 @@ const form: AppRouteModule = { | @@ -28,7 +28,7 @@ const form: AppRouteModule = { | ||
28 | name: 'UseFormDemo', | 28 | name: 'UseFormDemo', |
29 | component: () => import('/@/views/demo/form/UseForm.vue'), | 29 | component: () => import('/@/views/demo/form/UseForm.vue'), |
30 | meta: { | 30 | meta: { |
31 | - title: 'rroutes.demo.form.useForm', | 31 | + title: 'routes.demo.form.useForm', |
32 | }, | 32 | }, |
33 | }, | 33 | }, |
34 | { | 34 | { |
@@ -36,7 +36,7 @@ const form: AppRouteModule = { | @@ -36,7 +36,7 @@ const form: AppRouteModule = { | ||
36 | name: 'RefFormDemo', | 36 | name: 'RefFormDemo', |
37 | component: () => import('/@/views/demo/form/RefForm.vue'), | 37 | component: () => import('/@/views/demo/form/RefForm.vue'), |
38 | meta: { | 38 | meta: { |
39 | - title: 'rroutes.demo.form.refForm', | 39 | + title: 'routes.demo.form.refForm', |
40 | }, | 40 | }, |
41 | }, | 41 | }, |
42 | { | 42 | { |
@@ -44,7 +44,7 @@ const form: AppRouteModule = { | @@ -44,7 +44,7 @@ const form: AppRouteModule = { | ||
44 | name: 'AdvancedFormDemo', | 44 | name: 'AdvancedFormDemo', |
45 | component: () => import('/@/views/demo/form/AdvancedForm.vue'), | 45 | component: () => import('/@/views/demo/form/AdvancedForm.vue'), |
46 | meta: { | 46 | meta: { |
47 | - title: 'rroutes.demo.form.advancedForm', | 47 | + title: 'routes.demo.form.advancedForm', |
48 | }, | 48 | }, |
49 | }, | 49 | }, |
50 | { | 50 | { |
@@ -52,7 +52,7 @@ const form: AppRouteModule = { | @@ -52,7 +52,7 @@ const form: AppRouteModule = { | ||
52 | name: 'RuleFormDemo', | 52 | name: 'RuleFormDemo', |
53 | component: () => import('/@/views/demo/form/RuleForm.vue'), | 53 | component: () => import('/@/views/demo/form/RuleForm.vue'), |
54 | meta: { | 54 | meta: { |
55 | - title: 'rroutes.demo.form.ruleForm', | 55 | + title: 'routes.demo.form.ruleForm', |
56 | }, | 56 | }, |
57 | }, | 57 | }, |
58 | { | 58 | { |
@@ -60,7 +60,7 @@ const form: AppRouteModule = { | @@ -60,7 +60,7 @@ const form: AppRouteModule = { | ||
60 | name: 'DynamicFormDemo', | 60 | name: 'DynamicFormDemo', |
61 | component: () => import('/@/views/demo/form/DynamicForm.vue'), | 61 | component: () => import('/@/views/demo/form/DynamicForm.vue'), |
62 | meta: { | 62 | meta: { |
63 | - title: 'rroutes.demo.form.dynamicForm', | 63 | + title: 'routes.demo.form.dynamicForm', |
64 | }, | 64 | }, |
65 | }, | 65 | }, |
66 | { | 66 | { |
@@ -68,7 +68,7 @@ const form: AppRouteModule = { | @@ -68,7 +68,7 @@ const form: AppRouteModule = { | ||
68 | name: 'CustomerFormDemo', | 68 | name: 'CustomerFormDemo', |
69 | component: () => import('/@/views/demo/form/CustomerForm.vue'), | 69 | component: () => import('/@/views/demo/form/CustomerForm.vue'), |
70 | meta: { | 70 | meta: { |
71 | - title: 'rroutes.demo.form.customerForm', | 71 | + title: 'routes.demo.form.customerForm', |
72 | }, | 72 | }, |
73 | }, | 73 | }, |
74 | ], | 74 | ], |
src/store/modules/user.ts
@@ -30,8 +30,6 @@ hotModuleUnregisterModule(NAME); | @@ -30,8 +30,6 @@ hotModuleUnregisterModule(NAME); | ||
30 | 30 | ||
31 | const { permissionCacheType } = useProjectSetting(); | 31 | const { permissionCacheType } = useProjectSetting(); |
32 | 32 | ||
33 | -const { t } = useI18n('sys.app'); | ||
34 | - | ||
35 | function getCache<T>(key: string) { | 33 | function getCache<T>(key: string) { |
36 | const fn = permissionCacheType === CacheTypeEnum.LOCAL ? getLocal : getSession; | 34 | const fn = permissionCacheType === CacheTypeEnum.LOCAL ? getLocal : getSession; |
37 | return fn(key) as T; | 35 | return fn(key) as T; |
@@ -145,6 +143,7 @@ class User extends VuexModule { | @@ -145,6 +143,7 @@ class User extends VuexModule { | ||
145 | @Action | 143 | @Action |
146 | async confirmLoginOut() { | 144 | async confirmLoginOut() { |
147 | const { createConfirm } = useMessage(); | 145 | const { createConfirm } = useMessage(); |
146 | + const { t } = useI18n('sys.app'); | ||
148 | createConfirm({ | 147 | createConfirm({ |
149 | iconType: 'warning', | 148 | iconType: 'warning', |
150 | title: t('loginOutTip'), | 149 | title: t('loginOutTip'), |
src/utils/http/axios/checkStatus.ts
@@ -3,10 +3,9 @@ import { userStore } from '/@/store/modules/user'; | @@ -3,10 +3,9 @@ import { userStore } from '/@/store/modules/user'; | ||
3 | import { useI18n } from '/@/hooks/web/useI18n'; | 3 | import { useI18n } from '/@/hooks/web/useI18n'; |
4 | const { createMessage } = useMessage(); | 4 | const { createMessage } = useMessage(); |
5 | 5 | ||
6 | -const { t } = useI18n('sys.api'); | ||
7 | - | ||
8 | const error = createMessage.error!; | 6 | const error = createMessage.error!; |
9 | export function checkStatus(status: number, msg: string): void { | 7 | export function checkStatus(status: number, msg: string): void { |
8 | + const { t } = useI18n('sys.api'); | ||
10 | switch (status) { | 9 | switch (status) { |
11 | case 400: | 10 | case 400: |
12 | error(`${msg}`); | 11 | error(`${msg}`); |
src/utils/http/axios/index.ts
@@ -22,7 +22,6 @@ import { errorStore } from '/@/store/modules/error'; | @@ -22,7 +22,6 @@ import { errorStore } from '/@/store/modules/error'; | ||
22 | import { errorResult } from './const'; | 22 | import { errorResult } from './const'; |
23 | import { useI18n } from '/@/hooks/web/useI18n'; | 23 | import { useI18n } from '/@/hooks/web/useI18n'; |
24 | 24 | ||
25 | -const { t } = useI18n('sys.api'); | ||
26 | const globSetting = useGlobSetting(); | 25 | const globSetting = useGlobSetting(); |
27 | const prefix = globSetting.urlPrefix; | 26 | const prefix = globSetting.urlPrefix; |
28 | const { createMessage, createErrorModal } = useMessage(); | 27 | const { createMessage, createErrorModal } = useMessage(); |
@@ -35,6 +34,7 @@ const transform: AxiosTransform = { | @@ -35,6 +34,7 @@ const transform: AxiosTransform = { | ||
35 | * @description: 处理请求数据 | 34 | * @description: 处理请求数据 |
36 | */ | 35 | */ |
37 | transformRequestData: (res: AxiosResponse<Result>, options: RequestOptions) => { | 36 | transformRequestData: (res: AxiosResponse<Result>, options: RequestOptions) => { |
37 | + const { t } = useI18n('sys.api'); | ||
38 | const { isTransformRequestResult } = options; | 38 | const { isTransformRequestResult } = options; |
39 | // 不进行任何处理,直接返回 | 39 | // 不进行任何处理,直接返回 |
40 | // 用于页面代码可能需要直接获取code,data,message这些信息时开启 | 40 | // 用于页面代码可能需要直接获取code,data,message这些信息时开启 |
@@ -154,6 +154,7 @@ const transform: AxiosTransform = { | @@ -154,6 +154,7 @@ const transform: AxiosTransform = { | ||
154 | * @description: 响应错误处理 | 154 | * @description: 响应错误处理 |
155 | */ | 155 | */ |
156 | responseInterceptorsCatch: (error: any) => { | 156 | responseInterceptorsCatch: (error: any) => { |
157 | + const { t } = useI18n('sys.api'); | ||
157 | errorStore.setupErrorHandle(error); | 158 | errorStore.setupErrorHandle(error); |
158 | const { response, code, message } = error || {}; | 159 | const { response, code, message } = error || {}; |
159 | const msg: string = | 160 | const msg: string = |
src/utils/propTypes.ts
0 → 100644
1 | +import { CSSProperties, VNodeChild } from 'vue'; | ||
2 | +import { createTypes, VueTypeValidableDef, VueTypesInterface } from 'vue-types'; | ||
3 | + | ||
4 | +type VueNode = VNodeChild | JSX.Element; | ||
5 | + | ||
6 | +type PropTypes = VueTypesInterface & { | ||
7 | + readonly style: VueTypeValidableDef<CSSProperties>; | ||
8 | + readonly VNodeChild: VueTypeValidableDef<VueNode>; | ||
9 | + // readonly trueBool: VueTypeValidableDef<boolean>; | ||
10 | +}; | ||
11 | + | ||
12 | +const propTypes = createTypes({ | ||
13 | + func: undefined, | ||
14 | + bool: undefined, | ||
15 | + string: undefined, | ||
16 | + number: undefined, | ||
17 | + object: undefined, | ||
18 | + integer: undefined, | ||
19 | +}) as PropTypes; | ||
20 | + | ||
21 | +propTypes.extend([ | ||
22 | + { | ||
23 | + name: 'style', | ||
24 | + getter: true, | ||
25 | + type: [String, Object], | ||
26 | + default: undefined, | ||
27 | + }, | ||
28 | + { | ||
29 | + name: 'VNodeChild', | ||
30 | + getter: true, | ||
31 | + type: undefined, | ||
32 | + }, | ||
33 | + // { | ||
34 | + // name: 'trueBool', | ||
35 | + // getter: true, | ||
36 | + // type: Boolean, | ||
37 | + // default: true, | ||
38 | + // }, | ||
39 | +]); | ||
40 | +export { propTypes }; |
src/views/demo/comp/strength-meter/index.vue
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | 11 | ||
12 | <script lang="ts"> | 12 | <script lang="ts"> |
13 | import { defineComponent } from 'vue'; | 13 | import { defineComponent } from 'vue'; |
14 | - import StrengthMeter from '/@/components/StrengthMeter/index'; | 14 | + import { StrengthMeter } from '/@/components/StrengthMeter'; |
15 | export default defineComponent({ | 15 | export default defineComponent({ |
16 | components: { | 16 | components: { |
17 | StrengthMeter, | 17 | StrengthMeter, |
src/views/demo/feat/click-out-side/index.vue
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | <script lang="ts"> | 11 | <script lang="ts"> |
12 | import { defineComponent, ref } from 'vue'; | 12 | import { defineComponent, ref } from 'vue'; |
13 | import { Alert } from 'ant-design-vue'; | 13 | import { Alert } from 'ant-design-vue'; |
14 | - import ClickOutSide from '/@/components/ClickOutSide/index.vue'; | 14 | + import { ClickOutSide } from '/@/components/ClickOutSide'; |
15 | export default defineComponent({ | 15 | export default defineComponent({ |
16 | components: { ClickOutSide, Alert }, | 16 | components: { ClickOutSide, Alert }, |
17 | setup() { | 17 | setup() { |
src/views/demo/page/desc/basic/data.tsx
1 | import { DescItem } from '/@/components/Description/index'; | 1 | import { DescItem } from '/@/components/Description/index'; |
2 | import { BasicColumn } from '/@/components/Table/src/types/table'; | 2 | import { BasicColumn } from '/@/components/Table/src/types/table'; |
3 | -import Button from '/@/components/Button/index.vue'; | 3 | +import { Button } from '/@/components/Button'; |
4 | 4 | ||
5 | import { Badge } from 'ant-design-vue'; | 5 | import { Badge } from 'ant-design-vue'; |
6 | 6 |
src/views/demo/page/form/high/index.vue
@@ -16,23 +16,23 @@ | @@ -16,23 +16,23 @@ | ||
16 | </a-card> | 16 | </a-card> |
17 | </div> | 17 | </div> |
18 | 18 | ||
19 | - <AppPageFooter> | 19 | + <PageFooter> |
20 | <template #right> | 20 | <template #right> |
21 | <a-button type="primary" @click="submitAll">提交</a-button> | 21 | <a-button type="primary" @click="submitAll">提交</a-button> |
22 | </template> | 22 | </template> |
23 | - </AppPageFooter> | 23 | + </PageFooter> |
24 | </div> | 24 | </div> |
25 | </template> | 25 | </template> |
26 | <script lang="ts"> | 26 | <script lang="ts"> |
27 | import { BasicForm, useForm } from '/@/components/Form'; | 27 | import { BasicForm, useForm } from '/@/components/Form'; |
28 | import { defineComponent, ref } from 'vue'; | 28 | import { defineComponent, ref } from 'vue'; |
29 | import PersonTable from './PersonTable.vue'; | 29 | import PersonTable from './PersonTable.vue'; |
30 | - import { AppPageFooter } from '/@/components/Application'; | 30 | + import { PageFooter } from '/@/components/Page'; |
31 | 31 | ||
32 | import { schemas, taskSchemas } from './data'; | 32 | import { schemas, taskSchemas } from './data'; |
33 | 33 | ||
34 | export default defineComponent({ | 34 | export default defineComponent({ |
35 | - components: { BasicForm, PersonTable, AppPageFooter }, | 35 | + components: { BasicForm, PersonTable, PageFooter }, |
36 | setup() { | 36 | setup() { |
37 | const tableRef = ref<{ getDataSource: () => any } | null>(null); | 37 | const tableRef = ref<{ getDataSource: () => any } | null>(null); |
38 | 38 |
src/views/sys/login/Login.vue
@@ -63,7 +63,7 @@ | @@ -63,7 +63,7 @@ | ||
63 | import { defineComponent, reactive, ref, unref, toRaw } from 'vue'; | 63 | import { defineComponent, reactive, ref, unref, toRaw } from 'vue'; |
64 | import { Checkbox } from 'ant-design-vue'; | 64 | import { Checkbox } from 'ant-design-vue'; |
65 | 65 | ||
66 | - import Button from '/@/components/Button/index.vue'; | 66 | + import { Button } from '/@/components/Button'; |
67 | import { AppLocalePicker } from '/@/components/Application'; | 67 | import { AppLocalePicker } from '/@/components/Application'; |
68 | // import { BasicDragVerify, DragVerifyActionType } from '/@/components/Verify/index'; | 68 | // import { BasicDragVerify, DragVerifyActionType } from '/@/components/Verify/index'; |
69 | 69 |
yarn.lock
@@ -8318,7 +8318,7 @@ vue-router@^4.0.0-rc.5: | @@ -8318,7 +8318,7 @@ vue-router@^4.0.0-rc.5: | ||
8318 | resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-rc.5.tgz#191d32e3d5276641ff21e881d34e33a71dc6e8f0" | 8318 | resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-rc.5.tgz#191d32e3d5276641ff21e881d34e33a71dc6e8f0" |
8319 | integrity sha512-Q8Tt6VGwGMN5qASeIdjSydU3uRADK9AUkqnbnzmTz+zZKS0W6GZOAuP235lf3y5/MqEFSKRJGaTWPEY0t+Rjmg== | 8319 | integrity sha512-Q8Tt6VGwGMN5qASeIdjSydU3uRADK9AUkqnbnzmTz+zZKS0W6GZOAuP235lf3y5/MqEFSKRJGaTWPEY0t+Rjmg== |
8320 | 8320 | ||
8321 | -vue-types@^3.0.0: | 8321 | +vue-types@^3.0.0, vue-types@^3.0.1: |
8322 | version "3.0.1" | 8322 | version "3.0.1" |
8323 | resolved "https://registry.npmjs.org/vue-types/-/vue-types-3.0.1.tgz#20e9baae8673de8093d0a989234695d08d544be0" | 8323 | resolved "https://registry.npmjs.org/vue-types/-/vue-types-3.0.1.tgz#20e9baae8673de8093d0a989234695d08d544be0" |
8324 | integrity sha512-UbvbzPu8DNzZRfMB1RDTFKBB6seMm80scMFdP+GkKaw00EugC3cjq9AtlS4y258vDkpAe9HfqbRO4cp63qVHXQ== | 8324 | integrity sha512-UbvbzPu8DNzZRfMB1RDTFKBB6seMm80scMFdP+GkKaw00EugC3cjq9AtlS4y258vDkpAe9HfqbRO4cp63qVHXQ== |