date-picker.spec.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377
  1. import {
  2. createTest,
  3. createVue,
  4. destroyVM,
  5. triggerEvent
  6. } from '../util';
  7. import DatePicker from 'packages/date-picker';
  8. const DELAY = 50;
  9. const LEFT = 37;
  10. const ENTER = 13;
  11. const TAB = 9;
  12. const keyDown = (el, keyCode) => {
  13. const evt = document.createEvent('Events');
  14. evt.initEvent('keydown', true, true);
  15. evt.keyCode = keyCode;
  16. el.dispatchEvent(evt);
  17. };
  18. describe('DatePicker', () => {
  19. let vm;
  20. afterEach(() => {
  21. destroyVM(vm);
  22. });
  23. it('create', () => {
  24. vm = createTest(DatePicker, {
  25. readonly: true,
  26. placeholder: '23333',
  27. format: 'HH-mm-ss'
  28. });
  29. const input = vm.$el.querySelector('input');
  30. expect(input.getAttribute('placeholder')).to.equal('23333');
  31. expect(input.getAttribute('readonly')).to.equal('readonly');
  32. });
  33. it('select date', done => {
  34. vm = createVue({
  35. template: `
  36. <el-date-picker ref="compo" v-model="value"></el-date-picker>
  37. `,
  38. data() {
  39. return {
  40. value: ''
  41. };
  42. }
  43. }, true);
  44. const input = vm.$el.querySelector('input');
  45. const date = new Date();
  46. input.blur();
  47. input.focus();
  48. setTimeout(_ => {
  49. const $el = vm.$refs.compo.picker.$el;
  50. const spans = $el.querySelectorAll('.el-date-picker__header-label');
  51. const arrowLeftElm = $el.querySelector('.el-date-picker__prev-btn.el-icon-arrow-left');
  52. const arrowRightElm = $el.querySelector('.el-date-picker__next-btn.el-icon-arrow-right');
  53. expect(spans[0].textContent).to.include(date.getFullYear());
  54. expect(spans[1].textContent).to.include(date.getMonth() + 1);
  55. $el.querySelector('.el-date-picker__prev-btn.el-icon-d-arrow-left').click();
  56. let count = 20;
  57. while (--count) {
  58. arrowLeftElm.click();
  59. }
  60. count = 20;
  61. while (--count) {
  62. arrowRightElm.click();
  63. }
  64. setTimeout(_ => {
  65. expect(spans[0].textContent).to.include(date.getFullYear() - 1);
  66. expect(spans[1].textContent).to.include(date.getMonth() + 1);
  67. $el.querySelector('td.available').click();
  68. vm.$nextTick(_ => {
  69. expect(vm.value).to.exist;
  70. });
  71. done();
  72. }, DELAY);
  73. }, DELAY);
  74. });
  75. it('clear value', done => {
  76. vm = createVue({
  77. template: `
  78. <el-date-picker v-model="value" ref="compo"></el-date-picker>
  79. `,
  80. data() {
  81. return {
  82. value: ''
  83. };
  84. }
  85. }, true);
  86. const input = vm.$el.querySelector('input');
  87. input.focus();
  88. setTimeout(_ => {
  89. const $el = vm.$refs.compo.picker.$el;
  90. $el.querySelector('td.available').click();
  91. vm.$nextTick(_ => {
  92. vm.$el.querySelector('.el-input__icon').click();
  93. setTimeout(_ => {
  94. expect(vm.value).to.empty;
  95. done();
  96. }, DELAY);
  97. });
  98. }, DELAY);
  99. });
  100. it('disabled clear value', done => {
  101. vm = createVue({
  102. template: `
  103. <el-date-picker v-model="value" ref="compo" :clearable="false"></el-date-picker>
  104. `,
  105. data() {
  106. return {
  107. value: ''
  108. };
  109. }
  110. }, true);
  111. const input = vm.$el.querySelector('input');
  112. input.focus();
  113. setTimeout(_ => {
  114. const $el = vm.$refs.compo.picker.$el;
  115. $el.querySelector('td.available').click();
  116. vm.$nextTick(_ => {
  117. vm.$el.querySelector('.el-input__icon').click();
  118. setTimeout(_ => {
  119. expect(vm.value).to.be.exist;
  120. done();
  121. }, DELAY);
  122. });
  123. }, DELAY);
  124. });
  125. it('reset', done => {
  126. vm = createVue({
  127. template: `
  128. <el-date-picker ref="compo" v-model="value"></el-date-picker>
  129. `,
  130. data() {
  131. return {
  132. value: ''
  133. };
  134. }
  135. }, true);
  136. const input = vm.$el.querySelector('input');
  137. input.blur();
  138. input.focus();
  139. setTimeout(_ => {
  140. const $el = vm.$refs.compo.picker.$el;
  141. $el.querySelector('.el-date-picker__next-btn.el-icon-arrow-right').click();
  142. setTimeout(_ => {
  143. $el.querySelector('td.available').click();
  144. vm.$nextTick(_ => {
  145. vm.value = '';
  146. setTimeout(_ => {
  147. expect(vm.$refs.compo.picker.date.getDate()).to.equal(new Date().getDate());
  148. done();
  149. }, DELAY);
  150. });
  151. }, DELAY);
  152. }, DELAY);
  153. });
  154. it('focus', done => {
  155. vm = createVue({
  156. template: `
  157. <el-date-picker ref="picker"></el-date-picker>
  158. `
  159. }, true);
  160. const spy = sinon.spy();
  161. vm.$refs.picker.$on('focus', spy);
  162. vm.$refs.picker.focus();
  163. vm.$nextTick(_ => {
  164. expect(spy.calledOnce).to.be.true;
  165. done();
  166. });
  167. });
  168. it('change event', done => {
  169. let onChangeValue;
  170. vm = createVue({
  171. template: `
  172. <el-date-picker
  173. ref="compo"
  174. v-model="value"
  175. @change="handleChange" />`,
  176. methods: {
  177. handleChange(val) {
  178. onChangeValue = val;
  179. }
  180. },
  181. data() {
  182. return {
  183. value: ''
  184. };
  185. }
  186. }, true);
  187. const input = vm.$el.querySelector('input');
  188. input.blur();
  189. input.focus();
  190. setTimeout(_ => {
  191. const picker = vm.$refs.compo.picker;
  192. // programatic modification of bound value does not emit cange
  193. vm.value = new Date(2000, 9, 2);
  194. setTimeout(_ => {
  195. expect(onChangeValue).to.not.exist;
  196. // user interaction does emit change
  197. picker.$el.querySelector('td.available').click();
  198. setTimeout(_ => {
  199. expect(onChangeValue.getTime()).to.equal(vm.value.getTime());
  200. done();
  201. }, DELAY);
  202. }, DELAY);
  203. }, DELAY);
  204. });
  205. describe('input event', () => {
  206. // mimic standard <select>'s behavior
  207. // emit input if and only if value changes
  208. afterEach(() => {
  209. destroyVM(vm);
  210. });
  211. it('works for type=date', done => {
  212. let emitted = false;
  213. vm = createVue({
  214. template: `
  215. <el-date-picker
  216. ref="compo"
  217. v-model="value"
  218. type="date"
  219. @input="handleInput" />`,
  220. methods: {
  221. handleInput(val) {
  222. emitted = true;
  223. }
  224. },
  225. data() {
  226. return {
  227. value: ''
  228. };
  229. }
  230. }, true);
  231. const input = vm.$el.querySelector('input');
  232. input.blur();
  233. input.focus();
  234. setTimeout(_ => {
  235. const picker = vm.$refs.compo.picker;
  236. picker.$el.querySelector('td.available').click();
  237. setTimeout(_ => {
  238. expect(emitted).to.true;
  239. emitted = false;
  240. setTimeout(_ => {
  241. input.blur();
  242. input.focus();
  243. picker.$el.querySelector('td.available').click();
  244. setTimeout(_ => {
  245. expect(emitted).to.false;
  246. done();
  247. }, DELAY);
  248. }, DELAY);
  249. }, DELAY);
  250. }, DELAY);
  251. });
  252. it('works for type=daterange', done => {
  253. let emitted = false;
  254. vm = createVue({
  255. template: `
  256. <el-date-picker
  257. ref="compo"
  258. v-model="value"
  259. type="daterange"
  260. @input="handleInput" />`,
  261. methods: {
  262. handleInput(val) {
  263. emitted = true;
  264. }
  265. },
  266. data() {
  267. return {
  268. value: ''
  269. };
  270. }
  271. }, true);
  272. const input = vm.$el.querySelector('input');
  273. input.click();
  274. setTimeout(_ => {
  275. const picker = vm.$refs.compo.picker;
  276. picker.$el.querySelector('td.available').click();
  277. setTimeout(_ => {
  278. picker.$el.querySelector('td.available + td.available').click();
  279. setTimeout(_ => {
  280. expect(emitted).to.true;
  281. emitted = false;
  282. setTimeout(_ => {
  283. input.blur();
  284. input.focus();
  285. const picker = vm.$refs.compo.picker;
  286. picker.$el.querySelector('td.available').click();
  287. setTimeout(_ => {
  288. picker.$el.querySelector('td.available + td.available').click();
  289. setTimeout(_ => {
  290. expect(emitted).to.false;
  291. done();
  292. });
  293. }, DELAY);
  294. }, DELAY);
  295. });
  296. }, DELAY);
  297. }, DELAY);
  298. });
  299. it('work for event focus and blur', done => {
  300. vm = createVue({
  301. template: `
  302. <el-date-picker ref="picker"/>
  303. `
  304. }, true);
  305. const spyFocus = sinon.spy();
  306. const spyBlur = sinon.spy();
  307. vm.$refs.picker.$on('focus', spyFocus);
  308. vm.$refs.picker.$on('blur', spyBlur);
  309. vm.$el.querySelector('input').focus();
  310. vm.$el.querySelector('input').blur();
  311. vm.$nextTick(_ => {
  312. expect(spyFocus.calledOnce).to.be.true;
  313. expect(spyBlur.calledOnce).to.be.true;
  314. done();
  315. });
  316. });
  317. });
  318. describe('value-format', () => {
  319. it('emits', done => {
  320. vm = createVue({
  321. template: `
  322. <el-date-picker
  323. ref="compo"
  324. v-model="value"
  325. type="date"
  326. value-format="dd/MM yyyy" />`,
  327. data() {
  328. return {
  329. value: ''
  330. };
  331. }
  332. }, true);
  333. const spy = sinon.spy();
  334. vm.$refs.compo.$on('change', spy);
  335. vm.$refs.compo.$el.querySelector('input').focus();
  336. setTimeout(_ => {
  337. vm.$refs.compo.picker.$el.querySelector('.el-date-table td.available').click();
  338. setTimeout(_ => {
  339. const today = new Date();
  340. const yyyy = today.getFullYear();
  341. const MM = ('0' + (today.getMonth() + 1)).slice(-2);
  342. const dd = '01'; // first available one should be first day of month
  343. const expectValue = `${dd}/${MM} ${yyyy}`;
  344. expect(vm.value).to.equal(expectValue);
  345. expect(spy.calledOnce).to.be.true;
  346. expect(spy.calledWith(expectValue)).to.be.true;
  347. done();
  348. }, DELAY);
  349. }, DELAY);
  350. });
  351. it('accepts', done => {
  352. vm = createVue({
  353. template: `
  354. <el-date-picker
  355. ref="compo"
  356. v-model="value"
  357. type="date"
  358. format="yyyy-MM-dd"
  359. value-format="dd/MM yyyy" />`,
  360. data() {
  361. return {
  362. value: '01/02 2000'
  363. };
  364. }
  365. }, true);
  366. const input = vm.$refs.compo.$el.querySelector('input');
  367. expect(input.value).to.equal('2000-02-01');
  368. expect(vm.$refs.compo.parsedValue).to.be.an.instanceof(Date);
  369. input.focus();
  370. setTimeout(_ => {
  371. const date = vm.$refs.compo.picker.date;
  372. expect(date.getFullYear()).to.equal(2000);
  373. expect(date.getMonth()).to.equal(1);
  374. expect(date.getDate()).to.equal(1);
  375. vm.$refs.compo.picker.$el.querySelector('.el-date-table .current').click();
  376. setTimeout(_ => {
  377. expect(input.value).to.equal('2000-02-01');
  378. done();
  379. }, DELAY);
  380. }, DELAY);
  381. });
  382. it('translates format to value-format', done => {
  383. vm = createVue({
  384. template: `
  385. <el-date-picker
  386. ref="compo"
  387. v-model="value"
  388. type="date"
  389. format="yyyy-MM-dd"
  390. value-format="dd/MM yyyy" />`,
  391. data() {
  392. return {
  393. value: ''
  394. };
  395. }
  396. }, true);
  397. const input = vm.$refs.compo.$el.querySelector('input');
  398. input.focus();
  399. setTimeout(_ => {
  400. input.value = '2000-10-01';
  401. triggerEvent(input, 'input');
  402. keyDown(input, ENTER);
  403. setTimeout(_ => {
  404. expect(vm.value).to.equal('01/10 2000');
  405. done();
  406. }, DELAY);
  407. }, DELAY);
  408. });
  409. it('works for daterange', done => {
  410. vm = createVue({
  411. template: `
  412. <el-date-picker
  413. ref="compo"
  414. v-model="value"
  415. type="daterange"
  416. format="yyyy-MM-dd"
  417. value-format="dd/MM yyyy" />`,
  418. data() {
  419. return {
  420. value: ''
  421. };
  422. }
  423. }, true);
  424. const inputs = vm.$refs.compo.$el.querySelectorAll('input');
  425. inputs[0].focus();
  426. setTimeout(_ => {
  427. inputs[0].value = '2000-10-01';
  428. triggerEvent(inputs[0], 'input');
  429. keyDown(inputs[0], TAB);
  430. setTimeout(_ => {
  431. inputs[1].focus();
  432. inputs[1].value = '2000-10-02';
  433. triggerEvent(inputs[1], 'input');
  434. keyDown(inputs[0], ENTER);
  435. setTimeout(_ => {
  436. expect(vm.value).to.eql(['01/10 2000', '02/10 2000']);
  437. done();
  438. }, DELAY);
  439. }, DELAY);
  440. }, DELAY);
  441. });
  442. });
  443. describe('default value', done => {
  444. it('it works', done => {
  445. let defaultValue = '2000-01-01';
  446. let expectValue = new Date(2000, 0, 1);
  447. vm = createVue({
  448. template: `<el-date-picker v-model="value" ref="compo" default-value="${defaultValue}" />`,
  449. data() {
  450. return {
  451. value: ''
  452. };
  453. }
  454. }, true);
  455. vm.$el.querySelector('input').focus();
  456. setTimeout(_ => {
  457. const $el = vm.$refs.compo.picker.$el;
  458. expect($el.querySelector('.el-month-table td.default')).to.exist;
  459. expect($el.querySelector('.el-year-table td.default')).to.exist;
  460. const defaultEls = $el.querySelectorAll('.el-date-table td.default');
  461. expect(defaultEls.length).to.equal(1);
  462. defaultEls[0].click();
  463. setTimeout(_ => {
  464. expect(vm.value).to.eql(expectValue);
  465. done();
  466. }, DELAY);
  467. }, DELAY);
  468. });
  469. it('is reactive, works with clear', done => {
  470. let defaultValue = '2000-01-01';
  471. let expectValue = new Date(2000, 0, 1);
  472. vm = createVue({
  473. template: '<el-date-picker v-model="value" ref="compo" :default-value="defaultValue" />',
  474. data() {
  475. return {
  476. value: new Date(),
  477. defaultValue: null
  478. };
  479. }
  480. }, true);
  481. const input = vm.$el.querySelector('input');
  482. input.focus();
  483. setTimeout(_ => {
  484. let $el = vm.$refs.compo.picker.$el;
  485. expect($el.querySelector('.el-date-table td.current')).to.exist;
  486. vm.defaultValue = defaultValue;
  487. triggerEvent(vm.$refs.compo.$el, 'mouseenter');
  488. setTimeout(_ => {
  489. vm.$el.querySelector('.el-icon-circle-close').click();
  490. setTimeout(_ => {
  491. input.focus();
  492. setTimeout(() => {
  493. $el = vm.$refs.compo.picker.$el;
  494. expect($el.querySelector('.el-date-table td.current')).to.not.exist;
  495. expect($el.querySelector('.el-date-table td.default')).to.exist;
  496. $el.querySelector('.el-date-table td.default').click();
  497. setTimeout(() => {
  498. expect(vm.value).to.eql(expectValue);
  499. done();
  500. }, DELAY);
  501. }, DELAY);
  502. }, DELAY);
  503. }, DELAY);
  504. }, DELAY);
  505. });
  506. });
  507. describe('keydown', () => {
  508. let input, datePicker;
  509. beforeEach(done => {
  510. vm = createVue({
  511. template: '<el-date-picker ref="compo" v-model="value"></el-date-picker>',
  512. data() {
  513. return {
  514. value: ''
  515. };
  516. }
  517. }, true);
  518. datePicker = vm.$refs.compo;
  519. input = vm.$el.querySelector('input');
  520. input.blur();
  521. input.focus();
  522. setTimeout(done, DELAY);
  523. });
  524. afterEach(() => destroyVM(vm));
  525. it('tab', done => {
  526. keyDown(input, TAB);
  527. setTimeout(_ => {
  528. expect(datePicker.pickerVisible).to.false;
  529. done();
  530. }, DELAY);
  531. });
  532. it('enter', done => {
  533. input.value = '2000-10-1';
  534. triggerEvent(input, 'input');
  535. vm.$nextTick(_ => {
  536. keyDown(input, ENTER);
  537. setTimeout(_ => {
  538. expect(datePicker.pickerVisible).to.false;
  539. expect(datePicker.picker.date.getFullYear()).to.equal(2000);
  540. expect(datePicker.picker.date.getMonth()).to.equal(9);
  541. expect(datePicker.picker.date.getDate()).to.equal(1);
  542. done();
  543. }, DELAY);
  544. });
  545. });
  546. it('arrow keys during typing does not navigate', done => {
  547. const inputText = '2000-10-1';
  548. input.value = inputText;
  549. triggerEvent(input, 'input');
  550. keyDown(input, LEFT);
  551. vm.$nextTick(_ => {
  552. expect(input.value).to.equal(inputText);
  553. done();
  554. });
  555. });
  556. it('arrow keys navigates', done => {
  557. const date = new Date(2000, 9, 1);
  558. const prevDate = new Date(2000, 9, 0);
  559. vm.value = date;
  560. vm.$nextTick(_ => {
  561. keyDown(input, LEFT);
  562. setTimeout(_ => {
  563. expect(datePicker.pickerVisible).to.true;
  564. expect(datePicker.picker.date.getFullYear()).to.equal(prevDate.getFullYear());
  565. expect(datePicker.picker.date.getMonth()).to.equal(prevDate.getMonth());
  566. expect(datePicker.picker.date.getDate()).to.equal(prevDate.getDate());
  567. done();
  568. }, DELAY);
  569. });
  570. });
  571. });
  572. describe('nagivation', _ => {
  573. const click = (el, cbk = () => {}) => {
  574. el.click();
  575. setTimeout(cbk, DELAY);
  576. };
  577. let prevMonth, prevYear, nextMonth, nextYear, getYearLabel, getMonthLabel;
  578. const navigationTest = (value, cbk) => {
  579. vm = createVue({
  580. template: '<el-date-picker v-model="value" ref="compo" />',
  581. data() {
  582. return {
  583. value
  584. };
  585. }
  586. }, true);
  587. vm.$refs.compo.$el.querySelector('input').focus();
  588. setTimeout(_ => {
  589. const $el = vm.$refs.compo.picker.$el;
  590. prevMonth = $el.querySelector('button.el-icon-arrow-left');
  591. prevYear = $el.querySelector('button.el-icon-d-arrow-left');
  592. nextMonth = $el.querySelector('button.el-icon-arrow-right');
  593. nextYear = $el.querySelector('button.el-icon-d-arrow-right');
  594. getYearLabel = () => $el.querySelectorAll('.el-date-picker__header-label')[0].textContent;
  595. getMonthLabel = () => $el.querySelectorAll('.el-date-picker__header-label')[1].textContent;
  596. cbk();
  597. }, DELAY);
  598. };
  599. it('month, year', done => {
  600. navigationTest(new Date(2000, 0, 1), _ => {
  601. expect(getYearLabel()).to.include('2000');
  602. expect(getMonthLabel()).to.include('1');
  603. click(prevMonth, _ => {
  604. expect(getYearLabel()).to.include('1999');
  605. expect(getMonthLabel()).to.include('12');
  606. click(prevYear, _ => {
  607. expect(getYearLabel()).to.include('1998');
  608. expect(getMonthLabel()).to.include('12');
  609. click(nextMonth, _ => {
  610. expect(getYearLabel()).to.include('1999');
  611. expect(getMonthLabel()).to.include('1');
  612. click(nextYear, _ => {
  613. expect(getYearLabel()).to.include('2000');
  614. expect(getMonthLabel()).to.include('1');
  615. done();
  616. });
  617. });
  618. });
  619. });
  620. });
  621. });
  622. it('month with fewer dates', done => {
  623. // July has 31 days, June has 30
  624. navigationTest(new Date(2000, 6, 31), _ => {
  625. click(prevMonth, _ => {
  626. expect(getYearLabel()).to.include('2000');
  627. expect(getMonthLabel()).to.include('6');
  628. done();
  629. });
  630. });
  631. });
  632. it('year with fewer Feburary dates', done => {
  633. // Feburary 2008 has 29 days, Feburary 2007 has 28
  634. navigationTest(new Date(2008, 1, 29), _ => {
  635. click(prevYear, _ => {
  636. expect(getYearLabel()).to.include('2007');
  637. expect(getMonthLabel()).to.include('2');
  638. done();
  639. });
  640. });
  641. });
  642. });
  643. it('type:month', done => {
  644. vm = createTest(DatePicker, {
  645. type: 'month'
  646. }, true);
  647. const input = vm.$el.querySelector('input');
  648. input.blur();
  649. input.focus();
  650. setTimeout(_ => {
  651. expect(vm.picker.$el.querySelector('.el-month-table').style.display).to.be.empty;
  652. expect(vm.picker.$el.querySelector('.el-year-table').style.display).to.be.equal('none');
  653. vm.picker.$el.querySelector('.el-month-table a.cell').click();
  654. expect(vm.pickerVisible).to.false;
  655. done();
  656. }, DELAY);
  657. });
  658. it('type:year', done => {
  659. vm = createTest(DatePicker, {
  660. type: 'year'
  661. }, true);
  662. const input = vm.$el.querySelector('input');
  663. input.blur();
  664. input.focus();
  665. setTimeout(_ => {
  666. expect(vm.picker.$el.querySelector('.el-year-table').style.display).to.empty;
  667. expect(vm.picker.$el.querySelector('.el-month-table').style.display).to.be.equal('none');
  668. const leftBtn = vm.picker.$el.querySelector('.el-icon-d-arrow-left');
  669. const rightBtn = vm.picker.$el.querySelector('.el-icon-d-arrow-right');
  670. let count = 20;
  671. while (--count) {
  672. leftBtn.click();
  673. }
  674. count = 18;
  675. while (--count) {
  676. rightBtn.click();
  677. }
  678. vm.picker.$el.querySelector('.el-year-table a.cell').click();
  679. expect(vm.pickerVisible).to.false;
  680. done();
  681. }, DELAY);
  682. });
  683. describe('type:datetime', () => {
  684. let vm;
  685. beforeEach(done => {
  686. vm = createTest(DatePicker, {
  687. type: 'datetime'
  688. }, true);
  689. const input = vm.$el.querySelector('input');
  690. input.blur();
  691. input.focus();
  692. setTimeout(done, DELAY);
  693. });
  694. afterEach(() => destroyVM(vm));
  695. it('create', () => {
  696. expect(vm.picker.$el.querySelector('.el-time-panel')).to.ok;
  697. });
  698. it('both picker show correct value', done => {
  699. vm = createVue({
  700. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  701. data() {
  702. return {
  703. value: new Date(2000, 9, 1, 10, 0, 1)
  704. };
  705. }
  706. }, true);
  707. const input = vm.$refs.compo.$el.querySelector('input');
  708. input.blur();
  709. input.focus();
  710. setTimeout(_ => {
  711. const datePanel = vm.$refs.compo.picker;
  712. const dateInput = datePanel.$el.querySelector('.el-date-picker__time-header > span:nth-child(1) input');
  713. const timeInput = datePanel.$el.querySelector('.el-date-picker__time-header > span:nth-child(2) input');
  714. timeInput.focus();
  715. setTimeout(_ => {
  716. const timePanel = datePanel.$refs.timepicker;
  717. // both input shows correct value
  718. expect(dateInput.value).to.equal('2000-10-01');
  719. expect(timeInput.value).to.equal('10:00:01');
  720. // time spinner highlight is correct
  721. const [hours, minutes, seconds] = timePanel.$el.querySelectorAll('.el-time-spinner ul li.active');
  722. expect(hours.textContent).to.include('10');
  723. expect(minutes.textContent).to.include('00');
  724. expect(seconds.textContent).to.include('01');
  725. // sets value updates displayed value
  726. vm.value = new Date(2001, 10, 2, 11, 1, 2);
  727. setTimeout(_ => {
  728. expect(dateInput.value).to.equal('2001-11-02');
  729. expect(timeInput.value).to.equal('11:01:02');
  730. const [hours, minutes, seconds] = timePanel.$el.querySelectorAll('.el-time-spinner ul li.active');
  731. expect(hours.textContent).to.include('11');
  732. expect(minutes.textContent).to.include('01');
  733. expect(seconds.textContent).to.include('02');
  734. expect(datePanel.visible).to.true;
  735. expect(timePanel.visible).to.true;
  736. done();
  737. }, DELAY);
  738. }, DELAY);
  739. }, DELAY);
  740. });
  741. it('click now button', done => {
  742. const date = new Date(1999, 10, 10, 10, 10);
  743. vm.picker.$el.querySelector('.el-picker-panel__link-btn').click();
  744. setTimeout(_ => {
  745. expect(vm.picker.date > date).to.true;
  746. done();
  747. }, DELAY);
  748. });
  749. it('click timepicker', done => {
  750. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  751. triggerEvent(input, 'focus');
  752. setTimeout(_ => {
  753. expect(vm.picker.$el.querySelector('.el-time-panel')).to.have.deep.property('style.display').to.equal('');
  754. done();
  755. }, DELAY);
  756. });
  757. it('input timepicker', done => {
  758. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  759. input.value = '20:30:33';
  760. triggerEvent(input, 'change', true);
  761. setTimeout(_ => {
  762. expect(vm.picker.date.getHours()).to.equal(20);
  763. expect(vm.picker.date.getMinutes()).to.equal(30);
  764. expect(vm.picker.date.getSeconds()).to.equal(33);
  765. done();
  766. }, DELAY);
  767. });
  768. it('input date', done => {
  769. const input = vm.picker.$el.querySelector('.el-date-picker__editor-wrap input');
  770. input.value = '2017-2-2';
  771. triggerEvent(input, 'change', true);
  772. setTimeout(_ => {
  773. expect(vm.picker.date.getFullYear()).to.equal(2017);
  774. expect(vm.picker.date.getMonth()).to.equal(1);
  775. expect(vm.picker.date.getDate()).to.equal(2);
  776. done();
  777. }, DELAY);
  778. });
  779. it('select time', done => {
  780. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  781. input.blur();
  782. input.focus();
  783. input.blur();
  784. setTimeout(_ => {
  785. const button = vm.picker.$el.querySelector('.el-time-panel .confirm');
  786. button.click();
  787. setTimeout(_ => {
  788. expect(input.value).to.exist;
  789. done();
  790. }, DELAY);
  791. }, DELAY);
  792. });
  793. describe('cancel time', () => {
  794. it('cancel to empty', done => {
  795. vm = createVue({
  796. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  797. data() {
  798. return {
  799. value: ''
  800. };
  801. }
  802. }, true);
  803. const input = vm.$refs.compo.$el.querySelector('input');
  804. input.blur();
  805. input.focus();
  806. setTimeout(_ => {
  807. const timeInput = vm.$refs.compo.picker.$el.querySelector('.el-date-picker__time-header > span:nth-child(2) input');
  808. timeInput.focus();
  809. setTimeout(_ => {
  810. const cancel = vm.$refs.compo.picker.$refs.timepicker.$el.querySelector('button.cancel');
  811. cancel.click();
  812. setTimeout(_ => {
  813. expect(vm.value).to.equal('');
  814. expect(vm.$refs.compo.pickerVisible).to.true;
  815. done();
  816. }, DELAY);
  817. }, DELAY);
  818. }, DELAY);
  819. });
  820. it('cancel to old value', done => {
  821. vm = createVue({
  822. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  823. data() {
  824. return {
  825. value: new Date(2000, 9, 1, 10, 0, 0)
  826. };
  827. }
  828. }, true);
  829. const input = vm.$refs.compo.$el.querySelector('input');
  830. input.blur();
  831. input.focus();
  832. const oldValue = vm.value.toISOString();
  833. setTimeout(_ => {
  834. const timeInput = vm.$refs.compo.picker.$el.querySelector('.el-date-picker__time-header > span:nth-child(2) input');
  835. timeInput.focus();
  836. setTimeout(_ => {
  837. const nextTime = vm.$refs.compo.picker.$refs.timepicker.$el.querySelector('.active + *');
  838. nextTime.click();
  839. setTimeout(_ => {
  840. const cancel = vm.$refs.compo.picker.$refs.timepicker.$el.querySelector('button.cancel');
  841. cancel.click();
  842. setTimeout(_ => {
  843. expect(vm.value.toISOString()).to.equal(oldValue);
  844. expect(vm.$refs.compo.pickerVisible).to.true;
  845. done();
  846. }, DELAY);
  847. }, DELAY);
  848. }, DELAY);
  849. }, DELAY);
  850. });
  851. });
  852. describe('default value', () => {
  853. it('single', done => {
  854. let defaultValue = '2000-10-01';
  855. let expectValue = [new Date(2000, 9, 1), new Date(2000, 9, 2)];
  856. vm = createVue({
  857. template: '<el-date-picker type="daterange" v-model="value" ref="compo" :default-value="defaultValue" />',
  858. data() {
  859. return {
  860. value: '',
  861. defaultValue
  862. };
  863. }
  864. }, true);
  865. vm.$el.querySelector('input').focus();
  866. setTimeout(_ => {
  867. const $el = vm.$refs.compo.picker.$el;
  868. const defaultEls = $el.querySelectorAll('.el-date-table td.default');
  869. expect(defaultEls.length).to.equal(1);
  870. defaultEls[0].click();
  871. setTimeout(_ => {
  872. $el.querySelector('.el-date-table td.default + td').click();
  873. setTimeout(_ => {
  874. expect(vm.value).to.eql(expectValue);
  875. done();
  876. }, DELAY);
  877. }, DELAY);
  878. }, DELAY);
  879. });
  880. it('array', done => {
  881. let defaultValue = ['2000-01-01', '2000-02-01'];
  882. let expectValue = [new Date(2000, 0, 1), new Date(2000, 1, 1)];
  883. vm = createVue({
  884. template: '<el-date-picker type="daterange" v-model="value" ref="compo" :default-value="defaultValue" />',
  885. data() {
  886. return {
  887. value: '',
  888. defaultValue
  889. };
  890. }
  891. }, true);
  892. vm.$el.querySelector('input').focus();
  893. setTimeout(_ => {
  894. const defaultEls = vm.$refs.compo.picker.$el.querySelectorAll('.el-date-table td.default');
  895. expect(defaultEls.length).to.equal(2);
  896. defaultEls[0].click();
  897. setTimeout(_ => {
  898. defaultEls[1].click();
  899. setTimeout(_ => {
  900. expect(vm.value).to.eql(expectValue);
  901. done();
  902. }, DELAY);
  903. }, DELAY);
  904. }, DELAY);
  905. });
  906. });
  907. });
  908. describe('type:week', () => {
  909. let vm;
  910. beforeEach(done => {
  911. vm = createTest(DatePicker, {
  912. type: 'week'
  913. }, true);
  914. const input = vm.$el.querySelector('input');
  915. input.blur();
  916. input.focus();
  917. setTimeout(done, DELAY);
  918. });
  919. afterEach(() => destroyVM(vm));
  920. it('create', () => {
  921. expect(vm.picker.$el.querySelector('.is-week-mode')).to.be.ok;
  922. });
  923. it('click cell', done => {
  924. vm.picker.$el.querySelector('.el-date-table__row .available').click();
  925. setTimeout(_ => {
  926. expect(vm.picker.week).to.exist;
  927. done();
  928. }, DELAY);
  929. });
  930. it('click year label', () => {
  931. vm.picker.$el.querySelector('.el-date-picker__header-label').click();
  932. expect(vm.picker.currentView).to.equal('year');
  933. });
  934. it('click month label', () => {
  935. vm.picker.$el.querySelectorAll('.el-date-picker__header-label')[1].click();
  936. expect(vm.picker.currentView).to.equal('month');
  937. });
  938. it('select month', done => {
  939. vm.picker.$el.querySelectorAll('.el-date-picker__header-label')[1].click();
  940. setTimeout(_ => {
  941. vm.picker.$el.querySelector('.el-month-table .cell').click();
  942. setTimeout(_ => {
  943. expect(vm.picker.$el.querySelector('.el-date-table.is-week-mode').style.display).to.equal('');
  944. done();
  945. }, DELAY);
  946. }, DELAY);
  947. });
  948. });
  949. it('type:daterange', done => {
  950. vm = createTest(DatePicker, {
  951. type: 'daterange'
  952. }, true);
  953. const input = vm.$el.querySelector('input');
  954. input.click();
  955. setTimeout(_ => {
  956. const panels = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  957. expect(Array.prototype.slice.call(panels)).to.length(2);
  958. panels[0].querySelector('td.available').click();
  959. setTimeout(_ => {
  960. panels[1].querySelector('td.available').click();
  961. const {
  962. minDate,
  963. maxDate
  964. } = vm.picker;
  965. expect(minDate).to.exist;
  966. expect(maxDate).to.exist;
  967. expect(maxDate > minDate).to.true;
  968. done();
  969. }, DELAY);
  970. }, DELAY);
  971. });
  972. describe('type:datetimerange', () => {
  973. let vm;
  974. beforeEach(done => {
  975. vm = createTest(DatePicker, {
  976. type: 'datetimerange',
  977. value: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)]
  978. }, true);
  979. vm.$el.click();
  980. setTimeout(done, DELAY);
  981. });
  982. afterEach(() => destroyVM(vm));
  983. it('create', () => {
  984. expect(Array.prototype.slice.call(vm.picker.$el.querySelectorAll('.el-time-panel'))).to.length(2);
  985. });
  986. it('select daterange', done => {
  987. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  988. const leftCell = pickers[0].querySelector('td.available');
  989. const rightCell = pickers[1].querySelector('td.available');
  990. triggerEvent(leftCell, 'mousemove', true);
  991. triggerEvent(leftCell, 'click', true);
  992. setTimeout(_ => {
  993. triggerEvent(rightCell, 'mousemove', true);
  994. triggerEvent(rightCell, 'click', true);
  995. setTimeout(_ => {
  996. const {
  997. minDate,
  998. maxDate
  999. } = vm.picker;
  1000. const minMonth = minDate.getMonth();
  1001. const maxMonth = maxDate.getMonth();
  1002. expect([1, -11]).to.include(maxMonth - minMonth); // one month
  1003. done();
  1004. }, DELAY);
  1005. }, DELAY);
  1006. });
  1007. it('prev/next month button', done => {
  1008. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-arrow-left');
  1009. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-arrow-right');
  1010. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  1011. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  1012. const leftText = left.textContent.match(/\d+/g);
  1013. const rightText = right.textContent.match(/\d+/g);
  1014. let count = 20;
  1015. while (--count) {
  1016. leftBtn.click();
  1017. }
  1018. count = 18;
  1019. while (--count) {
  1020. rightBtn.click();
  1021. }
  1022. setTimeout(_ => {
  1023. const newLeft = left.textContent.match(/\d+/g);
  1024. const newRight = right.textContent.match(/\d+/g);
  1025. expect(leftText[1] - newLeft[1]).to.equal(2);
  1026. expect(leftText[0] - newLeft[0]).to.equal(0);
  1027. expect([-10, 2]).to.include(rightText[1] - newRight[1]);
  1028. expect([0, 1]).to.include(rightText[0] - newRight[0]);
  1029. done();
  1030. }, DELAY);
  1031. });
  1032. it('prev/next year button', done => {
  1033. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-d-arrow-left');
  1034. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-d-arrow-right');
  1035. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  1036. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  1037. const leftText = left.textContent.match(/\d+/g);
  1038. const rightText = right.textContent.match(/\d+/g);
  1039. let count = 20;
  1040. while (--count) {
  1041. leftBtn.click();
  1042. }
  1043. count = 18;
  1044. while (--count) {
  1045. rightBtn.click();
  1046. }
  1047. setTimeout(_ => {
  1048. const newLeft = left.textContent.match(/\d+/g);
  1049. const newRight = right.textContent.match(/\d+/g);
  1050. expect(leftText[1] - newLeft[1]).to.equal(0);
  1051. expect(leftText[0] - newLeft[0]).to.equal(2);
  1052. expect(rightText[1] - newRight[1]).to.equal(0);
  1053. expect(rightText[0] - newRight[0]).to.equal(2);
  1054. done();
  1055. }, DELAY);
  1056. });
  1057. it('input date', done => {
  1058. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  1059. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1060. const leftCell = pickers[0].querySelector('td.available');
  1061. const rightCell = pickers[1].querySelector('td.available');
  1062. triggerEvent(leftCell, 'mousemove', true);
  1063. triggerEvent(leftCell, 'click', true);
  1064. setTimeout(_ => {
  1065. triggerEvent(rightCell, 'mousemove', true);
  1066. triggerEvent(rightCell, 'click', true);
  1067. setTimeout(_ => {
  1068. triggerEvent(input, 'input');
  1069. input.value = '1989-6-4';
  1070. triggerEvent(input, 'change', true);
  1071. setTimeout(_ => {
  1072. const minDate = vm.picker.minDate;
  1073. expect(minDate.getFullYear()).to.equal(1989);
  1074. expect(minDate.getMonth()).to.equal(5);
  1075. expect(minDate.getDate()).to.equal(4);
  1076. done();
  1077. }, DELAY);
  1078. }, DELAY);
  1079. }, DELAY);
  1080. });
  1081. it('input date when minDate > maxDate', done => {
  1082. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  1083. const input2 = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[2];
  1084. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1085. const leftCell = pickers[0].querySelector('td.available');
  1086. const rightCell = pickers[1].querySelector('td.available');
  1087. triggerEvent(leftCell, 'mousemove', true);
  1088. triggerEvent(leftCell, 'click', true);
  1089. setTimeout(_ => {
  1090. triggerEvent(rightCell, 'mousemove', true);
  1091. triggerEvent(rightCell, 'click', true);
  1092. setTimeout(_ => {
  1093. triggerEvent(input2, 'input');
  1094. input2.value = '1988-6-4';
  1095. triggerEvent(input2, 'change');
  1096. setTimeout(_ => {
  1097. triggerEvent(input, 'input');
  1098. input.value = '1989-6-4';
  1099. triggerEvent(input, 'change', true);
  1100. setTimeout(_ => {
  1101. expect(vm.picker.maxDate > vm.picker.minDate).to.true;
  1102. done();
  1103. }, DELAY);
  1104. }, DELAY);
  1105. }, DELAY);
  1106. }, DELAY);
  1107. });
  1108. it('select time', done => {
  1109. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[1];
  1110. input.blur();
  1111. input.focus();
  1112. input.blur();
  1113. setTimeout(_ => {
  1114. const button = vm.picker.$el.querySelector('.el-date-range-picker__time-picker-wrap .el-time-panel .confirm');
  1115. button.click();
  1116. setTimeout(_ => {
  1117. expect(input.value).to.exist;
  1118. done();
  1119. }, DELAY);
  1120. }, DELAY);
  1121. });
  1122. });
  1123. const currentMonth = new Date(new Date().getTime());
  1124. currentMonth.setDate(1);
  1125. const chineseWeek = ['一', '二', '三', '四', '五', '六', '日'];
  1126. const testWeek = (i) => it('picker-options:firstDayOfWeek ' + i, done => {
  1127. vm = createTest(DatePicker, {
  1128. pickerOptions: {
  1129. firstDayOfWeek: i
  1130. }
  1131. }, true);
  1132. const input = vm.$el.querySelector('input');
  1133. input.blur();
  1134. input.focus();
  1135. setTimeout(_ => {
  1136. const firstWeek = vm.picker.$el.querySelector('tr th');
  1137. expect(firstWeek.innerText).to.equal(chineseWeek[i - 1]);
  1138. done();
  1139. });
  1140. });
  1141. for (var i = 1; i <= 7; i++) {
  1142. testWeek(i);
  1143. }
  1144. it('picker-options:shortcuts', done => {
  1145. let test;
  1146. vm = createTest(DatePicker, {
  1147. pickerOptions: {
  1148. shortcuts: [{
  1149. text: '今天',
  1150. onClick(picker) {
  1151. test = true;
  1152. picker.$emit('pick', new Date());
  1153. }
  1154. }]
  1155. }
  1156. }, true);
  1157. const input = vm.$el.querySelector('input');
  1158. input.blur();
  1159. input.focus();
  1160. setTimeout(_ => {
  1161. const shortcut = vm.picker.$el.querySelector('.el-picker-panel__shortcut');
  1162. expect(shortcut.textContent).to.be.equal('今天');
  1163. expect(vm.picker.$el.querySelector('.el-picker-panel__sidebar')).to.be.ok;
  1164. shortcut.click();
  1165. setTimeout(_ => {
  1166. expect(test).to.true;
  1167. done();
  1168. }, DELAY);
  1169. }, DELAY);
  1170. });
  1171. describe('picker-options:disabledDate', () => {
  1172. let vm;
  1173. beforeEach(done => {
  1174. vm = createTest(DatePicker, {
  1175. value: new Date(),
  1176. pickerOptions: {
  1177. disabledDate(time) {
  1178. return time.getTime() < Date.now() - 8.64e7;
  1179. }
  1180. }
  1181. }, true);
  1182. const input = vm.$el.querySelector('input');
  1183. input.blur();
  1184. input.focus();
  1185. setTimeout(done, DELAY);
  1186. });
  1187. afterEach(() => destroyVM(vm));
  1188. it('create', () => {
  1189. expect(vm.picker.$el.querySelector('.disabled')).to.be.ok;
  1190. });
  1191. it('set value', done => {
  1192. const date = new Date(3000, 10, 10, 10, 10, 10);
  1193. vm.picker.value = date;
  1194. setTimeout(_ => {
  1195. expect(vm.picker.date.getTime() === date.getTime()).to.true;
  1196. done();
  1197. }, DELAY);
  1198. });
  1199. });
  1200. });