├── .gitignore ├── README.md ├── css └── datepicker.css ├── index.html ├── package.json └── persian-datepicker.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | *.DS_Store 4 | [Tt]humbs.db -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-persian-datepicker-playground 2 | persian datepicker config generator and playground 3 | [Demo](http://babakhani.github.io/PersianWebToolkit/doc/datepicker/playground.html) 4 | -------------------------------------------------------------------------------- /css/datepicker.css: -------------------------------------------------------------------------------- 1 | a { 2 | color: #000 !important; 3 | } 4 | 5 | .datepicker-demo-box { 6 | position: fixed; 7 | } 8 | 9 | .datepicker-main { 10 | min-height: 600px; 11 | padding-top: 70px; 12 | } 13 | 14 | .datepicker-main .alert-info { 15 | font-size: 12px; 16 | padding: 5px; 17 | opacity: 0.9; 18 | background: #f1f1f1; 19 | color: #999; 20 | border: none; 21 | } 22 | 23 | .datepicker-main .alert-info:hover { 24 | opacity: 1; 25 | } 26 | 27 | .datepicker-main .datepicker-main--panel { 28 | position: fixed; 29 | width: 50%; 30 | } 31 | 32 | .navbar { 33 | border-radius: 0 !important; 34 | } 35 | 36 | .navbar-header a { 37 | color: hsla(0, 0%, 100%, .7) !important; 38 | } 39 | 40 | textarea { 41 | display: block; 42 | height: 150px; 43 | } 44 | 45 | .datepicker-checkbox { 46 | width: 40% !important; 47 | } 48 | 49 | .datepicker-plot-area { 50 | width: 286px; 51 | } 52 | 53 | /*--Helper--*/ 54 | 55 | .margin-top { 56 | margin-top: 15px; 57 | } 58 | 59 | .no-padding { 60 | padding: 0 !important; 61 | } 62 | 63 | .datepicker-footer { 64 | padding: 2.5rem; 65 | color: #999; 66 | background-color: #f9f9f9; 67 | border-top: .05rem solid #e5e5e5; 68 | } 69 | 70 | /* The switch - the box around the slider */ 71 | .switch { 72 | position: relative; 73 | display: inline-block; 74 | width: 60px; 75 | height: 34px; 76 | } 77 | 78 | /* Hide default HTML checkbox */ 79 | .switch input { 80 | display: none; 81 | } 82 | 83 | /* The slider */ 84 | .slider { 85 | position: absolute; 86 | cursor: pointer; 87 | top: 0; 88 | left: 0; 89 | right: 0; 90 | bottom: 0; 91 | background-color: #ccc; 92 | -webkit-transition: .1s; 93 | transition: .1s; 94 | } 95 | 96 | .slider:before { 97 | position: absolute; 98 | content: ""; 99 | height: 26px; 100 | width: 26px; 101 | left: 4px; 102 | bottom: 4px; 103 | background-color: white; 104 | -webkit-transition: .1s; 105 | transition: .1s; 106 | } 107 | 108 | input:checked + .slider { 109 | background-color: #00A693; 110 | } 111 | 112 | input:focus + .slider { 113 | box-shadow: 0 0 1px #2196F3; 114 | } 115 | 116 | input:disabled + .slider { 117 | opacity: 0.4; 118 | } 119 | 120 | input:checked + .slider:before { 121 | -webkit-transform: translateX(26px); 122 | -ms-transform: translateX(26px); 123 | transform: translateX(26px); 124 | } 125 | 126 | /* Rounded sliders */ 127 | .slider.round { 128 | border-radius: 34px; 129 | } 130 | 131 | .slider.round:before { 132 | border-radius: 50%; 133 | } 134 | 135 | p.alert.alert-info { 136 | margin-top: 8px; 137 | } 138 | 139 | /* nav-tab */ 140 | .btn-success { 141 | color: #ffffff !important; 142 | background-color: #5cb85c !important; 143 | } 144 | 145 | .nav-tabs li a.btn-success:hover, 146 | .nav-tabs li a.btn-success:focus, 147 | .nav-tabs li a.btn-success:active { 148 | background-color: #438a43 !important; 149 | color: #ffffff !important; 150 | } 151 | 152 | .options-container a:hover { 153 | color: darkgreen; 154 | } 155 | 156 | .nav-tabs li a { 157 | border: none !important; 158 | border-bottom: 1px solid #eeeeee !important; 159 | border-radius: 0 !important; 160 | } 161 | 162 | .nav-tabs li a:hover, 163 | .nav-tabs li a:focus, 164 | .nav-tabs li a:active { 165 | border-bottom: 1px solid #00a693 !important; 166 | background-color: #ffffff !important; 167 | color: #00a693 !important; 168 | } 169 | 170 | .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { 171 | border-bottom: 1px solid #00a693 !important; 172 | background-color: #ffffff !important; 173 | color: #00a693 !important; 174 | } 175 | 176 | .nav-tabs > li.active > a.btn-success, .nav-tabs > li.active > a.btn-success:hover, .nav-tabs > li.active > a.btn-success:focus { 177 | background-color: #438a43 !important; 178 | color: #ffffff !important; 179 | } 180 | 181 | .tooltip { 182 | width: 130px; 183 | } 184 | 185 | .tooltiptext { 186 | background-color: rgba(0, 0, 0, 0.39) !important; 187 | } 188 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Welcome to Vue 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 41 | 42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | 51 | 52 |
53 |
54 | 55 | 57 |
58 |
59 |
60 |
61 |
62 | 63 | 64 | 117 | 118 | 119 |
120 |
121 |
122 |
123 |
124 |
125 | 126 | 131 |

132 | set default calendar mode of datepicker, available options: 133 | 'persian', 'gregorian' 134 |

135 |
136 |
137 | 138 |
139 |
140 | 141 |
142 | 149 |
150 |

151 | if set true, small date hint of this calendar will be shown on 152 | another calendar 153 |

154 |
155 |
156 | 157 | 162 |

163 | set locale of calendar available options: 'fa', 'en' 164 |

165 |
166 | 167 |
168 | 169 | 174 |

175 | if set true, small date hint of this calendar will be shown on 176 | another calendar 177 |

178 |
179 |
180 |
181 |
182 | 183 |
184 | 185 |
186 |
187 | 194 |
195 |

196 | if set true, small date hint of this calendar will be shown on 197 | another calendar 198 |

199 |
200 |
201 | 202 | 207 |

208 | set locale of calendar available options: 'fa', 'en' 209 |

210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 | 220 |
221 | 228 |
229 | 230 |

231 | if true datepicker render inline 232 |

233 | 234 |
235 | 236 |
237 | 238 |
239 | 247 |
248 |

249 | if set true make enable responsive view on mobile devices 250 |

251 |
252 | 253 |
254 | 255 |
256 | 262 |
263 |

264 | If true picker close When select a date 265 |

266 |
267 | 268 |
269 | 270 |
271 | 276 |
277 |

278 | if true date select just by click on day in month grid, and when 279 | user select month or year selected date doesnt change 280 |

281 |
282 |
283 |
284 |
285 | 286 | 292 |

293 | default view mode, Acceptable value : day,month,year 294 |

295 |
296 |
297 | 298 |
299 | 304 |
305 |

306 | If set true datepicker init with input value date 307 |

308 |
309 |
310 |
311 |
312 | 313 | 315 |

316 | Default input value formatt string. 317 |

318 |
319 |
320 | 321 | 322 |

323 | Default input value formatt string. 324 |

325 |
326 | 327 |
328 | 329 | 330 |

331 | set min date on datepicker, prevent user select date before 332 | given 333 | unix time 334 |

335 |
336 | 337 |
338 | 339 | 340 |

341 | set max date on datepicker, prevent user select date after given 342 | unix time 343 |

344 |
345 | 346 | 347 |
348 | 349 | 350 |

351 | position of datepicker element relative to input element, accept 352 | auto, [x,y] 353 |

354 |
355 | 356 |
357 | 358 |
359 | 365 |
366 |

367 | if true datepicker update self by user inputted date string, 368 | accept 369 | 'yyyy/mm/dd' example: '1396/10/2', '1396/1/12' 370 |

371 |
372 | 373 |
374 | 375 | 378 |

379 | waite time for last user key-down event, accept millisecond 380 |

381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 | 390 |
391 | 398 |
399 | 400 |

401 | make navigator enable or disable 402 |

403 | 404 |
405 |
406 | 407 |
408 | 414 |
415 |

416 | if you want make disable scroll navigation set this option false 417 |

418 |
419 |
420 | 421 | 423 |

424 | text of next button 425 |

426 |
427 |
428 | 429 | 431 |

432 | text of previews button 433 |

434 |
435 |
436 |
437 |
438 | 439 | 440 |
441 |
442 |
443 |
444 |
445 | 446 |
447 | 452 |
453 |

454 | make yearPicker enable or disable 455 |

456 |
457 |
458 | 459 |
460 | 462 |
463 |

464 | YearPicker title format string 465 |

466 |
467 |
468 | 469 | 470 |
471 |
472 | 473 |
474 | 479 |
480 |

481 | make monthPicker enable or disable 482 |

483 |
484 | 485 |
486 | 487 |
488 | 490 |
491 |

492 | MonthPicker title format string 493 |

494 |
495 | 496 |
497 | 498 | 499 |
500 |
501 | 502 |
503 | 508 |
509 |

510 | make datePicker enable or disable 511 |

512 |
513 | 514 |
515 | 516 |
517 | 519 |
520 |

521 | DayPicker title format string 522 |

523 |
524 |
525 |
526 | 527 |

Timepicker

528 |
529 | 530 |
531 | 532 |
533 | 538 |
539 |

540 | if true all pickers hide and just show timepicker 541 |

542 |
543 | 544 |
545 | 546 |
547 | 552 |
553 |

554 | make timePicker enable or disable 555 |

556 |
557 |
558 |
559 | 560 |
561 | 566 |
567 |
568 |
569 | 570 |
571 | 573 |
574 |

575 | Hour section step 576 |

577 |
578 |
579 |
580 |
581 | 582 |
583 | 588 |
589 |
590 | 591 |
592 | 593 |
594 | 596 |
597 |

598 | minute section step 599 |

600 |
601 | 602 | 603 |
604 | 605 |
606 |
607 | 608 |
609 | 614 |
615 |
616 | 617 |
618 | 619 |
620 | 622 |
623 |

624 | second section step 625 |

626 |
627 |
628 |
629 |
630 | 631 |
632 | 637 |
638 |

639 | if you set this as false, datepicker timepicker system moved to 24-hour 640 | system 641 |

642 |
643 |
644 | 645 | 647 |

648 | Time section step 649 |

650 |
651 | 652 | 653 |
654 |
655 | 656 |
657 | 658 |
659 |
660 |
661 | 662 |
663 | 668 |
669 |

670 | boolean option that make toolbar enable or disable 671 |

672 |
673 |
674 |
675 |
676 | 677 |
678 | 683 |
684 |

685 | toolbox today button enable or disable 686 |

687 |
688 | 689 |
690 | 691 | 693 |

694 | show when current calendar is Persian 695 |

696 |
697 | 698 |
699 | 700 | 702 |

703 | show when current calendar is Gregorian 704 |

705 |
706 |
707 | 708 |
709 |
710 | 711 |
712 | 717 |
718 |

719 | toolbox submit button enable or disable 720 |

721 |
722 | 723 |
724 | 725 | 727 |

728 | show when current calendar is Persian 729 |

730 |
731 | 732 |
733 | 734 | 736 |

737 | show when current calendar is Gregorian 738 |

739 |
740 |
741 | 742 |
743 |
744 | 745 |
746 | 753 |
754 |

755 | make calendar switch enable or disable 756 |

757 |
758 |
759 | 760 | 762 |

763 | calendar switch text format string 764 |

765 |
766 |
767 |
768 |
769 |
770 |
771 | 774 |
775 |
776 |
777 |
778 | 781 |
782 |
783 |
784 |
785 | 786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 | 814 | 815 | 816 | 821 | 822 | 823 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-persian-datepiker-playground", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "simple-server 6767", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "bita.edalati@gmail.com", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "simple-server": "*" 14 | }, 15 | "dependencies": { 16 | "bootstrap": "^3.3.7", 17 | "jquery": "^3.2.1", 18 | "persian-date": "^0.3.0-b", 19 | "persian-datepicker": "^0.5.11", 20 | "vue": "^2.4.2", 21 | "vue-clipboards": "^1.1.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /persian-datepicker.js: -------------------------------------------------------------------------------- 1 | Vue.component('datepicker', { 2 | template: '
' + 3 | '
' + 4 | '' + 5 | '
', 6 | props: ['options'], 7 | watch: { 8 | options: { 9 | handler: function (val, oldVal) { 10 | console.log(this.options.inline); 11 | var that = this; 12 | setTimeout(function () { 13 | that.pdatepicker.destroy(); 14 | that.pdatepicker = $(that.$el).children('*').persianDatepicker(val); 15 | that.pdatepicker.show(); 16 | }, 1); 17 | }, 18 | deep: true 19 | }, 20 | }, 21 | mounted: function () { 22 | let that = this, 23 | eventsOptions = { 24 | onSelect: function () { 25 | that.$emit('eventcalled', "onSelect") 26 | }, 27 | onShow: function () { 28 | that.$emit('eventcalled', "onShow") 29 | }, 30 | onHide: function () { 31 | that.$emit('eventcalled', "onHide") 32 | }, 33 | onDestroy: function () { 34 | that.$emit('eventcalled', "onDestroy") 35 | }, 36 | dayPicker: { 37 | onSelect: function () { 38 | that.$emit('eventcalled', "dayPicker.onSelect"); 39 | } 40 | }, 41 | monthPicker: { 42 | onSelect: function () { 43 | that.$emit('eventcalled', "monthPicker.onSelect"); 44 | } 45 | }, 46 | yearPicker: { 47 | onSelect: function () { 48 | that.$emit('eventcalled', "yearPicker.onSelect"); 49 | } 50 | }, 51 | navigator: { 52 | onSwitch: function () { 53 | that.$emit('eventcalled', "navigator.onSwitch"); 54 | }, 55 | onNext: function () { 56 | that.$emit('eventcalled', " navigator.onNext"); 57 | }, 58 | onPrev: function () { 59 | that.$emit('eventcalled', "navigator.onPrev"); 60 | } 61 | 62 | }, 63 | toolbox: { 64 | todayButton: { 65 | onToday: function () { 66 | that.$emit('eventcalled', "toolbox.todayButton.onToday"); 67 | } 68 | }, 69 | calendarSwitch: { 70 | onSwitch: function () { 71 | that.$emit('eventcalled', "toolbox.calendarSwitch.onSwitch"); 72 | } 73 | }, 74 | submitButton: { 75 | onSubmit: function () { 76 | that.$emit('eventcalled', "toolbox.calendarSwitch.onSwitch"); 77 | } 78 | } 79 | } 80 | }; 81 | 82 | this.pdatepicker = $(this.$el).children('*').persianDatepicker($.extend(true, this.options, eventsOptions)); 83 | } 84 | 85 | 86 | }); 87 | 88 | 89 | $(document).ready(function () { 90 | $('#configTab a').click(function (e) { 91 | e.preventDefault(); 92 | $(this).tab('show'); 93 | }) 94 | }) 95 | 96 | 97 | new Vue({ 98 | deep: true, 99 | el: '#app', 100 | methods: { 101 | eventcalled: function (eventMessage) { 102 | let logtime = new persianDate().toCalendar('gregorian').toLocale('en').format('YYYY/MM/DD HH:mm:ss'); 103 | this.eventsLog = logtime + ': ' + eventMessage + '\n' + this.eventsLog; 104 | } 105 | }, 106 | data: { 107 | eventsLog: '', 108 | datepickerOptions: { 109 | inline: true, 110 | format: 'l', 111 | viewMode: 'day', 112 | persianDigit: true, 113 | initialValue: true, 114 | minDate: 1504713660730, 115 | maxDate: 1604713660730, 116 | autoClose: false, 117 | position: 'auto', 118 | altFormat: 'lll', 119 | altField: '#altfieldExample', 120 | onlyTimePicker: false, 121 | onlySelectOnDate: false, 122 | calendarType: 'persian', 123 | inputDelay: 800, 124 | observer: false, 125 | calendar: { 126 | persian: { 127 | locale: 'fa', 128 | showHint: true, 129 | leapYearMode: 'algorithmic' 130 | }, 131 | gregorian: { 132 | locale: 'en', 133 | showHint: true 134 | } 135 | }, 136 | navigator: { 137 | enabled: true, 138 | scroll: { 139 | enabled: true 140 | }, 141 | text: { 142 | btnNextText: '<', 143 | btnPrevText: '>' 144 | } 145 | }, 146 | toolbox: { 147 | enabled: true, 148 | calendarSwitch: { 149 | enabled: true, 150 | format: 'MMMM' 151 | }, 152 | todayButton: { 153 | enabled: true, 154 | text: { 155 | fa: 'امروز', 156 | en: 'Today', 157 | } 158 | }, 159 | submitButton: { 160 | enabled: true, 161 | text: { 162 | fa: 'تایید', 163 | en: 'Submit', 164 | } 165 | }, 166 | text: { 167 | btnToday: 'امروز' 168 | } 169 | }, 170 | timePicker: { 171 | enabled: true, 172 | step: 1, 173 | hour: { 174 | enabled: true, 175 | step: null 176 | }, 177 | minute: { 178 | enabled: true, 179 | step: null 180 | }, 181 | second: { 182 | enabled: true, 183 | step: null 184 | }, 185 | meridian: { 186 | enabled: true 187 | } 188 | }, 189 | dayPicker: { 190 | enabled: true, 191 | titleFormat: 'YYYY MMMM' 192 | }, 193 | monthPicker: { 194 | enabled: true, 195 | titleFormat: 'YYYY' 196 | }, 197 | yearPicker: { 198 | enabled: true, 199 | titleFormat: 'YYYY' 200 | }, 201 | template1: 'dsadsad', 202 | template: ` 203 |
204 | {{#navigator.enabled}} 205 |
206 |
{{navigator.text.btnNextText}}
207 |
{{navigator.switch.text}}
208 |
{{navigator.text.btnPrevText}}
209 |
210 | {{/navigator.enabled}} 211 |
212 | {{#days.enabled}} 213 | {{#days.viewMode}} 214 |
215 |
216 |
217 |
218 |
219 | {{#weekdays.list}} 220 |
{{.}}
221 | {{/weekdays.list}} 222 |
223 |
224 | 225 | 226 | {{#days.list}} 227 | 228 | 229 | {{#.}} 230 | {{#enabled}} 231 | 237 | {{/enabled}} 238 | {{^enabled}} 239 | 245 | {{/enabled}} 246 | 247 | {{/.}} 248 | 249 | {{/days.list}} 250 | 251 |
232 | {{title}} 233 | {{#altCalendarShowHint}} 234 | {{alterCalTitle}} 235 | {{/altCalendarShowHint}} 236 | 240 | {{title}} 241 | {{#altCalendarShowHint}} 242 | {{alterCalTitle}} 243 | {{/altCalendarShowHint}} 244 |
252 |
253 |
254 | {{/days.viewMode}} 255 | {{/days.enabled}} 256 | 257 | {{#month.enabled}} 258 | {{#month.viewMode}} 259 |
260 | {{#month.list}} 261 | {{#enabled}} 262 |
{{title}}
263 | {{/enabled}} 264 | {{^enabled}} 265 |
{{title}}
266 | {{/enabled}} 267 | {{/month.list}} 268 |
269 | {{/month.viewMode}} 270 | {{/month.enabled}} 271 | 272 | {{#year.enabled }} 273 | {{#year.viewMode }} 274 |
275 | {{#year.list}} 276 | {{#enabled}} 277 |
{{title}}
278 | {{/enabled}} 279 | {{^enabled}} 280 |
{{title}}
281 | {{/enabled}} 282 | {{/year.list}} 283 |
284 | {{/year.viewMode }} 285 | {{/year.enabled }} 286 | 287 |
288 | {{#time}} 289 | {{#enabled}} 290 |
291 | {{#hour.enabled}} 292 |
293 |
294 | 295 |
296 |
297 |
298 | : 299 |
300 | {{/hour.enabled}} 301 | {{#minute.enabled}} 302 |
303 |
304 | 305 |
306 |
307 |
308 | : 309 |
310 | {{/minute.enabled}} 311 | {{#second.enabled}} 312 |
313 |
314 | 315 |
316 |
317 |
318 |
319 | {{/second.enabled}} 320 | {{#meridian.enabled}} 321 |
322 |
323 | 324 |
325 |
326 | {{/meridian.enabled}} 327 |
328 | {{/enabled}} 329 | {{/time}} 330 | 331 | {{#toolbox}} 332 | {{#enabled}} 333 |
334 | {{#toolbox.submitButton.enabled}} 335 |
{{submitButtonText}}
336 | {{/toolbox.submitButton.enabled}} 337 | {{#toolbox.todayButton.enabled}} 338 |
{{todayButtonText}}
339 | {{/toolbox.todayButton.enabled}} 340 | {{#toolbox.calendarSwitch.enabled}} 341 |
{{calendarSwitchText}}
342 | {{/toolbox.calendarSwitch.enabled}} 343 |
344 | {{/enabled}} 345 | {{^enabled}} 346 | {{#onlyTimePicker}} 347 |
348 |
{{text.btnExit}}
349 |
350 | {{/onlyTimePicker}} 351 | {{/enabled}} 352 | {{/toolbox}} 353 |
354 | ` 355 | }, 356 | render: h => h('#App') 357 | } 358 | 359 | }) --------------------------------------------------------------------------------