@king-design/intact 3.1.6 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/config/index.spec.ts +3 -3
- package/components/layout/aside.vdt +1 -1
- package/components/layout/demos/basic.md +1 -1
- package/components/layout/demos/fix.md +1 -1
- package/components/layout/demos/theme.md +2 -3
- package/components/layout/index.md +1 -1
- package/components/layout/styles.ts +9 -20
- package/components/menu/demos/collapse.md +4 -1
- package/components/menu/demos/showCollapseArrow.md +93 -0
- package/components/menu/demos/size.md +0 -1
- package/components/menu/demos/theme.md +0 -1
- package/components/menu/index.md +2 -1
- package/components/menu/index.spec.ts +41 -20
- package/components/menu/index.ts +2 -1
- package/components/menu/item.vdt +3 -2
- package/components/menu/menu.ts +10 -0
- package/components/menu/menu.vdt +12 -3
- package/components/menu/styles.ts +195 -88
- package/components/menu/title.ts +12 -0
- package/components/menu/title.vdt +25 -0
- package/components/radio/styles.ts +1 -1
- package/components/select/demos/searchable.md +2 -2
- package/components/select/index.spec.ts +1 -1
- package/components/select/option.vdt +1 -0
- package/components/select/select.ts +4 -1
- package/components/table/column.vdt +5 -3
- package/components/table/demos/sort.md +1 -0
- package/components/table/useSortable.ts +8 -2
- package/es/components/config/index.spec.js +22 -14
- package/es/components/layout/aside.vdt.js +1 -1
- package/es/components/layout/styles.js +2 -17
- package/es/components/menu/index.d.ts +1 -0
- package/es/components/menu/index.js +2 -1
- package/es/components/menu/index.spec.js +59 -28
- package/es/components/menu/item.vdt.js +3 -3
- package/es/components/menu/menu.d.ts +2 -0
- package/es/components/menu/menu.js +12 -1
- package/es/components/menu/menu.vdt.js +9 -4
- package/es/components/menu/styles.d.ts +15 -12
- package/es/components/menu/styles.js +38 -38
- package/es/components/menu/title.d.ts +7 -0
- package/es/components/menu/title.js +22 -0
- package/es/components/menu/title.vdt.js +25 -0
- package/es/components/radio/styles.js +1 -1
- package/es/components/select/index.spec.js +1 -1
- package/es/components/select/option.vdt.js +1 -0
- package/es/components/select/select.js +4 -1
- package/es/components/table/column.vdt.js +6 -6
- package/es/components/table/useSortable.d.ts +7 -3
- package/es/components/table/useSortable.js +5 -1
- package/es/index.d.ts +2 -2
- package/es/index.js +2 -2
- package/es/site/data/components/layout/demos/basic/react.js +2 -2
- package/es/site/data/components/layout/demos/fix/react.js +2 -2
- package/es/site/data/components/layout/demos/theme/index.js +1 -1
- package/es/site/data/components/layout/demos/theme/react.js +4 -6
- package/es/site/data/components/menu/demos/collapse/react.js +12 -2
- package/es/site/data/components/menu/demos/showCollapseArrow/index.d.ts +10 -0
- package/es/site/data/components/menu/demos/showCollapseArrow/index.js +23 -0
- package/es/site/data/components/menu/demos/showCollapseArrow/react.d.ts +10 -0
- package/es/site/data/components/menu/demos/showCollapseArrow/react.js +117 -0
- package/es/site/data/components/menu/demos/size/react.js +1 -3
- package/es/site/data/components/menu/demos/theme/react.js +1 -3
- package/es/site/data/components/select/demos/searchable/react.js +4 -2
- package/es/site/data/components/table/demos/sort/react.js +2 -1
- package/es/styles/theme.js +1 -2
- package/index.ts +2 -2
- package/package.json +2 -2
- package/styles/theme.ts +1 -2
|
@@ -4,9 +4,9 @@ import { ConfigProvider } from '.';
|
|
|
4
4
|
import { Button, ButtonGroup } from '../button';
|
|
5
5
|
|
|
6
6
|
describe('Config', () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
afterEach(async () => {
|
|
8
|
+
unmount();
|
|
9
|
+
});
|
|
10
10
|
|
|
11
11
|
it('should change classname prefix', async function() {
|
|
12
12
|
class Demo extends Component<{k: string}> {
|
|
@@ -22,7 +22,7 @@ const classNameObj = {
|
|
|
22
22
|
[`${k}-layout-aside`]: true,
|
|
23
23
|
[`${k}-collapsed`]: collapse,
|
|
24
24
|
[`${k}-fixed`]: fixed,
|
|
25
|
-
[`${k}-${theme}`]: true,
|
|
25
|
+
[`${k}-${theme === 'dark' ? 'dark' : 'light'}`]: true,
|
|
26
26
|
[className]: className,
|
|
27
27
|
[makeAsideStyles(k)]: true,
|
|
28
28
|
};
|
|
@@ -62,7 +62,7 @@ import {Breadcrumb, BreadcrumbItem} from 'kpc';
|
|
|
62
62
|
</MenuItem>
|
|
63
63
|
<MenuItem key="2" disabled><Icon class="ion-star" />menu 2</MenuItem>
|
|
64
64
|
<MenuItem key="3">
|
|
65
|
-
<
|
|
65
|
+
<Icon class="ion-heart" />menu 3
|
|
66
66
|
<Menu>
|
|
67
67
|
<MenuItem key="3-1">sub menu 1</MenuItem>
|
|
68
68
|
<MenuItem key="3-2">sub menu 2</MenuItem>
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
</MenuItem>
|
|
58
58
|
<MenuItem key="2" disabled><Icon class="ion-star" />menu 2</MenuItem>
|
|
59
59
|
<MenuItem key="3">
|
|
60
|
-
<
|
|
60
|
+
<Icon class="ion-heart" />menu 3
|
|
61
61
|
<Menu>
|
|
62
62
|
<MenuItem key="3-1">sub menu 1</MenuItem>
|
|
63
63
|
<MenuItem key="3-2">sub menu 2</MenuItem>
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
</MenuItem>
|
|
58
58
|
<MenuItem key="2" disabled><Icon class="ion-star" />menu 2</MenuItem>
|
|
59
59
|
<MenuItem key="3">
|
|
60
|
-
<
|
|
60
|
+
<Icon class="ion-heart" />menu 3
|
|
61
61
|
<Menu>
|
|
62
62
|
<MenuItem key="3-1">sub menu 1</MenuItem>
|
|
63
63
|
<MenuItem key="3-2">sub menu 2</MenuItem>
|
|
@@ -76,7 +76,6 @@ import {
|
|
|
76
76
|
切换主题:<ButtonGroup checkType="radio" v-model="theme">
|
|
77
77
|
<Button value="light">light</Button>
|
|
78
78
|
<Button value="dark">dark</Button>
|
|
79
|
-
<Button value="white">white</Button>
|
|
80
79
|
</ButtonGroup>
|
|
81
80
|
</Body>
|
|
82
81
|
</Layout>
|
|
@@ -105,7 +104,7 @@ export default class extends Component {
|
|
|
105
104
|
return {
|
|
106
105
|
expandedKeys: [],
|
|
107
106
|
selectedKey: '3-1',
|
|
108
|
-
theme: '
|
|
107
|
+
theme: 'light' as MenuProps['theme'],
|
|
109
108
|
};
|
|
110
109
|
}
|
|
111
110
|
}
|
|
@@ -12,7 +12,7 @@ sidebar: doc
|
|
|
12
12
|
| 属性 | 说明 | 类型 | 默认值 |
|
|
13
13
|
| --- | --- | --- | --- |
|
|
14
14
|
| fixed | 是否固定头部 | `boolean` | `false` |
|
|
15
|
-
| theme | 主题颜色 | `"dark"` | `"light"` | `"white"` | `"dark"` |
|
|
15
|
+
| theme | 主题颜色 | `"dark"` | `"light"` | `"white@deprecated"` | `"dark"` |
|
|
16
16
|
| height | 高度 | `string` | `number` | `"64px"` |
|
|
17
17
|
| blur | 是否高斯模糊背景 | `boolean` | `false` |
|
|
18
18
|
| boxShadow | 是否展示阴影 | `boolean` | `false` |
|
|
@@ -19,11 +19,6 @@ const defaults = {
|
|
|
19
19
|
get bgColor() { return menu.light.bgColor },
|
|
20
20
|
get border() { return menu.light.border },
|
|
21
21
|
},
|
|
22
|
-
white: {
|
|
23
|
-
get color() { return menu.white.item.color },
|
|
24
|
-
get bgColor() { return menu.white.bgColor },
|
|
25
|
-
get border() { return menu.white.border },
|
|
26
|
-
},
|
|
27
22
|
|
|
28
23
|
get collapsedWidth() { return `calc(${getLeft(menu.item.padding)} * 2 + ${menu.icon.width})` },
|
|
29
24
|
footerPadding: '24px 50px',
|
|
@@ -89,20 +84,14 @@ export const makeHeaderStyles = cache(function makeHeaderStyles(k: string) {
|
|
|
89
84
|
box-shadow: ${theme.boxShadow};
|
|
90
85
|
}
|
|
91
86
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
&.${k}-blur {
|
|
101
|
-
background: ${setAlpha(styles.bgColor, 0.1)};
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
`
|
|
105
|
-
})}
|
|
87
|
+
&.${k}-light {
|
|
88
|
+
background: ${layout.light.bgColor};
|
|
89
|
+
color: ${layout.light.color};
|
|
90
|
+
border-bottom: ${layout.light.border};
|
|
91
|
+
&.${k}-blur {
|
|
92
|
+
background: ${setAlpha(layout.light.bgColor, 0.1)};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
106
95
|
`;
|
|
107
96
|
});
|
|
108
97
|
|
|
@@ -115,7 +104,7 @@ export const makeAsideStyles = cache(function makeAsideStyles(k: string) {
|
|
|
115
104
|
color: ${layout.color};
|
|
116
105
|
${themes.map(theme => {
|
|
117
106
|
if (theme === 'dark') return;
|
|
118
|
-
const styles = layout
|
|
107
|
+
const styles = layout.light;
|
|
119
108
|
return css`
|
|
120
109
|
&.${k}-${theme} {
|
|
121
110
|
background: ${styles.bgColor};
|
|
@@ -6,7 +6,7 @@ order: 2
|
|
|
6
6
|
添加`collapse`属性,可以使菜单呈现折叠状态
|
|
7
7
|
|
|
8
8
|
```vdt
|
|
9
|
-
import {Menu, MenuItem, Switch, Icon} from 'kpc';
|
|
9
|
+
import {Menu, MenuItem, MenuTitle, Switch, Icon} from 'kpc';
|
|
10
10
|
|
|
11
11
|
<div>
|
|
12
12
|
<Switch v-model="collapse"
|
|
@@ -48,6 +48,9 @@ import {Menu, MenuItem, Switch, Icon} from 'kpc';
|
|
|
48
48
|
</Menu>
|
|
49
49
|
</MenuItem>
|
|
50
50
|
<MenuItem key="4" to="/"><Icon class="ion-gear-b" />menu 4</MenuItem>
|
|
51
|
+
<MenuTitle><Icon class="ion-cloud" />menu 5</MenuTitle>
|
|
52
|
+
<MenuItem key="5-1"><Icon class="ion-stats-bars" />sub menu 1</MenuItem>
|
|
53
|
+
<MenuItem key="5-2"><Icon class="ion-upload" />sub menu 2</MenuItem>
|
|
51
54
|
</Menu>
|
|
52
55
|
</div>
|
|
53
56
|
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 折叠按钮
|
|
3
|
+
order: 6
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`showCollapseArrow`定义是否展示折叠按钮,`MenuTitle`定义菜单标题项。
|
|
7
|
+
|
|
8
|
+
```vdt
|
|
9
|
+
import {Menu, MenuItem, Icon, MenuTitle, Switch, ButtonGroup, Button} from 'kpc';
|
|
10
|
+
<div>
|
|
11
|
+
<ButtonGroup checkType="radio"
|
|
12
|
+
v-model="theme"
|
|
13
|
+
>
|
|
14
|
+
<Button value="light">light</Button>
|
|
15
|
+
<Button value="dark">dark</Button>
|
|
16
|
+
</ButtonGroup>
|
|
17
|
+
<Switch v-model="showCollapseArrow"
|
|
18
|
+
on="展示折叠按钮"
|
|
19
|
+
off="隐藏折叠按钮"
|
|
20
|
+
width="110"
|
|
21
|
+
trueValue={true}
|
|
22
|
+
falseValue={false}
|
|
23
|
+
/>
|
|
24
|
+
<ButtonGroup v-model="size"
|
|
25
|
+
checkType="radio"
|
|
26
|
+
>
|
|
27
|
+
<Button value="large">large</Button>
|
|
28
|
+
<Button value="default">default</Button>
|
|
29
|
+
<Button value="small">small</Button>
|
|
30
|
+
</ButtonGroup>
|
|
31
|
+
<br /><br />
|
|
32
|
+
<Menu
|
|
33
|
+
v-model:expandedKeys="expandedKeys"
|
|
34
|
+
v-model:selectedKey="selectedKey"
|
|
35
|
+
theme={this.get('theme')}
|
|
36
|
+
size={this.get('size')}
|
|
37
|
+
showCollapseArrow={this.get('showCollapseArrow')}
|
|
38
|
+
>
|
|
39
|
+
<b:header>
|
|
40
|
+
自定义Header
|
|
41
|
+
</b:header>
|
|
42
|
+
<MenuItem key="0">menu 0</MenuItem>
|
|
43
|
+
<MenuTitle>title 1</MenuTitle>
|
|
44
|
+
<MenuItem key="1">menu 1</MenuItem>
|
|
45
|
+
<MenuItem key="2">menu 2</MenuItem>
|
|
46
|
+
<MenuItem key="3">menu 3</MenuItem>
|
|
47
|
+
<MenuTitle>title 2</MenuTitle>
|
|
48
|
+
<MenuItem key="4">menu 1</MenuItem>
|
|
49
|
+
<MenuItem key="5" disabled>menu 2</MenuItem>
|
|
50
|
+
<MenuItem key="6">
|
|
51
|
+
sub menu 6
|
|
52
|
+
<Menu>
|
|
53
|
+
<MenuItem key="6-1">sub menu 1</MenuItem>
|
|
54
|
+
<MenuItem key="6-2">sub menu 2</MenuItem>
|
|
55
|
+
<MenuItem key="6-3" disabled>sub menu 3</MenuItem>
|
|
56
|
+
<MenuItem key="6-4">
|
|
57
|
+
sub menu 7
|
|
58
|
+
<Menu>
|
|
59
|
+
<MenuItem key="6-7-1">Option 1</MenuItem>
|
|
60
|
+
<MenuItem key="6-7-2">Option 2</MenuItem>
|
|
61
|
+
</Menu>
|
|
62
|
+
</MenuItem>
|
|
63
|
+
</Menu>
|
|
64
|
+
</MenuItem>
|
|
65
|
+
<MenuItem key="8" to="/">menu 8</MenuItem>
|
|
66
|
+
</Menu>
|
|
67
|
+
</div>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```styl
|
|
71
|
+
.k-switch
|
|
72
|
+
margin 0 16px
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import type {MenuProps} from 'kpc';
|
|
77
|
+
|
|
78
|
+
interface Props extends MenuProps { }
|
|
79
|
+
|
|
80
|
+
export default class extends Component<Props> {
|
|
81
|
+
static template = template;
|
|
82
|
+
|
|
83
|
+
static defaults() {
|
|
84
|
+
return {
|
|
85
|
+
expandedKeys: [],
|
|
86
|
+
selectedKey: '2',
|
|
87
|
+
size: 'default',
|
|
88
|
+
theme: 'light',
|
|
89
|
+
showCollapseArrow: false
|
|
90
|
+
} as MenuProps;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
@@ -21,7 +21,6 @@ import {Menu, MenuItem, Switch, ButtonGroup, Button, Icon} from 'kpc';
|
|
|
21
21
|
>
|
|
22
22
|
<Button value="light">light</Button>
|
|
23
23
|
<Button value="dark">dark</Button>
|
|
24
|
-
<Button value="white">white</Button>
|
|
25
24
|
</ButtonGroup>
|
|
26
25
|
<Switch v-model="type"
|
|
27
26
|
on="horizontal" off="vertical"
|
|
@@ -12,7 +12,6 @@ import {ButtonGroup, Button, Menu, MenuItem, Icon} from 'kpc';
|
|
|
12
12
|
<ButtonGroup checkType="radio" v-model="theme">
|
|
13
13
|
<Button value="light">light</Button>
|
|
14
14
|
<Button value="dark">dark</Button>
|
|
15
|
-
<Button value="white">white</Button>
|
|
16
15
|
</ButtonGroup>
|
|
17
16
|
<br /><br />
|
|
18
17
|
<Menu v-model:expandedKeys="expandedKeys" theme={this.get('theme')}>
|
package/components/menu/index.md
CHANGED
|
@@ -13,12 +13,13 @@ sidebar: doc
|
|
|
13
13
|
| --- | --- | --- | --- |
|
|
14
14
|
| expandedKeys | 定义菜单展开项 | <code>(string | number)[]</code> | `[]` |
|
|
15
15
|
| selectedKey | 定义菜单选中项 | <code>string | number</code> | `undefined` |
|
|
16
|
-
| theme | 定义菜单主题 | `"light"` | `"dark"` | `"white"` | `"dark"` |
|
|
16
|
+
| theme | 定义菜单主题 | `"light"` | `"dark"` | `"white@deprecated"` | `"dark"` |
|
|
17
17
|
| collapse | 菜单是否折叠 | `boolean` | `false` |
|
|
18
18
|
| type | 定义菜单排列方式:垂直,水平 | `"vertical"` | `"horizontal"` | `"vertical"` |
|
|
19
19
|
| size | 定义菜单尺寸 | `"large"` | `"default"` | `"small"` | `"default"` |
|
|
20
20
|
| accordion | 是否每次只能展开一项 | `boolean` | `false` |
|
|
21
21
|
| dot | 是否给菜单项前面添加圆点 | `boolean` | `false` |
|
|
22
|
+
| showCollapseArrow | 是否展示折叠按钮 | `boolean` | `false` |
|
|
22
23
|
|
|
23
24
|
## MenuItem
|
|
24
25
|
|
|
@@ -2,6 +2,7 @@ import {Component} from 'intact';
|
|
|
2
2
|
import BasicDemo from '~/components/menu/demos/basic';
|
|
3
3
|
import CollapseDemo from '~/components/menu/demos/collapse';
|
|
4
4
|
import AccordionDemo from '~/components/menu/demos/accordion';
|
|
5
|
+
import CollapseArrowDemo from '~/components/menu/demos/showCollapseArrow';
|
|
5
6
|
import {mount, unmount, dispatchEvent, getElement, wait} from '../../test/utils';
|
|
6
7
|
import {Menu, MenuItem} from './';
|
|
7
8
|
|
|
@@ -14,7 +15,7 @@ describe('Menu', () => {
|
|
|
14
15
|
await wait();
|
|
15
16
|
|
|
16
17
|
// shrink
|
|
17
|
-
const title = element.querySelector('.k-expanded .k-menu-title') as HTMLElement;
|
|
18
|
+
const title = element.querySelector('.k-expanded .k-menu-item-title') as HTMLElement;
|
|
18
19
|
title.click();
|
|
19
20
|
await wait(500);
|
|
20
21
|
expect(element.outerHTML).to.matchSnapshot();
|
|
@@ -34,7 +35,7 @@ describe('Menu', () => {
|
|
|
34
35
|
|
|
35
36
|
expect(element.innerHTML).to.matchSnapshot();
|
|
36
37
|
|
|
37
|
-
const [title, disabledTitle] = element.querySelectorAll<HTMLElement>('.k-menu-title');
|
|
38
|
+
const [title, disabledTitle] = element.querySelectorAll<HTMLElement>('.k-menu-body .k-menu-item-title');
|
|
38
39
|
title.click();
|
|
39
40
|
await wait();
|
|
40
41
|
expect(element.outerHTML).to.matchSnapshot();
|
|
@@ -44,7 +45,7 @@ describe('Menu', () => {
|
|
|
44
45
|
expect(element.outerHTML).to.matchSnapshot();
|
|
45
46
|
expect(instance.get('selectedKey')).to.eql('1');
|
|
46
47
|
|
|
47
|
-
const subTitle = element.querySelector('.k-expanded .k-menu .k-menu-title') as HTMLElement;
|
|
48
|
+
const subTitle = element.querySelector('.k-expanded .k-menu .k-menu-body .k-menu-item-title') as HTMLElement;
|
|
48
49
|
subTitle.click();
|
|
49
50
|
await wait();
|
|
50
51
|
expect(element.outerHTML).to.matchSnapshot();
|
|
@@ -64,13 +65,13 @@ describe('Menu', () => {
|
|
|
64
65
|
expect(element.outerHTML).to.matchSnapshot();
|
|
65
66
|
|
|
66
67
|
// show sub menu
|
|
67
|
-
const title = element.querySelector('.k-menu-item:nth-child(3) .k-menu-title') as HTMLElement;
|
|
68
|
+
const title = element.querySelector('.k-menu-body .k-menu-item:nth-child(3) .k-menu-item-title') as HTMLElement;
|
|
68
69
|
dispatchEvent(title, 'mouseenter');
|
|
69
70
|
await wait();
|
|
70
71
|
const dropdown = getElement('.k-dropdown-menu.k-menu')!;
|
|
71
72
|
expect(dropdown.innerHTML).to.matchSnapshot();
|
|
72
73
|
|
|
73
|
-
dispatchEvent(dropdown.querySelector<HTMLElement>('.k-menu-item:nth-child(4) .k-menu-title')!, 'mouseenter');
|
|
74
|
+
dispatchEvent(dropdown.querySelector<HTMLElement>('.k-menu-body .k-menu-item:nth-child(4) .k-menu-item-title')!, 'mouseenter');
|
|
74
75
|
await wait();
|
|
75
76
|
expect(getElement('.k-dropdown-menu.k-menu')!.innerHTML).to.matchSnapshot();
|
|
76
77
|
|
|
@@ -84,16 +85,16 @@ describe('Menu', () => {
|
|
|
84
85
|
const [instance, element] = mount(CollapseDemo);
|
|
85
86
|
|
|
86
87
|
instance.set('collapse', true);
|
|
87
|
-
let title = element.querySelector('.k-menu-title') as HTMLElement;
|
|
88
|
+
let title = element.querySelector('.k-menu-body .k-menu-item-title') as HTMLElement;
|
|
88
89
|
title.click();
|
|
89
90
|
await wait();
|
|
90
91
|
expect(element.outerHTML).to.matchSnapshot();
|
|
91
92
|
|
|
92
|
-
title = element.querySelector('.k-menu-item:nth-child(3) .k-menu-title') as HTMLElement;
|
|
93
|
+
title = element.querySelector('.k-menu-body .k-menu-item:nth-child(3) .k-menu-item-title') as HTMLElement;
|
|
93
94
|
dispatchEvent(title, 'mouseenter');
|
|
94
95
|
await wait();
|
|
95
96
|
const dropdown = getElement('.k-dropdown-menu.k-menu')!;
|
|
96
|
-
dropdown.querySelector<HTMLElement>('.k-menu-title')!.click();
|
|
97
|
+
dropdown.querySelector<HTMLElement>('.k-menu-body .k-menu-item-title')!.click();
|
|
97
98
|
await wait();
|
|
98
99
|
expect(dropdown.innerHTML).to.matchSnapshot();
|
|
99
100
|
|
|
@@ -104,29 +105,31 @@ describe('Menu', () => {
|
|
|
104
105
|
|
|
105
106
|
it('accordion', async () => {
|
|
106
107
|
const [instance, element] = mount(AccordionDemo);
|
|
107
|
-
|
|
108
|
-
const menu3 = element.children[2] as HTMLElement;
|
|
109
|
-
const
|
|
108
|
+
|
|
109
|
+
// const menu3 = element.children[2] as HTMLElement;
|
|
110
|
+
const rootElement = element.firstElementChild!;
|
|
111
|
+
const menu3 = rootElement.children[2] as HTMLElement;
|
|
112
|
+
const subMenu1 = menu3.querySelector<HTMLElement>('.k-menu .k-menu-body')!.firstElementChild!.querySelector('.k-menu-item-title') as HTMLElement;
|
|
110
113
|
subMenu1.click();
|
|
111
114
|
await wait();
|
|
112
|
-
expect(
|
|
115
|
+
expect(rootElement.innerHTML).to.matchSnapshot();
|
|
113
116
|
expect(instance.get('expandedKeys')).to.eql(['3', '3-1']);
|
|
114
117
|
|
|
115
|
-
const subMenu4 = menu3.querySelector<HTMLElement>('.k-menu')!.lastElementChild!.querySelector('.k-menu-title') as HTMLElement;
|
|
118
|
+
const subMenu4 = menu3.querySelector<HTMLElement>('.k-menu .k-menu-body')!.lastElementChild!.querySelector('.k-menu-item-title') as HTMLElement;
|
|
116
119
|
subMenu4.click();
|
|
117
120
|
await wait();
|
|
118
|
-
expect(
|
|
121
|
+
expect(rootElement.innerHTML).to.matchSnapshot();
|
|
119
122
|
expect(instance.get('expandedKeys')).to.eql(['3', '3-4']);
|
|
120
|
-
|
|
121
|
-
const menu1 =
|
|
123
|
+
|
|
124
|
+
const menu1 = rootElement.firstElementChild!.querySelector('.k-menu-item-title') as HTMLElement;
|
|
122
125
|
menu1.click();
|
|
123
126
|
await wait();
|
|
124
|
-
expect(
|
|
127
|
+
expect(rootElement.innerHTML).to.matchSnapshot();
|
|
125
128
|
expect(instance.get('expandedKeys')).to.eql(['3-4', '1']);
|
|
126
129
|
|
|
127
|
-
menu3.querySelector<HTMLElement>('.k-menu-title')!.click();
|
|
130
|
+
menu3.querySelector<HTMLElement>('.k-menu-item-title')!.click();
|
|
128
131
|
await wait();
|
|
129
|
-
expect(
|
|
132
|
+
expect(rootElement.innerHTML).to.matchSnapshot();
|
|
130
133
|
expect(instance.get('expandedKeys')).to.eql(['3-4', '3']);
|
|
131
134
|
});
|
|
132
135
|
|
|
@@ -168,5 +171,23 @@ describe('Menu', () => {
|
|
|
168
171
|
const expandedKeys = instance.get('expandedKeys') as Array<string>;
|
|
169
172
|
expect(expandedKeys.includes('1')).to.be.true;
|
|
170
173
|
|
|
171
|
-
})
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('collapsed arrow', async () => {
|
|
177
|
+
const [instance, element] = mount(CollapseArrowDemo);
|
|
178
|
+
|
|
179
|
+
instance.set('showCollapseArrow', true);
|
|
180
|
+
await wait();
|
|
181
|
+
expect(element.outerHTML).to.matchSnapshot();
|
|
182
|
+
|
|
183
|
+
let arrow = element.querySelector('.k-menu .k-menu-arrow-box') as HTMLElement;
|
|
184
|
+
arrow.click();
|
|
185
|
+
await wait(500);
|
|
186
|
+
expect(element.outerHTML).to.matchSnapshot();
|
|
187
|
+
|
|
188
|
+
instance.set('showCollapseArrow', false);
|
|
189
|
+
await wait();
|
|
190
|
+
expect(element.outerHTML).to.matchSnapshot();
|
|
191
|
+
expect(getElement('.k-menu-arrow-box')).to.be.undefined;
|
|
192
|
+
});
|
|
172
193
|
});
|
package/components/menu/index.ts
CHANGED
package/components/menu/item.vdt
CHANGED
|
@@ -32,12 +32,12 @@ const classNameObj = {
|
|
|
32
32
|
|
|
33
33
|
const showDot = isTopItem && !iconVNode && isNullOrUndefined(dot) ? rootDot : dot;
|
|
34
34
|
const title = (children) => (
|
|
35
|
-
<div class={{[`${k}-menu-title`]: true, [makeTitleStyles(k)]: true}}
|
|
35
|
+
<div class={{[`${k}-menu-item-title`]: true, [makeTitleStyles(k)]: true}}
|
|
36
36
|
ev-click={this.onClick.bind(this, subMenuVNode)}
|
|
37
37
|
>
|
|
38
38
|
<Icon class={`${k}-menu-dot ion-record`} v-if={showDot} />
|
|
39
39
|
<div class={`${k}-menu-name`}>{children}</div>
|
|
40
|
-
<Icon class={`${k}-menu-arrow
|
|
40
|
+
<Icon class={`${k}-menu-item-arrow ion-arrow-down-b`} v-if={subMenuVNode} />
|
|
41
41
|
</div>
|
|
42
42
|
);
|
|
43
43
|
|
|
@@ -56,6 +56,7 @@ const title = (children) => (
|
|
|
56
56
|
const className = _$cn({
|
|
57
57
|
[_classname]: true,
|
|
58
58
|
[subMenuVNode.className]: subMenuVNode.className,
|
|
59
|
+
[`${k}-sub-menu`]: true,
|
|
59
60
|
});
|
|
60
61
|
const clonedVNode = directClone(subMenuVNode);
|
|
61
62
|
clonedVNode.props = { ...clonedVNode.props, className, _paddingLeft };
|
package/components/menu/menu.ts
CHANGED
|
@@ -2,12 +2,14 @@ import {Component, TypeDefs, provide, inject, Key} from 'intact';
|
|
|
2
2
|
import template from './menu.vdt';
|
|
3
3
|
import {useHighlight} from './useHighlight';
|
|
4
4
|
import { useConfigContext } from '../config';
|
|
5
|
+
import {bind} from '../utils';
|
|
5
6
|
|
|
6
7
|
export interface MenuProps<K extends Key = Key> {
|
|
7
8
|
expandedKeys?: K[]
|
|
8
9
|
selectedKey?: K
|
|
9
10
|
theme?: 'light' | 'dark' | 'white'
|
|
10
11
|
collapse?: boolean
|
|
12
|
+
showCollapseArrow?: boolean
|
|
11
13
|
type?: 'vertical' | 'horizontal'
|
|
12
14
|
size?: 'large' | 'default' | 'small'
|
|
13
15
|
accordion?: boolean
|
|
@@ -27,6 +29,7 @@ const typeDefs: Required<TypeDefs<MenuProps>> = {
|
|
|
27
29
|
selectedKey: [String, Number],
|
|
28
30
|
theme: ['light', 'dark', 'white'],
|
|
29
31
|
collapse: Boolean,
|
|
32
|
+
showCollapseArrow: Boolean,
|
|
30
33
|
type: ['vertical', 'horizontal'],
|
|
31
34
|
size: ['large', 'default', 'small'],
|
|
32
35
|
accordion: Boolean,
|
|
@@ -65,4 +68,11 @@ export class Menu<K extends Key = Key> extends Component<MenuProps<K>, MenuEvent
|
|
|
65
68
|
this.highlight = useHighlight();
|
|
66
69
|
}
|
|
67
70
|
}
|
|
71
|
+
|
|
72
|
+
@bind
|
|
73
|
+
public onClick(e: MouseEvent) {
|
|
74
|
+
const {collapse} = this.get();
|
|
75
|
+
this.set({collapse: !collapse});
|
|
76
|
+
}
|
|
77
|
+
|
|
68
78
|
}
|
package/components/menu/menu.vdt
CHANGED
|
@@ -5,16 +5,17 @@ import {makeMenuStyles, makeTitleStyles} from './styles';
|
|
|
5
5
|
import {Icon} from '../icon';
|
|
6
6
|
|
|
7
7
|
const {children, className} = this.get();
|
|
8
|
-
const {collapse, theme, type, size} = (this.rootMenu || this).get();
|
|
8
|
+
const {collapse, theme, type, size, showCollapseArrow} = (this.rootMenu || this).get();
|
|
9
9
|
const isRootMenu = !this.rootMenu;
|
|
10
10
|
const isDropdownMenu = !isRootMenu && isDropdown(this.rootMenu);
|
|
11
11
|
const { k } = this.config;
|
|
12
12
|
const classNameObj = {
|
|
13
13
|
[`${k}-menu`]: true,
|
|
14
14
|
[className]: className,
|
|
15
|
-
[`${k}-${theme}`]: (isRootMenu || isDropdownMenu) && theme,
|
|
15
|
+
[`${k}-${theme === 'dark' ? 'dark' : 'light'}`]: (isRootMenu || isDropdownMenu) && theme,
|
|
16
16
|
[`${k}-${size}`]: isRootMenu && size !== 'default',
|
|
17
17
|
[`${k}-collapsed`]: isRootMenu && collapse,
|
|
18
|
+
[`${k}-collapsed-arrow`]: isRootMenu && showCollapseArrow && collapse,
|
|
18
19
|
[`${k}-${type}`]: isRootMenu && type,
|
|
19
20
|
[makeMenuStyles(k)]: true,
|
|
20
21
|
};
|
|
@@ -33,7 +34,15 @@ const content = (
|
|
|
33
34
|
{findChildren(header, vNode => isComponentVNode(vNode, Icon))}
|
|
34
35
|
</template>
|
|
35
36
|
</div>
|
|
36
|
-
{
|
|
37
|
+
<div v-if={isRootMenu && showCollapseArrow && type !== 'horizontal'}
|
|
38
|
+
class={`${k}-menu-arrow-box`}
|
|
39
|
+
ev-click={this.onClick.bind(this)}
|
|
40
|
+
>
|
|
41
|
+
<Icon class={`${k}-menu-arrow ion-arrow-left-b`} />
|
|
42
|
+
</div>
|
|
43
|
+
<div class={`${k}-menu-body`}>
|
|
44
|
+
{children}
|
|
45
|
+
</div>
|
|
37
46
|
</template>
|
|
38
47
|
);
|
|
39
48
|
|