Skip to content

Commit 4b35491

Browse files
committed
fix :merge dev
2 parents 69e1fb9 + 93f7035 commit 4b35491

File tree

173 files changed

+5712
-1387
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

173 files changed

+5712
-1387
lines changed

packages/devui-vue/.eslintrc.js

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
11
module.exports = {
2-
parser: 'vue-eslint-parser',
2+
root: true,
3+
parser: '@typescript-eslint/parser',
34
parserOptions: {
4-
parser: '@typescript-eslint/parser',
55
sourceType: 'module',
66
ecmaVersion: 6,
77
ecmaFeatures: {
88
jsx: true,
9-
tsx: true,
10-
},
9+
tsx: true
10+
}
1111
},
1212
env: {
1313
browser: true,
1414
node: true,
1515
jest: true,
16-
es6: true,
16+
es6: true
1717
},
1818
plugins: ['@typescript-eslint'],
1919
extends: [
2020
'plugin:@typescript-eslint/recommended',
2121
'plugin:vue/vue3-recommended',
2222
'plugin:import/recommended',
23-
'plugin:import/typescript',
23+
'plugin:import/typescript'
2424
],
2525
rules: {
26-
quotes: [
27-
'error',
28-
'single',
29-
{ avoidEscape: true, allowTemplateLiterals: true },
30-
],
26+
quotes: ['error', 'single', { avoidEscape: true, allowTemplateLiterals: true }],
3127
'no-undef': 2,
3228
'vue/max-attributes-per-line': 'off',
3329
'vue/no-multiple-template-root': 'off',
@@ -38,13 +34,15 @@ module.exports = {
3834
{
3935
multiline: {
4036
delimiter: 'none',
41-
requireLast: false,
37+
requireLast: false
4238
},
4339
singleline: {
4440
delimiter: 'semi',
45-
requireLast: true,
46-
},
47-
},
41+
requireLast: true
42+
}
43+
}
4844
],
49-
},
45+
'no-unused-vars': 'off',
46+
'@typescript-eslint/no-unused-vars': ['error']
47+
}
5048
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/sh
2+
. "$(dirname "$0")/_/husky.sh"
3+
4+
cd ./packages/devui-vue && npx commitlint --edit $1
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/sh
2+
. "$(dirname "$0")/_/husky.sh"
3+
4+
cd ./packages/devui-vue && npx @ls-lint/ls-lint && npx lint-staged
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const path = require('path')
2+
const fs = require('fs')
3+
const fse = require('fs-extra')
4+
const logger = require('../shared/logger')
5+
6+
const entryDir = path.resolve(__dirname, '../../devui')
7+
const outputDir = path.resolve(__dirname, '../../build')
8+
9+
function generateIndexDts(buildDir) {
10+
const fileStr = `import { App } from 'vue';
11+
declare function install(app: App): void
12+
declare const _default: {
13+
install: typeof install;
14+
version: string;
15+
};
16+
export default _default;`
17+
fse.outputFileSync(path.resolve(buildDir, 'index.d.ts'), fileStr, 'utf8')
18+
}
19+
20+
exports.generateDts = () => {
21+
generateIndexDts(outputDir)
22+
23+
const components = fs.readdirSync(entryDir).filter(name => {
24+
const componentDir = path.resolve(entryDir, name)
25+
const isDir = fs.lstatSync(componentDir).isDirectory()
26+
return isDir && fs.readdirSync(componentDir).includes('index.ts')
27+
})
28+
const srcDts = path.resolve(outputDir, 'index.d.ts')
29+
30+
for(const name of components) {
31+
const destDts = path.resolve(outputDir, `${name}/index.d.ts`)
32+
fs.copyFile(srcDts, destDts, (err) => {
33+
if (err) {
34+
logger.error(`拷贝组件${name}的ts类型文件失败!`)
35+
}
36+
})
37+
}
38+
}

packages/devui-vue/devui-cli/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const { Command } = require('commander')
33
const { create, validateCreateType } = require('./commands/create')
44
const { build } = require('./commands/build')
55
const { generateTheme } = require('./commands/generate-theme')
6+
const { generateDts } = require('./commands/generate-dts')
67
const { VERSION, CREATE_SUPPORT_TYPES } = require('./shared/constant')
78

89
const program = new Command()
@@ -18,11 +19,18 @@ program
1819
program
1920
.command('build')
2021
.description('打包组件库')
22+
.hook('postAction', generateTheme)
23+
.hook('postAction', generateDts)
2124
.action(build)
2225

2326
program
2427
.command('generate:theme')
2528
.description('生成主题变量文件')
2629
.action(generateTheme)
2730

