{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./Usc.Web/scripts/bundles/assignmentcalculator/_assignment-calculator.js","webpack:///./Usc.Web/scripts/bundles/assignmentcalculator/assignmentcalculator.controller.js"],"names":["installedModules","__webpack_require__","moduleId","module","i","l","exports","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","from","to","queryString","location","search","length","qs","substr","split","angular","forEach","q","kvp","parseInt","controller","$scope","$filter","$timeout","vm","extend","this","deadline","diffDays","stepSize","Date","fromDate","getTime","oneDay","today","message","messages","getMessages","element","document","querySelectorAll","li","push","dataset","text","innerText","clear","$broadcast","export","icsHeader","assignmentName","icsBody","steps","downloadLink","Array","step","date","startDate","endDate","setDate","getDate","icsEvent","querySelector","icsMsg","navigator","userAgent","match","blob","Blob","window","msSaveOrOpenBlob","createElement","href","escape","download","body","appendChild","click","removeChild","find","on","indexOf","history","replaceState","toDate","$on","e","data","type","Math","round","abs","v","dateOptions","formatYear","formatDay","startingDay","showWeeks","format","dt","$emit","open","$event","preventDefault","stopPropagation","opened","selectDate","init"],"mappings":"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","file":"assignmentcalculator-bundle-8d1b1e0a3003307730a0.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 49);\n","import './assignmentcalculator.controller.js';\r\nimport 'Sass/views/assignment-calculator.scss';","(function () {\r\n 'use strict';\r\n\r\n var from, to,\r\n queryString = location.search;\r\n\r\n // check querystring for to/from dates\r\n if (queryString.length) {\r\n var qs = queryString.substr(1, queryString.length).split('&');\r\n angular.forEach(qs, function (q) {\r\n var kvp = q.split('=');\r\n if (kvp[0] === 'from') {\r\n from = parseInt(kvp[1]);\r\n } else {\r\n to = parseInt(kvp[1]);\r\n }\r\n });\r\n }\r\n\r\n function assignmentCalcController($scope, $filter, $timeout) {\r\n\r\n var vm = angular.extend(this, {\r\n deadline: deadline,\r\n today: new Date(),\r\n oneDay: 864e5,\r\n message: '', \r\n messages: [],\r\n\r\n getMessages: getMessages,\r\n clear: clear,\r\n export: exportAsIcs\r\n });\r\n\r\n // set history state to preserve page on navigation\r\n var body = angular.element(document.querySelector('body')[0]);\r\n\r\n body.find('.sidebar a').on('click', function () {\r\n var href = location.href.substr(0, location.href.indexOf('?'));\r\n history.replaceState(null, null, href + '?to=' + vm.toDate.getTime() + '&from=' + vm.fromDate.getTime());\r\n });\r\n\r\n function clear() {\r\n $scope.$broadcast('clear');\r\n };\r\n\r\n function getMessages() {\r\n var m = angular.element(document.querySelectorAll('.message-list li'));\r\n angular.forEach(m, function (li) {\r\n vm.messages.push({\r\n from: li.dataset.from,\r\n to: li.dataset.to,\r\n text: li.innerText\r\n });\r\n });\r\n };\r\n\r\n function getDays() {\r\n\r\n vm.diffDays = Math.round(Math.abs((vm.toDate.getTime() - vm.fromDate.getTime()) / (vm.oneDay)));\r\n\r\n var m = $filter('filter')(vm.messages, function (v) {\r\n return v.from <= vm.diffDays && vm.diffDays <= v.to;\r\n })[0];\r\n\r\n vm.message = m ? m.text : '';\r\n };\r\n\r\n function deadline(p) {\r\n if (vm.diffDays) {\r\n var stepSize = (p / 100) * vm.diffDays;\r\n return 'Complete by ' + $filter('date')(new Date(vm.fromDate.getTime() + (vm.oneDay * stepSize)), 'd MMMM');\r\n }\r\n return null;\r\n };\r\n \r\n\r\n $scope.$on('dateChange', function(e, data) {\r\n if (data.type) {\r\n if (data.type === 'from') {\r\n vm.fromDate = data.date;\r\n } else {\r\n vm.toDate = data.date;\r\n }\r\n\r\n if (vm.toDate && vm.fromDate) {\r\n if (vm.fromDate <= vm.toDate) {\r\n getDays();\r\n } else if (vm.toDate < vm.fromDate) {\r\n vm.message = 'Really? What are you, some sort of timetravelling robot?';\r\n vm.diffDays = '';\r\n }\r\n }\r\n } else {\r\n vm.fromDate = vm.toDate = data.date;\r\n vm.message = '';\r\n vm.diffDays = '';\r\n }\r\n\r\n });\r\n\r\n /** export as ICS file **/\r\n function exportAsIcs() {\r\n var icsHeader = `BEGIN:VCALENDAR\\r\\nVERSION:2.0\\r\\nPRODID:-//UniSC//NONSGML v1.0//EN\\r\\nX-WR-CALNAME:${vm.assignmentName}\\r\\n`,\r\n icsBody = '',\r\n icsMsg;\r\n\r\n // items are server-rendered, so need to get all data from the dom\r\n const steps = document.querySelectorAll('.calc-step:not(.last-step)');\r\n Array.from(steps).forEach((step, i) => {\r\n var stepSize = (parseInt(step.dataset.deadline, 10) / 100) * vm.diffDays;\r\n var date = new Date(vm.fromDate.getTime() + (vm.oneDay * stepSize));\r\n var startDate = $filter('date')(date, 'yyyyMMdd') + 'T000000';\r\n var endDate = $filter('date')(date.setDate(date.getDate() + 1), 'yyyyMMdd') + 'T000000';\r\n\r\n let icsEvent = `BEGIN:VEVENT\\r\\nUID:${i}_${vm.assignmentName}_usc-assignment-calculator\\r\\nDTSTART;VALUE=DATE:${startDate}\\r\\nDTEND;VALUE=DATE:${endDate}`;\r\n icsEvent += `\\r\\nSUMMARY:Step ${i + 1}: ${step.querySelector('h5').innerText}\\r\\nSTATUS:CONFIRMED\\r\\nEND:VEVENT\\r\\n`;\r\n\r\n icsBody += icsEvent; \r\n });\r\n\r\n icsMsg = icsHeader + icsBody + 'END:VCALENDAR';\r\n\r\n if (!navigator.userAgent.match(/msie|trident/i)) {\r\n\r\n var downloadLink = document.createElement(\"a\");\r\n downloadLink.href = 'data:text/calendar;charset=utf-8,\\r\\n' + escape(icsMsg);\r\n downloadLink.download = `${vm.assignmentName || 'calendar'}.ics`;\r\n //when an event is triggered programmatically which already exists in the client side, it calls $apply within $digest for the second time\r\n // which causing Action Already In Progress error. \r\n //To avoid this we need to move the call to event outside of the digest, by using $timeout(fn, 0, false)\r\n //refer to https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply\r\n $timeout(function () {\r\n document.body.appendChild(downloadLink);\r\n downloadLink.click();\r\n document.body.removeChild(downloadLink);\r\n }, 0, false);\r\n\r\n }\r\n else {\r\n var blob = new Blob([icsMsg]);\r\n window.navigator.msSaveOrOpenBlob(blob, `${vm.assignmentName || 'calendar'}.ics`);\r\n }\r\n } \r\n };\r\n\r\n function dateController($scope) {\r\n\r\n var vm = this;\r\n\r\n angular.extend(vm, {\r\n\r\n dateOptions: {\r\n formatYear: 'yy',\r\n formatDay: 'd',\r\n startingDay: 0,\r\n showWeeks: false\r\n },\r\n format: 'd MMMM yyyy',\r\n\r\n today: function () {\r\n this.dt = new Date();\r\n },\r\n clear: function () {\r\n this.dt = null;\r\n $scope.$emit('dateChange', { type: null, date: this.dt });\r\n },\r\n open: function ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n this.opened = true;\r\n },\r\n selectDate: function (type) {\r\n $scope.$emit('dateChange', { type: type, date: this.dt });\r\n },\r\n init: function (type) {\r\n if (to || from) {\r\n this.dt = new Date(type === 'to' ? to : from); \r\n this.selectDate(type);\r\n }\r\n }\r\n });\r\n \r\n this.today = new Date();\r\n\r\n $scope.$on('clear', function () {\r\n vm.clear();\r\n });\r\n };\r\n\r\n // inject!\r\n angular.module('Uscapp')\r\n .controller('assignmentCalcCtrl', ['$scope', '$filter', '$timeout', assignmentCalcController])\r\n .controller('dateCtrl', ['$scope', '$filter', dateController]);\r\n})();"],"sourceRoot":""}