@king-design/intact 3.1.5 → 3.2.0

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.
Files changed (85) hide show
  1. package/components/config/index.spec.ts +3 -3
  2. package/components/datepicker/index.spec.ts +3 -0
  3. package/components/datepicker/useValue.ts +9 -1
  4. package/components/layout/aside.vdt +1 -1
  5. package/components/layout/demos/basic.md +1 -1
  6. package/components/layout/demos/fix.md +1 -1
  7. package/components/layout/demos/theme.md +2 -3
  8. package/components/layout/index.md +1 -1
  9. package/components/layout/styles.ts +9 -20
  10. package/components/menu/.DS_Store +0 -0
  11. package/components/menu/demos/.DS_Store +0 -0
  12. package/components/menu/demos/collapse.md +4 -1
  13. package/components/menu/demos/showCollapseArrow.md +93 -0
  14. package/components/menu/demos/size.md +0 -1
  15. package/components/menu/demos/theme.md +0 -1
  16. package/components/menu/index.md +2 -1
  17. package/components/menu/index.spec.ts +41 -20
  18. package/components/menu/index.ts +2 -1
  19. package/components/menu/item.vdt +3 -2
  20. package/components/menu/menu.ts +10 -0
  21. package/components/menu/menu.vdt +12 -3
  22. package/components/menu/styles.ts +195 -88
  23. package/components/menu/title.ts +12 -0
  24. package/components/menu/title.vdt +25 -0
  25. package/components/radio/styles.ts +1 -1
  26. package/components/select/demos/searchable.md +2 -2
  27. package/components/select/index.spec.ts +1 -1
  28. package/components/select/option.vdt +1 -0
  29. package/components/select/select.ts +4 -1
  30. package/components/table/column.vdt +5 -3
  31. package/components/table/demos/sort.md +1 -0
  32. package/components/table/useSortable.ts +8 -2
  33. package/es/components/cascader/index.d.ts +45 -0
  34. package/es/components/config/index.spec.js +22 -14
  35. package/es/components/datepicker/index.d.ts +63 -0
  36. package/es/components/datepicker/index.spec.js +10 -5
  37. package/es/components/datepicker/useValue.js +9 -1
  38. package/es/components/diagram/index.d.ts +1 -1
  39. package/es/components/layout/aside.vdt.js +1 -1
  40. package/es/components/layout/styles.js +2 -17
  41. package/es/components/menu/index.d.ts +1 -0
  42. package/es/components/menu/index.js +2 -1
  43. package/es/components/menu/index.spec.js +59 -28
  44. package/es/components/menu/item.vdt.js +3 -3
  45. package/es/components/menu/menu.d.ts +2 -0
  46. package/es/components/menu/menu.js +12 -1
  47. package/es/components/menu/menu.vdt.js +9 -4
  48. package/es/components/menu/styles.d.ts +15 -12
  49. package/es/components/menu/styles.js +38 -38
  50. package/es/components/menu/title.d.ts +7 -0
  51. package/es/components/menu/title.js +22 -0
  52. package/es/components/menu/title.vdt.js +25 -0
  53. package/es/components/radio/styles.js +1 -1
  54. package/es/components/select/index.spec.js +1 -1
  55. package/es/components/select/option.vdt.js +1 -0
  56. package/es/components/select/select.d.ts +33 -0
  57. package/es/components/select/select.js +4 -1
  58. package/es/components/steps/context.d.ts +3 -3
  59. package/es/components/table/column.vdt.js +6 -6
  60. package/es/components/table/useSortable.d.ts +7 -3
  61. package/es/components/table/useSortable.js +5 -1
  62. package/es/components/timepicker/panelPicker.d.ts +54 -0
  63. package/es/components/treeSelect/index.d.ts +28 -0
  64. package/es/index.d.ts +2 -2
  65. package/es/index.js +2 -2
  66. package/es/packages/kpc-react/__tests__/components/drawer.spec.js +4 -4
  67. package/es/site/data/components/layout/demos/basic/react.js +2 -2
  68. package/es/site/data/components/layout/demos/fix/react.js +2 -2
  69. package/es/site/data/components/layout/demos/theme/index.js +1 -1
  70. package/es/site/data/components/layout/demos/theme/react.js +4 -6
  71. package/es/site/data/components/menu/demos/collapse/react.d.ts +1 -1
  72. package/es/site/data/components/menu/demos/collapse/react.js +12 -2
  73. package/es/site/data/components/menu/demos/showCollapseArrow/index.d.ts +10 -0
  74. package/es/site/data/components/menu/demos/showCollapseArrow/index.js +23 -0
  75. package/es/site/data/components/menu/demos/showCollapseArrow/react.d.ts +10 -0
  76. package/es/site/data/components/menu/demos/showCollapseArrow/react.js +117 -0
  77. package/es/site/data/components/menu/demos/size/react.d.ts +1 -1
  78. package/es/site/data/components/menu/demos/size/react.js +1 -3
  79. package/es/site/data/components/menu/demos/theme/react.js +1 -3
  80. package/es/site/data/components/select/demos/searchable/react.js +4 -2
  81. package/es/site/data/components/table/demos/sort/react.js +2 -1
  82. package/es/styles/theme.js +1 -2
  83. package/index.ts +2 -2
  84. package/package.json +2 -3
  85. 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
