Home Reference Source Repository

js/tools/schedule/factories/ScheduleService.js

'use strict';
var ScheduleService = ($q, $filter, ModuleService) => {


	/**
	* Check for events with frequency and then add the events that must be generated
	*
	* @param {type} eventData
	*/
	function addRecurringEvents(eventData) {
		var newEvents = [];
		for (var eventId in eventData) {
			assignFrequencyHandler(newEvents, eventData[eventId]);
		}
		for (var j = 0; j < newEvents.length; j++) {
			eventData[newEvents[j].id] = newEvents[j];
		}
	}

	/**
	* Checks which logic to use for the repeating
	*
	* @param {type} newEvents
	* @param {type} event
	*/
	function assignFrequencyHandler(newEvents, event) {
		switch (event.frequency) {
		case 'day':
			addEvents(newEvents, event, 'days', 1);
			break;
		case 'MWF':
			addEvents(newEvents, event, 'days', 1, [1, 3, 5]);
			break;
		case 'TT':
			addEvents(newEvents, event, 'days', 1, [2, 4]);
			break;
		case 'week':
			addEvents(newEvents, event, 'weeks', 1);
			break;
		case 'month':
			addEvents(newEvents, event, 'months', 1);
			break;
		case 'year':
			addEvents(newEvents, event, 'years', 1);
			break;
		default:
			break;
		}
	}


	/**
	* Adds the repeating events to the event list
	*
	* @param {type} newEvents
	* @param {type} event
	* @param {type} addType - 'days', 'months', 'weeks' or 'years'
	* @param {type} multiply - use 2 to make it every second day
	* @param {Array} allowedDays array of day numbers allowed starting Sunday at 0
	* to Saturday at 6
	*/
	function addEvents(newEvents, event, addType, multiply, allowedDays) {
		if (event.recurs_until) {
			var endDate = moment(event.recurs_until);
			var count = 1;
			while (endDate.isAfter(moment(event.start).add(count * multiply, addType))) {
				var start = moment(event.start).add(count * multiply, addType);

				if (!allowedDays || (jQuery.inArray(start.day(), allowedDays)) > -1) {
					var copiedRecurringEvent = {};
					angular.extend(copiedRecurringEvent, event);
					copiedRecurringEvent.start = start.toDate();
					copiedRecurringEvent.end = moment(event.end).add(count * multiply, addType).toDate();
					copiedRecurringEvent.id = event.id + '_' + count++;
					newEvents.push(copiedRecurringEvent);
				}
				else{
					count++;
				}
			}
		}
		else {
			var count2 = 1;
			for (var i = 0; count2 < event.recurrence_count; i++) {
				var start2 = moment(event.start).add((i + 1) * multiply, addType);
				if (!allowedDays || (jQuery.inArray(start2.day(), allowedDays)) > -1) {
					var copiedEvent = {};
					jQuery.extend(copiedEvent, event);
					copiedEvent.start = start2.toDate();
					copiedEvent.end = moment(event.end).add((i + 1) * multiply, addType).toDate();
					copiedEvent.id = event.id + '_' + i;
					newEvents.push(copiedEvent);
					count2++;
				}
			}
		}
	}


	class ScheduleServiceImpl {

		constructor(){}

		/**
		* Gets ALL the schedule events
		*/
		getAll(moduleId) {
			return ModuleService.getToolData(moduleId, 'schedule')
			.then((events) => {
				addRecurringEvents(events);
				return events;
			});
		}

		/**
		* Gets a specific event
		*/
		getEvent(moduleId, eventId) {
			return this.getAll()
			.then((events) => {
				return events[eventId];
			});
		}
	}

	return new ScheduleServiceImpl();
};
ScheduleService.$inject = ['$q', '$filter', 'ModuleService', 'SynthFail'];
export default ScheduleService;