31+
program
32+
.command('generate:dts')
33+
.description('生成ts类型文件')
34+
.action(generateDts)
35+
2836
program.parse().version(VERSION)
Lines changed: 61 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,84 @@
1-
import { defineComponent } from 'vue'
2-
import { AccordionMenuItem } from './accordion.type'
1+
import { defineComponent, toRefs } from 'vue'
2+
import type { AccordionMenuItem } from './accordion.type'
3+
import DAccordionMenu from './accordion-menu'
4+
import { accordionProps } from './accordion-types'
5+
36

47
export default defineComponent({
58
name: 'DAccordionList',
69
inheritAttrs: false,
10+
components: {
11+
DAccordionMenu
12+
},
713
props: {
8-
data: {
14+
data: {
915
type: Array as () => Array<AccordionMenuItem>,
1016
default: null
1117
},
1218
deepth: {
1319
type: Number,
1420
default: 0
1521
},
16-
parent: {
22+
parent: {
1723
type: Object as () => AccordionMenuItem,
1824
default: null
1925
},
2026
innerListTemplate: Boolean,
27+
...accordionProps,
2128
},
22-
setup(props, ctx) {
29+
setup(props, {attrs, slots}) {
30+
const {
31+
childrenKey,
32+
innerListTemplate,
33+
deepth
34+
} = toRefs(props)
2335
return () => {
24-
return (!props.innerListTemplate || props.deepth === 0) && <ul class="devui-accordion-list" {...ctx.attrs}>
25-
{ props.data.map(item => {
26-
return <li class="devui-accordion-item" key={item.title}>
27-
{
28-
// TODO 菜单类型 d-accordion-menu
29-
}
30-
<div class="devui-accordion-menu-item open" title={item.title}>
31-
<div title={item.title} class={`devui-accordion-item-title devui-over-flow-ellipsis open`}>{ item.title }</div>
32-
{
33-
// TODO 子菜单 d-accordion-list
36+
return (
37+
<>
38+
{
39+
!innerListTemplate.value &&
40+
<ul class="devui-accordion-list" {...attrs}>
41+
{props.data.map(item => {
42+
return <li class="devui-accordion-item" key={item.title}>
43+
{/* // TODO 菜单类型 d-accordion-menu */}
44+
{childrenKey !== undefined && <d-accordion-menu item={item} deepth={props.deepth} parent={props.parent} {...accordionProps}></d-accordion-menu>}
45+
{/* <div class="devui-accordion-menu-item open" title={item.title}>
46+
<div title={item.title} class={`devui-accordion-item-title devui-over-flow-ellipsis open`}>{ item.title }</div>
47+
{
48+
// TODO 子菜单 d-accordion-list
49+
}
50+
<div class="devui-accordion-submenu devui-accordion-show-animate" style="opacity: 1; overflow: hidden;">
51+
<ul class="devui-accordion-list">
52+
{ item.children?.map(component => {
53+
return <li class="devui-accordion-item" key={component.title}>
54+
{
55+
// TODO 路由链接 d-accordion-item-routerlink
56+
}
57+
<div class="devui-accordion-item-title devui-over-flow-ellipsis" style="text-indent: 20px;" title={component.title}>
58+
<router-link to={component.link}>
59+
<div class="devui-accordion-splitter" style="left: 30px;"></div>
60+
{ component.title }
61+
{ component.done && <span class="tag-done">已完成</span> }
62+
</router-link>
63+
</div>
64+
</li>
65+
})}
66+
</ul>
67+
</div>
68+
</div> */}
69+
</li>
3470
}
35-
<div class="devui-accordion-submenu devui-accordion-show-animate" style="opacity: 1; overflow: hidden;">
36-
<ul class="devui-accordion-list">
37-
{ item.children.map(component => {
38-
return <li class="devui-accordion-item" key={component.title}>
39-
{
40-
// TODO 路由链接 d-accordion-item-routerlink
41-
}
42-
<div class="devui-accordion-item-title devui-over-flow-ellipsis" style="text-indent: 20px;" title={component.title}>
43-
<router-link to={component.link}>
44-
<div class="devui-accordion-splitter" style="left: 30px;"></div>
45-
{ component.title }
46-
{ component.done && <span class="tag-done">已完成</span> }
47-
</router-link>
48-
</div>
49-
</li>
50-
})}
51-
</ul>
52-
</div>
71+
)}
72+
</ul>
73+
}
74+
{
75+
innerListTemplate.value && deepth.value !== 0 &&
76+
<div>
77+
{slots.default ? slots.innerListTemplate() : ''}
5378
</div>
54-
</li>
55-
}) }
56-
</ul>
79+
}
80+
</>
81+
)
5782
}
5883
}
5984
})
Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,58 @@
1-
import { defineComponent } from 'vue'
1+
import { computed, defineComponent, toRefs } from 'vue'
2+
import { AccordionMenuItem } from './accordion.type'
3+
import DAccordionList from './accordion-list'
4+
import { accordionProps } from './accordion-types'
25

36
export default defineComponent({
47
name: 'DAccordionMenu',
58
props: {
6-
9+
item: Object as () => AccordionMenuItem,
10+
deepth: {
11+
type: Number,
12+
default: 0
13+
},
14+
parent: {
15+
type: Object as () => AccordionMenuItem,
16+
default: null
17+
},
18+
...accordionProps
719
},
8-
setup() {
9-
return () => {
10-
return <li>d-accordion-menu</li>
20+
setup(props) {
21+
const { item, deepth } = toRefs(props)
22+
23+
24+
const menuItemClasses = computed(() => {
25+
return (keyOpen === undefined && props.autoOpenActiveMenu)
26+
? childActived
27+
: keyOpen
28+
})
29+
30+
const keyOpen = computed(() => {
31+
return item?.value[props.openKey];
32+
})
33+
const childActived = computed(() => {
34+
// return props.routerLinkActived || props.hasActiveChildren
35+
})
36+
37+
return () => {
38+
return (
39+
<>
40+
<div
41+
class={["devui-accordion-item-title", "devui-over-flow-ellipsis", item.value.children ? 'open active': '']}
42+
title={item.value.title}
43+
>
44+
{item.value.title}
45+
</div>
46+
<DAccordionList
47+
class="devui-accordion-submenu devui-accordion-show-animate"
48+
style="opacity: 1; overflow: hidden;"
49+
deepth={deepth.value + 1}
50+
data={item.value.children || []}
51+
parent={item.value}
52+
>
53+
</DAccordionList>
54+
</>
55+
)
1156
}
1257
}
1358
})
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { ExtractPropTypes } from "vue";
2+
import { AccordionMenuType } from "./accordion.type";
3+
4+
export const accordionProps = {
5+
data: {
6+
type: Array as () => Array<any> | AccordionMenuType,
7+
default: null,
8+
},
9+
/* Key值定义, 用于自定义数据结构 */
10+
titleKey: { type: String, default: "title" }, // 标题的key,item[titleKey]类型为string,为标题显示内容
11+
loadingKey: { type: String, default: "loading" }, // 子菜单动态加载item[loadingKey]类型为boolean
12+
childrenKey: { type: String, default: "children" }, // 子菜单Key
13+
disabledKey: { type: String, default: "disabled" }, // 是否禁用Key
14+
activeKey: { type: String, default: "active" }, // 菜单是否激活/选中
15+
openKey: { type: String, default: "open" }, // 菜单是否打开
16+
17+
/* 菜单模板 */
18+
menuItemTemplate: { type: String, default: "" }, // 可展开菜单内容条模板
19+
itemTemplate: { type: String, default: "" }, // 可点击菜单内容条模板
20+
21+
menuToggle: {
22+
type: Function as unknown as () => (event: MouseEvent) => void,
23+
default: null,
24+
}, // 可展开菜单展开事件
25+
itemClick: {
26+
type: Function as unknown as () => (event: MouseEvent) => void,
27+
default: null,
28+
}, // 可点击菜单点击事件
29+
activeItemChange: {
30+
type: Function as unknown as () => (event: MouseEvent) => void,
31+
default: null,
32+
},
33+
34+
/** 高级选项和模板 */
35+
restrictOneOpen: { type: Boolean, default: false }, // 限制一级菜单同时只能打开一个
36+
autoOpenActiveMenu: { type: Boolean, default: false }, // 自动展开活跃菜单
37+
showNoContent: { type: Boolean, default: true }, // 没有内容的时候是否显示没有数据
38+
noContentTemplate: { type: String, default: "" }, // 没有内容的时候使用自定义模板
39+
loadingTemplate: { type: String, default: "" }, // 加载中使用自定义模板
40+
innerListTemplate: { type: String, default: "" }, // 可折叠菜单内容完全自定义,用做折叠面板
41+
42+
/* 内置路由/链接/动态判断路由或链接类型 */
43+
linkType: {
44+
type: String as () =>
45+
| "routerLink"
46+
| "hrefLink"
47+
| "dependOnLinkTypeKey"
48+
| ""
49+
| string,
50+
default: "",
51+
},
52+
linkTypeKey: { type: String, default: "linkType" }, // linkType为'dependOnLinkTypeKey'时指定对象linkType定义区
53+
linkKey: { type: String, default: "link" }, // 链接内容的key
54+
linkTargetKey: { type: String, default: "target" }, // 链接目标窗口的key
55+
linkDefaultTarget: { type: String, default: "_self" }, // 不设置target的时候target默认值
56+
57+
accordionType: {
58+
type: String as () => "normal" | "embed",
59+
default: "normal",
60+
},
61+
} as const;
62+
63+
export type AccordionProps = ExtractPropTypes<typeof accordionProps>;

0 commit comments

Comments
 (0)