diff --git a/build/angular-date-range-picker.js b/build/angular-date-range-picker.js index b870931..7b244fc 100644 --- a/build/angular-date-range-picker.js +++ b/build/angular-date-range-picker.js @@ -2,23 +2,68 @@ angular.module("dateRangePicker", ['pasvaz.bindonce']); angular.module("dateRangePicker").directive("dateRangePicker", [ - "$compile", "$timeout", function($compile, $timeout) { - var CUSTOM, pickerTemplate; + "$compile", "$timeout", '$http', '$templateCache', '$q', function($compile, $timeout, $http, $templateCache, $q) { + var CUSTOM, getTemplate, inputTemplate, pickerTemplate; pickerTemplate = "
\n
\n \n
\n
\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n \n
\n
\n
\n Select range: \n
\n
\n Apply\n cancel\n
\n
\n
"; + inputTemplate = "\n \n {{ model.start.format(\"ll\") }} - {{ model.end.format(\"ll\") }}\n Select date range\n \n \n {{ model.format(\"ll\") }}\n Select date\n \n"; CUSTOM = "CUSTOM"; + getTemplate = function(templateUrl) { + var templateLoader; + templateLoader = $q.defer(); + if (templateUrl) { + $http.get(templateUrl, { + cache: $templateCache + }).success(function(response) { + return templateLoader.resolve(response); + }).error(function(response) { + templateLoader.reject(response); + return new Error("Could not load angular-date-range-picker template, reason " + response); + }); + } else { + templateLoader.resolve(inputTemplate); + } + return templateLoader.promise; + }; return { restrict: "AE", replace: true, - template: "\n \n {{ model.start.format(\"ll\") }} - {{ model.end.format(\"ll\") }}\n Select date range\n \n \n {{ model.format(\"ll\") }}\n Select date\n \n", scope: { model: "=ngModel", customSelectOptions: "=", ranged: "=", pastDates: "@", - callback: "&" + callback: "&", + pickerTemplateUrl: "=", + inputTemplateUrl: "=" }, link: function($scope, element, attrs) { - var documentClickFn, domEl, _calculateRange, _checkQuickList, _makeQuickList, _prepare; + var documentClickFn, _calculateRange, _checkQuickList, _makeQuickList, _prepare; + getTemplate($scope.inputTemplateUrl).then(function(html) { + var domEl, newEl; + newEl = $compile(html)($scope); + element.replaceWith(newEl); + element = angular.element(newEl); + if ($scope.pickerTemplateUrl) { + domEl = $compile(angular.element('
'))($scope); + } else { + domEl = $compile(angular.element(pickerTemplate))($scope); + } + element.append(domEl); + return element.bind("click", function(e) { + if (e != null) { + if (typeof e.stopPropagation === "function") { + e.stopPropagation(); + } + } + return $scope.$apply(function() { + if ($scope.visible) { + return $scope.hide(); + } else { + return $scope.show(); + } + }); + }); + }); $scope.quickListDefinitions = $scope.customSelectOptions; if ($scope.quickListDefinitions == null) { $scope.quickListDefinitions = [ @@ -236,22 +281,6 @@ } return $scope.quickListDefinitions = value; }); - domEl = $compile(angular.element(pickerTemplate))($scope); - element.append(domEl); - element.bind("click", function(e) { - if (e != null) { - if (typeof e.stopPropagation === "function") { - e.stopPropagation(); - } - } - return $scope.$apply(function() { - if ($scope.visible) { - return $scope.hide(); - } else { - return $scope.show(); - } - }); - }); documentClickFn = function(e) { $scope.$apply(function() { return $scope.hide(); diff --git a/build/angular-date-range-picker.min.js b/build/angular-date-range-picker.min.js index e84e720..70e473b 100644 --- a/build/angular-date-range-picker.min.js +++ b/build/angular-date-range-picker.min.js @@ -1,2 +1,2 @@ -/*! angular-date-range-picker 2014-07-03 */ -(function(){angular.module("dateRangePicker",["pasvaz.bindonce"]),angular.module("dateRangePicker").directive("dateRangePicker",["$compile","$timeout",function(a,b){var c,d;return d='
\n
\n \n
\n
\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n \n
\n
\n
\n Select range: \n
\n
\n Apply\n cancel\n
\n
\n
',c="CUSTOM",{restrict:"AE",replace:!0,template:'\n \n {{ model.start.format("ll") }} - {{ model.end.format("ll") }}\n Select date range\n \n \n {{ model.format("ll") }}\n Select date\n \n',scope:{model:"=ngModel",customSelectOptions:"=",ranged:"=",pastDates:"@",callback:"&"},link:function(e,f){var g,h,i,j,k,l;return e.quickListDefinitions=e.customSelectOptions,null==e.quickListDefinitions&&(e.quickListDefinitions=[{label:"This week",range:moment().range(moment().startOf("week").startOf("day"),moment().endOf("week").startOf("day"))},{label:"Next week",range:moment().range(moment().startOf("week").add(1,"week").startOf("day"),moment().add(1,"week").endOf("week").startOf("day"))},{label:"This fortnight",range:moment().range(moment().startOf("week").startOf("day"),moment().add(1,"week").endOf("week").startOf("day"))},{label:"This month",range:moment().range(moment().startOf("month").startOf("day"),moment().endOf("month").startOf("day"))},{label:"Next month",range:moment().range(moment().startOf("month").add(1,"month").startOf("day"),moment().add(1,"month").endOf("month").startOf("day"))}]),e.quick=null,e.range=null,e.selecting=!1,e.visible=!1,e.start=null,e.showRanged=void 0===e.ranged?!0:e.ranged,k=function(a){var b,d,f,g,h;if(null==a&&(a=!1),e.showRanged){for(e.quickList=[],a&&e.quickList.push({label:"Custom",range:c}),g=e.quickListDefinitions,h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(e.quickList.push(b));return h}},i=function(){var a,b;return e.showRanged?e.range=e.selection?(b=e.selection.start.clone().startOf("month").startOf("day"),a=b.clone().add(2,"months").endOf("month").startOf("day"),moment().range(b,a)):moment().range(moment().startOf("month").subtract(1,"month").startOf("day"),moment().endOf("month").add(1,"month").startOf("day")):(e.selection=!1,e.selection=e.model||!1,e.date=moment(e.model)||moment(),e.range=moment().range(moment(e.date).startOf("month"),moment(e.date).endOf("month")))},j=function(){var a,b,d,f;if(e.showRanged&&e.selection){for(f=e.quickList,b=0,d=f.length;d>b;b++)if(a=f[b],a.range!==c&&e.selection.start.startOf("day").unix()===a.range.start.startOf("day").unix()&&e.selection.end.startOf("day").unix()===a.range.end.startOf("day").unix())return e.quick=a.range,k(),void 0;return e.quick=c,k(!0)}},l=function(){var a,b,c,d,f,g;for(e.months=[],c=12*e.range.start.year()+e.range.start.month(),b=moment().startOf("week").day(),e.range.by("days",function(a){var d,f,g,h,i,j,k;return d=a.day()-b,0>d&&(d=7+d),g=12*a.year()+a.month()-c,i=parseInt((7+a.date()-d)/7),h=!1,f=!1,e.showRanged?e.start?(h=a===e.start,f=a0)),(j=e.months)[g]||(j[g]={name:a.format("MMMM YYYY"),weeks:[]}),(k=e.months[g].weeks)[i]||(k[i]=[]),e.months[g].weeks[i][d]={date:a,selected:h,disabled:f,start:e.start&&e.start.unix()===a.unix()}}),g=e.months,d=0,f=g.length;f>d;d++)a=g[d],a.weeks[0]||a.weeks.splice(0,1);return j()},e.show=function(){return e.selection=e.model,i(),l(),e.visible=!0},e.hide=function(a){return null!=a&&"function"==typeof a.stopPropagation&&a.stopPropagation(),e.visible=!1,e.start=null},e.prevent_select=function(a){return null!=a?"function"==typeof a.stopPropagation?a.stopPropagation():void 0:void 0},e.ok=function(a){return null!=a&&"function"==typeof a.stopPropagation&&a.stopPropagation(),e.model=e.selection,b(function(){return e.callback?e.callback():void 0}),e.hide()},e.select=function(a,b){return null!=b&&"function"==typeof b.stopPropagation&&b.stopPropagation(),a.disabled?void 0:(e.showRanged?(e.selecting=!e.selecting,e.selecting?e.start=a.date:(e.selection=moment().range(e.start,a.date),e.start=null)):e.selection=moment(a.date),l())},e.move=function(a,b){return null!=b&&"function"==typeof b.stopPropagation&&b.stopPropagation(),e.showRanged?e.range=moment().range(e.range.start.add(a,"months").startOf("month").startOf("day"),e.range.start.clone().add(2,"months").endOf("month").startOf("day")):(e.date.add(a,"months"),e.range=moment().range(moment(e.date).startOf("month"),moment(e.date).endOf("month"))),l()},e.handlePickerClick=function(a){return null!=a?"function"==typeof a.stopPropagation?a.stopPropagation():void 0:void 0},e.$watch("quick",function(a){return a&&a!==c?(e.selection=e.quick,e.selecting=!1,e.start=null,i(),l()):void 0}),e.$watch("customSelectOptions",function(a){return"undefined"!=typeof customSelectOptions&&null!==customSelectOptions?e.quickListDefinitions=a:void 0}),h=a(angular.element(d))(e),f.append(h),f.bind("click",function(a){return null!=a&&"function"==typeof a.stopPropagation&&a.stopPropagation(),e.$apply(function(){return e.visible?e.hide():e.show()})}),g=function(){return e.$apply(function(){return e.hide()}),!0},angular.element(document).bind("click",g),e.$on("$destroy",function(){return angular.element(document).unbind("click",g)}),k(),i(),l()}}}])}).call(this); \ No newline at end of file +/*! angular-date-range-picker 2014-10-03 */ +(function(){angular.module("dateRangePicker",["pasvaz.bindonce"]),angular.module("dateRangePicker").directive("dateRangePicker",["$compile","$timeout","$http","$templateCache","$q",function(a,b,c,d,e){var f,g,h,i;return i='
\n
\n \n
\n
\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n \n
\n
\n
\n Select range: \n
\n
\n Apply\n cancel\n
\n
\n
',h='\n \n {{ model.start.format("ll") }} - {{ model.end.format("ll") }}\n Select date range\n \n \n {{ model.format("ll") }}\n Select date\n \n',f="CUSTOM",g=function(a){var b;return b=e.defer(),a?c.get(a,{cache:d}).success(function(a){return b.resolve(a)}).error(function(a){return b.reject(a),new Error("Could not load angular-date-range-picker template, reason "+a)}):b.resolve(h),b.promise},{restrict:"AE",replace:!0,scope:{model:"=ngModel",customSelectOptions:"=",ranged:"=",pastDates:"@",callback:"&",pickerTemplateUrl:"=",inputTemplateUrl:"="},link:function(c,d){var e,h,j,k,l;return g(c.inputTemplateUrl).then(function(b){var e,f;return f=a(b)(c),d.replaceWith(f),d=angular.element(f),e=c.pickerTemplateUrl?a(angular.element("
"))(c):a(angular.element(i))(c),d.append(e),d.bind("click",function(a){return null!=a&&"function"==typeof a.stopPropagation&&a.stopPropagation(),c.$apply(function(){return c.visible?c.hide():c.show()})})}),c.quickListDefinitions=c.customSelectOptions,null==c.quickListDefinitions&&(c.quickListDefinitions=[{label:"This week",range:moment().range(moment().startOf("week").startOf("day"),moment().endOf("week").startOf("day"))},{label:"Next week",range:moment().range(moment().startOf("week").add(1,"week").startOf("day"),moment().add(1,"week").endOf("week").startOf("day"))},{label:"This fortnight",range:moment().range(moment().startOf("week").startOf("day"),moment().add(1,"week").endOf("week").startOf("day"))},{label:"This month",range:moment().range(moment().startOf("month").startOf("day"),moment().endOf("month").startOf("day"))},{label:"Next month",range:moment().range(moment().startOf("month").add(1,"month").startOf("day"),moment().add(1,"month").endOf("month").startOf("day"))}]),c.quick=null,c.range=null,c.selecting=!1,c.visible=!1,c.start=null,c.showRanged=void 0===c.ranged?!0:c.ranged,k=function(a){var b,d,e,g,h;if(null==a&&(a=!1),c.showRanged){for(c.quickList=[],a&&c.quickList.push({label:"Custom",range:f}),g=c.quickListDefinitions,h=[],d=0,e=g.length;e>d;d++)b=g[d],h.push(c.quickList.push(b));return h}},h=function(){var a,b;return c.showRanged?c.range=c.selection?(b=c.selection.start.clone().startOf("month").startOf("day"),a=b.clone().add(2,"months").endOf("month").startOf("day"),moment().range(b,a)):moment().range(moment().startOf("month").subtract(1,"month").startOf("day"),moment().endOf("month").add(1,"month").startOf("day")):(c.selection=!1,c.selection=c.model||!1,c.date=moment(c.model)||moment(),c.range=moment().range(moment(c.date).startOf("month"),moment(c.date).endOf("month")))},j=function(){var a,b,d,e;if(c.showRanged&&c.selection){for(e=c.quickList,b=0,d=e.length;d>b;b++)if(a=e[b],a.range!==f&&c.selection.start.startOf("day").unix()===a.range.start.startOf("day").unix()&&c.selection.end.startOf("day").unix()===a.range.end.startOf("day").unix())return c.quick=a.range,void k();return c.quick=f,k(!0)}},l=function(){var a,b,d,e,f,g;for(c.months=[],d=12*c.range.start.year()+c.range.start.month(),b=moment().startOf("week").day(),c.range.by("days",function(a){var e,f,g,h,i,j,k;return e=a.day()-b,0>e&&(e=7+e),g=12*a.year()+a.month()-d,i=parseInt((7+a.date()-e)/7),h=!1,f=!1,c.showRanged?c.start?(h=a===c.start,f=a0)),(j=c.months)[g]||(j[g]={name:a.format("MMMM YYYY"),weeks:[]}),(k=c.months[g].weeks)[i]||(k[i]=[]),c.months[g].weeks[i][e]={date:a,selected:h,disabled:f,start:c.start&&c.start.unix()===a.unix()}}),g=c.months,e=0,f=g.length;f>e;e++)a=g[e],a.weeks[0]||a.weeks.splice(0,1);return j()},c.show=function(){return c.selection=c.model,h(),l(),c.visible=!0},c.hide=function(a){return null!=a&&"function"==typeof a.stopPropagation&&a.stopPropagation(),c.visible=!1,c.start=null},c.prevent_select=function(a){return null!=a&&"function"==typeof a.stopPropagation?a.stopPropagation():void 0},c.ok=function(a){return null!=a&&"function"==typeof a.stopPropagation&&a.stopPropagation(),c.model=c.selection,b(function(){return c.callback?c.callback():void 0}),c.hide()},c.select=function(a,b){return null!=b&&"function"==typeof b.stopPropagation&&b.stopPropagation(),a.disabled?void 0:(c.showRanged?(c.selecting=!c.selecting,c.selecting?c.start=a.date:(c.selection=moment().range(c.start,a.date),c.start=null)):c.selection=moment(a.date),l())},c.move=function(a,b){return null!=b&&"function"==typeof b.stopPropagation&&b.stopPropagation(),c.showRanged?c.range=moment().range(c.range.start.add(a,"months").startOf("month").startOf("day"),c.range.start.clone().add(2,"months").endOf("month").startOf("day")):(c.date.add(a,"months"),c.range=moment().range(moment(c.date).startOf("month"),moment(c.date).endOf("month"))),l()},c.handlePickerClick=function(a){return null!=a&&"function"==typeof a.stopPropagation?a.stopPropagation():void 0},c.$watch("quick",function(a){return a&&a!==f?(c.selection=c.quick,c.selecting=!1,c.start=null,h(),l()):void 0}),c.$watch("customSelectOptions",function(a){return"undefined"!=typeof customSelectOptions&&null!==customSelectOptions?c.quickListDefinitions=a:void 0}),e=function(){return c.$apply(function(){return c.hide()}),!0},angular.element(document).bind("click",e),c.$on("$destroy",function(){return angular.element(document).unbind("click",e)}),k(),h(),l()}}}])}).call(this); \ No newline at end of file diff --git a/src/angular-date-range-picker.coffee b/src/angular-date-range-picker.coffee index 88ed1d1..03154d1 100644 --- a/src/angular-date-range-picker.coffee +++ b/src/angular-date-range-picker.coffee @@ -1,6 +1,7 @@ angular.module "dateRangePicker", ['pasvaz.bindonce'] -angular.module("dateRangePicker").directive "dateRangePicker", ["$compile", "$timeout", ($compile, $timeout) -> +angular.module("dateRangePicker").directive "dateRangePicker", ["$compile", "$timeout", '$http', '$templateCache', '$q', ($compile, $timeout, $http, $templateCache, $q) -> + # constants pickerTemplate = """
@@ -40,11 +41,7 @@ angular.module("dateRangePicker").directive "dateRangePicker", ["$compile", "$ti
""" - CUSTOM = "CUSTOM" - - restrict: "AE" - replace: true - template: """ + inputTemplate = """ {{ model.start.format("ll") }} - {{ model.end.format("ll") }} @@ -56,14 +53,53 @@ angular.module("dateRangePicker").directive "dateRangePicker", ["$compile", "$ti """ + CUSTOM = "CUSTOM" + + getTemplate = (templateUrl) -> + templateLoader = $q.defer() + if templateUrl + $http.get(templateUrl, {cache: $templateCache}) + .success (response) -> + templateLoader.resolve(response) + .error (response) -> + templateLoader.reject(response) + new Error "Could not load angular-date-range-picker template, reason #{response}" + else + templateLoader.resolve(inputTemplate) + + return templateLoader.promise + + restrict: "AE" + replace: true + scope: model: "=ngModel" # can't use ngModelController, we need isolated scope customSelectOptions: "=" ranged: "=" pastDates: "@" callback: "&" + pickerTemplateUrl: "=" + inputTemplateUrl: "=" link: ($scope, element, attrs) -> + getTemplate($scope.inputTemplateUrl).then (html) -> + newEl = $compile(html)($scope); + element.replaceWith(newEl); + element = angular.element(newEl) + # create DOM and bind event + if $scope.pickerTemplateUrl + domEl = $compile(angular.element('
'))($scope) + else + domEl = $compile(angular.element(pickerTemplate))($scope) + + element.append(domEl) + + # Any binding to element needs to be done here + element.bind "click", (e) -> + e?.stopPropagation?() + $scope.$apply -> + if $scope.visible then $scope.hide() else $scope.show() + $scope.quickListDefinitions = $scope.customSelectOptions $scope.quickListDefinitions ?= [ { @@ -259,15 +295,6 @@ angular.module("dateRangePicker").directive "dateRangePicker", ["$compile", "$ti return unless customSelectOptions? $scope.quickListDefinitions = value - # create DOM and bind event - domEl = $compile(angular.element(pickerTemplate))($scope) - element.append(domEl) - - element.bind "click", (e) -> - e?.stopPropagation?() - $scope.$apply -> - if $scope.visible then $scope.hide() else $scope.show() - documentClickFn = (e) -> $scope.$apply -> $scope.hide() true diff --git a/test/index.html b/test/index.html index 3d9d4bb..020655d 100644 --- a/test/index.html +++ b/test/index.html @@ -22,6 +22,11 @@ $scope.date = null }) + angular.module("testapp").run(function($templateCache){ + $templateCache.put('custom_picker.html', '
Greetings from custom picker template
'); + $templateCache.put('custom_input.html', 'Custom picker {{ model.start.format("ll") }} - {{ model.end.format("ll") }}'); + + });