menu.spec.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. import { createVue, triggerEvent, destroyVM } from '../util';
  2. describe('Menu', () => {
  3. let vm;
  4. afterEach(() => {
  5. destroyVM(vm);
  6. });
  7. it('create', done => {
  8. vm = createVue({
  9. template: `
  10. <el-menu>
  11. <el-menu-item index="1" ref="item1">处理中心</el-menu-item>
  12. <el-menu-item index="2" ref="item2">订单管理</el-menu-item>
  13. </el-menu>
  14. `
  15. }, true);
  16. var item1 = vm.$refs.item1;
  17. var item2 = vm.$refs.item2;
  18. item1.$el.click();
  19. setTimeout(_ => {
  20. expect(item1.$el.classList.contains('is-active')).to.be.true;
  21. item2.$el.click();
  22. setTimeout(_ => {
  23. expect(item2.$el.classList.contains('is-active')).to.be.true;
  24. done();
  25. }, 20);
  26. }, 20);
  27. });
  28. it('menu-item click', done => {
  29. vm = createVue({
  30. template: `
  31. <el-menu>
  32. <el-menu-item @click="onMenuItemClick" index="1" ref="item1">处理中心</el-menu-item>
  33. <el-menu-item index="2" ref="item2">订单管理</el-menu-item>
  34. </el-menu>
  35. `,
  36. methods: {
  37. onMenuItemClick(el) {
  38. expect(el).to.be.equal(vm.$refs.item1);
  39. this.clicksCount = this.clicksCount + 1;
  40. }
  41. },
  42. data() {
  43. return {
  44. clicksCount: 0
  45. };
  46. }
  47. }, true);
  48. var item1 = vm.$refs.item1;
  49. item1.$el.click();
  50. setTimeout(_ => {
  51. expect(vm.clicksCount).to.be.equal(1);
  52. done();
  53. }, 20);
  54. });
  55. it('menu-item disabled', done => {
  56. vm = createVue({
  57. template: `
  58. <el-menu default-active="2">
  59. <el-menu-item index="1" ref="item1" disabled>处理中心</el-menu-item>
  60. <el-menu-item index="2" ref="item2">订单管理</el-menu-item>
  61. </el-menu>
  62. `
  63. }, true);
  64. expect(vm.$refs.item2.$el.classList.contains('is-active')).to.be.true;
  65. vm.$refs.item1.$el.click();
  66. setTimeout(_ => {
  67. expect(vm.$refs.item1.$el.classList.contains('is-active')).to.be.false;
  68. done();
  69. }, 20);
  70. });
  71. describe('default active', () => {
  72. it('normal active', done => {
  73. vm = createVue({
  74. template: `
  75. <el-menu default-active="2">
  76. <el-menu-item index="1" ref="item1">处理中心</el-menu-item>
  77. <el-menu-item index="2" ref="item2">订单管理</el-menu-item>
  78. </el-menu>
  79. `
  80. }, true);
  81. expect(vm.$refs.item2.$el.classList.contains('is-active')).to.be.true;
  82. vm.$refs.item1.$el.click();
  83. setTimeout(_ => {
  84. expect(vm.$refs.item1.$el.classList.contains('is-active')).to.be.true;
  85. done();
  86. }, 20);
  87. });
  88. it('dynamic active', done => {
  89. vm = createVue({
  90. template: `
  91. <el-menu :default-active="active">
  92. <el-menu-item index="1" ref="item1">active watch处理中心</el-menu-item>
  93. <el-menu-item index="2" ref="item2">active watch订单管理</el-menu-item>
  94. </el-menu>
  95. `,
  96. data() {
  97. return {
  98. active: '2'
  99. };
  100. }
  101. }, true);
  102. setTimeout(_ => {
  103. vm.active = '1';
  104. setTimeout(_ => {
  105. expect(vm.$refs.item1.$el.classList.contains('is-active')).to.be.true;
  106. done();
  107. }, 20);
  108. }, 100);
  109. });
  110. it('vertical submenu item active', done => {
  111. vm = createVue({
  112. template: `
  113. <div>
  114. <el-menu default-active="2-2">
  115. <el-menu-item index="1" ref="item1">处理中心</el-menu-item>
  116. <el-submenu index="2" ref="submenu">
  117. <template slot="title">我的工作台</template>
  118. <el-menu-item index="2-1">选项1</el-menu-item>
  119. <el-menu-item index="2-2" ref="submenuItem2">选项2</el-menu-item>
  120. <el-menu-item index="2-3">选项3</el-menu-item>
  121. </el-submenu>
  122. <el-menu-item index="3">订单管理</el-menu-item>
  123. </el-menu>
  124. </div>
  125. `
  126. }, true);
  127. expect(vm.$refs.submenuItem2.$el.classList.contains('is-active')).to.be.true;
  128. setTimeout(_ => {
  129. expect(vm.$refs.submenu.$el.classList.contains('is-opened')).to.be.true;
  130. expect(vm.$refs.submenu.$el.classList.contains('is-active')).to.be.true;
  131. done();
  132. }, 20);
  133. });
  134. it('horizontal submenu item active', done => {
  135. vm = createVue({
  136. template: `
  137. <div>
  138. <el-menu default-active="2-2">
  139. <el-menu-item index="1" ref="item1">处理中心</el-menu-item>
  140. <el-submenu index="2" ref="submenu">
  141. <template slot="title">我的工作台</template>
  142. <el-menu-item index="2-1">选项1</el-menu-item>
  143. <el-menu-item index="2-2" ref="submenuItem2">选项2</el-menu-item>
  144. <el-menu-item index="2-3">选项3</el-menu-item>
  145. </el-submenu>
  146. <el-menu-item index="3">订单管理</el-menu-item>
  147. </el-menu>
  148. </div>
  149. `
  150. }, true);
  151. expect(vm.$refs.submenuItem2.$el.classList.contains('is-active')).to.be.true;
  152. setTimeout(_ => {
  153. expect(vm.$refs.submenu.$el.classList.contains('is-opened')).to.be.true;
  154. expect(vm.$refs.submenu.$el.classList.contains('is-active')).to.be.true;
  155. done();
  156. }, 20);
  157. });
  158. });
  159. describe('submenu', function() {
  160. it('toggle', done => {
  161. vm = createVue({
  162. template: `
  163. <el-menu>
  164. <el-menu-item index="1" ref="item1">处理中心</el-menu-item>
  165. <el-submenu index="2" ref="submenu">
  166. <template slot="title">我的工作台</template>
  167. <el-menu-item index="2-1">选项1</el-menu-item>
  168. <el-menu-item index="2-2" ref="submenuItem2">选项2</el-menu-item>
  169. <el-menu-item index="2-3">选项3</el-menu-item>
  170. </el-submenu>
  171. <el-menu-item index="3">订单管理</el-menu-item>
  172. </el-menu>
  173. `,
  174. data() {
  175. return {
  176. };
  177. }
  178. }, true);
  179. var submenuItem2 = vm.$refs.submenuItem2;
  180. var submenu = vm.$refs.submenu;
  181. submenu.$el.querySelector('.el-submenu__title').click();
  182. setTimeout(_ => {
  183. expect(submenu.$el.classList.contains('is-opened')).to.be.true;
  184. submenuItem2.$el.click();
  185. setTimeout(_ => {
  186. expect(submenuItem2.$el.classList.contains('is-active')).to.be.true;
  187. submenu.$el.querySelector('.el-submenu__title').click();
  188. setTimeout(_ => {
  189. expect(submenu.$el.classList.contains('is-opened')).to.not.true;
  190. done();
  191. }, 20);
  192. }, 20);
  193. }, 20);
  194. });
  195. it('default opened', done => {
  196. vm = createVue({
  197. template: `
  198. <el-menu :default-openeds="defaultOpeneds">
  199. <el-menu-item index="1">default opened处理中心</el-menu-item>
  200. <el-submenu index="2" ref="submenu1">
  201. <template slot="title">default opened我的工作台</template>
  202. <el-menu-item index="2-1">选项1</el-menu-item>
  203. <el-menu-item index="2-2" ref="submenu1Item2">选项2</el-menu-item>
  204. <el-menu-item index="2-3">选项3</el-menu-item>
  205. </el-submenu>
  206. <el-submenu index="3" ref="submenu2">
  207. <template slot="title">default opened订单管理</template>
  208. <el-menu-item index="3-1">选项1</el-menu-item>
  209. <el-menu-item index="3-2" ref="submenu2Item2">选项2</el-menu-item>
  210. <el-menu-item index="3-3">选项3</el-menu-item>
  211. </el-submenu>
  212. </el-menu>
  213. `,
  214. data() {
  215. return {
  216. defaultOpeneds: ['2', '3']
  217. };
  218. }
  219. }, true);
  220. expect(vm.$refs.submenu1.$el.classList.contains('is-opened')).to.be.true;
  221. expect(vm.$refs.submenu2.$el.classList.contains('is-opened')).to.be.true;
  222. vm.defaultOpeneds = ['2'];
  223. setTimeout(_ => {
  224. expect(vm.$refs.submenu1.$el.classList.contains('is-opened')).to.be.true;
  225. expect(vm.$refs.submenu2.$el.classList.contains('is-opened')).to.not.true;
  226. done();
  227. }, 20);
  228. });
  229. it('disabled', done => {
  230. vm = createVue({
  231. template: `
  232. <el-menu>
  233. <el-menu-item index="1" ref="item1">处理中心</el-menu-item>
  234. <el-submenu index="2" ref="submenu" disabled>
  235. <template slot="title">我的工作台</template>
  236. <el-menu-item index="2-1">选项1</el-menu-item>
  237. <el-menu-item index="2-2" ref="submenuItem2">选项2</el-menu-item>
  238. <el-menu-item index="2-3">选项3</el-menu-item>
  239. </el-submenu>
  240. <el-menu-item index="3">订单管理</el-menu-item>
  241. </el-menu>
  242. `
  243. }, true);
  244. var submenu = vm.$refs.submenu;
  245. submenu.$el.querySelector('.el-submenu__title').click();
  246. setTimeout(_ => {
  247. expect(submenu.$el.classList.contains('is-opened')).to.be.false;
  248. done();
  249. }, 20);
  250. });
  251. });
  252. it('unique-opened', done => {
  253. vm = createVue({
  254. template: `
  255. <el-menu unique-opened default-active="2-2">
  256. <el-menu-item index="1">处理中心</el-menu-item>
  257. <el-submenu index="2" ref="submenu1">
  258. <template slot="title">我的工作台</template>
  259. <el-menu-item index="2-1">选项1</el-menu-item>
  260. <el-menu-item index="2-2" ref="submenu1Item2">选项2</el-menu-item>
  261. <el-menu-item index="2-3">选项3</el-menu-item>
  262. </el-submenu>
  263. <el-submenu index="3" ref="submenu2">
  264. <template slot="title">订单管理</template>
  265. <el-menu-item index="3-1">选项1</el-menu-item>
  266. <el-menu-item index="3-2" ref="submenu2Item2">选项2</el-menu-item>
  267. <el-menu-item index="3-3">选项3</el-menu-item>
  268. </el-submenu>
  269. </el-menu>
  270. `,
  271. data() {
  272. return {
  273. };
  274. }
  275. }, true);
  276. vm.$refs.submenu2.$el.querySelector('.el-submenu__title').click();
  277. setTimeout(_ => {
  278. expect(vm.$refs.submenu1.$el.classList.contains('is-opened')).to.not.true;
  279. done();
  280. }, 20);
  281. });
  282. it('horizontal mode', done => {
  283. vm = createVue({
  284. template: `
  285. <el-menu mode="horizontal">
  286. <el-menu-item index="1">处理中心</el-menu-item>
  287. <el-submenu index="2" ref="submenu">
  288. <template slot="title">我的工作台</template>
  289. <el-menu-item index="2-1">选项1</el-menu-item>
  290. <el-menu-item index="2-2" ref="submenuItem2">选项2</el-menu-item>
  291. <el-menu-item index="2-3">选项3</el-menu-item>
  292. </el-submenu>
  293. <el-menu-item index="3">订单管理</el-menu-item>
  294. </el-menu>
  295. `,
  296. data() {
  297. return {
  298. };
  299. }
  300. }, true);
  301. expect(vm.$el.classList.contains('el-menu--horizontal')).to.be.true;
  302. var submenu = vm.$refs.submenu;
  303. triggerEvent(submenu.$el, 'mouseenter');
  304. setTimeout(_ => {
  305. expect(document.body.querySelector('.el-menu--popup').parentElement.style.display).to.not.ok;
  306. done();
  307. }, 500);
  308. });
  309. it('menu trigger click', done => {
  310. vm = createVue({
  311. template: `
  312. <el-menu mode="horizontal" menu-trigger="click">
  313. <el-menu-item index="1">处理中心</el-menu-item>
  314. <el-submenu index="2" ref="submenu">
  315. <template slot="title">我的工作台</template>
  316. <el-menu-item index="2-1">选项1</el-menu-item>
  317. <el-menu-item index="2-2" ref="submenuItem2">选项2</el-menu-item>
  318. <el-menu-item index="2-3">选项3</el-menu-item>
  319. </el-submenu>
  320. <el-menu-item index="3">订单管理</el-menu-item>
  321. </el-menu>
  322. `,
  323. data() {
  324. return {
  325. };
  326. }
  327. }, true);
  328. expect(vm.$el.classList.contains('el-menu--horizontal')).to.be.true;
  329. var submenu = vm.$refs.submenu;
  330. var triggerElm = submenu.$el.querySelector('.el-submenu__title');
  331. triggerEvent(submenu.$el, 'mouseenter');
  332. triggerElm.click();
  333. setTimeout(_ => {
  334. expect(document.body.querySelector('.el-menu--popup').parentElement.style.display).to.not.ok;
  335. triggerElm.click();
  336. setTimeout(_ => {
  337. expect(document.body.querySelector('.el-menu--popup').parentElement.style.display).to.be.equal('none');
  338. done();
  339. }, 1000);
  340. }, 500);
  341. });
  342. it('menu group', () => {
  343. vm = createVue({
  344. template: `
  345. <el-menu mode="vertical" default-active="1">
  346. <el-menu-item-group title="分组一" ref="group1">
  347. <el-menu-item index="1"><i class="el-icon-message"></i>导航一</el-menu-item>
  348. <el-menu-item index="2"><i class="el-icon-message"></i>导航二</el-menu-item>
  349. </el-menu-item-group>
  350. <el-submenu index="5">
  351. <template slot="title">导航五</template>
  352. <el-menu-item-group title="分组二">
  353. <el-menu-item index="5-1">选项1</el-menu-item>
  354. <el-menu-item index="5-2">选项2</el-menu-item>
  355. </el-menu-item-group>
  356. </el-submenu>
  357. </el-menu>
  358. `
  359. }, true);
  360. expect(vm.$refs.group1.$el.querySelector('.el-menu-item-group__title').innerText).to.be.equal('分组一');
  361. });
  362. it('dynamic menus, issue 9092', done => {
  363. vm = createVue({
  364. template: `
  365. <el-menu :default-active="active">
  366. <el-menu-item
  367. v-ref="menus"
  368. v-for="menu in menus"
  369. :index="menu.name"
  370. :key="menu.name">
  371. {{menu.description}}
  372. </el-menu-item>
  373. </el-menu>
  374. `,
  375. data() {
  376. return {
  377. active: '',
  378. menus: []
  379. };
  380. }
  381. }, true);
  382. setTimeout(_ => {
  383. vm.active = '2';
  384. vm.menus = [
  385. {name: '1', description: 'happy'},
  386. {name: '2', description: 'new'},
  387. {name: '3', description: 'year'}
  388. ];
  389. setTimeout(_ => {
  390. expect(vm.$el.querySelector('.el-menu-item.is-active').innerText).to.equal('new');
  391. done();
  392. }, 20);
  393. }, 100);
  394. });
  395. });