From 1de27807a3445798b30d119013c554b5b6fa513a Mon Sep 17 00:00:00 2001 From: Jeff Huijsmans Date: Mon, 14 Dec 2015 11:47:14 +0100 Subject: [PATCH 1/4] Expose current internal date --- dist/angular-pickadate.js | 3 ++- dist/angular-pickadate.min.js | 2 +- src/angular-pickadate.js | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dist/angular-pickadate.js b/dist/angular-pickadate.js index bff80cc..e4cd45d 100755 --- a/dist/angular-pickadate.js +++ b/dist/angular-pickadate.js @@ -250,7 +250,8 @@ minDate: '=', maxDate: '=', disabledDates: '=', - weekStartsOn: '=' + weekStartsOn: '=', + currentDate: '=' }, link: function(scope, element, attrs, ngModel) { diff --git a/dist/angular-pickadate.min.js b/dist/angular-pickadate.min.js index 6fcdd12..333f69b 100755 --- a/dist/angular-pickadate.min.js +++ b/dist/angular-pickadate.min.js @@ -1 +1 @@ -!function(e){"use strict";function t(t,a){var n=[];return e.forEach(t,function(t){n.push(e.isFunction(a)?a(t):t[a])}),n}var a=[].indexOf||function(e){for(var t=0,a=this.length;a>t;t++)if(t in this&&this[t]===e)return t;return-1};e.module("pickadate",[]).provider("pickadateI18n",function(){var e={prev:"prev",next:"next"};this.translations={},this.$get=function(){var t=this.translations;return{t:function(a){return t[a]||e[a]}}}}).factory("pickadateModalBindings",["$window","$document",function(e,t){var n=void 0!==e.pageXOffset,i="CSS1Compat"===(t.compatMode||""),r=function(a){var r=n?e.pageXOffset:i?t.documentElement.scrollLeft:t.body.scrollLeft,o=n?e.pageYOffset:i?t.documentElement.scrollTop:t.body.scrollTop,s=e.innerWidth||t.documentElement.clientWidth||t.body.clientWidth,c={top:o+a.getBoundingClientRect().bottom+"px"};return s-a.getBoundingClientRect().left>=300?c.left=r+a.getBoundingClientRect().left+"px":c.right=s-a.getBoundingClientRect().right-r+"px",c},o=function(e,t){for(var a=t.parentNode;null!==a;){if(a===e)return!0;a=a.parentNode}return!1};return function(e,n,i){var s=function(t){e.displayPicker=t,e.$apply()};n.on("focus",function(){e.modalStyles=r(n[0]),s(!0)}),n.on("keydown",function(e){a.call([9,13,27],e.keyCode)>=0&&s(!1)}),t.on("click",function(e){o(i,e.target)||e.target===n[0]||s(!1)})}}]).factory("pickadateDateHelper",["$locale","dateFilter",function(t,n){function i(e){switch(e){case"dd":return"day";case"MM":return"month";case"yyyy":return"year"}}return function(r,o){var s,c,l,d,u,f;return o=o||{},r=r||"yyyy-MM-dd",u=o.weekStartsOn,f=o.noExtraRows,(!e.isNumber(u)||0>u||u>6)&&(u=0),{parseDate:function(t){if(t){if(e.isDate(t))return new Date(t);var a="(dd|MM|yyyy)",n=r.match(/[-|/]/)[0],o=t.split(n),s=new RegExp([a,a,a].join(n)),c=r.match(s),l={};if(c.shift(),e.forEach(c,function(e,t){l[i(e)]=parseInt(o[t],10)}),!(isNaN(l.year)||isNaN(l.month)||isNaN(l.day)))return new Date(l.year,l.month-1,l.day,3)}},setRestrictions:function(e){s=this.parseDate(e.minDate)||new Date(0),c=this.parseDate(e.maxDate)||new Date(99999999999999),d=e.currentDate,l=e.disabledDates||[]},allowPrevMonth:function(){return d>s},allowNextMonth:function(){var t=e.copy(d);return t.setMonth(t.getMonth()+1),c>=t},buildDateObject:function(t){var i=e.copy(t),u=n(i,r),f=a.call(l,u)>=0,p=this.getMonthOffset(i,d),h=s>i,v=i>c,y=-1===p&&!o.previousMonthSelectable||1===p&&!o.nextMonthSelectable;return{date:i,formattedDate:u,today:u===n(new Date,r),disabled:f,outOfMinRange:h,outOfMaxRange:v,monthOffset:p,enabled:!(f||h||v||y)}},buildDates:function(t,a,n){var i=[],r=new Date(t,a,1,3),o=new Date(t,a+1,0,3);for(n=n||{},d=e.copy(r);r.getDay()!==u;)r.setDate(r.getDate()-1);for(var s=0;42>s&&!(f&&r.getDay()===u&&r>o);s++)i.push(this.buildDateObject(r)),r.setDate(r.getDate()+1);return i},buildDayNames:function(){var e=t.DATETIME_FORMATS.SHORTDAY;if(u){e=e.slice(0);for(var a=0;u>a;a++)e.push(e.shift())}return e},getMonthOffset:function(e,t){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}}}}]).directive("pickadate",["$locale","$sce","$compile","$document","$window","pickadateDateHelper","pickadateI18n","pickadateModalBindings","filterFilter",function(n,i,r,o,s,c,l,d,u){var f='
  • {{dayName}}
  • {{dateObj.date | date:"d"}}
';return{require:"ngModel",scope:{defaultDate:"=",minDate:"=",maxDate:"=",disabledDates:"=",weekStartsOn:"="},link:function(n,i,o,s){function l(){var e=M.buildDates(n.currentDate.getFullYear(),n.currentDate.getMonth());n.allowPrevMonth=M.allowPrevMonth(),n.allowNextMonth=M.allowNextMonth(),n.dayNames=M.buildDayNames(),n.dates=t(e,function(e){return e.classNames=[e.enabled?"pickadate-enabled":"pickadate-disabled"],e.today&&e.classNames.push("pickadate-today"),e.disabled&&e.classNames.push("pickadate-unavailable"),e})}function p(e,a){a=a||{},s.$setViewValue(v?t(e,"formattedDate"):e[0]&&e[0].formattedDate),a.skipRenderInput||i.val(s.$viewValue)}function h(e,t){var n=a.call(t,e);return-1===n?t.push(e):t.splice(n,1),t}var v=o.hasOwnProperty("multiple"),y=[],D=i[0]instanceof HTMLInputElement,g=r(f)(n),m=(o.format||"yyyy-MM-dd").replace(/m/g,"M"),M=c(m,{previousMonthSelectable:/^(previous|both)$/.test(o.selectOtherMonths),nextMonthSelectable:/^(next|both)$/.test(o.selectOtherMonths),weekStartsOn:n.weekStartsOn,noExtraRows:o.hasOwnProperty("noExtraRows")});n.displayPicker=!D,n.setDate=function(e){e.enabled&&(y=v?h(e,y):[e],p(y),n.changeMonth(e.monthOffset),n.displayPicker=!D)};var w=s.$render=function(a){e.isArray(s.$viewValue)?y=s.$viewValue:s.$viewValue&&(y=[s.$viewValue]),n.currentDate=M.parseDate(n.defaultDate||y[0])||new Date,M.setRestrictions(n),y=t(y,function(e){return M.buildDateObject(M.parseDate(e))}),y=u(y,{enabled:!0}),p(y,a),l()};n.classesFor=function(e){var n=t(y,"formattedDate"),i=a.call(n,e.formattedDate)>=0?"pickadate-active":null;return e.classNames.concat(i)},n.changeMonth=function(e){e&&(n.currentDate.setDate(1),n.currentDate.setMonth(n.currentDate.getMonth()+e),l())},n.$watch(function(){return e.toJson([n.minDate,n.maxDate,n.disabledDates])},w),D?(d(n,i,g[0]),n.$watch(function(){return s.$viewValue},function(e){var t=M.parseDate(e);t&&w({skipRenderInput:!0}),s.$setValidity("date",!!t)}),n.$$postDigest(function(){o.value&&(s.$viewValue=o.value,w())}),i.after(g.addClass("pickadate-modal"))):i.append(g)}}}])}(window.angular); \ No newline at end of file +!function(e){"use strict";function t(t,a){var n=[];return e.forEach(t,function(t){n.push(e.isFunction(a)?a(t):t[a])}),n}var a=[].indexOf||function(e){for(var t=0,a=this.length;a>t;t++)if(t in this&&this[t]===e)return t;return-1};e.module("pickadate",[]).provider("pickadateI18n",function(){var e={prev:"prev",next:"next"};this.translations={},this.$get=function(){var t=this.translations;return{t:function(a){return t[a]||e[a]}}}}).factory("pickadateModalBindings",["$window","$document",function(e,t){var n=void 0!==e.pageXOffset,i="CSS1Compat"===(t.compatMode||""),r=function(a){var r=n?e.pageXOffset:i?t.documentElement.scrollLeft:t.body.scrollLeft,o=n?e.pageYOffset:i?t.documentElement.scrollTop:t.body.scrollTop,s=e.innerWidth||t.documentElement.clientWidth||t.body.clientWidth,c={top:o+a.getBoundingClientRect().bottom+"px"};return s-a.getBoundingClientRect().left>=300?c.left=r+a.getBoundingClientRect().left+"px":c.right=s-a.getBoundingClientRect().right-r+"px",c},o=function(e,t){for(var a=t.parentNode;null!==a;){if(a===e)return!0;a=a.parentNode}return!1};return function(e,n,i){var s=function(t){e.displayPicker=t,e.$apply()};n.on("focus",function(){e.modalStyles=r(n[0]),s(!0)}),n.on("keydown",function(e){a.call([9,13,27],e.keyCode)>=0&&s(!1)}),t.on("click",function(e){o(i,e.target)||e.target===n[0]||s(!1)})}}]).factory("pickadateDateHelper",["$locale","dateFilter",function(t,n){function i(e){switch(e){case"dd":return"day";case"MM":return"month";case"yyyy":return"year"}}return function(r,o){var s,c,l,d,u,f;return o=o||{},r=r||"yyyy-MM-dd",u=o.weekStartsOn,f=o.noExtraRows,(!e.isNumber(u)||0>u||u>6)&&(u=0),{parseDate:function(t){if(t){if(e.isDate(t))return new Date(t);var a="(dd|MM|yyyy)",n=r.match(/[-|\/]/)[0],o=t.split(n),s=new RegExp([a,a,a].join(n)),c=r.match(s),l={};if(c.shift(),e.forEach(c,function(e,t){l[i(e)]=parseInt(o[t],10)}),!(isNaN(l.year)||isNaN(l.month)||isNaN(l.day)))return new Date(l.year,l.month-1,l.day,3)}},setRestrictions:function(e){s=this.parseDate(e.minDate)||new Date(0),c=this.parseDate(e.maxDate)||new Date(99999999999999),d=e.currentDate,l=e.disabledDates||[]},allowPrevMonth:function(){return d>s},allowNextMonth:function(){var t=e.copy(d);return t.setMonth(t.getMonth()+1),c>=t},buildDateObject:function(t){var i=e.copy(t),u=n(i,r),f=a.call(l,u)>=0,p=this.getMonthOffset(i,d),h=s>i,D=i>c,v=-1===p&&!o.previousMonthSelectable||1===p&&!o.nextMonthSelectable;return{date:i,formattedDate:u,today:u===n(new Date,r),disabled:f,outOfMinRange:h,outOfMaxRange:D,monthOffset:p,enabled:!(f||h||D||v)}},buildDates:function(t,a,n){var i=[],r=new Date(t,a,1,3),o=new Date(t,a+1,0,3);for(n=n||{},d=e.copy(r);r.getDay()!==u;)r.setDate(r.getDate()-1);for(var s=0;42>s&&!(f&&r.getDay()===u&&r>o);s++)i.push(this.buildDateObject(r)),r.setDate(r.getDate()+1);return i},buildDayNames:function(){var e=t.DATETIME_FORMATS.SHORTDAY;if(u){e=e.slice(0);for(var a=0;u>a;a++)e.push(e.shift())}return e},getMonthOffset:function(e,t){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}}}}]).directive("pickadate",["$locale","$sce","$compile","$document","$window","pickadateDateHelper","pickadateI18n","pickadateModalBindings","filterFilter",function(n,i,r,o,s,c,l,d,u){var f='
  • {{dayName}}
  • {{dateObj.date | date:"d"}}
';return{require:"ngModel",scope:{defaultDate:"=",minDate:"=",maxDate:"=",disabledDates:"=",weekStartsOn:"=",currentDate:"="},link:function(n,i,o,s){function l(){var e=M.buildDates(n.currentDate.getFullYear(),n.currentDate.getMonth());n.allowPrevMonth=M.allowPrevMonth(),n.allowNextMonth=M.allowNextMonth(),n.dayNames=M.buildDayNames(),n.dates=t(e,function(e){return e.classNames=[e.enabled?"pickadate-enabled":"pickadate-disabled"],e.today&&e.classNames.push("pickadate-today"),e.disabled&&e.classNames.push("pickadate-unavailable"),e})}function p(e,a){a=a||{},D?s.$setViewValue(t(e,"formattedDate")):s.$setViewValue(e[0]&&e[0].formattedDate),a.skipRenderInput||i.val(s.$viewValue)}function h(e,t){var n=a.call(t,e);return-1===n?t.push(e):t.splice(n,1),t}var D=o.hasOwnProperty("multiple"),v=[],y=i[0]instanceof HTMLInputElement,g=r(f)(n),m=(o.format||"yyyy-MM-dd").replace(/m/g,"M"),M=c(m,{previousMonthSelectable:/^(previous|both)$/.test(o.selectOtherMonths),nextMonthSelectable:/^(next|both)$/.test(o.selectOtherMonths),weekStartsOn:n.weekStartsOn,noExtraRows:o.hasOwnProperty("noExtraRows")});n.displayPicker=!y,n.setDate=function(e){e.enabled&&(v=D?h(e,v):[e],p(v),n.changeMonth(e.monthOffset),n.displayPicker=!y)};var w=s.$render=function(a){e.isArray(s.$viewValue)?v=s.$viewValue:s.$viewValue&&(v=[s.$viewValue]),n.currentDate=M.parseDate(n.defaultDate||v[0])||new Date,M.setRestrictions(n),v=t(v,function(e){return M.buildDateObject(M.parseDate(e))}),v=u(v,{enabled:!0}),p(v,a),l()};n.classesFor=function(e){var n=t(v,"formattedDate"),i=a.call(n,e.formattedDate)>=0?"pickadate-active":null;return e.classNames.concat(i)},n.changeMonth=function(e){e&&(n.currentDate.setDate(1),n.currentDate.setMonth(n.currentDate.getMonth()+e),l())},n.$watch(function(){return e.toJson([n.minDate,n.maxDate,n.disabledDates])},w),y?(d(n,i,g[0]),n.$watch(function(){return s.$viewValue},function(e){var t=M.parseDate(e);t&&w({skipRenderInput:!0}),s.$setValidity("date",!!t)}),n.$$postDigest(function(){o.value&&(s.$viewValue=o.value,w())}),i.after(g.addClass("pickadate-modal"))):i.append(g)}}}])}(window.angular); \ No newline at end of file diff --git a/src/angular-pickadate.js b/src/angular-pickadate.js index bff80cc..e4cd45d 100755 --- a/src/angular-pickadate.js +++ b/src/angular-pickadate.js @@ -250,7 +250,8 @@ minDate: '=', maxDate: '=', disabledDates: '=', - weekStartsOn: '=' + weekStartsOn: '=', + currentDate: '=' }, link: function(scope, element, attrs, ngModel) { From cf55d5e3e68db7360d3c405043e72b03b461a7d2 Mon Sep 17 00:00:00 2001 From: Jeff Huijsmans Date: Mon, 14 Dec 2015 12:33:07 +0100 Subject: [PATCH 2/4] Add support for events in calendar view --- dist/angular-pickadate.css | 3 +++ dist/angular-pickadate.js | 13 +++++++++++-- dist/angular-pickadate.min.js | 2 +- src/angular-pickadate.js | 13 +++++++++++-- src/angular-pickadate.scss | 4 ++++ 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/dist/angular-pickadate.css b/dist/angular-pickadate.css index f54b8b9..b458aef 100644 --- a/dist/angular-pickadate.css +++ b/dist/angular-pickadate.css @@ -47,6 +47,9 @@ .pickadate-cell .pickadate-active { background-color: #b52a00; color: white; } + .pickadate-cell .pickadate-event-on-date { + background-color: rgba(0, 0, 0, 0.3); + color: red; } .pickadate-cell .pickadate-head { border-top: 1px solid #DCDCDC; background: #f3f3f3; } diff --git a/dist/angular-pickadate.js b/dist/angular-pickadate.js index e4cd45d..e1e0a20 100755 --- a/dist/angular-pickadate.js +++ b/dist/angular-pickadate.js @@ -251,7 +251,8 @@ maxDate: '=', disabledDates: '=', weekStartsOn: '=', - currentDate: '=' + currentDate: '=', + datesWithEvents: '=' }, link: function(scope, element, attrs, ngModel) { @@ -303,7 +304,13 @@ scope.classesFor = function(date) { var formattedDates = map(selectedDates, 'formattedDate'), classes = indexOf.call(formattedDates, date.formattedDate) >= 0 ? 'pickadate-active' : null; - return date.classNames.concat(classes); + + var eventOnDay = null; + if(typeof scope.datesWithEvents != 'undefined') { + eventOnDay = indexOf.call(scope.datesWithEvents, date.formattedDate) >= 0 ? 'pickadate-event-on-date' : null; + } + + return date.classNames.concat(classes).concat(eventOnDay); }; scope.changeMonth = function(offset) { @@ -361,6 +368,8 @@ return date; }); + + console.dir(scope.dates); } function setViewValue(value, options) { diff --git a/dist/angular-pickadate.min.js b/dist/angular-pickadate.min.js index 333f69b..c076ea4 100755 --- a/dist/angular-pickadate.min.js +++ b/dist/angular-pickadate.min.js @@ -1 +1 @@ -!function(e){"use strict";function t(t,a){var n=[];return e.forEach(t,function(t){n.push(e.isFunction(a)?a(t):t[a])}),n}var a=[].indexOf||function(e){for(var t=0,a=this.length;a>t;t++)if(t in this&&this[t]===e)return t;return-1};e.module("pickadate",[]).provider("pickadateI18n",function(){var e={prev:"prev",next:"next"};this.translations={},this.$get=function(){var t=this.translations;return{t:function(a){return t[a]||e[a]}}}}).factory("pickadateModalBindings",["$window","$document",function(e,t){var n=void 0!==e.pageXOffset,i="CSS1Compat"===(t.compatMode||""),r=function(a){var r=n?e.pageXOffset:i?t.documentElement.scrollLeft:t.body.scrollLeft,o=n?e.pageYOffset:i?t.documentElement.scrollTop:t.body.scrollTop,s=e.innerWidth||t.documentElement.clientWidth||t.body.clientWidth,c={top:o+a.getBoundingClientRect().bottom+"px"};return s-a.getBoundingClientRect().left>=300?c.left=r+a.getBoundingClientRect().left+"px":c.right=s-a.getBoundingClientRect().right-r+"px",c},o=function(e,t){for(var a=t.parentNode;null!==a;){if(a===e)return!0;a=a.parentNode}return!1};return function(e,n,i){var s=function(t){e.displayPicker=t,e.$apply()};n.on("focus",function(){e.modalStyles=r(n[0]),s(!0)}),n.on("keydown",function(e){a.call([9,13,27],e.keyCode)>=0&&s(!1)}),t.on("click",function(e){o(i,e.target)||e.target===n[0]||s(!1)})}}]).factory("pickadateDateHelper",["$locale","dateFilter",function(t,n){function i(e){switch(e){case"dd":return"day";case"MM":return"month";case"yyyy":return"year"}}return function(r,o){var s,c,l,d,u,f;return o=o||{},r=r||"yyyy-MM-dd",u=o.weekStartsOn,f=o.noExtraRows,(!e.isNumber(u)||0>u||u>6)&&(u=0),{parseDate:function(t){if(t){if(e.isDate(t))return new Date(t);var a="(dd|MM|yyyy)",n=r.match(/[-|\/]/)[0],o=t.split(n),s=new RegExp([a,a,a].join(n)),c=r.match(s),l={};if(c.shift(),e.forEach(c,function(e,t){l[i(e)]=parseInt(o[t],10)}),!(isNaN(l.year)||isNaN(l.month)||isNaN(l.day)))return new Date(l.year,l.month-1,l.day,3)}},setRestrictions:function(e){s=this.parseDate(e.minDate)||new Date(0),c=this.parseDate(e.maxDate)||new Date(99999999999999),d=e.currentDate,l=e.disabledDates||[]},allowPrevMonth:function(){return d>s},allowNextMonth:function(){var t=e.copy(d);return t.setMonth(t.getMonth()+1),c>=t},buildDateObject:function(t){var i=e.copy(t),u=n(i,r),f=a.call(l,u)>=0,p=this.getMonthOffset(i,d),h=s>i,D=i>c,v=-1===p&&!o.previousMonthSelectable||1===p&&!o.nextMonthSelectable;return{date:i,formattedDate:u,today:u===n(new Date,r),disabled:f,outOfMinRange:h,outOfMaxRange:D,monthOffset:p,enabled:!(f||h||D||v)}},buildDates:function(t,a,n){var i=[],r=new Date(t,a,1,3),o=new Date(t,a+1,0,3);for(n=n||{},d=e.copy(r);r.getDay()!==u;)r.setDate(r.getDate()-1);for(var s=0;42>s&&!(f&&r.getDay()===u&&r>o);s++)i.push(this.buildDateObject(r)),r.setDate(r.getDate()+1);return i},buildDayNames:function(){var e=t.DATETIME_FORMATS.SHORTDAY;if(u){e=e.slice(0);for(var a=0;u>a;a++)e.push(e.shift())}return e},getMonthOffset:function(e,t){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}}}}]).directive("pickadate",["$locale","$sce","$compile","$document","$window","pickadateDateHelper","pickadateI18n","pickadateModalBindings","filterFilter",function(n,i,r,o,s,c,l,d,u){var f='
  • {{dayName}}
  • {{dateObj.date | date:"d"}}
';return{require:"ngModel",scope:{defaultDate:"=",minDate:"=",maxDate:"=",disabledDates:"=",weekStartsOn:"=",currentDate:"="},link:function(n,i,o,s){function l(){var e=M.buildDates(n.currentDate.getFullYear(),n.currentDate.getMonth());n.allowPrevMonth=M.allowPrevMonth(),n.allowNextMonth=M.allowNextMonth(),n.dayNames=M.buildDayNames(),n.dates=t(e,function(e){return e.classNames=[e.enabled?"pickadate-enabled":"pickadate-disabled"],e.today&&e.classNames.push("pickadate-today"),e.disabled&&e.classNames.push("pickadate-unavailable"),e})}function p(e,a){a=a||{},D?s.$setViewValue(t(e,"formattedDate")):s.$setViewValue(e[0]&&e[0].formattedDate),a.skipRenderInput||i.val(s.$viewValue)}function h(e,t){var n=a.call(t,e);return-1===n?t.push(e):t.splice(n,1),t}var D=o.hasOwnProperty("multiple"),v=[],y=i[0]instanceof HTMLInputElement,g=r(f)(n),m=(o.format||"yyyy-MM-dd").replace(/m/g,"M"),M=c(m,{previousMonthSelectable:/^(previous|both)$/.test(o.selectOtherMonths),nextMonthSelectable:/^(next|both)$/.test(o.selectOtherMonths),weekStartsOn:n.weekStartsOn,noExtraRows:o.hasOwnProperty("noExtraRows")});n.displayPicker=!y,n.setDate=function(e){e.enabled&&(v=D?h(e,v):[e],p(v),n.changeMonth(e.monthOffset),n.displayPicker=!y)};var w=s.$render=function(a){e.isArray(s.$viewValue)?v=s.$viewValue:s.$viewValue&&(v=[s.$viewValue]),n.currentDate=M.parseDate(n.defaultDate||v[0])||new Date,M.setRestrictions(n),v=t(v,function(e){return M.buildDateObject(M.parseDate(e))}),v=u(v,{enabled:!0}),p(v,a),l()};n.classesFor=function(e){var n=t(v,"formattedDate"),i=a.call(n,e.formattedDate)>=0?"pickadate-active":null;return e.classNames.concat(i)},n.changeMonth=function(e){e&&(n.currentDate.setDate(1),n.currentDate.setMonth(n.currentDate.getMonth()+e),l())},n.$watch(function(){return e.toJson([n.minDate,n.maxDate,n.disabledDates])},w),y?(d(n,i,g[0]),n.$watch(function(){return s.$viewValue},function(e){var t=M.parseDate(e);t&&w({skipRenderInput:!0}),s.$setValidity("date",!!t)}),n.$$postDigest(function(){o.value&&(s.$viewValue=o.value,w())}),i.after(g.addClass("pickadate-modal"))):i.append(g)}}}])}(window.angular); \ No newline at end of file +!function(e){"use strict";function t(t,a){var n=[];return e.forEach(t,function(t){n.push(e.isFunction(a)?a(t):t[a])}),n}var a=[].indexOf||function(e){for(var t=0,a=this.length;a>t;t++)if(t in this&&this[t]===e)return t;return-1};e.module("pickadate",[]).provider("pickadateI18n",function(){var e={prev:"prev",next:"next"};this.translations={},this.$get=function(){var t=this.translations;return{t:function(a){return t[a]||e[a]}}}}).factory("pickadateModalBindings",["$window","$document",function(e,t){var n=void 0!==e.pageXOffset,i="CSS1Compat"===(t.compatMode||""),r=function(a){var r=n?e.pageXOffset:i?t.documentElement.scrollLeft:t.body.scrollLeft,o=n?e.pageYOffset:i?t.documentElement.scrollTop:t.body.scrollTop,s=e.innerWidth||t.documentElement.clientWidth||t.body.clientWidth,c={top:o+a.getBoundingClientRect().bottom+"px"};return s-a.getBoundingClientRect().left>=300?c.left=r+a.getBoundingClientRect().left+"px":c.right=s-a.getBoundingClientRect().right-r+"px",c},o=function(e,t){for(var a=t.parentNode;null!==a;){if(a===e)return!0;a=a.parentNode}return!1};return function(e,n,i){var s=function(t){e.displayPicker=t,e.$apply()};n.on("focus",function(){e.modalStyles=r(n[0]),s(!0)}),n.on("keydown",function(e){a.call([9,13,27],e.keyCode)>=0&&s(!1)}),t.on("click",function(e){o(i,e.target)||e.target===n[0]||s(!1)})}}]).factory("pickadateDateHelper",["$locale","dateFilter",function(t,n){function i(e){switch(e){case"dd":return"day";case"MM":return"month";case"yyyy":return"year"}}return function(r,o){var s,c,l,d,u,f;return o=o||{},r=r||"yyyy-MM-dd",u=o.weekStartsOn,f=o.noExtraRows,(!e.isNumber(u)||0>u||u>6)&&(u=0),{parseDate:function(t){if(t){if(e.isDate(t))return new Date(t);var a="(dd|MM|yyyy)",n=r.match(/[-|\/]/)[0],o=t.split(n),s=new RegExp([a,a,a].join(n)),c=r.match(s),l={};if(c.shift(),e.forEach(c,function(e,t){l[i(e)]=parseInt(o[t],10)}),!(isNaN(l.year)||isNaN(l.month)||isNaN(l.day)))return new Date(l.year,l.month-1,l.day,3)}},setRestrictions:function(e){s=this.parseDate(e.minDate)||new Date(0),c=this.parseDate(e.maxDate)||new Date(99999999999999),d=e.currentDate,l=e.disabledDates||[]},allowPrevMonth:function(){return d>s},allowNextMonth:function(){var t=e.copy(d);return t.setMonth(t.getMonth()+1),c>=t},buildDateObject:function(t){var i=e.copy(t),u=n(i,r),f=a.call(l,u)>=0,p=this.getMonthOffset(i,d),h=s>i,v=i>c,D=-1===p&&!o.previousMonthSelectable||1===p&&!o.nextMonthSelectable;return{date:i,formattedDate:u,today:u===n(new Date,r),disabled:f,outOfMinRange:h,outOfMaxRange:v,monthOffset:p,enabled:!(f||h||v||D)}},buildDates:function(t,a,n){var i=[],r=new Date(t,a,1,3),o=new Date(t,a+1,0,3);for(n=n||{},d=e.copy(r);r.getDay()!==u;)r.setDate(r.getDate()-1);for(var s=0;42>s&&!(f&&r.getDay()===u&&r>o);s++)i.push(this.buildDateObject(r)),r.setDate(r.getDate()+1);return i},buildDayNames:function(){var e=t.DATETIME_FORMATS.SHORTDAY;if(u){e=e.slice(0);for(var a=0;u>a;a++)e.push(e.shift())}return e},getMonthOffset:function(e,t){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}}}}]).directive("pickadate",["$locale","$sce","$compile","$document","$window","pickadateDateHelper","pickadateI18n","pickadateModalBindings","filterFilter",function(n,i,r,o,s,c,l,d,u){var f='
  • {{dayName}}
  • {{dateObj.date | date:"d"}}
';return{require:"ngModel",scope:{defaultDate:"=",minDate:"=",maxDate:"=",disabledDates:"=",weekStartsOn:"=",currentDate:"=",datesWithEvents:"="},link:function(n,i,o,s){function l(){var e=M.buildDates(n.currentDate.getFullYear(),n.currentDate.getMonth());n.allowPrevMonth=M.allowPrevMonth(),n.allowNextMonth=M.allowNextMonth(),n.dayNames=M.buildDayNames(),n.dates=t(e,function(e){return e.classNames=[e.enabled?"pickadate-enabled":"pickadate-disabled"],e.today&&e.classNames.push("pickadate-today"),e.disabled&&e.classNames.push("pickadate-unavailable"),e}),console.dir(n.dates)}function p(e,a){a=a||{},v?s.$setViewValue(t(e,"formattedDate")):s.$setViewValue(e[0]&&e[0].formattedDate),a.skipRenderInput||i.val(s.$viewValue)}function h(e,t){var n=a.call(t,e);return-1===n?t.push(e):t.splice(n,1),t}var v=o.hasOwnProperty("multiple"),D=[],y=i[0]instanceof HTMLInputElement,g=r(f)(n),m=(o.format||"yyyy-MM-dd").replace(/m/g,"M"),M=c(m,{previousMonthSelectable:/^(previous|both)$/.test(o.selectOtherMonths),nextMonthSelectable:/^(next|both)$/.test(o.selectOtherMonths),weekStartsOn:n.weekStartsOn,noExtraRows:o.hasOwnProperty("noExtraRows")});n.displayPicker=!y,n.setDate=function(e){e.enabled&&(D=v?h(e,D):[e],p(D),n.changeMonth(e.monthOffset),n.displayPicker=!y)};var w=s.$render=function(a){e.isArray(s.$viewValue)?D=s.$viewValue:s.$viewValue&&(D=[s.$viewValue]),n.currentDate=M.parseDate(n.defaultDate||D[0])||new Date,M.setRestrictions(n),D=t(D,function(e){return M.buildDateObject(M.parseDate(e))}),D=u(D,{enabled:!0}),p(D,a),l()};n.classesFor=function(e){var i=t(D,"formattedDate"),r=a.call(i,e.formattedDate)>=0?"pickadate-active":null,o=null;return"undefined"!=typeof n.datesWithEvents&&(o=a.call(n.datesWithEvents,e.formattedDate)>=0?"pickadate-event-on-date":null),e.classNames.concat(r).concat(o)},n.changeMonth=function(e){e&&(n.currentDate.setDate(1),n.currentDate.setMonth(n.currentDate.getMonth()+e),l())},n.$watch(function(){return e.toJson([n.minDate,n.maxDate,n.disabledDates])},w),y?(d(n,i,g[0]),n.$watch(function(){return s.$viewValue},function(e){var t=M.parseDate(e);t&&w({skipRenderInput:!0}),s.$setValidity("date",!!t)}),n.$$postDigest(function(){o.value&&(s.$viewValue=o.value,w())}),i.after(g.addClass("pickadate-modal"))):i.append(g)}}}])}(window.angular); \ No newline at end of file diff --git a/src/angular-pickadate.js b/src/angular-pickadate.js index e4cd45d..e1e0a20 100755 --- a/src/angular-pickadate.js +++ b/src/angular-pickadate.js @@ -251,7 +251,8 @@ maxDate: '=', disabledDates: '=', weekStartsOn: '=', - currentDate: '=' + currentDate: '=', + datesWithEvents: '=' }, link: function(scope, element, attrs, ngModel) { @@ -303,7 +304,13 @@ scope.classesFor = function(date) { var formattedDates = map(selectedDates, 'formattedDate'), classes = indexOf.call(formattedDates, date.formattedDate) >= 0 ? 'pickadate-active' : null; - return date.classNames.concat(classes); + + var eventOnDay = null; + if(typeof scope.datesWithEvents != 'undefined') { + eventOnDay = indexOf.call(scope.datesWithEvents, date.formattedDate) >= 0 ? 'pickadate-event-on-date' : null; + } + + return date.classNames.concat(classes).concat(eventOnDay); }; scope.changeMonth = function(offset) { @@ -361,6 +368,8 @@ return date; }); + + console.dir(scope.dates); } function setViewValue(value, options) { diff --git a/src/angular-pickadate.scss b/src/angular-pickadate.scss index 1880d5a..d6cb823 100644 --- a/src/angular-pickadate.scss +++ b/src/angular-pickadate.scss @@ -61,6 +61,10 @@ background-color: #b52a00; color: white; } + .pickadate-event-on-date { + background-color: rgba(0,0,0,0.3); + color: red; + } .pickadate-head { border-top: 1px solid #DCDCDC; background: #f3f3f3; From ae8a88770064d7a8bd2b43e5bf59d733a05d6101 Mon Sep 17 00:00:00 2001 From: Jeff Huijsmans Date: Tue, 15 Dec 2015 13:55:44 +0100 Subject: [PATCH 3/4] Fixed linter error --- dist/angular-pickadate.js | 2 +- src/angular-pickadate.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/angular-pickadate.js b/dist/angular-pickadate.js index e1e0a20..4dd3915 100755 --- a/dist/angular-pickadate.js +++ b/dist/angular-pickadate.js @@ -306,7 +306,7 @@ classes = indexOf.call(formattedDates, date.formattedDate) >= 0 ? 'pickadate-active' : null; var eventOnDay = null; - if(typeof scope.datesWithEvents != 'undefined') { + if(typeof scope.datesWithEvents !== 'undefined') { eventOnDay = indexOf.call(scope.datesWithEvents, date.formattedDate) >= 0 ? 'pickadate-event-on-date' : null; } diff --git a/src/angular-pickadate.js b/src/angular-pickadate.js index e1e0a20..4dd3915 100755 --- a/src/angular-pickadate.js +++ b/src/angular-pickadate.js @@ -306,7 +306,7 @@ classes = indexOf.call(formattedDates, date.formattedDate) >= 0 ? 'pickadate-active' : null; var eventOnDay = null; - if(typeof scope.datesWithEvents != 'undefined') { + if(typeof scope.datesWithEvents !== 'undefined') { eventOnDay = indexOf.call(scope.datesWithEvents, date.formattedDate) >= 0 ? 'pickadate-event-on-date' : null; } From a273251552cb51ce0c63ebcef82a4df7bfc81360 Mon Sep 17 00:00:00 2001 From: Jeff Huijsmans Date: Tue, 15 Dec 2015 14:21:04 +0100 Subject: [PATCH 4/4] Changed styling a bit --- dist/angular-pickadate.css | 13 +++++++++++-- src/angular-pickadate.scss | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/dist/angular-pickadate.css b/dist/angular-pickadate.css index b458aef..f6c0afd 100644 --- a/dist/angular-pickadate.css +++ b/dist/angular-pickadate.css @@ -48,8 +48,17 @@ background-color: #b52a00; color: white; } .pickadate-cell .pickadate-event-on-date { - background-color: rgba(0, 0, 0, 0.3); - color: red; } + position: relative; } + .pickadate-cell .pickadate-event-on-date::after { + position: absolute; + left: 0; + top: 0; + width: 0; + height: 0; + border-style: solid; + border-width: 10px 10px 0 0; + border-color: #007bff transparent transparent transparent; + content: ''; } .pickadate-cell .pickadate-head { border-top: 1px solid #DCDCDC; background: #f3f3f3; } diff --git a/src/angular-pickadate.scss b/src/angular-pickadate.scss index d6cb823..50aa5f0 100644 --- a/src/angular-pickadate.scss +++ b/src/angular-pickadate.scss @@ -62,8 +62,20 @@ color: white; } .pickadate-event-on-date { - background-color: rgba(0,0,0,0.3); - color: red; + position: relative; + } + .pickadate-event-on-date::after { + position: absolute; + left: 0; + top: 0; + width: 0; + height: 0; + + border-style: solid; + border-width: 10px 10px 0 0; + border-color: #007bff transparent transparent transparent; + + content: ''; } .pickadate-head { border-top: 1px solid #DCDCDC;