- // afterEach(async () => {
8
- // unmount();
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}> {
@@ -533,6 +533,9 @@ describe('Datepicker', () => {
533
533
  const first = calendar1.querySelectorAll('.k-calendar-item')[17] as HTMLElement;
534
534
  const second = calendar2.querySelectorAll('.k-calendar-item')[17] as HTMLElement;
535
535
  first.click();
536
+ // should stay at date panel
537
+ await wait();
538
+ expect(calendar1.querySelector('.k-days')).be.exist;
536
539
  second.click();
537
540
  await wait();
538
541
  dispatchEvent(calendar1.querySelector<HTMLElement>('.k-scroll-select-wrapper .k-active')!.nextElementSibling!, 'click');
@@ -75,7 +75,15 @@ export function useValue(
75
75
  setValue(_value, false);
76
76
 
77
77
  if (type === 'datetime') {
78
- panel.changePanel(PanelTypes.Time, flag);
78
+ if (range) {
79
+ // only change to time panel after selected start and end date
80
+ if ((_value as StateValueRange).length === 2) {
81
+ panel.changePanel(PanelTypes.Time, PanelFlags.Start);
82
+ panel.changePanel(PanelTypes.Time, PanelFlags.End);
83
+ }
84
+ } else {
85
+ panel.changePanel(PanelTypes.Time, flag);
86
+ }
79
87
  } else if (!multiple && (!range || (_value as StateValueRange).length === 2)) {
80
88
  instance.hide();
81
89
  }
@@ -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
- <i class="k-icon ion-heart"></i>menu 3
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
- <i class="k-icon ion-heart"></i>menu 3
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
- <i class="k-icon ion-heart"></i>menu 3
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: 'white' as MenuProps['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"` &#124; `"light"` &#124; `"white"` | `"dark"` |
15
+ | theme | 主题颜色 | `"dark"` &#124; `"light"` &#124; `"white@deprecated"` | `"dark"` |
16
16
  | height | 高度 | `string` &#124; `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
- ${themes.map(theme => {
93
- if (theme === 'dark') return;
94
- const styles = layout[theme];
95
- return css`
96
- &.${k}-${theme} {
97
- background: ${styles.bgColor};
98
- color: ${styles.color};
99
- border-bottom: ${styles.border};
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[theme];
107
+ const styles = layout.light;
119
108
  return css`
120
109
  &.${k}-${theme} {
121
110
  background: ${styles.bgColor};
Binary file
Binary file
@@ -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')}>
@@ -13,12 +13,13 @@ sidebar: doc
13
13
  | --- | --- | --- | --- |
14
14
  | expandedKeys | 定义菜单展开项 | <code>(string &#124; number)[]</code> | `[]` |
15
15
  | selectedKey | 定义菜单选中项 | <code>string &#124; number</code> | `undefined` |
16
- | theme | 定义菜单主题 | `"light"` &#124; `"dark"` &#124; `"white"` | `"dark"` |
16
+ | theme | 定义菜单主题 | `"light"` &#124; `"dark"` &#124; `"white@deprecated"` | `"dark"` |
17
17
  | collapse | 菜单是否折叠 | `boolean` | `false` |
18
18
  | type | 定义菜单排列方式:垂直,水平 | `"vertical"` &#124; `"horizontal"` | `"vertical"` |
19
19
  | size | 定义菜单尺寸 | `"large"` &#124; `"default"` &#124; `"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 subMenu1 = menu3.querySelector<HTMLElement>('.k-menu')!.firstElementChild!.querySelector('.k-menu-title') as HTMLElement;
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(element.innerHTML).to.matchSnapshot();
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(element.innerHTML).to.matchSnapshot();
121
+ expect(rootElement.innerHTML).to.matchSnapshot();
119
122
  expect(instance.get('expandedKeys')).to.eql(['3', '3-4']);
120
-
121
- const menu1 = element.firstElementChild!.querySelector('.k-menu-title') as HTMLElement;
123
+
124
+ const menu1 = rootElement.firstElementChild!.querySelector('.k-menu-item-title') as HTMLElement;
122
125
  menu1.click();
123
126
  await wait();
124
- expect(element.innerHTML).to.matchSnapshot();
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(element.innerHTML).to.matchSnapshot();
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
  });
@@ -1,2 +1,3 @@
1
1
  export * from './menu';
2
- export * from './item';
2
+ export * from './item';
3
+ export * from './title';
@@ -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 ${k}-icon-down`} v-if={subMenuVNode} />
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 };
@@ -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
  }
@@ -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
- {children}
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