{"version":3,"sources":["app.js","exceptions.js","google.js","index.js","utils.js","common/resourceRegistrations.js","components/tdFileAdd.js","directives/alertFlash.js","directives/angular-perfect-scrollbar.js","directives/fileAdd.js","directives/niceScroll.js","directives/tdBarGraph.js","directives/tdBoxCard.js","directives/tdBoxStatusCard.js","directives/tdClickAction.js","directives/tdClickOutside.js","directives/tdCollapsibleCard.js","directives/tdDatePicker.js","directives/tdFileSizeError.js","directives/tdInputBlur.js","directives/tdLineGraph.js","directives/tdLoading.js","directives/tdNewLineGraph.js","directives/tdOptionList.js","directives/tdPageHeader.js","directives/tdPopover.js","directives/tdScrollTo.js","directives/tdSectionHeader.js","directives/tdShowPopoverForLargeWidth.js","directives/tdTimePicker.js","directives/tdWorkFlowStatus.js","document/resourceRegistrations.js","filters/tdFileSize.js","filters/tdPercentage.js","maintenanceRequests/resourceRegistrations.js","messaging/resourceRegistrations.js","ownership/resourceRegistrations.js","services/enums.js","services/flash.js","services/resourceFactory.js","services/shell.js","tenancy/resourceRegistrations.js","common/controller/homeCtrl.js","common/controller/loginCtrl.js","common/controller/scheduledMaintenanceCtrl.js","common/controller/shellCtrl.js","common/controller/termsOfUseCtrl.js","components/maintenanceRequests/maintenanceRequestSvc.js","components/maintenanceRequests/tdMRViewCollection.js","components/maintenanceRequests/tdMRViewPanel.js","directives/tdUploader/tdUploader.js","document/controller/documentCtrl.js","maintenanceRequests/controller/createMaintenanceRequestCtrl.js","maintenanceRequests/controller/maintenanceRequestDetailsCtrl.js","maintenanceRequests/controller/maintenanceRequestsCtrl.js","messaging/controller/composeCtrl.js","messaging/controller/messagingCentreCtrl.js","messaging/controller/threadViewCtrl.js","ownership/controller/rentHistoryCtrl.js","ownership/controller/reportsStatmentsCtrl.js","tenancy/controller/manageInspectionsCtrl.js","tenancy/controller/tenancyReceiptsAndInvoicesCtrl.js"],"names":[],"mappings":"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","file":"tardis.0.0.0.min.js","sourcesContent":["/*jshint browser: true */\r\n'use strict';\r\n\r\n// Declare app level module which depends on filters, and services\r\n(function () {\r\n angular.module('pt', [\r\n 'smart-table',\r\n 'ng-context-menu',\r\n 'ui.router',\r\n 'ngResource',\r\n 'ngSanitize',\r\n 'ngAnimate',\r\n 'ngTouch',\r\n 'ui.tinymce',\r\n 'ngProgress',\r\n 'ngIntercom',\r\n 'angularSpinner',\r\n 'ui.router.breadcrumbs',\r\n 'ui.bootstrap',\r\n 'perfect_scrollbar',\r\n 'pt.filters',\r\n 'pt.services',\r\n 'pt.directives',\r\n 'pt.controllers',\r\n 'duScroll',\r\n 'angulartics',\r\n 'angulartics.google.analytics',\r\n 'chart.js'\r\n ])\r\n\r\n .factory('authInterceptor', ['$q', '$window', '$injector', function ($q, $window, $injector) {\r\n return {\r\n request: function (config) {\r\n if (config.url.indexOf(PTConfig.APP_API_BASE_URL) === 0) {\r\n // only modify calls to the tardis API site.\r\n config.headers = config.headers || {};\r\n config.headers['Content-Type'] = 'application/json; charset=utf-8'; // force JSON for all requests\r\n config.withCredentials = true; // allow api site to receive and set cookies\r\n }\r\n\r\n return config;\r\n },\r\n responseError: function (rejection) {\r\n var $state = $injector.get('$state');\r\n\r\n if (rejection.status === 401) {\r\n $state.go(\"login\");\r\n } else if (rejection.status === 503) {\r\n $window.location.reload();\r\n }\r\n else if (rejection.status >= 500) {\r\n $state.go(\"shell.connectionDown\");\r\n }\r\n\r\n return $q.reject(rejection);\r\n },\r\n };\r\n }])\r\n\r\n .config(['$stateProvider', '$urlRouterProvider', '$locationProvider',\r\n '$httpProvider',\r\n '$intercomProvider',\r\n 'ChartJsProvider',\r\n function ($stateProvider, $urlRouterProvider, $locationProvider, $httpProvider, $intercomProvider, ChartJsProvider) {\r\n\r\n $intercomProvider\r\n .appID(PTConfig.INTERCOM_APP_ID)\r\n .asyncLoading(true);\r\n\r\n ChartJsProvider.setOptions({\r\n colours: ['#5ebc77', '#cb2027'],\r\n tooltipFillColor: \"#ccc\",\r\n tooltipFontColor: \"#000\",\r\n tooltipTitleFontColor: \"#000\",\r\n scaleShowLabels: true,\r\n responsive: true\r\n });\r\n\r\n //Configure all line charts\r\n ChartJsProvider.setOptions('Line', {\r\n datasetFill: false,\r\n scaleShowVerticalLines: false,\r\n scaleGridLineColor: \"#ccc\",\r\n });\r\n\r\n $urlRouterProvider.otherwise(function ($injector, $location) {\r\n var path = $location.path();\r\n if (path === \"/\") return \"/home\";\r\n\r\n return '/error/page-not-found';\r\n });\r\n\r\n $stateProvider\r\n .state('invitation', {\r\n url: \"^/invitation?invitation\",\r\n templateUrl: 'partials/common/login.html',\r\n controller: 'loginCtrl',\r\n })\r\n .state('login', {\r\n url: \"^/login?returnUrl&cantLogin&r\",\r\n templateUrl: 'partials/common/login.html',\r\n controller: 'loginCtrl',\r\n })\r\n .state('error', {\r\n url: \"^/error\",\r\n templateUrl: 'partials/common/error/error.html',\r\n controller: 'errorCtrl',\r\n })\r\n .state('terms', {\r\n url: '^/termsofuse',\r\n templateUrl: 'partials/common/termsOfUse.html',\r\n controller: 'termsOfUseCtrl',\r\n })\r\n .state('shell', {\r\n url: '^/shell',\r\n templateUrl: 'partials/common/shell.html',\r\n controller: 'shellCtrl',\r\n abstract: true,\r\n })\r\n .state('shell.home', {\r\n url: '^/home',\r\n templateUrl: 'partials/common/home.html',\r\n breadcrumb: 'Home',\r\n controller: 'homeCtrl',\r\n })\r\n .state('shell.reportsStatements', {\r\n url: '^/home/owner/manage-properties/reportsStatements?reportType',\r\n templateUrl: 'partials/ownership/reportsStatements.html',\r\n breadcrumb: 'Reports & Statements',\r\n controller: 'reportsStatementsCtrl',\r\n })\r\n .state('shell.receiptsAndInvoices', {\r\n url: '^/tenancyReceiptsAndInvoice',\r\n templateUrl: 'partials/tenancy/tenancyReceiptsAndInvoices.html',\r\n controller: 'tenancyReceiptsAndInvoicesCtrl',\r\n })\r\n .state('shell.messages', {\r\n url: '^/messages/:profileType',\r\n templateUrl: 'partials/messaging/messagingCentre.html',\r\n breadcrumb: 'Messages',\r\n controller: 'messagingCentreCtrl',\r\n })\r\n .state('shell.messageCompose', {\r\n url: '^/messages/:profileType/compose?managementId&tenancyId&threadId',\r\n templateUrl: 'partials/messaging/compose.html',\r\n breadcrumb: 'Compose',\r\n controller: 'composeCtrl',\r\n })\r\n .state('shell.messageThreadView', {\r\n url: '^/messages/:profileType/threadview?companyReference&participantsHash&threadId',\r\n templateUrl: 'partials/messaging/threadView.html',\r\n breadcrumb: 'MessageThreads',\r\n controller: 'threadViewCtrl',\r\n })\r\n .state('shell.connectionDown', {\r\n url: \"^/error/connection-down\",\r\n templateUrl: 'partials/common/error/connectionDown.html',\r\n controller: 'errorCtrl'\r\n })\r\n .state('shell.pageNotFound', {\r\n url: \"^/error/page-not-found\",\r\n templateUrl: 'partials/common/error/pageNotFound.html',\r\n controller: 'errorCtrl'\r\n })\r\n .state('shell.manageInspections', {\r\n url: \"^/inspections/:profileType?managementId&inspectionId\",\r\n templateUrl: 'partials/tenancy/manageInspections.html',\r\n controller: 'manageInspectionsCtrl'\r\n })\r\n .state('shell.viewMaintenanceRequests', {\r\n url: \"^/:profileType/maintenance-requests\",\r\n templateUrl: 'partials/maintenanceRequests/viewMaintenanceRequests.html',\r\n controller: 'maintenanceRequestsCtrl',\r\n breadcrumb: 'Maintenance Requests'\r\n })\r\n .state('shell.viewMyDocuments', {\r\n url: \"^/:profileType/my-documents\",\r\n templateUrl: 'partials/documents/document.html',\r\n controller: 'documentCtrl',\r\n breadcrumb: 'My Documents'\r\n })\r\n .state('shell.createMaintenanceRequests', {\r\n url: \"^/:profileType/maintenance-requests/create\",\r\n templateUrl: 'partials/maintenanceRequests/createMaintenanceRequest.html',\r\n controller: 'createMaintenanceRequestCtrl',\r\n breadcrumb: 'Create Maintenance Request'\r\n })\r\n .state('shell.viewMaintenanceRequestDetails', {\r\n url: \"^/:profileType/maintenance-requests/view?companyReference&contactReference&maintenanceRequestId\",\r\n templateUrl: 'partials/maintenanceRequests/viewMaintenanceRequestDetails.html',\r\n controller: 'maintenanceRequestDetailsCtrl',\r\n breadcrumb: 'Maintenance Request Details'\r\n })\r\n .state('shell.rentHistory', {\r\n url: \"^/:profileType/rentHistory\",\r\n templateUrl: 'partials/ownership/rentHistory.html',\r\n controller: 'rentHistoryCtrl',\r\n breadcrumb: 'Rent History'\r\n });\r\n\r\n $locationProvider.hashPrefix('!');\r\n $locationProvider.html5Mode(true);\r\n\r\n $httpProvider.interceptors.push('authInterceptor');\r\n\r\n // Auto convert date strings to real date objects, and ensures that timezone is ignored and always in local time.\r\n $httpProvider.defaults.transformResponse.push(function () {\r\n var regexIso8601 = /^(\\d{4})-([01]\\d)-([0-3]\\d)T([0-2]\\d):([0-5]\\d)(?::([0-5]\\d)(?:\\.(\\d{1,3}))?)?([+-][0-2]\\d:[0-5]\\d|Z)?$/;\r\n\r\n function convertDateStringsToDates(input) {\r\n // Ignore things that aren't objects.\r\n if (typeof input !== \"object\") return;\r\n\r\n for (var key in input) {\r\n if (!input.hasOwnProperty(key)) continue;\r\n\r\n var value = input[key];\r\n var match;\r\n // Check for string properties which look like dates.\r\n if (typeof value === \"string\" && (match = value.match(regexIso8601))) {\r\n if (match[8] === undefined) {\r\n // when no timezone, ensure it's parsed as local time (i.e. don't shift it or parse as a UTC time).\r\n var year = parseInt(match[1]);\r\n var month = parseInt(match[2]) - 1;\r\n var day = parseInt(match[3]);\r\n var hour = parseInt(match[4]);\r\n var minute = parseInt(match[5]);\r\n var second = match[6] === undefined ? 0 : parseInt(match[6]);\r\n var milli = match[7] === undefined ? 0 : parseInt((match[7] + '00').substring(0, 3));\r\n\r\n input[key] = new Date(year, month, day, hour, minute, second, milli);\r\n } else {\r\n var date = Date.parse(match[0]);\r\n input[key] = new Date(date);\r\n }\r\n } else if (typeof value === \"object\") {\r\n // Recurse into object\r\n convertDateStringsToDates(value);\r\n }\r\n }\r\n }\r\n\r\n return function (responseData) {\r\n convertDateStringsToDates(responseData);\r\n return responseData;\r\n };\r\n }());\r\n\r\n // Ensure date is serialized always as local time with no timezone.\r\n Date.prototype.toJSON = function (key) {\r\n return PTUtils.toUnspecifiedISOString(this);\r\n };\r\n }])\r\n\r\n .run(['$rootScope', '$injector', '$window', function ($rootScope, $injector, $window, $location) {\r\n $rootScope.ownerTheme = true;\r\n\r\n $rootScope.$on('$stateChangeSuccess', function (e, to, toParams, from, fromParams) {\r\n if ($rootScope.user) {\r\n var state = $injector.get('$state');\r\n var activityUrl = state.href(to.name, toParams, { absolute: true });\r\n $window.Intercom('update', { email: $rootScope.user.Email, url: activityUrl });\r\n }\r\n });\r\n }]);\r\n})();\r\n","\"use strict\";\r\n\r\nfunction IllegalArgumentException(message) {\r\n this.message = message;\r\n}","/* global ga */\r\n/* eslint no-undef: \"error\" */\r\n/* jshint -W030 */\r\n'use strict';\r\n(function (i, s, o, g, r, a, m) {\r\n i.GoogleAnalyticsObject = r; i[r] = i[r] || function () {\r\n (i[r].q = i[r].q || []).push(arguments);\r\n }, i[r].l = (1 * new Date()); a = s.createElement(o),\r\n m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m);\r\n})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');\r\n\r\nga('create', 'UA-42872998-2', 'auto');","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers', []);\r\n angular.module('pt.directives', []);\r\n angular.module('pt.filters', []);\r\n angular.module('pt.services', []);\r\n})(); ","'use strict';\r\n\r\n// Various utility functions. Overkill to inject these as angular services all the time, so just register as a global.\r\n\r\n/*jshint -W079 */ // stop jshint choking on this because since PTUtils is in the rc file it thinks we are 'redefining' it. duh.\r\nvar PTUtils = function() {\r\n\r\n function padLeft(padding, value) {\r\n return (padding + value.toString()).slice(-padding.length);\r\n }\r\n\r\n // Return an ISO string for the date, but without the timezone and without it being converted to UTC first!\r\n function toUnspecifiedISOString(date, dateOnly) {\r\n if (dateOnly) {\r\n return padLeft(\"0000\", date.getFullYear()) +\r\n \"-\" + padLeft(\"00\", date.getMonth() + 1) +\r\n \"-\" + padLeft(\"00\", date.getDate());\r\n }\r\n\r\n return padLeft(\"0000\", date.getFullYear()) +\r\n \"-\" + padLeft(\"00\", date.getMonth() + 1) +\r\n \"-\" + padLeft(\"00\", date.getDate()) +\r\n \"T\" + padLeft(\"00\", date.getHours()) +\r\n \":\" + padLeft(\"00\", date.getMinutes()) +\r\n \":\" + padLeft(\"00\", date.getSeconds()) +\r\n \".\" + padLeft(\"000\", date.getMilliseconds());\r\n }\r\n\r\n return {\r\n padLeft: padLeft,\r\n toUnspecifiedISOString: toUnspecifiedISOString\r\n };\r\n}();\r\n","/* Setup the resource registrations for this module */\r\n\r\n\"use strict\";\r\n\r\nangular.module('pt.controllers').run([\r\n 'resourceFactory',\r\n function (resourceFactory) {\r\n resourceFactory\r\n .register('account', '/account/:action', {}, {\r\n signup: { method: 'POST' },\r\n get: { method: 'GET' },\r\n update: { method: 'PUT' },\r\n validateEmail: { method: 'POST', params: { action: 'validateEmail' } },\r\n resetPassword: { method: 'POST', params: { action: 'resetPassword' } },\r\n login: { method: 'POST', params: { action: 'login' } },\r\n logout: { method: 'POST', params: { action: 'logout' } },\r\n })\r\n .register('profile', '/profile/:action', {}, {\r\n get: { method: 'GET' },\r\n profiles: { method: 'GET', isArray: true, params: { action: 'profiles' } },\r\n getAgent: { method: 'POST', params: { action: 'getAgent' } }\r\n })\r\n .register('dashboard', '/dashboard/:action', {}, {\r\n getIncomeExpenseGraph: { method: 'GET', isArray: true, params: { action: 'IncomeExpenseGraph' } }\r\n })\r\n .register('utility', '/utility/:action', {}, {\r\n getToken: { method: 'GET', params: { action: 'getToken' } },\r\n })\r\n .register('receipts', '/receipts/:CompanyReference/:ContactReference/:ReceiptReference/:action', { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', ReceiptReference: '@ReceiptReference' }, {\r\n\r\n })\r\n .register('tenancyInvoices', '/invoices/TenancyInvoices/:CompanyReference/:ContactReference/:InvoiceReference/:action', { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', InvoiceReference: '@InvoiceReference' }, {\r\n\r\n })\r\n .register('properties', '/properties/:CompanyReference/:ContactReference/:PropertyReference/:action', { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', PropertyReference: '@PropertyReference' }, {\r\n })\r\n .register('companyFeature', '/companyFeature/:CompanyReference/:ContactReference/:action', { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference'}, {\r\n get: { method: 'GET', isArray: true, params: { action: 'getCompanyFeatureList' } }\r\n });\r\n }\r\n]);\r\n","(function() {\r\n 'use strict';\r\n var _$q;\r\n\r\n var FileWrapper = function (file) {\r\n this._realFile = file;\r\n };\r\n FileWrapper.fn = FileWrapper.prototype;\r\n\r\n FileWrapper.fn.getThumbnail = function(){\r\n var self = this;\r\n };\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'name', {\r\n get: function () { return this._realFile.name\r\n .substr(0, this._realFile.name.indexOf('.', -1))\r\n .substr(0,15).trim(); \r\n },\r\n set: undefined\r\n });\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'extension', {\r\n get: function () { return this._realFile.name.substr(this._realFile.name.indexOf('.', -1)); },\r\n set: undefined\r\n });\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'type', {\r\n get: function () { return this._realFile.type; },\r\n set: undefined\r\n });\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'size', {\r\n get: function () { return this._realFile.size; },\r\n set: undefined\r\n });\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'data', {\r\n get: function () { return this._data; },\r\n set: undefined\r\n });\r\n\r\n FileWrapper.fn.readAsync = function () {\r\n var deferred = _$q.defer();\r\n\r\n var reader = new FileReader();\r\n var self = this;\r\n\r\n reader.onload = function (e) {\r\n self._data = e.target.result;\r\n deferred.resolve(self);\r\n };\r\n\r\n reader.onerror = function (e) {\r\n self._error = e.target.error;\r\n deferred.reject(self);\r\n };\r\n\r\n reader.readAsDataURL(this._realFile);\r\n\r\n return deferred.promise;\r\n };\r\n FileWrapper.fn.mapForUpload = function() {\r\n return {\r\n Name: this.name,\r\n Extension: this.extension,\r\n MimeType: this.type,\r\n Data: this.data.substring(this.data.indexOf(',') + 1)\r\n };\r\n };\r\n\r\n\r\n angular.module('pt.directives')\r\n .directive('tdFileAdd', directiveFn);\r\n\r\n directiveFn.$inject = ['$rootScope', '$q', '$window'];\r\n function directiveFn($rootScope, $q, $window) {\r\n _$q = $q;\r\n var directive = {\r\n restrict:'E',\r\n scope:{},\r\n replace:true,\r\n template: \r\n '
' +\r\n '
' +\r\n '
' +\r\n 'DRAG AND DROP YOUR IMAGES / ATTACHMENTS
or Browse for files' +\r\n '
' +\r\n '
' + \r\n '
',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n scope.validFileAPI = ($window.FileReader) ? true: false;\r\n\r\n var inputFile = elem.find('input[type=\"file\"]')[0];\r\n var ddArea = elem.find('.dd-area')[0];\r\n var ddLink = elem.find('.dd-area a')[0];\r\n\r\n $(inputFile).bind(\"change\", function (changeEvent) {\r\n var files = [];\r\n for (var i = 0; i < changeEvent.target.files.length; i++) {\r\n var file = new FileWrapper(changeEvent.target.files[i]);\r\n files.push(file);\r\n }\r\n changeEvent.target.value = \"\";\r\n $rootScope.$broadcast('tdFileAdd:FileAdded', files);\r\n });\r\n\r\n $(ddArea).click(function(){\r\n $(inputFile).trigger('click');\r\n });\r\n\r\n $(ddLink).click(function(e){\r\n e.stopPropagation();\r\n e.preventDefault();\r\n $(inputFile).trigger('click');\r\n });\r\n\r\n $(ddArea).on('dragenter',function(e){\r\n e.stopPropagation();\r\n e.preventDefault();\r\n $(this).addClass('hover');\r\n });\r\n $(ddArea).on('dragover', function(e){\r\n e.stopPropagation();\r\n e.preventDefault();\r\n $(this).addClass('hover');\r\n });\r\n $(ddArea).on('dragleave', function(e){\r\n e.stopPropagation();\r\n e.preventDefault();\r\n $(this).removeClass('hover');\r\n });\r\n $(ddArea).on('drop', function(e){\r\n e.stopPropagation();\r\n e.preventDefault();\r\n $(this).removeClass('hover');\r\n var files = [];\r\n _.each(e.originalEvent.dataTransfer.files, function(ddFile){\r\n files.push(new FileWrapper(ddFile));\r\n });\r\n $rootScope.$broadcast('tdFileAdd:FileAdded', files);\r\n });\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","'use strict';\r\nangular.module('pt.directives').\r\n directive('alertFlash', ['$rootScope', '$window', function ($rootScope, $window) {\r\n return {\r\n link: function (scope, element, attrs) {\r\n $rootScope.$on('flash', function (msg, flash) { \r\n if (flash.level == 'success') {\r\n element\r\n .show()\r\n .html('
' +\r\n '
' +\r\n '' + \r\n '' + \r\n '
' + \r\n flash.message + '
');\r\n } else if (flash.level == 'info') {\r\n element\r\n .show()\r\n .html('
' +\r\n '
' +\r\n '' + \r\n '' + \r\n '
' +\r\n flash.message + '
');\r\n } else if (flash.level == 'error') {\r\n element\r\n .show()\r\n .html('
' +\r\n '
' +\r\n '' + \r\n ' ' + \r\n '
' +\r\n flash.message + '
');\r\n }\r\n\r\n $window.setTimeout(function () {\r\n element\r\n .fadeOut();\r\n }, 3000);\r\n });\r\n }\r\n };\r\n }]);\r\n","\"use strict\";\r\n\r\nangular.module('perfect_scrollbar', []).directive('perfectScrollbar',\r\n ['$parse', '$window', '$timeout', function ($parse, $window, $timeout) {\r\n var psOptions = [\r\n 'wheelSpeed', 'wheelPropagation', 'minScrollbarLength', 'useBothWheelAxes',\r\n 'useKeyboard', 'suppressScrollX', 'suppressScrollY', 'scrollXMarginOffset',\r\n 'scrollYMarginOffset', 'includePadding'//, 'onScroll', 'scrollDown'\r\n ];\r\n\r\n return {\r\n restrict: 'EA',\r\n transclude: true,\r\n template: '
',\r\n replace: true,\r\n link: function ($scope, $elem, $attr) {\r\n var jqWindow = angular.element($window);\r\n var options = {};\r\n\r\n for (var i = 0, l = psOptions.length; i < l; i++) {\r\n var opt = psOptions[i];\r\n if ($attr[opt] !== undefined) {\r\n options[opt] = $parse($attr[opt])();\r\n }\r\n }\r\n\r\n $scope.$evalAsync(function () {\r\n $elem.perfectScrollbar(options);\r\n var onScrollHandler = $parse($attr.onScroll);\r\n $elem.scroll(function () {\r\n var scrollTop = $elem.scrollTop();\r\n var scrollHeight = $elem.prop('scrollHeight') - $elem.height();\r\n $scope.$apply(function() {\r\n onScrollHandler($scope, {\r\n scrollTop: scrollTop,\r\n scrollHeight: scrollHeight\r\n });\r\n });\r\n });\r\n });\r\n\r\n function update(event) {\r\n $scope.$evalAsync(function () {\r\n if ($attr.scrollDown == 'true' && event != 'mouseenter') {\r\n $timeout(function () {\r\n $($elem).scrollTop($($elem).prop(\"scrollHeight\"));\r\n }, 100);\r\n }\r\n $elem.perfectScrollbar('update');\r\n });\r\n }\r\n\r\n // This is necessary when you don't watch anything with the scrollbar\r\n $elem.bind('mouseenter', update('mouseenter'));\r\n\r\n // Possible future improvement - check the type here and use the appropriate watch for non-arrays\r\n if ($attr.refreshOnChange) {\r\n $scope.$watchCollection($attr.refreshOnChange, function () {\r\n update();\r\n });\r\n }\r\n\r\n // this is from a pull request - I am not totally sure what the original issue is but seems harmless\r\n if ($attr.refreshOnResize) {\r\n jqWindow.on('resize', update);\r\n }\r\n\r\n $elem.bind('$destroy', function () {\r\n jqWindow.off('resize', update);\r\n $elem.perfectScrollbar('destroy');\r\n });\r\n\r\n }\r\n };\r\n }]);\r\n","\"use strict\";\r\n\r\nangular.module('pt.directives')\r\n .directive(\"fileAdd\", ['$q', function ($q) {\r\n\r\n var FileWrapper = function (file) {\r\n this._realFile = file;\r\n };\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'name', {\r\n get: function () { return this._realFile.name; },\r\n set: undefined\r\n });\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'type', {\r\n get: function () { return this._realFile.type; },\r\n set: undefined\r\n });\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'size', {\r\n get: function () { return this._realFile.size; },\r\n set: undefined\r\n });\r\n\r\n Object.defineProperty(FileWrapper.prototype, 'data', {\r\n get: function () { return this._data; },\r\n set: undefined\r\n });\r\n\r\n FileWrapper.prototype.readAsync = function () {\r\n var deferred = $q.defer();\r\n\r\n var reader = new FileReader();\r\n var self = this;\r\n\r\n reader.onload = function (e) {\r\n self._data = e.target.result;\r\n deferred.resolve(self);\r\n };\r\n\r\n reader.onerror = function (e) {\r\n self._error = e.target.error;\r\n deferred.reject(self);\r\n };\r\n\r\n reader.readAsDataURL(this._realFile);\r\n\r\n return deferred.promise;\r\n };\r\n\r\n return {\r\n scope: {\r\n fileAdd: '&'\r\n },\r\n link: function (scope, element, attributes) {\r\n element.bind(\"change\", function (changeEvent) {\r\n scope.$apply(function () {\r\n for (var i = 0; i < changeEvent.target.files.length; i++) {\r\n var file = new FileWrapper(changeEvent.target.files[i]);\r\n scope.fileAdd({ file: file });\r\n }\r\n\r\n changeEvent.target.value = \"\";\r\n });\r\n });\r\n }\r\n };\r\n }]);\r\n","'use strict';\r\nangular.module('pt.directives').\r\n directive('niceScroll', function() {\r\n return {\r\n link: function (scope, element, attrs) {\r\n var anchor = '#' + attrs.id;\r\n element.wrap(\"
\"); \r\n element.parent().niceScroll(anchor, { cursorcolor: \"#ed6245\", cursorwidth: 10, autohidemode: false, background: \"#efefef\" });\r\n }\r\n };\r\n });\r\n","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdBarGraph', ['usSpinnerService', '$timeout',\r\n\r\n function (usSpinnerService, $timeout) {\r\n return {\r\n template: '
',\r\n scope: {\r\n barData: '=',\r\n options: '='\r\n },\r\n link: function (scope, elem, attrs) {\r\n scope.setGraph = function () {\r\n var ctx = elem.find('canvas')[0].getContext(\"2d\");\r\n var myBar = new window.Chart(ctx).Bar(scope.barData, scope.options);\r\n };\r\n\r\n scope.$watch('barData', function (val) {\r\n if (val) {\r\n $timeout(function () {\r\n scope.setGraph();\r\n });\r\n }\r\n\r\n });\r\n }\r\n };\r\n }\r\n ]);","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdBoxCard', directiveFn);\r\n\r\n directiveFn.$inject = [];\r\n\r\n function directiveFn() {\r\n var directive = {\r\n restrict: 'E',\r\n scope: {},\r\n transclude: true,\r\n template:\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '' +\r\n '
',\r\n link: link\r\n };\r\n\r\n return directive;\r\n\r\n function link(scope, elem, attrs, ctrls, transclude) {\r\n scope.showTitle = false;\r\n scope.showFooter = false;\r\n transclude(function(clone) {\r\n angular.forEach(clone, function(cloneEle) {\r\n if (cloneEle.attributes) {\r\n var tId = cloneEle.attributes['template-location'].value;\r\n var target = elem.find('[template-location=\"' + tId + '\"]');\r\n if (tId === 'header') {\r\n scope.showTitle = true;\r\n }\r\n\r\n if (tId === 'footer') {\r\n scope.showFooter = true;\r\n }\r\n\r\n if (target) {\r\n target.append(cloneEle);\r\n }\r\n }\r\n });\r\n\r\n });\r\n }\r\n }\r\n\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdBoxStatusCard', directiveFn);\r\n\r\n directiveFn.$inject = ['maintenanceRequestSvc'];\r\n function directiveFn(maintenanceRequestSvc) {\r\n var directive = {\r\n restrict:'E',\r\n scope: {\r\n mreq: '='\r\n },\r\n transclude:true,\r\n replace:true,\r\n template: \r\n '
' +\r\n '
' +\r\n '
' +\r\n '{{ mreq.Summary }}' +\r\n '
' +\r\n '
' +\r\n '{{ mreq.DisplayStatus }}' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n scope.statusStyle = {};\r\n scope.statusStyle[maintenanceRequestSvc.MapMRStsToCss(scope.mreq.DisplayStatus)] = true;\r\n\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","\"use strict\";\r\n(function(){\r\n angular.module('pt.directives')\r\n .directive(\"tdClickAction\", [\"$log\", \"$timeout\", function($log, $timeout){\r\n var dir = {\r\n restrict:\"A\",\r\n scope:{\r\n tdClickAction:\"&\"\r\n },\r\n link:function($scope, el, attrs){\r\n var timer;\r\n angular.element(el).on('click', function(){\r\n timer = $timeout(function(){\r\n $scope.$eval($scope.tdClickAction);\r\n $scope.$apply();\r\n }, 300);\r\n });\r\n\r\n $scope.$on('$destroy', function(){\r\n if(timer)\r\n $timeout.cancel(timer);\r\n });\r\n\r\n }\r\n };\r\n return dir;\r\n }]);\r\n})();","\"use strict\";\r\n(function(){\r\n angular.module('pt.directives')\r\n .directive(\"tdClickOutside\", [\"$log\", function($log){\r\n var dir = {\r\n restrict:\"A\",\r\n scope:{\r\n tdClickOutside:\"&\"\r\n },\r\n link:function($scope, el, attrs){\r\n \r\n angular.element('html').on('touchstart', function(){\r\n $scope.$eval($scope.tdClickOutside);\r\n $scope.$apply();\r\n });\r\n\r\n angular.element(el).on('touchstart', function(e){\r\n e.stopPropagation();\r\n });\r\n\r\n }\r\n };\r\n return dir;\r\n }]);\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdCollapsibleCard', directiveFn);\r\n\r\n directiveFn.$inject = [];\r\n function directiveFn() {\r\n var directive = {\r\n restrict:'E',\r\n scope: {\r\n isCollapse: '=',\r\n headingText: '@',\r\n showStatus: '=',\r\n statusColor: '@',\r\n isArchived: '=',\r\n currentStatus: '='\r\n },\r\n replace:true,\r\n transclude:true,\r\n templateUrl: '/partials/common/directives/tdCollapsibleCard.html',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n\r\n scope.getBgImgObj = function (item) {\r\n //return { 'background': \"linear-gradient(to right, #f6b158 0%, #f6b158 1%, #ccc 1%, #ccc 100%)\" };\r\n return { 'background-color': \"#f6b158\" };\r\n };\r\n\r\n function setColorclass(color) {\r\n switch (color) {\r\n case 'yellow':\r\n return 'yellow-bg';\r\n case 'green':\r\n return 'green-bg';\r\n case 'blue':\r\n return 'blue-bg';\r\n case 'dark blue':\r\n return 'dark-blue-bg';\r\n case 'orange':\r\n return 'orange-bg';\r\n case 'grey':\r\n return 'dark-grey-bg';\r\n default:\r\n return 'blue-bg';\r\n }\r\n }\r\n\r\n scope.currentColorClass = setColorclass(scope.statusColor);\r\n\r\n scope.popover = {\r\n scopeHelper: scope,\r\n options: {\r\n html: true,\r\n trigger: 'hover',\r\n container: '#colorContent',\r\n content: '
{{currentStatus}}
',\r\n placement: 'right'\r\n },\r\n };\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","\"use strict\";\r\nangular.module('pt.directives')\r\n .directive('tdDatePicker', ['$window', '$filter',\r\n function ($window, $filter) {\r\n return {\r\n restrict: 'A',\r\n templateUrl: '/partials/common/directives/tdDatePicker.html',\r\n replace: true,\r\n scope: {\r\n minDate: \"=\",\r\n maxDate: \"=\",\r\n selectedDate: \"=\"\r\n },\r\n link: {\r\n pre: function (scope) {\r\n scope.dateOptions = {\r\n formatYear: 'yy',\r\n startingDay: 1\r\n };\r\n\r\n scope.altInputFormats = ['d!/M!/yyyy'];\r\n },\r\n post: function(scope, element, attrs) {\r\n\r\n var datepicker = element;\r\n scope.showWeeks = false;\r\n scope.today = function() {\r\n return scope.selectedDate;\r\n };\r\n scope.today();\r\n\r\n scope.clear = function () {\r\n scope.selectedDate = null;\r\n };\r\n\r\n scope.toggleMin = function() {\r\n var date = scope.minDate ? scope.minDate : new Date(2000, 1, 1);\r\n scope.minDateInternal = PTUtils.toUnspecifiedISOString(date, true);\r\n };\r\n scope.toggleMin();\r\n\r\n scope.toggleMax = function() {\r\n var date = scope.maxDate ? scope.maxDate : new Date(2100, 1, 1);\r\n scope.maxDateInternal = PTUtils.toUnspecifiedISOString(date, true);\r\n };\r\n scope.toggleMax();\r\n\r\n scope.open = function($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n\r\n scope.opened = true;\r\n };\r\n\r\n scope.$watch('minDate', function(val) {\r\n scope.toggleMin();\r\n });\r\n\r\n scope.$watch('maxDate', function(val) {\r\n scope.toggleMax();\r\n });\r\n \r\n //bug- TD-601\r\n //issue in git - https://github.com/angular-ui/bootstrap/issues/3644\r\n scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate', 'dd/MM/yyyy'];\r\n scope.format = scope.formats[4];\r\n \r\n\r\n //bug- TD-616\r\n //issue in git - https://github.com/angular-ui/bootstrap/issues/3617\r\n scope.$watch('selectedDate', function (val) {\r\n if (val) {\r\n if (!scope.checkValidDate(val)) {\r\n if (scope.minDate && val < scope.minDate) {\r\n scope.dateChanged(scope.minDate);\r\n } else if (val > scope.maxDate) {\r\n scope.dateChanged(scope.maxDate);\r\n } else {\r\n }\r\n } else {\r\n //scope.dateChanged(scope.scope.minDate);\r\n }\r\n }\r\n });\r\n\r\n scope.checkValidDate = function (value) {\r\n if (value !== undefined && value !== null && value !== '') {\r\n if (value instanceof Date) {\r\n var date = Date.parse(value);\r\n if (date < 0) {\r\n return true;\r\n } else {\r\n if (isNaN(date)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n scope.dateChanged = function(date) {\r\n $window.setTimeout(function () {\r\n scope.selectedDate = date;\r\n }, 200);\r\n };\r\n }\r\n }\r\n };\r\n }\r\n ]);\r\n","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdFileSizeError', [\r\n function () {\r\n return {\r\n templateUrl: '/partials/common/directives/tdFileSizeError.html',\r\n replace: true,\r\n scope: {\r\n files: '=',\r\n hasExceededFileSize: '='\r\n },\r\n link: function (scope, element, attrs) {\r\n scope.hasExceededFileSize = false;\r\n scope.totalFilesSize = 0;\r\n scope.maxAllowedFileSize = PTConfig.MAX_ALLOWED_FILE_SIZE;\r\n function calculateAttachmentsSize(files) {\r\n if (files && files.length > 0) {\r\n scope.totalFilesSize = 0;\r\n for (var i = 0; i < files.length; i++) {\r\n scope.totalFilesSize = scope.totalFilesSize + files[i].size;\r\n }\r\n\r\n scope.totalFilesSize = Math.round((scope.totalFilesSize / 1000000));\r\n scope.hasExceededFileSize = scope.totalFilesSize > scope.maxAllowedFileSize;\r\n }\r\n }\r\n\r\n scope.$watchCollection('files', function (val) {\r\n calculateAttachmentsSize(val);\r\n });\r\n }\r\n };\r\n }\r\n ]);","// Angular Directives to handle tinymce blur event\r\n// Main Issue: blur event not detected in iPad / iPhone \r\n// so it will not reomove the onscreen keyboard \r\n// this directive will help to solve this\r\n\"use strict\";\r\n(function(){\r\n angular.module('pt.directives')\r\n .directive(\"tdInputBlur\", function(){\r\n var dir = {\r\n template:'',\r\n replace:true,\r\n require:{\r\n doBlur:\"^\"\r\n },\r\n scope:{\r\n doBlur:\"=\"\r\n },\r\n link:function($scope, el, attrs){\r\n var list = $scope.$watch('doBlur', function(newval){\r\n $(el).removeAttr('disabled');\r\n if(newval) {\r\n $(el).focus().blur()\r\n .attr({disabled:'disabled'});\r\n }\r\n });\r\n \r\n $scope.$on('destroy', function(){\r\n list();\r\n });\r\n\r\n }\r\n };\r\n return dir;\r\n });\r\n})();\r\n","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdLineGraph', ['usSpinnerService', '$timeout',\r\n\r\n function (usSpinnerService, $timeout) {\r\n return {\r\n templateUrl: '/partials/common/directives/tdLineGraph.html',\r\n scope: {\r\n data: '=',\r\n labels: '=',\r\n series: '=',\r\n options: '='\r\n },\r\n link: function (scope, ele, attrs) {\r\n \r\n }\r\n };\r\n }\r\n ]);","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdLoading', ['usSpinnerService', '$timeout',\r\n\r\n function (usSpinnerService, $timeout) {\r\n var lastSpinnerKey = 1;\r\n\r\n return {\r\n templateUrl: '/partials/common/directives/tdLoading.html',\r\n scope: {\r\n tdLoading:'='\r\n },\r\n link: function (scope, ele, attrs) {\r\n var id = lastSpinnerKey++;\r\n scope.spinnerKey = 'tdloading-' + id;\r\n scope.showBlocker = attrs.showBlocker ? attrs.showBlocker : true;\r\n scope.showSpinner = attrs.showSpinner ? attrs.showSpinner : true;\r\n }\r\n };\r\n }\r\n ]);","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdNewLineGraph', ['usSpinnerService', '$timeout',\r\n\r\n function (usSpinnerService, $timeout) {\r\n return {\r\n template: '
',\r\n scope: {\r\n lineData: '=',\r\n options: '='\r\n },\r\n link: function (scope, elem, attrs) {\r\n scope.setGraph = function () {\r\n var ctx = elem.find('canvas')[0].getContext(\"2d\");\r\n var myBar = new window.Chart(ctx).Line(scope.lineData, scope.options);\r\n };\r\n\r\n scope.$watch('lineData', function (val) {\r\n if (val) {\r\n $timeout(function () {\r\n scope.setGraph();\r\n });\r\n }\r\n\r\n });\r\n }\r\n };\r\n }\r\n ]);","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdOptionList', ['usSpinnerService', '$timeout',\r\n\r\n function (usSpinnerService, $timeout) {\r\n return {\r\n templateUrl: '/partials/common/directives/tdOptionList.html',\r\n scope: {\r\n optionList: '='\r\n },\r\n link: function (scope, ele, attrs) {\r\n scope.optionSelected = function(option) {\r\n for (var i = 0; i < scope.optionList.length; i++) {\r\n if (option.id === scope.optionList[i].id) {\r\n scope.optionList[i].isSelected = true;\r\n } else {\r\n scope.optionList[i].isSelected = false;\r\n }\r\n }\r\n };\r\n }\r\n };\r\n }\r\n ]);","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdPageHeader', directiveFn);\r\n\r\n directiveFn.$inject = [];\r\n function directiveFn() {\r\n var directive = {\r\n restrict:'E',\r\n scope:{},\r\n replace:true,\r\n transclude:true,\r\n template:\r\n '
' +\r\n '
'+\r\n '

' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n scope.headingText = attr.header;\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","\"use strict\";\r\n\r\n/*\r\n bind template to popover\r\n*/\r\n\r\nangular.module('pt.directives')\r\n.directive('tdPopover', [\r\n '$compile',\r\n function ($compile) {\r\n return {\r\n scope: {\r\n tdPopover: '=',\r\n scopeHelper: '=' \r\n },\r\n\r\n link: function (scope, element, attrs) {\r\n var options;\r\n var visible = false;\r\n var touched = false;\r\n\r\n var closeTouchPopOver = function(){\r\n element.popover('hide');\r\n visible = false;\r\n touched = false;\r\n };\r\n\r\n function onEnter(e) {\r\n if (!visible) {\r\n element.popover('show');\r\n visible = true;\r\n touched = false;\r\n }\r\n }\r\n\r\n function onLeave(e) {\r\n if (visible && !touched) {\r\n element.popover('hide');\r\n }\r\n }\r\n\r\n function onTouchStart(e) {\r\n if (visible && touched) {\r\n closeTouchPopOver();\r\n } else {\r\n element.popover('show');\r\n touched = true;\r\n visible = true;\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n function onClick(e) {\r\n if (touched) {\r\n // do nothing. already handled by onTouchStart\r\n } else if (visible) {\r\n element.popover('hide');\r\n visible = false;\r\n } else {\r\n element.popover('show');\r\n visible = true;\r\n }\r\n }\r\n\r\n function onHidden(e) {\r\n visible = false;\r\n touched = false;\r\n }\r\n\r\n angular.element('html').on('touchstart', function(e){\r\n if(visible && touched){\r\n closeTouchPopOver();\r\n }\r\n });\r\n\r\n scope.$watch('tdPopover', function () {\r\n var tpl = '

';\r\n\r\n // this is a work-around for a bootstrap popover bug see : https://github.com/twbs/bootstrap/issues/13696\r\n if (scope.tdPopover && scope.tdPopover.placement && (scope.tdPopover.placement === 'top')) {\r\n tpl = '

';\r\n }\r\n\r\n options = {\r\n trigger: scope.tdPopover && scope.tdPopover.trigger ? scope.tdPopover.trigger : 'manual',\r\n html: scope.tdPopover && scope.tdPopover.html ? scope.tdPopover.html : false,\r\n placement: scope.tdPopover && scope.tdPopover.placement ? scope.tdPopover.placement : 'top',\r\n content: function () {\r\n var compliedContent;\r\n scope.$apply(function () {\r\n compliedContent = $compile(scope.tdPopover.content)(scope.scopeHelper);\r\n });\r\n return compliedContent;\r\n },\r\n template: tpl\r\n };\r\n \r\n if (scope.tdPopover && scope.tdPopover.container) {\r\n options.container = scope.tdPopover.container;\r\n }\r\n \r\n if (scope.tdPopover && (!scope.tdPopover.trigger || scope.tdPopover.trigger == 'manual')) {\r\n // show popover using the following rules:\r\n // - Popover shows on hover or click\r\n // - If shown by hover, then click or move mouse away will dismiss it\r\n // - If shown by touch, then only touch will dismiss it\r\n // This should cover both desktop and mobile cases without making any assumptions as to the device capabilities.\r\n element.on('mouseenter', onEnter);\r\n element.on('mouseleave', onLeave);\r\n element.on('touchstart', onTouchStart);\r\n element.on('click', onClick);\r\n element.on('hide.bs.popover', onHidden);\r\n }\r\n\r\n element.popover(options);\r\n\r\n if (scope.tdPopover) {\r\n scope.tdPopover.dismissPopover = function () {\r\n element.popover('hide');\r\n };\r\n }\r\n });\r\n } \r\n };\r\n }\r\n]);","\"use strict\";\r\nangular.module('pt.directives')\r\n.directive('tdScrollTo', function(){\r\n var dir = {\r\n scope:{\r\n trigger:\"@\"\r\n },\r\n link:function($scope, el, attrs){\r\n\r\n var trglstn = $scope.$watch('trigger', function(val){\r\n\r\n if(val && val === 'true'){\r\n var top = $(el).position().top;\r\n $(el).parent().parent().scrollTop(top);\r\n $scope.trigger = false;\r\n }\r\n });\r\n\r\n $scope.$on('destroy', function(){\r\n trglstn();\r\n });\r\n\r\n }\r\n };\r\n return dir;\r\n});","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdSectionHeader', directiveFn);\r\n\r\n directiveFn.$inject = [];\r\n function directiveFn() {\r\n var directive = {\r\n restrict:'E',\r\n scope: {\r\n headerText: '@' \r\n },\r\n replace:true,\r\n transclude:true,\r\n template: '
' +\r\n '
' +\r\n '
',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdShowPopoverForLargeWidth', ['usSpinnerService', '$timeout',\r\n\r\n function (usSpinnerService, $timeout) {\r\n return {\r\n templateUrl: '/partials/common/directives/tdShowPopoverForLargeWidth.html',\r\n scope: {\r\n options: '=',\r\n scopeHelper: '=',\r\n isParentCollapsed: '=',\r\n rowData: '@',\r\n description: '='\r\n },\r\n link: function (scope, ele, attrs) {\r\n scope.isOverFlowing = scope.description.length > 80;\r\n }\r\n };\r\n }\r\n ]);","\"use strict\";\r\nangular.module('pt.directives')\r\n .constant('tdTimepickerConfig', {\r\n hourStep: 1,\r\n minuteStep: 1,\r\n showMeridian: true,\r\n meridians: ['AM', 'PM'],\r\n readonlyInput: false,\r\n mousewheel: true\r\n })\r\n .directive('tdTimePicker', ['$window', '$filter', 'tdTimepickerConfig', '$parse',\r\n function ($window, $filter, tdTimepickerConfig, $parse) {\r\n return {\r\n restrict: 'EA',\r\n require: 'ngModel',\r\n replace: true,\r\n templateUrl: '/partials/common/directives/tdTimePicker.html',\r\n scope: {\r\n model: '=ngModel'\r\n },\r\n link: function (scope, element, attrs, ngModelCtrl) {\r\n var selected = new Date(),\r\n meridians = tdTimepickerConfig.meridians,\r\n timeRegex = /^([0-2]\\d):([0-5]\\d)$/;\r\n\r\n selected.setHours(9);\r\n selected.setMinutes(0);\r\n scope.validHours = true;\r\n scope.validMinutes = true;\r\n scope.meridian = meridians[0];\r\n var hourStep = tdTimepickerConfig.hourStep;\r\n if (attrs.hourStep) {\r\n scope.$parent.$watch($parse(attrs.hourStep), function (value) {\r\n hourStep = parseInt(value, 10);\r\n });\r\n }\r\n\r\n var minuteStep = tdTimepickerConfig.minuteStep;\r\n if (attrs.minuteStep) {\r\n scope.$parent.$watch($parse(attrs.minuteStep), function (value) {\r\n minuteStep = parseInt(value, 10);\r\n });\r\n }\r\n\r\n if (attrs.minTime !== undefined) {\r\n scope.$parent.$watch($parse(attrs.minTime), function (value) {\r\n var match = value.match(timeRegex);\r\n if (match) {\r\n scope.minHour = parseInt(match[1], 10);\r\n scope.minMins = parseInt(match[2], 10);\r\n }\r\n });\r\n }\r\n\r\n if (attrs.maxTime !== undefined) {\r\n scope.$parent.$watch($parse(attrs.maxTime), function (value) {\r\n var match = value.match(timeRegex);\r\n if (match) {\r\n scope.maxHour = parseInt(match[1], 10);\r\n scope.maxMins = parseInt(match[2], 10);\r\n }\r\n });\r\n }\r\n\r\n function pad(value) {\r\n return (angular.isDefined(value) && value.toString().length < 2) ? '0' + value : value;\r\n }\r\n\r\n // 12H / 24H mode\r\n scope.showMeridian = tdTimepickerConfig.showMeridian;\r\n if (attrs.showMeridian) {\r\n scope.$parent.$watch($parse(attrs.showMeridian), function (value) {\r\n scope.showMeridian = !!value;\r\n if (scope.model !== null && scope.model !== undefined) {\r\n refreshTemplate();\r\n }\r\n });\r\n }\r\n\r\n // Get scope.hours in 24H mode if valid\r\n function getScopeHours() {\r\n var hours = parseInt(scope.hours, 10);\r\n var valid = (scope.showMeridian) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24);\r\n if (!valid) {\r\n return;\r\n }\r\n\r\n if (scope.showMeridian) {\r\n if (hours === 12) {\r\n hours = 0;\r\n }\r\n if (scope.meridian === meridians[1]) {\r\n hours = hours + 12;\r\n }\r\n }\r\n return hours;\r\n }\r\n\r\n function checkRange() {\r\n var hours = getScopeHours();\r\n var mins = parseInt(scope.minutes, 10);\r\n\r\n if (scope.minHour !== undefined && (hours < scope.minHour || (hours === scope.minHour && mins < scope.minMins))) {\r\n if (!scope.model) {\r\n scope.model = new Date(selected);\r\n }\r\n scope.model.setHours(scope.minHour);\r\n scope.model.setMinutes(scope.minMins);\r\n return true;\r\n }\r\n\r\n if (scope.maxHour !== undefined && (hours > scope.maxHour || (hours === scope.maxHour && mins < scope.maxMins))) {\r\n if (!scope.model) {\r\n scope.model = new Date(selected);\r\n }\r\n scope.model.setHours(scope.maxHour);\r\n scope.model.setMinutes(scope.maxMins);\r\n return true;\r\n }\r\n }\r\n\r\n // Input elements\r\n var inputs = element.find('input');\r\n var hoursInputEl = inputs.eq(0), minutesInputEl = inputs.eq(1);\r\n\r\n // Respond on mousewheel spin\r\n var mousewheel = (angular.isDefined(attrs.mousewheel)) ? scope.$eval(attrs.mousewheel) : tdTimepickerConfig.mousewheel;\r\n if (mousewheel) {\r\n\r\n var isScrollingUp = function (e) {\r\n if (e.originalEvent) {\r\n e = e.originalEvent;\r\n }\r\n //pick correct delta variable depending on event\r\n var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY;\r\n return (e.detail || delta > 0);\r\n };\r\n\r\n hoursInputEl.bind('mousewheel wheel', function (e) {\r\n scope.$apply((isScrollingUp(e)) ? scope.incrementHours() : scope.decrementHours());\r\n e.preventDefault();\r\n });\r\n\r\n minutesInputEl.bind('mousewheel wheel', function (e) {\r\n scope.$apply((isScrollingUp(e)) ? scope.incrementMinutes() : scope.decrementMinutes());\r\n e.preventDefault();\r\n });\r\n }\r\n\r\n var keyboardChange = false;\r\n scope.readonlyInput = (angular.isDefined(attrs.readonlyInput)) ? scope.$eval(attrs.readonlyInput) : tdTimepickerConfig.readonlyInput;\r\n if (!scope.readonlyInput) {\r\n scope.updateHours = function () {\r\n if (scope.hours) {\r\n var hours = getScopeHours();\r\n\r\n if (angular.isDefined(hours)) {\r\n keyboardChange = 'h';\r\n if (!scope.model) {\r\n scope.model = new Date(selected);\r\n }\r\n scope.model.setHours(hours);\r\n } else {\r\n scope.model = null;\r\n scope.validHours = false;\r\n }\r\n }\r\n else {\r\n scope.model = null;\r\n }\r\n };\r\n\r\n hoursInputEl.bind('blur', function (e) {\r\n scope.$apply(function () {\r\n if (scope.validHours && scope.hours) {\r\n if (checkRange()) return;\r\n\r\n if (scope.hours < 10) {\r\n scope.hours = pad(scope.hours);\r\n }\r\n\r\n scope.model = new Date(selected);\r\n return;\r\n }\r\n\r\n if (!scope.validHours || !scope.hours) {\r\n scope.minutes = undefined;\r\n scope.hours = undefined;\r\n }\r\n });\r\n });\r\n\r\n scope.updateMinutes = function () {\r\n var minutes = parseInt(scope.minutes, 10);\r\n if (minutes >= 0 && minutes < 60) {\r\n keyboardChange = 'm';\r\n if (!scope.model) {\r\n scope.model = new Date(selected);\r\n }\r\n scope.model.setMinutes(minutes);\r\n } else {\r\n scope.model = null;\r\n if (!minutes) {\r\n scope.validMinutes = true;\r\n }\r\n else {\r\n scope.validMinutes = false;\r\n }\r\n }\r\n };\r\n\r\n minutesInputEl.bind('blur', function (e) {\r\n scope.$apply(function () {\r\n if (scope.validMinutes && scope.minutes) {\r\n if (checkRange()) return;\r\n\r\n if (scope.minutes < 10) {\r\n scope.minutes = pad(scope.minutes);\r\n }\r\n\r\n scope.model = new Date(selected);\r\n return;\r\n }\r\n if (!scope.validMinutes || !scope.minutes) {\r\n scope.minutes = undefined;\r\n scope.hours = undefined;\r\n }\r\n });\r\n });\r\n } else {\r\n scope.updateHours = angular.noop;\r\n scope.updateMinutes = angular.noop;\r\n }\r\n\r\n scope.$watch(function getModelTimestamp() {\r\n return +scope.model;\r\n }, function (timestamp) {\r\n if (!isNaN(timestamp)) {\r\n selected = new Date(timestamp);\r\n refreshTemplate();\r\n }\r\n });\r\n\r\n function refreshTemplate() {\r\n var hours = selected.getHours();\r\n if (scope.showMeridian) {\r\n // Convert 24 to 12 hour system\r\n hours = (hours === 0 || hours === 12) ? 12 : hours % 12;\r\n }\r\n scope.hours = (keyboardChange === 'h') ? hours : pad(hours);\r\n scope.validHours = true;\r\n\r\n var minutes = selected.getMinutes();\r\n scope.minutes = (keyboardChange === 'm') ? minutes : pad(minutes);\r\n scope.validMinutes = true;\r\n\r\n scope.meridian = (scope.showMeridian) ? ((selected.getHours() < 12) ? meridians[0] : meridians[1]) : '';\r\n\r\n keyboardChange = false;\r\n }\r\n\r\n function addMinutes(minutes) {\r\n var dt = new Date(selected.getTime() + minutes * 60000);\r\n\r\n var hours = dt.getHours();\r\n var mins = dt.getMinutes();\r\n\r\n if (scope.minHour !== undefined) {\r\n if (hours < scope.minHour || (hours === scope.minHour && mins < scope.minMins)) {\r\n hours = scope.minHour;\r\n mins = scope.minMins;\r\n }\r\n }\r\n\r\n if (scope.maxHour !== undefined) {\r\n if (hours > scope.maxHour || (hours === scope.maxHour && mins > scope.maxMins)) {\r\n hours = scope.maxHour;\r\n mins = scope.maxMins;\r\n }\r\n }\r\n\r\n selected.setHours(hours);\r\n selected.setMinutes(mins);\r\n scope.model = new Date(selected);\r\n }\r\n\r\n scope.incrementHours = function () {\r\n addMinutes(hourStep * 60);\r\n };\r\n scope.decrementHours = function () {\r\n addMinutes(-hourStep * 60);\r\n };\r\n scope.incrementMinutes = function () {\r\n addMinutes(minuteStep);\r\n };\r\n scope.decrementMinutes = function () {\r\n addMinutes(-minuteStep);\r\n };\r\n scope.toggleMeridian = function () {\r\n addMinutes(12 * 60 * ((selected.getHours() < 12) ? 1 : -1));\r\n };\r\n }\r\n };\r\n }\r\n ]);\r\n\r\n","\"use strict\";\r\nangular.module('pt.directives')\r\n\r\n .directive('tdWorkFlowStatus', ['usSpinnerService', '$timeout',\r\n\r\n function (usSpinnerService, $timeout) {\r\n return {\r\n templateUrl: '/partials/common/directives/tdWorkFlowStatus.html',\r\n scope: {\r\n statusList: '=',\r\n currentStatus: '='\r\n },\r\n link: function (scope, ele, attrs) {\r\n for (var i = 0; i < scope.statusList.length; i++) {\r\n if (scope.currentStatus && scope.currentStatus.toLowerCase() === scope.statusList[i].status && i > 0) {\r\n scope.statusList = setStatus(i, scope.statusList);\r\n }\r\n }\r\n\r\n function setStatus(len, list) {\r\n for (var j = len ; j >= 0; j--) {\r\n if (len < list.length) {\r\n list[j].isEmpty = false;\r\n if (j > 0) {\r\n list[j - 1].color = 'grey';\r\n }\r\n }\r\n }\r\n\r\n return list;\r\n }\r\n }\r\n };\r\n }\r\n ]);","(function () {\r\n /* Setup the resource registrations for this module */\r\n \"use strict\";\r\n\r\n angular.module('pt.controllers').run([\r\n 'resourceFactory',\r\n function (resourceFactory) {\r\n resourceFactory\r\n .register('TenantDocuments','/Tenancies/DMSDocuments/:action',\r\n { },\r\n {})\r\n\r\n .register('OwnerDocuments', '/Owners/DMSDocuments/:action',\r\n {},\r\n {});\r\n\r\n }\r\n ]);\r\n\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.filters')\r\n .filter('tdFileSize', filterFn);\r\n\r\n filterFn.$inject = [];\r\n function filterFn() {\r\n return function(text) {\r\n return filesize(text, {base:10});\r\n };\r\n }\r\n\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.filters')\r\n .filter('tdPercentage', filterFn);\r\n\r\n filterFn.$inject = ['$filter'];\r\n function filterFn($filter) {\r\n return function (input, decimals) {\r\n return $filter('number')(input * 100, decimals) + '%';\r\n };\r\n }\r\n\r\n})();\r\n","(function(){\r\n /* Setup the resource registrations for this module */\r\n \"use strict\";\r\n\r\n angular.module('pt.controllers').run([\r\n 'resourceFactory',\r\n function (resourceFactory) {\r\n resourceFactory\r\n .register('maintenanceRequest', '/MaintenanceRequests/:CompanyReference/:ContactReference/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference:'@ContactReference' }, \r\n {\r\n create: { method: 'POST', params: { action: '' } },\r\n })\r\n .register('viewContact', '/MaintenanceRequests/:CompanyReference/:MaintenanceRequestReference/:action',\r\n { CompanyReference: '@CompanyReference', MaintenanceRequestReference: '@MaintenanceRequestReference' },\r\n {\r\n getOwnerContact: { method: 'GET', params: { action: 'GetOwnerContact' } },\r\n })\r\n .register('viewMaintenanceRequest', '/MaintenanceRequests/:CompanyReference/:ContactReference/:MaintenanceRequestReference/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', MaintenanceRequestReference: '@MaintenanceRequestReference' },\r\n {\r\n getMaintenanceRequest: { method: 'GET', params: { action: '' } },\r\n uploadMaintenanceJobAttachment: { method: 'POST', params: { action: 'UploadJobAttachments' } },\r\n approveRequest: { method: 'POST', params: { action: 'ApproveRequest' } },\r\n });\r\n\r\n }\r\n ]);\r\n\r\n})();","/* Setup the resource registrations for this module */\r\n\r\n\"use strict\";\r\n\r\nangular.module('pt.controllers').run([\r\n 'resourceFactory',\r\n function (resourceFactory) {\r\n resourceFactory\r\n .register('messages', '/messages/:id/:action', { id: '@id' }, {\r\n reply: { method: 'POST', params: { action: 'Reply' } },\r\n compose: { method: 'POST', params: { action: 'Compose' } },\r\n searchThreads: { method: 'GET', params: { action: 'SearchThreads' } },\r\n getThreads: { method: 'GET', isArray: true, params: { action: 'Threads' } },\r\n getThreadDetails: { method: 'GET', params: { action: 'ThreadDetails' } },\r\n getContacts: { method: 'GET', isArray: true, params: { action: 'Contacts' } },\r\n getMessages: { method: 'GET', isArray: true, params: { action: 'Messages' } },\r\n getUnreadMessageCount: { method: 'GET', params: { action: 'GetUnreadMessageCount' } },\r\n totalUnreadMessageCount: { method: 'POST', params: { action: 'TotalUnreadMessageCount' } },\r\n validateAttachment: { method: 'POST', params: { action: 'ValidateAttachment' } },\r\n validateAttachments: { method: 'POST', params: { action: 'ValidateAttachments' } },\r\n isMessagesSwitchedOff: { method: 'GET', params: { action: 'IsMessagesSwitchedOff' } }\r\n });\r\n }\r\n]);\r\n","/* Setup the resource registrations for this module */\r\n\"use strict\";\r\nangular.module('pt.controllers').run([\r\n 'resourceFactory',\r\n function (resourceFactory) {\r\n resourceFactory\r\n .register('ownerstatements',\r\n '/statements/OwnerStatements/:CompanyReference/:ContactReference/:OwnerReference/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', OwnerReference: '@OwnerReference' },\r\n {})\r\n .register('incomeexpenditurestatements',\r\n '/statements/IncomeExpenditureStatements/:CompanyReference/:ContactReference/:OwnerReference/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', OwnerReference: '@OwnerReference' },\r\n {})\r\n .register('owners',\r\n '/owners/:CompanyReference/:ContactReference/:OwnerReference/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', OwnerReference: '@OwnerReference' }, {\r\n ledgerReport: { method: 'GET', params: { action: 'LedgerReport' } },\r\n rentHistory: { method: 'GET', isArray: true, params: { action: 'RentChangeHistory' } },\r\n maintenanceRequests: { method: 'GET', isArray: true, params: { action: 'maintenanceRequests' } }\r\n });\r\n }\r\n]);\r\n","'use strict';\r\nangular.module('pt.services')\r\n .factory('enums', [\r\n '$rootScope',\r\n function ($rootScope) {\r\n return {\r\n MaintenanceOwnerApprovalOption: {\r\n genericEnum: {\r\n Approve: 1,\r\n OwnerAttending: 2,\r\n Reject: 3,\r\n MoreInfoRequired: 4\r\n },\r\n displayEnum: {\r\n Approve: { id: 1, optionText: 'I approve this request' },\r\n OwnerAttending: { id: 2, optionText: 'I will attend to this request myself' },\r\n Reject: { id: 3, optionText: 'I do not wish to proceed with this request' },\r\n MoreInfoRequired: { id: 4, optionText: 'I need more information' }\r\n },\r\n displayEnumList: [{ id: 1, optionText: 'I approve this request' },\r\n { id: 2, optionText: 'I will attend to this request myself' },\r\n { id: 3, optionText: 'I do not wish to proceed with this request' },\r\n { id: 4, optionText: 'I need more information' }]\r\n }\r\n };\r\n }\r\n ]);","'use strict';\r\nangular.module('pt.services')\r\n .factory('flash', [\r\n '$rootScope',\r\n function ($rootScope) { \r\n return {\r\n success: function (message) {\r\n var flash = { message: message, level: 'success' }; \r\n $rootScope.$broadcast('flash', flash);\r\n },\r\n\r\n info: function (message) {\r\n var flash = { message: message, level: 'info' };\r\n $rootScope.$broadcast('flash', flash);\r\n },\r\n\r\n error: function (message) {\r\n var flash = { message: message, level: 'error' };\r\n $rootScope.$broadcast('flash', flash);\r\n } \r\n };\r\n }\r\n ]);","\"use strict\";\r\n\r\nangular.module('pt.services')\r\n .factory('resourceFactory', [\r\n '$resource', \r\n '$window',\r\n function ($resource, $window) {\r\n\r\n function createApiResource(url, params, actions) {\r\n\r\n var defaultActions = {\r\n remove: { method: 'DELETE' },\r\n create: { method: 'POST' },\r\n update: { method: 'PUT' }\r\n };\r\n\r\n if (ng.isObject(actions)) {\r\n ng.extend(defaultActions, actions);\r\n }\r\n\r\n return $resource(PTConfig.APP_API_BASE_URL + url, params, defaultActions);\r\n }\r\n\r\n var ng = angular;\r\n\r\n var registrations = {};\r\n var resourceFactory = {\r\n create: function (name) {\r\n if (!registrations.hasOwnProperty(name))\r\n throw new IllegalArgumentException('Cannot create a resource using the provided name');\r\n return registrations[name]();\r\n },\r\n register: function (name, url, params, actions) {\r\n\r\n // registers a factory method so that not instantiated until requested.\r\n registrations[name] = function () {\r\n return createApiResource(url, params, actions);\r\n };\r\n\r\n return this; // chainable\r\n }\r\n };\r\n\r\n return resourceFactory;\r\n }\r\n ]);","\"use strict\";\r\nangular.module('pt.services')\r\n .factory('shell', [\r\n 'flash',\r\n '$rootScope',\r\n '$location',\r\n '$window',\r\n '$uibModal',\r\n 'resourceFactory', \r\n\r\n function (flash, $rootScope, $location, $window, $uibModal,resourceFactory) {\r\n var msgBoxTemplate = \"
\\n\" +\r\n \"\t{{ title }}\\n\" +\r\n \"
\\n\" +\r\n \"
\\n\" +\r\n \"\t

{{ message }}

\\n\" +\r\n \"
\\n\" +\r\n \"
\\n\" +\r\n \"\t
\\n\" +\r\n \"
\\n\" +\r\n \"
\\n\" +\r\n \"\t\\n\" +\r\n \"
\\n\" + \"\";\r\n\r\n var dialogStack = [];\r\n\r\n function trackDialog(dlg) {\r\n dialogStack.push(dlg);\r\n dlg.result.then(function (val) {\r\n var prevDlg;\r\n\r\n if (dialogStack.length > 1) {\r\n prevDlg = dialogStack[dialogStack.length - 2];\r\n }\r\n dialogStack.pop();\r\n });\r\n }\r\n\r\n function promptLocationChange(event) {\r\n if (event.defaultPrevented || event.__pt_alreadyPrompted) return;\r\n\r\n // stops multiple prompts for the same event.\r\n event.__pt_alreadyPrompted = true;\r\n\r\n if (dialogStack.length > 0) {\r\n if (!$window.confirm(\"Are you sure you want to cancel the dialog and leave this page?\")) {\r\n event.preventDefault();\r\n }\r\n else {\r\n for (var i = dialogStack.length - 1; i >= 0; i--) {\r\n var dlg = dialogStack[i];\r\n dlg.close();\r\n }\r\n }\r\n } else {\r\n if (!$window.confirm(\"Are you sure you want to leave this page?\")) {\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n function getMsgBox(title, message, buttonDefinition, allowHtml) {\r\n var msgBoxOption = {\r\n template: msgBoxTemplate,\r\n controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) {\r\n $scope.title = title;\r\n $scope.message = message;\r\n $scope.buttons = buttonDefinition;\r\n $scope.allowHtml = allowHtml;\r\n $scope.close = function (val) {\r\n $uibModalInstance.close(val);\r\n };\r\n }]\r\n };\r\n var dlg = $uibModal.open(msgBoxOption);\r\n trackDialog(dlg);\r\n return dlg;\r\n }\r\n\r\n //$rootScope.$on('$locationChangeStart', function (event, next, current) {\r\n // if (dialogStack.length > 0) {\r\n // promptLocationChange(event);\r\n // }\r\n //});\r\n\r\n return {\r\n /**\r\n * Set the title of the shell\r\n */\r\n setTitle: function (title) {\r\n $rootScope.pageTitle = title;\r\n },\r\n\r\n flash: flash,\r\n\r\n /**\r\n * Creates a modal editor dialog\r\n */\r\n\r\n createDialog: function (opts) {\r\n opts.backdrop = 'static';\r\n opts.keyboard = false;\r\n var dlg = $uibModal.open(opts);\r\n trackDialog(dlg);\r\n return dlg;\r\n },\r\n\r\n /**\r\n * Creates a modal confirmation box\r\n */\r\n confirmBox: function (title, message, btns, allowHtml) {\r\n var buttonDefinition = [{ result: 'cancel', label: 'Cancel' }, { result: 'ok', label: 'OK', cssClass: 'primary' }];\r\n if (btns !== undefined) {\r\n if (angular.isArray(btns)) {\r\n buttonDefinition = btns;\r\n } else if (btns === \"YesNo\") {\r\n buttonDefinition = [{ result: 'no', label: 'No' }, { result: 'yes', label: 'Yes', cssClass: 'primary' }];\r\n }\r\n }\r\n\r\n return getMsgBox(title, message, buttonDefinition, allowHtml);\r\n },\r\n\r\n /**\r\n * Creates a modal message box\r\n */\r\n messageBox: function (title, message, allowHtml) {\r\n var buttonDefinition = [{ result: 'ok', label: 'OK', cssClass: 'pull-right' }];\r\n return getMsgBox(title, message, buttonDefinition, allowHtml);\r\n },\r\n\r\n /**\r\n * Prompts the user if they want to navigate away\r\n */\r\n promptLocationChange: promptLocationChange,\r\n\r\n back: function () {\r\n $window.history.back();\r\n },\r\n\r\n };\r\n }\r\n ]);\r\n\r\n\r\n","/* Setup the resource registrations for this module */\r\n\r\n\"use strict\";\r\n\r\nangular.module('pt.controllers').run([\r\n 'resourceFactory',\r\n function (resourceFactory) {\r\n resourceFactory\r\n .register('tenancies',\r\n '/tenancies/:CompanyReference/:ContactReference/:TenancyReference/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', TenancyReference: '@TenancyReference' }, {\r\n receipts: { method: 'GET', isArray: true, params: { action: 'Receipts' } },\r\n ledgerReport: { method: 'GET', params: { action: 'LedgerReport' } },\r\n invoices: { method: 'GET', isArray: true, params: { action: 'Invoices' } },\r\n list: { method:'GET', isArray:true },\r\n maintenanceRequests: { method:'GET', isArray:true, params: { action: 'maintenanceRequests' } }\r\n })\r\n .register('inspections',\r\n '/inspections/:CompanyReference/:ContactReference/:InspectionId/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', InspectionId: '@InspectionId' }, {\r\n getInspection: { method: 'GET', params: { } },\r\n proposeNewTime: { method: 'POST', params: { action: 'Propose'} },\r\n updateStatus: { method: 'POST', params: { action: 'Confirm'} },\r\n })\r\n .register('inspection',\r\n '/inspections/:CompanyReference/:ContactReference/:ProfileReference/:action',\r\n { CompanyReference: '@CompanyReference', ContactReference: '@ContactReference', ProfileReference: '@ProfileReference' }, {\r\n getInspectionByEntityID: { method: 'GET', isArray: true, params: { action: 'Inspection'} },\r\n });\r\n }\r\n]);\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('homeCtrl', ['$scope', '$rootScope', '$http', 'resourceFactory', 'usSpinnerService', '$state', '$window', '$anchorScroll', '$timeout', function ($scope, $rootScope, $http, resourceFactory, usSpinnerService, $state, $window, $anchorScroll, $timeout) {\r\n /* \r\n -------------------------------------------------------------------------------------------------------------------------\r\n COMMON\r\n -------------------------------------------------------------------------------------------------------------------------\r\n */\r\n\r\n var dashboardapi = resourceFactory.create('dashboard');\r\n var companyFeatureAPI = resourceFactory.create('companyFeature');\r\n $scope.oneAtATime = true;\r\n $scope.spinneractive = false;\r\n $scope.username = $rootScope.user.Name;\r\n $scope.model = {};\r\n $scope.propertyStatus = {\r\n openPropertyDetails: true,\r\n openManagementDetails: false\r\n };\r\n\r\n $scope.tenancyStatus = {\r\n openPropertyDetails: true,\r\n openManagementDetails: false\r\n };\r\n\r\n $scope.selectedTab = '';\r\n $scope.multipleTabs = false;\r\n $scope.propertiesSpinnerStatus = false;\r\n $scope.tenacySpinnerStatus = false;\r\n $scope.companyFeatures = [];\r\n\r\n var popoverTemplate = '
You have paid up to the {{tenancyDetails.EffectivePaidTo}}.
' + '
You have paid rent up to {{tenancyDetails.EffectivePaidTo}}, as well as an extra {{tenancyDetails.PartialDayCredit}} that does not cover a full day\\'s rent.
';\r\n\r\n $scope.loadDashBoardData = function () {\r\n $scope.dashboardSpinnerStatus = true;\r\n\r\n dashboardapi.query({}, function (data) {\r\n $scope.selectedProperty = null;\r\n $scope.dashBoard = data;\r\n $scope.properties = data[0].Properties;\r\n $scope.tenancies = data[0].Tenancies;\r\n $scope.propertySnapshot = data[0].PropertySnapshot;\r\n $scope.model.inspectionDetails = data[0].Inspections.length > 0 ? data[0].Inspections[0] : null;\r\n if ($scope.model.inspectionDetails) {\r\n $scope.model.displayInspectionDate = $scope.model.inspectionDetails.ProposalStatus && $scope.model.inspectionDetails.ProposalStatus === 'TenantProposed' ? $scope.model.inspectionDetails.ClientInspectionDate : $scope.model.inspectionDetails.InspectionDate;\r\n $scope.model.displayInspectionTime = $scope.model.inspectionDetails.ProposalStatus && $scope.model.inspectionDetails.ProposalStatus === 'TenantProposed' ? $scope.model.inspectionDetails.ClientInspectionTime : $scope.model.inspectionDetails.InspectionTime;\r\n }\r\n\r\n if ($scope.properties.length > 0) {\r\n $scope.isOwner = true;\r\n }\r\n\r\n if ($scope.tenancies.length > 0) {\r\n $scope.isTenancy = true;\r\n }\r\n\r\n $scope.propertiesText = $scope.propertySnapshot.Properties === 1 ? 'Property' : 'Properties';\r\n $scope.tenanciesVacatingText = $scope.propertySnapshot.TenanciesVacating === 1 ? 'Tenancy Vacating' : 'Tenancies Vacating';\r\n $scope.tenancyInArrearsText = $scope.propertySnapshot.TenanciesInArrears === 1 ? 'Tenancy in Arrears' : 'Tenancies in Arrears';\r\n $scope.propertyVacanciesText = $scope.propertySnapshot.ProperyVacancies === 1 ? 'Property Vacancy' : 'Property Vacancies';\r\n\r\n $scope.multipleTabs = $scope.isOwner && $scope.isTenancy;\r\n\r\n $scope.dashboardSpinnerStatus = false;\r\n\r\n if ($scope.isOwner) {\r\n $scope.propertiesTabSelected();\r\n } else if ($scope.isTenancy) {\r\n $scope.tenancyTabSelected();\r\n }\r\n\r\n $scope.loadCompanyFeatures();\r\n\r\n }, function (error) {\r\n $scope.dashboardSpinnerStatus = false;\r\n });\r\n };\r\n\r\n\r\n\r\n /* \r\n -------------------------------------------------------------------------------------------------------------------------\r\n PROPERTIES TAB\r\n -------------------------------------------------------------------------------------------------------------------------\r\n */\r\n\r\n var propertiesapi = resourceFactory.create('properties');\r\n\r\n $scope.propertySelected = function (property) {\r\n $scope.selectedProperty = property;\r\n };\r\n\r\n $scope.hasMultipleProperties = function () {\r\n return ($scope.properties && $scope.properties.length > 1);\r\n };\r\n\r\n $scope.sendMessageOwner = function (managementId) {\r\n $state.go('shell.messageCompose', {\r\n profileType: 'owner',\r\n managementId: managementId\r\n });\r\n $anchorScroll.yOffset = 0;\r\n $anchorScroll();\r\n };\r\n\r\n $scope.loadProperty = function (property) {\r\n $scope.propertyDetails = null;\r\n\r\n if (!property) {\r\n return;\r\n }\r\n\r\n $scope.propertiesSpinnerStatus = true;\r\n\r\n var params = {\r\n CompanyReference: property.CompanyReference,\r\n ContactReference: property.ContactReference,\r\n PropertyReference: property.PropertyReference\r\n };\r\n propertiesapi.get(params, function (data) {\r\n $scope.propertiesSpinnerStatus = false;\r\n\r\n $scope.propertyDetails = data;\r\n }, function (error) {\r\n $scope.propertiesSpinnerStatus = false;\r\n });\r\n };\r\n\r\n $scope.$watch('selectedProperty', function (val) {\r\n $scope.loadProperty(val);\r\n });\r\n\r\n $scope.propertiesTabSelected = function () {\r\n if (!$scope.selectedProperty) {\r\n $scope.selectedProperty = $scope.properties[0];\r\n }\r\n\r\n $scope.selectedTab = 'owner';\r\n $rootScope.ownerTheme = true;\r\n };\r\n\r\n /*\r\n ------------------------------------------------------------------------------------------------------------------------\r\n Charts\r\n ------------------------------------------------------------------------------------------------------------------------\r\n */\r\n\r\n var today = new Date();\r\n $scope.fromDate = new Date(today.getFullYear() - 1, today.getMonth(), today.getDate() + 1);\r\n $scope.toDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\r\n $scope.maxFromDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\r\n $scope.maxToDate = $scope.maxFromDate;\r\n\r\n $scope.chart = {\r\n labels: [],\r\n series: ['Income', 'Expenses'],\r\n data: []\r\n };\r\n\r\n $scope.$on('create', function() {\r\n //$timeout(updateChart, 1000);\r\n });\r\n\r\n var monthNames = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\r\n \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\r\n\r\n function monthDiff(fromDate, toDate) {\r\n var months;\r\n months = (toDate.getFullYear() - fromDate.getFullYear()) * 12;\r\n months -= fromDate.getMonth();\r\n months += toDate.getMonth();\r\n return months;\r\n }\r\n\r\n $scope.loadIncomeExpenseGraph = function () {\r\n if ($scope.fromDate && $scope.toDate) {\r\n if ($scope.fromDate && $scope.toDate) {\r\n $scope.graphSpinnerStatus = true;\r\n dashboardapi.getIncomeExpenseGraph({ startDate: $scope.fromDate.toJSON(), endDate: $scope.toDate.toJSON() }, function (data) {\r\n $scope.model.graphData = data;\r\n $scope.allData = [];\r\n var graphData = $scope.model.graphData;\r\n\r\n for (var i = 0; i < graphData.length; i++) {\r\n var chart = { data: [], labels: [], series: ['Income', 'Expenses'] };\r\n chart.data = setData(graphData[i].GraphData);\r\n chart.labels = $scope.chart.labels;\r\n chart.options = setOptions(graphData[i].CurrencyCode);\r\n chart.currencyDisplay = graphData[i].CurrencyCode;\r\n $scope.allData.push(chart);\r\n }\r\n\r\n $scope.graphSpinnerStatus = false;\r\n }, function(error) {\r\n $scope.graphSpinnerStatus = false;\r\n });\r\n }\r\n } else {\r\n return;\r\n }\r\n \r\n \r\n };\r\n\r\n function setOptions(currency) {\r\n return {\r\n multiTooltipTemplate: function (label) { return label.datasetLabel + ': ' + currencySymbols[currency] + label.value.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"); },\r\n scaleLabel: function (label) { return ' ' + currencySymbols[currency] + label.value.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"); }\r\n };\r\n }\r\n \r\n function setData(graphData) {\r\n var totalMonths = monthDiff($scope.fromDate, $scope.toDate);\r\n var localIncome = [];\r\n var localExpense = [];\r\n var localLabel = [];\r\n var data = [];\r\n var labels = [];\r\n $scope.chart.labels = [];\r\n var localDate = new Date();\r\n for (var i = 0; i <= totalMonths; i++) {\r\n localIncome.push(0);\r\n localExpense.push(0);\r\n if (i === 0) {\r\n localDate = new Date($scope.fromDate.getFullYear(), $scope.fromDate.getMonth(), $scope.fromDate.getDate());\r\n } else if (i === totalMonths) {\r\n localDate = new Date($scope.toDate.getFullYear(), $scope.toDate.getMonth(), $scope.toDate.getDate());\r\n } else {\r\n localDate = new Date(localDate.getFullYear(), localDate.getMonth() + 1, 1);\r\n }\r\n\r\n localLabel.push({ month: monthNames[localDate.getMonth()], year: localDate.getFullYear() });\r\n labels.push(moment(new Date(localDate.toDateString())).format('MMM YYYY'));\r\n }\r\n\r\n for (var j = 0; j < localLabel.length; j++) {\r\n for (var k = 0; k < graphData.length; k++) {\r\n if (localLabel[j].month === monthNames[graphData[k].Month.getMonth()] && localLabel[j].year === graphData[k].Month.getFullYear()) {\r\n localIncome[j] = graphData[k].Income;\r\n localExpense[j] = graphData[k].Expense;\r\n }\r\n }\r\n }\r\n\r\n $scope.chart.labels = labels;\r\n data.push(localIncome);\r\n data.push(localExpense);\r\n\r\n return data;\r\n }\r\n\r\n var currencySymbols = {\r\n 'USD': '$', // US Dollar\r\n 'AUD': '$', // Australian Dollor\r\n 'NZD': '$', // New Zealand Dollor\r\n 'EUR': '€', // Euro\r\n 'CRC': '₡', // Costa Rican Colón\r\n 'GBP': '£', // British Pound Sterling\r\n 'ILS': '₪', // Israeli New Sheqel\r\n 'INR': '₹', // Indian Rupee\r\n 'JPY': '¥', // Japanese Yen\r\n 'KRW': '₩', // South Korean Won\r\n 'NGN': '₦', // Nigerian Naira\r\n 'PHP': '₱', // Philippine Peso\r\n 'PLN': 'zł', // Polish Zloty\r\n 'PYG': '₲', // Paraguayan Guarani\r\n 'THB': '฿', // Thai Baht\r\n 'UAH': '₴', // Ukrainian Hryvnia\r\n 'VND': '₫', // Vietnamese Dong\r\n };\r\n\r\n var fromTimeout,\r\n toTimeout,\r\n oldFromDate,\r\n oldToDate;\r\n\r\n $scope.$watch('fromDate', function (val) {\r\n if (val === undefined) {\r\n $scope.showFromDateText = true;\r\n } else {\r\n $scope.showFromDateText = false;\r\n }\r\n\r\n if (val) {\r\n oldFromDate = val;\r\n }\r\n delayFromInput(val);\r\n });\r\n\r\n $scope.$watch('toDate', function (val) {\r\n if (val === undefined) {\r\n $scope.showToDateText = true;\r\n } else {\r\n $scope.showToDateText = false;\r\n }\r\n\r\n if (val) {\r\n oldToDate = val;\r\n }\r\n delayToInput(val);\r\n });\r\n\r\n function delayFromInput(dateVal) {\r\n var tempVal = dateVal;\r\n if (fromTimeout) $timeout.cancel(fromTimeout);\r\n fromTimeout = $timeout(function () {\r\n var date = tempVal;\r\n if (date || oldFromDate) {\r\n $scope.loadIncomeExpenseGraph();\r\n }\r\n }, 3000);\r\n }\r\n\r\n function delayToInput(dateVal) {\r\n var tempVal = dateVal;\r\n if (toTimeout) $timeout.cancel(toTimeout);\r\n toTimeout = $timeout(function () {\r\n var date = tempVal;\r\n if (date || oldToDate) {\r\n $scope.loadIncomeExpenseGraph();\r\n }\r\n }, 3000);\r\n }\r\n\r\n\r\n /* \r\n -------------------------------------------------------------------------------------------------------------------------\r\n TENANCY TAB\r\n -------------------------------------------------------------------------------------------------------------------------\r\n */\r\n\r\n var tenancyapi = resourceFactory.create('tenancies');\r\n\r\n $scope.tenancySelected = function (tenancy) {\r\n $scope.selectedTenancy = tenancy;\r\n };\r\n\r\n $scope.hasMultipleTenancies = function () {\r\n return ($scope.tenancies && $scope.tenancies.length > 1);\r\n };\r\n\r\n $scope.sendMessageTenant = function (tenancyId) {\r\n $state.go('shell.messageCompose', {\r\n profileType: 'tenant',\r\n tenancyId: tenancyId\r\n });\r\n $anchorScroll.yOffset = 0;\r\n $anchorScroll();\r\n };\r\n\r\n $scope.loadTenancy = function (tenancy) {\r\n $scope.tenancyDetails = null;\r\n\r\n if (!tenancy) {\r\n return;\r\n }\r\n\r\n $scope.tenancySpinnerStatus = true;\r\n\r\n var params = {\r\n CompanyReference: tenancy.CompanyReference,\r\n ContactReference: tenancy.ContactReference,\r\n TenancyReference: tenancy.TenancyReference\r\n };\r\n\r\n tenancyapi.get(params, function (data) {\r\n $scope.tenancySpinnerStatus = false;\r\n $scope.tenancyDetails = data;\r\n }, function (error) {\r\n $scope.tenancySpinnerStatus = false;\r\n });\r\n };\r\n\r\n $scope.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#tenancyPopup',\r\n content: popoverTemplate,\r\n placement: 'top'\r\n }\r\n };\r\n\r\n $scope.popoverMobile = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#tenancyPopupMobile',\r\n content: popoverTemplate,\r\n placement: 'top'\r\n }\r\n };\r\n\r\n $scope.$watch('selectedTenancy', function (val) {\r\n $scope.loadTenancy(val);\r\n });\r\n\r\n $scope.tenancyTabSelected = function () {\r\n if (!$scope.selectedTenancy) {\r\n $scope.selectedTenancy = $scope.tenancies[0];\r\n }\r\n\r\n $scope.selectedTab = 'tenancy';\r\n $rootScope.ownerTheme = false;\r\n };\r\n\r\n /*\r\n ------------------------------------------------------------------------------------------------------------------------\r\n Company Features\r\n ------------------------------------------------------------------------------------------------------------------------\r\n */\r\n\r\n $scope.loadCompanyFeatures = function () {\r\n\r\n var params = {\r\n CompanyReference: $scope.isTenancy ? $scope.tenancy.CompanyReference : $scope.properties[0].CompanyReference,\r\n ContactReference: $scope.isTenancy ? $scope.tenancy.ContactReference : $scope.properties[0].ContactReference\r\n };\r\n\r\n companyFeatureAPI.get(params, function (data) {\r\n $scope.companyFeatures = data;\r\n $rootScope.companyFeatures = data;\r\n });\r\n\r\n };\r\n\r\n /* \r\n -------------------------------------------------------------------------------------------------------------------------\r\n COMMON\r\n -------------------------------------------------------------------------------------------------------------------------\r\n */\r\n\r\n if ($rootScope.user) {\r\n $scope.loadDashBoardData();\r\n }\r\n\r\n $rootScope.$on('UserLoggedIn', $scope.loadDashBoardData);\r\n\r\n\r\n /*\r\n ------------------------------------------------------------------------------------------------------------------------\r\n Inspections\r\n ------------------------------------------------------------------------------------------------------------------------\r\n */\r\n\r\n $scope.getClientTimeString = function () {\r\n if ($scope.model.inspectionDetails.InspectionTime) {\r\n var time = moment($scope.model.displayInspectionTime);\r\n var starTime = time.format(\"h:mm\");\r\n var startAmPm = time.format(\"A\") === 'AM' ? 'a.m' : 'p.m';\r\n\r\n var endTime = time.add($scope.model.inspectionDetails.Duration, 'minutes').format(\"h:mm\");\r\n var endAmPm = time.format(\"A\") === 'AM' ? 'a.m' : 'p.m';\r\n return starTime + ' ' + startAmPm + ' - ' + endTime + ' ' + endAmPm;\r\n }\r\n\r\n return '??:??';\r\n };\r\n\r\n $scope.$watch('model.displayInspectionTime', function (val) {\r\n if(val){\r\n $scope.displayTime = $scope.getClientTimeString();\r\n }\r\n });\r\n }]);\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('loginCtrl', ['$scope', '$stateParams', '$window', '$state', '$location', 'shell', '$rootScope', 'resourceFactory', function ($scope, $stateParams, $window, $state, $location, shell, $rootScope, resourceFactory) {\r\n\r\n var accountApi = resourceFactory.create('account');\r\n\r\n $scope.model = { };\r\n\r\n $scope.isInvited = $stateParams.invitation ? true : false;\r\n $scope.currentYear = new Date().getFullYear();\r\n\r\n if ($window.localStorage.lastLoggedInSource) {\r\n switch ($window.localStorage.lastLoggedInSource) {\r\n case 'google-oauth2':\r\n $scope.lastLoggedInSource = 'Google';\r\n break;\r\n case 'facebook':\r\n $scope.lastLoggedInSource = 'Facebook';\r\n break;\r\n case 'windowslive':\r\n $scope.lastLoggedInSource = 'Microsoft';\r\n break;\r\n case 'twitter':\r\n $scope.lastLoggedInSource = 'Twitter';\r\n break;\r\n case 'linkedin':\r\n $scope.lastLoggedInSource = 'LinkedIn';\r\n break;\r\n case 'propertytree':\r\n $scope.lastLoggedInSource = 'PropertyTree';\r\n break;\r\n }\r\n }\r\n\r\n $scope.aboutPage = function () {\r\n $scope.aboutClicked = true;\r\n };\r\n\r\n $scope.closeAbout = function () {\r\n $scope.aboutClicked = false;\r\n };\r\n\r\n $scope.socialLogin = function (connection) {\r\n var url = PTConfig.APP_API_BASE_URL + '/account/login/' + connection;\r\n if ($stateParams.invitation) {\r\n url = url + \"?Invitation=\" + $stateParams.invitation;\r\n } else if ($stateParams.returnUrl) {\r\n url = url + \"?ReturnUrl=\" + $stateParams.returnUrl;\r\n } else if ($stateParams.r) {\r\n url = url + \"?HelpGizmo=\" + $stateParams.r;\r\n }\r\n\r\n $window.location = url;\r\n };\r\n\r\n $scope.redirectTo = function (url) {\r\n $window.open(url);\r\n };\r\n\r\n $scope.login = function () {\r\n $scope.model.loginerror = false;\r\n $scope.model.loginbusy = true;\r\n\r\n accountApi.login({\r\n Email: $scope.model.email,\r\n Password: $scope.model.password,\r\n Invitation: $stateParams.invitation,\r\n ReturnUrl: $stateParams.returnUrl,\r\n HelpGizmo: $stateParams.r\r\n }, function (data) {\r\n $scope.model.loginbusy = false;\r\n\r\n if (data.Error) {\r\n $scope.model.loginerror = true;\r\n }\r\n else {\r\n $window.location = data.RedirectTo;\r\n }\r\n }, function (response) {\r\n $scope.model.loginbusy = false;\r\n $scope.model.loginerror = true;\r\n });\r\n };\r\n\r\n // Forgot Password dialog -----------------------\r\n\r\n var resetPasswordOpts = {\r\n templateUrl: '/partials/common/resetPassword.html',\r\n controller: 'resetPasswordCtrl',\r\n windowClass: 'animated ',\r\n size: 'md',\r\n };\r\n\r\n $scope.resetPassword = function () {\r\n var dlg = shell.createDialog(resetPasswordOpts);\r\n\r\n dlg.result.then(function (val) {\r\n if (val) {\r\n $window.location = val;\r\n }\r\n });\r\n };\r\n\r\n // Create Account dialog ------------------------\r\n\r\n var createAccountOpts = {\r\n templateUrl: '/partials/common/createAccount.html',\r\n controller: 'createAccountCtrl',\r\n windowClass: 'animated ',\r\n size: 'md',\r\n resolve: {\r\n invitation: function () {\r\n return $stateParams.invitation;\r\n }\r\n }\r\n };\r\n\r\n $scope.createAccount = function () {\r\n var dlg = shell.createDialog(createAccountOpts);\r\n\r\n dlg.result.then(function (val) {\r\n if (val) {\r\n $window.location = val;\r\n }\r\n });\r\n };\r\n\r\n // Cant login dialog ----------------------------\r\n\r\n var loginOpts = {\r\n templateUrl: '/partials/common/cantLoginDialog.html',\r\n controller: 'cantLoginCtrl',\r\n windowClass: 'animated ',\r\n size: 'md',\r\n resolve: {\r\n items: function () {\r\n return $scope.items;\r\n },\r\n type: function () {\r\n return \"\";\r\n }\r\n }\r\n };\r\n\r\n $scope.cantLogin = function () {\r\n var dlg = shell.createDialog(loginOpts);\r\n\r\n dlg.result.then(function (val) {\r\n });\r\n };\r\n\r\n // ----------------------------------------------\r\n\r\n if ($stateParams.cantLogin === 'true') {\r\n $scope.cantLogin();\r\n }\r\n\r\n }])\r\n .controller('cantLoginCtrl', ['$scope', '$uibModalInstance', 'items', 'type', 'resourceFactory', function ($scope, $uibModalInstance, items, type, resourceFactory) {\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n }])\r\n .controller('createAccountCtrl', ['$scope', '$uibModalInstance', 'resourceFactory', 'invitation', function ($scope, $uibModalInstance, resourceFactory, invitation) {\r\n var accountApi = resourceFactory.create('account');\r\n\r\n $scope.model = {\r\n busy: false\r\n };\r\n\r\n $scope.sendValidationCode = function () {\r\n if (!$scope.userDetailsForm.emailAddress.$valid) return;\r\n\r\n $scope.model.busy = true;\r\n\r\n accountApi.validateEmail({\r\n EmailAddress: $scope.model.emailAddress,\r\n }, function (data) {\r\n $scope.model.busy = false;\r\n }, function (response) {\r\n $scope.model.busy = false;\r\n });\r\n };\r\n\r\n $scope.save = function () {\r\n validateForm();\r\n\r\n if (!$scope.userDetailsForm.$valid) return;\r\n\r\n $scope.model.busy = true;\r\n\r\n accountApi.signup({\r\n EmailAddress: $scope.model.emailAddress,\r\n EmailValidationCode: $scope.model.validationCode,\r\n Password: $scope.model.password,\r\n GivenName: $scope.model.givenName,\r\n FamilyName: $scope.model.familyName,\r\n Invitation: invitation\r\n }, function (data) {\r\n $scope.model.busy = false;\r\n $uibModalInstance.close(data.RedirectTo);\r\n }, function (response) {\r\n $scope.model.busy = false;\r\n $scope.model.error = response.data;\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n function validateForm() {\r\n // Check all of the fields\r\n validateEmailAddress($scope.model.emailAddress);\r\n validateEmailValidationCode($scope.model.validationCode);\r\n validateGivenName($scope.model.givenName);\r\n validateFamilyName($scope.model.familyName);\r\n validatePassword($scope.model.password);\r\n validateConfirmPassword($scope.model.confirmPassword);\r\n }\r\n\r\n function validateRequired(field, newval) {\r\n var isValid = !!newval && newval.trim() !== '';\r\n field.$setValidity('required', isValid);\r\n return isValid;\r\n }\r\n\r\n function validateEmailAddress(newval) {\r\n\r\n validateRequired($scope.userDetailsForm.emailAddress, newval);\r\n }\r\n\r\n function validateEmailValidationCode(newval) {\r\n validateRequired($scope.userDetailsForm.validationCode, newval);\r\n }\r\n\r\n function validateGivenName(newval) {\r\n validateRequired($scope.userDetailsForm.givenName, newval);\r\n }\r\n\r\n function validateFamilyName(newval) {\r\n validateRequired($scope.userDetailsForm.familyName, newval);\r\n }\r\n\r\n function validatePassword(newval) {\r\n validateRequired($scope.userDetailsForm.password, newval);\r\n }\r\n\r\n function validateConfirmPassword(newval) {\r\n var hasValue = validateRequired($scope.userDetailsForm.confirmPassword, newval);\r\n $scope.userDetailsForm.confirmPassword.$setValidity('match', !hasValue || newval === $scope.model.password);\r\n }\r\n\r\n $scope.$watch('model.emailAddress', validateEmailAddress);\r\n $scope.$watch('model.validationCode', validateEmailValidationCode);\r\n $scope.$watch('model.givenName', validateGivenName);\r\n $scope.$watch('model.familyName', validateFamilyName);\r\n $scope.$watch('model.password', validatePassword);\r\n $scope.$watch('model.confirmPassword', validateConfirmPassword);\r\n }])\r\n .controller('resetPasswordCtrl', ['$scope', '$uibModalInstance', 'resourceFactory', function ($scope, $uibModalInstance, resourceFactory) {\r\n var accountApi = resourceFactory.create('account');\r\n\r\n $scope.model = {\r\n busy: false\r\n };\r\n\r\n $scope.sendValidationCode = function () {\r\n if (!$scope.userDetailsForm.emailAddress.$valid) return;\r\n\r\n $scope.model.busy = true;\r\n\r\n accountApi.validateEmail({\r\n EmailAddress: $scope.model.emailAddress,\r\n }, function (data) {\r\n $scope.model.busy = false;\r\n }, function (response) {\r\n $scope.model.busy = false;\r\n });\r\n };\r\n\r\n $scope.save = function () {\r\n validateForm();\r\n\r\n if (!$scope.userDetailsForm.$valid) return;\r\n\r\n $scope.model.busy = true;\r\n\r\n accountApi.resetPassword({\r\n EmailAddress: $scope.model.emailAddress,\r\n EmailValidationCode: $scope.model.validationCode,\r\n NewPassword: $scope.model.password\r\n }, function (data) {\r\n $scope.model.busy = false;\r\n $uibModalInstance.close(data.RedirectTo);\r\n }, function (response) {\r\n $scope.model.busy = false;\r\n $scope.model.error = response.data;\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n function validateForm() {\r\n // Check all of the fields\r\n validateEmailAddress($scope.model.emailAddress);\r\n validateEmailValidationCode($scope.model.validationCode);\r\n validatePassword($scope.model.password);\r\n validateConfirmPassword($scope.model.confirmPassword);\r\n }\r\n\r\n function validateRequired(field, newval) {\r\n var isValid = !!newval && newval.trim() !== '';\r\n field.$setValidity('required', isValid);\r\n return isValid;\r\n }\r\n\r\n function validateEmailAddress(newval) {\r\n\r\n validateRequired($scope.userDetailsForm.emailAddress, newval);\r\n }\r\n\r\n function validateEmailValidationCode(newval) {\r\n validateRequired($scope.userDetailsForm.validationCode, newval);\r\n }\r\n\r\n function validatePassword(newval) {\r\n validateRequired($scope.userDetailsForm.password, newval);\r\n }\r\n\r\n function validateConfirmPassword(newval) {\r\n var hasValue = validateRequired($scope.userDetailsForm.confirmPassword, newval);\r\n $scope.userDetailsForm.confirmPassword.$setValidity('match', !hasValue || newval === $scope.model.password);\r\n }\r\n\r\n $scope.$watch('model.emailAddress', validateEmailAddress);\r\n $scope.$watch('model.validationCode', validateEmailValidationCode);\r\n $scope.$watch('model.password', validatePassword);\r\n $scope.$watch('model.confirmPassword', validateConfirmPassword);\r\n }])\r\n .controller('updateAccountCtrl', ['$scope', '$uibModalInstance', 'resourceFactory', function ($scope, $uibModalInstance, resourceFactory) {\r\n var accountApi = resourceFactory.create('account');\r\n\r\n $scope.model = {\r\n busy: true\r\n };\r\n\r\n $scope.sendValidationCode = function () {\r\n if (!$scope.userDetailsForm.emailAddress.$valid) return;\r\n\r\n $scope.model.busy = true;\r\n\r\n accountApi.validateEmail({\r\n EmailAddress: $scope.model.emailAddress,\r\n }, function (data) {\r\n $scope.model.busy = false;\r\n }, function (response) {\r\n $scope.model.busy = false;\r\n });\r\n };\r\n\r\n $scope.save = function () {\r\n validateForm();\r\n\r\n if (!$scope.userDetailsForm.$valid) return;\r\n\r\n $scope.model.busy = true;\r\n\r\n accountApi.update({\r\n EmailAddress: $scope.model.oldEmailAddress,\r\n Password: $scope.model.oldPassword,\r\n NewEmailAddress: $scope.model.emailAddress,\r\n EmailValidationCode: $scope.model.validationCode,\r\n NewPassword: $scope.model.password,\r\n GivenName: $scope.model.givenName,\r\n FamilyName: $scope.model.familyName\r\n }, function (data) {\r\n $scope.model.busy = false;\r\n $uibModalInstance.close(true);\r\n }, function (response) {\r\n $scope.model.busy = false;\r\n $scope.model.error = response.data;\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n\r\n $scope.validationCodeRequired = function () {\r\n // only required when we change the email address\r\n var email = $scope.model.emailAddress;\r\n if (email !== null && email !== undefined) email = email.toLowerCase();\r\n var oldEmail = $scope.model.oldEmailAddress;\r\n if (oldEmail !== null && oldEmail !== undefined) oldEmail = oldEmail.toLowerCase();\r\n\r\n return oldEmail !== email;\r\n };\r\n\r\n $scope.passwordConfirmationRequired = function () {\r\n // only required when we change the password\r\n return !!$scope.model.password && $scope.model.password.trim() !== '';\r\n };\r\n\r\n function validateForm() {\r\n // Check all of the fields\r\n validateEmailAddress($scope.model.emailAddress);\r\n validateEmailValidationCode($scope.model.validationCode);\r\n validateGivenName($scope.model.givenName);\r\n validateFamilyName($scope.model.familyName);\r\n validateOldPassword($scope.model.oldPassword);\r\n validateConfirmPassword($scope.model.confirmPassword);\r\n }\r\n\r\n function validateRequired(field, newval) {\r\n var isValid = !!newval && newval.trim() !== '';\r\n field.$setValidity('required', isValid);\r\n return isValid;\r\n }\r\n\r\n function validateEmailAddress(newval) {\r\n\r\n validateRequired($scope.userDetailsForm.emailAddress, newval);\r\n }\r\n\r\n function validateEmailValidationCode(newval) {\r\n if ($scope.validationCodeRequired()) {\r\n validateRequired($scope.userDetailsForm.validationCode, newval);\r\n } else {\r\n $scope.userDetailsForm.validationCode.$setValidity('required', true);\r\n }\r\n }\r\n\r\n function validateGivenName(newval) {\r\n validateRequired($scope.userDetailsForm.givenName, newval);\r\n }\r\n\r\n function validateFamilyName(newval) {\r\n validateRequired($scope.userDetailsForm.familyName, newval);\r\n }\r\n\r\n function validateOldPassword(newval) {\r\n validateRequired($scope.userDetailsForm.oldPassword, newval);\r\n }\r\n\r\n function validateConfirmPassword(newval) {\r\n if ($scope.passwordConfirmationRequired()) {\r\n var hasValue = validateRequired($scope.userDetailsForm.confirmPassword, newval);\r\n $scope.userDetailsForm.confirmPassword.$setValidity('match', !hasValue || newval === $scope.model.password);\r\n } else {\r\n $scope.userDetailsForm.confirmPassword.$setValidity('required', true);\r\n $scope.userDetailsForm.confirmPassword.$setValidity('match', true);\r\n }\r\n }\r\n\r\n $scope.$watch('model.emailAddress', validateEmailAddress);\r\n $scope.$watch('model.validationCode', validateEmailValidationCode);\r\n $scope.$watch('model.givenName', validateGivenName);\r\n $scope.$watch('model.familyName', validateFamilyName);\r\n $scope.$watch('model.oldPassword', validateOldPassword);\r\n $scope.$watch('model.confirmPassword', validateConfirmPassword);\r\n\r\n accountApi.get({}, function (data) {\r\n $scope.model.busy = false;\r\n $scope.model.oldEmailAddress = data.EmailAddress;\r\n $scope.model.emailAddress = data.EmailAddress;\r\n $scope.model.givenName = data.GivenName;\r\n $scope.model.familyName = data.FamilyName;\r\n }, function (response) {\r\n $scope.model.busy = false;\r\n $scope.model.error = response.data;\r\n });\r\n }]);\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('scheduledMaintenanceCtrl',\r\n [\"$scope\", function($scope){\r\n\r\n }]);\r\n})();","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('shellCtrl', ['$rootScope', '$scope', '$http', '$state', '$window', '$interval', 'resourceFactory', 'ngProgressFactory', '$uibModal', 'shell', 'usSpinnerService',\r\n '$intercom',\r\n function ($rootScope, $scope, $http, $state, $window, $interval, resourceFactory, ngProgressFactory, $uibModal, shell, usSpinnerService, $intercom) {\r\n\r\n $scope.helpUrl = PTConfig.APP_API_BASE_URL + '/Utility/Help';\r\n $scope.everythingLoaded = false;\r\n $scope.email = '';\r\n $scope.totalUnreadCount = 0;\r\n $scope.isOwner = false;\r\n $scope.isTenant = false;\r\n $scope.sidebarDisplay = false;\r\n $scope.items = {\r\n companyReference: '',\r\n contactReference: '',\r\n tenancyReference: ''\r\n };\r\n\r\n $scope.activeContactList = [];\r\n\r\n $scope.progressbar = ngProgressFactory.createInstance();\r\n\r\n var messagesApi = resourceFactory.create('messages'),\r\n profileApi = resourceFactory.create('profile'),\r\n inspectionapi = resourceFactory.create('inspection');\r\n\r\n $scope.reloadMessaging = function () {\r\n if ($state.current.name !== 'shell.messages') {\r\n $state.go('shell.messages', {\r\n profileType: $scope.isOwner ? 'owner' : 'tenant'\r\n });\r\n } else {\r\n $rootScope.$broadcast('LoadMessages');\r\n }\r\n };\r\n\r\n $scope.loadUserInfo = function () {\r\n delete $rootScope.user;\r\n $scope.progressbar.start();\r\n profileApi.get()\r\n .$promise.then(function(data){\r\n if (data.Contacts && data.Contacts.length === 0) {\r\n $scope.logout(true);\r\n }\r\n else {\r\n $rootScope.user = data;\r\n\r\n $scope.email = $rootScope.user.Email;\r\n $scope.userName = $rootScope.user.Name;\r\n $scope.showAccount = $rootScope.user.ProviderType == 'propertytree';\r\n $window.localStorage.lastLoggedInSource = $rootScope.user.ProviderType;\r\n\r\n $scope.loadProfiles();\r\n $rootScope.$broadcast('UserLoggedIn');\r\n\r\n $intercom.boot({\r\n name: $rootScope.user.Name,\r\n firstName: $rootScope.user.GivenName,\r\n lastName: $rootScope.user.FamilyName,\r\n email: $rootScope.user.Email,\r\n created_at: $rootScope.user.CreatedAt,\r\n provider: $rootScope.user.ProviderType,\r\n widget: {\r\n activator: '#intercomWidget'\r\n }\r\n });\r\n }\r\n })\r\n .finally(function () {\r\n $scope.progressbar.complete();\r\n });\r\n };\r\n\r\n $scope.loadProfiles = function () {\r\n profileApi.profiles({ profileType: '' }, function (data) {\r\n $scope.profileData = data;\r\n $rootScope.user.Profiles = data;\r\n\r\n if ($scope.profileData && $scope.profileData.length === 0) {\r\n $scope.progressbar.complete();\r\n $scope.logout(true);\r\n } else {\r\n for (var i = 0; i < $scope.profileData.length; i++) {\r\n if ($scope.profileData[i].ProfileType === 'Owner') {\r\n $scope.isOwner = true;\r\n $scope.profileType = \"owner\";\r\n $scope.activeContactList.push($scope.profileData[i]);\r\n }\r\n\r\n if ($scope.profileData[i].ProfileType === 'Tenancy') {\r\n if (!$scope.tenancy) {\r\n $scope.tenancy = $scope.profileData[i];\r\n }\r\n\r\n if ($scope.profileData[i].Inspection) {\r\n $scope.inspection = $scope.profileData[i].Inspection;\r\n $rootScope.inspectionId = $scope.inspection.InspectionID;\r\n }\r\n if (!$scope.isTenant) {\r\n $scope.items.companyReference = $scope.profileData[i].CompanyReference;\r\n $scope.items.contactReference = $scope.profileData[i].ContactReference;\r\n $scope.items.tenancyReference = $scope.profileData[i].ProfileReference;\r\n }\r\n\r\n $scope.isTenant = true;\r\n $scope.profileType = \"tenant\";\r\n $scope.activeContactList.push($scope.profileData[i]);\r\n }\r\n\r\n $intercom.update({\r\n email: $rootScope.user.Email,\r\n isTenant: $scope.isTenant,\r\n isOwner:$scope.isOwner\r\n });\r\n }\r\n\r\n $scope.progressbar.complete();\r\n $scope.everythingLoaded = true;\r\n $scope.getUnreadCounts($scope.activeContactList);\r\n }\r\n });\r\n };\r\n\r\n $scope.loadInspection = function () {\r\n var params = {\r\n CompanyReference: $scope.tenancy.CompanyReference,\r\n ContactReference: $scope.tenancy.ContactReference,\r\n ProfileReference: $scope.tenancy.ProfileReference\r\n };\r\n\r\n inspectionapi.getInspectionByEntityID(params, function (data) {\r\n $scope.inspection = data && data.length > 0 ? data[0] : '';\r\n if ($scope.inspection) {\r\n $state.go('shell.manageInspections', {\r\n profileType: 'tenant',\r\n inspectionId: $scope.inspection.InspectionID\r\n });\r\n } else {\r\n $state.go('shell.manageInspections', {\r\n profileType: 'tenant'\r\n });\r\n }\r\n\r\n }, function (error) {\r\n });\r\n };\r\n\r\n $scope.checkConnectionDown = function () {\r\n if ($state.current.name === 'shell.connectionDown') {\r\n $scope.everythingLoaded = true;\r\n }\r\n };\r\n\r\n $scope.gotoInspections = function () {\r\n $scope.loadInspection();\r\n };\r\n\r\n $scope.checkConnectionDown();\r\n\r\n $rootScope.$on('$stateChangeSuccess', $scope.checkConnectionDown);\r\n\r\n $scope.getUnreadCounts = function (items) {\r\n var params = [];\r\n for (var i = 0; i < items.length; i++) {\r\n var local = {\r\n CompanyReference: items[i].CompanyReference,\r\n ContactReference: items[i].ContactReference,\r\n ContactReferenceType: items[i].ProfileType\r\n };\r\n\r\n params.push(local);\r\n }\r\n messagesApi.totalUnreadMessageCount(params, function success(data) {\r\n $scope.totalUnreadCount = data.UnreadCount;\r\n });\r\n };\r\n\r\n $scope.classText = 'animated '; // adding an animated class here interferes with boostrap default animation e.g. 'animated fadeInLeft'\r\n\r\n var opts = {\r\n templateUrl: '/partials/tenancy/tenancyLedgerDialog.html',\r\n controller: 'modalInstanceCtrl',\r\n windowClass: 'animated ', // animated class here interferes with boostrap default animation e.g. 'animated fadeInLeft'\r\n size: 'lg',\r\n resolve: {\r\n items: function() {\r\n return $scope.items;\r\n },\r\n profileData:function(){\r\n return $scope.profileData;\r\n },\r\n type: function() {\r\n return \"tenant\";\r\n }\r\n }\r\n };\r\n\r\n $scope.tenancyLedger = function () {\r\n var dlg = shell.createDialog(opts);\r\n\r\n dlg.result.then(function (val) {\r\n //opts.windowClass = 'animated fadeInRight';\r\n });\r\n };\r\n\r\n var ownershipDialogOpt = {\r\n templateUrl: '/partials/ownership/ownershipLedgerDialog.html',\r\n controller: 'modalInstanceCtrl',\r\n windowClass: 'animated ', // animated class here interferes with boostrap default animation e.g. 'animated fadeInLeft'\r\n size: 'lg',\r\n resolve: {\r\n items: function() {\r\n return $scope.items;\r\n },\r\n profileData:function(){\r\n return $scope.profileData;\r\n },\r\n type: function() {\r\n return \"owner\";\r\n }\r\n }\r\n };\r\n\r\n $scope.ownershipLedger = function () {\r\n var dlg = shell.createDialog(ownershipDialogOpt);\r\n\r\n dlg.result.then(function (val) {\r\n //opts.windowClass = 'animated fadeInRight';\r\n });\r\n };\r\n\r\n var updateAccountOpts = {\r\n templateUrl: '/partials/common/updateAccount.html',\r\n controller: 'updateAccountCtrl',\r\n windowClass: 'animated ',\r\n size: 'md'\r\n };\r\n\r\n $scope.updateAccount = function () {\r\n var dlg = shell.createDialog(updateAccountOpts);\r\n\r\n dlg.result.then(function (val) {\r\n if (val) {\r\n $scope.loadUserInfo();\r\n }\r\n });\r\n };\r\n\r\n $scope.logout = function (invalidUser) {\r\n var accountApi = resourceFactory.create('account');\r\n\r\n delete $rootScope.user;\r\n\r\n accountApi.logout().$promise.finally(function () {\r\n if (invalidUser) {\r\n $state.go('login', {\r\n cantLogin: true\r\n });\r\n } else {\r\n $state.go('login');\r\n }\r\n });\r\n };\r\n\r\n var sidebarFocus = false;\r\n\r\n $scope.sidebarToggle = function () {\r\n $scope.sidebarDisplay = !$scope.sidebarDisplay;\r\n return;\r\n };\r\n\r\n $scope.sidebarBlurToggle = function(){\r\n if ($scope.sidebarDisplay){\r\n $scope.sidebarDisplay = !$scope.sidebarDisplay;\r\n sidebarFocus = $scope.sidebarDisplay;\r\n }\r\n };\r\n\r\n $scope.$on('ReloadUnreadMessages', $scope.getUnreadCounts);\r\n\r\n $interval(function () {\r\n if ($rootScope.user) {\r\n $rootScope.$broadcast('ReloadUnreadMessages');\r\n }\r\n }, PTConfig.UNREAD_MESSAGE_POLL_INTERVAL * 1000);\r\n\r\n $scope.loadUserInfo();\r\n }])\r\n\r\n .controller('errorCtrl', ['$scope', '$window', function ($scope, $window) {\r\n $scope.message = $window.sessionStorage.errorMessage;\r\n }])\r\n .controller('modalInstanceCtrl', [\r\n '$scope', \r\n '$uibModalInstance',\r\n 'items', \r\n 'type', \r\n 'profileData',\r\n 'resourceFactory',\r\n '$intercom',\r\n '$window',\r\n\r\n function ($scope, $uibModalInstance, items, type, profileData, resourceFactory, $intercom, $window) {\r\n $scope.items = items;\r\n $scope.showFromDateText = false;\r\n $scope.showToDateText = false;\r\n $scope.selectedOwner = null;\r\n $scope.owners = [];\r\n\r\n function getOwners() {\r\n $scope.selectedOwner = null;\r\n $scope.owners = _.filter(profileData, {ProfileType:'Owner'});\r\n if($scope.owners.length > 0){\r\n $scope.selectedOwner = $scope.owners[0];\r\n }\r\n }\r\n if(type===\"owner\"){\r\n getOwners();\r\n }\r\n\r\n $scope.close = function () {\r\n if (!$scope.checkValidDate($scope.fromDate) && !$scope.checkValidDate($scope.toDate)) {\r\n if ($scope.toDate <= $scope.fromDate || $scope.toDate > $scope.maxFromDate) {\r\n $scope.showToDateText = true;\r\n $scope.errorText = 'Invalid date range - select a \"To\" date that is on or after the \"From\" date';\r\n return;\r\n } else {\r\n $scope.showFromDateText = false;\r\n $scope.showToDateText = false;\r\n\r\n if(type === \"owner\")\r\n $window.Intercom(\"trackEvent\", \"view-ownership-ledger\");\r\n else\r\n $window.Intercom(\"trackEvent\",\"view-tenancy-ledger\");\r\n\r\n $uibModalInstance.close();\r\n }\r\n } else {\r\n if (!$scope.checkValidDate($scope.fromDate)) {\r\n $scope.showFromDateText = false;\r\n } else {\r\n $scope.showFromDateText = true;\r\n }\r\n\r\n if (!$scope.checkValidDate($scope.toDate)) {\r\n $scope.showToDateText = false;\r\n } else {\r\n $scope.showToDateText = true;\r\n $scope.errorText = 'Please select a valid date.';\r\n }\r\n\r\n return;\r\n }\r\n };\r\n\r\n $scope.selectOwner = function(owner){\r\n $scope.selectedOwner = owner;\r\n };\r\n\r\n $scope.$watch('fromDate', function(val) {\r\n if (val && !$scope.checkValidDate($scope.fromDate)) {\r\n $scope.showFromDateText = false;\r\n }\r\n });\r\n\r\n $scope.$watch('toDate', function (val) {\r\n if (val && !$scope.checkValidDate($scope.toDate)) {\r\n $scope.showToDateText = false;\r\n }\r\n });\r\n\r\n $scope.cancel = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n\r\n $scope.checkValidDate = function (value) {\r\n if (value !== undefined && value !== null && value !== '') {\r\n if (value instanceof Date) {\r\n var date = Date.parse(value);\r\n if (date < 0) {\r\n return true;\r\n } else {\r\n if (isNaN(date)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n var today = new Date();\r\n $scope.fromDate = new Date(today.getFullYear(), today.getMonth() - 1, 1);\r\n $scope.toDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1);\r\n $scope.maxFromDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1);\r\n $scope.maxToDate = $scope.maxFromDate;\r\n\r\n $scope.buildReportUrl = function () {\r\n\r\n var statementType = \"Tenancies\";\r\n var companyRef = $scope.items.companyReference;\r\n var contactRef = $scope.items.contactReference;\r\n var refCode = $scope.items.tenancyReference;\r\n if(type === \"owner\") {\r\n statementType = \"Owners\";\r\n refCode = $scope.selectedOwner.ProfileReference;\r\n companyRef = $scope.selectedOwner.CompanyReference;\r\n contactRef = $scope.selectedOwner.ContactReference;\r\n }\r\n\r\n if (!$scope.checkValidDate($scope.fromDate) && !$scope.checkValidDate($scope.toDate) && $scope.toDate > $scope.fromDate && $scope.toDate <= $scope.maxFromDate)\r\n {\r\n return PTConfig.APP_API_BASE_URL +\r\n \"/\" + statementType + \"/\" + companyRef +\r\n \"/\" + contactRef +\r\n \"/\" + refCode +\r\n \"/LedgerReport\" +\r\n \"?startDate=\" + PTUtils.toUnspecifiedISOString($scope.fromDate) +\r\n \"&endDate=\" + PTUtils.toUnspecifiedISOString($scope.toDate);\r\n }\r\n \r\n return '';\r\n };\r\n }])\r\n .controller('needanAccountCtrl', ['$scope', '$uibModalInstance', 'items', 'type', 'resourceFactory', function ($scope, $uibModalInstance, items, type, resourceFactory) {\r\n\r\n $scope.cancel = function() {\r\n $uibModalInstance.close();\r\n };\r\n }]);\r\n\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('termsOfUseCtrl', ['$scope', '$stateParams', '$window', '$state', '$location', function ($scope, $stateParams, $window, $state, $location) {\r\n \r\n }]);\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.services')\r\n .factory('maintenanceRequestSvc', factoryFn);\r\n\r\n factoryFn.$inject = [];\r\n function factoryFn() {\r\n \r\n function mapMRStsToCss(mrSts){\r\n var className = '';\r\n switch(mrSts.toLowerCase()){\r\n case '' : className = 'yellow-bg'; break;\r\n case 'completed' : className = 'green-bg'; break;\r\n case 'open' : className = 'blue-bg'; break;\r\n case '' : className = 'dark-blue-bg'; break;\r\n case '' : className = 'orange-bg'; break;\r\n default : className = 'dark-grey-bg'; break;\r\n }\r\n\r\n return className;\r\n }\r\n\r\n return {\r\n MapMRStsToCss:mapMRStsToCss\r\n };\r\n }\r\n\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdMrViewCollection', directiveFn);\r\n\r\n directiveFn.$inject = [];\r\n function directiveFn() {\r\n var directive = {\r\n restrict:'E',\r\n scope:{\r\n mrColl:'='\r\n },\r\n replace:true,\r\n templateUrl: '/dist/js/components/maintenanceRequests/tdMRViewCollection.template.html',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n scope.vm = {\r\n MRColl: scope.mrColl,\r\n collHeader: attr.header,\r\n profileType: attr.profileType\r\n };\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdMrViewPanel', directiveFn);\r\n\r\n directiveFn.$inject = ['$stateParams'];\r\n function directiveFn($stateParams) {\r\n var directive = {\r\n restrict:'E',\r\n scope:{\r\n mreq:'='\r\n },\r\n replace:true,\r\n templateUrl: '/dist/js/components/maintenanceRequests/tdMRViewPanel.template.html',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n var isCancelled = /cancel/gi.test(scope.mreq.DisplayStatus);\r\n scope.isTenancy = /tenan/gi.test(attr.profileType);\r\n \r\n scope.vm = {\r\n statusDateLabel: isCancelled ?'Cancellation Date:' : 'Completed Date:',\r\n descHeadingLabel: isCancelled ?'Cancellation Description:' : 'Maintenance Description',\r\n detailsText: isCancelled ? scope.mreq.CancellationReason : scope.mreq.Details,\r\n };\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.directives')\r\n .directive('tdUploader', directiveFn)\r\n .directive('tdUploadPreviewer', dTdUploadPreviewItem);\r\n\r\n directiveFn.$inject = ['$q', 'shell', '$timeout', 'resourceFactory'];\r\n function directiveFn($q, shell, $timeout, resourceFactory) {\r\n var directive = {\r\n restrict:'E',\r\n scope:{\r\n files:'=',\r\n acceptedFiles:'@'\r\n },\r\n replace:true,\r\n template: \r\n '
' +\r\n '
' +\r\n '' +\r\n '
0\">' +\r\n '' +\r\n '
' +\r\n '
',\r\n compile:compileFn\r\n };\r\n return directive;\r\n\r\n function compileFn(tEle, tAttrs, transclude) {\r\n return postLinkFn;\r\n\r\n function postLinkFn(scope, elem, attr) {\r\n var messagesApi = resourceFactory.create('messages');\r\n scope.vm = {\r\n files: [],\r\n tdUIsLoading:false\r\n };\r\n\r\n scope.removeFile = removeFileFn;\r\n\r\n scope.$on('tdFileAdd:FileAdded', function (t, files) {\r\n var validateAttachmentModels = buildValidateAttachmentModels(files);\r\n\r\n messagesApi.validateAttachments(validateAttachmentModels, function success(val) {\r\n handleFiles(files);\r\n }, function (error) {\r\n shell.flash.error(error.data);\r\n });\r\n });\r\n\r\n function buildValidateAttachmentModels(files) {\r\n var validateAttachmentModels = [];\r\n _.each(files, function (file) {\r\n validateAttachmentModels.push({ Size: file.size, Name: file.name + file.extension, MimeType: file.type });\r\n });\r\n return validateAttachmentModels;\r\n }\r\n\r\n function validateFile(file){\r\n if(!scope.acceptedFiles) return true;\r\n\r\n var fileRegex = new RegExp(scope.acceptedFiles, 'gi');\r\n return fileRegex.test(file.extension);\r\n }\r\n\r\n function handleFiles(files){\r\n var allQ = [];\r\n scope.vm.tdUIsLoading = true;\r\n\r\n _.each(files, function(file){\r\n if(validateFile(file))\r\n allQ.push(file.readAsync());\r\n else{\r\n shell.flash.error('One of the uploaded files have incorrect filetype.');\r\n return;\r\n }\r\n });\r\n\r\n $q.all(allQ).then(function(rFiles){\r\n scope.vm.tdUIsLoading = false;\r\n scope.vm.files = scope.vm.files.concat(rFiles);\r\n });\r\n }\r\n\r\n function removeFileFn(file, indx){\r\n var idx = scope.vm.files.indexOf(file);\r\n scope.vm.files = \r\n scope.vm.files.slice(0, idx)\r\n .concat(scope.vm.files.slice(idx+1));\r\n }\r\n\r\n scope.$watchCollection('vm.files', function(val){\r\n scope.files = val;\r\n });\r\n }\r\n }\r\n }\r\n \r\n dTdUploadPreviewItem.$inject = [];\r\n function dTdUploadPreviewItem(){\r\n return {\r\n restrict:'E',\r\n scope:{\r\n file:'=',\r\n remove:'&'\r\n },\r\n replace:true,\r\n controller:ctrlUplPrev,\r\n template: \r\n '
' +\r\n '
' +\r\n '
' +\r\n '' +\r\n '' +\r\n '
' +\r\n '
' +\r\n '{{file.name}} - ({{ file.size | tdFileSize}})' +\r\n '' +\r\n '
' +\r\n '
' +\r\n '
',\r\n };\r\n }\r\n \r\n ctrlUplPrev.$inject = ['$scope'];\r\n function ctrlUplPrev($scope){\r\n $scope.isImage = /(svg|img|jpg|jpeg|png)/gi.test($scope.file.type);\r\n }\r\n\r\n})();\r\n","(function () {\r\n 'use strict';\r\n angular.module('pt.controllers')\r\n .controller('documentCtrl', controllerFn);\r\n\r\n controllerFn.$inject = ['$scope', '$rootScope', '$state', '$stateParams', 'resourceFactory'];\r\n function controllerFn($scope, $rootScope, $state, $stateParams, resourceFactory) { \r\n var TenancydocumentsApi = resourceFactory.create('TenantDocuments');\r\n var OwnerDocumentsApi = resourceFactory.create('OwnerDocuments');\r\n\r\n $scope.ownerStatementsSpinner = true;\r\n $rootScope.ownerTheme = true;\r\n $scope.profile = [];\r\n $scope.profileType = $stateParams.profileType;\r\n\r\n $scope.profile = _.filter($rootScope.user.Profiles, function (pr) {\r\n if ($scope.profileType == 'owner')\r\n return /Owner/gi.test(pr.ProfileType);\r\n else\r\n return /Tenancy/gi.test(pr.ProfileType);\r\n });\r\n\r\n $scope.myUser = $scope.profile[0];\r\n\r\n if ($scope.myUser.ProfileType == 'Tenancy') {\r\n getTenancyDocuments($scope.myUser);\r\n }\r\n else {\r\n getOwnerDocuments($scope.myUser);\r\n }\r\n\r\n function getTenancyDocuments(tenant) {\r\n TenancydocumentsApi.query({}, function (data) {\r\n $scope.myDocuments = data;\r\n $scope.ownerStatementsSpinner = false;\r\n }, function (error) {\r\n $scope.ownerStatementsSpinner = false;\r\n });\r\n }\r\n\r\n function getOwnerDocuments(owner) {\r\n OwnerDocumentsApi.query({}, function (data) {\r\n $scope.myDocuments = data;\r\n $scope.ownerStatementsSpinner = false;\r\n }, function (error) {\r\n $scope.ownerStatementsSpinner = false;\r\n });\r\n }\r\n\r\n }\r\n})();\r\n\r\n\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('pt.controllers')\r\n .controller('createMaintenanceRequestCtrl', controllerFn);\r\n\r\n controllerFn.$inject = ['$scope', '$rootScope', '$stateParams', '$state', 'resourceFactory', 'shell'];\r\n function controllerFn($scope, $rootScope, $stateParams, $state, resourceFactory, shell) {\r\n\r\n var MRAPI = resourceFactory.create('maintenanceRequest');\r\n var messagesApi = resourceFactory.create('messages');\r\n var isTenancy = /tenan/gi.test($stateParams.profileType);\r\n $rootScope.ownerTheme = isTenancy ? false:true;\r\n\r\n var profiles = _.filter($rootScope.user.Profiles, function (profile) {\r\n if(isTenancy && profile.IsCurrentTenancy)\r\n return true;\r\n else if(!isTenancy && /management/gi.test(profile.ProfileType)){\r\n return true;\r\n }\r\n return false;\r\n });\r\n\r\n $scope.vm = {\r\n profiles:[],\r\n selectedProfile:[],\r\n summary:'',\r\n description:'',\r\n files:[],\r\n createMRStatus: false,\r\n hasExceededFileSize: false,\r\n firstRun:true\r\n };\r\n\r\n function isMessagesSwitchedOff() {\r\n messagesApi.isMessagesSwitchedOff({}, function (data) {\r\n $scope.isMessagesSwitchedOff = data.IsMessagesSwitchedOff;\r\n });\r\n }\r\n\r\n isMessagesSwitchedOff();\r\n\r\n $scope.vm.profiles = profiles;\r\n if(profiles.length === 1) \r\n $scope.vm.selectedProfile = profiles[0];\r\n\r\n\r\n $scope.submit = function() {\r\n $scope.vm.firstRun = false;\r\n var selItem = $scope.vm.selectedProfile;\r\n\r\n var propData = {\r\n CompanyReference: selItem.CompanyReference,\r\n ContactReference: selItem.ContactReference,\r\n PropertyReference: selItem.PropertyReference,\r\n ProfileType:isTenancy ? 'Tenancy' : 'Owner',\r\n Summary: $scope.vm.summary,\r\n Details: $scope.vm.description,\r\n Attachments: $scope.vm.files.map(function(file){\r\n return file.mapForUpload();\r\n })\r\n };\r\n\r\n if($scope.crMReqForm.$valid){\r\n $scope.vm.createMRStatus = true;\r\n var createMR = MRAPI.create(propData).$promise;\r\n createMR.then(function(sts){\r\n $scope.crMReqForm.$setPristine();\r\n shell.flash.success('Maintenance request sent for review');\r\n $state.go('shell.viewMaintenanceRequests', {profileType: isTenancy?'tenant':'owner'});\r\n });\r\n }\r\n };\r\n\r\n $scope.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#cancelButton',\r\n content: \r\n '
Are you sure you want to cancel and discard this form?
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '' +\r\n '    '+\r\n '
' +\r\n '
',\r\n placement: 'top'\r\n },\r\n };\r\n\r\n $scope.closePopover = function (event) {\r\n $scope.popover.options.dismissPopover();\r\n event.stopPropagation();\r\n };\r\n\r\n $scope.confirmCancel = function(){\r\n $state.go('shell.viewMaintenanceRequests', {profileType:(isTenancy)? 'tenant':'owner'});\r\n };\r\n\r\n var onRouteChangeOff = $rootScope.$on('$stateChangeStart', routeChange);\r\n function routeChange(event, next, current) {\r\n if ($scope.crMReqForm.$dirty || ($scope.vm.files.length > 0 && $scope.vm.firstRun)) {\r\n var buttonDefinition = [{ result: 'cancel', label: 'Cancel' }, { result: 'ok', label: 'Discard Changes', cssClass: 'primary' }];\r\n var message = '

Your changes has not been saved.
Are you sure you want to leave this page and discard your changes?

';\r\n shell.confirmBox('Confirm Cancel Changes', message, buttonDefinition, true)\r\n .result.then(function (result) {\r\n if (result == \"ok\") {\r\n onRouteChangeOff();\r\n if (next.name === 'shell.manageInspections') {\r\n $state.go(next.name, { profileType: 'tenant', inspectionId: $rootScope.inspectionId });\r\n } else {\r\n $state.go(next.name, { profileType: $stateParams.profileType });\r\n }\r\n }\r\n });\r\n\r\n event.preventDefault();\r\n return;\r\n } else {\r\n onRouteChangeOff();\r\n }\r\n }\r\n\r\n $scope.$watch('vm.summary', function(newval, oldval) {\r\n if(newval && newval.trim() !== '')\r\n $scope.crMReqForm.summary.$setValidity('summary', true);\r\n else\r\n $scope.crMReqForm.summary.$setValidity('summary', false);\r\n });\r\n\r\n $scope.$watch('vm.description', function (newval, oldval) {\r\n if(newval && newval.trim() !== '')\r\n $scope.crMReqForm.description.$setValidity('description', true);\r\n else\r\n $scope.crMReqForm.description.$setValidity('description', false);\r\n });\r\n\r\n }\r\n\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n\r\n angular.module('pt.controllers')\r\n .controller('maintenanceRequestDetailsCtrl', controllerFn);\r\n\r\n controllerFn.$inject = ['$scope', 'resourceFactory', '$state', 'shell', '$stateParams', '$rootScope', 'enums', '$interval'];\r\n function controllerFn($scope, resourceFactory, $state, shell, $stateParams, $rootScope, enums, $interval) {\r\n var mrApi = resourceFactory.create('viewMaintenanceRequest');\r\n var contactApi = resourceFactory.create('viewContact');\r\n var messagesApi = resourceFactory.create('messages');\r\n\r\n $scope.vm = {\r\n files: [],\r\n updMRStatus: false\r\n };\r\n\r\n function isMessagesSwitchedOff() {\r\n messagesApi.isMessagesSwitchedOff({}, function (data) {\r\n $scope.isMessagesSwitchedOff = data.IsMessagesSwitchedOff;\r\n });\r\n }\r\n\r\n isMessagesSwitchedOff();\r\n\r\n $scope.profileType = $stateParams.profileType;\r\n var ownerApprovalenumList = angular.copy(enums.MaintenanceOwnerApprovalOption.displayEnumList);\r\n var quoteApprovalList = angular.copy(enums.MaintenanceOwnerApprovalOption.displayEnumList);\r\n function getContact() {\r\n var propData = {\r\n CompanyReference: $stateParams.companyReference,\r\n MaintenanceRequestReference: $stateParams.maintenanceRequestId\r\n };\r\n\r\n var getOwnerContact = contactApi.getOwnerContact(propData).$promise;\r\n getOwnerContact.then(function (data) {\r\n loadMaintenanceRequestDetail(data.ContactReference);\r\n });\r\n }\r\n\r\n var statusList = $scope.profileType === 'tenant' ?\r\n\r\n [{ color: 'blue', status: 'under review', isEmpty: false, isLastItem: false },\r\n { color: 'orange', status: 'in progress', isEmpty: true, isLastItem: false },\r\n { color: 'green', status: 'completed', isEmpty: true, isLastItem: true }]\r\n\r\n :\r\n\r\n [{ color: 'blue', status: 'under review', isEmpty: false, isLastItem: false },\r\n { color: 'orange', status: 'quote request', isEmpty: true, isLastItem: false },\r\n { color: 'dark blue', status: 'work order', isEmpty: true, isLastItem: false },\r\n { color: 'yellow', status: 'invoiced', isEmpty: true, isLastItem: false },\r\n { color: 'green', status: 'completed', isEmpty: true, isLastItem: true }];\r\n\r\n \r\n \r\n function setOptionLists() {\r\n $scope.optionList = _.each(ownerApprovalenumList, function (option) {\r\n option.isSelected = option.id === 1;\r\n });\r\n \r\n $scope.jobsOptionList = [];\r\n _.each(quoteApprovalList, function (option) {\r\n if (option.id !== 1) {\r\n if (option.id === 2) {\r\n option.optionText = 'I will attend to this job myself';\r\n }\r\n\r\n if (option.id === 3) {\r\n option.optionText = 'I do not wish to proceed with any of these quotes';\r\n }\r\n\r\n $scope.jobsOptionList.push(option);\r\n }\r\n });\r\n\r\n $scope.jobsOptionList[0].isSelected = true;\r\n }\r\n\r\n $scope.isImage = function (fileName) {\r\n return /\\.(svg|img|jpg|jpeg|png)$/gi.test(fileName);\r\n };\r\n\r\n function init() {\r\n setOptionLists();\r\n if (!$stateParams.contactReference) {\r\n $scope.profiles = _.filter($rootScope.user.Profiles, function (pr) {\r\n return /owner/gi.test(pr.ProfileType);\r\n });\r\n\r\n if ($scope.profiles.length > 1) {\r\n getContact();\r\n } else {\r\n loadMaintenanceRequestDetail($scope.profiles[0].ContactReference);\r\n }\r\n\r\n } else {\r\n loadMaintenanceRequestDetail($stateParams.contactReference);\r\n }\r\n }\r\n\r\n init();\r\n\r\n\r\n function loadMaintenanceRequestDetail(contactId) {\r\n var propFullData = {\r\n CompanyReference: $stateParams.companyReference,\r\n ContactReference: contactId,\r\n MaintenanceRequestReference: $stateParams.maintenanceRequestId\r\n };\r\n\r\n $scope.maintenanceRequest = undefined;\r\n var viewMr = mrApi.getMaintenanceRequest(propFullData).$promise;\r\n viewMr.then(function (data) {\r\n $scope.vm.files = [];\r\n $scope.maintenanceRequest = data;\r\n setJobModel();\r\n });\r\n }\r\n\r\n function setJobModel() {\r\n if ($scope.profileType === 'owner') {\r\n setOwnerJobModel();\r\n } else {\r\n setTenantJobModel();\r\n }\r\n }\r\n\r\n function setTenantJobModel() {\r\n if ($scope.maintenanceRequest && $scope.maintenanceRequest.Jobs.length > 0) {\r\n for (var j = 0; j < $scope.maintenanceRequest.Jobs.length; j++) {\r\n $scope.maintenanceRequest.Jobs[j].files = [];\r\n $scope.maintenanceRequest.Jobs[j].hasExceededFileSize = false;\r\n\r\n $scope.maintenanceRequest.Jobs[j].isCollapse = j > 0;\r\n\r\n if ($scope.maintenanceRequest.Jobs[j].TenancyJobStatus === 'InProgress') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'orange';\r\n } else if ($scope.maintenanceRequest.Jobs[j].TenancyJobStatus === 'Completed') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'green';\r\n } else if ($scope.maintenanceRequest.Jobs[j].TenancyJobStatus === 'Cancelled') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'grey';\r\n } else {\r\n $scope.maintenanceRequest.Jobs[j].color = 'blue';\r\n }\r\n\r\n\r\n $scope.maintenanceRequest.Jobs[j].statusList = angular.copy(statusList);\r\n }\r\n }\r\n }\r\n\r\n function setOwnerJobModel() {\r\n if ($scope.maintenanceRequest && $scope.maintenanceRequest.Jobs.length > 0) {\r\n for (var j = 0; j < $scope.maintenanceRequest.Jobs.length; j++) {\r\n $scope.maintenanceRequest.Jobs[j].files = [];\r\n $scope.maintenanceRequest.Jobs[j].hasExceededFileSize = false;\r\n $scope.maintenanceRequest.Jobs[j].isCollapse = j > 0;\r\n\r\n if ($scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'QuoteRequest') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'orange';\r\n } else if ($scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'WorkOrder') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'dark blue';\r\n } else if ($scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'Invoiced') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'yellow';\r\n } else if ($scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'Completed') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'green';\r\n } else if ($scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'Cancelled') {\r\n $scope.maintenanceRequest.Jobs[j].color = 'grey';\r\n } else {\r\n $scope.maintenanceRequest.Jobs[j].color = 'blue';\r\n }\r\n\r\n\r\n $scope.maintenanceRequest.Jobs[j].statusList = angular.copy(statusList);\r\n\r\n var filteredCreditorsList = _.filter($scope.maintenanceRequest.Jobs[j].Creditors, function (creditor) {\r\n return creditor.HasQuote;\r\n });\r\n\r\n var approvedCreditor = _.filter($scope.maintenanceRequest.Jobs[j].Creditors, function (creditor) {\r\n return creditor.QuoteApproved;\r\n });\r\n\r\n if (filteredCreditorsList && filteredCreditorsList.length > 0) {\r\n var item = { CreditorName: 'None of these quotes are acceptable', HasQuote: true, Quote: '', Value: 'None', JobCreditorReference: '' };\r\n _.each(filteredCreditorsList, function (creditor) {\r\n creditor.Value = creditor.CreditorName;\r\n });\r\n\r\n if ($scope.maintenanceRequest.Jobs[j].HasQuoteApprovalPending) {\r\n filteredCreditorsList.push(item);\r\n }\r\n \r\n $scope.maintenanceRequest.Jobs[j].filteredCreditorsList = filteredCreditorsList;\r\n $scope.maintenanceRequest.Jobs[j].hasApprovedCreditor = approvedCreditor.length > 0;\r\n }\r\n\r\n if ($scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'WorkOrder' || $scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'Invoiced' || $scope.maintenanceRequest.Jobs[j].OwnerJobStatus === 'Completed') {\r\n for (var k = 0; k < $scope.maintenanceRequest.Jobs[j].Invoices.length; k++) {\r\n var invoice = $scope.maintenanceRequest.Jobs[j].Invoices[k];\r\n if (invoice.HasAttacments) {\r\n invoice.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#attachments_' + invoice.InvoiceNumber,\r\n content: '',\r\n placement: 'top'\r\n },\r\n };\r\n\r\n for (var i = 0; i < invoice.Attachments.length; i++) {\r\n var local = '

' + invoice.Attachments[i].FileName + '
';\r\n invoice.popover.options.content = invoice.popover.options.content + local;\r\n }\r\n }\r\n\r\n invoice.popoverdesc = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: 'body',\r\n content: '
' + invoice.Description + '
',\r\n placement: 'top'\r\n },\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n console.log('check', $scope.maintenanceRequest.Jobs);\r\n }\r\n\r\n $scope.updateSelectedCreditor = function (job, creditor) {\r\n _.each($scope.maintenanceRequest.Jobs, function(item) {\r\n if (job.JobReference === item.JobReference) {\r\n item.creditor = creditor;\r\n }\r\n\r\n if (creditor.Value !== 'None') {\r\n job.approveId = ownerApprovalenumList[0].id;\r\n }\r\n });\r\n };\r\n\r\n $scope.approveRequest = function () {\r\n $scope.sendMRequest = true;\r\n var option = _.filter($scope.optionList, function (item) {\r\n return item.isSelected;\r\n });\r\n\r\n var propData = {\r\n CompanyReference: $scope.maintenanceRequest.CompanyReference,\r\n ContactReference: $scope.maintenanceRequest.ContactReference,\r\n MaintenanceRequestReference: $scope.maintenanceRequest.MaintenanceRequestReference,\r\n Response: option[0].id,\r\n Details: $scope.maintenanceRequest.ownerInstructions,\r\n JobReference: '',\r\n JobCreditorReference: ''\r\n };\r\n\r\n var saveApproveRequest = mrApi.approveRequest(propData).$promise;\r\n saveApproveRequest.then(function (success) {\r\n $scope.sendMRequest = false;\r\n shell.flash.success('Maintenance request approval sent');\r\n init();\r\n }, function (error) {\r\n $scope.sendMRequest = false;\r\n console.log(error);\r\n });\r\n };\r\n\r\n $scope.approveQuoteRequest = function (job) {\r\n $scope.sendJobResponse = true;\r\n var option = _.filter($scope.jobsOptionList, function (item) {\r\n return item.isSelected;\r\n });\r\n\r\n var propData = {\r\n CompanyReference: $scope.maintenanceRequest.CompanyReference,\r\n ContactReference: $scope.maintenanceRequest.ContactReference,\r\n MaintenanceRequestReference: $scope.maintenanceRequest.MaintenanceRequestReference,\r\n Response: job.creditor && job.creditor.Value !== 'None' ? ownerApprovalenumList[0].id : option[0].id,\r\n Details: job.ownerInstructions,\r\n JobReference: job.JobRefernece,\r\n JobCreditorReference: job.creditor ? job.creditor.JobCreditorReference : ''\r\n };\r\n\r\n var saveApproveQuoteRequest = mrApi.approveRequest(propData).$promise;\r\n saveApproveQuoteRequest.then(function (success) {\r\n $scope.sendJobResponse = false;\r\n shell.flash.success('Quote request approval sent');\r\n init();\r\n }, function (error) {\r\n $scope.sendJobResponse = false;\r\n console.log(error);\r\n });\r\n };\r\n\r\n $scope.uploadAttachment = function (job) {\r\n\r\n var propData = {\r\n CompanyReference: $scope.maintenanceRequest.CompanyReference,\r\n ContactReference: $scope.maintenanceRequest.ContactReference,\r\n MaintenanceRequestReference: $scope.maintenanceRequest.MaintenanceRequestReference,\r\n JobReference: job.JobRefernece,\r\n Attachments: job.files.map(function (file) {\r\n return file.mapForUpload();\r\n })\r\n };\r\n\r\n $scope.vm.updMRStatus = true;\r\n var createMR = mrApi.uploadMaintenanceJobAttachment(propData).$promise;\r\n createMR.then(function (sts) {\r\n $scope.vm.updMRStatus = false;\r\n shell.flash.success('Maintenance request updated');\r\n init();\r\n });\r\n };\r\n\r\n var onRouteChangeOff = $rootScope.$on('$stateChangeStart', routeChange);\r\n function routeChange(event, next, current) {\r\n var newFileCount = 0;\r\n _.each($scope.maintenanceRequest.Jobs, function (job) {\r\n newFileCount += job.files.length;\r\n if (newFileCount > 0) {\r\n return;\r\n }\r\n });\r\n\r\n if (newFileCount > 0) {\r\n var buttonDefinition = [{ result: 'cancel', label: 'Cancel' }, { result: 'ok', label: 'Discard Changes', cssClass: 'primary' }];\r\n var message = '

Your changes has not been saved.
Are you sure you want to leave this page and discard your changes?

';\r\n shell.confirmBox('Confirm Cancel Changes', message, buttonDefinition, true)\r\n .result.then(function (result) {\r\n if (result == \"ok\") {\r\n onRouteChangeOff();\r\n if (next.name === 'shell.manageInspections') {\r\n $state.go(next.name, { profileType: 'tenant', inspectionId: $rootScope.inspectionId });\r\n } else {\r\n $state.go(next.name, { profileType: $stateParams.profileType });\r\n }\r\n }\r\n });\r\n\r\n event.preventDefault();\r\n return;\r\n } else {\r\n onRouteChangeOff();\r\n }\r\n }\r\n }\r\n\r\n})();\r\n","'use strict';\r\n\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('maintenanceRequestsCtrl', ['$scope', '$rootScope', '$state', '$stateParams', 'resourceFactory', 'shell',\r\n function controllerFn($scope, $rootScope, $state, $stateParams, resourceFactory, shell) {\r\n var tenancyAPI = resourceFactory.create('tenancies');\r\n var ownerAPI = resourceFactory.create('owners');\r\n\r\n $scope.profileType = $stateParams.profileType;\r\n var isTenancy = /tenan/gi.test($scope.profileType);\r\n $scope.isTenancy = isTenancy;\r\n $rootScope.isTenancy = isTenancy ? true : false;\r\n $scope.profiles = [];\r\n\r\n $scope.vm = {\r\n profiles:[],\r\n selectedProfile: undefined,\r\n maintenanceRequests:[],\r\n MROpen:[],\r\n MRCompleted:[],\r\n MRCancelled:[],\r\n mrReqSts: false,\r\n };\r\n\r\n function getCoreMaintenaceFeature() {\r\n\r\n $rootScope.companyFeatures.forEach(setCoreMaintenaceFeature);\r\n\r\n function setCoreMaintenaceFeature(companyFeatures, index) {\r\n if (companyFeatures.OptionalFeature.OptionalFeatureType === \"CoreMaintenance\") {\r\n $scope.vm.isCoreMaintenanceVisible = true;\r\n }\r\n else {\r\n $scope.vm.isCoreMaintenanceVisible = false;\r\n }\r\n }\r\n }\r\n getCoreMaintenaceFeature();\r\n $scope.profileSelected = profileSelectedFn;\r\n\r\n $scope.vm.profiles = _.filter($rootScope.user.Profiles, function (pr) {\r\n if(isTenancy)\r\n return /tenancy/gi.test(pr.ProfileType);\r\n else\r\n return /management/gi.test(pr.ProfileType);\r\n });\r\n\r\n if($scope.vm.profiles.length >0)\r\n $scope.vm.selectedProfile = $scope.vm.profiles[0];\r\n\r\n function init(){\r\n var reqAPI;\r\n var reqObj = {\r\n CompanyReference:$scope.vm.selectedProfile.CompanyReference,\r\n ContactReference:$scope.vm.selectedProfile.ContactReference\r\n };\r\n\r\n if (isTenancy){\r\n reqAPI = tenancyAPI;\r\n reqObj.TenancyReference = $scope.vm.selectedProfile.ProfileReference;\r\n } else {\r\n reqAPI = ownerAPI;\r\n reqObj.OwnerReference = $scope.vm.selectedProfile.OwnershipReference;\r\n reqObj.propertyReference = $scope.vm.selectedProfile.PropertyReference;\r\n }\r\n\r\n var mrreq = reqAPI.maintenanceRequests(reqObj).$promise;\r\n\r\n $scope.vm.mrReqSts = true;\r\n $scope.vm.MROpen = [];\r\n $scope.vm.MRCompleted = [];\r\n $scope.vm.MRCancelled = [];\r\n mrreq.then(function(data){\r\n $scope.vm.maintenanceRequests = data;\r\n $scope.vm.approvalList = _.filter(data, function(req) {\r\n return req.HasApprovalPending;\r\n });\r\n\r\n _.each(data, function(mr){\r\n switch(mr.DisplayStatus.toLowerCase()) {\r\n case 'open': $scope.vm.MROpen.push(mr); break;\r\n case 'completed': $scope.vm.MRCompleted.push(mr); break;\r\n case 'cancelled': $scope.vm.MRCancelled.push(mr); break;\r\n }\r\n });\r\n }).finally(function(err){\r\n $scope.vm.mrReqSts = false;\r\n });\r\n }\r\n\r\n if( $scope.vm.selectedProfile ){\r\n init();\r\n }\r\n\r\n function profileSelectedFn(profile){\r\n $scope.vm.selectedProfile = profile;\r\n init();\r\n }\r\n\r\n // Maintenance provider information dialog ----------------------------\r\n\r\n var providerInfo = {\r\n templateUrl: '/partials/maintenanceRequests/maintenanceProviderInfoDialog.html',\r\n controller: 'maintenanceProviderInfoCtrl',\r\n windowClass: 'animated ',\r\n size: 'md',\r\n resolve: {\r\n items: function () {\r\n return $scope.items;\r\n },\r\n type: function () {\r\n return \"\";\r\n }\r\n }\r\n };\r\n\r\n $scope.showMaintenanceProviderInfo = function () {\r\n var dlg = shell.createDialog(providerInfo);\r\n\r\n dlg.result.then(function (val) {\r\n });\r\n };\r\n\r\n // ----------------------------------------------\r\n }])\r\n .controller('maintenanceProviderInfoCtrl', ['$scope', '$uibModalInstance', 'items', 'type', 'resourceFactory', function ($scope, $uibModalInstance, items, type, resourceFactory) {\r\n $scope.cancel = function () {\r\n $uibModalInstance.close();\r\n };\r\n }]);\r\n})();\r\n\r\n\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('composeCtrl', ['$rootScope', '$scope', '$sce', '$http', 'flash', 'resourceFactory', '$stateParams', '$state', '$q', '$interval', 'usSpinnerService', '$window', '$timeout',\r\n 'shell', \r\n '$location', \r\n '$intercom',\r\n function ($rootScope, $scope, $sce, $http, flash, resourceFactory, $stateParams, $state, $q, $interval, usSpinnerService, $window, $timeout, shell, $location, $intercom) {\r\n var messagesApi = resourceFactory.create('messages');\r\n var profileApi = resourceFactory.create('profile');\r\n $scope.composeModel = null;\r\n $scope.singleAgent = true;\r\n $scope.singleProfile = true;\r\n $scope.hasSubjectError = false;\r\n $scope.hasBodyError = false;\r\n $scope.hasAddressToError = false;\r\n $scope.hasSelectedProfileError = false;\r\n $scope.composeSpinnerStatus = false;\r\n $scope.hasExceededFileSize = false;\r\n $scope.isSending = false;\r\n $scope.doBlur = false;\r\n var tinymce = $window.tinymce;\r\n $scope.tinymceModel = {};\r\n $scope.characterCount = 0;\r\n $scope.maxCount = 4000;\r\n\r\n $scope.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#cancelButton',\r\n content: '

Are you sure you want to cancel and discard this message?
' +\r\n '
' +\r\n '
    
',\r\n placement: 'top'\r\n },\r\n };\r\n\r\n $scope.closePopover = function (event) {\r\n $scope.popover.options.dismissPopover();\r\n event.stopPropagation();\r\n };\r\n\r\n $scope.tinymceOptions = {\r\n toolbar: \"undo redo | bold italic | alignleft alignjustify | bullist numlist | link unlink\",\r\n plugins: \"link\",\r\n target_list: false,\r\n link_title: false,\r\n extended_valid_elements: 'a[href|target=_blank]',\r\n relative_urls: false,\r\n menubar: false,\r\n statusbar: false,\r\n content_css: \"/dist/css/tinymce.css\",\r\n init_instance_callback: function (ed) {\r\n ed.on('click', function (e) {\r\n ed.focus();\r\n $scope.setCharaterCount();\r\n });\r\n\r\n ed.on('KeyUp', function (e) {\r\n $scope.setCharaterCount();\r\n });\r\n }\r\n };\r\n\r\n $scope.setCharaterCount = function () {\r\n var tinyContent = tinymce.activeEditor.getContent({ format: 'text' });\r\n $scope.characterCount = tinyContent.length === 1 && /\\s/g.test(tinyContent) && tinyContent !== '' ? 0 : tinyContent.length;\r\n $timeout(function () {\r\n $scope.$apply();\r\n });\r\n };\r\n\r\n tinymce.init($scope.tinymceOptions);\r\n\r\n $scope.getAttachmentUrl = function (rawUrl) {\r\n return $sce.trustAsResourceUrl(rawUrl);\r\n };\r\n\r\n function isMessagesSwitchedOff() {\r\n messagesApi.isMessagesSwitchedOff({}, function (data) {\r\n $scope.isMessagesSwitchedOff = data.IsMessagesSwitchedOff;\r\n });\r\n }\r\n\r\n isMessagesSwitchedOff();\r\n\r\n /////////// Compose new message functions.\r\n $scope.composeOwnerInternal = function (profileReference) {\r\n \r\n $scope.composeModel = {\r\n message: \"\",\r\n attachments: [],\r\n isOwnerMessage: true\r\n };\r\n $scope.firstAttempt = null;\r\n $scope.hasBodyError = false;\r\n $scope.hasSubjectError = false;\r\n\r\n $scope.getProfiles(function (d) {\r\n return d.ProfileType === 'Owner' || d.ProfileType === 'Management';\r\n }, 'Management', profileReference);\r\n\r\n };\r\n\r\n $scope.composeTenancyInternal = function (profileReference) {\r\n $scope.composeModel = {\r\n message: \"\",\r\n attachments: [],\r\n isOwnerMessage: false\r\n };\r\n $scope.firstAttempt = null;\r\n $scope.hasBodyError = false;\r\n $scope.hasSubjectError = false;\r\n\r\n $scope.getProfiles(function (d) {\r\n return d.ProfileType === 'Tenancy';\r\n }, 'Tenancy', profileReference);\r\n };\r\n\r\n $scope.getProfiles = function (profileFilter, profileType, profileReference) {\r\n $scope.composeSpinnerStatus = true;\r\n profileApi.profiles({ profileType: '' }, function (data) {\r\n var filteredList = data.filter(profileFilter);\r\n $scope.composeModel.profiles = filteredList;\r\n //$scope.setEntity(data);\r\n if ($scope.composeModel.profiles.length > 0) {\r\n for (var i = 0; i < $scope.composeModel.profiles.length; i++) {\r\n \r\n if (!profileReference) {\r\n if ($scope.composeModel.profiles.length == 1) {\r\n $scope.composeModel.selectedProfile = $scope.composeModel.profiles[i];\r\n break;\r\n }\r\n } else {\r\n if ($scope.composeModel.profiles[i].ProfileType === profileType && $scope.composeModel.profiles[i].ProfileReference === profileReference) {\r\n $scope.composeModel.selectedProfile = $scope.composeModel.profiles[i];\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Stopping the spinner at the time before showing the dropdown content\r\n $scope.composeSpinnerStatus = false;\r\n\r\n if ($scope.composeModel.profiles.length == 1) {\r\n $scope.singleProfile = true;\r\n }\r\n\r\n if ($scope.composeModel.profiles.length > 1) {\r\n $scope.singleProfile = false;\r\n }\r\n }, function (response) {\r\n $scope.composeSpinnerStatus = false;\r\n });\r\n };\r\n\r\n $scope.profileSelected = function (profile) {\r\n $scope.composeModel.selectedProfile = profile;\r\n };\r\n\r\n $scope.agentSelected = function (agent) {\r\n $scope.composeModel.addressTo = agent;\r\n };\r\n\r\n $scope.loadSelectedProfileAgentDetails = function (profile) {\r\n $scope.composeSpinnerStatus = true;\r\n $scope.composeModel.addressTo = null;\r\n\r\n if (!profile) return;\r\n\r\n var paraModel = {\r\n ProfileType: profile.ProfileType,\r\n ProfileReference: profile.ProfileReference,\r\n CompanyReference: profile.CompanyReference,\r\n ContactReference: profile.ContactReference\r\n };\r\n\r\n // call PT for agent details.\r\n profileApi.getAgent(paraModel, function (data) {\r\n // if 1 agent... then use addressTo.\r\n // if multiple, then drop down combo.\r\n $scope.composeSpinnerStatus = false;\r\n var agents = _.uniq(data.Agents, function (agent) {\r\n return agent.CompanyReference && agent.DisplayName;\r\n });\r\n\r\n if (agents.length === 1) {\r\n $scope.composeModel.addressTo = agents[0];\r\n $scope.singleAgent = true;\r\n }\r\n else {\r\n $scope.singleAgent = false;\r\n $scope.composeModel.agentList = agents;\r\n }\r\n });\r\n };\r\n\r\n $scope.$watch('composeModel.selectedProfile', function (val) {\r\n if ($scope.composeModel !== null) {\r\n $scope.loadSelectedProfileAgentDetails(val);\r\n }\r\n\r\n if (val) {\r\n $scope.canSendMessage();\r\n }\r\n });\r\n\r\n $scope.$watch('composeModel.addressTo', function (val) {\r\n if (val) {\r\n $scope.canSendMessage();\r\n }\r\n });\r\n\r\n $scope.$watch('composeModel.subject', function (val) {\r\n $scope.canSendMessage();\r\n });\r\n\r\n $scope.$watch('composeModel.message', function (val) {\r\n $scope.canSendMessage();\r\n });\r\n\r\n $scope.canSendMessage = function () {\r\n if ($scope.firstAttempt && $scope.composeModel) {\r\n \r\n if (!$scope.composeModel.addressTo) {\r\n $scope.hasAddressToError = true;\r\n }\r\n else {\r\n $scope.hasAddressToError = false;\r\n }\r\n\r\n if (!$scope.composeModel.selectedProfile) {\r\n $scope.hasSelectedProfileError = true;\r\n }\r\n else {\r\n $scope.hasSelectedProfileError = false;\r\n }\r\n\r\n if ($scope.composeModel.message) {\r\n $scope.hasBodyError = checkContentEmpty($scope.composeModel.message) === 0 ? true : false;\r\n }\r\n else {\r\n $scope.hasBodyError = true;\r\n }\r\n if ($scope.composeModel.subject) {\r\n $scope.hasSubjectError = false;\r\n }\r\n else {\r\n $scope.hasSubjectError = true;\r\n }\r\n\r\n if ( $scope.hasSubjectError || $scope.hasBodyError ||\r\n $scope.hasSelectedProfileError || $scope.hasAddressToError || $scope.hasExceededFileSize )\r\n {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n function checkContentEmpty(message) {\r\n var local = message;\r\n var replaced = local.replace(/ |\\s|

|<\\/p>/gm, '');\r\n return replaced.length;\r\n }\r\n\r\n $scope.send = function () {\r\n $scope.firstAttempt = true;\r\n\r\n if (!$scope.canSendMessage()) {\r\n flash.error('There were errors. Please correct these errors below.');\r\n return;\r\n }\r\n\r\n if ($scope.composeModel.selectedProfile && $scope.composeModel.addressTo) {\r\n\r\n $q.all($scope.composeModel.attachments.map(function (item) { return item.readAsync(); })).then(function (vals) {\r\n var param = {\r\n CompanyReference: $scope.composeModel.selectedProfile.CompanyReference,\r\n ContactReference: $scope.composeModel.selectedProfile.ContactReference,\r\n ProfileType: $scope.composeModel.selectedProfile.ProfileType,\r\n ProfileReference: $scope.composeModel.selectedProfile.ProfileReference,\r\n Subject: $scope.composeModel.subject,\r\n Message: $scope.composeModel.message,\r\n AddressTo: $scope.composeModel.addressTo,\r\n Attachments: vals.map(function (a) {\r\n return {\r\n Name: a.name,\r\n MimeType: a.type,\r\n Data: a.data.substring(a.data.indexOf(',') + 1)\r\n };\r\n })\r\n };\r\n $scope.isSending = true;\r\n messagesApi.compose(param, function success(val) {\r\n $window.Intercom('trackEvent', 'compose-new-message');\r\n if ($window.location.hash) {\r\n $window.history.back();\r\n }\r\n else {\r\n var profileType;\r\n if ($scope.composeModel.selectedProfile.ProfileType === 'Tenancy') {\r\n profileType = 'Tenancy';\r\n }\r\n else {\r\n profileType = 'Owner';\r\n }\r\n $scope.composeModel = null;\r\n $scope.firstAttempt = null;\r\n $scope.hasBodyError = false;\r\n $scope.hasSubjectError = false;\r\n $scope.hasAddressToError = false;\r\n $scope.hasSelectedProfileError = false;\r\n \r\n if (profileType === 'Tenancy') {\r\n $state.go('shell.messages', {\r\n profileType: 'tenant'\r\n });\r\n }\r\n else {\r\n $state.go('shell.messages', {\r\n profileType: 'owner'\r\n });\r\n }\r\n }\r\n $scope.isSending = false;\r\n $scope.characterCount = 0;\r\n flash.success('Message Successfully Sent');\r\n }, function (error) {\r\n $scope.isSending = false;\r\n flash.error('Sorry, there was a problem sending your message. Please refresh the page and try again.');\r\n });\r\n });\r\n }\r\n };\r\n\r\n $scope.addComposeAttachment = function (file) {\r\n if (!$scope.composeModel || !$scope.composeModel.attachments) return;\r\n\r\n var param = {\r\n Name: file.name,\r\n MimeType: file.type,\r\n Size: file.size\r\n };\r\n\r\n messagesApi.validateAttachment(param, function success(val) {\r\n $scope.composeModel.attachments.push(file);\r\n }, function (error) {\r\n if (error.status === 400) {\r\n flash.error(error.data);\r\n }\r\n });\r\n };\r\n\r\n $scope.removeComposeAttachment = function (index) {\r\n if (!$scope.composeModel || !$scope.composeModel.attachments) return;\r\n $scope.composeModel.attachments.splice(index, 1);\r\n };\r\n\r\n $scope.confirmCancel = function () {\r\n \r\n // Reset Compose model data\r\n $scope.composeModel = null;\r\n $scope.firstAttempt = undefined;\r\n $scope.hasBodyError = false;\r\n $scope.hasSubjectError = false;\r\n $scope.hasAddressToError = false;\r\n $scope.hasSelectedProfileError = false;\r\n\r\n $window.history.back();\r\n };\r\n\r\n if ($stateParams.managementId) {\r\n $scope.composeOwnerInternal($stateParams.managementId);\r\n } else {\r\n if ($stateParams.profileType === 'owner') {\r\n $scope.composeOwnerInternal();\r\n }\r\n }\r\n\r\n if ($stateParams.tenancyId) {\r\n $scope.composeTenancyInternal($stateParams.tenancyId);\r\n } else {\r\n if ($stateParams.profileType === 'tenant') {\r\n $scope.composeTenancyInternal();\r\n }\r\n }\r\n \r\n function checkFormDirty() {\r\n if (tinymce.activeEditor) {\r\n var text = tinymce.activeEditor.getContent({ format: 'text' });\r\n $scope.isContentEmpty = !/\\S/.test(text);\r\n return !!($scope.composeModel && ($scope.composeModel.subject || !$scope.isContentEmpty || ($scope.composeModel.selectedProfile && $scope.composeModel.selectedProfile.ProfileName) || ($scope.composeModel.attachments && $scope.composeModel.attachments.length > 0)));\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n var onRouteChangeOff = $rootScope.$on('$stateChangeStart', routeChange);\r\n function routeChange(event, next, current) {\r\n var isFormDirty = checkFormDirty();\r\n if (isFormDirty) {\r\n var buttonDefinition = [{ result: 'cancel', label: 'Cancel' }, { result: 'ok', label: 'Discard Message', cssClass: 'primary' }];\r\n var message = '

Your message has not been sent.
Are you sure you want to leave this page and discard your changes?

';\r\n shell.confirmBox('Confirm Cancel Message', message, buttonDefinition, true)\r\n .result.then(function (result) {\r\n if (result == \"ok\") {\r\n onRouteChangeOff();\r\n if (next.name === 'shell.manageInspections') {\r\n $state.go(next.name, { profileType: 'tenant', inspectionId: $rootScope.inspectionId });\r\n } else {\r\n $state.go(next.name, { profileType: $stateParams.profileType });\r\n }\r\n }\r\n });\r\n\r\n event.preventDefault();\r\n return;\r\n } else {\r\n onRouteChangeOff();\r\n }\r\n }\r\n }]);\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('messagingCentreCtrl',\r\n ['$rootScope', '$scope', '$sce', '$http', 'flash', 'resourceFactory', '$stateParams', '$state', '$q', '$interval', 'usSpinnerService', '$window', '$timeout', 'shell', '$location', '$analytics',\r\n function ($rootScope, $scope, $sce, $http, flash, resourceFactory, $stateParams, $state, $q, $interval, usSpinnerService, $window, $timeout, shell, $location, $analytics) {\r\n var messagesApi = resourceFactory.create('messages');\r\n var profileApi = resourceFactory.create('profile');\r\n\r\n $scope.model = {};\r\n $scope.showContent = false;\r\n $scope.isContactsLoaded = false;\r\n $scope.isMessagesLoaded = false;\r\n $scope.model.tenantUnreadCount = \"\";\r\n $scope.model.ownerUnreadCount = \"\";\r\n $scope.model.totalUnreadCount = \"\";\r\n $scope.isOwner = false;\r\n $scope.isTenant = false;\r\n $scope.showOwner = $stateParams.profileType === 'owner' ? true : false;\r\n $scope.showTenant = $stateParams.profileType === 'owner' ? false : true;\r\n $scope.progressCount = 0;\r\n $scope.isOwnerTabActive = false;\r\n $scope.isMessagesLoading = false;\r\n \r\n $scope.ownerStatus = {\r\n isThreadsOpen: false\r\n };\r\n\r\n $scope.tenancyStatus = {\r\n isThreadsOpen: false\r\n };\r\n\r\n $scope.contactsSpinnerStatus = false;\r\n $scope.inboxSpinnerStatus = false;\r\n $scope.threadsSpinnerStatus = false;\r\n $scope.converseSpinnerStatus = false;\r\n $scope.isSending = false;\r\n $scope.doBlur = false;\r\n\r\n $scope.pageSpinnerStatus = function () {\r\n return $scope.contactsSpinnerStatus || $scope.inboxSpinnerStatus;\r\n };\r\n\r\n $('#contactListView').click('li', function () {\r\n $('#contactListView').collapse('hide');\r\n });\r\n \r\n $scope.tinymceModel = {};\r\n\r\n $scope.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#cancelButton',\r\n content: '

Are you sure you want to cancel and discard this message?
' +\r\n '
' +\r\n '
    
',\r\n placement: 'top'\r\n },\r\n };\r\n\r\n $scope.closePopover = function (event) {\r\n $scope.popover.options.dismissPopover();\r\n event.stopPropagation();\r\n };\r\n\r\n $scope.tinymceOptions = {\r\n toolbar: \"undo redo | bold italic | alignleft alignjustify | bullist numlist | link unlink\",\r\n plugins: \"link\",\r\n target_list: false,\r\n link_title: false,\r\n extended_valid_elements: 'a[href|target=_blank]',\r\n relative_urls: false,\r\n menubar: false,\r\n statusbar: false,\r\n init_instance_callback: function (ed) {\r\n ed.on('click', function (e) {\r\n ed.focus();\r\n });\r\n }\r\n };\r\n\r\n \r\n\r\n /////////// Inbox functions\r\n\r\n $scope.retrieveInboxThreads = function (type) {\r\n $scope.model.threads = [];\r\n $scope.isMessagesLoaded = false;\r\n $scope.inboxSpinnerStatus = true;\r\n messagesApi.getThreads({ contactType: type }, function success(data) {\r\n $scope.inboxSpinnerStatus = false;\r\n $scope.model.threads = data;\r\n $scope.isMessagesLoaded = true;\r\n });\r\n };\r\n\r\n $scope.getContacts = function (type) {\r\n $scope.isContactsLoaded = false;\r\n $scope.contactsSpinnerStatus = true;\r\n $scope.model.contacts = [];\r\n \r\n messagesApi.getContacts({ contactType: type }, function success(data) {\r\n $scope.contactsSpinnerStatus = false;\r\n $scope.model.contacts = data;\r\n $scope.isContactsLoaded = true;\r\n }); \r\n };\r\n\r\n $scope.setEntity = function (profiles) {\r\n if (profiles) {\r\n for (var i = 0; i < profiles.length; i++) {\r\n if (profiles[i].ProfileType === 'Owner') {\r\n $scope.isOwner = true;\r\n }\r\n\r\n if (profiles[i].ProfileType === 'Tenancy') {\r\n $scope.isTenant = true;\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.canChangeTab = function () {\r\n if ($scope.contactsSpinnerStatus || $scope.inboxSpinnerStatus) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.loadProfiles = function () {\r\n profileApi.profiles({ profileType: '' }, function (data) {\r\n $scope.setEntity(data);\r\n return data;\r\n });\r\n };\r\n\r\n if ($rootScope.user) {\r\n $scope.loadProfiles();\r\n }\r\n\r\n $scope.getUnreadCounts = function () {\r\n\r\n $scope.model.totalUnreadCount = 0;\r\n messagesApi.getUnreadMessageCount({ contactType: 'Owner' }, function success(data) {\r\n if (data.UnreadCount !== 0) {\r\n $scope.model.ownerUnreadCount = \"(\" + data.UnreadCount + \")\";\r\n $scope.model.totalUnreadCount += data.UnreadCount;\r\n }\r\n else {\r\n $scope.model.ownerUnreadCount = \"\";\r\n }\r\n });\r\n\r\n messagesApi.getUnreadMessageCount({ contactType: 'Tenancy' }, function success(data) {\r\n if (data.UnreadCount !== 0) {\r\n $scope.model.tenantUnreadCount = \"(\" + data.UnreadCount + \")\";\r\n $scope.model.totalUnreadCount += data.UnreadCount;\r\n }\r\n else {\r\n $scope.model.tenantUnreadCount = \"\";\r\n }\r\n });\r\n };\r\n\r\n $scope.$on('ReloadUnreadMessages', $scope.getUnreadCounts);\r\n\r\n var timeout;\r\n var oldSearchText;\r\n \r\n $scope.$watch('model.searchText', function (val) {\r\n if (val) {\r\n oldSearchText = val;\r\n }\r\n delaySearch(val, $stateParams.profileType === 'owner' ? 'Owner' : 'Tenancy');\r\n });\r\n\r\n function searchMessageList(search, type) {\r\n $scope.inboxSpinnerStatus = true;\r\n messagesApi.searchThreads({ searchTerm: search, contactType: type }, function success(data) {\r\n $scope.inboxSpinnerStatus = false;\r\n $scope.model.threads = data.ThreadList;\r\n });\r\n }\r\n\r\n function delaySearch(searchVal, type) {\r\n var tempVal = searchVal;\r\n if (timeout) $timeout.cancel(timeout);\r\n timeout = $timeout(function () {\r\n var search = tempVal;\r\n if (search || oldSearchText) {\r\n searchMessageList(search, type);\r\n }\r\n }, 300);\r\n }\r\n\r\n $scope.selectedItem = function (type, item) {\r\n if (type === 'thread') {\r\n $analytics.eventTrack(toTitleCase($stateParams.profileType), { category: 'Messaging', label: 'View Messages' });\r\n $state.go('shell.messageThreadView', {\r\n profileType: $stateParams.profileType,\r\n companyReference: item.OriginalFromAddress.CompanyReference,\r\n threadId: item.ThreadID\r\n });\r\n } else {\r\n $analytics.eventTrack(toTitleCase($stateParams.profileType), { category: 'Messaging', label: 'View Contacts' });\r\n $state.go('shell.messageThreadView', {\r\n profileType: $stateParams.profileType,\r\n companyReference: item.CompanyReference,\r\n participantsHash: item.ParticipantsHash\r\n });\r\n }\r\n };\r\n\r\n $scope.gotoInbox = function () {\r\n var profileType = $stateParams.profileType === 'owner' ? 'Owner' : 'Tenancy';\r\n $rootScope.ownerTheme = $stateParams.profileType === 'owner' ? true : false;\r\n $scope.getContacts(profileType);\r\n $scope.retrieveInboxThreads(profileType);\r\n oldSearchText = undefined;\r\n $scope.model.searchText = undefined;\r\n if (profileType === 'Owner') {\r\n $scope.showOwner = true;\r\n $scope.showTenant = false;\r\n $scope.isOwnerTabActive = true;\r\n }\r\n else {\r\n $scope.showOwner = false;\r\n $scope.showTenant = true;\r\n $scope.isOwnerTabActive = false;\r\n }\r\n };\r\n\r\n $scope.gotoInbox();\r\n\r\n $scope.getAttachmentUrl = function (rawUrl) {\r\n return $sce.trustAsResourceUrl(rawUrl);\r\n };\r\n\r\n /////////// Compose new message functions.\r\n $scope.composeMessage = function () {\r\n $analytics.eventTrack(toTitleCase($stateParams.profileType), { category: 'Messaging', label: 'Compose Message' });\r\n\r\n if ($stateParams.profileType === 'owner') {\r\n $state.go('shell.messageCompose', {\r\n profileType: 'owner'\r\n });\r\n } else {\r\n $state.go('shell.messageCompose', {\r\n profileType: 'tenant'\r\n });\r\n }\r\n };\r\n\r\n function toTitleCase(str) {\r\n if (!str) return '';\r\n return str.replace(/\\w\\S*/g, function (txt) {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n }\r\n \r\n $scope.$on('UserLoggedIn', $scope.loadProfiles);\r\n\r\n $scope.$on('LoadMessages', $scope.gotoInbox);\r\n }]);\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('threadViewCtrl', ['$rootScope', '$scope', '$sce', '$http', 'flash', 'resourceFactory', '$stateParams', '$state', '$q', '$interval', 'usSpinnerService', '$window', '$timeout',\r\n 'shell', \r\n '$location', \r\n '$intercom',\r\n function ($rootScope, $scope, $sce, $http, flash, resourceFactory, $stateParams, $state, $q, $interval, usSpinnerService, $window, $timeout, shell, $location, $intercom) {\r\n var messagesApi = resourceFactory.create('messages');\r\n var profileApi = resourceFactory.create('profile');\r\n\r\n $scope.model = {};\r\n $scope.contactModel = null;\r\n $scope.showContent = false;\r\n $scope.isContactsLoaded = false;\r\n $scope.isMessagesLoaded = false;\r\n $scope.model.tenantUnreadCount = \"\";\r\n $scope.model.ownerUnreadCount = \"\";\r\n $scope.model.totalUnreadCount = \"\";\r\n $scope.isOwner = false;\r\n $scope.isTenant = false;\r\n $scope.showOwner = $stateParams.profileType === 'owner' ? true : false;\r\n $scope.showTenant = $stateParams.profileType === 'owner' ? false : true;\r\n $scope.progressCount = 0;\r\n $scope.isOwnerTabActive = $stateParams.profileType === 'owner' ? true : false;\r\n $scope.isMessagesLoading = false;\r\n $scope.hasExceededFileSize = false;\r\n $scope.characterCount = 0;\r\n $scope.maxCount = 4000;\r\n\r\n var localThreadId = '';\r\n\r\n\r\n \r\n $scope.status = {\r\n isThreadsOpen: false\r\n };\r\n\r\n $scope.contactsSpinnerStatus = false;\r\n $scope.inboxSpinnerStatus = false;\r\n $scope.threadsSpinnerStatus = false;\r\n $scope.converseSpinnerStatus = false;\r\n $scope.isSending = false;\r\n $scope.doBlur = false;\r\n\r\n $scope.pageSpinnerStatus = function () {\r\n return $scope.threadsSpinnerStatus || $scope.converseSpinnerStatus;\r\n };\r\n\r\n\r\n $scope.toggleView = function (contact, threadID) {\r\n \r\n if (contact) {\r\n $scope.threadsSpinnerStatus = true;\r\n $scope.isThreadsConverseSpinnerActive = true;\r\n $scope.isMessagesLoading = true;\r\n $scope.setContactModel(contact, threadID);\r\n $scope.showContent = false;\r\n\r\n } else {\r\n if (!$scope.isMessagesLoading) {\r\n $scope.contactModel = null;\r\n }\r\n \r\n }\r\n \r\n $('#contactListView').click('li', function () {\r\n $('#contactListView').collapse('hide');\r\n });\r\n };\r\n\r\n $scope.tinymceModel = {};\r\n\r\n $scope.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#cancelButton',\r\n content: '
Are you sure you want to cancel and discard this message?
' +\r\n '
' +\r\n '
    
',\r\n placement: 'top'\r\n },\r\n };\r\n\r\n $scope.closePopover = function (event) {\r\n $scope.popover.options.dismissPopover();\r\n event.stopPropagation();\r\n };\r\n\r\n var tinymce = $window.tinymce;\r\n $scope.tinymceOptions = {\r\n toolbar: \"undo redo | bold italic | alignleft alignjustify | bullist numlist | link unlink\",\r\n plugins: \"link\",\r\n target_list: false,\r\n link_title: false,\r\n extended_valid_elements: 'a[href|target=_blank]',\r\n relative_urls: false,\r\n menubar: false,\r\n statusbar: false,\r\n content_css: \"/dist/css/tinymce.css\",\r\n init_instance_callback: function (ed) {\r\n ed.on('click', function (e) {\r\n ed.focus();\r\n $scope.setCharaterCount();\r\n });\r\n\r\n ed.on('KeyUp', function (editor, e) {\r\n $scope.setCharaterCount();\r\n });\r\n }\r\n };\r\n\r\n $scope.setCharaterCount = function () {\r\n var tinyContent = tinymce.activeEditor.getContent({ format: 'text' });\r\n $scope.characterCount = tinyContent.length === 1 && /\\s/g.test(tinyContent) && tinyContent !== '' ? 0 : tinyContent.length;\r\n $timeout(function () {\r\n $scope.$apply();\r\n });\r\n };\r\n\r\n tinymce.init($scope.tinymceOptions);\r\n function isMessagesSwitchedOff() {\r\n messagesApi.isMessagesSwitchedOff({}, function(data) {\r\n $scope.isMessagesSwitchedOff = data.IsMessagesSwitchedOff;\r\n });\r\n }\r\n\r\n isMessagesSwitchedOff();\r\n $scope.loadThreadMessages = function (profileType, companyReference, threadId, participantsHash) {\r\n $scope.contactModel = {};\r\n var profiles;\r\n $scope.threadsSpinnerStatus = true;\r\n $scope.converseSpinnerStatus = true;\r\n\r\n profileApi.profiles({ profileType: '' }, function (data) {\r\n profiles = data;\r\n if (profiles) {\r\n $rootScope.ownerTheme = $stateParams.profileType === 'owner' ? true : false;\r\n for (var p = 0; p < profiles.length; p++) {\r\n if (profiles[p].ProfileType === 'Owner') {\r\n $scope.isOwner = true;\r\n }\r\n\r\n if (profiles[p].ProfileType === 'Tenancy') {\r\n $scope.isTenant = true;\r\n }\r\n }\r\n\r\n if (profileType === 'Owner') {\r\n $scope.showOwner = true;\r\n $scope.showTenant = false;\r\n $scope.isOwnerTabActive = true;\r\n }\r\n else {\r\n $scope.showOwner = false;\r\n $scope.showTenant = true;\r\n $scope.isOwnerTabActive = false;\r\n }\r\n\r\n messagesApi.getContacts({ contactType: profileType }, function success(data) {\r\n var contacts = data;\r\n if (contacts) {\r\n if (threadId) {\r\n messagesApi.getThreadDetails({ companyReference: companyReference, threadID: threadId, contactType: profileType }, function success(data2) {\r\n var thread = data2;\r\n if (thread) {\r\n for (var j = 0; j < contacts.length; j++) {\r\n if (contacts[j].ParticipantsHash == thread.ParticipantsHash) {\r\n $scope.toggleView(contacts[j], threadId);\r\n }\r\n }\r\n\r\n $scope.showContent = true;\r\n $intercom.trackEvent('read-message');\r\n }\r\n });\r\n } else if (participantsHash) {\r\n for (var j = 0; j < contacts.length; j++) {\r\n if (contacts[j].ParticipantsHash == participantsHash) {\r\n $scope.toggleView(contacts[j], '');\r\n }\r\n }\r\n }\r\n\r\n $scope.showContent = true;\r\n }\r\n });\r\n }\r\n }, function (response) {\r\n $scope.threadsSpinnerStatus = false;\r\n $scope.converseSpinnerStatus = false;\r\n });\r\n };\r\n\r\n $scope.canChangeTab = function () {\r\n if ($scope.threadsSpinnerStatus || $scope.converseSpinnerStatus) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.getUnreadCounts = function () {\r\n\r\n $scope.model.totalUnreadCount = 0;\r\n messagesApi.getUnreadMessageCount({ contactType: 'Owner' }, function success(data) {\r\n if (data.UnreadCount !== 0) {\r\n $scope.model.ownerUnreadCount = \"(\" + data.UnreadCount + \")\";\r\n $scope.model.totalUnreadCount += data.UnreadCount;\r\n }\r\n else {\r\n $scope.model.ownerUnreadCount = \"\";\r\n }\r\n });\r\n\r\n messagesApi.getUnreadMessageCount({ contactType: 'Tenancy' }, function success(data) {\r\n if (data.UnreadCount !== 0) {\r\n $scope.model.tenantUnreadCount = \"(\" + data.UnreadCount + \")\";\r\n $scope.model.totalUnreadCount += data.UnreadCount;\r\n }\r\n else {\r\n $scope.model.tenantUnreadCount = \"\";\r\n }\r\n });\r\n };\r\n\r\n $scope.$on('ReloadUnreadMessages', $scope.getUnreadCounts);\r\n\r\n $scope.resetUnreadMessages = function (thread) {\r\n for (var i = 0; i < $scope.contactModel.threads.length; i++) {\r\n if ($scope.contactModel.threads[i].ThreadID == thread.ThreadID) {\r\n $scope.contactModel.threads[i].HasUnreadMessages = false;\r\n }\r\n }\r\n };\r\n\r\n /////////// Individual contact thread view functions\r\n\r\n $scope.setContactModel = function (contact, threadID) {\r\n $scope.contactModel = {\r\n attachments: [],\r\n selectedContact: contact\r\n };\r\n\r\n $scope.retrieveContactThreads(contact.CompanyReference, contact.ParticipantsHash, threadID);\r\n };\r\n\r\n $scope.retrieveContactThreads = function (companyReference, participants, threadID) {\r\n $scope.isDropdownActive = false;\r\n messagesApi.getThreads({ companyReference: companyReference, participants: participants }, function success(data) {\r\n $scope.contactModel.threads = data;\r\n $scope.contactModel.threads[0].HasUnreadMessages = false;\r\n $scope.threadsSpinnerStatus = false;\r\n if ($scope.contactModel.threads.length > 0) {\r\n if (threadID) {\r\n for (var i = 0; i < $scope.contactModel.threads.length; i++) {\r\n if ($scope.contactModel.threads[i].ThreadID == threadID) {\r\n $scope.contactModel.selectedThread = $scope.contactModel.threads[i];\r\n $scope.contactModel.selectedThread.HasUnreadMessages = false;\r\n break;\r\n }\r\n }\r\n } else {\r\n $scope.contactModel.selectedThread = $scope.contactModel.threads[0];\r\n }\r\n }\r\n \r\n \r\n $scope.isDropdownActive = true;\r\n if (!$scope.showContent) {\r\n $scope.status.isThreadsOpen = !$scope.status.isThreadsOpen;\r\n }\r\n });\r\n };\r\n\r\n $scope.getAttachmentUrl = function (rawUrl) {\r\n return $sce.trustAsResourceUrl(rawUrl);\r\n };\r\n\r\n $scope.retrieveThreadMessages = function (companyReference, threadID) {\r\n $scope.converseSpinnerStatus = true;\r\n $scope.contactModel.messages = [];\r\n messagesApi.getMessages({ companyReference: companyReference, threadID: threadID, markAsRead: true }, function success(data) {\r\n $scope.converseSpinnerStatus = false;\r\n if ($scope.contactModel && $scope.contactModel.messages) {\r\n $scope.contactModel.messages = data;\r\n $scope.scrollToTop();\r\n $interval(function () {\r\n $scope.scrollToBottom();\r\n }, 300, 2);\r\n }\r\n\r\n $scope.isMessagesLoading = false;\r\n });\r\n };\r\n\r\n $scope.scrollToTop = function () {\r\n $('#conversationBoxDesktop').scrollTop(0);\r\n $('#conversationBoxMobile').scrollTop(0);\r\n };\r\n\r\n $scope.scrollToBottom = function () {\r\n var $desktopDiv = $('#conversationBoxDesktop'),\r\n $mobileDiv = $('#conversationBoxMobile');\r\n\r\n //Scrolls to the top of the last message in the thread\r\n $desktopDiv\r\n .scrollTop($desktopDiv.find('div.coversation-row').last().prop('offsetTop'))\r\n .perfectScrollbar('update');\r\n\r\n //Mobile seems to add the parents offset to all children - negate it to scroll to correct position\r\n $mobileDiv\r\n .scrollTop($mobileDiv.find('div.coversation-row').last().prop('offsetTop') - $mobileDiv.prop('offsetTop')) \r\n .perfectScrollbar('update');\r\n };\r\n\r\n $scope.selectThread = function (thread) {\r\n $state.go('shell.messageThreadView', {\r\n profileType: $stateParams.profileType,\r\n companyReference: thread.OriginalFromAddress.CompanyReference,\r\n threadId: thread.ThreadID\r\n });\r\n\r\n localThreadId = thread.ThreadID;\r\n };\r\n\r\n $scope.$watch('contactModel.selectedThread', function (val) {\r\n if ($scope.contactModel && $scope.contactModel.selectedThread) {\r\n $scope.retrieveThreadMessages(val.OriginalFromAddress.CompanyReference, val.ThreadID);\r\n }\r\n\r\n $rootScope.$broadcast('ReloadUnreadMessages');\r\n });\r\n\r\n $scope.showConversationDivider = function ($index) {\r\n if (!$scope.contactModel || !$scope.contactModel.messages) return false;\r\n return $index < $scope.contactModel.messages.length - 1 && $scope.contactModel.messages[$index].IsUser && $scope.contactModel.messages[$index + 1].IsUser;\r\n };\r\n\r\n $scope.reply = function () {\r\n $scope.firstAttempt = true;\r\n\r\n if (!$scope.canReplyMessage()) {\r\n flash.error('There were errors. Please correct these errors below.');\r\n return;\r\n }\r\n\r\n if (!$scope.contactModel || $scope.contactModel.message === undefined || $scope.contactModel.message === null || !$scope.contactModel.message.length) return;\r\n\r\n $q.all($scope.contactModel.attachments.map(function (item) { return item.readAsync(); })).then(function (vals) {\r\n var param = {\r\n CompanyReference: $scope.contactModel.selectedThread.OriginalFromAddress.CompanyReference,\r\n ThreadID: $scope.contactModel.selectedThread.ThreadID,\r\n Message: $scope.contactModel.message,\r\n Attachments: vals.map(function (a) {\r\n return {\r\n Name: a.name,\r\n MimeType: a.type,\r\n Data: a.data.substring(a.data.indexOf(',') + 1)\r\n };\r\n })\r\n };\r\n $scope.isSending = true;\r\n $scope.doBlur = true;\r\n messagesApi.reply(param, function success(val) {\r\n $window.Intercom('trackEvent', 'reply-message');\r\n $scope.retrieveThreadMessages($scope.contactModel.selectedThread.OriginalFromAddress.CompanyReference, $scope.contactModel.selectedThread.ThreadID);\r\n $scope.contactModel.message = '';\r\n $scope.contactModel.attachments = [];\r\n $scope.firstAttempt = null;\r\n $scope.hasBodyError = false;\r\n $scope.hasSubjectError = false;\r\n $scope.isSending = false;\r\n $scope.doBlur = false;\r\n $scope.characterCount = 0;\r\n flash.success('Message Successfully Sent');\r\n }, function (error) {\r\n $scope.isSending = false;\r\n flash.error('Sorry, there was a problem sending your message. Please try again.');\r\n });\r\n });\r\n };\r\n\r\n $scope.addReplyAttachment = function (file) {\r\n if (!$scope.contactModel || !$scope.contactModel.attachments) return;\r\n\r\n var param = {\r\n Name: file.name,\r\n MimeType: file.type,\r\n Size: file.size\r\n };\r\n\r\n messagesApi.validateAttachment(param, function success(val) {\r\n $scope.contactModel.attachments.push(file);\r\n }, function (error) {\r\n if (error.status === 400) {\r\n flash.error(error.data);\r\n }\r\n });\r\n };\r\n\r\n $scope.removeReplyAttachment = function (index) {\r\n if (!$scope.contactModel || !$scope.contactModel.attachments) return;\r\n $scope.contactModel.attachments.splice(index, 1);\r\n };\r\n\r\n /////////// Compose new message functions.\r\n $scope.composeMessage = function () {\r\n if ($stateParams.profileType === 'owner') {\r\n $state.go('shell.messageCompose', {\r\n profileType: 'owner'\r\n });\r\n } else {\r\n $state.go('shell.messageCompose', {\r\n profileType: 'tenant'\r\n });\r\n }\r\n };\r\n\r\n $scope.gotoInbox = function() {\r\n if ($stateParams.profileType === 'owner') {\r\n $state.go('shell.messages', {\r\n profileType: 'owner'\r\n });\r\n } else {\r\n $state.go('shell.messages', {\r\n profileType: 'tenant'\r\n });\r\n }\r\n };\r\n\r\n $scope.$watch('contactModel.message', function (val) {\r\n $scope.canReplyMessage();\r\n });\r\n \r\n $scope.canReplyMessage = function () {\r\n if ($scope.firstAttempt && $scope.contactModel) {\r\n if ($scope.contactModel.message) {\r\n $scope.hasBodyError = checkContentEmpty($scope.contactModel.message) === 0;\r\n }\r\n else {\r\n $scope.hasBodyError = true;\r\n }\r\n if ($scope.hasBodyError || $scope.hasExceededFileSize) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n function checkContentEmpty(message) {\r\n var local = message;\r\n var replaced = local.replace(/ |\\s|

|<\\/p>/gm, '');\r\n return replaced.length;\r\n }\r\n\r\n $scope.loadThreadMessages($stateParams.profileType === 'owner' ? 'Owner' : 'Tenancy', $stateParams.companyReference, $stateParams.threadId, $stateParams.participantsHash);\r\n\r\n function checkFormDirty() {\r\n if (tinymce.activeEditor) {\r\n var text = tinymce.activeEditor.getContent({ format: 'text' });\r\n $scope.isContentEmpty = !/\\S/.test(text);\r\n return !!(!$scope.isContentEmpty || ($scope.contactModel.attachments && $scope.contactModel.attachments.length > 0));\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n var onRouteChangeOff = $rootScope.$on('$stateChangeStart', routeChange);\r\n\r\n function routeChange(event, next, current) {\r\n var isFormDirty = checkFormDirty();\r\n if (isFormDirty) {\r\n var buttonDefinition = [{ result: 'cancel', label: 'Cancel' }, { result: 'ok', label: 'Discard Message', cssClass: 'primary' }];\r\n var message = '

Your message has not been sent.
Are you sure you want to leave this page and discard your changes?

';\r\n shell.confirmBox('Confirm Cancel Message', message, buttonDefinition, true)\r\n .result.then(function (result) {\r\n if (result == \"ok\") {\r\n onRouteChangeOff();\r\n if (next.name == \"shell.messageThreadView\") {\r\n $state.go(next.name, { profileType: $stateParams.profileType, threadId: localThreadId });\r\n } else if (next.name === 'shell.manageInspections') {\r\n $state.go(next.name, { profileType: 'tenant', inspectionId: $rootScope.inspectionId });\r\n } else {\r\n $state.go(next.name, { profileType: $stateParams.profileType });\r\n }\r\n }\r\n });\r\n event.preventDefault();\r\n return;\r\n } else {\r\n onRouteChangeOff();\r\n }\r\n }\r\n }]);\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('rentHistoryCtrl', ['$scope', '$rootScope', '$http', 'resourceFactory', '$window', '$state', '$intercom', '$stateParams',\r\n function ($scope, $rootScope, $http, resourceFactory, $window, $state, $intercom, $stateParams) {\r\n\r\n var rentApi = resourceFactory.create('owners');\r\n var rent = rentApi.rentHistory().$promise;\r\n\r\n rent.then(function (data) {\r\n $scope.rentHistory = data;\r\n setGraph();\r\n });\r\n\r\n function setGraph() {\r\n for (var i = 0; i < $scope.rentHistory.length; i++) {\r\n var localData = [];\r\n var localLabels = [];\r\n for (var j = 0; j < $scope.rentHistory[i].RentHistory.length; j++) {\r\n localData.push($scope.rentHistory[i].RentHistory[j].WeeklyRent);\r\n var formatDate = moment(new Date($scope.rentHistory[i].RentHistory[j].ChangeDate.toDateString())).format('DD/MM/YYYY');\r\n localLabels.push(formatDate);\r\n }\r\n\r\n $scope.rentHistory[i].lineData = {\r\n labels: localLabels,\r\n datasets: [\r\n {\r\n fillColor: [\"#0f5f87\"],\r\n strokeColor: [\"#0f5f87\"],\r\n pointColor: [\"#0f5f87\"],\r\n pointStrokeColor: [\"#fff\"],\r\n pointDotRadius: 4,\r\n data: localData\r\n }\r\n ]\r\n };\r\n }\r\n }\r\n\r\n $scope.lineOptions = {\r\n responsive: true,\r\n responsiveWindowInitialWidth: true,\r\n inGraphDataShow: true,\r\n annotateDisplay: true,\r\n annotateLabel: \"<%=v2+': $'+v3%>\",\r\n yAxisMinimumInterval: 250,\r\n yAxisMaximumInterval: 1000,\r\n roundNumber: -2,\r\n graphMin: 0,\r\n animationLeftToRight: true,\r\n animationEasing: \"linear\",\r\n drawXScaleLine: [{ position: \"0\", lineWidth: 1 }],\r\n scaleLabel: \"$<%=value%>\",\r\n inGraphDataTmpl: \"$<%=v3%>\",\r\n datasetFill: false\r\n };\r\n }]);\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('reportsStatementsCtrl', ['$scope', '$rootScope', '$http', 'resourceFactory', '$window', \r\n '$state', \r\n '$intercom',\r\n '$stateParams',\r\n function ($scope, $rootScope, $http, resourceFactory, $window, $state, $intercom, $stateParams) {\r\n\r\n var profileApi = resourceFactory.create('profile'),\r\n ownerstatementsApi = resourceFactory.create('ownerstatements'),\r\n incomeExpensesApi = resourceFactory.create('incomeexpenditurestatements');\r\n\r\n $scope.ownerStatementsSpinner = true;\r\n $scope.showStatements = false;\r\n $scope.showIncome = false;\r\n\r\n $rootScope.ownerTheme = true; // styling the theme of the page based on role\r\n\r\n function getOwners() {\r\n $scope.selectedOwner = null;\r\n profileApi.profiles({ profileType: 'Owner' }, function (data) {\r\n $scope.owners = data;\r\n if ($scope.owners.length > 0) {\r\n $scope.selectedOwner = $scope.owners[0];\r\n }\r\n });\r\n }\r\n\r\n function getOwnerStatements(owner) {\r\n ownerstatementsApi.query({ CompanyReference: owner.CompanyReference, ContactReference: owner.ContactReference, OwnerReference: owner.ProfileReference }, function (data) {\r\n $scope.statements = data;\r\n $scope.displayStatements = [].concat($scope.statements);\r\n insertPopoverOptions();\r\n $scope.ownerStatementsSpinner = false;\r\n }, function(error) {\r\n $scope.ownerStatementsSpinner = false;\r\n });\r\n }\r\n\r\n function insertPopoverOptions() {\r\n _($scope.displayStatements).forEach(function (statement) {\r\n var index = _.indexOf($scope.displayStatements, statement);\r\n statement.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n trigger: 'hover',\r\n container: '#attachments_' + statement.StatementReference,\r\n content: '

',\r\n placement: 'top'\r\n },\r\n };\r\n });\r\n }\r\n\r\n function getIncomeExpenses(owner) {\r\n incomeExpensesApi.query({ CompanyReference: owner.CompanyReference, ContactReference: owner.ContactReference, OwnerReference: owner.ProfileReference }, function (data) {\r\n $scope.incomeExpenses = data;\r\n $scope.displayIncomeExpenses = [].concat($scope.incomeExpenses);\r\n $scope.incomeExpensesSpinner = false;\r\n }, function (error) {\r\n $scope.incomeExpensesSpinner = false;\r\n });\r\n }\r\n\r\n $scope.$watch('selectedOwner', function (val) {\r\n if (val) {\r\n if ($stateParams.reportType) {\r\n if ($stateParams.reportType === 'incomeExpense') {\r\n $scope.incomeExpenditureTabSelected();\r\n } else {\r\n $scope.ownerStatementsTabSelected();\r\n }\r\n } else {\r\n if ($scope.showStatements) {\r\n $scope.ownerStatementsSpinner = true;\r\n getOwnerStatements(val);\r\n }\r\n\r\n if ($scope.showIncome) {\r\n $scope.incomeExpensesSpinner = true;\r\n getIncomeExpenses(val);\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.profileSelected = function (val) {\r\n if (val) {\r\n\r\n $scope.selectedOwner = val;\r\n }\r\n };\r\n\r\n $scope.statementUrl = function (statement) {\r\n if (statement) {\r\n return PTConfig.APP_API_BASE_URL +\r\n \"/Statements/OwnerStatement/\" + $scope.selectedOwner.CompanyReference +\r\n \"/\" + $scope.selectedOwner.ContactReference +\r\n \"/\" + statement.StatementReference;\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n $scope.openOwnershipStatement = function(){\r\n $window.Intercom(\"trackEvent\", \"view-ownership-statement\");\r\n };\r\n\r\n $scope.incomeExpensesUrl = function (statement) {\r\n if (statement) {\r\n return PTConfig.APP_API_BASE_URL +\r\n \"/Statements/IncomeExpenditureStatement/\" + $scope.selectedOwner.CompanyReference +\r\n \"/\" + $scope.selectedOwner.ContactReference +\r\n \"/\" + statement.StatementReference;\r\n }\r\n\r\n return \"\";\r\n };\r\n $scope.openIandE = function(){\r\n $window.Intercom(\"trackEvent\", \"view-i&e-statement\");\r\n };\r\n\r\n getOwners();\r\n\r\n $scope.ownerStatementsTabSelected = function () {\r\n $scope.ownerStatementsSpinner = true;\r\n getOwnerStatements($scope.selectedOwner);\r\n $scope.showStatements = true;\r\n $scope.showIncome = false;\r\n };\r\n\r\n $scope.incomeExpenditureTabSelected = function () {\r\n $scope.incomeExpensesSpinner = true;\r\n getIncomeExpenses($scope.selectedOwner);\r\n $scope.showIncome = true;\r\n $scope.showStatements = false;\r\n };\r\n\r\n }]);\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('manageInspectionsCtrl', ['$rootScope', '$scope', '$sce', '$http', 'flash', 'resourceFactory', '$stateParams', '$state', '$q', '$interval', 'usSpinnerService', '$window', '$timeout', 'shell', '$location', function ($rootScope, $scope, $sce, $http, flash, resourceFactory, $stateParams, $state, $q, $interval, usSpinnerService, $window, $timeout, shell, $location) {\r\n var profileApi = resourceFactory.create('profile'),\r\n inspectionapi = resourceFactory.create('inspections'),\r\n messagesApi = resourceFactory.create('messages');\r\n\r\n\r\n $scope.showInspectionWidget = false;\r\n $scope.username = $rootScope.user.Name;\r\n $scope.showProposeLink = false;\r\n $scope.hasReasonError = false;\r\n $rootScope.ownerTheme = false;\r\n $scope.showPostProposal = false;\r\n $scope.myTime = new Date();\r\n $scope.model = {};\r\n $scope.loading = true;\r\n $scope.model.reason = '';\r\n $scope.hasTimeError = false;\r\n $scope.hasDateError = false;\r\n $scope.showConfirmButton = false;\r\n \r\n $scope.proposeNewTime = function () {\r\n $scope.showConfirmButton = false;\r\n $timeout(function () {\r\n $scope.showProposeLink = false;\r\n $scope.showInspectionWidget = true;\r\n }, 500);\r\n \r\n $scope.showPostProposal = false;\r\n };\r\n\r\n function isMessagesSwitchedOff() {\r\n messagesApi.isMessagesSwitchedOff({}, function (data) {\r\n $scope.isMessagesSwitchedOff = data.IsMessagesSwitchedOff;\r\n });\r\n }\r\n\r\n isMessagesSwitchedOff();\r\n\r\n $scope.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#cancelButton',\r\n content: '
Are you sure you want to cancel your new inspection proposal?
' +\r\n '
' +\r\n '
    
',\r\n placement: 'top'\r\n }\r\n };\r\n\r\n $scope.confirmPopover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#confirmTime',\r\n content: '

This time will be locked in and no
' +\r\n 'further time or date changes can be made.

' +\r\n '
' +\r\n '
    
',\r\n placement: 'top'\r\n }\r\n };\r\n\r\n $scope.closePopover = function (event, type) {\r\n if (type === 'propose') {\r\n $scope.popover.options.dismissPopover();\r\n event.stopPropagation();\r\n } else {\r\n $scope.confirmPopover.options.dismissPopover();\r\n event.stopPropagation();\r\n }\r\n };\r\n\r\n $scope.confirmCancel = function () {\r\n $scope.showInspectionWidget = false;\r\n $scope.model.reason = '';\r\n if ($scope.model.inspectionDetails.ProposalStatus === 'TenantProposed') {\r\n $scope.setPostProposalDetails();\r\n $scope.loadInspection($scope.tenancy, $stateParams.inspectionId);\r\n } else {\r\n $scope.setInspection();\r\n } \r\n };\r\n\r\n $scope.$watch('model.selectedDate', function (val) {\r\n if (val) {\r\n $scope.hasDateError = false;\r\n } \r\n });\r\n\r\n $scope.$watch('model.selectedTime', function (val) {\r\n if (val) {\r\n $scope.hasTimeError = false;\r\n }\r\n });\r\n\r\n $scope.$watch('model.reason', function (val) {\r\n if (val) {\r\n $scope.hasReasonError = false;\r\n }\r\n });\r\n\r\n $scope.setPostProposalDetails = function () {\r\n $scope.showPostProposal = true;\r\n $scope.showInspectionWidget = false;\r\n $scope.showProposeLink = true;\r\n $scope.showConfirmButton = false;\r\n $scope.model.headerText = \"ORIGINAL PROPOSED TIME\";\r\n $scope.displayClientTime = $scope.getClientTimeString($scope.model.selectedTime);\r\n };\r\n\r\n $scope.savePropose = function () {\r\n var params = {\r\n CompanyReference: $scope.tenancy.CompanyReference,\r\n ContactReference: $scope.tenancy.ContactReference,\r\n InspectionId: $scope.model.inspectionDetails.InspectionID,\r\n InspectionDate: $scope.model.selectedDate,\r\n InspectionTime: $scope.model.selectedTime,\r\n Reason: $scope.model.reason\r\n };\r\n\r\n $scope.hasDateError = !$scope.model.selectedDate ? true : false;\r\n $scope.hasTimeError = !$scope.model.selectedTime ? true : false;\r\n $scope.hasReasonError = !$scope.model.reason ? true : false;\r\n if ($scope.hasDateError || $scope.hasTimeError || $scope.hasReasonError) {\r\n return;\r\n } else {\r\n $scope.loading = true;\r\n inspectionapi.proposeNewTime(params, function () {\r\n flash.success('Inspection time updated');\r\n $scope.setPostProposalDetails();\r\n $scope.loadInspection($scope.tenancy, $stateParams.inspectionId);\r\n $scope.loading = false;\r\n });\r\n }\r\n };\r\n\r\n $scope.saveConfirm = function () {\r\n var params = {\r\n CompanyReference: $scope.tenancy.CompanyReference,\r\n ContactReference: $scope.tenancy.ContactReference,\r\n InspectionId: $scope.model.inspectionDetails.InspectionID\r\n };\r\n\r\n $scope.loading = true;\r\n inspectionapi.updateStatus(params, function () {\r\n $scope.model.inspectionDetails.Status = 'Confirmed';\r\n $scope.showProposeLink = false;\r\n $scope.showConfirmButton = false;\r\n flash.success('Inspection confirmed');\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n function checkFormDirty() {\r\n return $scope.showInspectionWidget && $scope.model && $scope.model.inspectionDetails && ($scope.model.reason || $scope.model.selectedDate || $scope.model.selectedTime);\r\n }\r\n\r\n var onRouteChangeOff = $scope.$on('$stateChangeStart', routeChange);\r\n\r\n function routeChange(event, next, current) {\r\n if (checkFormDirty()) {\r\n var buttonDefinition = [{ result: 'cancel', label: 'Cancel' }, { result: 'ok', label: 'Discard New Inspection', cssClass: 'primary' }];\r\n var message = '

Your new inspection time and date have not yet been sent.
Are you sure you want to leave this page and discard your changes?

';\r\n shell.confirmBox('Confirm Cancel New Proposal', message, buttonDefinition, true)\r\n .result.then(function (result) {\r\n if (result == \"ok\") {\r\n onRouteChangeOff();\r\n $state.go(next.name, { profileType: $stateParams.profileType });\r\n }\r\n });\r\n\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n $scope.sendMessage = function() {\r\n $state.go('shell.messageThreadView', {\r\n profileType: 'tenant',\r\n threadId: $scope.model.inspectionDetails.ThreadID\r\n });\r\n };\r\n\r\n $scope.getClientTimeString = function (inspectionTime) {\r\n if (inspectionTime) {\r\n var time = moment(inspectionTime);\r\n var starTime = time.format(\"h:mm\");\r\n var startAmPm = time.format(\"A\") === 'AM' ? 'a.m' : 'p.m';\r\n\r\n var endTime = time.add($scope.model.inspectionDetails.Duration, 'minutes').format(\"h:mm\");\r\n var endAmPm = time.format(\"A\") === 'AM' ? 'a.m' : 'p.m';\r\n return starTime + ' ' + startAmPm + ' - ' + endTime + ' ' + endAmPm;\r\n }\r\n\r\n return '??:??';\r\n };\r\n\r\n $scope.loadTenancyProfile = function() {\r\n profileApi.profiles({ profileType: 'Tenancy' }, function (data) {\r\n $scope.tenancy = data[0];\r\n $scope.loadInspection($scope.tenancy, $stateParams.inspectionId);\r\n }, function (error) {\r\n $scope.loading = false;\r\n });\r\n };\r\n\r\n $scope.loadInspection = function (tenancy, inspectionId) {\r\n if (inspectionId) {\r\n var params = {\r\n CompanyReference: tenancy.CompanyReference,\r\n ContactReference: tenancy.ContactReference,\r\n InspectionId: inspectionId\r\n };\r\n\r\n inspectionapi.getInspection(params, function success(data) {\r\n $scope.loading = false;\r\n if (data.InspectionID) {\r\n $scope.model.inspectionDetails = data;\r\n $scope.model.currentStatusDisplay = data.Status === 'Closed' ? 'Conducted' : data.Status;\r\n } else {\r\n $scope.model.inspectionDetails = '';\r\n }\r\n \r\n $scope.setInspection();\r\n\r\n }, function(error) {\r\n $scope.loading = false;\r\n });\r\n } else {\r\n $scope.loading = false;\r\n return;\r\n }\r\n };\r\n\r\n $scope.loadTenancyProfile();\r\n $scope.statusList = [{ color: 'blue', status: 'proposed', isEmpty: false, isLastItem: false },\r\n { color: 'orange', status: 'confirmed', isEmpty: true, isLastItem: false },\r\n { color: 'green', status: 'conducted', isEmpty: true, isLastItem: true }];\r\n\r\n\r\n $scope.calculateDuration = function(duration) {\r\n var result = '';\r\n if (duration && duration > 59) {\r\n if (duration == 60) {\r\n result = '1 hour';\r\n } else {\r\n var totalDuration = duration / 60;\r\n var hrs = Math.floor(totalDuration);\r\n var mins = totalDuration > hrs ? Math.round((totalDuration - hrs) * 60) : 0;\r\n var hrsText = hrs > 1 ? ' hours' : ' hour';\r\n var minsText = mins > 1 ? ' minutes' : ' minute';\r\n result = mins > 0 ? hrs + hrsText + ' ' + mins + minsText : hrs + hrsText;\r\n }\r\n } else {\r\n result = duration + ' minutes';\r\n }\r\n return result;\r\n };\r\n\r\n $scope.setInspection = function () {\r\n $scope.durationText = $scope.calculateDuration($scope.model.inspectionDetails.Duration);\r\n $scope.displayAgentTime = $scope.getClientTimeString($scope.model.inspectionDetails.InspectionTime);\r\n $scope.model.selectedDate = $scope.model.inspectionDetails.ProposalStatus && $scope.model.inspectionDetails.ProposalStatus === 'TenantProposed' && $scope.model.inspectionDetails.ClientInspectionDate ? $scope.model.inspectionDetails.ClientInspectionDate : $scope.model.inspectionDetails.InspectionDate;\r\n $scope.model.selectedTime = $scope.model.inspectionDetails.ProposalStatus && $scope.model.inspectionDetails.ProposalStatus === 'TenantProposed' && $scope.model.inspectionDetails.ClientInspectionTime ? $scope.model.inspectionDetails.ClientInspectionTime : $scope.model.inspectionDetails.InspectionTime;\r\n\r\n if ($scope.model && $scope.model.inspectionDetails) {\r\n if ($scope.model.inspectionDetails.ProposalStatus === 'TenantProposed') {\r\n $scope.setPostProposalDetails();\r\n } else {\r\n switch ($scope.model.inspectionDetails.Status) {\r\n case 'Proposed':\r\n $scope.model.headerText = 'Proposed Time';\r\n $scope.showProposeLink = true;\r\n $scope.showConfirmButton = true;\r\n break;\r\n case 'Confirmed':\r\n $scope.model.headerText = 'Confirmed Inspection';\r\n $scope.showPostProposal = false;\r\n $scope.showConfirmButton = false;\r\n break;\r\n case 'Conducted':\r\n case 'Closed':\r\n $scope.model.headerText = 'Inspection Conducted';\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n }]).animation('.slide', function () {\r\n var NG_HIDE_CLASS = 'ng-hide';\r\n return {\r\n beforeAddClass: function(element, className, done) {\r\n if (className === NG_HIDE_CLASS) {\r\n element.slideUp(done);\r\n }\r\n },\r\n removeClass: function(element, className, done) {\r\n if (className === NG_HIDE_CLASS) {\r\n element.hide().slideDown(done);\r\n }\r\n }\r\n };\r\n });\r\n})();\r\n","'use strict';\r\n\r\n/* Controllers */\r\n(function () {\r\n angular.module('pt.controllers')\r\n .controller('tenancyReceiptsAndInvoicesCtrl', ['$scope', '$rootScope', '$http', 'resourceFactory', '$window', '$filter', 'usSpinnerService', '$state', '$interval',\r\n \"$intercom\",\r\n function ($scope, $rootScope, $http, resourceFactory, $window, $filter, usSpinnerService, $state, $interval, $intercom) {\r\n\r\n //------------------------------------------------------------------------------------------------\r\n // Tenancy Receipts\r\n //------------------------------------------------------------------------------------------------\r\n\r\n var profileApi = resourceFactory.create('profile'),\r\n tenancyapi = resourceFactory.create('tenancies'),\r\n receiptapi = resourceFactory.create('receipts');\r\n $scope.disabled = true;\r\n $scope.spinneractive = false;\r\n $rootScope.ownerTheme = false; // styling the theme of the page based on role\r\n $scope.showCancelledReceipts = false;\r\n $scope.showReceipts = false;\r\n $scope.showInvoices = false;\r\n $scope.displaySelectedFilters = 'Show All Invoices';\r\n\r\n $scope.receiptsFilterChange = function () {\r\n $scope.filteredReceipts = $filter('filter')($scope.receipts, function (element) {\r\n if (!$scope.showCancelledReceipts) {\r\n return !element.IsCancelled;\r\n }\r\n return true;\r\n });\r\n $scope.displayReceipts = [].concat($scope.filteredReceipts);\r\n };\r\n\r\n function getReceipts(tenant) {\r\n usSpinnerService.spin('receipts-1');\r\n tenancyapi.receipts({ CompanyReference: tenant.CompanyReference, ContactReference: tenant.ContactReference, TenancyReference: tenant.ProfileReference }, function (data) {\r\n $scope.receipts = data;\r\n $scope.receiptsFilterChange($scope.showCancelledReceipts);\r\n $scope.displayReceipts = [].concat($scope.filteredReceipts);\r\n usSpinnerService.stop('receipts-1');\r\n });\r\n }\r\n\r\n function getTenant() {\r\n profileApi.profiles({ profileType: 'Tenancy' }, function (data) {\r\n $scope.tenants = data;\r\n if ($scope.tenants.length > 0) {\r\n $scope.selectedTenant = $scope.tenants[0];\r\n }\r\n });\r\n }\r\n\r\n $scope.hasMultipleTenancies = function () {\r\n return ($scope.tenants && $scope.tenants.length > 1);\r\n };\r\n\r\n $scope.tenancySelected = function (tenancy) {\r\n $scope.selectedTenant = tenancy;\r\n };\r\n\r\n $scope.receiptUrl = function (receipt) {\r\n if (receipt) {\r\n return PTConfig.APP_API_BASE_URL +\r\n \"/receipts/\" + $scope.selectedTenant.CompanyReference +\r\n \"/\" + $scope.selectedTenant.ContactReference +\r\n \"/\" + receipt.ReceiptReference;\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n $scope.openReceipt = function(){\r\n $window.Intercom(\"trackEvent\", \"view-tenancy-receipt\");\r\n\r\n };\r\n\r\n $scope.receiptTabSelected = function () {\r\n $scope.showReceipts = true;\r\n $scope.showInvoices = false;\r\n getReceipts($scope.selectedTenant);\r\n };\r\n\r\n $scope.$watch('selectedTenant', function(val) {\r\n if (val) {\r\n if ($scope.showReceipts) {\r\n getReceipts($scope.selectedTenant);\r\n } else if ($scope.showInvoices) {\r\n getInvoices($scope.selectedTenant);\r\n }\r\n }\r\n });\r\n\r\n //------------------------------------------------------------------------------------------------\r\n // Tenancy Invoices\r\n //------------------------------------------------------------------------------------------------\r\n var invoiceapi = resourceFactory.create('tenancyInvoices');\r\n $scope.filterTypes = [{ Name: 'Cancelled', isChecked: false },\r\n { Name: 'Paid', isChecked: true },\r\n { Name: 'Part Paid', isChecked: true },\r\n { Name: 'Unpaid', isChecked: true },\r\n { Name: 'Overdue', isChecked: true }];\r\n\r\n\r\n //var filterType = filterTypes[0];\r\n $scope.invoicesFilterChange = function () {\r\n $scope.filteredInvoices = $filter('filter')($scope.invoices, function (item) {\r\n var allUncheckStatus = true;\r\n for (var i = 0; i < $scope.filterTypes.length; i++) {\r\n if ($scope.filterTypes[i].isChecked && $scope.filterTypes[i].Name === item.StatusDisplay) {\r\n return true;\r\n } else {\r\n if ($scope.filterTypes[i].Name === 'Overdue' && $scope.filterTypes[i].isChecked) {\r\n if (item.IsOverdue) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n if ($scope.filterTypes[i].isChecked) {\r\n allUncheckStatus = false;\r\n }\r\n }\r\n\r\n return allUncheckStatus;\r\n });\r\n\r\n $scope.displayInvoices = [].concat($scope.filteredInvoices);\r\n };\r\n\r\n $scope.$watch('filterTypes', function (val) {\r\n if (val) {\r\n $scope.displaySelectedFilters = '';\r\n var localItems = [];\r\n for (var i = 0; i < val.length; i++) {\r\n if (val[i].isChecked) {\r\n localItems.push(val[i].Name);\r\n }\r\n }\r\n\r\n $scope.displaySelectedFilters = localItems.length === 5 || localItems.length === 0 ? 'Show All Invoices' : localItems.join(\", \") + ' Invoices';\r\n }\r\n }, true);\r\n\r\n function getInvoices(tenant) {\r\n usSpinnerService.spin('invoices-1');\r\n tenancyapi.invoices({ CompanyReference: tenant.CompanyReference, ContactReference: tenant.ContactReference, TenancyReference: tenant.ProfileReference }, function (data) {\r\n $scope.invoices = data;\r\n usSpinnerService.stop('invoices-1');\r\n $scope.displayInvoices = $scope.invoices;\r\n insertPopoverOptions();\r\n insertPopoverOptionsForDescription();\r\n $scope.invoicesFilterChange();\r\n $interval(function () {\r\n $scope.resetThisthingy();\r\n }, 300, 1);\r\n });\r\n }\r\n\r\n $scope.resetThisthingy = function () {\r\n var localTable = $scope.displayInvoices;\r\n for (var i = 0; i < localTable.length; i++) {\r\n var description = $('#desc_' + i);\r\n if (description.width() > 700) {\r\n localTable[i].isOverFlowing = true;\r\n } else {\r\n localTable[i].isOverFlowing = false;\r\n }\r\n\r\n }\r\n };\r\n\r\n $scope.invoiceTabSelected = function () {\r\n $scope.showReceipts = false;\r\n $scope.showInvoices = true;\r\n getInvoices($scope.selectedTenant);\r\n };\r\n\r\n function insertPopoverOptions() {\r\n _($scope.displayInvoices).forEach(function (statement) {\r\n var index = _.indexOf($scope.displayInvoices, statement);\r\n if (statement.HasCreditorInvoiceAttachments) {\r\n statement.popover = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#attachments_' + statement.InvoiceReference,\r\n content: '',\r\n placement: 'top'\r\n },\r\n };\r\n\r\n for (var i = 0; i < $scope.displayInvoices[index].CreditorInvoiceAttachments.length; i++) {\r\n var local = '

' + $scope.displayInvoices[index].CreditorInvoiceAttachments[i].FileName + '
';\r\n statement.popover.options.content = statement.popover.options.content + local;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function insertPopoverOptionsForDescription() {\r\n _($scope.displayInvoices).forEach(function (statement) {\r\n var index = _.indexOf($scope.displayInvoices, statement);\r\n statement.popoverdesc = {\r\n scopeHelper: $scope,\r\n options: {\r\n html: true,\r\n container: '#invDesc_' + statement.InvoiceReference,\r\n content: '
' + $scope.displayInvoices[index].Description + '
',\r\n placement: 'top'\r\n },\r\n };\r\n });\r\n }\r\n\r\n\r\n $scope.toggleDropdown = function ($event) {\r\n $event.stopPropagation();\r\n };\r\n\r\n $scope.filterSelection = function () {\r\n $scope.invoicesFilterChange();\r\n };\r\n\r\n $scope.invoiceUrl = function (invoice) {\r\n if (invoice) {\r\n\r\n return PTConfig.APP_API_BASE_URL +\r\n \"/invoices/TenancyInvoices/\" + $scope.selectedTenant.CompanyReference +\r\n \"/\" + $scope.selectedTenant.ContactReference +\r\n \"/\" + invoice.InvoiceReference;\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n $scope.openInvoice = function(){\r\n $window.Intercom(\"trackEvent\", \"view-tenancy-invoice\");\r\n };\r\n\r\n\r\n //////\r\n //\r\n /////\r\n $scope.showReceipts = true;\r\n $scope.showInvoices = false;\r\n getTenant();\r\n }]);\r\n})();\r\n"]}