date-picker.spec.js 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775
  1. import {
  2. createTest,
  3. createVue,
  4. destroyVM,
  5. triggerEvent,
  6. wait
  7. } from '../util';
  8. import DatePicker from 'packages/date-picker';
  9. const DELAY = 50;
  10. const LEFT = 37;
  11. const ENTER = 13;
  12. const TAB = 9;
  13. const keyDown = (el, keyCode) => {
  14. const evt = document.createEvent('Events');
  15. evt.initEvent('keydown', true, true);
  16. evt.keyCode = keyCode;
  17. el.dispatchEvent(evt);
  18. };
  19. describe('DatePicker', () => {
  20. let vm;
  21. afterEach(() => { destroyVM(vm); });
  22. it('create', () => {
  23. vm = createTest(DatePicker, {
  24. readonly: true,
  25. placeholder: '23333',
  26. format: 'HH-mm-ss'
  27. }, true);
  28. const input = vm.$el.querySelector('input');
  29. expect(input.getAttribute('placeholder')).to.equal('23333');
  30. expect(input.getAttribute('readonly')).to.equal('readonly');
  31. });
  32. it('select date', done => {
  33. vm = createVue({
  34. template: `
  35. <el-date-picker ref="compo" v-model="value"></el-date-picker>
  36. `,
  37. data() {
  38. return {
  39. value: ''
  40. };
  41. }
  42. }, true);
  43. const input = vm.$el.querySelector('input');
  44. const date = new Date();
  45. input.blur();
  46. input.focus();
  47. setTimeout(_ => {
  48. const $el = vm.$refs.compo.picker.$el;
  49. const spans = $el.querySelectorAll('.el-date-picker__header-label');
  50. const arrowLeftElm = $el.querySelector('.el-date-picker__prev-btn.el-icon-arrow-left');
  51. const arrowRightElm = $el.querySelector('.el-date-picker__next-btn.el-icon-arrow-right');
  52. expect(spans[0].textContent).to.include(date.getFullYear());
  53. expect(spans[1].textContent).to.include(date.getMonth() + 1);
  54. $el.querySelector('.el-date-picker__prev-btn.el-icon-d-arrow-left').click();
  55. let count = 20;
  56. while (--count) {
  57. arrowLeftElm.click();
  58. }
  59. count = 20;
  60. while (--count) {
  61. arrowRightElm.click();
  62. }
  63. setTimeout(_ => {
  64. expect(spans[0].textContent).to.include(date.getFullYear() - 1);
  65. expect(spans[1].textContent).to.include(date.getMonth() + 1);
  66. $el.querySelector('td.available').click();
  67. vm.$nextTick(_ => {
  68. expect(vm.value).to.exist;
  69. });
  70. done();
  71. }, DELAY);
  72. }, DELAY);
  73. });
  74. it('clear value', done => {
  75. vm = createVue({
  76. template: `
  77. <el-date-picker v-model="value" ref="compo"></el-date-picker>
  78. `,
  79. data() {
  80. return {
  81. value: ''
  82. };
  83. }
  84. }, true);
  85. const input = vm.$el.querySelector('input');
  86. input.focus();
  87. setTimeout(_ => {
  88. const $el = vm.$refs.compo.picker.$el;
  89. $el.querySelector('td.available').click();
  90. setTimeout(_ => {
  91. vm.$refs.compo.showClose = true;
  92. vm.$refs.compo.handleClickIcon({ stopPropagation: () => null });
  93. setTimeout(_ => {
  94. expect(vm.value).to.equal(null);
  95. done();
  96. }, DELAY);
  97. }, DELAY);
  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. it('change event: when clear(), without opening picker', done => {
  206. vm = createVue({
  207. template: `
  208. <el-date-picker
  209. ref="compo"
  210. v-model="value"
  211. />`,
  212. data() {
  213. return {
  214. value: new Date()
  215. };
  216. }
  217. }, true);
  218. const spy = sinon.spy();
  219. vm.$refs.compo.$on('change', spy);
  220. setTimeout(_ => {
  221. vm.$refs.compo.showClose = true;
  222. vm.$refs.compo.handleClickIcon({ stopPropagation: () => null });
  223. setTimeout(_ => {
  224. expect(spy.calledOnce).to.equal(true);
  225. expect(spy.calledWith(null)).to.equal(true);
  226. done();
  227. }, DELAY);
  228. }, DELAY);
  229. });
  230. it('nuke invalid input on close', done => {
  231. vm = createVue({
  232. template: '<el-date-picker v-model="value" value-format="yyyy-MM-dd" ref="compo" />',
  233. data() {
  234. return {
  235. value: '2010-10-01'
  236. };
  237. }
  238. }, true);
  239. const compo = vm.$refs.compo;
  240. const input = compo.$el.querySelector('input');
  241. input.blur();
  242. input.focus();
  243. setTimeout(_ => {
  244. compo.userInput = 'abc';
  245. compo.handleChange(); // simplified test
  246. compo.handleClose();
  247. setTimeout(_ => {
  248. expect(input.value).to.equal('2010-10-01');
  249. expect(vm.value).to.equal('2010-10-01');
  250. done();
  251. }, DELAY);
  252. }, DELAY);
  253. });
  254. it('select datetime with defaultTime', done => {
  255. vm = createVue({
  256. template: `
  257. <el-date-picker ref="compo" type="datetime" v-model="value" default-time="12:00:00"></el-date-picker>
  258. `,
  259. data() {
  260. return {
  261. value: ''
  262. };
  263. }
  264. }, true);
  265. const input = vm.$el.querySelector('input');
  266. input.blur();
  267. input.focus();
  268. setTimeout(_ => {
  269. const picker = vm.$refs.compo.picker;
  270. picker.$el.querySelector('td.available').click();
  271. setTimeout(_ => {
  272. const date = vm.$refs.compo.picker.date;
  273. expect(date.getHours()).to.equal(12);
  274. expect(date.getMinutes()).to.equal(0);
  275. expect(date.getSeconds()).to.equal(0);
  276. done();
  277. }, DELAY);
  278. }, DELAY);
  279. });
  280. describe('input event', () => {
  281. // mimic standard <select>'s behavior
  282. // emit input if and only if value changes
  283. afterEach(() => { destroyVM(vm); });
  284. it('works for type=date', done => {
  285. let emitted = false;
  286. vm = createVue({
  287. template: `
  288. <el-date-picker
  289. ref="compo"
  290. v-model="value"
  291. type="date"
  292. @input="handleInput" />`,
  293. methods: {
  294. handleInput(val) {
  295. emitted = true;
  296. }
  297. },
  298. data() {
  299. return {
  300. value: ''
  301. };
  302. }
  303. }, true);
  304. const input = vm.$el.querySelector('input');
  305. input.blur();
  306. input.focus();
  307. setTimeout(_ => {
  308. const picker = vm.$refs.compo.picker;
  309. picker.$el.querySelector('td.available').click();
  310. setTimeout(_ => {
  311. expect(emitted).to.true;
  312. emitted = false;
  313. setTimeout(_ => {
  314. input.blur();
  315. input.focus();
  316. picker.$el.querySelector('td.available').click();
  317. setTimeout(_ => {
  318. expect(emitted).to.false;
  319. done();
  320. }, DELAY);
  321. }, DELAY);
  322. }, DELAY);
  323. }, DELAY);
  324. });
  325. it('works for type=daterange', done => {
  326. let emitted = false;
  327. vm = createVue({
  328. template: `
  329. <el-date-picker
  330. ref="compo"
  331. v-model="value"
  332. type="daterange"
  333. @input="handleInput" />`,
  334. methods: {
  335. handleInput(val) {
  336. emitted = true;
  337. }
  338. },
  339. data() {
  340. return {
  341. value: ''
  342. };
  343. }
  344. }, true);
  345. const input = vm.$el.querySelector('input');
  346. input.click();
  347. setTimeout(_ => {
  348. const picker = vm.$refs.compo.picker;
  349. picker.$el.querySelector('td.available').click();
  350. setTimeout(_ => {
  351. picker.$el.querySelector('td.available + td.available').click();
  352. setTimeout(_ => {
  353. expect(emitted).to.true;
  354. emitted = false;
  355. setTimeout(_ => {
  356. input.blur();
  357. input.focus();
  358. const picker = vm.$refs.compo.picker;
  359. picker.$el.querySelector('td.available').click();
  360. setTimeout(_ => {
  361. picker.$el.querySelector('td.available + td.available').click();
  362. setTimeout(_ => {
  363. expect(emitted).to.false;
  364. done();
  365. });
  366. }, DELAY);
  367. }, DELAY);
  368. });
  369. }, DELAY);
  370. }, DELAY);
  371. });
  372. it('work for event focus and blur', done => {
  373. vm = createVue({
  374. template: `
  375. <el-date-picker ref="picker"/>
  376. `
  377. }, true);
  378. const spyFocus = sinon.spy();
  379. const spyBlur = sinon.spy();
  380. vm.$refs.picker.$on('focus', spyFocus);
  381. vm.$refs.picker.$on('blur', spyBlur);
  382. vm.$el.querySelector('input').focus();
  383. vm.$nextTick(_ => {
  384. expect(spyFocus.calledOnce).to.be.true;
  385. vm.$refs.picker.pickerVisible = false;
  386. vm.$nextTick(_ => {
  387. expect(spyBlur.calledOnce).to.be.true;
  388. done();
  389. });
  390. });
  391. });
  392. });
  393. describe('value-format', () => {
  394. afterEach(() => { destroyVM(vm); });
  395. it('emits', done => {
  396. vm = createVue({
  397. template: `
  398. <el-date-picker
  399. ref="compo"
  400. v-model="value"
  401. type="date"
  402. value-format="dd/MM yyyy" />`,
  403. data() {
  404. return {
  405. value: ''
  406. };
  407. }
  408. }, true);
  409. const spy = sinon.spy();
  410. vm.$refs.compo.$on('change', spy);
  411. vm.$refs.compo.$el.querySelector('input').focus();
  412. setTimeout(_ => {
  413. vm.$refs.compo.picker.$el.querySelector('.el-date-table td.available').click();
  414. setTimeout(_ => {
  415. const today = new Date();
  416. const yyyy = today.getFullYear();
  417. const MM = ('0' + (today.getMonth() + 1)).slice(-2);
  418. const dd = '01'; // first available one should be first day of month
  419. const expectValue = `${dd}/${MM} ${yyyy}`;
  420. expect(vm.value).to.equal(expectValue);
  421. expect(spy.calledOnce).to.be.true;
  422. expect(spy.calledWith(expectValue)).to.be.true;
  423. done();
  424. }, DELAY);
  425. }, DELAY);
  426. });
  427. it('accepts', done => {
  428. vm = createVue({
  429. template: `
  430. <el-date-picker
  431. ref="compo"
  432. v-model="value"
  433. type="date"
  434. format="yyyy-MM-dd"
  435. value-format="dd/MM yyyy" />`,
  436. data() {
  437. return {
  438. value: '01/02 2000'
  439. };
  440. }
  441. }, true);
  442. const input = vm.$refs.compo.$el.querySelector('input');
  443. expect(input.value).to.equal('2000-02-01');
  444. expect(vm.$refs.compo.parsedValue).to.be.an.instanceof(Date);
  445. input.focus();
  446. setTimeout(_ => {
  447. const date = vm.$refs.compo.picker.date;
  448. expect(date.getFullYear()).to.equal(2000);
  449. expect(date.getMonth()).to.equal(1);
  450. expect(date.getDate()).to.equal(1);
  451. vm.$refs.compo.picker.$el.querySelector('.el-date-table .current').click();
  452. setTimeout(_ => {
  453. expect(input.value).to.equal('2000-02-01');
  454. done();
  455. }, DELAY);
  456. }, DELAY);
  457. });
  458. it('translates format to value-format', done => {
  459. vm = createVue({
  460. template: `
  461. <el-date-picker
  462. ref="compo"
  463. v-model="value"
  464. type="date"
  465. format="yyyy-MM-dd"
  466. value-format="dd/MM yyyy" />`,
  467. data() {
  468. return {
  469. value: ''
  470. };
  471. }
  472. }, true);
  473. const input = vm.$refs.compo.$el.querySelector('input');
  474. input.focus();
  475. setTimeout(_ => {
  476. input.value = '2000-10-01';
  477. triggerEvent(input, 'input');
  478. keyDown(input, ENTER);
  479. setTimeout(_ => {
  480. expect(vm.value).to.equal('01/10 2000');
  481. done();
  482. }, DELAY);
  483. }, DELAY);
  484. });
  485. it('works for daterange', done => {
  486. vm = createVue({
  487. template: `
  488. <el-date-picker
  489. ref="compo"
  490. v-model="value"
  491. type="daterange"
  492. format="yyyy-MM-dd"
  493. value-format="dd/MM yyyy" />`,
  494. data() {
  495. return {
  496. value: ''
  497. };
  498. }
  499. }, true);
  500. const inputs = vm.$refs.compo.$el.querySelectorAll('input');
  501. inputs[0].focus();
  502. setTimeout(_ => {
  503. inputs[0].value = '2000-10-01';
  504. triggerEvent(inputs[0], 'input');
  505. keyDown(inputs[0], TAB);
  506. setTimeout(_ => {
  507. inputs[1].focus();
  508. inputs[1].value = '2000-10-02';
  509. triggerEvent(inputs[1], 'input');
  510. keyDown(inputs[0], ENTER);
  511. setTimeout(_ => {
  512. expect(vm.value).to.eql(['01/10 2000', '02/10 2000']);
  513. done();
  514. }, DELAY);
  515. }, DELAY);
  516. }, DELAY);
  517. });
  518. it('is timestamp', done => {
  519. vm = createVue({
  520. template: `
  521. <el-date-picker
  522. ref="compo"
  523. v-model="value"
  524. type="date"
  525. format="yyyy-MM-dd"
  526. value-format="timestamp" />`,
  527. data() {
  528. return {
  529. value: Date.now()
  530. };
  531. }
  532. }, true);
  533. const input = vm.$refs.compo.$el.querySelector('input');
  534. input.focus();
  535. setTimeout(_ => {
  536. // check timestamp is parsed internally
  537. expect(vm.$refs.compo.parsedValue.getTime()).to.equal(vm.value);
  538. input.value = '2000-10-01';
  539. triggerEvent(input, 'input');
  540. keyDown(input, ENTER);
  541. setTimeout(_ => {
  542. expect(vm.value).to.equal(new Date(2000, 9, 1).getTime());
  543. done();
  544. }, DELAY);
  545. }, DELAY);
  546. });
  547. it('works for daterange, is timestamp', done => {
  548. vm = createVue({
  549. template: `
  550. <el-date-picker
  551. ref="compo"
  552. v-model="value"
  553. type="daterange"
  554. format="yyyy-MM-dd"
  555. value-format="timestamp" />`,
  556. data() {
  557. return {
  558. value: [Date.now(), Date.now() + 86400 * 1000]
  559. };
  560. }
  561. }, true);
  562. const inputs = vm.$refs.compo.$el.querySelectorAll('input');
  563. inputs[0].focus();
  564. setTimeout(_ => {
  565. // check timestamp is parsed internally
  566. expect(vm.$refs.compo.parsedValue[0].getTime()).to.equal(vm.value[0]);
  567. expect(vm.$refs.compo.parsedValue[1].getTime()).to.equal(vm.value[1]);
  568. inputs[0].value = '2000-10-01';
  569. triggerEvent(inputs[0], 'input');
  570. keyDown(inputs[0], TAB);
  571. setTimeout(_ => {
  572. inputs[1].focus();
  573. inputs[1].value = '2000-10-02';
  574. triggerEvent(inputs[1], 'input');
  575. keyDown(inputs[0], ENTER);
  576. setTimeout(_ => {
  577. expect(vm.value).to.eql([
  578. new Date(2000, 9, 1).getTime(),
  579. new Date(2000, 9, 2).getTime()
  580. ]);
  581. done();
  582. }, DELAY);
  583. }, DELAY);
  584. }, DELAY);
  585. });
  586. });
  587. describe('default value', () => {
  588. afterEach(() => { destroyVM(vm); });
  589. it('it works', done => {
  590. let defaultValue = '2000-01-01';
  591. let expectValue = new Date(2000, 0, 1);
  592. vm = createVue({
  593. template: `<el-date-picker v-model="value" ref="compo" default-value="${defaultValue}" />`,
  594. data() {
  595. return {
  596. value: ''
  597. };
  598. }
  599. }, true);
  600. vm.$el.querySelector('input').focus();
  601. setTimeout(_ => {
  602. const $el = vm.$refs.compo.picker.$el;
  603. expect($el.querySelector('.el-month-table td.default')).to.exist;
  604. expect($el.querySelector('.el-year-table td.default')).to.exist;
  605. const defaultEls = $el.querySelectorAll('.el-date-table td.default');
  606. expect(defaultEls.length).to.equal(1);
  607. defaultEls[0].click();
  608. setTimeout(_ => {
  609. expect(vm.value).to.eql(expectValue);
  610. done();
  611. }, DELAY);
  612. }, DELAY);
  613. });
  614. it('is reactive, works with clear', done => {
  615. let defaultValue = '2000-01-01';
  616. let expectValue = new Date(2000, 0, 1);
  617. vm = createVue({
  618. template: '<el-date-picker v-model="value" ref="compo" :default-value="defaultValue" />',
  619. data() {
  620. return {
  621. value: new Date(),
  622. defaultValue: null
  623. };
  624. }
  625. }, true);
  626. const input = vm.$el.querySelector('input');
  627. input.focus();
  628. setTimeout(_ => {
  629. let $el = vm.$refs.compo.picker.$el;
  630. expect($el.querySelector('.el-date-table td.current')).to.exist;
  631. vm.defaultValue = defaultValue;
  632. triggerEvent(vm.$refs.compo.$el, 'mouseenter');
  633. setTimeout(_ => {
  634. vm.$el.querySelector('.el-icon-circle-close').click();
  635. setTimeout(_ => {
  636. input.focus();
  637. setTimeout(() => {
  638. $el = vm.$refs.compo.picker.$el;
  639. expect($el.querySelector('.el-date-table td.current')).to.not.exist;
  640. expect($el.querySelector('.el-date-table td.default')).to.exist;
  641. $el.querySelector('.el-date-table td.default').click();
  642. setTimeout(() => {
  643. expect(vm.value).to.eql(expectValue);
  644. done();
  645. }, DELAY);
  646. }, DELAY);
  647. }, DELAY);
  648. }, DELAY);
  649. }, DELAY);
  650. });
  651. });
  652. describe('keydown', () => {
  653. let input, datePicker;
  654. beforeEach(done => {
  655. vm = createVue({
  656. template: '<el-date-picker ref="compo" v-model="value"></el-date-picker>',
  657. data() {
  658. return {
  659. value: ''
  660. };
  661. }
  662. }, true);
  663. datePicker = vm.$refs.compo;
  664. input = vm.$el.querySelector('input');
  665. input.blur();
  666. input.focus();
  667. setTimeout(done, DELAY);
  668. });
  669. afterEach(() => destroyVM(vm));
  670. it('tab', done => {
  671. keyDown(input, TAB);
  672. setTimeout(_ => {
  673. expect(datePicker.pickerVisible).to.false;
  674. done();
  675. }, DELAY);
  676. });
  677. it('enter', done => {
  678. input.value = '2000-10-1';
  679. triggerEvent(input, 'input');
  680. vm.$nextTick(_ => {
  681. keyDown(input, ENTER);
  682. setTimeout(_ => {
  683. expect(datePicker.pickerVisible).to.false;
  684. expect(datePicker.picker.date.getFullYear()).to.equal(2000);
  685. expect(datePicker.picker.date.getMonth()).to.equal(9);
  686. expect(datePicker.picker.date.getDate()).to.equal(1);
  687. done();
  688. }, DELAY);
  689. });
  690. });
  691. it('arrow keys during typing does not navigate', done => {
  692. const inputText = '2000-10-1';
  693. input.value = inputText;
  694. triggerEvent(input, 'input');
  695. keyDown(input, LEFT);
  696. vm.$nextTick(_ => {
  697. expect(input.value).to.equal(inputText);
  698. done();
  699. });
  700. });
  701. it('arrow keys navigates', done => {
  702. const date = new Date(2000, 9, 1);
  703. const prevDate = new Date(2000, 9, 0);
  704. vm.value = date;
  705. vm.$nextTick(_ => {
  706. keyDown(input, LEFT);
  707. setTimeout(_ => {
  708. expect(datePicker.pickerVisible).to.true;
  709. expect(datePicker.picker.date.getFullYear()).to.equal(prevDate.getFullYear());
  710. expect(datePicker.picker.date.getMonth()).to.equal(prevDate.getMonth());
  711. expect(datePicker.picker.date.getDate()).to.equal(prevDate.getDate());
  712. done();
  713. }, DELAY);
  714. });
  715. });
  716. });
  717. describe('can be cleared using keyboard', () => {
  718. afterEach(() => { destroyVM(vm); });
  719. it('works for type=date, when blur', done => {
  720. vm = createVue({
  721. template: `
  722. <el-date-picker ref="compo" v-model="value" format="yyyy-MM-dd" type="date" />
  723. `,
  724. data() {
  725. return {
  726. value: new Date()
  727. };
  728. }
  729. }, true);
  730. const input = vm.$el.querySelector('input');
  731. input.blur();
  732. input.focus();
  733. setTimeout(_ => {
  734. // NOTE: simplified test
  735. vm.$refs.compo.userInput = '';
  736. vm.$refs.compo.handleChange();
  737. setTimeout(_ => {
  738. expect(vm.value).to.equal(null);
  739. done();
  740. }, DELAY);
  741. }, DELAY);
  742. });
  743. it('works for type=date, when keydown.enter', done => {
  744. vm = createVue({
  745. template: `
  746. <el-date-picker ref="compo" v-model="value" format="yyyy-MM-dd" type="date" />
  747. `,
  748. data() {
  749. return {
  750. value: new Date()
  751. };
  752. }
  753. }, true);
  754. const input = vm.$el.querySelector('input');
  755. input.blur();
  756. input.focus();
  757. setTimeout(_ => {
  758. // NOTE: simplified test
  759. vm.$refs.compo.userInput = '';
  760. keyDown(input, ENTER);
  761. setTimeout(_ => {
  762. expect(vm.value).to.equal(null);
  763. done();
  764. }, DELAY);
  765. }, DELAY);
  766. });
  767. // TODO: implement the same feature for range panels
  768. });
  769. describe('nagivation', () => {
  770. afterEach(() => { destroyVM(vm); });
  771. const clickAndWait = (el) => {
  772. el.click();
  773. return wait();
  774. };
  775. let prevMonth, prevYear, nextMonth, nextYear, getYearLabel, getMonthLabel;
  776. const initNavigationTest = async(value) => {
  777. vm = createVue({
  778. template: '<el-date-picker v-model="value" ref="compo" />',
  779. data() {
  780. return {
  781. value
  782. };
  783. }
  784. }, true);
  785. vm.$refs.compo.$el.querySelector('input').focus();
  786. await wait();
  787. const $el = vm.$refs.compo.picker.$el;
  788. prevMonth = $el.querySelector('button.el-icon-arrow-left');
  789. prevYear = $el.querySelector('button.el-icon-d-arrow-left');
  790. nextMonth = $el.querySelector('button.el-icon-arrow-right');
  791. nextYear = $el.querySelector('button.el-icon-d-arrow-right');
  792. getYearLabel = () => $el.querySelectorAll('.el-date-picker__header-label')[0].textContent;
  793. getMonthLabel = () => $el.querySelectorAll('.el-date-picker__header-label')[1].textContent;
  794. };
  795. it('month, year', async() => {
  796. await initNavigationTest(new Date(2000, 0, 1));
  797. expect(getYearLabel()).to.include('2000');
  798. expect(getMonthLabel()).to.include('1');
  799. await clickAndWait(prevMonth);
  800. expect(getYearLabel()).to.include('1999');
  801. expect(getMonthLabel()).to.include('12');
  802. await clickAndWait(prevYear);
  803. expect(getYearLabel()).to.include('1998');
  804. expect(getMonthLabel()).to.include('12');
  805. await clickAndWait(nextMonth);
  806. expect(getYearLabel()).to.include('1999');
  807. expect(getMonthLabel()).to.include('1');
  808. await clickAndWait(nextYear);
  809. expect(getYearLabel()).to.include('2000');
  810. expect(getMonthLabel()).to.include('1');
  811. });
  812. it('month with fewer dates', async() => {
  813. // July has 31 days, June has 30
  814. await initNavigationTest(new Date(2000, 6, 31));
  815. await clickAndWait(prevMonth);
  816. expect(getYearLabel()).to.include('2000');
  817. expect(getMonthLabel()).to.include('6');
  818. });
  819. it('year with fewer Feburary dates', async() => {
  820. // Feburary 2008 has 29 days, Feburary 2007 has 28
  821. await initNavigationTest(new Date(2008, 1, 29));
  822. await clickAndWait(prevYear);
  823. expect(getYearLabel()).to.include('2007');
  824. expect(getMonthLabel()).to.include('2');
  825. });
  826. it('month label with fewer dates', async() => {
  827. await initNavigationTest(new Date(2000, 6, 31));
  828. const $el = vm.$refs.compo.picker.$el;
  829. const monthLabel = $el.querySelectorAll('.el-date-picker__header-label')[1];
  830. await clickAndWait(monthLabel);
  831. const juneLabel = $el.querySelectorAll('.el-month-table td a')[5];
  832. await clickAndWait(juneLabel);
  833. expect(getYearLabel()).to.include('2000');
  834. expect(getMonthLabel()).to.include('6');
  835. });
  836. });
  837. it('type:month', done => {
  838. vm = createTest(DatePicker, {
  839. type: 'month'
  840. }, true);
  841. const input = vm.$el.querySelector('input');
  842. input.blur();
  843. input.focus();
  844. setTimeout(_ => {
  845. expect(vm.picker.$el.querySelector('.el-month-table').style.display).to.be.empty;
  846. expect(vm.picker.$el.querySelector('.el-year-table').style.display).to.be.equal('none');
  847. vm.picker.$el.querySelector('.el-month-table a.cell').click();
  848. expect(vm.pickerVisible).to.false;
  849. done();
  850. }, DELAY);
  851. });
  852. it('type:year', done => {
  853. vm = createTest(DatePicker, {
  854. type: 'year'
  855. }, true);
  856. const input = vm.$el.querySelector('input');
  857. input.blur();
  858. input.focus();
  859. setTimeout(_ => {
  860. expect(vm.picker.$el.querySelector('.el-year-table').style.display).to.empty;
  861. expect(vm.picker.$el.querySelector('.el-month-table').style.display).to.be.equal('none');
  862. const leftBtn = vm.picker.$el.querySelector('.el-icon-d-arrow-left');
  863. const rightBtn = vm.picker.$el.querySelector('.el-icon-d-arrow-right');
  864. let count = 20;
  865. while (--count) {
  866. leftBtn.click();
  867. }
  868. count = 18;
  869. while (--count) {
  870. rightBtn.click();
  871. }
  872. vm.picker.$el.querySelector('.el-year-table a.cell').click();
  873. expect(vm.pickerVisible).to.false;
  874. done();
  875. }, DELAY);
  876. });
  877. describe('type:datetime', () => {
  878. let vm;
  879. afterEach(() => destroyVM(vm));
  880. it('create', done => {
  881. vm = createVue({
  882. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  883. data() {
  884. return {
  885. value: ''
  886. };
  887. }
  888. }, true);
  889. const input = vm.$refs.compo.$el.querySelector('input');
  890. input.blur();
  891. input.focus();
  892. setTimeout(_ => {
  893. expect(vm.$refs.compo.picker.$el.querySelector('.el-time-panel')).to.ok;
  894. done();
  895. }, DELAY);
  896. });
  897. it('both picker show correct formated value (extract date-format and time-format from format property)', done => {
  898. vm = createVue({
  899. template: '<el-date-picker type="datetime" v-model="value" :format="format" :pickerOptions="pickerOptions" ref="compo" />',
  900. data() {
  901. return {
  902. value: new Date(2018, 2, 5, 10, 15, 24),
  903. format: 'yyyy/MM/dd hh:mm A',
  904. pickerOptions: null
  905. };
  906. }
  907. }, true);
  908. const input = vm.$refs.compo.$el.querySelector('input');
  909. input.blur();
  910. input.focus();
  911. setTimeout(_ => {
  912. const datePanel = vm.$refs.compo.picker;
  913. const dateInput = datePanel.$el.querySelector('.el-date-picker__time-header > span:nth-child(1) input');
  914. const timeInput = datePanel.$el.querySelector('.el-date-picker__time-header > span:nth-child(2) input');
  915. timeInput.focus();
  916. setTimeout(_ => {
  917. // both input shows correct value
  918. expect(dateInput.value).to.equal('2018/03/05');
  919. expect(timeInput.value).to.equal('10:15 AM');
  920. // change main format
  921. vm.format = 'd-M-yy hh a';
  922. setTimeout(_ => {
  923. expect(dateInput.value).to.equal('5-3-18');
  924. expect(timeInput.value).to.equal('10 am');
  925. // change undocumented pickerOptions.format won't change picker format
  926. vm.pickerOptions = { format: 'yyyy-MM-dd HH:mm:ss'};
  927. setTimeout(_ => {
  928. expect(dateInput.value).to.equal('5-3-18');
  929. expect(timeInput.value).to.equal('10 am');
  930. done();
  931. }, DELAY);
  932. }, DELAY);
  933. }, DELAY);
  934. }, DELAY);
  935. });
  936. it('both picker show correct value', done => {
  937. vm = createVue({
  938. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  939. data() {
  940. return {
  941. value: new Date(2000, 9, 1, 10, 0, 1)
  942. };
  943. }
  944. }, true);
  945. const input = vm.$refs.compo.$el.querySelector('input');
  946. input.blur();
  947. input.focus();
  948. setTimeout(_ => {
  949. const datePanel = vm.$refs.compo.picker;
  950. const dateInput = datePanel.$el.querySelector('.el-date-picker__time-header > span:nth-child(1) input');
  951. const timeInput = datePanel.$el.querySelector('.el-date-picker__time-header > span:nth-child(2) input');
  952. timeInput.focus();
  953. setTimeout(_ => {
  954. const timePanel = datePanel.$refs.timepicker;
  955. // both input shows correct value
  956. expect(dateInput.value).to.equal('2000-10-01');
  957. expect(timeInput.value).to.equal('10:00:01');
  958. // time spinner highlight is correct
  959. const [hours, minutes, seconds] = timePanel.$el.querySelectorAll('.el-time-spinner ul li.active');
  960. expect(hours.textContent).to.include('10');
  961. expect(minutes.textContent).to.include('00');
  962. expect(seconds.textContent).to.include('01');
  963. // sets value updates displayed value
  964. vm.value = new Date(2001, 10, 2, 11, 1, 2);
  965. setTimeout(_ => {
  966. expect(dateInput.value).to.equal('2001-11-02');
  967. expect(timeInput.value).to.equal('11:01:02');
  968. const [hours, minutes, seconds] = timePanel.$el.querySelectorAll('.el-time-spinner ul li.active');
  969. expect(hours.textContent).to.include('11');
  970. expect(minutes.textContent).to.include('01');
  971. expect(seconds.textContent).to.include('02');
  972. expect(datePanel.visible).to.true;
  973. expect(timePanel.visible).to.true;
  974. done();
  975. }, DELAY);
  976. }, DELAY);
  977. }, DELAY);
  978. });
  979. it('click now button', done => {
  980. vm = createTest(DatePicker, {
  981. type: 'datetime'
  982. }, true);
  983. const input = vm.$el.querySelector('input');
  984. input.blur();
  985. input.focus();
  986. setTimeout(_ => {
  987. const date = new Date(1999, 10, 10, 10, 10);
  988. vm.picker.$el.querySelector('.el-picker-panel__link-btn').click();
  989. setTimeout(_ => {
  990. expect(vm.picker.date > date).to.true;
  991. done();
  992. }, DELAY);
  993. }, DELAY);
  994. });
  995. it('click timepicker', done => {
  996. vm = createTest(DatePicker, {
  997. type: 'datetime'
  998. }, true);
  999. const input = vm.$el.querySelector('input');
  1000. input.blur();
  1001. input.focus();
  1002. setTimeout(_ => {
  1003. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  1004. triggerEvent(input, 'focus');
  1005. setTimeout(_ => {
  1006. const timePanel = vm.picker.$el.querySelector('.el-time-panel');
  1007. expect(window.getComputedStyle(timePanel)).to.not.equal('none');
  1008. done();
  1009. }, DELAY);
  1010. }, DELAY);
  1011. });
  1012. it('input timepicker', done => {
  1013. vm = createTest(DatePicker, {
  1014. type: 'datetime'
  1015. }, true);
  1016. const input = vm.$el.querySelector('input');
  1017. input.blur();
  1018. input.focus();
  1019. setTimeout(_ => {
  1020. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  1021. input.value = '20:30:33';
  1022. triggerEvent(input, 'change', true);
  1023. setTimeout(_ => {
  1024. expect(vm.picker.date.getHours()).to.equal(20);
  1025. expect(vm.picker.date.getMinutes()).to.equal(30);
  1026. expect(vm.picker.date.getSeconds()).to.equal(33);
  1027. done();
  1028. }, DELAY);
  1029. }, DELAY);
  1030. });
  1031. it('input date', done => {
  1032. vm = createTest(DatePicker, {
  1033. type: 'datetime'
  1034. }, true);
  1035. const input = vm.$el.querySelector('input');
  1036. input.blur();
  1037. input.focus();
  1038. setTimeout(_ => {
  1039. const input = vm.picker.$el.querySelector('.el-date-picker__editor-wrap input');
  1040. input.value = '2017-2-2';
  1041. triggerEvent(input, 'change', true);
  1042. setTimeout(_ => {
  1043. expect(vm.picker.date.getFullYear()).to.equal(2017);
  1044. expect(vm.picker.date.getMonth()).to.equal(1);
  1045. expect(vm.picker.date.getDate()).to.equal(2);
  1046. done();
  1047. }, DELAY);
  1048. }, DELAY);
  1049. });
  1050. it('select time', done => {
  1051. vm = createTest(DatePicker, {
  1052. type: 'datetime'
  1053. }, true);
  1054. const input = vm.$el.querySelector('input');
  1055. input.blur();
  1056. input.focus();
  1057. setTimeout(_ => {
  1058. const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  1059. input.blur();
  1060. input.focus();
  1061. input.blur();
  1062. setTimeout(_ => {
  1063. const button = vm.picker.$el.querySelector('.el-time-panel .confirm');
  1064. button.click();
  1065. setTimeout(_ => {
  1066. expect(input.value).to.exist;
  1067. done();
  1068. }, DELAY);
  1069. }, DELAY);
  1070. }, DELAY);
  1071. });
  1072. describe('change event', () => {
  1073. afterEach(() => destroyVM(vm));
  1074. it('pick date, emits on confirm', done => {
  1075. vm = createVue({
  1076. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  1077. data() {
  1078. return {
  1079. value: ''
  1080. };
  1081. }
  1082. }, true);
  1083. const spy = sinon.spy();
  1084. vm.$refs.compo.$on('change', spy);
  1085. const input = vm.$refs.compo.$el.querySelector('input');
  1086. input.blur();
  1087. input.focus();
  1088. setTimeout(_ => {
  1089. vm.$refs.compo.picker.$el.querySelector('td.available').click();
  1090. setTimeout(_ => {
  1091. expect(spy.called).to.equal(false);
  1092. vm.$refs.compo.picker.$el.querySelector('.el-picker-panel__footer .el-button--default').click();
  1093. setTimeout(_ => {
  1094. expect(vm.value).is.a('date');
  1095. expect(spy.calledOnce).to.equal(true);
  1096. done();
  1097. }, DELAY);
  1098. }, DELAY);
  1099. }, DELAY);
  1100. });
  1101. it('input date, enter, emits on confirm', done => {
  1102. vm = createVue({
  1103. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  1104. data() {
  1105. return {
  1106. value: ''
  1107. };
  1108. }
  1109. }, true);
  1110. const spy = sinon.spy();
  1111. vm.$refs.compo.$on('change', spy);
  1112. const input = vm.$refs.compo.$el.querySelector('input');
  1113. input.blur();
  1114. input.focus();
  1115. setTimeout(_ => {
  1116. const picker = vm.$refs.compo.picker;
  1117. // simplified change
  1118. picker.handleVisibleDateChange('2000-01-02');
  1119. setTimeout(_ => {
  1120. expect(picker.$el.querySelector('td.current').innerText.trim()).to.equal('2');
  1121. expect(spy.called).to.equal(false);
  1122. // keyDown does not work, event listener attached to document.body
  1123. picker.handleKeydown({ keyCode: ENTER, stopPropagation() {}, preventDefault() {} });
  1124. setTimeout(_ => {
  1125. expect(vm.value).is.a('date');
  1126. expect(spy.calledOnce).to.equal(true);
  1127. done();
  1128. }, DELAY);
  1129. }, DELAY);
  1130. }, DELAY);
  1131. });
  1132. });
  1133. describe('cancel time', () => {
  1134. afterEach(() => destroyVM(vm));
  1135. it('cancel to empty', done => {
  1136. vm = createVue({
  1137. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  1138. data() {
  1139. return {
  1140. value: ''
  1141. };
  1142. }
  1143. }, true);
  1144. const input = vm.$refs.compo.$el.querySelector('input');
  1145. input.blur();
  1146. input.focus();
  1147. setTimeout(_ => {
  1148. const timeInput = vm.$refs.compo.picker.$el.querySelector('.el-date-picker__time-header > span:nth-child(2) input');
  1149. timeInput.focus();
  1150. setTimeout(_ => {
  1151. const cancel = vm.$refs.compo.picker.$refs.timepicker.$el.querySelector('button.cancel');
  1152. cancel.click();
  1153. setTimeout(_ => {
  1154. expect(vm.value).to.equal('');
  1155. expect(vm.$refs.compo.pickerVisible).to.true;
  1156. done();
  1157. }, DELAY);
  1158. }, DELAY);
  1159. }, DELAY);
  1160. });
  1161. it('cancel to old value', done => {
  1162. vm = createVue({
  1163. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  1164. data() {
  1165. return {
  1166. value: new Date(2000, 9, 1, 10, 0, 0)
  1167. };
  1168. }
  1169. }, true);
  1170. const input = vm.$refs.compo.$el.querySelector('input');
  1171. input.blur();
  1172. input.focus();
  1173. const oldValue = vm.value.toISOString();
  1174. setTimeout(_ => {
  1175. const timeInput = vm.$refs.compo.picker.$el.querySelector('.el-date-picker__time-header > span:nth-child(2) input');
  1176. timeInput.focus();
  1177. setTimeout(_ => {
  1178. const nextTime = vm.$refs.compo.picker.$refs.timepicker.$el.querySelector('.active + *');
  1179. nextTime.click();
  1180. setTimeout(_ => {
  1181. const cancel = vm.$refs.compo.picker.$refs.timepicker.$el.querySelector('button.cancel');
  1182. cancel.click();
  1183. setTimeout(_ => {
  1184. expect(vm.value.toISOString()).to.equal(oldValue);
  1185. expect(vm.$refs.compo.pickerVisible).to.true;
  1186. done();
  1187. }, DELAY);
  1188. }, DELAY);
  1189. }, DELAY);
  1190. }, DELAY);
  1191. });
  1192. });
  1193. it('now button: can not choose disabled date', done => {
  1194. vm = createVue({
  1195. template: '<el-date-picker type="datetime" v-model="value" ref="compo" :pickerOptions="pickerOptions" />',
  1196. data() {
  1197. return {
  1198. value: '',
  1199. pickerOptions: {
  1200. disabledDate() { return true; }
  1201. }
  1202. };
  1203. }
  1204. }, true);
  1205. vm.$refs.compo.$el.querySelector('input').focus();
  1206. setTimeout(_ => {
  1207. // click now button
  1208. vm.$refs.compo.picker.$el.querySelector('.el-picker-panel__footer .el-button--text').click();
  1209. setTimeout(_ => {
  1210. expect(vm.value).to.equal('');
  1211. done();
  1212. }, DELAY);
  1213. }, DELAY);
  1214. });
  1215. it('select time honors picked date', done => {
  1216. vm = createVue({
  1217. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  1218. data() {
  1219. return {
  1220. value: new Date(2000, 9, 1, 12, 0, 0) // 2010-10-01 12:00:00
  1221. };
  1222. }
  1223. }, true);
  1224. vm.$refs.compo.$el.querySelector('input').focus();
  1225. setTimeout(_ => {
  1226. // changed month / year should not effect picked time
  1227. vm.$refs.compo.picker.$el.querySelector('.el-date-picker__header .el-icon-arrow-right').click();
  1228. setTimeout(_ => {
  1229. vm.$refs.compo.picker.$el.querySelector('.el-date-picker__header .el-icon-d-arrow-right').click();
  1230. setTimeout(_ => {
  1231. // simulate time selection
  1232. // handleTimePick takes Date object, but it's non-time fields are ignored
  1233. vm.$refs.compo.picker.handleTimePick(new Date(2001, 10, 10, 13, 14, 15), false, false);
  1234. setTimeout(_ => {
  1235. expect(vm.value.getFullYear()).to.equal(2000);
  1236. expect(vm.value.getMonth()).to.equal(9);
  1237. expect(vm.value.getDate()).to.equal(1);
  1238. expect(vm.value.getHours()).to.equal(13);
  1239. expect(vm.value.getMinutes()).to.equal(14);
  1240. expect(vm.value.getSeconds()).to.equal(15);
  1241. done();
  1242. }, DELAY);
  1243. }, DELAY);
  1244. }, DELAY);
  1245. }, DELAY);
  1246. });
  1247. it('confirm button honors picked date', done => {
  1248. vm = createVue({
  1249. template: '<el-date-picker type="datetime" v-model="value" ref="compo" />',
  1250. data() {
  1251. return {
  1252. value: new Date(2000, 9, 1, 12, 0, 0) // 2010-10-01 12:00:00
  1253. };
  1254. }
  1255. }, true);
  1256. vm.$refs.compo.$el.querySelector('input').focus();
  1257. setTimeout(_ => {
  1258. // changed month / year should not effect picked time
  1259. vm.$refs.compo.picker.$el.querySelector('.el-date-picker__header .el-icon-arrow-right').click();
  1260. setTimeout(_ => {
  1261. vm.$refs.compo.picker.$el.querySelector('.el-date-picker__header .el-icon-d-arrow-right').click();
  1262. setTimeout(_ => {
  1263. // click confirm button
  1264. vm.$refs.compo.picker.$el.querySelector('.el-picker-panel__footer .el-button--default').click();
  1265. setTimeout(_ => {
  1266. expect(vm.value.getFullYear()).to.equal(2000);
  1267. expect(vm.value.getMonth()).to.equal(9);
  1268. expect(vm.value.getDate()).to.equal(1);
  1269. expect(vm.value.getHours()).to.equal(12);
  1270. expect(vm.value.getMinutes()).to.equal(0);
  1271. expect(vm.value.getSeconds()).to.equal(0);
  1272. done();
  1273. }, DELAY);
  1274. }, DELAY);
  1275. }, DELAY);
  1276. }, DELAY);
  1277. });
  1278. });
  1279. describe('type:week', () => {
  1280. let vm;
  1281. beforeEach(done => {
  1282. vm = createTest(DatePicker, {
  1283. type: 'week'
  1284. }, true);
  1285. const input = vm.$el.querySelector('input');
  1286. input.blur();
  1287. input.focus();
  1288. setTimeout(done, DELAY);
  1289. });
  1290. afterEach(() => destroyVM(vm));
  1291. it('create', () => {
  1292. expect(vm.picker.$el.querySelector('.is-week-mode')).to.be.ok;
  1293. });
  1294. it('click cell', done => {
  1295. vm.picker.$el.querySelector('.el-date-table__row .available').click();
  1296. setTimeout(_ => {
  1297. expect(vm.picker.week).to.exist;
  1298. done();
  1299. }, DELAY);
  1300. });
  1301. it('click year label', () => {
  1302. vm.picker.$el.querySelector('.el-date-picker__header-label').click();
  1303. expect(vm.picker.currentView).to.equal('year');
  1304. });
  1305. it('click month label', () => {
  1306. vm.picker.$el.querySelectorAll('.el-date-picker__header-label')[1].click();
  1307. expect(vm.picker.currentView).to.equal('month');
  1308. });
  1309. it('select month', done => {
  1310. vm.picker.$el.querySelectorAll('.el-date-picker__header-label')[1].click();
  1311. setTimeout(_ => {
  1312. vm.picker.$el.querySelector('.el-month-table .cell').click();
  1313. setTimeout(_ => {
  1314. expect(vm.picker.$el.querySelector('.el-date-table.is-week-mode').style.display).to.equal('');
  1315. done();
  1316. }, DELAY);
  1317. }, DELAY);
  1318. });
  1319. it('highlight correctly', done => {
  1320. vm = createVue({
  1321. template: '<el-date-picker type="week" v-model="value" ref="compo" />',
  1322. data() {
  1323. return {
  1324. value: null
  1325. };
  1326. }
  1327. }, true);
  1328. const input = vm.$el.querySelector('input');
  1329. input.blur();
  1330. input.focus();
  1331. setTimeout(() => {
  1332. const pickerEl = vm.$refs.compo.picker.$el;
  1333. const numberOfHighlightRows = () => pickerEl.querySelectorAll('.el-date-table__row.current').length;
  1334. expect(numberOfHighlightRows()).to.equal(0);
  1335. setTimeout(() => {
  1336. pickerEl.querySelector('.el-date-table__row ~ .el-date-table__row td.available').click();
  1337. setTimeout(() => {
  1338. expect(vm.value).to.exist;
  1339. input.blur();
  1340. input.focus();
  1341. setTimeout(() => {
  1342. expect(numberOfHighlightRows()).to.equal(1);
  1343. // test: next month should not have highlight
  1344. pickerEl.querySelector('.el-icon-arrow-right').click();
  1345. setTimeout(() => {
  1346. expect(numberOfHighlightRows()).to.equal(0);
  1347. // test: next year should not have highlight
  1348. pickerEl.querySelector('.el-icon-arrow-left').click(); // go back one month
  1349. pickerEl.querySelector('.el-icon-d-arrow-right').click();
  1350. setTimeout(() => {
  1351. expect(numberOfHighlightRows()).to.equal(0);
  1352. done();
  1353. }, DELAY);
  1354. }, DELAY);
  1355. }, DELAY);
  1356. }, DELAY);
  1357. }, DELAY);
  1358. }, DELAY);
  1359. });
  1360. });
  1361. describe('type:dates', () => {
  1362. let vm;
  1363. beforeEach(done => {
  1364. vm = createVue({
  1365. template: '<el-date-picker type="dates" value-format="timestamp" v-model="value" ref="compo" />',
  1366. data() {
  1367. return {
  1368. value: []
  1369. };
  1370. }
  1371. }, true);
  1372. const input = vm.$el.querySelector('input');
  1373. input.blur();
  1374. input.focus();
  1375. setTimeout(done, DELAY);
  1376. });
  1377. afterEach(() => destroyVM(vm));
  1378. it('click cell', done => {
  1379. const td = vm.$refs.compo.picker.$el.querySelector('.el-date-table__row .available');
  1380. td.click();
  1381. setTimeout(_ => {
  1382. expect(vm.$refs.compo.value).to.be.an('array');
  1383. expect(vm.$refs.compo.value.length).to.equal(1);
  1384. expect(vm.$refs.compo.value[0]).to.be.a('number');
  1385. expect(vm.value.length).to.equal(1);
  1386. done();
  1387. }, DELAY);
  1388. });
  1389. it('restore value when cancel', done => {
  1390. const td = vm.$refs.compo.picker.$el.querySelector('.el-date-table__row .available');
  1391. td.click();
  1392. setTimeout(_ => {
  1393. vm.$refs.compo.handleClose();
  1394. setTimeout(() => {
  1395. expect(vm.value.length).to.equal(0);
  1396. done();
  1397. }, DELAY);
  1398. }, DELAY);
  1399. });
  1400. });
  1401. describe('type:daterange', () => {
  1402. afterEach(() => destroyVM(vm));
  1403. it('works', done => {
  1404. vm = createVue({
  1405. template: '<el-date-picker type="daterange" v-model="value" ref="compo" />',
  1406. data() {
  1407. return {
  1408. value: ''
  1409. };
  1410. }
  1411. }, true);
  1412. const rangePicker = vm.$refs.compo;
  1413. const inputs = rangePicker.$el.querySelectorAll('input');
  1414. inputs[0].focus();
  1415. setTimeout(_ => {
  1416. const panels = rangePicker.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1417. expect(Array.prototype.slice.call(panels)).to.length(2);
  1418. panels[0].querySelector('td.available').click();
  1419. setTimeout(_ => {
  1420. panels[1].querySelector('td.available').click();
  1421. setTimeout(_ => {
  1422. inputs[0].focus();
  1423. setTimeout(_ => {
  1424. // correct highlight
  1425. const startDate = rangePicker.picker.$el.querySelectorAll('.start-date');
  1426. const endDate = rangePicker.picker.$el.querySelectorAll('.end-date');
  1427. const inRangeDate = rangePicker.picker.$el.querySelectorAll('.in-range');
  1428. expect(startDate.length).to.equal(1);
  1429. expect(endDate.length).to.equal(1);
  1430. expect(inRangeDate.length).to.above(0);
  1431. // value is array
  1432. expect(vm.value).to.be.an.instanceof(Array);
  1433. // input text is something like date string
  1434. expect(inputs[0].value.length).to.equal(10);
  1435. expect(inputs[1].value.length).to.equal(10);
  1436. done();
  1437. }, DELAY);
  1438. }, DELAY);
  1439. }, DELAY);
  1440. }, DELAY);
  1441. });
  1442. it('works: reverse selection', done => {
  1443. vm = createVue({
  1444. template: '<el-date-picker type="daterange" v-model="value" ref="compo" />',
  1445. data() {
  1446. return {
  1447. value: ''
  1448. };
  1449. }
  1450. }, true);
  1451. const rangePicker = vm.$refs.compo;
  1452. const inputs = rangePicker.$el.querySelectorAll('input');
  1453. inputs[0].focus();
  1454. setTimeout(_ => {
  1455. const panels = rangePicker.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1456. expect(Array.prototype.slice.call(panels)).to.length(2);
  1457. panels[1].querySelector('td.available').click();
  1458. setTimeout(_ => {
  1459. panels[0].querySelector('td.available').click();
  1460. setTimeout(_ => {
  1461. inputs[0].focus();
  1462. setTimeout(_ => {
  1463. // correct highlight
  1464. const startDate = rangePicker.picker.$el.querySelectorAll('.start-date');
  1465. const endDate = rangePicker.picker.$el.querySelectorAll('.end-date');
  1466. const inRangeDate = rangePicker.picker.$el.querySelectorAll('.in-range');
  1467. expect(startDate.length).to.equal(1);
  1468. expect(endDate.length).to.equal(1);
  1469. expect(inRangeDate.length).to.above(0);
  1470. // value is array
  1471. expect(vm.value).to.be.an.instanceof(Array);
  1472. // input text is something like date string
  1473. expect(inputs[0].value.length).to.equal(10);
  1474. expect(inputs[1].value.length).to.equal(10);
  1475. // result array is properly ordered
  1476. expect(vm.value[0].getTime() < vm.value[1].getTime()).to.be.true;
  1477. done();
  1478. }, DELAY);
  1479. }, DELAY);
  1480. }, DELAY);
  1481. }, DELAY);
  1482. });
  1483. it('type:daterange unlink:true', done => {
  1484. vm = createVue({
  1485. template: '<el-date-picker type="daterange" unlink-panels v-model="value" ref="compo" />',
  1486. data() {
  1487. return {
  1488. value: [new Date(2000, 9, 1), new Date(2000, 9, 2)]
  1489. };
  1490. }
  1491. }, true);
  1492. const rangePicker = vm.$refs.compo;
  1493. const inputs = rangePicker.$el.querySelectorAll('input');
  1494. setTimeout(_ => {
  1495. inputs[0].focus();
  1496. setTimeout(_ => {
  1497. const panels = rangePicker.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1498. const left = panels[0].querySelector('.el-date-range-picker__header');
  1499. const right = panels[1].querySelector('.is-right .el-date-range-picker__header');
  1500. const leftText = left.textContent.match(/\d+/g).map(i => Number(i));
  1501. const rightText = right.textContent.match(/\d+/g).map(i => Number(i));
  1502. expect(rightText[1] - leftText[1]).to.equal(1); // one month
  1503. done();
  1504. }, DELAY);
  1505. }, DELAY);
  1506. });
  1507. it('unlink panels', done => {
  1508. vm = createTest(DatePicker, {
  1509. type: 'daterange',
  1510. unlinkPanels: true
  1511. }, true);
  1512. const input = vm.$el.querySelector('input');
  1513. input.click();
  1514. setTimeout(_ => {
  1515. const panels = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1516. expect(Array.prototype.slice.call(panels)).to.length(2);
  1517. panels[1].querySelector('.el-icon-d-arrow-right').click();
  1518. panels[1].querySelector('.el-icon-arrow-right').click();
  1519. setTimeout(_ => {
  1520. const left = panels[0].querySelector('.el-date-range-picker__header');
  1521. const right = panels[1].querySelector('.is-right .el-date-range-picker__header');
  1522. const leftText = left.textContent.match(/\d+/g).map(i => Number(i));
  1523. const rightText = right.textContent.match(/\d+/g).map(i => Number(i));
  1524. expect((rightText[1] <= 2 ? rightText[0] - 1 : rightText[0]) - leftText[0]).to.equal(1);
  1525. expect((rightText[1] <= 2 ? rightText[1] + 12 : rightText[1]) - leftText[1]).to.equal(2);
  1526. done();
  1527. }, DELAY);
  1528. }, DELAY);
  1529. });
  1530. it('daylight saving time highlight', done => {
  1531. // Run test with environment variable TZ=Australia/Sydney
  1532. // The following test uses Australian Eastern Daylight Time (AEDT)
  1533. // AEST -> AEDT shift happened on 2016-10-02 02:00:00
  1534. vm = createVue({
  1535. template: '<el-date-picker type="daterange" v-model="value" ref="compo" />',
  1536. data() {
  1537. return {
  1538. value: [new Date(2016, 9, 1), new Date(2016, 9, 3)]
  1539. };
  1540. }
  1541. }, true);
  1542. const rangePicker = vm.$refs.compo;
  1543. const inputs = rangePicker.$el.querySelectorAll('input');
  1544. inputs[0].focus();
  1545. setTimeout(_ => {
  1546. const startDate = rangePicker.picker.$el.querySelectorAll('.start-date');
  1547. const endDate = rangePicker.picker.$el.querySelectorAll('.end-date');
  1548. expect(startDate.length).to.equal(1);
  1549. expect(endDate.length).to.equal(1);
  1550. done();
  1551. }, DELAY);
  1552. });
  1553. it('clear value', done => {
  1554. vm = createVue({
  1555. template: '<el-date-picker type="daterange" v-model="value" ref="compo" />',
  1556. data() {
  1557. return {
  1558. value: [new Date(2000, 9, 1), new Date(2000, 9, 2)]
  1559. };
  1560. }
  1561. }, true);
  1562. vm.$el.querySelector('input').focus();
  1563. setTimeout(_ => {
  1564. vm.$refs.compo.showClose = true;
  1565. vm.$refs.compo.handleClickIcon({ stopPropagation: () => null });
  1566. setTimeout(_ => {
  1567. expect(vm.value).to.equal(null);
  1568. done();
  1569. }, DELAY);
  1570. }, DELAY);
  1571. });
  1572. it('change event', done => {
  1573. vm = createVue({
  1574. template: `
  1575. <el-date-picker
  1576. ref="compo"
  1577. v-model="value"
  1578. type="daterange" />`,
  1579. data() {
  1580. return {
  1581. value: ''
  1582. };
  1583. }
  1584. }, true);
  1585. const spy = sinon.spy();
  1586. vm.$refs.compo.$on('change', spy);
  1587. const input = vm.$el.querySelector('input');
  1588. input.blur();
  1589. input.focus();
  1590. setTimeout(_ => {
  1591. const picker = vm.$refs.compo.picker;
  1592. setTimeout(_ => {
  1593. picker.$el.querySelector('td.available').click();
  1594. setTimeout(_ => {
  1595. picker.$el.querySelector('td.available ~ td.available').click();
  1596. setTimeout(_ => {
  1597. expect(spy.calledOnce).to.equal(true);
  1598. // change event is not emitted if used does not change value
  1599. // datarange also requires proper array equality check
  1600. input.blur();
  1601. input.focus();
  1602. setTimeout(_ => {
  1603. const startCell = picker.$el.querySelector('td.start-date');
  1604. const endCell = picker.$el.querySelector('td.end-date');
  1605. startCell.click();
  1606. setTimeout(_ => {
  1607. endCell.click();
  1608. setTimeout(_ => {
  1609. expect(spy.calledOnce).to.equal(true);
  1610. done();
  1611. }, DELAY);
  1612. }, DELAY);
  1613. }, DELAY);
  1614. }, DELAY);
  1615. }, DELAY);
  1616. }, DELAY);
  1617. }, DELAY);
  1618. });
  1619. describe('default value', () => {
  1620. it('single', done => {
  1621. let defaultValue = '2000-10-01';
  1622. let expectValue = [new Date(2000, 9, 1), new Date(2000, 9, 2)];
  1623. vm = createVue({
  1624. template: '<el-date-picker type="daterange" v-model="value" ref="compo" :default-value="defaultValue" />',
  1625. data() {
  1626. return {
  1627. value: '',
  1628. defaultValue
  1629. };
  1630. }
  1631. }, true);
  1632. vm.$el.querySelector('input').focus();
  1633. setTimeout(_ => {
  1634. const $el = vm.$refs.compo.picker.$el;
  1635. const defaultEls = $el.querySelectorAll('.el-date-table td.default');
  1636. expect(defaultEls.length).to.equal(1);
  1637. defaultEls[0].click();
  1638. setTimeout(_ => {
  1639. $el.querySelector('.el-date-table td.default + td').click();
  1640. setTimeout(_ => {
  1641. expect(vm.value).to.eql(expectValue);
  1642. done();
  1643. }, DELAY);
  1644. }, DELAY);
  1645. }, DELAY);
  1646. });
  1647. it('array', done => {
  1648. let defaultValue = ['2000-01-01', '2000-02-01'];
  1649. let expectValue = [new Date(2000, 0, 1), new Date(2000, 1, 1)];
  1650. vm = createVue({
  1651. template: '<el-date-picker type="daterange" v-model="value" ref="compo" :default-value="defaultValue" />',
  1652. data() {
  1653. return {
  1654. value: '',
  1655. defaultValue
  1656. };
  1657. }
  1658. }, true);
  1659. vm.$el.querySelector('input').focus();
  1660. setTimeout(_ => {
  1661. const defaultEls = vm.$refs.compo.picker.$el.querySelectorAll('.el-date-table td.default');
  1662. expect(defaultEls.length).to.equal(2);
  1663. defaultEls[0].click();
  1664. setTimeout(_ => {
  1665. defaultEls[1].click();
  1666. setTimeout(_ => {
  1667. expect(vm.value).to.eql(expectValue);
  1668. done();
  1669. }, DELAY);
  1670. }, DELAY);
  1671. }, DELAY);
  1672. });
  1673. });
  1674. });
  1675. describe('type:datetimerange', () => {
  1676. let vm;
  1677. beforeEach(done => {
  1678. vm = createTest(DatePicker, {
  1679. type: 'datetimerange',
  1680. value: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)]
  1681. }, true);
  1682. vm.$el.click();
  1683. setTimeout(done, DELAY);
  1684. });
  1685. afterEach(() => destroyVM(vm));
  1686. it('create', () => {
  1687. expect(Array.prototype.slice.call(vm.picker.$el.querySelectorAll('.el-time-panel'))).to.length(2);
  1688. });
  1689. it('select daterange', done => {
  1690. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1691. const leftCell = pickers[0].querySelector('td.available');
  1692. const rightCell = pickers[1].querySelector('td.available');
  1693. triggerEvent(leftCell, 'mousemove', true);
  1694. triggerEvent(leftCell, 'click', true);
  1695. setTimeout(_ => {
  1696. triggerEvent(rightCell, 'mousemove', true);
  1697. triggerEvent(rightCell, 'click', true);
  1698. setTimeout(_ => {
  1699. const {
  1700. minDate,
  1701. maxDate
  1702. } = vm.picker;
  1703. const minMonth = minDate.getMonth();
  1704. const maxMonth = maxDate.getMonth();
  1705. expect([1, -11]).to.include(maxMonth - minMonth); // one month
  1706. done();
  1707. }, DELAY);
  1708. }, DELAY);
  1709. });
  1710. it('select daterange with defaultTime min', done => {
  1711. destroyVM(vm); // nuke beforeEach's vm before creating our own
  1712. vm = createVue({
  1713. template: `
  1714. <el-date-picker ref="compo" type="datetimerange" v-model="value" :default-time="defaultTime"></el-date-picker>
  1715. `,
  1716. data() {
  1717. return {
  1718. value: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
  1719. defaultTime: ['11:59:59']
  1720. };
  1721. }
  1722. }, true).$refs.compo;
  1723. setTimeout(_ => {
  1724. vm.$el.click();
  1725. setTimeout(_ => {
  1726. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1727. const leftCell = pickers[0].querySelector('td.available');
  1728. const rightCell = pickers[1].querySelector('td.available');
  1729. const {
  1730. minDate,
  1731. maxDate
  1732. } = vm.picker;
  1733. expect(minDate.getHours()).to.be.equal(10);
  1734. expect(minDate.getMinutes()).to.be.equal(10);
  1735. expect(minDate.getSeconds()).to.be.equal(0);
  1736. expect(maxDate.getHours()).to.be.equal(10);
  1737. expect(maxDate.getMinutes()).to.be.equal(10);
  1738. expect(maxDate.getSeconds()).to.be.equal(0);
  1739. triggerEvent(leftCell, 'mousemove', true);
  1740. setTimeout(_ => {
  1741. triggerEvent(leftCell, 'click', true);
  1742. setTimeout(_ => {
  1743. triggerEvent(rightCell, 'mousemove', true);
  1744. setTimeout(_ => {
  1745. expect(rightCell.classList.contains('in-range')).to.be.true;
  1746. triggerEvent(rightCell, 'click', true);
  1747. setTimeout(_ => {
  1748. const {
  1749. minDate,
  1750. maxDate
  1751. } = vm.picker;
  1752. expect(minDate.getHours()).to.be.equal(11);
  1753. expect(minDate.getMinutes()).to.be.equal(59);
  1754. expect(minDate.getSeconds()).to.be.equal(59);
  1755. expect(maxDate.getHours()).to.be.equal(0);
  1756. expect(maxDate.getMinutes()).to.be.equal(0);
  1757. expect(maxDate.getSeconds()).to.be.equal(0);
  1758. done();
  1759. }, DELAY);
  1760. }, DELAY);
  1761. }, DELAY);
  1762. }, DELAY);
  1763. }, DELAY);
  1764. }, DELAY);
  1765. });
  1766. it('both picker show correct formated value (extract date-format and time-format from format property)', done => {
  1767. destroyVM(vm); // nuke beforeEach's vm before creating our own
  1768. vm = createVue({
  1769. template: `
  1770. <el-date-picker ref="compo" type="datetimerange" v-model="value" :format="format"></el-date-picker>
  1771. `,
  1772. data() {
  1773. return {
  1774. value: [new Date(2018, 8, 5, 10, 20, 30), new Date(2018, 8, 15, 15, 35, 45)],
  1775. format: 'yyyy/MM/dd hh:mm A'
  1776. };
  1777. }
  1778. }, true);
  1779. setTimeout(_ => {
  1780. const compo = vm.$refs.compo;
  1781. compo.$el.click();
  1782. setTimeout(_ => {
  1783. const pickers = compo.picker.$el.querySelectorAll('.el-date-range-picker__time-header .el-date-range-picker__editors-wrap');
  1784. const left = {
  1785. dateInput: pickers[0].querySelector('.el-date-range-picker__time-picker-wrap:nth-child(1) input'),
  1786. timeInput: pickers[0].querySelector('.el-date-range-picker__time-picker-wrap:nth-child(2) input')
  1787. };
  1788. const right = {
  1789. dateInput: pickers[1].querySelector('.el-date-range-picker__time-picker-wrap:nth-child(1) input'),
  1790. timeInput: pickers[1].querySelector('.el-date-range-picker__time-picker-wrap:nth-child(2) input')
  1791. };
  1792. left.timeInput.focus();
  1793. right.timeInput.focus();
  1794. // all inputs shows correct value
  1795. expect(left.dateInput.value).to.equal('2018/09/05');
  1796. expect(left.timeInput.value).to.equal('10:20 AM');
  1797. expect(right.dateInput.value).to.equal('2018/09/15');
  1798. expect(right.timeInput.value).to.equal('03:35 PM');
  1799. vm.format = 'd-M-yy HH:mm:ss';
  1800. setTimeout(_ => {
  1801. expect(left.dateInput.value).to.equal('5-9-18');
  1802. expect(left.timeInput.value).to.equal('10:20:30');
  1803. expect(right.dateInput.value).to.equal('15-9-18');
  1804. expect(right.timeInput.value).to.equal('15:35:45');
  1805. done();
  1806. }, DELAY);
  1807. }, DELAY);
  1808. }, DELAY);
  1809. });
  1810. it('select daterange with defaultTime min & max', done => {
  1811. destroyVM(vm); // nuke beforeEach's vm before creating our own
  1812. vm = createVue({
  1813. template: `
  1814. <el-date-picker ref="compo" type="datetimerange" v-model="value" :default-time="defaultTime"></el-date-picker>
  1815. `,
  1816. data() {
  1817. return {
  1818. value: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
  1819. defaultTime: ['11:59:59', '18:00:00']
  1820. };
  1821. }
  1822. }, true).$refs.compo;
  1823. setTimeout(_ => {
  1824. vm.$el.click();
  1825. setTimeout(_ => {
  1826. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1827. const leftCell = pickers[0].querySelector('td.available');
  1828. const rightCell = pickers[1].querySelector('td.available');
  1829. const {
  1830. minDate,
  1831. maxDate
  1832. } = vm.picker;
  1833. expect(minDate.getHours()).to.be.equal(10);
  1834. expect(minDate.getMinutes()).to.be.equal(10);
  1835. expect(minDate.getSeconds()).to.be.equal(0);
  1836. expect(maxDate.getHours()).to.be.equal(10);
  1837. expect(maxDate.getMinutes()).to.be.equal(10);
  1838. expect(maxDate.getSeconds()).to.be.equal(0);
  1839. triggerEvent(leftCell, 'mousemove', true);
  1840. setTimeout(_ => {
  1841. triggerEvent(leftCell, 'click', true);
  1842. setTimeout(_ => {
  1843. triggerEvent(rightCell, 'mousemove', true);
  1844. setTimeout(_ => {
  1845. expect(rightCell.classList.contains('in-range')).to.be.true;
  1846. triggerEvent(rightCell, 'click', true);
  1847. setTimeout(_ => {
  1848. const {
  1849. minDate,
  1850. maxDate
  1851. } = vm.picker;
  1852. expect(minDate.getHours()).to.be.equal(11);
  1853. expect(minDate.getMinutes()).to.be.equal(59);
  1854. expect(minDate.getSeconds()).to.be.equal(59);
  1855. expect(maxDate.getHours()).to.be.equal(18);
  1856. expect(maxDate.getMinutes()).to.be.equal(0);
  1857. expect(maxDate.getSeconds()).to.be.equal(0);
  1858. done();
  1859. }, DELAY);
  1860. }, DELAY);
  1861. }, DELAY);
  1862. }, DELAY);
  1863. }, DELAY);
  1864. }, DELAY);
  1865. });
  1866. it('prev/next month button', done => {
  1867. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-arrow-left');
  1868. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-arrow-right');
  1869. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  1870. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  1871. const leftText = left.textContent.match(/\d+/g);
  1872. const rightText = right.textContent.match(/\d+/g);
  1873. let count = 20;
  1874. while (--count) {
  1875. leftBtn.click();
  1876. }
  1877. count = 18;
  1878. while (--count) {
  1879. rightBtn.click();
  1880. }
  1881. setTimeout(_ => {
  1882. const newLeft = left.textContent.match(/\d+/g);
  1883. const newRight = right.textContent.match(/\d+/g);
  1884. expect(leftText[1] - newLeft[1]).to.equal(2);
  1885. expect(leftText[0] - newLeft[0]).to.equal(0);
  1886. expect([-10, 2]).to.include(rightText[1] - newRight[1]);
  1887. expect([0, 1]).to.include(rightText[0] - newRight[0]);
  1888. done();
  1889. }, DELAY);
  1890. });
  1891. it('prev/next year button', done => {
  1892. const leftBtn = vm.picker.$el.querySelector('.is-left .el-icon-d-arrow-left');
  1893. const rightBtn = vm.picker.$el.querySelector('.is-right .el-icon-d-arrow-right');
  1894. const left = vm.picker.$el.querySelector('.is-left .el-date-range-picker__header');
  1895. const right = vm.picker.$el.querySelector('.is-right .el-date-range-picker__header');
  1896. const leftText = left.textContent.match(/\d+/g);
  1897. const rightText = right.textContent.match(/\d+/g);
  1898. let count = 20;
  1899. while (--count) {
  1900. leftBtn.click();
  1901. }
  1902. count = 18;
  1903. while (--count) {
  1904. rightBtn.click();
  1905. }
  1906. setTimeout(_ => {
  1907. const newLeft = left.textContent.match(/\d+/g);
  1908. const newRight = right.textContent.match(/\d+/g);
  1909. expect(leftText[1] - newLeft[1]).to.equal(0);
  1910. expect(leftText[0] - newLeft[0]).to.equal(2);
  1911. expect(rightText[1] - newRight[1]).to.equal(0);
  1912. expect(rightText[0] - newRight[0]).to.equal(2);
  1913. done();
  1914. }, DELAY);
  1915. });
  1916. it('input date', done => {
  1917. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  1918. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1919. const leftCell = pickers[0].querySelector('td.available');
  1920. const rightCell = pickers[1].querySelector('td.available');
  1921. triggerEvent(leftCell, 'mousemove', true);
  1922. triggerEvent(leftCell, 'click', true);
  1923. setTimeout(_ => {
  1924. triggerEvent(rightCell, 'mousemove', true);
  1925. triggerEvent(rightCell, 'click', true);
  1926. setTimeout(_ => {
  1927. triggerEvent(input, 'input');
  1928. input.value = '1989-6-4';
  1929. triggerEvent(input, 'change', true);
  1930. setTimeout(_ => {
  1931. const minDate = vm.picker.minDate;
  1932. expect(minDate.getFullYear()).to.equal(1989);
  1933. expect(minDate.getMonth()).to.equal(5);
  1934. expect(minDate.getDate()).to.equal(4);
  1935. done();
  1936. }, DELAY);
  1937. }, DELAY);
  1938. }, DELAY);
  1939. });
  1940. it('input date when minDate > maxDate', done => {
  1941. const input = vm.picker.$el.querySelector('.el-date-range-picker__editors-wrap input');
  1942. const input2 = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[2];
  1943. const pickers = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  1944. const leftCell = pickers[0].querySelector('td.available');
  1945. const rightCell = pickers[1].querySelector('td.available');
  1946. triggerEvent(leftCell, 'mousemove', true);
  1947. triggerEvent(leftCell, 'click', true);
  1948. setTimeout(_ => {
  1949. triggerEvent(rightCell, 'mousemove', true);
  1950. triggerEvent(rightCell, 'click', true);
  1951. setTimeout(_ => {
  1952. input2.value = '1988-6-4';
  1953. triggerEvent(input2, 'input');
  1954. triggerEvent(input2, 'change');
  1955. setTimeout(_ => {
  1956. input.value = '1989-6-4';
  1957. triggerEvent(input, 'input');
  1958. triggerEvent(input, 'change', true);
  1959. setTimeout(_ => {
  1960. expect(vm.picker.maxDate >= vm.picker.minDate).to.true;
  1961. done();
  1962. }, DELAY);
  1963. }, DELAY);
  1964. }, DELAY);
  1965. }, DELAY);
  1966. });
  1967. it('select time', done => {
  1968. const input = vm.picker.$el.querySelectorAll('.el-date-range-picker__editors-wrap input')[1];
  1969. input.blur();
  1970. input.focus();
  1971. input.blur();
  1972. setTimeout(_ => {
  1973. const button = vm.picker.$el.querySelector('.el-date-range-picker__time-picker-wrap .el-time-panel .confirm');
  1974. button.click();
  1975. setTimeout(_ => {
  1976. expect(input.value).to.exist;
  1977. done();
  1978. }, DELAY);
  1979. }, DELAY);
  1980. });
  1981. it('confirm honors disabledDate', done => {
  1982. destroyVM(vm); // nuke beforeEach's vm before creating our own
  1983. vm = createVue({
  1984. template: '<el-date-picker type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss" v-model="value" :picker-options="pickerOptions" ref="compo" />',
  1985. data() {
  1986. return {
  1987. pickerOptions: {
  1988. disabledDate(date) {
  1989. return date.getTime() < new Date(2000, 9, 1); // 2000-10-01
  1990. }
  1991. },
  1992. value: ['2000-10-02 00:00:00', '2000-10-03 00:00:00']
  1993. };
  1994. }
  1995. }, true);
  1996. const input = vm.$el.querySelector('input');
  1997. input.blur();
  1998. input.focus();
  1999. setTimeout(_ => {
  2000. // simulate user input of invalid date
  2001. vm.$refs.compo.picker.handleDateChange('2000-09-01', 'min');
  2002. setTimeout(_ => {
  2003. expect(vm.$refs.compo.picker.btnDisabled).to.equal(true); // invalid input disables button
  2004. vm.$refs.compo.picker.handleConfirm();
  2005. setTimeout(_ => {
  2006. expect(vm.$refs.compo.pickerVisible).to.equal(true); // can not confirm, picker remains open
  2007. // simulate click outside to close picker
  2008. vm.$refs.compo.handleClose();
  2009. setTimeout(_ => {
  2010. expect(vm.value).to.eql(['2000-10-02 00:00:00', '2000-10-03 00:00:00']);
  2011. done();
  2012. }, DELAY);
  2013. }, DELAY);
  2014. }, DELAY);
  2015. }, DELAY);
  2016. });
  2017. });
  2018. describe('type:monthrange', () => {
  2019. afterEach(() => destroyVM(vm));
  2020. it('works', done => {
  2021. vm = createVue({
  2022. template: '<el-date-picker type="monthrange" v-model="value" ref="compo" />',
  2023. data() {
  2024. return {
  2025. value: ''
  2026. };
  2027. }
  2028. }, true);
  2029. const rangePicker = vm.$refs.compo;
  2030. const inputs = rangePicker.$el.querySelectorAll('input');
  2031. inputs[0].focus();
  2032. setTimeout(_ => {
  2033. const panels = rangePicker.picker.$el.querySelectorAll('.el-date-range-picker__content');
  2034. expect(Array.prototype.slice.call(panels)).to.length(2);
  2035. panels[0].querySelector('td:not(.disabled)').click();
  2036. setTimeout(_ => {
  2037. panels[1].querySelector('td:not(.disabled)').click();
  2038. setTimeout(_ => {
  2039. inputs[0].focus();
  2040. setTimeout(_ => {
  2041. // correct highlight
  2042. const startDate = rangePicker.picker.$el.querySelectorAll('.start-date');
  2043. const endDate = rangePicker.picker.$el.querySelectorAll('.end-date');
  2044. const inRangeDate = rangePicker.picker.$el.querySelectorAll('.in-range');
  2045. expect(startDate.length).to.equal(1);
  2046. expect(endDate.length).to.equal(1);
  2047. expect(inRangeDate.length).to.above(0);
  2048. // value is array
  2049. expect(vm.value).to.be.an.instanceof(Array);
  2050. // input text is something like date string
  2051. expect(inputs[0].value.length).to.equal(7);
  2052. expect(inputs[1].value.length).to.equal(7);
  2053. done();
  2054. }, DELAY);
  2055. }, DELAY);
  2056. }, DELAY);
  2057. }, DELAY);
  2058. });
  2059. it('works: reverse selection', done => {
  2060. vm = createVue({
  2061. template: '<el-date-picker type="monthrange" v-model="value" ref="compo" />',
  2062. data() {
  2063. return {
  2064. value: ''
  2065. };
  2066. }
  2067. }, true);
  2068. const rangePicker = vm.$refs.compo;
  2069. const inputs = rangePicker.$el.querySelectorAll('input');
  2070. inputs[0].focus();
  2071. setTimeout(_ => {
  2072. const panels = rangePicker.picker.$el.querySelectorAll('.el-date-range-picker__content');
  2073. expect(Array.prototype.slice.call(panels)).to.length(2);
  2074. panels[1].querySelector('td:not(.disabled)').click();
  2075. setTimeout(_ => {
  2076. panels[0].querySelector('td:not(.disabled)').click();
  2077. setTimeout(_ => {
  2078. inputs[0].focus();
  2079. setTimeout(_ => {
  2080. // correct highlight
  2081. const startDate = rangePicker.picker.$el.querySelectorAll('.start-date');
  2082. const endDate = rangePicker.picker.$el.querySelectorAll('.end-date');
  2083. const inRangeDate = rangePicker.picker.$el.querySelectorAll('.in-range');
  2084. expect(startDate.length).to.equal(1);
  2085. expect(endDate.length).to.equal(1);
  2086. expect(inRangeDate.length).to.above(0);
  2087. // value is array
  2088. expect(vm.value).to.be.an.instanceof(Array);
  2089. // input text is something like date string
  2090. expect(inputs[0].value.length).to.equal(7);
  2091. expect(inputs[1].value.length).to.equal(7);
  2092. // result array is properly ordered
  2093. expect(vm.value[0].getTime() < vm.value[1].getTime()).to.be.true;
  2094. done();
  2095. }, DELAY);
  2096. }, DELAY);
  2097. }, DELAY);
  2098. }, DELAY);
  2099. });
  2100. it('type:monthrange unlink:true', done => {
  2101. vm = createVue({
  2102. template: '<el-date-picker type="monthrange" unlink-panels v-model="value" ref="compo" />',
  2103. data() {
  2104. return {
  2105. value: [new Date(2000, 9), new Date(2000, 10)]
  2106. };
  2107. }
  2108. }, true);
  2109. const rangePicker = vm.$refs.compo;
  2110. const inputs = rangePicker.$el.querySelectorAll('input');
  2111. setTimeout(_ => {
  2112. inputs[0].focus();
  2113. setTimeout(_ => {
  2114. const panels = rangePicker.picker.$el.querySelectorAll('.el-date-range-picker__content');
  2115. const left = panels[0].querySelector('.el-date-range-picker__header');
  2116. const right = panels[1].querySelector('.is-right .el-date-range-picker__header');
  2117. const leftText = left.textContent.match(/\d+/g).map(i => Number(i));
  2118. const rightText = right.textContent.match(/\d+/g).map(i => Number(i));
  2119. expect(rightText[0] - leftText[0]).to.equal(1); // one year
  2120. done();
  2121. }, DELAY);
  2122. }, DELAY);
  2123. });
  2124. it('unlink panels', done => {
  2125. vm = createTest(DatePicker, {
  2126. type: 'monthrange',
  2127. unlinkPanels: true
  2128. }, true);
  2129. const input = vm.$el.querySelector('input');
  2130. input.click();
  2131. setTimeout(_ => {
  2132. const panels = vm.picker.$el.querySelectorAll('.el-date-range-picker__content');
  2133. expect(Array.prototype.slice.call(panels)).to.length(2);
  2134. panels[1].querySelector('.el-icon-d-arrow-right').click();
  2135. setTimeout(_ => {
  2136. const left = panels[0].querySelector('.el-date-range-picker__header');
  2137. const right = panels[1].querySelector('.is-right .el-date-range-picker__header');
  2138. const leftText = left.textContent.match(/\d+/g).map(i => Number(i));
  2139. const rightText = right.textContent.match(/\d+/g).map(i => Number(i));
  2140. expect(rightText[0] - leftText[0]).to.equal(2);
  2141. done();
  2142. }, DELAY);
  2143. }, DELAY);
  2144. });
  2145. it('daylight saving time highlight', done => {
  2146. // Run test with environment variable TZ=Australia/Sydney
  2147. // The following test uses Australian Eastern Daylight Time (AEDT)
  2148. // AEST -> AEDT shift happened on 2016-10-02 02:00:00
  2149. vm = createVue({
  2150. template: '<el-date-picker type="monthrange" v-model="value" ref="compo" />',
  2151. data() {
  2152. return {
  2153. value: [new Date(2016, 6), new Date(2016, 12)]
  2154. };
  2155. }
  2156. }, true);
  2157. const rangePicker = vm.$refs.compo;
  2158. const inputs = rangePicker.$el.querySelectorAll('input');
  2159. inputs[0].focus();
  2160. setTimeout(_ => {
  2161. const startDate = rangePicker.picker.$el.querySelectorAll('.start-date');
  2162. const endDate = rangePicker.picker.$el.querySelectorAll('.end-date');
  2163. expect(startDate.length).to.equal(1);
  2164. expect(endDate.length).to.equal(1);
  2165. done();
  2166. }, DELAY);
  2167. });
  2168. it('clear value', done => {
  2169. vm = createVue({
  2170. template: '<el-date-picker type="monthrange" v-model="value" ref="compo" />',
  2171. data() {
  2172. return {
  2173. value: [new Date(2000, 9), new Date(2000, 10)]
  2174. };
  2175. }
  2176. }, true);
  2177. vm.$el.querySelector('input').focus();
  2178. setTimeout(_ => {
  2179. vm.$refs.compo.showClose = true;
  2180. vm.$refs.compo.handleClickIcon({ stopPropagation: () => null });
  2181. setTimeout(_ => {
  2182. expect(vm.value).to.equal(null);
  2183. done();
  2184. }, DELAY);
  2185. }, DELAY);
  2186. });
  2187. it('change event', done => {
  2188. vm = createVue({
  2189. template: `
  2190. <el-date-picker
  2191. ref="compo"
  2192. v-model="value"
  2193. type="monthrange" />`,
  2194. data() {
  2195. return {
  2196. value: ''
  2197. };
  2198. }
  2199. }, true);
  2200. const spy = sinon.spy();
  2201. vm.$refs.compo.$on('change', spy);
  2202. const input = vm.$el.querySelector('input');
  2203. input.blur();
  2204. input.focus();
  2205. setTimeout(_ => {
  2206. const picker = vm.$refs.compo.picker;
  2207. setTimeout(_ => {
  2208. picker.$el.querySelector('td:not(.disabled)').click();
  2209. setTimeout(_ => {
  2210. picker.$el.querySelector('td:not(.disabled) ~ td:not(.disabled)').click();
  2211. setTimeout(_ => {
  2212. expect(spy.calledOnce).to.equal(true);
  2213. // change event is not emitted if used does not change value
  2214. // datarange also requires proper array equality check
  2215. input.blur();
  2216. input.focus();
  2217. setTimeout(_ => {
  2218. const startCell = picker.$el.querySelector('td.start-date');
  2219. const endCell = picker.$el.querySelector('td.end-date');
  2220. startCell.click();
  2221. setTimeout(_ => {
  2222. endCell.click();
  2223. setTimeout(_ => {
  2224. expect(spy.calledOnce).to.equal(true);
  2225. done();
  2226. }, DELAY);
  2227. }, DELAY);
  2228. }, DELAY);
  2229. }, DELAY);
  2230. }, DELAY);
  2231. }, DELAY);
  2232. }, DELAY);
  2233. });
  2234. describe('default value', () => {
  2235. afterEach(() => destroyVM(vm));
  2236. it('single', done => {
  2237. let defaultValue = '2000-10';
  2238. let expectValue = [new Date(2000, 9), new Date(2000, 10)];
  2239. vm = createVue({
  2240. template: '<el-date-picker type="monthrange" v-model="value" ref="compo" :default-value="defaultValue" />',
  2241. data() {
  2242. return {
  2243. value: '',
  2244. defaultValue
  2245. };
  2246. }
  2247. }, true);
  2248. vm.$el.querySelector('input').focus();
  2249. setTimeout(_ => {
  2250. const $el = vm.$refs.compo.picker.$el;
  2251. const defaultEls = $el.querySelectorAll('.el-month-table td.default');
  2252. expect(defaultEls.length).to.equal(1);
  2253. defaultEls[0].click();
  2254. setTimeout(_ => {
  2255. $el.querySelector('.el-month-table td.default + td').click();
  2256. setTimeout(_ => {
  2257. expect(vm.value).to.eql(expectValue);
  2258. done();
  2259. }, DELAY);
  2260. }, DELAY);
  2261. }, DELAY);
  2262. });
  2263. it('array', done => {
  2264. let defaultValue = ['2000-01', '2000-03'];
  2265. let expectValue = [new Date(2000, 0), new Date(2000, 2)];
  2266. vm = createVue({
  2267. template: '<el-date-picker type="monthrange" v-model="value" ref="compo" :default-value="defaultValue" />',
  2268. data() {
  2269. return {
  2270. value: '',
  2271. defaultValue
  2272. };
  2273. }
  2274. }, true);
  2275. vm.$el.querySelector('input').focus();
  2276. setTimeout(_ => {
  2277. const defaultEls = vm.$refs.compo.picker.$el.querySelectorAll('.el-month-table td.default');
  2278. expect(defaultEls.length).to.equal(2);
  2279. defaultEls[0].click();
  2280. setTimeout(_ => {
  2281. defaultEls[1].click();
  2282. setTimeout(_ => {
  2283. expect(vm.value).to.eql(expectValue);
  2284. done();
  2285. }, DELAY);
  2286. }, DELAY);
  2287. }, DELAY);
  2288. });
  2289. });
  2290. });
  2291. const currentMonth = new Date(new Date().getTime());
  2292. currentMonth.setDate(1);
  2293. const chineseWeek = ['一', '二', '三', '四', '五', '六', '日'];
  2294. const testWeek = (i) => it('picker-options:firstDayOfWeek ' + i, done => {
  2295. vm = createTest(DatePicker, {
  2296. pickerOptions: {
  2297. firstDayOfWeek: i
  2298. }
  2299. }, true);
  2300. const input = vm.$el.querySelector('input');
  2301. input.blur();
  2302. input.focus();
  2303. setTimeout(_ => {
  2304. const firstWeek = vm.picker.$el.querySelector('tr th');
  2305. expect(firstWeek.innerText).to.equal(chineseWeek[i - 1]);
  2306. done();
  2307. });
  2308. });
  2309. for (var i = 1; i <= 7; i++) {
  2310. testWeek(i);
  2311. }
  2312. it('picker-options:shortcuts', done => {
  2313. let test;
  2314. vm = createTest(DatePicker, {
  2315. pickerOptions: {
  2316. shortcuts: [{
  2317. text: '今天',
  2318. onClick(picker) {
  2319. test = true;
  2320. picker.$emit('pick', new Date());
  2321. }
  2322. }]
  2323. }
  2324. }, true);
  2325. const input = vm.$el.querySelector('input');
  2326. input.blur();
  2327. input.focus();
  2328. setTimeout(_ => {
  2329. const shortcut = vm.picker.$el.querySelector('.el-picker-panel__shortcut');
  2330. expect(shortcut.textContent).to.be.equal('今天');
  2331. expect(vm.picker.$el.querySelector('.el-picker-panel__sidebar')).to.be.ok;
  2332. shortcut.click();
  2333. setTimeout(_ => {
  2334. expect(test).to.true;
  2335. done();
  2336. }, DELAY);
  2337. }, DELAY);
  2338. });
  2339. describe('picker-options:selectableRange', () => {
  2340. let vm;
  2341. afterEach(() => destroyVM(vm));
  2342. it('selectableRange', done => {
  2343. vm = createVue({
  2344. template: `
  2345. <el-date-picker v-model="value" type="datetime" :picker-options="pickerOptions" ref="compo"></el-date-picker>
  2346. `,
  2347. data() {
  2348. return {
  2349. value: new Date(2019, 0, 1, 18, 50),
  2350. pickerOptions: {
  2351. selectableRange: ['17:30:00 - 18:30:00', '18:50:00 - 20:30:00', '21:00:00 - 22:00:00']
  2352. }
  2353. };
  2354. }
  2355. }, true);
  2356. const input = vm.$el.querySelector('input');
  2357. input.blur();
  2358. input.focus();
  2359. setTimeout(() => {
  2360. const $el = vm.$refs.compo.picker.$el;
  2361. const input1 = $el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
  2362. input1.blur();
  2363. input1.focus();
  2364. setTimeout(_ => {
  2365. const list = $el.querySelectorAll('.el-time-spinner__list');
  2366. const hoursEl = list[0];
  2367. const disabledHours = [].slice
  2368. .call(hoursEl.querySelectorAll('.disabled'))
  2369. .map(node => Number(node.textContent));
  2370. expect(disabledHours[disabledHours.length - 2]).to.equal(16);
  2371. expect(disabledHours[disabledHours.length - 1]).to.equal(23);
  2372. const minutesEl = list[1];
  2373. const disabledMinutes = [].slice
  2374. .call(minutesEl.querySelectorAll('.disabled'))
  2375. .map(node => Number(node.textContent));
  2376. expect(disabledMinutes.length).to.equal(19);
  2377. done();
  2378. }, DELAY);
  2379. }, DELAY);
  2380. });
  2381. });
  2382. describe('picker-options:disabledDate', () => {
  2383. let vm;
  2384. beforeEach(done => {
  2385. vm = createTest(DatePicker, {
  2386. value: new Date(),
  2387. pickerOptions: {
  2388. disabledDate(time) {
  2389. return time.getTime() < Date.now() - 8.64e7;
  2390. }
  2391. }
  2392. }, true);
  2393. const input = vm.$el.querySelector('input');
  2394. input.blur();
  2395. input.focus();
  2396. setTimeout(done, DELAY);
  2397. });
  2398. afterEach(() => destroyVM(vm));
  2399. it('create', () => {
  2400. expect(vm.picker.$el.querySelector('.disabled')).to.be.ok;
  2401. });
  2402. it('set value', done => {
  2403. const date = new Date(3000, 10, 10, 10, 10, 10);
  2404. vm.picker.value = date;
  2405. setTimeout(_ => {
  2406. expect(vm.picker.date.getTime() === date.getTime()).to.true;
  2407. done();
  2408. }, DELAY);
  2409. });
  2410. });
  2411. describe('picker-options:firstDayOfWeek issue-14523', () => {
  2412. let vm;
  2413. beforeEach(done => {
  2414. vm = createTest(DatePicker, {
  2415. value: new Date(),
  2416. pickerOptions: {
  2417. firstDayOfWeek: 3
  2418. }
  2419. }, true);
  2420. const input = vm.$el.querySelector('input');
  2421. input.blur();
  2422. input.focus();
  2423. setTimeout(done, DELAY);
  2424. });
  2425. afterEach(() => destroyVM(vm));
  2426. it('set value equal to 2019-01-01', done => {
  2427. const date = new Date('2019-01-01');
  2428. vm.picker.value = date;
  2429. setTimeout(_ => {
  2430. const currentElement = vm.picker.$el.querySelector('tr:nth-child(2) td:nth-child(7) span');
  2431. const lastPrevMonthElement = vm.picker.$el.querySelector('tr:nth-child(2) td:nth-child(6) span');
  2432. expect(currentElement.innerText.trim()).to.equal('1');
  2433. expect(lastPrevMonthElement.innerText.trim()).to.equal('31');
  2434. done();
  2435. }, DELAY);
  2436. });
  2437. it('set value equal to 2018-01-01', done => {
  2438. const date = new Date('2018-01-01');
  2439. vm.picker.value = date;
  2440. setTimeout(_ => {
  2441. const currentElement = vm.picker.$el.querySelector('tr:nth-child(2) td:nth-child(6) span');
  2442. const lastPrevMonthElement = vm.picker.$el.querySelector('tr:nth-child(2) td:nth-child(5) span');
  2443. expect(currentElement.innerText.trim()).to.equal('1');
  2444. expect(lastPrevMonthElement.innerText.trim()).to.equal('31');
  2445. done();
  2446. }, DELAY);
  2447. });
  2448. });
  2449. });