date-picker.spec.js 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408
  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. it('type:daterange with unlink-panels', done => {
  973. vm = createTest(DatePicker, {
  974. type: 'daterange',
  975. unlinkPanels: true
  976. }, true);
  977. const input = vm.$el.querySelector('input');
  978. input.click();
  979. setTimeout(_ => {
  980. const panels = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  981. expect(Array.prototype.slice.call(panels)).to.length(2);
  982. panels[1].querySelector('.el-icon-d-arrow-right').click();
  983. panels[1].querySelector('.el-icon-arrow-right').click();
  984. setTimeout(_ => {
  985. const left = panels[0].querySelector('.el-date-range-picker__header');
  986. const right = panels[1].querySelector('.is-right .el-date-range-picker__header');
  987. const leftText = left.textContent.match(/\d+/g);
  988. const rightText = right.textContent.match(/\d+/g);
  989. expect(rightText[0] - leftText[0]).to.equal(1);
  990. expect((rightText[1] <= 2 ? rightText[1] + 12 : rightText[1]) - leftText[1]).to.equal(2);
  991. done();
  992. }, DELAY);
  993. }, DELAY);
  994. });
  995. describe('type:datetimerange', () => {
  996. let vm;
  997. beforeEach(done => {
  998. vm = createTest(DatePicker, {
  999. type: 'datetimerange',
  1000. value: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)]
  1001. }, true);
  1002. vm.$el.click();
  1003. setTimeout(done, DELAY);
  1004. });
  1005. afterEach(() => destroyVM(vm));
  1006. it('create', () => {
  1007. expect(Array.prototype.slice.call(vm.picker.$el.querySelectorAll('.el-time-panel'))).to.length(2);
  1008. });
  1009. it('select daterange', done => {
  1010. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1011. const leftCell = pickers[0].querySelector('td.available');
  1012. const rightCell = pickers[1].querySelector('td.available');
  1013. triggerEvent(leftCell, 'mousemove', true);
  1014. triggerEvent(leftCell, 'click', true);
  1015. setTimeout(_ => {
  1016. triggerEvent(rightCell, 'mousemove', true);
  1017. triggerEvent(rightCell, 'click', true);
  1018. setTimeout(_ => {
  1019. const {
  1020. minDate,
  1021. maxDate
  1022. } = vm.picker;
  1023. const minMonth = minDate.getMonth();
  1024. const maxMonth = maxDate.getMonth();
  1025. expect([1, -11]).to.include(maxMonth - minMonth); // one month
  1026. done();
  1027. }, DELAY);
  1028. }, DELAY);
  1029. });
  1030. it('prev/next month button', done => {
  1031. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-arrow-left');
  1032. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-arrow-right');
  1033. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  1034. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  1035. const leftText = left.textContent.match(/\d+/g);
  1036. const rightText = right.textContent.match(/\d+/g);
  1037. let count = 20;
  1038. while (--count) {
  1039. leftBtn.click();
  1040. }
  1041. count = 18;
  1042. while (--count) {
  1043. rightBtn.click();
  1044. }
  1045. setTimeout(_ => {
  1046. const newLeft = left.textContent.match(/\d+/g);
  1047. const newRight = right.textContent.match(/\d+/g);
  1048. expect(leftText[1] - newLeft[1]).to.equal(2);
  1049. expect(leftText[0] - newLeft[0]).to.equal(0);
  1050. expect([-10, 2]).to.include(rightText[1] - newRight[1]);
  1051. expect([0, 1]).to.include(rightText[0] - newRight[0]);
  1052. done();
  1053. }, DELAY);
  1054. });
  1055. it('prev/next year button', done => {
  1056. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-d-arrow-left');
  1057. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-d-arrow-right');
  1058. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  1059. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  1060. const leftText = left.textContent.match(/\d+/g);
  1061. const rightText = right.textContent.match(/\d+/g);
  1062. let count = 20;
  1063. while (--count) {
  1064. leftBtn.click();
  1065. }
  1066. count = 18;
  1067. while (--count) {
  1068. rightBtn.click();
  1069. }
  1070. setTimeout(_ => {
  1071. const newLeft = left.textContent.match(/\d+/g);
  1072. const newRight = right.textContent.match(/\d+/g);
  1073. expect(leftText[1] - newLeft[1]).to.equal(0);
  1074. expect(leftText[0] - newLeft[0]).to.equal(2);
  1075. expect(rightText[1] - newRight[1]).to.equal(0);
  1076. expect(rightText[0] - newRight[0]).to.equal(2);
  1077. done();
  1078. }, DELAY);
  1079. });
  1080. it('input date', done => {
  1081. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  1082. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1083. const leftCell = pickers[0].querySelector('td.available');
  1084. const rightCell = pickers[1].querySelector('td.available');
  1085. triggerEvent(leftCell, 'mousemove', true);
  1086. triggerEvent(leftCell, 'click', true);
  1087. setTimeout(_ => {
  1088. triggerEvent(rightCell, 'mousemove', true);
  1089. triggerEvent(rightCell, 'click', true);
  1090. setTimeout(_ => {
  1091. triggerEvent(input, 'input');
  1092. input.value = '1989-6-4';
  1093. triggerEvent(input, 'change', true);
  1094. setTimeout(_ => {
  1095. const minDate = vm.picker.minDate;
  1096. expect(minDate.getFullYear()).to.equal(1989);
  1097. expect(minDate.getMonth()).to.equal(5);
  1098. expect(minDate.getDate()).to.equal(4);
  1099. done();
  1100. }, DELAY);
  1101. }, DELAY);
  1102. }, DELAY);
  1103. });
  1104. it('input date when minDate > maxDate', done => {
  1105. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  1106. const input2 = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[2];
  1107. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1108. const leftCell = pickers[0].querySelector('td.available');
  1109. const rightCell = pickers[1].querySelector('td.available');
  1110. triggerEvent(leftCell, 'mousemove', true);
  1111. triggerEvent(leftCell, 'click', true);
  1112. setTimeout(_ => {
  1113. triggerEvent(rightCell, 'mousemove', true);
  1114. triggerEvent(rightCell, 'click', true);
  1115. setTimeout(_ => {
  1116. triggerEvent(input2, 'input');
  1117. input2.value = '1988-6-4';
  1118. triggerEvent(input2, 'change');
  1119. setTimeout(_ => {
  1120. triggerEvent(input, 'input');
  1121. input.value = '1989-6-4';
  1122. triggerEvent(input, 'change', true);
  1123. setTimeout(_ => {
  1124. expect(vm.picker.maxDate > vm.picker.minDate).to.true;
  1125. done();
  1126. }, DELAY);
  1127. }, DELAY);
  1128. }, DELAY);
  1129. }, DELAY);
  1130. });
  1131. it('select time', done => {
  1132. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[1];
  1133. input.blur();
  1134. input.focus();
  1135. input.blur();
  1136. setTimeout(_ => {
  1137. const button = vm.picker.$el.querySelector('.el-date-range-picker__time-picker-wrap .el-time-panel .confirm');
  1138. button.click();
  1139. setTimeout(_ => {
  1140. expect(input.value).to.exist;
  1141. done();
  1142. }, DELAY);
  1143. }, DELAY);
  1144. });
  1145. });
  1146. const currentMonth = new Date(new Date().getTime());
  1147. currentMonth.setDate(1);
  1148. const chineseWeek = ['一', '二', '三', '四', '五', '六', '日'];
  1149. const testWeek = (i) => it('picker-options:firstDayOfWeek ' + i, done => {
  1150. vm = createTest(DatePicker, {
  1151. pickerOptions: {
  1152. firstDayOfWeek: i
  1153. }
  1154. }, true);
  1155. const input = vm.$el.querySelector('input');
  1156. input.blur();
  1157. input.focus();
  1158. setTimeout(_ => {
  1159. const firstWeek = vm.picker.$el.querySelector('tr th');
  1160. expect(firstWeek.innerText).to.equal(chineseWeek[i - 1]);
  1161. done();
  1162. });
  1163. });
  1164. for (var i = 1; i <= 7; i++) {
  1165. testWeek(i);
  1166. }
  1167. it('picker-options:shortcuts', done => {
  1168. let test;
  1169. vm = createTest(DatePicker, {
  1170. pickerOptions: {
  1171. shortcuts: [{
  1172. text: '今天',
  1173. onClick(picker) {
  1174. test = true;
  1175. picker.$emit('pick', new Date());
  1176. }
  1177. }]
  1178. }
  1179. }, true);
  1180. const input = vm.$el.querySelector('input');
  1181. input.blur();
  1182. input.focus();
  1183. setTimeout(_ => {
  1184. const shortcut = vm.picker.$el.querySelector('.el-picker-panel__shortcut');
  1185. expect(shortcut.textContent).to.be.equal('今天');
  1186. expect(vm.picker.$el.querySelector('.el-picker-panel__sidebar')).to.be.ok;
  1187. shortcut.click();
  1188. setTimeout(_ => {
  1189. expect(test).to.true;
  1190. done();
  1191. }, DELAY);
  1192. }, DELAY);
  1193. });
  1194. describe('picker-options:disabledDate', () => {
  1195. let vm;
  1196. beforeEach(done => {
  1197. vm = createTest(DatePicker, {
  1198. value: new Date(),
  1199. pickerOptions: {
  1200. disabledDate(time) {
  1201. return time.getTime() < Date.now() - 8.64e7;
  1202. }
  1203. }
  1204. }, true);
  1205. const input = vm.$el.querySelector('input');
  1206. input.blur();
  1207. input.focus();
  1208. setTimeout(done, DELAY);
  1209. });
  1210. afterEach(() => destroyVM(vm));
  1211. it('create', () => {
  1212. expect(vm.picker.$el.querySelector('.disabled')).to.be.ok;
  1213. });
  1214. it('set value', done => {
  1215. const date = new Date(3000, 10, 10, 10, 10, 10);
  1216. vm.picker.value = date;
  1217. setTimeout(_ => {
  1218. expect(vm.picker.date.getTime() === date.getTime()).to.true;
  1219. done();
  1220. }, DELAY);
  1221. });
  1222. });
  1223. });