From ef33f4dfcaa3db4042abf884d3386c18ae48d4ca Mon Sep 17 00:00:00 2001 From: t1m0n Date: Tue, 24 Nov 2015 15:41:51 +0300 Subject: [PATCH] add examples, begin options section, fix localization option --- dist/js/datepicker.js | 8 +- dist/js/datepicker.min.js | 2 +- index-ru.html | 75 ++++++++- package.json | 1 + page/css/style.css | 2 +- page/jade/layout.jade | 1 + page/jade/mixins/example-inline.jade | 2 +- page/jade/mixins/param-header.jade | 12 ++ page/jade/pages/index-ru.jade | 234 ++++++++++++++++++++++++++- page/sass/_page.scss | 82 +++++++++- src/js/datepicker.js | 8 +- tasks/jade.js | 3 + 12 files changed, 417 insertions(+), 13 deletions(-) create mode 100644 page/jade/mixins/param-header.jade diff --git a/dist/js/datepicker.js b/dist/js/datepicker.js index 0abc08e7..6e6769d2 100644 --- a/dist/js/datepicker.js +++ b/dist/js/datepicker.js @@ -145,10 +145,12 @@ var Datepicker; this.loc = Datepicker.language[lang]; if (!this.loc) { console.warn('Can\'t find language "' + lang + '" in Datepicker.language, will use "ru" instead'); - this.loc = Datepicker.language.ru + this.loc = $.extend(true, {}, Datepicker.language.ru) } + + this.loc = $.extend(true, {}, Datepicker.language[lang], Datepicker.language.ru) } else { - this.loc = $.extend({}, Datepicker.language.ru, lang) + this.loc = $.extend(true, {}, Datepicker.language.ru, lang) } if (this.opts.dateFormat) { @@ -418,7 +420,7 @@ var Datepicker; return _this.formatDate(format, date) }); - value.join(this.opts.multipleDatesSeparator); + value = value.join(this.opts.multipleDatesSeparator); this.$el.val(value) }, diff --git a/dist/js/datepicker.min.js b/dist/js/datepicker.min.js index 8b97215d..99ff0fd8 100644 --- a/dist/js/datepicker.min.js +++ b/dist/js/datepicker.min.js @@ -1 +1 @@ -var Datepicker;!function(t,e,i){var s,a,n="datepicker",r=".datepicker-here",h=!1,o='
',d={inline:!1,language:"ru",startDate:new Date,firstDay:"",weekends:[6,0],dateFormat:"",toggleSelected:!0,position:"bottom left",offset:12,view:"days",minView:"days",showOtherMonths:!0,selectOtherMonths:!0,moveToOtherMonthsOnSelect:!0,showOtherYears:!0,selectOtherYears:!0,moveToOtherYearsOnSelect:!0,minDate:"",maxDate:"",disableNavWhenOutOfRange:!0,multipleDates:!1,multipleDatesSeparator:",",todayButton:!1,clearButton:!1,showEvent:"focus",autoClose:!1,prevHtml:"«",nextHtml:"»",navTitles:{days:"MM, yyyy",months:"yyyy",years:"yyyy1 - yyyy2"},onSelect:"",onChangeMonth:"",onChangeYear:"",onChangeDecade:"",onChangeView:"",onRenderCell:""};Datepicker=function(t,a){this.el=t,this.$el=e(t),this.opts=e.extend(!0,{},d,a,this.$el.data()),s==i&&(s=e("body")),this.opts.startDate||(this.opts.startDate=new Date),"INPUT"==this.el.nodeName&&(this.elIsInput=!0),this.inited=!1,this.visible=!1,this.silent=!1,this.currentDate=this.opts.startDate,this.currentView=this.opts.view,this._createShortCuts(),this.selectedDates=[],this.views={},this.init()},Datepicker.prototype={viewIndexes:["days","months","years"],init:function(){h||this.opts.inline||!this.elIsInput||this._buildDatepickersContainer(),this._buildBaseHtml(),this._defineLocale(this.opts.language),this._syncWithMinMaxDates(),this.elIsInput&&(this.opts.inline||(this._setPositionClasses(this.opts.position),this._bindEvents())),this.views[this.currentView]=new Datepicker.Body(this,this.currentView,this.opts),this.views[this.currentView].show(),this.nav=new Datepicker.Navigation(this,this.opts),this.view=this.currentView,this.inited=!0},_createShortCuts:function(){this.minDate=this.opts.minDate?this.opts.minDate:new Date(-86399999136e5),this.maxDate=this.opts.maxDate?this.opts.maxDate:new Date(86399999136e5)},_bindEvents:function(){this.$el.on(this.opts.showEvent,this._onShowEvent.bind(this)),this.$el.on("blur",this._onBlur.bind(this)),this.$datepicker.on("mousedown",this._onMouseDownDatepicker.bind(this)),this.$datepicker.on("mouseup",this._onMouseUpDatepicker.bind(this))},isWeekend:function(t){return-1!==this.opts.weekends.indexOf(t)},_defineLocale:function(t){"string"==typeof t?(this.loc=Datepicker.language[t],this.loc||(console.warn("Can't find language \""+t+'" in Datepicker.language, will use "ru" instead'),this.loc=Datepicker.language.ru)):this.loc=e.extend({},Datepicker.language.ru,t),this.opts.dateFormat&&(this.loc.dateFormat=this.opts.dateFormat),this.opts.firstDay&&(this.loc.firstDay=this.opts.firstDay)},_buildDatepickersContainer:function(){h=!0,s.append('
'),a=e("#datepickers-container")},_buildBaseHtml:function(){var t,i=e('
');t="INPUT"==this.el.nodeName?this.opts.inline?i.insertAfter(this.$el):a:i.insertAfter(this.$el),this.$datepicker=e(o).appendTo(t),this.$content=e(".datepicker--content",this.$datepicker),this.$nav=e(".datepicker--nav",this.$datepicker)},_triggerOnChange:function(){if(!this.selectedDates.length)return this.opts.onSelect("","",this);var t,e=this.selectedDates,i=Datepicker.getParsedDate(e[0]),s=this,a=new Date(i.year,i.month,i.date);t=e.map(function(t){return s.formatDate(s.loc.dateFormat,t)}).join(this.opts.multipleDatesSeparator),this.opts.multipleDates&&(a=e.map(function(t){var e=Datepicker.getParsedDate(t);return new Date(e.year,e.month,e.date)})),this.opts.onSelect(t,a,this)},next:function(){var t=this.parsedDate,e=this.opts;switch(this.view){case"days":this.date=new Date(t.year,t.month+1,1),e.onChangeMonth&&e.onChangeMonth(t.month+1);break;case"months":this.date=new Date(t.year+1,t.month,1),e.onChangeYear&&e.onChangeYear(t.year+1);break;case"years":this.date=new Date(t.year+10,0,1),e.onChangeDecade&&e.onChangeDecade(this.curDecade)}},prev:function(){var t=this.parsedDate,e=this.opts;switch(this.view){case"days":this.date=new Date(t.year,t.month-1,1),e.onChangeMonth&&e.onChangeMonth(t.month-1);break;case"months":this.date=new Date(t.year-1,t.month,1),e.onChangeYear&&e.onChangeYear(t.year-1);break;case"years":this.date=new Date(t.year-10,0,1),e.onChangeDecade&&e.onChangeDecade(this.curDecade)}},formatDate:function(t,e){e=e||this.date;var i=t,s=this.loc,a=Datepicker.getDecade(e),n=Datepicker.getParsedDate(e);switch(!0){case/dd/.test(i):i=i.replace(/\bdd\b/,n.fullDate);case/d/.test(i):i=i.replace(/\bd\b/,n.date);case/DD/.test(i):i=i.replace(/\bDD\b/,s.days[n.day]);case/D/.test(i):i=i.replace(/\bD\b/,s.daysShort[n.day]);case/mm/.test(i):i=i.replace(/\bmm\b/,n.fullMonth);case/m/.test(i):i=i.replace(/\bm\b/,n.month+1);case/MM/.test(i):i=i.replace(/\bMM\b/,this.loc.months[n.month]);case/M/.test(i):i=i.replace(/\bM\b/,s.monthsShort[n.month]);case/yyyy/.test(i):i=i.replace(/\byyyy\b/,n.year);case/yyyy1/.test(i):i=i.replace(/\byyyy1\b/,a[0]);case/yyyy2/.test(i):i=i.replace(/\byyyy2\b/,a[1]);case/yy/.test(i):i=i.replace(/\byy\b/,n.year.toString().slice(-2))}return i},selectDate:function(t){var e=this.parsedDate,i="";if("days"==this.view&&t.getMonth()!=e.month&&this.opts.moveToOtherMonthsOnSelect&&(i=new Date(t.getFullYear(),t.getMonth(),1)),"years"==this.view&&t.getFullYear()!=e.year&&this.opts.moveToOtherYearsOnSelect&&(i=new Date(t.getFullYear(),0,1)),i&&(this.silent=!0,this.date=i,this.silent=!1,this.nav._render()),this.opts.multipleDates){if(this.selectedDates.length===this.opts.multipleDates)return;this._isSelected(t)||this.selectedDates.push(t)}else this.selectedDates=[t];this._setInputValue(),this.opts.onSelect&&this._triggerOnChange(),this.opts.autoClose?this.hide():this.views[this.currentView]._render()},removeDate:function(t){var e=this.selectedDates,i=this;return e.some(function(s,a){return Datepicker.isSame(s,t)?(e.splice(a,1),i.views[i.currentView]._render(),i._setInputValue(),i.opts.onSelect&&i._triggerOnChange(),!0):void 0})},today:function(){this.silent=!0,this.view=this.opts.minView,this.silent=!1,this.date=new Date},clear:function(){this.selectedDates=[],this.views[this.currentView]._render(),this._triggerOnChange()},update:function(t,i){var s=arguments.length;return 2==s?this.opts[t]=i:1==s&&"object"==typeof t&&(this.opts=e.extend(!0,this.opts,t)),this._createShortCuts(),this._syncWithMinMaxDates(),this._defineLocale(this.opts.language),this.nav._addButtonsIfNeed(),this.nav._render(),this.views[this.currentView]._render(),this.elIsInput&&!this.opts.inline&&(this._setPositionClasses(this.opts.position),this.visible&&this.setPosition(this.opts.position)),this},_syncWithMinMaxDates:function(){var t=this.date.getTime();this.silent=!0,this.minTime>t&&(this.date=this.minDate),this.maxTime=this.minTime&&i<=this.maxTime,month:r>=this.minTime&&h<=this.maxTime,year:s.year>=a.year&&s.year<=n.year};return e?o[e]:o.day},_getDimensions:function(t){var e=t.offset();return{width:t.outerWidth(),height:t.outerHeight(),left:e.left,top:e.top}},_setPositionClasses:function(t){t=t.split(" ");var e=t[0],i=t[1],s="datepicker -"+e+"-"+i+"- -from-"+e+"-";this.visible&&(s+=" active"),this.$datepicker.removeAttr("class").addClass(s)},setPosition:function(t){var e,i,s=this._getDimensions(this.$el),a=this._getDimensions(this.$datepicker),n=t.split(" "),r=this.opts.offset,h=n[0],o=n[1];switch(h){case"top":e=s.top-a.height-r;break;case"right":i=s.left+s.width+r;break;case"bottom":e=s.top+s.height+r;break;case"left":i=s.left-a.width-r}switch(o){case"top":e=s.top;break;case"right":i=s.left+s.width-a.width;break;case"bottom":e=s.top+s.height-a.height;break;case"left":i=s.left;break;case"center":/left|right/.test(h)?e=s.top+s.height/2-a.height/2:i=s.left+s.width/2-a.width/2}this.$datepicker.css({left:i,top:e})},show:function(){this.setPosition(this.opts.position),this.$datepicker.addClass("active"),this.visible=!0},hide:function(){this.$datepicker.removeClass("active").css({left:"-100000px"}),this.inFocus=!1,this.visible=!1,this.$el.blur()},_onShowEvent:function(){this.visible||this.show()},_onBlur:function(){!this.inFocus&&this.visible&&this.hide()},_onMouseDownDatepicker:function(t){this.inFocus=!0},_onMouseUpDatepicker:function(t){this.inFocus=!1,this.$el.focus()},get parsedDate(){return Datepicker.getParsedDate(this.date)},set date(t){return this.currentDate=t,this.inited&&!this.silent&&(this.views[this.view]._render(),this.nav._render()),t},get date(){return this.currentDate},set view(t){return this.viewIndex=this.viewIndexes.indexOf(t),this.viewIndex<0?void 0:(this.prevView=this.currentView,this.currentView=t,this.inited&&(this.views[t]?this.views[t]._render():this.views[t]=new Datepicker.Body(this,t,this.opts),this.views[this.prevView].hide(),this.views[t].show(),this.nav._render(),this.opts.onChangeView&&this.opts.onChangeView(t),this.setPosition(this.opts.position)),t)},get view(){return this.currentView},get cellType(){return this.view.substring(0,this.view.length-1)},get minTime(){var t=Datepicker.getParsedDate(this.minDate);return new Date(t.year,t.month,t.date).getTime()},get maxTime(){var t=Datepicker.getParsedDate(this.maxDate);return new Date(t.year,t.month,t.date).getTime()},get curDecade(){return Datepicker.getDecade(this.date)}},Datepicker.getDaysCount=function(t){return new Date(t.getFullYear(),t.getMonth()+1,0).getDate()},Datepicker.getParsedDate=function(t){return{year:t.getFullYear(),month:t.getMonth(),fullMonth:t.getMonth()+1<10?"0"+(t.getMonth()+1):t.getMonth()+1,date:t.getDate(),fullDate:t.getDate()<10?"0"+t.getDate():t.getDate(),day:t.getDay()}},Datepicker.getDecade=function(t){var e=10*Math.floor(t.getFullYear()/10);return[e,e+9]},Datepicker.template=function(t,e){return t.replace(/#\{([\w]+)\}/g,function(t,i){return e[i]||0===e[i]?e[i]:void 0})},Datepicker.isSame=function(t,e,i){var s=Datepicker.getParsedDate(t),a=Datepicker.getParsedDate(e),n=i?i:"day",r={day:s.date==a.date&&s.month==a.month&&s.year==a.year,month:s.month==a.month&&s.year==a.year,year:s.year==a.year};return r[n]},Datepicker.language={ru:{days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],daysShort:["Вос","Пон","Вто","Сре","Чет","Пят","Суб"],daysMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Сегодня",clear:"Очистить",dateFormat:"dd.mm.yyyy",firstDay:1}},e.fn[n]=function(t){return Datepicker.prototype[t]?void Datepicker.prototype[t].apply(this.data(n),Array.prototype.slice.call(arguments,1)):this.each(function(){if(e.data(this,n)){var i=e.data(this,n),s=i.opts;i.opts=e.extend({},s,t)}else e.data(this,n,new Datepicker(this,t))})},e(function(){e(r).datepicker()})}(window,jQuery),function(){var t={days:'
',months:'
',years:'
'};Datepicker.Body=function(t,e,i){this.d=t,this.type=e,this.opts=i,this.init()},Datepicker.Body.prototype={init:function(){this._buildBaseHtml(),this._render(),this._bindEvents()},_bindEvents:function(){this.$el.on("click",".datepicker--cell",$.proxy(this._onClickCell,this))},_buildBaseHtml:function(){this.$el=$(t[this.type]).appendTo(this.d.$content),this.$names=$(".datepicker--days-names",this.$el),this.$cells=$(".datepicker--cells",this.$el)},_getDayNamesHtml:function(t,e,i,s){return e=void 0!=e?e:t,i=i?i:"",s=void 0!=s?s:0,s>7?i:7==e?this._getDayNamesHtml(t,0,i,++s):(i+='
'+this.d.loc.daysMin[e]+"
",this._getDayNamesHtml(t,++e,i,++s))},_getDaysHtml:function(t){var e=Datepicker.getDaysCount(t),i=new Date(t.getFullYear(),t.getMonth(),1).getDay(),s=new Date(t.getFullYear(),t.getMonth(),e).getDay(),a=i-this.d.loc.firstDay,n=6-s+this.d.loc.firstDay;a=0>a?a+7:a,n=n>6?n-7:n;for(var r,h,o=-a+1,d="",c=o,l=e+n;l>=c;c++)h=t.getFullYear(),r=t.getMonth(),d+=this._getDayHtml(new Date(h,r,c));return d},_getDayHtml:function(t){var e="datepicker--cell datepicker--cell-day",i=new Date,s=Datepicker.getParsedDate(t),a={},n=s.date;return this.opts.onRenderCell&&(a=this.opts.onRenderCell(t,"day")||{},n=a.html?a.html:n,e+=a.classes?" "+a.classes:""),this.d.isWeekend(s.day)&&(e+=" -weekend-"),Datepicker.isSame(i,t)&&(e+=" -current-"),this.d._isSelected(t,"day")&&(e+=" -selected-"),(!this.d._isInRange(t)||a.disabled)&&(e+=" -disabled-"),s.month!=this.d.parsedDate.month&&(e+=" -other-month-",this.opts.selectOtherMonths||(e+=" -disabled-"),this.opts.showOtherMonths||(n="")),'
'+n+"
"},_getMonthsHtml:function(t){for(var e="",i=Datepicker.getParsedDate(t),s=0;12>s;)e+=this._getMonthHtml(new Date(i.year,s)),s++;return e},_getMonthHtml:function(t){var e="datepicker--cell datepicker--cell-month",i=Datepicker.getParsedDate(t),s=new Date,a=this.d.loc,n=a.months[i.month],r={};return this.opts.onRenderCell&&(r=this.opts.onRenderCell(t,"month")||{},n=r.html?r.html:n,e+=r.classes?" "+r.classes:""),Datepicker.isSame(s,t,"month")&&(e+=" -current-"),this.d._isSelected(t,"month")&&(e+=" -selected-"),(!this.d._isInRange(t,"month")||r.disabled)&&(e+=" -disabled-"),'
'+n+"
"},_getYearsHtml:function(t){var e=(Datepicker.getParsedDate(t),Datepicker.getDecade(t)),i=e[0]-1,s="",a=i;for(a;a<=e[1]+1;a++)s+=this._getYearHtml(new Date(a,0));return s},_getYearHtml:function(t){var e="datepicker--cell datepicker--cell-year",i=Datepicker.getDecade(this.d.date),s=new Date,a=Datepicker.getParsedDate(t),n=a.year,r={};return this.opts.onRenderCell&&(r=this.opts.onRenderCell(t,"year")||{},n=r.html?r.html:n,e+=r.classes?" "+r.classes:""),(a.yeari[1])&&(e+=" -other-decade-",this.opts.selectOtherYears||(e+=" -disabled-"),this.opts.showOtherYears||(n="")),Datepicker.isSame(s,t,"year")&&(e+=" -current-"),this.d._isSelected(t,"year")&&(e+=" -selected-"),(!this.d._isInRange(t,"year")||r.disabled)&&(e+=" -disabled-"),'
'+n+"
"},_renderTypes:{days:function(){var t=this._getDayNamesHtml(this.d.loc.firstDay),e=this._getDaysHtml(this.d.currentDate);this.$cells.html(e),this.$names.html(t)},months:function(){var t=this._getMonthsHtml(this.d.currentDate);this.$cells.html(t)},years:function(){var t=this._getYearsHtml(this.d.currentDate);this.$cells.html(t)}},_render:function(){this._renderTypes[this.type].bind(this)()},show:function(){this.$el.addClass("active"),this.acitve=!0},hide:function(){this.$el.removeClass("active"),this.active=!1},_handleClick:function(t){var e=t.data("date")||1,i=t.data("month")||0,s=t.data("year")||this.d.parsedDate.year;if(this.d.view!=this.opts.minView){var a=this.d.viewIndex-1;return this.d.silent=!0,this.d.date=new Date(s,i,e),this.d.silent=!1,void(this.d.view=this.d.viewIndexes[a])}var n=new Date(s,i,e),r=this.d._isSelected(n,this.d.cellType);r?r&&this.opts.toggleSelected&&this.d.removeDate(n):this.d.selectDate(n)},_onClickCell:function(t){var e=$(t.target).closest(".datepicker--cell");e.hasClass("-disabled-")||this._handleClick.bind(this)(e)}}}(),function(){var t='
#{prevHtml}
#{title}
#{nextHtml}
',e='
',i='#{label}';Datepicker.Navigation=function(t,e){this.d=t,this.opts=e,this.$buttonsContainer="",this.init()},Datepicker.Navigation.prototype={init:function(){this._buildBaseHtml(),this._bindEvents()},_bindEvents:function(){this.d.$nav.on("click",".datepicker--nav-action",$.proxy(this._onClickNavButton,this)),this.d.$nav.on("click",".datepicker--nav-title",$.proxy(this._onClickNavTitle,this)),this.d.$datepicker.on("click",".datepicker--button",$.proxy(this._onClickNavButton,this))},_buildBaseHtml:function(){this._render(),this._addButtonsIfNeed()},_addButtonsIfNeed:function(){this.opts.todayButton&&this._addButton("today"),this.opts.clearButton&&this._addButton("clear")},_render:function(){var e=this._getTitle(this.d.currentDate),i=Datepicker.template(t,$.extend({title:e},this.opts));this.d.$nav.html(i),"years"==this.d.view&&$(".datepicker--nav-title",this.d.$nav).addClass("-disabled-"),this.setNavStatus()},_getTitle:function(t){return this.d.formatDate(this.opts.navTitles[this.d.view],t)},_addButton:function(t){this.$buttonsContainer.length||this._addButtonsContainer();var e={action:t,label:this.d.loc[t]},s=Datepicker.template(i,e);this.$buttonsContainer.append(s)},_addButtonsContainer:function(){this.d.$datepicker.append(e),this.$buttonsContainer=$(".datepicker--buttons",this.d.$datepicker)},setNavStatus:function(){if((this.opts.minDate||this.opts.maxDate)&&this.opts.disableNavWhenOutOfRange){var t=this.d.parsedDate,e=t.month,i=t.year,s=t.date;switch(this.d.view){case"days":this.d._isInRange(new Date(i,e-1,s),"month")||this._disableNav("prev"),this.d._isInRange(new Date(i,e+1,s),"month")||this._disableNav("next");break;case"months":this.d._isInRange(new Date(i-1,e,s),"year")||this._disableNav("prev"),this.d._isInRange(new Date(i+1,e,s),"year")||this._disableNav("next");break;case"years":this.d._isInRange(new Date(i-10,e,s),"year")||this._disableNav("prev"),this.d._isInRange(new Date(i+10,e,s),"year")||this._disableNav("next")}}},_disableNav:function(t){$('[data-action="'+t+'"]',this.d.$nav).addClass("-disabled-")},_activateNav:function(t){$('[data-action="'+t+'"]',this.d.$nav).removeClass("-disabled-")},_onClickNavButton:function(t){var e=$(t.target),i=e.data("action");this.d[i]()},_onClickNavTitle:function(t){return $(t.target).hasClass("-disabled-")?void 0:"days"==this.d.view?this.d.view="months":void(this.d.view="years")}}}(); \ No newline at end of file +var Datepicker;!function(t,e,i){var s,a,n="datepicker",r=".datepicker-here",h=!1,o='
',d={inline:!1,language:"ru",startDate:new Date,firstDay:"",weekends:[6,0],dateFormat:"",toggleSelected:!0,position:"bottom left",offset:12,view:"days",minView:"days",showOtherMonths:!0,selectOtherMonths:!0,moveToOtherMonthsOnSelect:!0,showOtherYears:!0,selectOtherYears:!0,moveToOtherYearsOnSelect:!0,minDate:"",maxDate:"",disableNavWhenOutOfRange:!0,multipleDates:!1,multipleDatesSeparator:",",todayButton:!1,clearButton:!1,showEvent:"focus",autoClose:!1,prevHtml:"«",nextHtml:"»",navTitles:{days:"MM, yyyy",months:"yyyy",years:"yyyy1 - yyyy2"},onSelect:"",onChangeMonth:"",onChangeYear:"",onChangeDecade:"",onChangeView:"",onRenderCell:""};Datepicker=function(t,a){this.el=t,this.$el=e(t),this.opts=e.extend(!0,{},d,a,this.$el.data()),s==i&&(s=e("body")),this.opts.startDate||(this.opts.startDate=new Date),"INPUT"==this.el.nodeName&&(this.elIsInput=!0),this.inited=!1,this.visible=!1,this.silent=!1,this.currentDate=this.opts.startDate,this.currentView=this.opts.view,this._createShortCuts(),this.selectedDates=[],this.views={},this.init()},Datepicker.prototype={viewIndexes:["days","months","years"],init:function(){h||this.opts.inline||!this.elIsInput||this._buildDatepickersContainer(),this._buildBaseHtml(),this._defineLocale(this.opts.language),this._syncWithMinMaxDates(),this.elIsInput&&(this.opts.inline||(this._setPositionClasses(this.opts.position),this._bindEvents())),this.views[this.currentView]=new Datepicker.Body(this,this.currentView,this.opts),this.views[this.currentView].show(),this.nav=new Datepicker.Navigation(this,this.opts),this.view=this.currentView,this.inited=!0},_createShortCuts:function(){this.minDate=this.opts.minDate?this.opts.minDate:new Date(-86399999136e5),this.maxDate=this.opts.maxDate?this.opts.maxDate:new Date(86399999136e5)},_bindEvents:function(){this.$el.on(this.opts.showEvent,this._onShowEvent.bind(this)),this.$el.on("blur",this._onBlur.bind(this)),this.$datepicker.on("mousedown",this._onMouseDownDatepicker.bind(this)),this.$datepicker.on("mouseup",this._onMouseUpDatepicker.bind(this))},isWeekend:function(t){return-1!==this.opts.weekends.indexOf(t)},_defineLocale:function(t){"string"==typeof t?(this.loc=Datepicker.language[t],this.loc||(console.warn("Can't find language \""+t+'" in Datepicker.language, will use "ru" instead'),this.loc=e.extend(!0,{},Datepicker.language.ru)),this.loc=e.extend(!0,{},Datepicker.language[t],Datepicker.language.ru)):this.loc=e.extend(!0,{},Datepicker.language.ru,t),this.opts.dateFormat&&(this.loc.dateFormat=this.opts.dateFormat),this.opts.firstDay&&(this.loc.firstDay=this.opts.firstDay)},_buildDatepickersContainer:function(){h=!0,s.append('
'),a=e("#datepickers-container")},_buildBaseHtml:function(){var t,i=e('
');t="INPUT"==this.el.nodeName?this.opts.inline?i.insertAfter(this.$el):a:i.insertAfter(this.$el),this.$datepicker=e(o).appendTo(t),this.$content=e(".datepicker--content",this.$datepicker),this.$nav=e(".datepicker--nav",this.$datepicker)},_triggerOnChange:function(){if(!this.selectedDates.length)return this.opts.onSelect("","",this);var t,e=this.selectedDates,i=Datepicker.getParsedDate(e[0]),s=this,a=new Date(i.year,i.month,i.date);t=e.map(function(t){return s.formatDate(s.loc.dateFormat,t)}).join(this.opts.multipleDatesSeparator),this.opts.multipleDates&&(a=e.map(function(t){var e=Datepicker.getParsedDate(t);return new Date(e.year,e.month,e.date)})),this.opts.onSelect(t,a,this)},next:function(){var t=this.parsedDate,e=this.opts;switch(this.view){case"days":this.date=new Date(t.year,t.month+1,1),e.onChangeMonth&&e.onChangeMonth(t.month+1);break;case"months":this.date=new Date(t.year+1,t.month,1),e.onChangeYear&&e.onChangeYear(t.year+1);break;case"years":this.date=new Date(t.year+10,0,1),e.onChangeDecade&&e.onChangeDecade(this.curDecade)}},prev:function(){var t=this.parsedDate,e=this.opts;switch(this.view){case"days":this.date=new Date(t.year,t.month-1,1),e.onChangeMonth&&e.onChangeMonth(t.month-1);break;case"months":this.date=new Date(t.year-1,t.month,1),e.onChangeYear&&e.onChangeYear(t.year-1);break;case"years":this.date=new Date(t.year-10,0,1),e.onChangeDecade&&e.onChangeDecade(this.curDecade)}},formatDate:function(t,e){e=e||this.date;var i=t,s=this.loc,a=Datepicker.getDecade(e),n=Datepicker.getParsedDate(e);switch(!0){case/dd/.test(i):i=i.replace(/\bdd\b/,n.fullDate);case/d/.test(i):i=i.replace(/\bd\b/,n.date);case/DD/.test(i):i=i.replace(/\bDD\b/,s.days[n.day]);case/D/.test(i):i=i.replace(/\bD\b/,s.daysShort[n.day]);case/mm/.test(i):i=i.replace(/\bmm\b/,n.fullMonth);case/m/.test(i):i=i.replace(/\bm\b/,n.month+1);case/MM/.test(i):i=i.replace(/\bMM\b/,this.loc.months[n.month]);case/M/.test(i):i=i.replace(/\bM\b/,s.monthsShort[n.month]);case/yyyy/.test(i):i=i.replace(/\byyyy\b/,n.year);case/yyyy1/.test(i):i=i.replace(/\byyyy1\b/,a[0]);case/yyyy2/.test(i):i=i.replace(/\byyyy2\b/,a[1]);case/yy/.test(i):i=i.replace(/\byy\b/,n.year.toString().slice(-2))}return i},selectDate:function(t){var e=this.parsedDate,i="";if("days"==this.view&&t.getMonth()!=e.month&&this.opts.moveToOtherMonthsOnSelect&&(i=new Date(t.getFullYear(),t.getMonth(),1)),"years"==this.view&&t.getFullYear()!=e.year&&this.opts.moveToOtherYearsOnSelect&&(i=new Date(t.getFullYear(),0,1)),i&&(this.silent=!0,this.date=i,this.silent=!1,this.nav._render()),this.opts.multipleDates){if(this.selectedDates.length===this.opts.multipleDates)return;this._isSelected(t)||this.selectedDates.push(t)}else this.selectedDates=[t];this._setInputValue(),this.opts.onSelect&&this._triggerOnChange(),this.opts.autoClose?this.hide():this.views[this.currentView]._render()},removeDate:function(t){var e=this.selectedDates,i=this;return e.some(function(s,a){return Datepicker.isSame(s,t)?(e.splice(a,1),i.views[i.currentView]._render(),i._setInputValue(),i.opts.onSelect&&i._triggerOnChange(),!0):void 0})},today:function(){this.silent=!0,this.view=this.opts.minView,this.silent=!1,this.date=new Date},clear:function(){this.selectedDates=[],this.views[this.currentView]._render(),this._triggerOnChange()},update:function(t,i){var s=arguments.length;return 2==s?this.opts[t]=i:1==s&&"object"==typeof t&&(this.opts=e.extend(!0,this.opts,t)),this._createShortCuts(),this._syncWithMinMaxDates(),this._defineLocale(this.opts.language),this.nav._addButtonsIfNeed(),this.nav._render(),this.views[this.currentView]._render(),this.elIsInput&&!this.opts.inline&&(this._setPositionClasses(this.opts.position),this.visible&&this.setPosition(this.opts.position)),this},_syncWithMinMaxDates:function(){var t=this.date.getTime();this.silent=!0,this.minTime>t&&(this.date=this.minDate),this.maxTime=this.minTime&&i<=this.maxTime,month:r>=this.minTime&&h<=this.maxTime,year:s.year>=a.year&&s.year<=n.year};return e?o[e]:o.day},_getDimensions:function(t){var e=t.offset();return{width:t.outerWidth(),height:t.outerHeight(),left:e.left,top:e.top}},_setPositionClasses:function(t){t=t.split(" ");var e=t[0],i=t[1],s="datepicker -"+e+"-"+i+"- -from-"+e+"-";this.visible&&(s+=" active"),this.$datepicker.removeAttr("class").addClass(s)},setPosition:function(t){var e,i,s=this._getDimensions(this.$el),a=this._getDimensions(this.$datepicker),n=t.split(" "),r=this.opts.offset,h=n[0],o=n[1];switch(h){case"top":e=s.top-a.height-r;break;case"right":i=s.left+s.width+r;break;case"bottom":e=s.top+s.height+r;break;case"left":i=s.left-a.width-r}switch(o){case"top":e=s.top;break;case"right":i=s.left+s.width-a.width;break;case"bottom":e=s.top+s.height-a.height;break;case"left":i=s.left;break;case"center":/left|right/.test(h)?e=s.top+s.height/2-a.height/2:i=s.left+s.width/2-a.width/2}this.$datepicker.css({left:i,top:e})},show:function(){this.setPosition(this.opts.position),this.$datepicker.addClass("active"),this.visible=!0},hide:function(){this.$datepicker.removeClass("active").css({left:"-100000px"}),this.inFocus=!1,this.visible=!1,this.$el.blur()},_onShowEvent:function(){this.visible||this.show()},_onBlur:function(){!this.inFocus&&this.visible&&this.hide()},_onMouseDownDatepicker:function(t){this.inFocus=!0},_onMouseUpDatepicker:function(t){this.inFocus=!1,this.$el.focus()},get parsedDate(){return Datepicker.getParsedDate(this.date)},set date(t){return this.currentDate=t,this.inited&&!this.silent&&(this.views[this.view]._render(),this.nav._render()),t},get date(){return this.currentDate},set view(t){return this.viewIndex=this.viewIndexes.indexOf(t),this.viewIndex<0?void 0:(this.prevView=this.currentView,this.currentView=t,this.inited&&(this.views[t]?this.views[t]._render():this.views[t]=new Datepicker.Body(this,t,this.opts),this.views[this.prevView].hide(),this.views[t].show(),this.nav._render(),this.opts.onChangeView&&this.opts.onChangeView(t),this.setPosition(this.opts.position)),t)},get view(){return this.currentView},get cellType(){return this.view.substring(0,this.view.length-1)},get minTime(){var t=Datepicker.getParsedDate(this.minDate);return new Date(t.year,t.month,t.date).getTime()},get maxTime(){var t=Datepicker.getParsedDate(this.maxDate);return new Date(t.year,t.month,t.date).getTime()},get curDecade(){return Datepicker.getDecade(this.date)}},Datepicker.getDaysCount=function(t){return new Date(t.getFullYear(),t.getMonth()+1,0).getDate()},Datepicker.getParsedDate=function(t){return{year:t.getFullYear(),month:t.getMonth(),fullMonth:t.getMonth()+1<10?"0"+(t.getMonth()+1):t.getMonth()+1,date:t.getDate(),fullDate:t.getDate()<10?"0"+t.getDate():t.getDate(),day:t.getDay()}},Datepicker.getDecade=function(t){var e=10*Math.floor(t.getFullYear()/10);return[e,e+9]},Datepicker.template=function(t,e){return t.replace(/#\{([\w]+)\}/g,function(t,i){return e[i]||0===e[i]?e[i]:void 0})},Datepicker.isSame=function(t,e,i){var s=Datepicker.getParsedDate(t),a=Datepicker.getParsedDate(e),n=i?i:"day",r={day:s.date==a.date&&s.month==a.month&&s.year==a.year,month:s.month==a.month&&s.year==a.year,year:s.year==a.year};return r[n]},Datepicker.language={ru:{days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],daysShort:["Вос","Пон","Вто","Сре","Чет","Пят","Суб"],daysMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Сегодня",clear:"Очистить",dateFormat:"dd.mm.yyyy",firstDay:1}},e.fn[n]=function(t){return Datepicker.prototype[t]?void Datepicker.prototype[t].apply(this.data(n),Array.prototype.slice.call(arguments,1)):this.each(function(){if(e.data(this,n)){var i=e.data(this,n),s=i.opts;i.opts=e.extend({},s,t)}else e.data(this,n,new Datepicker(this,t))})},e(function(){e(r).datepicker()})}(window,jQuery),function(){var t={days:'
',months:'
',years:'
'};Datepicker.Body=function(t,e,i){this.d=t,this.type=e,this.opts=i,this.init()},Datepicker.Body.prototype={init:function(){this._buildBaseHtml(),this._render(),this._bindEvents()},_bindEvents:function(){this.$el.on("click",".datepicker--cell",$.proxy(this._onClickCell,this))},_buildBaseHtml:function(){this.$el=$(t[this.type]).appendTo(this.d.$content),this.$names=$(".datepicker--days-names",this.$el),this.$cells=$(".datepicker--cells",this.$el)},_getDayNamesHtml:function(t,e,i,s){return e=void 0!=e?e:t,i=i?i:"",s=void 0!=s?s:0,s>7?i:7==e?this._getDayNamesHtml(t,0,i,++s):(i+='
'+this.d.loc.daysMin[e]+"
",this._getDayNamesHtml(t,++e,i,++s))},_getDaysHtml:function(t){var e=Datepicker.getDaysCount(t),i=new Date(t.getFullYear(),t.getMonth(),1).getDay(),s=new Date(t.getFullYear(),t.getMonth(),e).getDay(),a=i-this.d.loc.firstDay,n=6-s+this.d.loc.firstDay;a=0>a?a+7:a,n=n>6?n-7:n;for(var r,h,o=-a+1,d="",c=o,l=e+n;l>=c;c++)h=t.getFullYear(),r=t.getMonth(),d+=this._getDayHtml(new Date(h,r,c));return d},_getDayHtml:function(t){var e="datepicker--cell datepicker--cell-day",i=new Date,s=Datepicker.getParsedDate(t),a={},n=s.date;return this.opts.onRenderCell&&(a=this.opts.onRenderCell(t,"day")||{},n=a.html?a.html:n,e+=a.classes?" "+a.classes:""),this.d.isWeekend(s.day)&&(e+=" -weekend-"),Datepicker.isSame(i,t)&&(e+=" -current-"),this.d._isSelected(t,"day")&&(e+=" -selected-"),(!this.d._isInRange(t)||a.disabled)&&(e+=" -disabled-"),s.month!=this.d.parsedDate.month&&(e+=" -other-month-",this.opts.selectOtherMonths||(e+=" -disabled-"),this.opts.showOtherMonths||(n="")),'
'+n+"
"},_getMonthsHtml:function(t){for(var e="",i=Datepicker.getParsedDate(t),s=0;12>s;)e+=this._getMonthHtml(new Date(i.year,s)),s++;return e},_getMonthHtml:function(t){var e="datepicker--cell datepicker--cell-month",i=Datepicker.getParsedDate(t),s=new Date,a=this.d.loc,n=a.months[i.month],r={};return this.opts.onRenderCell&&(r=this.opts.onRenderCell(t,"month")||{},n=r.html?r.html:n,e+=r.classes?" "+r.classes:""),Datepicker.isSame(s,t,"month")&&(e+=" -current-"),this.d._isSelected(t,"month")&&(e+=" -selected-"),(!this.d._isInRange(t,"month")||r.disabled)&&(e+=" -disabled-"),'
'+n+"
"},_getYearsHtml:function(t){var e=(Datepicker.getParsedDate(t),Datepicker.getDecade(t)),i=e[0]-1,s="",a=i;for(a;a<=e[1]+1;a++)s+=this._getYearHtml(new Date(a,0));return s},_getYearHtml:function(t){var e="datepicker--cell datepicker--cell-year",i=Datepicker.getDecade(this.d.date),s=new Date,a=Datepicker.getParsedDate(t),n=a.year,r={};return this.opts.onRenderCell&&(r=this.opts.onRenderCell(t,"year")||{},n=r.html?r.html:n,e+=r.classes?" "+r.classes:""),(a.yeari[1])&&(e+=" -other-decade-",this.opts.selectOtherYears||(e+=" -disabled-"),this.opts.showOtherYears||(n="")),Datepicker.isSame(s,t,"year")&&(e+=" -current-"),this.d._isSelected(t,"year")&&(e+=" -selected-"),(!this.d._isInRange(t,"year")||r.disabled)&&(e+=" -disabled-"),'
'+n+"
"},_renderTypes:{days:function(){var t=this._getDayNamesHtml(this.d.loc.firstDay),e=this._getDaysHtml(this.d.currentDate);this.$cells.html(e),this.$names.html(t)},months:function(){var t=this._getMonthsHtml(this.d.currentDate);this.$cells.html(t)},years:function(){var t=this._getYearsHtml(this.d.currentDate);this.$cells.html(t)}},_render:function(){this._renderTypes[this.type].bind(this)()},show:function(){this.$el.addClass("active"),this.acitve=!0},hide:function(){this.$el.removeClass("active"),this.active=!1},_handleClick:function(t){var e=t.data("date")||1,i=t.data("month")||0,s=t.data("year")||this.d.parsedDate.year;if(this.d.view!=this.opts.minView){var a=this.d.viewIndex-1;return this.d.silent=!0,this.d.date=new Date(s,i,e),this.d.silent=!1,void(this.d.view=this.d.viewIndexes[a])}var n=new Date(s,i,e),r=this.d._isSelected(n,this.d.cellType);r?r&&this.opts.toggleSelected&&this.d.removeDate(n):this.d.selectDate(n)},_onClickCell:function(t){var e=$(t.target).closest(".datepicker--cell");e.hasClass("-disabled-")||this._handleClick.bind(this)(e)}}}(),function(){var t='
#{prevHtml}
#{title}
#{nextHtml}
',e='
',i='#{label}';Datepicker.Navigation=function(t,e){this.d=t,this.opts=e,this.$buttonsContainer="",this.init()},Datepicker.Navigation.prototype={init:function(){this._buildBaseHtml(),this._bindEvents()},_bindEvents:function(){this.d.$nav.on("click",".datepicker--nav-action",$.proxy(this._onClickNavButton,this)),this.d.$nav.on("click",".datepicker--nav-title",$.proxy(this._onClickNavTitle,this)),this.d.$datepicker.on("click",".datepicker--button",$.proxy(this._onClickNavButton,this))},_buildBaseHtml:function(){this._render(),this._addButtonsIfNeed()},_addButtonsIfNeed:function(){this.opts.todayButton&&this._addButton("today"),this.opts.clearButton&&this._addButton("clear")},_render:function(){var e=this._getTitle(this.d.currentDate),i=Datepicker.template(t,$.extend({title:e},this.opts));this.d.$nav.html(i),"years"==this.d.view&&$(".datepicker--nav-title",this.d.$nav).addClass("-disabled-"),this.setNavStatus()},_getTitle:function(t){return this.d.formatDate(this.opts.navTitles[this.d.view],t)},_addButton:function(t){this.$buttonsContainer.length||this._addButtonsContainer();var e={action:t,label:this.d.loc[t]},s=Datepicker.template(i,e);this.$buttonsContainer.append(s)},_addButtonsContainer:function(){this.d.$datepicker.append(e),this.$buttonsContainer=$(".datepicker--buttons",this.d.$datepicker)},setNavStatus:function(){if((this.opts.minDate||this.opts.maxDate)&&this.opts.disableNavWhenOutOfRange){var t=this.d.parsedDate,e=t.month,i=t.year,s=t.date;switch(this.d.view){case"days":this.d._isInRange(new Date(i,e-1,s),"month")||this._disableNav("prev"),this.d._isInRange(new Date(i,e+1,s),"month")||this._disableNav("next");break;case"months":this.d._isInRange(new Date(i-1,e,s),"year")||this._disableNav("prev"),this.d._isInRange(new Date(i+1,e,s),"year")||this._disableNav("next");break;case"years":this.d._isInRange(new Date(i-10,e,s),"year")||this._disableNav("prev"),this.d._isInRange(new Date(i+10,e,s),"year")||this._disableNav("next")}}},_disableNav:function(t){$('[data-action="'+t+'"]',this.d.$nav).addClass("-disabled-")},_activateNav:function(t){$('[data-action="'+t+'"]',this.d.$nav).removeClass("-disabled-")},_onClickNavButton:function(t){var e=$(t.target),i=e.data("action");this.d[i]()},_onClickNavTitle:function(t){return $(t.target).hasClass("-disabled-")?void 0:"days"==this.d.view?this.d.view="months":void(this.d.view="years")}}}(); \ No newline at end of file diff --git a/index-ru.html b/index-ru.html index e9f5ed07..7ac91089 100644 --- a/index-ru.html +++ b/index-ru.html @@ -3,7 +3,80 @@ // Доступ к экземпляру объекта $('#my-element').data('datepicker') -

Примеры

Инициализация с опциями по умолчанию

Пример
<input type='text' class='datepicker-here' />
$('#minMaxExample').datepicker({
+	minDate: new Date() // Можно выбрать тольо даты, идущие за сегодняшним днем
+})
+

Диапозон дат

По умолчанию в плагине нет встроенного механизма выбора диапозона дат для нескольких текстовых полей. +Тем не менее это можно сделть вручную.

Пример
var $start = $('#start'),
+	$end = $('#end');
+
+	$start.datepicker({
+		onSelect: function (fd, date) {
+			$end.data('datepicker')
+				.update('minDate', date)
+		}
+	})
+
+	$end.datepicker({
+		onSelect: function (fd, date) {
+			$start.data('datepicker')
+				.update('maxDate', date)
+		}
+	})
+

Локализация

Вы можете добавить свою локализацию в объектDatepicker.language["my-lang"]и при вызове календаря передать название языка в параметрlanguage

Datepicker.language['my-lang'] = {...}
+
+$('.my-datepicker').datepicker({
+	language: 'my-lang'
+})
+

Также объект локализации можно передавать непосредственно вlanguage

$('.my-datepicker').datepicker({
+	language: {
+		days: [...]
+		...
+	}
+})
+

Если в вашей локализации не будет хватать каких-то полей, то они будут взяты из языка по умолчанию.

Пример объекта локализации

Datepicker.language['ru'] =  {
+	days: ['Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'],
+	daysShort: ['Вос','Пон','Вто','Сре','Чет','Пят','Суб'],
+	daysMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+	months: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+	monthsShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'],
+	today: 'Сегодня',
+	clear: 'Очистить',
+	dateFormat: 'dd.mm.yyyy',
+	firstDay: 1
+};
+

Опции

inline

Тип:boolean

Значение по умполчанию:false

Если true, то календарь будет виден постоянно.

language

Тип:string|object

Значение по умполчанию:"ru"

Язык календаря. Если передается строка, то поиск языка будет осуществляться в объектеDatepicker.languageЕсли передан объект, то данные будут браться из него.

Если в объекте локализации не будет хватать каких то полей, то они будут взяты из языка по умолчанию.

startDate

Тип:Date

Значение по умполчанию:new Date()

Какую дату нужно показывать при инициализации календаря.

firstDay

Тип:number

Значение по умполчанию:""

Индекс дня, с которого начинается неделя. Возможные значение от 0 до 6, где 0 - воскресенье и 6 - суббота. +По умолчанию берется из локализации, если значение передать сюда, то оно будет иметь больший приоритет. +

weekends

Тип:array

Значение по умполчанию:[6, 0]

Массив индексов дней, которые будут считаться выходными днями. Им будет добавлен класс.-weekend-. По умолчанию это суббота и воскресенье.

dateFormat

Тип:string

Значение по умполчанию:""

Формат даты, кобминация из d, m, yyyy, D, M, и т.д. По умолчанию берется из локализации, если передать значение сюда, то оно будет иметь больший приоритет.

  • d- дата
  • dd- дата с лидирующем нулем
  • D- сокращенное наименование дня
  • DD- полное наименование дня
  • m- номер мясяца
  • mm- номер месяца с лидирующем нулем
  • M- сокращенное наименовение месяца
  • MM- полное наименовение месяца
  • yy- сокращенный номер года
  • yyyy- полный номер года
  • yyyy1- первый год декады, в которую входит текущий год
  • yyyy2- последний год декады, в которую входит текущий год

toggleSelected

Тип:boolean

Значение по умполчанию:true

Если true, то клик на выделенной дате снимет выделение.

\ No newline at end of file diff --git a/package.json b/package.json index d697bb31..a2783336 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "gulp-jade": "^1.1.0", "gulp-livereload": "^3.8.0", "gulp-minify-css": "^1.2.1", + "gulp-plumber": "^1.0.1", "gulp-postcss": "^6.0.1", "gulp-rename": "^1.2.2", "gulp-sass": "^2.0.4", diff --git a/page/css/style.css b/page/css/style.css index 19a1f565..bf56c3d9 100644 --- a/page/css/style.css +++ b/page/css/style.css @@ -1 +1 @@ -.-text-center-,.promo-header{text-align:center}a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,canvas,caption,center,cite,code,dd,del,details,dfn,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,header,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,strike,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}body{margin:0}body,html{width:100%;height:100%}*,:after,:before{box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}b,strong{font-weight:700}i{font-style:italic}a{outline:0;color:#47A6EC}textarea{overflow:auto}html{color:#333;font-family:Tahoma,sans-serif;font-size:14px}p{line-height:1.3;margin-bottom:14px}h1,h2,h3{font-family:'Fira Sans',sans-serif;line-height:1}h2{font-weight:100;font-size:32px;margin:48px 0 8px}h3{font-weight:500;font-size:18px;margin:24px 0 8px}.container{width:960px;margin:0 auto;padding:1px 0}.container article{margin:60px 0 30px}input[type=text]{border-radius:4px;outline:0;height:32px;border:1px solid silver;padding:0 8px;margin:0 0 14px;font-family:Tahoma,sans-serif;transition:all .2s}input[type=text]:focus{border-color:gold;box-shadow:0 0 8px rgba(0,0,0,.1)}.example--label{background:#f4f4f4;border-radius:0 0 4px 4px;position:absolute;padding:4px 12px;right:8px;top:0}.hljs{font-family:Consolas,monospace;line-height:1.2;-moz-tab-size:4;tab-size:4}.example{border:1px solid #ddd;border-radius:4px;position:relative;margin:16px 0}.example .example-code{border:none;border-radius:0 0 4px 4px;border-top:1px solid #eee;margin:0}.example-inline{background:red;display:inline-block;vertical-align:middle;margin:0 4px}.example-inline .hljs{padding:4px}.example-content{padding:32px}.example-content h1:first-child,.example-content h2:first-child,.example-content h3:first-child{margin-top:0}.example-content>:last-child{margin-bottom:0!important}a:hover{color:#1373ba}.example-code{border:1px solid #ddd;border-radius:4px;overflow:hidden;margin:16px 0;font-size:13px}.example-code code{padding:16px 32px}.promo-header{font-size:48px;font-weight:100}.promo-header span{display:block;font-size:.5em}.promo-input{height:40px;margin:26px 0;width:300px} \ No newline at end of file +.-text-center-,.promo-header{text-align:center}a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,canvas,caption,center,cite,code,dd,del,details,dfn,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,header,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,strike,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}body{margin:0}body,html{width:100%;height:100%}*,:after,:before{box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}b,strong{font-weight:700}i{font-style:italic}a{outline:0;color:#47A6EC}textarea{overflow:auto}html{color:#333;font-family:Tahoma,sans-serif;font-size:14px}p{line-height:1.3;margin-bottom:14px}h1,h2,h3{font-family:'Fira Sans',sans-serif;line-height:1}h2{font-weight:100;font-size:32px;margin:48px 0 8px}h3{font-weight:500;font-size:18px;margin:24px 0 8px}.container{width:960px;margin:0 auto;padding:1px 0}.container article{margin:60px 0 30px}input[type=text]{border-radius:4px;outline:0;height:32px;border:1px solid silver;padding:0 8px;margin:0 0 14px;color:#444;font-family:Tahoma,sans-serif;transition:all .2s;width:250px}input[type=text]:focus{border-color:gold;box-shadow:0 0 8px rgba(0,0,0,.1)}ul{margin:0 0 16px}ul li{list-style:none;margin-bottom:8px}.example--label{background:#f4f4f4;border-radius:0 0 4px 4px;position:absolute;padding:4px 12px;right:8px;top:0}.hljs{font-family:Consolas,monospace;line-height:1.2;-moz-tab-size:4;tab-size:4}.example{border:1px solid #ddd;border-radius:4px;position:relative;margin:16px 0}.example .example-code{border:none;border-radius:0 0 4px 4px;border-top:1px solid #eee;margin:0}.example-inline{background:red;display:inline-block;vertical-align:middle;margin:0 4px}.example-inline .hljs{padding:0 4px}.example-content{padding:32px}.example-content h1:first-child,.example-content h2:first-child,.example-content h3:first-child{margin-top:0}.example-content>:last-child{margin-bottom:0!important}a:hover{color:#1373ba}.example-code{border:1px solid #ddd;border-radius:4px;overflow:hidden;margin:16px 0;font-size:13px}.param i,.param strong{display:inline-block;margin-right:4px;vertical-align:middle}.example-code code{padding:16px 32px}.param strong{background:#efefef;color:#333;border-radius:4px;font-weight:400;padding:3px 6px 4px}.param i{color:#838383;font-size:.95em;font-style:normal;font-weight:100;font-family:'Fira Sans',sans-serif}.promo-header{font-size:48px;font-weight:100}.promo-header span{display:block;font-size:.5em}.promo-input{height:40px;margin:26px 0;width:300px}.range-example input[type=text]{width:150px}.range-example span{display:inline-block;margin:0 8px}.param-header{margin-bottom:8px}.param-header h3{margin-bottom:2px}.param-header p{margin:0;font-size:13px}.param{margin-bottom:32px}.param-header--label{color:#707070;display:inline-block;vertical-align:middle} \ No newline at end of file diff --git a/page/jade/layout.jade b/page/jade/layout.jade index af996b2d..cea6ae5f 100644 --- a/page/jade/layout.jade +++ b/page/jade/layout.jade @@ -3,6 +3,7 @@ include mixins/example-content include mixins/example-code include mixins/example-inline include mixins/param +include mixins/param-header doctype html html diff --git a/page/jade/mixins/example-inline.jade b/page/jade/mixins/example-inline.jade index b197abe7..6bf5e595 100644 --- a/page/jade/mixins/example-inline.jade +++ b/page/jade/mixins/example-inline.jade @@ -1,4 +1,4 @@ mixin example-inline(content, type) span.example-inline code(class= type). - !{content} \ No newline at end of file + #{content} \ No newline at end of file diff --git a/page/jade/mixins/param-header.jade b/page/jade/mixins/param-header.jade new file mode 100644 index 00000000..3a0c0a05 --- /dev/null +++ b/page/jade/mixins/param-header.jade @@ -0,0 +1,12 @@ +mixin param-header(name, type, defaults) + header.param-header + h3= name + p.param-header--row + span.param-header--label Тип: + +example-inline(type, 'js') + p.param-header--row + span.param-header--label Значение по умполчанию: + if defaults + +example-inline(defaults, 'js') + if block + block diff --git a/page/jade/pages/index-ru.jade b/page/jade/pages/index-ru.jade index c13a0489..13d92932 100644 --- a/page/jade/pages/index-ru.jade +++ b/page/jade/pages/index-ru.jade @@ -14,9 +14,9 @@ block content h2 Использование p - |Календарь автоматически проинициализируется на элементах с классом + | Календарь автоматически проинициализируется на элементах с классом +example-inline('.datepicker-here', 'css') - |, при этом опции можно передать через + | , при этом опции можно передать через +example-inline('data', 'html') | атрибуты. +example-code('html') @@ -38,3 +38,233 @@ block content +example-code('html') :code + + h3 Выбор нескольких дат + p + | Передайте параметр + +example-inline('{multipleDates: true}','js') + | для выбора нескольких дат. Если требуется ограничить количество выбранных дат, то передайте необходимое число + +example-inline('{multipleDates: 3}','js') + | . + +example + +example-content + input(type='text' data-multiple-dates='3' data-multiple-dates-separator=', ').datepicker-here + +example-code('html') + :code + + + h3 Постоянно видимый календарь + p + | Проинициализируйте плагин на элементе, который не является текстовым полем, например на + +example-inline('
', 'html') + | , либо передайте параметр + +example-inline('{inline: true}', 'js') + | . + +example + +example-content + div.datepicker-here + +example-code('html') + :code +
+ + h3 Выбор месяца + +example + +example-content + input.datepicker-here(type='text' data-min-view='months' data-view='months' data-date-format='MM yyyy') + +example-code('html') + :code + + + h3 Минимальная и максимальные даты + p + | Чтобы ограничить выбор даты, используйте + +example-inline('minDate', 'js') + | и + +example-inline('maxDate', 'js') + | , которым нужно передать объект даты. + +example + +example-content + input#minMaxExample(type='text') + script. + $('#minMaxExample').datepicker({ + minDate: new Date() // Можно выбрать тольо даты, идущие за сегодняшним днем + }) + +example-code('js'). + $('#minMaxExample').datepicker({ + minDate: new Date() // Можно выбрать тольо даты, идущие за сегодняшним днем + }) + + h3 Диапозон дат + p. + По умолчанию в плагине нет встроенного механизма выбора диапозона дат для нескольких текстовых полей. + Тем не менее это можно сделть вручную. + +example + +example-content + div.range-example + input(type='text' placeholder='Начало')#start + span – + input(type='text' placeholder='Конец')#end + + script. + var $start = $('#start'), + $end = $('#end'); + + $start.datepicker({ + onSelect: function (fd, date) { + $end.data('datepicker') + .update('minDate', date) + } + }) + + $end.datepicker({ + onSelect: function (fd, date) { + $start.data('datepicker') + .update('maxDate', date) + } + }) + + +example-code('js'). + var $start = $('#start'), + $end = $('#end'); + + $start.datepicker({ + onSelect: function (fd, date) { + $end.data('datepicker') + .update('minDate', date) + } + }) + + $end.datepicker({ + onSelect: function (fd, date) { + $start.data('datepicker') + .update('maxDate', date) + } + }) + + article + h2 Локализация + p + | Вы можете добавить свою локализацию в объект + +example-inline('Datepicker.language["my-lang"]', 'js') + | и при вызове календаря передать название языка в параметр + +example-inline('language', 'js') + + +example-code('js'). + Datepicker.language['my-lang'] = {...} + + $('.my-datepicker').datepicker({ + language: 'my-lang' + }) + + p + | Также объект локализации можно передавать непосредственно в + +example-inline('language', 'js') + + +example-code('js'). + $('.my-datepicker').datepicker({ + language: { + days: [...] + ... + } + }) + + p Если в вашей локализации не будет хватать каких-то полей, то они будут взяты из языка по умолчанию. + + h3 Пример объекта локализации + +example-code('js'). + Datepicker.language['ru'] = { + days: ['Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'], + daysShort: ['Вос','Пон','Вто','Сре','Чет','Пят','Суб'], + daysMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + months: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthsShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'], + today: 'Сегодня', + clear: 'Очистить', + dateFormat: 'dd.mm.yyyy', + firstDay: 1 + }; + + article + h2 Опции + + .param + +param-header('inline', 'boolean', 'false') + p Если true, то календарь будет виден постоянно. + + .param + +param-header('language', 'string|object', '"ru"') + p + | Язык календаря. Если передается строка, то поиск языка будет осуществляться в объекте + +example-inline('Datepicker.language', 'js') + | Если передан объект, то данные будут браться из него. + p Если в объекте локализации не будет хватать каких то полей, то они будут взяты из языка по умолчанию. + + .param + +param-header('startDate', 'Date', 'new Date()') + p Какую дату нужно показывать при инициализации календаря. + + .param + +param-header('firstDay', 'number', '""') + p. + Индекс дня, с которого начинается неделя. Возможные значение от 0 до 6, где 0 - воскресенье и 6 - суббота. + По умолчанию берется из локализации, если значение передать сюда, то оно будет иметь больший приоритет. + + .param + +param-header('weekends', 'array', '[6, 0]') + p + |Массив индексов дней, которые будут считаться выходными днями. Им будет добавлен класс + +example-inline('.-weekend-','css') + |. По умолчанию это суббота и воскресенье. + + .param + +param-header('dateFormat', 'string', '""') + p Формат даты, кобминация из d, m, yyyy, D, M, и т.д. По умолчанию берется из локализации, если передать значение сюда, то оно будет иметь больший приоритет. + ul + li + +param('d') + | - дата + li + +param('dd') + | - дата с лидирующем нулем + li + +param('D') + | - сокращенное наименование дня + li + +param('DD') + | - полное наименование дня + li + +param('m') + | - номер мясяца + li + +param('mm') + | - номер месяца с лидирующем нулем + li + +param('M') + | - сокращенное наименовение месяца + li + +param('MM') + | - полное наименовение месяца + li + +param('yy') + | - сокращенный номер года + li + +param('yyyy') + | - полный номер года + li + +param('yyyy1') + | - первый год декады, в которую входит текущий год + li + +param('yyyy2') + | - последний год декады, в которую входит текущий год + + .param + +param-header('toggleSelected', 'boolean', 'true') + p Если true, то клик на выделенной дате снимет выделение. + diff --git a/page/sass/_page.scss b/page/sass/_page.scss index 280061a3..3cf11e47 100644 --- a/page/sass/_page.scss +++ b/page/sass/_page.scss @@ -54,8 +54,10 @@ input[type='text'] { border: 1px solid #c0c0c0; padding: 0 8px; margin: 0 0 14px; + color: #444; font-family: $fontFamily; transition: all .2s; + width: 250px; &:focus { border-color: gold; @@ -63,6 +65,14 @@ input[type='text'] { } } +ul { + margin: 0 0 16px; + li { + list-style: none; + margin-bottom: 8px; + } +} + /* Example ------------------------------------------------- */ @@ -104,7 +114,7 @@ $exampleBorderRadius: 4px; margin: 0 4px; .hljs { - padding: 4px; + padding: 0 4px; } } @@ -146,6 +156,34 @@ a { } } +// Param +// ------------------------------------------------- + + +.param { + strong { + background: #efefef; + color: #333; + border-radius: $exampleBorderRadius; + font-weight: normal; + display: inline-block; + vertical-align: middle; + padding: 3px 6px 4px; + margin-right: 4px; + } + + i { + color: #838383; + font-size: .95em; + font-style: normal; + font-weight: 100; + font-family: 'Fira Sans', sans-serif; + display: inline-block; + vertical-align: middle; + margin-right: 4px; + } +} + // Promo block // ------------------------------------------------- @@ -165,3 +203,45 @@ a { margin: 26px 0; width: 300px; } + +// Range example +// ------------------------------------------------- + +.range-example { + input[type='text'] { + width: 150px; + } + span { + display: inline-block; + margin: 0 8px; + } +} + +// Param header +// ------------------------------------------------- + +.param-header { + margin-bottom: 8px; + h3 { + margin-bottom: 2px; + } + + p { + margin: 0; + font-size: 13px; + } +} + +.param-header--row { + +} + +.param { + margin-bottom: 32px; +} + +.param-header--label { + color: #707070; + display: inline-block; + vertical-align: middle; +} diff --git a/src/js/datepicker.js b/src/js/datepicker.js index 39d11cf4..f26e0ea5 100644 --- a/src/js/datepicker.js +++ b/src/js/datepicker.js @@ -145,10 +145,12 @@ var Datepicker; this.loc = Datepicker.language[lang]; if (!this.loc) { console.warn('Can\'t find language "' + lang + '" in Datepicker.language, will use "ru" instead'); - this.loc = Datepicker.language.ru + this.loc = $.extend(true, {}, Datepicker.language.ru) } + + this.loc = $.extend(true, {}, Datepicker.language[lang], Datepicker.language.ru) } else { - this.loc = $.extend({}, Datepicker.language.ru, lang) + this.loc = $.extend(true, {}, Datepicker.language.ru, lang) } if (this.opts.dateFormat) { @@ -418,7 +420,7 @@ var Datepicker; return _this.formatDate(format, date) }); - value.join(this.opts.multipleDatesSeparator); + value = value.join(this.opts.multipleDatesSeparator); this.$el.val(value) }, diff --git a/tasks/jade.js b/tasks/jade.js index 7013d479..5184761d 100644 --- a/tasks/jade.js +++ b/tasks/jade.js @@ -1,9 +1,11 @@ var gulp = require('gulp'), + plumber = require('gulp-plumber'), _jade = require('gulp-jade/node_modules/jade'), jade = require('gulp-jade'); _jade.filters.code = function( block ) { return block + .replace( /\…/g, '…' ) .replace( /&/g, '&' ) .replace( //g, '>' ) @@ -14,6 +16,7 @@ _jade.filters.code = function( block ) { module.exports = function () { gulp.src('page/jade/pages/*.jade') + .pipe(plumber()) .pipe(jade()) .pipe(gulp.dest('./')) };