UNPKG

strong-arc

Version:

A visual suite for the StrongLoop API Platform

66 lines (65 loc) 2.85 kB
/* * AngularJs Fullcalendar Wrapper for the JQuery FullCalendar * API @ http://arshaw.com/fullcalendar/ * * Angular Calendar Directive that takes in the [eventSources] nested array object as the ng-model and watches (eventSources.length + eventSources[i].length) for changes. * Can also take in multiple event urls as a source object(s) and feed the events per view. * The calendar will watch any eventSource array and update itself when a delta is created * An equalsTracker attrs has been added for use cases that would render the overall length tracker the same even though the events have changed to force updates. * */ angular.module('ui.directives').directive('uiCalendar',['ui.config', '$parse', function (uiConfig,$parse) { uiConfig.uiCalendar = uiConfig.uiCalendar || {}; //returns calendar return { require: 'ngModel', restrict: 'A', link: function(scope, elm, attrs, $timeout) { var sources = scope.$eval(attrs.ngModel); var tracker = 0; /* returns the length of all source arrays plus the length of eventSource itself */ var getSources = function () { var equalsTracker = scope.$eval(attrs.equalsTracker); tracker = 0; angular.forEach(sources,function(value,key){ if(angular.isArray(value)){ tracker += value.length; } }); if(angular.isNumber(equalsTracker)){ return tracker + sources.length + equalsTracker; }else{ return tracker + sources.length; } }; /* update the calendar with the correct options */ function update() { //calendar object exposed on scope scope.calendar = elm.html(''); var view = scope.calendar.fullCalendar('getView'); if(view){ view = view.name; //setting the default view to be whatever the current view is. This can be overwritten. } /* If the calendar has options added then render them */ var expression, options = { defaultView : view, eventSources: sources }; if (attrs.uiCalendar) { expression = scope.$eval(attrs.uiCalendar); } else { expression = {}; } angular.extend(options, uiConfig.uiCalendar, expression); scope.calendar.fullCalendar(options); } update(); /* watches all eventSources */ scope.$watch(getSources, function( newVal, oldVal ) { update(); }); } }; }]);