{"version":3,"sources":["scripts/app.js"],"names":["angular","module","component","templateUrl","bindings","panelOpen","workType","updated","controller","controllerAs","$q","$scope","$uibModal","$translate","DudeApi","log","pmAssociationsService","self","this","confirmDelete","modalInstance","open","size","backdrop","resolve","workOrderCount","workOrderTemplateCount","result","then","$delete","id","deleteWarning","count","templateCount","$onInit","panelFunctions","saveFunction","promise","$update","$save","notify","title","instant","type","message","$watch","newVal","isAssociated","associations","total","associationsValidation","validationMessage","deleteFunction","filter","pageSize","promises","WorkOrderEntity","query","$promise","WorkOrderTemplateEntity","all","results","reject","panelTitles","$uibModalInstance","close","dismiss","ok","activeChange","workOrder","$state","goToWorkOrder","go","spies","isNew","isTechnician","saveAttempt","market","marketizr","permissionsHelper","permission","canAddDueDate","userAllowed","users","update","hasMarkets","k12","ips","he","oldVal","scheduledStartDate","copy","requestDateTime","$filter","userContext","applyAdditionalFilters","workOrderEnums","moment","workOrderFormHelpers","roles","allRoles","admin","technician","requester","rolesNoRequester","modalType","applyAdditionalFiltersTo","warranty","assetMeterPanelOpen","country","account","location","priority","status","assetBrowseOptions","filterPanel","search","asset-node-search","filters","asset-category","openAssetMeterPanel","businessAsset","confirmChange","oldStatus","completionDateTime","getAttributeEntity","asset","attributeTypeKey","BusinessAssetAttributeEntity","businessAssetId","checkAssetAttributes","businessAssetAttributeCount","businessAssetAttributes","data","length","warrantyAttribute","warrantyDate","value","isSameOrAfter","Date","createdByUser","createdBy","firstName","lastName","createdTime","createdDateTime","complete","setToday","openWhen","links","objectId","linkIndex","entity","$timeout","$interval","$element","webLinkSectionService","webLinkObjectTypeIds","linkExists","resetLink","link","invalidUrl","focusOnName","focusOnUrl","REFRESH_INTERVAL","form","noDataFromUrl","refreshingMetadata","saveSuccessful","deleteSuccessful","errorMessage","titles","updatedUrl","url","trim","$error","$invalid","refreshMetadata","fromButton","WebLinksMetadataEntity","response","description","isFound","slice","thumbnail","urlValidationError","clearThumbnail","$setDirty","interval","translatedEntity","buttonFunctions","objectType","refreshPromise","exists","index","toLowerCase","cancel","WebLinksEntity","getWebLinks","push","saveButtonText","cancelFunction","splice","on","appConfig","emailRegex","securityUri","api","security","guid","emails","badEmails","emailRegEx","RegExp","buildRegistrationUrl","RegistrationLinkEntity","get","registrationGuid","generateGuid","save","regenerateGuid","deleteGuid","copyLink","isValidEmail","email","test","sendEmail","clone","replace","emailArray","split","forEach","InviteUsersEntity","spyPosition","accountAlert","originalAlert","alertIsActive","isEditing","excludeItems","property","items","postText","post","AccountAlertsEntity","alert","error","mapJoinRoles","map","role","roleName","join","edit","cancelEdit","currentProduct","Object","keys","products","product","productId","transclude","setFunction","clearFunction","disableMyFilters","filterStateService","slidingPanelSaveVariables","savedFiltersService","slidingPanelCloseService","setFiltersTemp","filtersTemp","name","filterState","activeSavedFilter","setFiltersBack","closePanel","closeSinglePanel","randomPanelName","openReviewPanelNew","savedFiltersReviewNew","savedFiltersReviewOpen","openReviewPanelUpdate","applyNoSave","newFilters","filterId","deleteSavedFilter","removeMyFilter","state","noAppliedSavedFilterButtons","primary","label","handler","secondary","separator","appliedSavedFilterButtons","slidingButtons","forceTransclude","myFiltersSlidingButtons","panelOne","splitButtons","cancelButton","panelTwo","saveButton","filtersToSave","setSavedFilter","closeAll","backButton","displayResultsCount","totalCount","buttons","isNewFilter","cancelButtonText","filterHandler","toggleFiltersFunction","popBoxName","popBoxService","POPBOX_ELEMENT","setPopBox","element","popBoxToggle","hasClass","setActiveFilter","setEditingFilter","clearFilters","isActiveFilter","workOrderFilters","dashboardService","purposeReportService","endOfDayYesterday","setEndOfDayYesterday","range","last30Days","purposeChartFilters","requestDateFrom","startDate","toISOString","requestDateTo","endDate","newRequest","workInProgress","onHold","assigneeListRoute","assignees","completedChart","queries","unassigned","assignedToMe","user","overdue","dueDateTo","scheduledEndDateTo","orderBy","purposeChartLabels","yAxis","purposeChartData","dataArray","v","workOrderChartData","purposeFunctionObject","chartFunction","filtersCopy","purpose","compliance","getOnTimeRatio","onTime","overDue","idArray","getAssigneesSummary","assigneesSummary","assetReportService","assetWorkTypeReportService","todaysDate","TOP_RESULTS","STATUSES","dataArrayZero","setupWorkTypeCharts","assetReports","assetReport","assetId","assetTotals","workOrders","workTypeReports","workTypeReport","workTypeClickFunctions","workTypeChartData","resolved","moreThanFive","assetReportQuery","assetRollUp","workTypeReportQuery","getData","emergenciesAssignedToMe","emergency","emergenciesUnassigned","allWorkOrders","dueNextSevenDays","dueDateFrom","getSevenDaysFromNow","statusReportService","newRequests","inProgress","setupStatusPieChart","totalWorkOrders","statusCounts","key","chartData","clickFunction","statusReportQuery","goToTotal","emergencies","listData","openSummaries","viewDetails","assetSummary","preserveArray","showSubList","subList","subListOrderBy","indexOf","viewDrilldownWorkOrders","workTypeId","includeDescendants","page","subListTitle","equals","isLocation","chartType","drillDownData","clientHelperService","workTypeReportService","reportFiltersService","assetReportCategory","responsiveBreakpoints","queryHelpers","screenSize","getCurrentScreenSize","chartCategories","queryDefaults","getFilters","emptyData","emptyCostData","drillDownCostChartData","drillDownChartData","updateFilters","loadAssets","assets","cost","chartLabels","costLabels","chartClass","chartDisplayType","costLegend","costChartData","drillDownPopBox","updateState","clickFunctionObject","activeAsset","breakpoint","xs","removeClass","addClass","loadWorkTypes","workTypes","workOrderLabels","drillDownChartLabels","xAxis","drillDownChartClass","subChartClickObject","clearSelection","now","laborLabels","pmScheduleType","pmScheduleFilter","businessAssets","pmScheduleTypes","METERED","MIXED","assetAttribute","disableActions","showTitle","shouldValidate","showPreviousValue","quantityCache","isMakingApiCall","setTranslation","uom","unitKey","isValidValue","val","arr","String","loadWatchers","quantities","filtered","selected","newValue","oldValue","isNaN","stopTrackingWarning","isMetered","unitOfMeasure","stopTracking","PmScheduleEntity","canStopTracking","pm","isActive","resumeTracking","hasTransactions","transactionCount","isDisplay","businessAssetAttributeType","quantityType","BusinessAssetAttributeTransactionEntity","includeAudit","orderby","transactions","directive","restrict","scope","attrs","nullOptionText","attributeType","hasAttributeTypeCodes","businessAssetAttributeTypeCodes","parseFloat","parseInt","isDefined","$compile","assetCategory","baseAttributeTypes","assetType","extensionAttributeTypes","assetAttributes","confirmReload","assetAttributeCache","childScope","baseCacheKeyPrefix","extensionCacheKeyPrefix","ELEMENT_PREFIX","DEFAULT_ATTRIBUTE","calledCount","rowBegining","rowEnding","insertDivider","appendRowEnd","createDomElement","attribute","assetAttributeIndex","html","valueType","elementName","baseAttributeCount","extensionAttributeCount","compile","$new","directives","append","sortAssetAttributeTypesByTranslatedKey","a","b","_translatedKey","sortAssetAttributeTypesByOrder","order","getByAttributeTypeKey","setUpAttribute","matchingAttribute","originalAttributes","init","baseAttributes","extensionAttributes","meterable","isMeterable","isBaseAttribute","sort","concat","directivesHtml","attributeIndex","isValid","object","isObject","resetChildScope","$destroy","empty","filterAttributes","isCategory","attr","cacheAttributes","cacheItem","cachePrefix","attributeCount","businessAssetAttributeTypes","attributeTypes","getCachedAttributes","retrieveAttributes","deferred","defer","BusinessAssetCategoryAttributeTypeEntity","BusinessAssetAttributeTypeEntity","businessAssetTypeId","resetAttributes","stringValue","toString","checkboxLabel","initData","orderByHelpers","pageChanging","ignoreForBadge","sortable","initSort","initResponse","totalListData","totals","setState","viewWorkOrders","setData","filtersToCheck","compareFilters","getListData","getTotalData","workTypeReportFilter","setFilters","pageChanged","item","isFilterApplied","chartRoute","exportWorkTypeReport","reportChartPrintService","laborHoursLabels","laborChartData","listRoute","filterCopy","printCharts","chartOne","find","parentNode","innerHTML","chartTwo","chartThree","laborHoursChartData","service","reportTooltipService","reportDataService","CHART_ITEMS_TO_SHOW","WorkTypeEntity","toApiFilter","WorkTypesSummaryEntity","WorkTypesTotalEntity","pagedWorkType","matches","laborHours","labor","purchase","fetchStandardChartData","endPoint","textPlural","textSingular","labels","dataObject","p","summary","text","f","standardTooltip","topLabel","isDrillDown","laborCost","purchaseCost","serviceCost","totalCost","tooltip","costChartTooltip","exportReport","config","$stateProvider","dateHelperProvider","routeParams","defaults","toDate","getEndOfDay","subtract","endOf","fromDate","getStartOfDay","startOf","getActiveSavedFilter","$stateParams","myFilters","queryParams","getFilterIfExistsForUser","$inject","getQueryParams","$location","defaultCopy","completionDateFrom","completionDateTo","dateRange","permissions","create","markets","getSavedFilters","factory","pagingHelpers","params","currentFilter","q","hasParent","workTypeListFilterService","workTypeListService","cloned","openPanel","workOrderId","transactionHelpers","TRANSACTIONS_CONSTANTS","readonly","READ_ONLY","removeTransaction","transactionId","returnedTransaction","deleteTransaction","transactionToDelete","transactionReference","transaction","workorderId","saveTransaction","newTransaction","getTransactions","parseTransactions","updateAny","serviceTypes","serviceType","panelObject","addTransaction","defaultTransaction","isEditable","translationType","panelTitle","subtitle","readOnly","template","laborTypes","parseStringNumber","number","setTotalCost","quantity","typeAttributes","itemCost","Math","round","unitCost","defaultQuery","parsedTransactions","WorkOrderTransactionEntity","transactionDate","laborType","regular","contract","constant","overTime","doubleTime","rental","other","array","itemResult","hours","statuses","input","taskBookService","tasks","editMode","tasksToDelete","mode","taskBook","addTasks","numberOfTasksToAdd","hideButton","print","workOrderPrintService","timezone","tz","guess","editingObject","panelOptions","ngDisabled","roleHelpers","addTechnicianAsAssignee","alreadyAssigned","assignee","startWorkOrder","completeWorkOrder","completionWatcher","functions","actionTaken","displayId","quickStatusChange","dueDate","requestDate","focus","isMap","exportSpreadsheet","includeTransactions","includeTasks","workOrderExportService","download","workOrderListService","isRequester","requestedBy","bulkPrintHelperService","quickAssigneeWatcher","quickScheduleWatcher","lastQuickActionIndex","lastQuickActionName","quickUpdates","scheduled","breakpoints","editing","sortFieldList","sortDirectionList","bulkWorkOrders","checkFilterDifferences","stateVal","updateWorkOrder","quickActionsUpdateAssignee","quickActionsUpdateSchedule","closeLastQuickAction","assigneesCopy","updateAssignees","$watchCollection","updateSchedule","oldSchedStartDate","newSchedStartDate","oldDueDate","newDueDate","format","dueDateTime","getInitialBulk","woid","Array","isArray","bulk","allBulk","updateBulk","event","stopPropagation","bulkCopy","alreadyExists","some","bulkWorkOrder","match","bulkAction","actionType","bulkPanelOpen","bulkActionType","bulkPrint","isSummary","display","loading","bulkPrintBody","timeZone","clearAll","selectAllBulk","bulkState","viewWorkOrderReadOnly","action","assignmentTypes","add","addAssignees","workOrderAssignees","isPresent","workOrderAssignee","assignmentType","getInventoryTransactions","InventoryManager","inventoryTransactions","workOrderDisplayIds","InventoryTransactionEntity","inventoryTransaction","BusinessAssetEntity","inventoryTransactionDetails","workOrderInventoryService","historyService","convertToHistoryFilter","includeSubCollections","includeDisplayIds","objectIds","queryHistory","getWorkOrdersForHistory","workOrderChanges","woIds","change","parent","ids","history","read","initialState","workOrderHistoryListService","historyChangeTypes","workOrderHistory","ignoreBadges","lastUpdated","getTime","changesIds","changes","setWorkOrders","wos","reduce","existsInList","changesResponse","setActiveChange","openFilters","filterOpen","changeDateTime","fields","details","translateFallback","planning","completion","attachments","laborTransactions","purchaseTransactions","serviceTransactions","getFields","workOrderHistoryFiltersService","thisWeekStart","thisWeekEnd","lastWeek","lastWeekStart","lastWeekEnd","thisMonthStart","thisMonthEnd","lastMonth","lastMonthStart","lastMonthEnd","usersTitle","fieldTitles","dateIncrements","isEduMarket","browseOptions","placeHolder","changeDateTimeTo","changeDateTimeFrom","userIds","WorkOrderAttachmentEntity","attachmentHelpers","fileHelpers","files","populateFiles","offsetPadding","headerOffset","outerHeight","saveUploadedAttachment","file","attachment","saveAttachmentReference","saved","filename","uploadSuccessHandler","uploading","fileToExtend","extend","uploadErrorHandler","addToList","upload","transformedFile","uploadFile","defaultPurposesService","zeroOutTime","date","setSeconds","setMilliseconds","setHours","setMinutes","setDefaults","medium","getPurpose","purposeKeys","reactivePurpose","downtimeTracking","saveRoute","setDowntimeTrackingDuration","duration","minutes","readDowntimeTrackingDuration","floor","project","ProjectEntity","hasInventory","areaRoomNumberHelper","settingsHelpers","getLocationDescription","WorkOrderTaskEntity","$document","slidingPanelSelectStorageAreaService","filesUploadingCount","canAddInventoryTransactionIssue","issue","canAddTasks","createTasks","storageAreas","openStoragePanel","openIssueToWorkOrder","openHistoryPanel","inventory","historyEntity","parentId","parentType","originalTasks","removeAttachmentErrors","workOrderSaveSuccess","disableSave","newWorkOrderAttachmentHandler","i","mime","removeFromList","fileIndex","deleteFile","noop","deleteAttachmentReference","workOrderAttachmentId","setUploadCheckInvalid","uploadCheck","$setValidity","setUploadCheckValid","performUploadCheckValidation","skipNavigationWarningModal","skipNavigationWarning","saveTasksPromises","deleteTask","deleteTaskPromise","task","addTasksPromise","showHistoryPanel","canInventory","saveWorkOrder","updatedDateTime","scrollTop","deleteAttachment","printWorkOrder","keepFiltersOpen","$dirty","filterKeys","checkArray","trade","pmSchedule","failureReason","scheduledStartDateFrom","scheduledStartDateTo","hasScheduledStartDate","hasDueDate","setDate","getDate","setOverdueFilter","dueDateParam","setUnscheduledFilter","dateComparison","oldDate","newDate","isSame","unchanged","assignee1","assignee2","hideFilters","isDisabled","$window","mobileWidth","openDefault","sorting","overdueFilter","unscheduledFilter","dueDateFilterName","assigneeTitle","assetHideCheckBox","additionalFilters","hasDateFunction","string","firstCharacter","parseKeys","modifiedKey","dateIndex","assignedToVisible","unassignedFilter","dueDateSort","setScheduled","scheduledDatesDisabled","currentScheduledRange","setUnscheduled","todayStart","todayEnd","yesterday","yesterdayStart","yesterdayEnd","nextWeek","nextWeekStart","nextWeekEnd","nextMonth","nextMonthStart","nextMonthEnd","eduScheduledStartRanges","activeFunction","mfgScheduledStartRanges","seconds","scheduledStartRanges","dueDateIncrements","requestDateIncrements","completedDateIncrements","avoidUpdates","currentScheduledIncrement","openQuickFilters","openArray","innerWidth","param","quickFilters","callback","openList","keyToUse","COMMENT_PAGE_SIZE","getCommentData","ownerId","ownerType","CommentEntity","workOrderCommentsService","showDeleteMessage","showSaveMessage","parseComments","comments","userId","parsedComments","comment","postedBy","audit","edited","isInternalCheckbox","isInternal","saveComment","newComment","owner","currentUserId","updateComment","editingComment","setEditComment","deleteComment","calendarEvents","workOrderCalendarService","isMobile","targetDate","month","year","day","dates","getDateRange","milliseconds","projectionFilter","isAfter","set","getCalendarData","parseCalendarData","calendarProjections","isBefore","isMobilePhone","assigneeRoles","mobileEvents","counts","events","targetDateCopy","updatedEvent","isToday","maximumForwardMonth","lastMonthTarget","lastDayTarget","ignoreWatcher","monthDifference","newTargetDate","yearDiff","monthLimit","setMonth","increment","setDay","mobileProjections","queryForProjections","dropFunction","dayFunction","targetId","maxDay","maxDayLimit","filterChange","updateDate","typeCounts","reactive","planned","workOrderType","dataHelperService","workOrderCategories","pmGenerated","calendarIcons","maxWeeks","weekDiff","isoWeek","queryAll","generateCalendarId","pmScheduleId","calendarObject","assetName","classes","millisecond","priorityOrder","icon","startEditable","eventDescription","start","className","constraint","end","dayChange","ceil","diff","defaultValue","equalValue","abstract","isActiveRoute","parameter","current","workOrderQuickActionsService","projections","compareIds","eventId","targetElement","scrollToElement","workOrderTemplateId","faded","objectTypeId","deleteLink","setListDescription","listDescription","substr","isEnabled","notInProducts","userListFilterService","usersTypeaheadQuery","getUsers","UserEntity","getModalData","userListService","imports","importList","importUsers","editUser","deleteModal","importUser","REQUESTER_ID","roleTypes","setRole","requesterId","myProfile","MeEntity","userRoleService","activationSent","editUserRole","isCsc","CSC","disableLogin","myId","messageTitle","messagePrefix","defaultPhoneNumber","extension","saveUser","phones","phone","phoneHasValue","isEmailPlatformUnique","validationErrors","field","code","resendActivation","ResendActivationEntity","addPhone","removePhone","hourlyRate","validity","tradeListFilterService","TradeEntity","trades","mfg","club","gov","tradeListService","editTrade","tradeDeleteFilterService","deleteTrade","saveTrade","TaskBookTaskEntity","removeTask","removeEmptyTasks","procedure","focusFirst","unbindAddTaskWatcher","MODES","COMPLETED_EDIT","COMPLETED_READONLY","READONLY","EDIT","INCOMPLETE","NOT_APPLICABLE","COMPLETE","disableInput","hasTitle","disableTitle","disableFields","isUndefined","Error","addTaskWatcher","completedReadonlyMode","completedEditMode","readonlyMode","linkId","showLink","ACTIONS","COPY","LINK","REPLACE","ADD","isPopBoxOpen","linkTaskBook","popbox","taskBookTypeahead","isMaster","removeIds","removeTasks","copyTaskbook","copiedTaskBook","apply","openPopBox","closePopBox","togglePopBox","popBoxOk","taskBookId","areThereTaskOrProceduresFilledOut","isSearching","taskBookListFilterService","TaskBookEntity","taskBooks","taskBookListService","showSearchResults","editTaskBook","pmScheduleCount","_taskBook","_taskBookSummary","pagesize","startingTaskBook","updatedTime","goToTaskBookList","errorFn","successToast","saveTaskBook","taskBookPromise","_savedTaskBook","deleteTaskBook","StatusesSummaryEntity","LABOR_HOUR_TYPE","KEYS","LOCATION_DESCRIPTION","defaultLocationDescription","isRequired","saveSetting","defaultSetting","AccountSettingsEntity","overtimeRateTypeReference","laborHourTypes","laborHourType","overtime","locationDescriptionObject","doubletimeRateTypeReference","doubletime","laborHourTypesService","getLaborHourTypes","requesterPurpose","plannedPurpose","areaRoomNumber","otRateMultiplier","dtRateMultiplier","defaultReactivePurpose","defaultPlannedPurpose","addLaborHourTypeUpdates","settingsaveSuccess","queuePromises","formSectionUpdates","LaborHourTypeEntity","getAncestorPath","ancestorIdPath","hierarchy","ancestorNamePath","displayValue","isChartView","routeTo","routeParam","ignoreChartCheck","reportType","route","top","filterArray","target","chartContentDivTag","chartContentNoPageBreak","summaryTableTag","getNamesFromIds","buildDrillDownHtml","chart","filterSection","drillDownSummary","optimalSize","workOrderChart","includes","costChart","laborChart","j","buildChartHtml","reportTitle","ignoredFilters","filtersMessage","drillDownWorkOrders","drillDownCost","drillDownLabor","includesDrillDowns","toLocaleString","noDataWarning","workOrdersChartSummary","costChartSummary","laborHoursChartSummary","k","noWorkOrderData","noCostData","noLaborHoursData","filterBody","namesData","renderedHtml","fileName","orientation","isEdu","currentYear","lastYear","fiscalStartDate","fiscalEndDate","lastFiscalStart","lastFiscalEnd","dateRanges","getDateRanges","interpretDateRanges","ranges","dateIntervals","pv","cv","from","to","dateTypes","isAssetReport","defaultOrderBy","returnAverages","requestDateRange","completionDateRange","dateFrom","dateTo","newFilter","originalFilter","assetToggle","dateValues","checkbox","assetAdditionalFilters","cleared","loadPurposes","purposes","purposeReportFilter","exportPurposeReport","purposeId","PurposeEntity","PurposesSummaryEntity","PurposesTotalEntity","pagedPurposes","panelName","purposeDeleteFilterService","deletePurpose","addPurpose","updatePurpose","workOrderTemplates","getPurposeTypes","PurposeTypeEntity","maintenanceSlidingPanelsService","purposePanelService","purposePanelVariables","purposeListService","fromSaveInactive","setSelectedNull","setUpEditPanel","purposeTypes","purposeType","isDefault","initializeService","setPurposeType","subscribe","options","getTitle","purposeTypeId","purposeListFilterService","reactiveDefault","plannedDefault","openPurposePanel","projects","projectListService","projectListFilterService","includeDetails","barStates","danger","warning","success","activeProject","emptyCost","saveProject","budget","barState","barValue","budgetRemainder","schedule","recurrencePattern","scheduleType","recurrencePatternModel","meterInterval","scheduleTypes","meteredAssets","startingThreshold","meteredAttribute","business-asset-type","notMeteredAssets","pmScheduleFiltersService","pmSchedules","pmScheduleListService","editPmSchedule","workOrderTemplate","_purpose","dueDateOffset","schedules","pmScheduleHelper","schedulesToDelete","saveSuccess","taskBookLinkId","taskBookPromises","taskToDelete","deleteSchedules","scheduleIsValid","workOrderTemplatePromise","savedWorkOrderTemplate","deletePmSchedule","addSchedule","addTaskBook","taskBookMode","defaultScheduleType","FIXED","showValidationToast","removeScrollSpy","spy","setActive","inActivate","done","__commited","addRecurrence","editingSchedule","openRecurrenceSlidingPanel","addAssets","openAssetsSlidingPanel","openAssigneesSlidingPanel","addReadings","openReadingsSlidingPanel","currentIndex","previousIndex","hasRecurrencePattern","pattern","scheduleId","getPeriodTranslationKey","period","idx","$watchGroup","scheduleForm","active","$validate","require","elm","ctrl","$validators","pmWorkTypeAssociation","modelValue","viewValue","pmAssigneeAssociation","inactiveUser","pmPurposeAssociation","pmTradeAssociation","assigneesModel","businessAssetsModel","hasValidAssets","isValidSchedule","scheduleRecurrenceIsValid","assetsAreValid","notifications","MyNotificationSettingEntity","settings","setting","keepSetting","disabled","formLabel","updateSetting","educationMarkets","manufacturingMarkets","helpLink","$rootScope","authService","featuresHelper","supportPanelService","userName","routerPath","support","phoneText","phoneHref","emailTitle","emailAddress","liveChat","logout","preventDefault","toggleSearch","searchParam","searchFunction","placeholder","createNavigationArray","navigationArray","hasPermission","accordion","hasFeature","getContext","profile","subText","accountNumber","assetFormService","saveAttributes","attributes","openPanelCallbacks","openPanelCallback","assignAssets","storageArea","getItemStorageAreas","InventoryItemStorageAreaEntity","inventoryItemId","inventoryItem","issueToWorkOrderService","quantityAdjustmentsService","originalStorageAreas","ISSUE_TO_WORK_ORDER_TRANSACTION_ID","selectedStorageArea","originalSelected","issuedFromOpen","issuedToOpen","quantityToIssue","hasQuantityOnHand","subscribeStorageAreaCallback","getSelectedStorageArea","quantityInfo","instantiateWorkOrderQuantities","inventoryTransactionReason","transactionDateTime","workOrderDisplayId","transactionQuantity","newQuantity","setStorageArea","openStoragePanelFunction","getStorageArea","navigate","emptyMessage","getFullObjectHistory","impersonatedByUser","getFieldStrings","detail","beforeString","before","afterString","after","changeEvent","historyBlacklistedFields","historyFieldNamesService","isWorkOrderType","objectTypes","path","setNames","changeObject","subname","extraData","textA","toUpperCase","changeType","textB","tracker","laborTransaction","serviceTransaction","purchaseTransaction","webLink","HistoryEntity","getHistoryEventByKey","couchBaseKey","jsonPath","output","words","lastWord","char","charAt","HEADER_OFFSET","offset","MOBILE_OFFSET","$win","undefined","_stickyElements","addRemoveStickyClass","pos","isStuck","initialPosition","recheckPositions","$on","off","readAllDetails","assetTemplate","association","invertCheck","pmAssociation","receiveCreatedNotification","deleteTasks","delete","businessAssetTypes","deleteAny","inventoryItems","inventoryTransactionReasons","accounts","departments","floorPlans","freeze","defaultPurposes","allPurposes","getAllPurposes","getPurposeByType","purposeToQuery","valueToSet","correctPurposeTypes","setDefaultPurpose","updatedDefault","option","MINIMUM_WIDTH","MINIMUM_HEIGHT","ALLOWED_FILE_TYPE","minimumSizeError","fileTooLarge","isGenericFileError","saveErrorHandler","saveError","floorPlan","FloorPlanEntity","fileId","fileViewToken","shareableGuid","minWidth","minHeight","allowedUploadTypes","feature","floorPlanListService","imageUrlPrefix","openFloorPlanListPanel","filterPanelController","isOpen","updateStatuses","checkedAll","showBadge","openOnLoad","updatePriorities","dateType","checkDateObject","validDateObject","setFilterString","isWorkOrderAsset","isInventoryStorageArea","filterString","setFilter","header","fieldsValuesList","findChanges","arr1","arr2","differences","updateSelections","isSelected","someChecked","someEmpty","parentSelected","parentIndeterminate","querySelector","indeterminate","updateAll","singleField","showToggles","filterValue","searchFromCurrentNode","newInt","isFinite","slidingPanelDisplay","values","equipment","radioValue","dudeGuid","buildPrefix","prefixPath","pathArray","pop","buildKey","sanitizeDateRanges","UserSettingsEntity","prefix","savedFilter","saveUserSetting","settingKey","isCreate","generate","findSavedFilterIndex","savedFilterIndex","toggleFilters","tempFilters","ignore","failureReportService","failureReportFilter","getFailures","failureReport","failureToggle","getAssetFailures","failureSummary","routeToWorkOrders","failure","exportFailureReport","$log","primaryFiltersCopy","DRILLDOWN_POPBOX","assetLabels","failureLabels","assetChartData","failureReasonChartData","convertAssetRollUp","desktopFailureReasonChartFunction","failures","FailuresSummaryEntity","AssetFailuresSummaryEntity","pagedAssets","matched","descendants","hierarchyArray","idHash","getWorkOrderFilters","employeeReportService","getDateIncrements","employee","getDrillDownData","updateOpenList","employeeIndex","showLabor","completedWorkOrders","totalTransactions","employeeReportFilter","exportEmployeeReport","dateFilterTitle","EmployeeSummaryEntity","EmployeeLaborSummaryEntity","DepartmentEntity","departmentListService","departmentListFilterService","department","saveDepartment","dateHelper","AssigneesSummaryEntity","OnTimeRatioEntity","currentDate","$broadcast","void","low","high","PASSWORD_LENGTH","validLength","$isEmpty","PASSWORD_FORMAT","validPassword","matchPassword","passwords","oldPassword","newPassword","reenterPassword","badPasswords","changePassword","ChangePasswordEntity","isOldPassword","currentPassword","AssetWorkTypesSummaryEntity","assetTypeListFilterService","BusinessAssetTypeEntity","assetTypeListService","editAssetType","BusinessAssetCategoryEntity","businessAssetCategories","assetCount","assetCategories","assetTypeDeleteFilterService","attributeTypeCache","selectedCategories","category","goToAssetList","saveAssetType","deleteAssetType","categories","categoryCheck","categoryId","exportAssetReport","assetReportFilter","showDrilldown","determineChart","style","drillDownCharts","BusinessAssetsSummaryEntity","BusinessAssetsTotalEntity","totalsWithDescendants","root","assetFiltersService","assetListService","AccountProductsEntity","INVENTORY_MANAGER","assetListParentAsset","parentAsset","isPmSchedule","workOrderStatuses","setBreadCrumbData","broadcastAssetTotal","updateParentIdQueryParameter","queryString","getChild","hasChildren","showAssetRowBreadCrumb","assetCreate","assetFilter","openAssetFilterSlidingPanel","storageAreaParams","setExcludeItems","child","attributeSaveHandler","attributePromises","attributePromise","databoundAttributes","_isNew","ManufacturerEntity","assetNamePathSeparator","assetIdPathSeparator","businessAssetCategory","businessAssetType","_asset","categoryAttributes","currentAttributeTypes","inventoryItemQueryResults","InventoryItemEntity","businessAssetIds","inventoryTransactionQueryResults","hasQuantity","BusinessAssetAttachmentEntity","regex","isAdmin","openAttachmentSection","assetTypeFilter","businessAssetCategoryId","hasWorkOrderAssetUpdatePermission","hasInventoryStorageAreaUpdatePermission","itemList","newBusinessAssetAttachmentHandler","deleteAttachmentWarning","businessAssetAttachmentId","resetParentId","assetToReset","saveAsset","savedAsset","savedParentId","deleteAsset","addAttachment","openFileSelector","spyName","position","meteredAttributes","hasMeteredAttributes","showAssetUsage","showAssetUsageFlag","hasMeterableAttributes","meterableAttributes","addLinks","openWebLinksPanel","assetFloorPlanViewService","imageUrl","navigateToFloorPlanList","showStorageAreas","userContextLoaded","core","report","pendo","analytics","apiKey","productName","$compileProvider","$urlRouterProvider","$translateProvider","dudeApiConfigProvider","preferredLanguage","useSanitizeValueStrategy","debugInfoEnabled","otherwise","$injector","transitionTo","baseUrl","securityUrl","fileUrl","reportUrl","settingsUrl","assetUrl","historyUrl","inventoryUrl","commentUrl","pendoUrl","run","notification","baseLogObj","accountDbId","accountName","userEmail","newrelic","dudeReferenceId","actionData","addPageAction","document","body","documentElement","arguments","translations","assetFloorPlanView","floorPlanFor","assetForm","createTitle","editTitle","namePlaceholder","descriptionPlaceholder","workOrderAsset","inventoryStorageArea","notes","noAttributesMessage","inactiveWarning","hasQuantityWarning","typeahead","assetTools","buttonGroupName","addAsset","deleteLocationOrEquipment","cards","button","successBody","cannotDeleteMessage","deleteConfirm","message2","assetTypeChange","validation","categoryNullError","money","max","min","save.required","save.errors","invalidCharacter","buildAForm","assetUsage","cardHeader","cardBody","buttonText","metering","access_diameter","bridge_width","depth","diameter","discharge_diameter","distance","from_manhole","height","impeller_diameter","impeller_size","inlet_diameter","interior_depth","invert_elevation","record_length","sidewalk_width","tdh","width","access_material","access_type","account_identifier","account_number","actuator_type","acquisition_date","address","age","amp_hours","amps","approach_direction","battery_type","backplate","blower_type","breaker_type","breaker_volts","bridge_design","bridge_type","building_type","bulb_type","bus_voltage","bypass_valve","cgmp","cleanout_type","coating","common_tree_name","compressor_type","condition","cost/uom","cover_type","critical_customer","criticality","currently_open","date_opened","date_placed_in_service","date_purchased","date_removed","dc_voltage","deck_type","design_gpm","design_load_rating","discharge_pressure","disposal_date","drive_end_rotation","facing_direction","fan_type","flow_direction","flow_rate_gpm","frame","fuel_type","hoist_type","hydrant_valve","inlet_type","input_amps","input_rpm","input_volts","install_date","impeller_material","lateral_line_type","license_plate_#","light_type","lined","main_shape","manhole_condition","manhole_type","manufacturer","material","meter","metered_service","meter_type","model","model_number","motor_type","mounted_to","normally_open","normal_operating_position","number_cells","number_cylinders","official_bridge_number","open_direction","operable","output_amps","output_rpm","output_volts","packing_type","phase","pipe_type","pump_type","ratio","retroreflectivity","road_class","rpm","safety","segment_end","segment_start","serial_number","service_type","sheeting_type","signal_bulb_type","street_bulb_type","signal_type","slope","ss_pump_type","ss_water_type","street_feature_type","supplier","surface_condition","surface_install_date","surface_type","tag_number","tank_dimensions","tank_material","to_manhole","traffic_type","transmission_system","turns_to_close","usage_measurement","valve_type","valve_material","valve_mounting","valve_operator","valve_seat_material","vin","wall_material","warranty_expiration","ww_pump_type","ww_water_type","year_lined","area","size_of_park","discharge_capacity","flow_size","discharge_capacity_fluid","flow_summary","max_flow","rated_flow","dynamic_force","static_force","torque_output","rated_pressure","horsepower","wattage","load_capacity","lubrication_capacity","volume","speed","original_cost","identifier","occupancy","attributeTypeOptions","attributeTypeCodes","1-high","27_diameter","2-medium","3-low","42_diameter","4wd","abs","ac","airfoil_blade","asbcem","asp","asphalt","assembly_group_a","athletic_track","axial_flow","backward_curved_radial","backward_inclined","ball","baltimore_truss","banner","barricade","bench","bike_rack","bmp","bollard","box_span","br","brickpaver","bus_shelter","business_group_b","butterfly","cable_stayed","cantilever","cas","catchbasin","centrifugal","chain","chip_and_seal","cipp","circular","cleanout","closed","closed_lid_manhole","cmp","cobblestone","collector","colonial","combined","commercial","concrete","concrete_box_beam","concrete_box_culvert","concrete_cast_in_place","concrete_precast","concrete_precast_prestressed_with_cip","concrete_rigid_frame","concrete_slab","cone","continuous_girder","cop","cover","cp","cross_flow","csb","csu","ct","cut_off_flat_glass","d1_1c","d7_1","d7_2","d9_14","d9_2","d9_6","dc","deck_truss","diagonal_span","diaphragm","dip","domestic","door","drinking_fountain","ear","eargeo","east","eastbound","educational_group_e","effluent","electric","esplanade_bracket","excellent","factory_group_f","fair","feet","ferry","filled_spandrel_arch","fire","fluo","flushing_structure","forward_curved_multi_vane","fountain","four_way_beacon","four_way_signal","freeway","frp","g20_2","gate","gear","geo","girder_floor","good","gp","grate","gravel","grc","hand","hardcourt","hdpe","high_voltage","high-hazard_group_h","highway","horseshoe","howe_truss","hps","hydrant","hydraulic","i_5","i_beam","inc","incandescent_wtih_globe","industrial","information_sign","institutional_group_i","irrigation","jet","k_truss","kilometers","kiosk","lamp_hole","large__water_tight","left","lid","local","low_voltage","lps","m1_4","m1_5","m2_1","m3_1","m3_2","m3_3","m3_4","m4_5","m4_8a","m4_9l","m4_9r","m5_1l","m5_1r","m5_2l","m5_2r","m6_1l","m6_1r","m6_2l","m6_2r","m6_3","m6_4","m6_6l","m6_6r","m6_7l","m6_7r","m6_8","m6_9","magnetic","major_arterial","mechanical","medium_voltage","mercantile_group_m","meters","mh","miles","minor_arterial","monument","multispan_w_simple_spans","mv","newspaper_dispenser","non_district","north","northbound","northeast","northwest","ob","oblong","open_lid_manhole","open_paddle_wheel","open_radial_blade","open_spandrel_arch","oth","pan_girder","pccp","pe","pedestrian","pedestrian_signal","pendant","petit_truss","phone_box","piston","planter","plug","pneumatic","pole_mast","pony_truss","poor","post_box","potable","pp","pratt_truss","prestressed_concrete","programmable_visibility","psc","pvc","r1_1","r1_2","r1_3w","r1_4w","r10_11","r10_11b","r10_12","r10_6","r11_2","r11_3a","r11_4","r12_5","r2_1","r2_5c","r3_1","r3_16","r3_2","r3_5a","r3_5l","r3_5r","r3_7l","r3_7r","r4_7a","r4_7b","r5_1","r5_1a","r5_2","r5_2a","r6_1_l","r6_1_r","r6_2_r","r8_3","railroad","ramp","raw","rcp","rear_yard","reciprocating","reclaimed","recreation","rectangular","rectilinear","recycling_receptacle","residential_group_r","resource","right","roof","rotary","rotary_screw","roundway","salt","sb","screw","sculpture","sewage","shelter","shrouded_radial_blade","single_face_signal","south","southbound","southeast","southwest","sp","standard","standard_w_ears","standard_w_lock","steel_box_beam","steel_buckle_plate","steel_corrugated","steel_girder","steel_grid_exodermic","steel_grid_riveted","steel_grid_welded","steel_orthotropic","steel_rigid_frame","steel_viaduct","storage_group_s","storm","subdivided_warren_truss","suspension","t_beam","table","thermal","thermal_magnetic","through_girder","through_truss","tied_arch","timber_glued","timber_nailed","timber_plank","timber_prestressed","trapezoidal","trash_receptacle","treated","tree_grate","tree_guard","triangular","tte","turbine","type_i_engineer_grade","type_ii_super_engineer_grade","type_iii_high_intensity","type_iv_multi_layer_sheeting","type_ix_fine_grain_microprisms","type_v_metallized_microprismatic","type_vi_vinyl_backed_microprismatic","type_vii_microprismatic","type_viii_microprismatic_distinguishing","type_x_microprismatic_similar_to_types_vii_ix","unk","unknown","utility_and_miscellaneous_group_u","vane","vcp","vehicle","very_good","very_poor","w1_1l","w1_1r","w1_2l","w1_2r","w1_3l","w1_3r","w1_4l","w1_4r","w1_5l","w1_5r","w1_6l","w1_6r","w1_7","w1_8l","w1_8r","w10_1","w11_2","w11_8","w13_1","w14_1","w14_2","w17_1","w2_1","w2_2l","w2_2r","w2_4","w20_2","w20_3","w21_1a","w3_1","w3_2","w3_3","w4_5","w6_1","w6_2","w6_3","w8_5","w8_9","w9_1","w9_2","w9_2_alternate","warren_truss","warren_truss_w_verticals","water_tight","wd","west","westbound","whatley","wire_rope","assetList","addLocationOrEquipment","addLocation","createWorkOrder","viewPmSchedules","inactive","searchResultsInLocation","assetTypes","searchFromRoot","recordUsage","showing","showChild","actionDropDown","getAsset","totalWorkOrder","assetTypeForm","assetTypeName","assetTypeNamePlaceholder","assetCategoryAttributes","noGroupAttributes","dudeAsset","site","building","reassignMessage","assetTypeList","dudeProvided","dudeProvidedTrue","dudeProvidedFalse","toast","invalid","old","dashboard","completedOnTime","noScheduledWork","openByAssignee","byPurpose","myByPurpose","byLocationAndWorkType","myByLocationAndWorkType","byStatus","topFive","topSeven","requestedLastThirtyDays","dueLastThirtyDays","noWorkOrders","departmentForm","departmentName","departmentNamePlaceholder","default","departmentList","employeeReports","hoursLogged","completedWO","export","noCompletedWorkOrders","completedWorkOrder","noHours","top1000","today","thisWeek","thisMonth","fiscalYear","equipmentReports","workOrdersBy","laborHoursBy","costBy","failureReports","failuresBy","numberOf","failureReasons","totalFailures","filterBar","myFilter","clear","savedFilters","confirm","review","instructions","filterAssetCategory","show","locations","filterAssetNodeSearch","searchAll","searchWithin","filterProject","filterPurposeType","filterReportDateRange","thisFiscalYear","lastFiscalYear","thisYear","reportFilters","workOrderDate","requested","completed","filterStorageArea","inventoryStorageAreas","workOrderAssets","filterWorkType","filterWorkorderDate","filterWorkorderPriority","filterWorkorderStatus","floorPlanList","addFloorPlan","addImage","floorPlanHelperText","allowedFileTypes","assignToLocation","added","newFloorPlan","floorTypes","ariaLabels","placeholderImage","loadingSpinner","errorImage","maximumSizeError","helpers","pmAssociations","cannotInactivate","cannotDisable","itIsAssociated","theyAreAssociated","multiPm","singlePm","noHistory","viewAllHistory","slidingPanelHeader","perHour","changeTypes","Add","Update","Delete","changeFields","locationDescription","completedByUser","completedDateTime","estimatedCost","estimatedHours","downtimeTracking.cost","downtimeTracking.duration","downtimeTracking.failureReason","fileApiId","fileApiViewToken","itemPurchased","typeAttributes.laborType","typeAttributes.hours","typeAttributes.rate","typeAttributes.multiplier","typeAttributes.cost","typeAttributes.user","typeAttributes.purchaseOrder","typeAttributes.quantity","typeAttributes.unitCost","typeAttributes.supplierName","typeAttributes.serviceType","typeAttributes.vendor","attachmentCount","labortransaction","servicetransaction","purchasetransaction","weblink","NewRequest","OnHold","Complete","WorkInProgress","Void","NotApplicable","Incomplete","transactionFields","EquipmentRental","Contract","Other","historyList","issueToWorkOrder","issuedFrom","issuedTo","transferableQuantity","selectStorageArea","selectText","selectTextAbove","unitOfIssue","moreThanZeroTitle","moreThanZeroMessage","successTitle","successMessage","locationReports","meterReading","helperMessage","navBar","mainNav","toggleNav","accountSettings","WOID","invalidId","reports","calendar","locationsOrEquipment","types","more","userSettings","editProfile","notificationSettings","newWorkOrder","import","helpDropdown","phoneDisplay","WorkOrderCreated","WorkOrderCompleted","WorkOrderAssigned","pmScheduleAssets","select","locationOrEquipment","pmScheduleAssignees","pmScheduleDetails","repeats","schedulePattern","nextOccurrence","assign","assignedTo","readings","setReadings","startReadings","message1","floatingRecurrenceMessage","meteredMessage","messageSuffix","mixedMessage","or","every","pmScheduleForm","recurrenceTitle","isActiveMessage","daysToComplete","due","workOrdersAre","daysAfterStartDate","linkedTo","pmScheduleDelete","pmScheduleList","pmScheduleMeterReading","notTrackedHeader","removeWarning","pmScheduleRecurrence","scheduling","frequency","projectForm","projectName","budgetedAmount","projectNamePlaceholder","tracking","purchases","services","remaining","singular","plural","noAssociation","projectList","purposeList","purposePanel","newTitle","purposeName","cannotInactivateTitle","and","reassignMessageWorkOrders","reassignMessagePmSchedules","defaultedValue","manageDefaults","defaultModal","purposeReports","thisCalendarYear","lastCalendarYear","last7","last30","last90","employees","avg","averages","noDataMessage","byWorkOrders","byLaborHours","hour","byCost","loadingReport","settingsForm","pageTitle","laborRateMultipliers","sectionTitle","infoText","rateTypeHelperText","defaultText","helperText","helperTextSet","yes","no","laborRate","registration","requestWorkOrderForm","alerts","taskBookForm","tasksAndProceduresHeading","taskBookTitle","message1a","message1b","taskBookList","taskBookSelect","selectFrom","copyFrom","linkMessage","linkWarning","copyMessage","addTask","noResults","noTasksAdded","incomplete","notApplicable","tradeForm","tradeName","tradeList","general","cscUser","actionsText","refineBy","required","selectAll","unselectAll","notActivated","at","of","spent","actions","new","saveAndNext","saveAndEdit","saveAndFinish","back","next","emailAlreadyExists","timeEmpty","invalidNumber","abbreviations","userForm","saveTitle","saveMessage","tech","hourlyRate.max","hourlyRate.min","hourlyRate.number","userList","fullName","selectImport","webLinkCard","openCard","noImage","altDefaultPrefix","webLinkSection","noLinks","addLink","deleted","webLinkSlidingPanel","formDescription","refresh","noThumbnail","refreshForThumbnail","updateData","couldNotSave","duplicate","workOrderCalendar","assignment","dayPmProjections","updateDayLeft","updateDayRight","updateMonthLeft","updateMonthRight","workOrderComments","postComment","editComment","submitted","commentBelow","requesterVisible","privateComment","quickFilter","unscheduled","completionDate","showUnassigned","includeSubItems","next7","next30","workOrderForm","scheduledStart","notificationTitle","requesterWorkType","requesterAsset","assetInWarranty","assetViewDetails","assetRecordUsage","createdTimeLabel","systemGenerated","viewHistory","totalCost.max","totalCost.min","totalCost.number","completionDateBeforeMin","requestDateAfterMax","downtime","statusChange","workOrderFormReadOnly","about","typeOfWork","completionNotes","workOrderHistoryFilters","searchPlaceholder","fieldsChanged","workOrderHistorySummary","locationEquipment","viewWorkOrder","workOrderID","workOrderInventory","availableQuantity","noTransactions","workOrderList","wo","noResultsFound","createNew","myRequests","recurring","newestToOldest","oldestToNewest","daysLeftToComplete","updateAssignee","assignTo","updateScheduling","scheduledEnd","dateOfWork","bulkActions","addAssignee","replaceAssignee","assigneeName","updatedSuccessfully","printSummary","printForms","printLabels","workOrderTasks","totalCosts","dropDown","purchaseQuantity","purchaseItemCost","serviceTotalCost","transactionsPanel","view","purchaseTransactionsPanel","po","serviceTransactionsPanel","vendor","workTypeList","newWorkType","editWorkType","workTypePanel","setupUnit","reading","newReading","lastReading","nextWorkOrderGeneration","for","immediately","list","recordedDate","readingType","stopTrackingModal","cannotStopTrackingMessage","removeMessage","filterActionsButton","myFiltersButton","buttonLabel","saveCurrentFilters","noSavedFilters","slidingFilterPanel","applyFilterWithoutSaving","saveAndApply","saveAsNewFilter","deleteFilter","accountAlertSettings","registrationLink","requesterRegistration","share","subLabel","copyButton","generateButton","deactivateButton","send","emailButton","notifyMessage","notifyTitle","regenerateModal","copyTitle","$templateCache","put"],"mappings":"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","file":"scripts/app-693e781497.js","sourcesContent":["'use strict';\n\nangular.module('workTypeList', ['ui.router', 'list-controls', 'dropdowns', 'panels', 'dudeApi', 'translate', 'dudeLog']);\n\n/**\n * @ngdoc directive\n * @name workTypeList.work-type-form-panel\n * @restrict E\n * @description\n * Handles the sliding panel and logic for work type create/edit\n *\n * @param {object} workType a work type object to perform actions against\n * @param {boolean} panelOpen A boolean stating whether or not the sliding panel is open\n * @param {boolean} updated A boolean stating whether or not the list data should be updated\n *\n * \n */\n\n'use strict';\n\nangular.module('workTypeList')\n .component('workTypeForm', {\n templateUrl: 'app/components/workTypeList/workTypeFormPanel/workTypeFormPanel.html',\n bindings: {\n panelOpen: '=',\n workType: '<',\n updated: '='\n },\n controller: 'WorkTypeFormPanelComponent',\n controllerAs: 'workTypeForm'\n });\n\nangular.module('workTypeList')\n .controller('WorkTypeFormPanelComponent', function ($q, $scope, $uibModal, $translate, DudeApi, log, pmAssociationsService) {\n var self = this;\n\n var confirmDelete = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/workTypeList/workTypeFormPanel/workTypeDeleteConfirmModal.html',\n controller: 'WorkTypeDeleteModalController',\n controllerAs: 'deleteModal',\n size: 'sm',\n backdrop: 'static',\n resolve: {\n workOrderCount: function () {\n return '';\n },\n workOrderTemplateCount: function () {\n return '';\n }\n }\n });\n\n return modalInstance.result.then(function () {\n return self.workType.$delete({ id: self.workType.id });\n });\n };\n\n var deleteWarning = function (count, templateCount) {\n $uibModal.open({\n templateUrl: 'app/components/workTypeList/workTypeFormPanel/workTypeDeleteWarningModal.html',\n controller: 'WorkTypeDeleteModalController',\n controllerAs: 'deleteModal',\n size: 'md',\n backdrop: 'static',\n resolve: {\n workOrderCount: function () {\n return count;\n },\n workOrderTemplateCount: function () {\n return templateCount;\n }\n }\n });\n };\n\n self.$onInit = function () {\n self.panelFunctions = {\n saveFunction: function () {\n var promise = self.workType.id ? self.workType.$update({ id: self.workType.id }) : self.workType.$save();\n\n return promise.then(function () {\n log.notify({\n title: $translate.instant('workTypeList.notify.success.title'),\n type: 'success',\n message: $translate.instant('workTypeList.notify.success.message')\n });\n self.updated = true;\n });\n }\n };\n\n $scope.$watch('workTypeForm.panelOpen', function (newVal) {\n if (!newVal) {\n return;\n }\n\n var title = 'workTypeList.newWorkType';\n\n if (self.workType.id) {\n title = 'workTypeList.editWorkType';\n\n pmAssociationsService.isAssociated({ workType: self.workType.id }).then(function (result) {\n self.associations = result.total;\n self.associationsValidation = pmAssociationsService.validationMessage($translate.instant('workTypeList.workType'), self.associations);\n });\n\n self.panelFunctions.deleteFunction = function () {\n var filter = { workType: self.workType.id, pageSize: 1 };\n var promises = [DudeApi.WorkOrderEntity.query(filter).$promise, DudeApi.WorkOrderTemplateEntity.query(filter).$promise];\n\n return $q.all(promises).then(function (results) {\n if (results[0].total === 0 && results[1].total === 0) {\n return $q(function (resolve, reject) {\n confirmDelete().then(function () {\n log.notify({\n title: $translate.instant('workTypePanel.notify.delete.title'),\n type: 'success',\n message: $translate.instant('workTypePanel.notify.delete.message')\n });\n self.updated = true;\n resolve();\n }).catch(function () {\n reject();\n });\n });\n }\n return $q(function (resolve, reject) {\n deleteWarning(results[0], results[1]);\n reject();\n });\n });\n };\n } else {\n self.associations = null;\n self.associationsValidation = null;\n delete self.panelFunctions.deleteFunction;\n }\n self.panelTitles = {\n title: $translate.instant(title)\n };\n });\n };\n });\n\n'use strict';\n\nangular.module('workTypeList')\n .controller('WorkTypeDeleteModalController', function ($uibModalInstance, workOrderCount, workOrderTemplateCount) {\n var self = this;\n\n self.workOrderCount = workOrderCount.total;\n self.workOrderTemplateCount = workOrderTemplateCount.total;\n\n self.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n self.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n'use strict';\n\nangular.module('history', ['dudeApi', 'dudeControls', 'filterHelpers', 'translate', 'helpers', 'marketizr', 'maintenanceFilters']);\n\n/**\n * @ngdoc directive\n * @name history.workOrderHistorySummary\n * @restrict E\n * @description\n *\n * Displays the work order history summary card in the work order history list\n *\n * @param {object} activeChange The history event that is being interacted with\n * @param {object} workOrder The work order associated with the activeChange\n * @requires $state\n *\n */\n\n'use strict';\n\nangular.module('history')\n .component('workOrderHistorySummary', {\n templateUrl: 'app/components/workOrderHistoryList/workOrderHistorySummary/workOrderHistorySummary.html',\n bindings: {\n activeChange: '<',\n workOrder: '<'\n },\n controller: 'WorkOrderHistorySummaryController',\n controllerAs: 'workOrderHistorySummary'\n })\n .controller('WorkOrderHistorySummaryController', function ($state) {\n var self = this;\n\n self.goToWorkOrder = function () {\n $state.go('secure.workOrderFormEdit', { id: self.workOrder.id });\n };\n });\n\n'use strict';\n\nangular.module('workOrderForm', ['ui.router', 'dudeControls', 'dudeControlsFile', 'inventory-controls', 'dudeApi', 'dudeAuth', 'translate', 'workOrderInventory', 'workOrderComments', 'settingsForm', 'meterReading', 'webLinkSection', 'helpers', 'history', 'maintenanceConstants']);\n\n/**\n * @ngdoc directive\n * @name workOrderForm.work-order-planning\n * @restrict E\n * @description\n *\n * Renders the planning section of the work order form\n *\n * @param {object} workOrder The work order object\n * @param {array} spies The array of spies used by the scroll spy\n * @param {boolean} isNew Declares whether or not this is a new work order\n * @param {boolean} isTechnician Declares whether or not the logged in user is a technician\n * @param {boolean} saveAttempt Declares whether or not an attempt to save has been made\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderForm')\n .component('workOrderPlanning', {\n bindings: {\n workOrder: '=',\n spies: '=',\n isNew: '<',\n isTechnician: '<',\n saveAttempt: '<'\n },\n templateUrl: 'app/components/workOrderForm/planning/workOrderPlanning.html',\n controller: 'WorkOrderPlanningComponent',\n controllerAs: 'workOrderPlanning'\n })\n .controller('WorkOrderPlanningComponent', function ($scope, market, marketizr, permissionsHelper, permission) {\n var self = this;\n self.canAddDueDate = permissionsHelper.userAllowed(permission.users.update);\n\n self.$onInit = function () {\n if (self.isNew && marketizr.hasMarkets([market.k12, market.ips, market.he])) {\n $scope.$watch('workOrderPlanning.workOrder.requestDateTime', function (newVal, oldVal) {\n if (newVal === oldVal) {\n return;\n }\n self.workOrder.scheduledStartDate = angular.copy(self.workOrder.requestDateTime);\n });\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderForm.work-order-details\n * @restrict E\n * @description\n *\n * Renders the detail section of the work order form\n *\n * @param {object} workOrder The work order object\n * @param {boolean} isNew Declares whether or not this is a new work order\n * @param {boolean} saveAttempt Declares whether or not an attempt to save has been made\n *\n */\n\n'use strict';\n\nangular.module('workOrderForm')\n .component('workOrderDetails', {\n bindings: {\n workOrder: '=',\n isNew: '<',\n saveAttempt: '<'\n },\n templateUrl: 'app/components/workOrderForm/details/workOrderDetails.html',\n controller: 'WorkOrderDetailsComponent',\n controllerAs: 'workOrderDetails'\n })\n .controller('WorkOrderDetailsComponent', function ($scope, $filter, $uibModal, DudeApi, userContext, applyAdditionalFilters, workOrderEnums, market, moment, workOrderFormHelpers, roles) {\n var self = this;\n self.allRoles = [roles.admin, roles.technician, roles.requester];\n self.rolesNoRequester = [roles.admin, roles.technician];\n self.modalType = 'repairable';\n self.applyAdditionalFiltersTo = applyAdditionalFilters;\n self.market = market;\n self.warranty = false;\n self.assetMeterPanelOpen = false;\n self.country = userContext.account.location.country;\n\n // priority and status values\n self.priority = workOrderEnums.priority;\n self.status = workOrderEnums.status;\n\n self.assetBrowseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n },\n 'asset-category': {\n filter: 'isLocation'\n }\n }\n };\n\n self.openAssetMeterPanel = function () {\n self.assetMeterPanelOpen = !!self.workOrder.businessAsset;\n };\n\n var confirmChange = function (oldStatus) {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/workOrderForm/details/statusChangeConfirmModal.html',\n controller: 'StatusChangeModalController',\n controllerAs: 'statusChangeModalController',\n size: 'md',\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n self.workOrder.completionDateTime = null;\n }, function () {\n self.workOrder.status = oldStatus;\n });\n };\n\n var getAttributeEntity = function (asset, attributeTypeKey) {\n return DudeApi.BusinessAssetAttributeEntity.query({\n businessAssetId: asset.id,\n attributeTypeKey: attributeTypeKey\n });\n };\n\n var checkAssetAttributes = function (asset) {\n self.warranty = false;\n\n if (!asset) {\n return;\n }\n\n self.workOrder.businessAsset.businessAssetAttributeCount = 0;\n self.workOrder.businessAsset.businessAssetAttributes = [];\n\n // check if asset is under warranty\n getAttributeEntity(asset, 'warranty_expiration')\n .$promise.then(function (result) {\n if (result.data.length) {\n var warrantyAttribute = result.data;\n var warrantyDate = warrantyAttribute[0].value;\n if (warrantyDate && moment(warrantyDate).isSameOrAfter(new Date(), 'day')) {\n self.warranty = true;\n }\n }\n });\n };\n\n self.$onInit = function () {\n if (!self.isNew) {\n if (self.workOrder.businessAsset) {\n checkAssetAttributes(self.workOrder.businessAsset);\n }\n\n if (self.workOrder.createdByUser) {\n self.createdBy = self.workOrder.createdByUser.firstName + ' ' + self.workOrder.createdByUser.lastName;\n }\n self.createdTime = $filter('date')(self.workOrder.createdDateTime, 'MM/dd/yyyy h:mm a');\n }\n\n $scope.$watch('workOrderDetails.workOrder.businessAsset', function (newVal, oldVal) {\n if (newVal === oldVal) {\n return;\n }\n\n checkAssetAttributes(newVal);\n });\n\n $scope.$watch('workOrderDetails.workOrder.status', function (newVal, oldVal) {\n if (newVal === oldVal) {\n return;\n }\n\n if (newVal === self.status.complete && !self.workOrder.completionDateTime) {\n // zero out the time component if not manufacturing\n self.workOrder.completionDateTime = workOrderFormHelpers.setToday(false);\n } else if (oldVal === self.status.complete && newVal !== self.status.complete) {\n confirmChange(oldVal);\n }\n });\n };\n });\n\n'use strict';\n\nangular.module('workOrderForm')\n .controller('StatusChangeModalController', function ($uibModalInstance) {\n var self = this;\n\n self.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n self.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderForm.work-order-completion\n * @restrict E\n * @description\n *\n * Renders the completion section of the work order form\n *\n * @param {object} workOrder The work order object\n * @param {boolean} saveAttempt Declares whether or not an attempt to save has been made\n * @param {array} spies The array of spies used by the scroll spy\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderForm')\n .component('workOrderCompletion', {\n bindings: {\n workOrder: '=',\n saveAttempt: '<',\n spies: '='\n },\n templateUrl: 'app/components/workOrderForm/completion/workOrderCompletion.html',\n controller: 'WorkOrderCompletionComponent',\n controllerAs: 'workOrderCompletion'\n })\n .controller('WorkOrderCompletionComponent', function ($scope, market, workOrderEnums) {\n var self = this;\n self.status = workOrderEnums.status;\n self.market = market;\n\n self.$onInit = function () {\n $scope.$watch('workOrderCompletion.workOrder.completionDateTime', function (newVal, oldVal) {\n if (newVal === oldVal || (self.workOrder.status !== self.status.complete && oldVal)) {\n return;\n }\n\n self.workOrder.status = self.status.complete;\n });\n };\n });\n\n'use strict';\n\nangular.module('webLinkSection', ['ui.bootstrap', 'translate', 'dudeApi', 'dudeControlsConstants']);\n\n/**\n * @ngdoc directive\n * @name webLinkSection.webLinkSlidingPanel\n * @restrict E\n * @description\n *\n * The panel will let the user add additional link items to the form\n *\n * @param {boolean} openWhen Boolean for opening and closing the panel.\n * @param {array} links Array of link objects on the form. (Optional)\n * @param {int} objectId The id of the entity the user is currently editing. Must be passed through\n * for non-new entities, as it is used to determine if the entity is new. (Optional)\n * @param {int} linkIndex The index (in the links array) of the link that we are editing, if we\n * are not creating a new one. Must be passed through for non-new links. (Optional)\n * @param {string} entity The entity type the link belongs to i.e workOrder, businessAsset, or pmSchedule\n *\n */\n\n'use strict';\n\nangular.module('webLinkSection')\n .component('webLinkSlidingPanel', {\n templateUrl: 'app/components/webLinkSection/webLinkSlidingPanel/webLinkSlidingPanel.html',\n bindings: {\n openWhen: '=',\n links: '=',\n objectId: ' 0;\n\n if (exists) {\n errorMessage($translate.instant('webLinkSlidingPanel.notify.couldNotSave'),\n $translate.instant('webLinkSlidingPanel.notify.duplicate.message')\n );\n\n return $q.reject();\n }\n\n if (self.form.url.$invalid) {\n return $q.reject();\n }\n\n if (interval) {\n $interval.cancel(interval);\n }\n\n if (self.objectId) {\n self.link.objectId = self.objectId;\n self.link = new DudeApi.WebLinksEntity(self.link);\n if (linkExists) {\n return self.link.$update({ id: self.link.id }).then(function () {\n saveSuccessful();\n return webLinkSectionService.getWebLinks(self.objectId, webLinkObjectTypeIds[self.entity]).then(function (response) {\n self.links = response.data;\n resetLink();\n return null;\n });\n });\n }\n\n return self.link.$save().then(function () {\n saveSuccessful();\n return webLinkSectionService.getWebLinks(self.objectId, webLinkObjectTypeIds[self.entity]).then(function (response) {\n self.links = response.data;\n resetLink();\n return null;\n });\n });\n }\n\n if (self.linkIndex != null) {\n self.links[self.linkIndex] = angular.copy(self.link);\n resetLink();\n return $q.resolve();\n }\n\n self.links.push(angular.copy(self.link));\n resetLink();\n return $q.resolve();\n }).catch(function () {\n if (interval) {\n $interval.cancel(interval);\n }\n return $q.reject();\n });\n },\n saveButtonText: self.objectId ? $translate.instant('general.actions.save') : $translate.instant('general.actions.done'),\n cancelFunction: resetLink\n };\n\n $scope.$watch('webLinkSlidingPanel.openWhen', function (newVal) {\n if (!newVal) {\n return;\n }\n\n self.noDataFromUrl = false;\n self.refreshingMetadata = false;\n\n if (self.linkIndex != null) {\n self.link = angular.copy(self.links[self.linkIndex]);\n self.buttonFunctions.deleteFunction = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/webLinkSection/deleteConfirmModal.html',\n controller: 'DeleteConfirmModalController',\n controllerAs: 'deleteConfirmModalController',\n size: 'sm',\n backdrop: 'static'\n });\n\n return modalInstance.result.then(function () {\n if (self.link.id && self.objectId) {\n self.link = new DudeApi.WebLinksEntity(self.link);\n return self.link.$delete({ id: self.link.id }).then(function () {\n deleteSuccessful();\n return webLinkSectionService.getWebLinks(self.objectId, webLinkObjectTypeIds[self.entity]).then(function (response) {\n self.links = response.data;\n resetLink();\n\n return null;\n });\n });\n }\n self.links.splice(self.linkIndex, 1);\n\n return null;\n });\n };\n } else {\n self.link = {};\n }\n\n linkExists = !!self.link.id;\n });\n\n $element.on('$destroy', function () {\n if (interval) {\n $interval.cancel(interval);\n }\n });\n };\n });\n\n'use strict';\n\nangular.module('settingsForm', ['ui.router', 'ui.bootstrap', 'ngclipboard', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'dudeLog']);\n\n/**\n * @ngdoc directive\n * @name settingsForm.registration-link\n * @restrict E\n * @description\n *\n * The form card that allows an admin to generate a new registration link and send it to their requesters\n *\n */\n\n'use strict';\n\nangular.module('settingsForm')\n .component('registrationLink', {\n templateUrl: 'app/components/settingsForm/registrationLink/registrationLink.html',\n bindings: {\n },\n controllerAs: 'registrationLink',\n controller: 'RegistrationLinkController'\n }).controller('RegistrationLinkController', function ($uibModal, $translate, log, DudeApi, appConfig, emailRegex) {\n var self = this;\n var securityUri = appConfig.api.security;\n self.guid = '';\n self.emails = '';\n self.badEmails = [];\n var emailRegEx = new RegExp(emailRegex);\n\n var buildRegistrationUrl = function (guid) {\n return securityUri + '/register/' + guid;\n };\n\n self.$onInit = function () {\n DudeApi.RegistrationLinkEntity.get({}).$promise\n .then(function (result) {\n self.guid = result.registrationGuid ? buildRegistrationUrl(result.registrationGuid) : '';\n });\n };\n\n self.generateGuid = function () {\n DudeApi.RegistrationLinkEntity.save({}).$promise\n .then(function (result) {\n self.guid = result.registrationGuid ? buildRegistrationUrl(result.registrationGuid) : '';\n log.notify({\n type: 'success',\n title: $translate.instant('registrationLink.requesterRegistration.regenerateModal.notifyTitle'),\n message: $translate.instant('registrationLink.requesterRegistration.regenerateModal.notifyMessage')\n });\n });\n };\n\n self.regenerateGuid = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/settingsForm/registrationLink/generateNewConfirmModal.html',\n controller: 'ConfirmModalController',\n controllerAs: 'confirmModalController',\n size: 'md',\n backdrop: 'static'\n });\n\n return modalInstance.result.then(function () {\n self.generateGuid();\n });\n };\n\n self.deleteGuid = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/settingsForm/registrationLink/deleteConfirmModal.html',\n controller: 'ConfirmModalController',\n controllerAs: 'confirmModalController',\n size: 'md',\n backdrop: 'static'\n });\n\n return modalInstance.result.then(function () {\n DudeApi.RegistrationLinkEntity.delete({}).$promise\n .then(function () {\n self.guid = '';\n log.notify({\n type: 'success',\n title: $translate.instant('registrationLink.requesterRegistration.deleteModal.notifyTitle'),\n message: $translate.instant('registrationLink.requesterRegistration.deleteModal.notifyMessage')\n });\n });\n });\n };\n\n self.copyLink = function () {\n log.notify({\n type: 'success',\n title: $translate.instant('registrationLink.requesterRegistration.copyTitle'),\n message: $translate.instant('registrationLink.requesterRegistration.copyMessage')\n });\n };\n\n var isValidEmail = function (email) {\n return emailRegEx.test(email);\n };\n\n self.sendEmail = function () {\n self.badEmails = [];\n var clone = angular.copy(self.emails);\n clone = clone.replace(/ /g, ''); // remove whitespace\n\n var emailArray = clone.split(new RegExp('/|,|;|\\n|\\r/g')); // eslint-disable-line no-control-regex\n\n emailArray.forEach(function (email) {\n if (email.length > 0 && !isValidEmail(email)) {\n self.badEmails.push(email);\n }\n });\n\n if (self.badEmails.length > 0) {\n log.notify({\n type: 'error',\n title: $translate.instant('registrationLink.requesterRegistration.send.notify.error.title'),\n message: $translate.instant('registrationLink.requesterRegistration.send.notify.error.message')\n });\n } else {\n DudeApi.InviteUsersEntity.save({ emails: emailArray }).$promise\n .then(function () {\n log.notify({\n type: 'success',\n title: $translate.instant('registrationLink.requesterRegistration.send.notify.success.title'),\n message: $translate.instant('registrationLink.requesterRegistration.send.notify.success.message')\n });\n });\n }\n };\n });\n\n'use strict';\n\nangular.module('settingsForm')\n .controller('ConfirmModalController', function ($uibModalInstance) {\n var self = this;\n\n self.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n self.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n/**\n * @ngdoc directive\n * @name settingsForm.account-alert-settings\n * @restrict E\n * @description\n * @requires $uibModal\n * @requires $translate\n * @requires log\n * @requires DudeApi\n * @requires userContext\n *\n * The form card that allows an admin to set alerts for different roles\n * @param {object} spies The scroll spies object to add this component's scroll spy to\n * @param {number} spyPosition The scroll spy position\n * @param {object} accountAlert The account alert retrieved from the server\n */\n\n'use strict';\n\nangular.module('settingsForm')\n .component('accountAlertSettings', {\n templateUrl: 'app/components/settingsForm/accountAlertSettings/accountAlertSettings.html',\n bindings: {\n spies: '=',\n spyPosition: '@',\n accountAlert: '='\n },\n controllerAs: 'accountAlertSettings',\n controller: 'AccountAlertSettingsController'\n }).controller('AccountAlertSettingsController', function ($uibModal, $translate, log, DudeApi, userContext) {\n var self = this;\n\n var originalAlert = {};\n\n self.alertIsActive = false;\n self.isEditing = false;\n\n self.excludeItems = { property: 'roleName', items: ['CSC'] };\n\n self.postText = $translate.instant('accountAlertSettings.buttons.post');\n\n self.post = function () {\n DudeApi.AccountAlertsEntity.save(self.accountAlert).$promise\n .then(function (alert) {\n self.isEditing = false;\n self.alertIsActive = true;\n self.accountAlert = alert;\n log.notify({\n type: 'success',\n title: $translate.instant('accountAlertSettings.notifications.post.success.title'),\n message: $translate.instant('accountAlertSettings.notifications.post.success.message')\n });\n }, function (error) {\n log.notify({\n type: 'error',\n title: $translate.instant('accountAlertSettings.notifications.post.failure.title'),\n message: error\n });\n });\n };\n\n self.delete = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/settingsForm/accountAlertSettings/deleteConfirmModal.html',\n controller: 'ConfirmModalController',\n controllerAs: 'confirmModalController',\n size: 'md',\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n DudeApi.AccountAlertsEntity.delete(self.accountAlert).$promise\n .then(function () {\n self.alertIsActive = false;\n self.accountAlert = {\n message: '',\n roles: []\n };\n log.notify({\n type: 'success',\n title: $translate.instant('accountAlertSettings.notifications.delete.success.title'),\n message: $translate.instant('accountAlertSettings.notifications.delete.success.message')\n });\n }, function (error) {\n log.notify({\n type: 'error',\n title: $translate.instant('accountAlertSettings.notifications.delete.failure.title'),\n message: error\n });\n });\n });\n };\n\n self.mapJoinRoles = function () {\n return self.accountAlert.roles.map(function (role) {\n return role.roleName;\n }).join(', ');\n };\n\n self.edit = function () {\n originalAlert = angular.copy(self.accountAlert);\n self.isEditing = true;\n };\n\n self.cancelEdit = function () {\n self.accountAlert = angular.copy(originalAlert);\n self.isEditing = false;\n };\n\n self.$onInit = function () {\n self.alertIsActive = self.accountAlert.message !== '';\n\n var currentProduct = Object.keys(userContext.products).filter(function (product) {\n return userContext.products[product].currentProduct;\n })[0];\n\n self.productId = userContext.products[currentProduct].id;\n };\n });\n\n'use strict';\n\nangular.module('filterBar', ['translate', 'dudeControls', 'helpers']);\n\n/**\n * @ngdoc directive\n * @name filterBar.sliding-filter-panel\n * @restrict E\n * @description\n *\n * Wraps the sliding and filter panels\n *\n * @param {object} filters stores the value of all defined filters\n * @param {function} setFunction function reference to set the filters\n * @param {boolean} openWhen Determines when sliding panel should open\n * @param {function} clearFunction function reference to handle the clear action\n * @param {boolean} disableMyFilters disables the ability to save custom filters (optional)\n */\n\n'use strict';\n\nangular.module('filterBar')\n .component('slidingFilterPanel', {\n templateUrl: 'app/components/filter-bar/sliding-filter-panel/sliding-filter-panel.html',\n transclude: true,\n bindings: {\n filters: '=',\n setFunction: '&',\n openWhen: '=',\n clearFunction: '&',\n disableMyFilters: '\n *\n */\n\n'use strict';\n\nangular.module('dashboard')\n .component('mfgAdminDashboard', {\n templateUrl: 'app/components/dashboard/mfgAdmin/mfgAdminDashboard.html',\n controller: 'MfgAdminDashboardController',\n controllerAs: 'mfgAdminDashboard',\n bindings: {}\n })\n .controller('MfgAdminDashboardController', function ($state, $translate, workOrderEnums, userContext, workOrderFilters, dashboardService, purposeReportService) {\n var self = this;\n var endOfDayYesterday = workOrderFilters.setEndOfDayYesterday();\n\n var range = dashboardService.last30Days();\n var purposeChartFilters = {\n requestDateFrom: range.startDate.toISOString(),\n requestDateTo: range.endDate.toISOString(),\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.complete, workOrderEnums.status.onHold]\n };\n\n self.assigneeListRoute = function (id) {\n $state.go('secure.workOrderList', { assignees: id });\n };\n\n self.$onInit = function () {\n self.completedChart = true;\n\n self.queries = {\n newRequest: {\n status: workOrderEnums.status.newRequest\n },\n unassigned: {\n status: workOrderEnums.status.newRequest,\n unassigned: workOrderEnums.assignees.unassigned\n },\n assignedToMe: {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.onHold],\n assignees: userContext.user.id\n },\n overdue: {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.onHold],\n dueDateTo: endOfDayYesterday,\n scheduledEndDateTo: endOfDayYesterday,\n orderBy: 'DueDateTime asc'\n }\n };\n\n self.purposeChartLabels = {\n title: $translate.instant('purposeReports.workOrdersBy'),\n yAxis: $translate.instant('reports.byWorkOrders.numberOf')\n };\n\n self.purposeChartData = {\n dataArray: [['', ''], ['', { v: 0 }]]\n };\n\n self.purposeChartData = purposeReportService.workOrderChartData(purposeChartFilters, [], self.purposeChartLabels);\n\n self.purposeFunctionObject = {\n chartFunction: function (id) {\n var filtersCopy = angular.copy(purposeChartFilters);\n delete filtersCopy.orderBy;\n filtersCopy.purpose = id;\n $state.go('secure.workOrderList', filtersCopy);\n }\n };\n\n self.compliance = {};\n\n dashboardService.getOnTimeRatio().$promise.then(function (entity) {\n if ((entity.onTime + entity.overDue) > 0) {\n self.compliance = {\n dataArray: [\n ['', '', '', ''],\n ['On time', { v: entity.onTime }, '', { v: entity.overDue }]\n ],\n idArray: [\n 1\n ]\n };\n } else {\n self.completedChart = false;\n }\n });\n\n dashboardService.getAssigneesSummary().$promise.then(function (results) {\n self.assigneesSummary = results.data;\n });\n };\n });\n\n/**\n * @ngdoc directive\n * @restrict E\n * @name dashboard.k12-tech-dashboard\n * @description\n *\n * The k12 tech dashboard\n *\n *\n * \n *\n */\n\n'use strict';\n\nangular.module('dashboard')\n .component('k12TechDashboard', {\n templateUrl: 'app/components/dashboard/k12Tech/k12TechDashboard.html',\n controller: 'K12TechDashboardController',\n controllerAs: 'k12TechDashboard'\n })\n .controller('K12TechDashboardController', function ($translate, $q, $state, userContext, workOrderEnums, dashboardService, purposeReportService, assetReportService, assetWorkTypeReportService) {\n var self = this;\n var todaysDate = new Date().toISOString();\n var TOP_RESULTS = 5; // Number of top results that come back from the API.\n var STATUSES = [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.onHold];\n var purposeChartFilters = {\n status: STATUSES,\n assignees: userContext.user.id\n };\n // 0th element of the graph arrays.\n var dataArrayZero = [$translate.instant('dashboard.workType'), $translate.instant('dashboard.count')];\n var setupWorkTypeCharts = function () {\n self.assetReports.forEach(function (assetReport) {\n var assetId = assetReport.asset.id;\n self.assetTotals[assetId] = assetReport.count.workOrders;\n var dataArray = [dataArrayZero];\n var idArray = [];\n\n assetReport.workTypeReports.forEach(function (workTypeReport, index) {\n dataArray.push([workTypeReport.workType.name, { v: workTypeReport.count, id: workTypeReport.workType.id }]);\n idArray.push(index + 1); // element 0 is the title of the graph, so we're starting at 1\n self.workTypeClickFunctions[assetId] = {\n chartFunction: function (id) {\n $state.go('secure.workOrderList', { businessAsset: assetId, workType: self.workTypeChartData[assetId].dataArray[id][1].id, status: STATUSES });\n }\n };\n });\n\n self.workTypeChartData[assetId] = {\n idArray: idArray,\n dataArray: dataArray,\n resolved: true\n };\n });\n };\n\n self.moreThanFive = false;\n\n self.$onInit = function () {\n self.assetTotals = {};\n self.workTypeChartData = {};\n self.workTypeClickFunctions = {};\n self.assetReports = [];\n\n var assetReportQuery = {\n assetRollUp: null,\n pageSize: TOP_RESULTS,\n orderBy: 'Count/WorkOrders desc',\n assignees: userContext.user.id,\n status: STATUSES\n };\n var workTypeReportQuery = {\n orderBy: 'Count desc',\n status: STATUSES,\n assignees: userContext.user.id\n };\n var promises = [];\n\n assetReportService.getData(assetReportQuery).then(function (response) {\n self.assetReports = response.data;\n self.moreThanFive = response.total > 5;\n self.assetReports.forEach(function (assetReport) {\n promises.push(assetWorkTypeReportService.getData(workTypeReportQuery, assetReport.asset.id));\n });\n\n $q.all(promises).then(function (results) {\n // $q.all will keep the promises array in the order it was created and not\n // necessarily in the order that the promises were resolved.\n self.assetReports.forEach(function (assetReport, index) {\n assetReport.workTypeReports = results[index].data;\n });\n\n setupWorkTypeCharts();\n });\n });\n };\n\n self.queries = {\n emergenciesAssignedToMe: {\n status: STATUSES,\n assignees: userContext.user.id,\n priority: workOrderEnums.priority.emergency\n },\n emergenciesUnassigned: {\n status: STATUSES,\n priority: workOrderEnums.priority.emergency,\n assignees: 'all',\n unassigned: workOrderEnums.assignees.unassigned\n },\n assignedToMe: {\n status: STATUSES,\n assignees: userContext.user.id\n },\n allWorkOrders: {\n status: STATUSES,\n assignees: 'all'\n },\n dueNextSevenDays: {\n status: STATUSES,\n assignees: userContext.user.id,\n dueDateFrom: todaysDate,\n dueDateTo: dashboardService.getSevenDaysFromNow()\n },\n overdue: {\n status: STATUSES,\n assignees: userContext.user.id,\n dueDateTo: todaysDate,\n orderBy: 'DueDateTime asc'\n }\n };\n\n self.purposeChartLabels = {\n title: $translate.instant('purposeReports.workOrdersBy'),\n yAxis: $translate.instant('reports.byWorkOrders.numberOf')\n };\n\n self.purposeChartData = {\n dataArray: [['', ''], ['', { v: 0 }]]\n };\n\n self.purposeChartData = purposeReportService.workOrderChartData(purposeChartFilters, [], self.purposeChartLabels);\n\n self.purposeFunctionObject = {\n chartFunction: function (id) {\n var filtersCopy = angular.copy(purposeChartFilters);\n delete filtersCopy.orderBy;\n filtersCopy.purpose = id;\n $state.go('secure.workOrderList', filtersCopy);\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @restrict E\n * @name dashboard.k12-admin-dashboard\n * @description\n *\n * The k12 admin dashboard\n *\n *\n * \n *\n */\n\n'use strict';\n\nangular.module('dashboard')\n .component('k12AdminDashboard', {\n templateUrl: 'app/components/dashboard/k12Admin/k12AdminDashboard.html',\n controller: 'K12AdminDashboardController',\n controllerAs: 'k12AdminDashboard'\n })\n .controller('K12AdminDashboardController', function ($translate, $q, $state, userContext, workOrderEnums, workOrderFilters, dashboardService, statusReportService, assetReportService, assetWorkTypeReportService) {\n var self = this;\n var STATUSES = [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.onHold];\n var TOP_RESULTS = 5; // Number of top results that come back from the API.\n\n self.newRequests = $translate.instant('dashboard.newRequests');\n self.inProgress = $translate.instant('dashboard.inProgress');\n self.onHold = $translate.instant('dashboard.onHold');\n\n var dataArrayZero = [$translate.instant('dashboard.workType'), $translate.instant('dashboard.count')];\n var setupWorkTypeCharts = function () {\n self.assetReports.forEach(function (assetReport) {\n var assetId = assetReport.asset.id;\n self.assetTotals[assetId] = assetReport.count.workOrders;\n var dataArray = [dataArrayZero];\n var idArray = [];\n\n assetReport.workTypeReports.forEach(function (workTypeReport, index) {\n dataArray.push([workTypeReport.workType.name, { v: workTypeReport.count, id: workTypeReport.workType.id }]);\n idArray.push(index + 1); // element 0 is the title of the graph, so we're starting at 1\n self.workTypeClickFunctions[assetId] = {\n chartFunction: function (id) {\n $state.go('secure.workOrderList', { businessAsset: assetId, workType: self.workTypeChartData[assetId].dataArray[id][1].id, status: STATUSES });\n }\n };\n });\n\n self.workTypeChartData[assetId] = {\n idArray: idArray,\n dataArray: dataArray,\n resolved: true\n };\n });\n };\n\n var setupStatusPieChart = function () {\n var dataArray = [[$translate.instant('dashboard.status'), $translate.instant('dashboard.count')]];\n\n self.totalWorkOrders = 0;\n Object.keys(self.statusCounts).forEach(function (key) {\n self.totalWorkOrders += self.statusCounts[key];\n dataArray.push([key, { v: self.statusCounts[key] }]);\n });\n\n self.chartData = {\n // element 0 is the title of the graph, so we're starting at 1\n idArray: [1, 2, 3],\n dataArray: dataArray,\n resolved: true\n };\n\n self.clickFunction = {\n chartFunction: function (id) {\n var status = null;\n switch (self.chartData.dataArray[id][0]) {\n case self.newRequests:\n status = workOrderEnums.status.newRequest;\n break;\n case self.inProgress:\n status = workOrderEnums.status.workInProgress;\n break;\n case self.onHold:\n status = workOrderEnums.status.onHold;\n break;\n default:\n status = STATUSES;\n }\n\n $state.go('secure.workOrderList', { status: status });\n }\n };\n };\n\n self.moreThanFive = false;\n\n self.$onInit = function () {\n self.assetTotals = {};\n self.workTypeChartData = {};\n self.workTypeClickFunctions = {};\n\n var statusReportQuery = {\n status: STATUSES\n };\n\n var assetReportQuery = {\n assetRollUp: null,\n pageSize: TOP_RESULTS,\n orderBy: 'Count/WorkOrders desc',\n status: STATUSES\n };\n var workTypeReportQuery = {\n orderBy: 'Count desc',\n status: STATUSES\n };\n var promises = [];\n\n statusReportService.getData(statusReportQuery).then(function (response) {\n self.statusCounts = {};\n self.statusCounts[self.newRequests] = 0;\n self.statusCounts[self.inProgress] = 0;\n self.statusCounts[self.onHold] = 0;\n\n response.data.forEach(function (status) {\n if (status.status === workOrderEnums.status.onHold) {\n self.statusCounts[self.onHold] = status.count;\n } else if (status.status === workOrderEnums.status.newRequest) {\n self.statusCounts[self.newRequests] = status.count;\n } else if (status.status === workOrderEnums.status.workInProgress) {\n self.statusCounts[self.inProgress] = status.count;\n }\n });\n\n setupStatusPieChart();\n });\n\n assetReportService.getData(assetReportQuery).then(function (response) {\n self.assetReports = response.data;\n self.moreThanFive = response.total > 5;\n self.assetReports.forEach(function (assetReport) {\n promises.push(assetWorkTypeReportService.getData(workTypeReportQuery, assetReport.asset.id));\n });\n $q.all(promises).then(function (results) {\n // $q.all will keep the promises array in the order it was created and not\n // necessarily in the order that the promises were resolved.\n self.assetReports.forEach(function (assetReport, index) {\n assetReport.workTypeReports = results[index].data;\n });\n\n setupWorkTypeCharts();\n });\n });\n };\n\n self.goToTotal = function () {\n $state.go('secure.workOrderList', { status: STATUSES });\n };\n\n self.queries = {\n assignedToMe: {\n status: STATUSES,\n assignees: userContext.user.id\n },\n unassigned: {\n status: STATUSES,\n unassigned: workOrderEnums.assignees.unassigned\n },\n dueNextSevenDays: {\n status: STATUSES,\n dueDateFrom: new Date().toISOString(),\n dueDateTo: dashboardService.getSevenDaysFromNow(),\n orderBy: 'DueDateTime asc'\n },\n overdue: {\n status: STATUSES,\n dueDateTo: workOrderFilters.setEndOfDayYesterday(),\n orderBy: 'DueDateTime asc'\n },\n emergenciesUnassigned: {\n status: STATUSES,\n priority: workOrderEnums.priority.emergency,\n unassigned: workOrderEnums.assignees.unassigned\n },\n emergencies: {\n status: STATUSES,\n priority: workOrderEnums.priority.emergency\n }\n };\n });\n\n'use strict';\n\nangular.module('assetReport', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'report', 'workTypeReport']);\n\n/**\n * @ngdoc directive\n * @name assetReport.assetReportDrilldownList\n * @restrict E\n * @description\n *\n * Displays a drill down list from a specified entity corresponding to asset\n *\n * @param {string} entity The entity to query against for drill down data.\n * @param {object} filters The filters object to query with\n * @param {array} listData The list of assets summary data\n *\n */\n\n'use strict';\n\nangular.module('assetReport')\n .component('assetReportDrilldownList', {\n templateUrl: 'app/components/assetReport/assetReportDrilldownList/assetReportDrilldownList.html',\n bindings: {\n entity: '<',\n filters: '<',\n listData: '<'\n },\n controller: 'AssetReportDrilldownListController',\n controllerAs: 'drilldownList'\n })\n .controller('AssetReportDrilldownListController', function ($scope, $translate, $state, DudeApi) {\n var self = this;\n\n var openSummaries = [];\n\n self.viewDetails = function (assetSummary, preserveArray) {\n var showSubList = !assetSummary.showSubList;\n\n if (showSubList && !assetSummary.subList) {\n var filtersCopy = angular.copy(self.filters);\n filtersCopy.businessAsset = assetSummary.asset.id;\n filtersCopy.orderBy = angular.copy(self.subListOrderBy);\n\n DudeApi[self.entity].query(filtersCopy).$promise.then(function (result) {\n assetSummary.subList = result.data;\n assetSummary.showSubList = showSubList;\n });\n } else {\n assetSummary.showSubList = showSubList;\n }\n\n var index = openSummaries.indexOf(assetSummary.asset.id);\n if (showSubList && index === -1) {\n openSummaries.push(assetSummary.asset.id);\n } else if (index > -1 && !preserveArray) {\n openSummaries.splice(index, 1);\n }\n };\n\n self.viewDrilldownWorkOrders = function (workTypeId, assetId) {\n var filtersCopy = angular.copy(self.filters);\n filtersCopy.businessAsset = assetId;\n filtersCopy.workType = workTypeId;\n filtersCopy.includeDescendants = 'true';\n delete filtersCopy.orderBy;\n delete filtersCopy.page;\n $state.go('secure.workOrderList', filtersCopy);\n };\n\n self.$onInit = function () {\n if (self.entity === 'WorkTypesSummaryEntity') {\n self.subListOrderBy = 'Count/WorkOrders desc,WorkType/Name asc';\n self.subListTitle = $translate.instant('reports.workType');\n } else {\n self.subListOrderBy = 'Count/WorkOrders desc,Purpose/Name asc';\n self.subListTitle = $translate.instant('reports.purposes');\n }\n\n $scope.$watch('drilldownList.listData', function (newVal, oldVal) {\n if (angular.equals(newVal, oldVal)) {\n return;\n }\n\n newVal.forEach(function (assetSummary) {\n if (openSummaries.indexOf(assetSummary.asset.id) > -1 && !assetSummary.subList) {\n self.viewDetails(assetSummary, true);\n }\n });\n }, true);\n };\n });\n\n/**\n * @ngdoc directive\n * @name report.report-drill-down-chart\n * @restrict E\n * @description\n *\n * Displays the drill down chart\n *\n * @param {boolean} isLocation The value to determine if it is a location report or equipment report. (Optional)\n * @param {object} filters An object that contains the initial filters.\n * @param {string} chartType A string containing the type of chart it is.\n * @param {object} drillDownData An object that contains the data to be used by the parent component. (Optional)\n */\n\n'use strict';\n\nangular.module('assetReport')\n .component('reportDrillDownChart', {\n bindings: {\n isLocation: ' 0 ? filtered[0] : null;\n\n setTranslation(selected);\n }, true);\n\n $scope.$watch('assetUsage.assetAttribute.value', function (newValue, oldValue) {\n if (!isValidValue(newValue)) {\n return;\n }\n\n if (newValue.length !== 0 && isNaN(newValue)) {\n self.assetAttribute.value = oldValue;\n }\n });\n };\n\n var stopTrackingWarning = function () {\n $uibModal.open({\n templateUrl: 'app/components/assetAttributeEngine/asset-usage/assetStopTrackingWarningModal.html',\n controller: 'assetStopTrackingModalController',\n controllerAs: 'assetStopTrackingModal',\n size: 'md',\n backdrop: 'static',\n resolve: {\n businessAssetId: self.asset.id\n }\n });\n };\n\n self.cancel = function () {\n self.assetAttribute.value = '';\n self.assetAttribute.isMetered = false;\n self.assetAttribute.unitOfMeasure = null;\n };\n\n self.stopTracking = function () {\n self.isMakingApiCall = true;\n DudeApi.PmScheduleEntity.query({\n businessAssets: [self.asset.id],\n pmScheduleTypes: [pmScheduleType.MIXED, pmScheduleType.METERED]\n }).$promise.then(function (result) {\n var canStopTracking = result.total === 0;\n\n // if there are associated PMs, ensure they are all inactive\n if (!canStopTracking) {\n canStopTracking = result.data.filter(function (pm) {\n return pm.isActive;\n }).length === 0;\n }\n\n if (canStopTracking) {\n self.assetAttribute.value = '';\n self.assetAttribute.isMetered = false;\n } else {\n stopTrackingWarning();\n }\n\n self.isMakingApiCall = false;\n });\n };\n\n self.resumeTracking = function () {\n self.assetAttribute.isMetered = true;\n };\n\n self.hasTransactions = function () {\n return self.assetAttribute.transactionCount > 0;\n };\n\n self.$onInit = function () {\n // remove the value that is on the metered asset\n if (!self.showPreviousValue) {\n self.assetAttribute.value = '';\n }\n\n var uom = angular.copy(self.assetAttribute.unitOfMeasure);\n setTranslation(uom);\n\n self.isDisplay = !self.asset.id || !(uom && uom.id);\n\n if (self.isDisplay) {\n quantityCache.get(self.assetAttribute.businessAssetAttributeType.quantityType.id, self.country).then(function (result) {\n self.quantities = result;\n });\n }\n\n loadWatchers();\n\n if (self.asset.id && self.assetAttribute.id) {\n // Query for asset transactions here and set self.lastReading;\n DudeApi.BusinessAssetAttributeTransactionEntity.query({\n businessAssetId: self.asset.id,\n id: self.assetAttribute.id,\n includeAudit: true,\n pageSize: 1,\n orderby: 'Id desc'\n }).$promise.then(function (result) {\n self.transactions = result.data;\n });\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-integer\n * @restrict E\n * @description\n *\n * Display input field for asset attributes type of string data type\n *\n * @param {object} assetAttribute The model to set\n * @param {string} country string detailing current user's country on file\n * @param {string} nullOptionText string showing the default text for the dropdown null option\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeString', function () {\n return {\n restrict: 'E',\n templateUrl: 'app/components/assetAttributeEngine/asset-attribute-string/asset-attribute-string.html',\n scope: {\n assetAttribute: '=',\n country: '@'\n },\n link: function (scope, element, attrs) {\n scope.nullOptionText = attrs.nullOptionText || '';\n scope.attributeType = scope.assetAttribute.businessAssetAttributeType;\n scope.hasAttributeTypeCodes = scope.attributeType.businessAssetAttributeTypeCodes.length > 0;\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-money\n * @restrict E\n * @description\n *\n * Display input field for asset attributes type of integer data type\n *\n * @param {object} assetAttribute The model to set\n * @param {string} country string detailing current user's country on file\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeMoney', function () {\n return {\n restrict: 'E',\n templateUrl: 'app/components/assetAttributeEngine/asset-attribute-money/asset-attribute-money.html',\n scope: {\n assetAttribute: '=',\n country: '@'\n },\n link: function (scope) {\n scope.assetAttribute.value = scope.assetAttribute.value.length > 0 ? parseFloat(scope.assetAttribute.value.replace(/,/g, '')) : '';\n scope.attributeType = scope.assetAttribute.businessAssetAttributeType;\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-integer\n * @restrict E\n * @description\n *\n * Display input field for asset attributes type of integer data type\n *\n * @param {object} assetAttribute The model to set\n * @param {string} country string detailing current user's country on file\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeInteger', function () {\n return {\n restrict: 'E',\n templateUrl: 'app/components/assetAttributeEngine/asset-attribute-integer/asset-attribute-integer.html',\n scope: {\n assetAttribute: '=',\n country: '@'\n },\n link: function (scope) {\n scope.attributeType = scope.assetAttribute.businessAssetAttributeType;\n scope.$watch('assetAttribute.value', function (newValue, oldValue) {\n var arr = String(newValue).split('');\n if (arr.length === 0) {\n return;\n }\n if (arr[arr.length - 1] === '.') {\n scope.assetAttribute.value = oldValue;\n }\n\n // Fixes the case where a double is pasted in\n newValue = parseInt(newValue, 10);\n\n if (angular.isDefined(scope.assetAttribute) && isNaN(newValue)) {\n scope.assetAttribute.value = oldValue;\n }\n });\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-engine\n * @restrict E\n * @description\n *\n * Find and display correct asset attribute input type based on attribute type value type code\n *\n * @param {object} assetCategory object which drives the retrieval of base attribute types\n * @param {array} baseAttributeTypes list of types that defines the base attribute view based on the asset category\n * @param {object} assetType object which drives retrieval of extension attribute types\n * @param {array} extensionAttributeTypes list of types that defines the extension attribute view view based on the asset type\n * @param {array} assetAttributes The list of attribute instances based on the category + type pairing\n * @param {string} country string with the account's country code\n * @param {string} confirmReload callback method to parent scope\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeEngine', function ($compile, $translate, $q, DudeApi) {\n return {\n restrict: 'E',\n scope: {\n assetCategory: '=',\n baseAttributeTypes: '=',\n assetType: '=',\n extensionAttributeTypes: '=',\n assetAttributes: '=',\n country: '@',\n confirmReload: '&onChange'\n },\n link: function (scope, element) {\n scope.assetAttributeCache = {};\n var baseCacheKeyPrefix = 'base-';\n var extensionCacheKeyPrefix = 'extension-';\n\n var ELEMENT_PREFIX = 'asset-attribute-';\n var DEFAULT_ATTRIBUTE = {\n value: '',\n businessAssetAttributeType: null, // this needs to be populated when the directive renders\n unitOfMeasure: null // this should be filled in by the directive with the first value in the list of available u of m\n };\n // Called count is used to determine if we need to create a new row in the ui\n var calledCount = 0;\n var childScope;\n\n var rowBegining = function (count) {\n if (count % 2 === 0) {\n return '
';\n }\n\n return '';\n };\n\n var rowEnding = function (count) {\n if (count % 2 !== 0) {\n return '
';\n }\n return '';\n };\n\n var insertDivider = function () {\n var appendRowEnd = rowEnding(calledCount); // checking if the row should end\n calledCount = 0; // reseting called count to 0 to render extension attributes\n return appendRowEnd + '
'; // passing 0 to force row begin and 1 to force row end\n };\n\n var createDomElement = function (attribute, assetAttributeIndex) {\n var html = '';\n var valueType = attribute.businessAssetAttributeType.valueType.toLowerCase();\n if (valueType === 'databound') {\n valueType += '-' + attribute.businessAssetAttributeType.key.toLowerCase();\n }\n\n var elementName = ELEMENT_PREFIX + valueType; // Might need sanitize naming conventions.\n\n html += rowBegining(calledCount);\n html += '<' + elementName;\n html += ' asset-attribute=\"assetAttributes[' + assetAttributeIndex + ']\"';\n html += ' country=\"' + scope.country + '\"';\n html += '>';\n html += rowEnding(calledCount);\n calledCount++;\n\n // if there are base and extension attrs and the current item is the last base item\n if (scope.baseAttributeCount > 0 && scope.extensionAttributeCount > 0 && (assetAttributeIndex + 1) === scope.baseAttributeCount) {\n html += insertDivider();\n }\n return html;\n };\n\n // Compiles the html elements with angular.\n\n var compile = function (html) {\n childScope = scope.$new();\n childScope.assetAttributes = angular.copy(scope.assetAttributes);\n childScope.country = scope.country;\n var directives = angular.element(html);\n element.append(directives);\n $compile(directives)(childScope);\n childScope.$watch('assetAttributes', function () {\n scope.assetAttributes = childScope.assetAttributes;\n }, true);\n };\n\n var sortAssetAttributeTypesByTranslatedKey = function (a, b) {\n if (a.businessAssetAttributeType._translatedKey < b.businessAssetAttributeType._translatedKey) {\n return -1;\n }\n if (a.businessAssetAttributeType._translatedKey > b.businessAssetAttributeType._translatedKey) {\n return 1;\n }\n return 0;\n };\n\n var sortAssetAttributeTypesByOrder = function (a, b) {\n return a.businessAssetAttributeType.order - b.businessAssetAttributeType.order;\n };\n\n var getByAttributeTypeKey = function (assetAttributes, value) {\n var result = assetAttributes.filter(function (attribute) {\n return attribute.businessAssetAttributeType.key === value;\n });\n return result.length > 0 ? result[0] : angular.copy(DEFAULT_ATTRIBUTE);\n };\n\n var setUpAttribute = function (attributeType) {\n attributeType._translatedKey = $translate.instant('assetForm.attributeTypes.' + attributeType.key);\n\n var matchingAttribute = getByAttributeTypeKey(scope.originalAttributes, attributeType.key);\n matchingAttribute.businessAssetAttributeType = attributeType;\n // the above filter is returning an object. We need to ensure that the matching attribute is a Resource, so we new it.\n return new DudeApi.BusinessAssetAttributeEntity(matchingAttribute);\n };\n\n var init = function () {\n scope.originalAttributes = angular.copy(scope.assetAttributes);\n var baseAttributes = [];\n var extensionAttributes = [];\n\n // translate keys, merge attribute instance with its type, separate base and extension attributes\n if (angular.isDefined(scope.baseAttributeTypes)) {\n scope.assetAttributes = [];\n var meterable = 0;\n angular.forEach(scope.baseAttributeTypes, function (attributeType) {\n if (attributeType.isMeterable) {\n meterable++;\n }\n attributeType.isBaseAttribute = true;\n baseAttributes.push(setUpAttribute(attributeType));\n });\n\n if (angular.isDefined(scope.extensionAttributeTypes)) {\n angular.forEach(scope.extensionAttributeTypes, function (attributeType) {\n extensionAttributes.push(setUpAttribute(attributeType));\n });\n }\n baseAttributes.sort(sortAssetAttributeTypesByOrder);\n extensionAttributes.sort(sortAssetAttributeTypesByTranslatedKey);\n\n scope.assetAttributes = baseAttributes.concat(extensionAttributes);\n scope.baseAttributeCount = baseAttributes.length - meterable;\n scope.extensionAttributeCount = extensionAttributes.length;\n }\n\n var directivesHtml = '';\n\n angular.forEach(scope.assetAttributes, function (attribute, attributeIndex) {\n // skip meterable attribute types\n if (attribute.businessAssetAttributeType.isMeterable) {\n return;\n }\n\n directivesHtml += createDomElement(attribute, attributeIndex);\n });\n\n // Clean up incase needed\n directivesHtml += rowEnding(calledCount);\n\n compile(directivesHtml);\n };\n\n var isValid = function (object) {\n return angular.isDefined(object) && angular.isObject(object) && object !== null && object.id;\n };\n\n var resetChildScope = function () {\n if (childScope) {\n childScope.$destroy();\n }\n element.empty();\n calledCount = 0;\n init();\n };\n\n var filterAttributes = function (isCategory) {\n return scope.assetAttributes.filter(function (attr) {\n return isCategory === attr.businessAssetAttributeType.isBaseAttribute;\n });\n };\n\n var cacheAttributes = function (cacheItem, isCategory) {\n var cachePrefix = isCategory ? baseCacheKeyPrefix : extensionCacheKeyPrefix;\n scope.assetAttributeCache[cachePrefix + cacheItem.id] = {\n attributeCount: angular.copy(cacheItem.businessAssetAttributeTypes.length),\n attributeTypes: angular.copy(cacheItem.businessAssetAttributeTypes),\n assetAttributes: angular.copy(filterAttributes(isCategory))\n };\n };\n\n var getCachedAttributes = function (isCategory) {\n if (isCategory) {\n return isValid(scope.assetCategory) ? scope.assetAttributeCache[baseCacheKeyPrefix + scope.assetCategory.id] : null;\n }\n return isValid(scope.assetType) ? scope.assetAttributeCache[extensionCacheKeyPrefix + scope.assetType.id] : null;\n };\n\n var retrieveAttributes = function (isCategory) {\n var attrs = getCachedAttributes(isCategory);\n if (angular.isDefined(attrs) && attrs !== null) {\n var deferred = $q.defer();\n deferred.resolve(attrs);\n return deferred.promise;\n }\n return isCategory\n ? DudeApi.BusinessAssetCategoryAttributeTypeEntity.query({ id: scope.assetCategory.id }).$promise\n : DudeApi.BusinessAssetAttributeTypeEntity.query({ businessAssetTypeId: scope.assetType.id }).$promise;\n };\n\n var resetAttributes = function (isCategory) {\n if ((isValid(scope.assetCategory) && isCategory) || (isValid(scope.assetType) && !isCategory)) {\n retrieveAttributes(isCategory).then(function (result) {\n if (!angular.isDefined(result) || result === null) {\n scope.assetAttributes = [];\n } else {\n // if the result is from the api, we need to retrieve the data from the paged object before setting scope vals\n if (result.data) {\n result.attributeTypes = result.data;\n result.attributeCount = result.data.filter(function (attr) { return !attr.isMetered; }).length;\n result.assetAttributes = [];\n }\n if (isCategory) {\n scope.baseAttributeTypes = result.attributeTypes;\n scope.baseAttributeCount = result.attributeCount;\n // filter scope attributes to retrieve extension. Then add base\n scope.assetAttributes = filterAttributes(!isCategory).concat(result.assetAttributes);\n } else {\n scope.extensionAttributeTypes = result.attributeTypes;\n scope.extensionAttributeCount = result.attributeCount;\n // filter scope attributes to retrieve base. Then add extension\n scope.assetAttributes = filterAttributes(!isCategory).concat(result.assetAttributes);\n }\n }\n resetChildScope();\n });\n } else {\n // remove base or extension attrs if there is no category or no type\n scope.assetAttributes = filterAttributes(!isCategory);\n resetChildScope();\n }\n };\n\n scope.$watch('assetCategory', function (newVal, oldVal) {\n if (isValid(oldVal)) {\n cacheAttributes(oldVal, true);\n if (oldVal === newVal) {\n return;\n }\n }\n resetAttributes(true);\n });\n\n scope.$watch('assetType', function (newVal, oldVal) {\n if (isValid(oldVal)) {\n cacheAttributes(oldVal, false);\n if (oldVal === newVal) {\n return;\n }\n }\n resetAttributes(false);\n });\n\n init();\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-double\n * @restrict E\n * @description\n *\n * Display input field for asset attributes type of double data type\n *\n * @param {object} assetAttribute The model to set\n * @param {string} country string detailing current user's country on file\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeDouble', function () {\n return {\n restrict: 'E',\n templateUrl: 'app/components/assetAttributeEngine/asset-attribute-double/asset-attribute-double.html',\n scope: {\n assetAttribute: '=',\n country: '@'\n },\n link: function (scope) {\n scope.attributeType = scope.assetAttribute.businessAssetAttributeType;\n\n // Taken from here: http://stackoverflow.com/questions/19036443/how-to-allow-only-a-number-digits-and-decimal-point-to-be-typed-in-an-input\n scope.$watch('assetAttribute.value', function (newValue, oldValue) {\n var arr = String(newValue).split('');\n\n if (arr.length === 0) {\n return;\n }\n\n if (arr.length === 1 && (arr[0] === '-' || arr[0] === '.')) {\n return;\n }\n\n if (arr.length === 2 && newValue === '-.') {\n return;\n }\n\n if (angular.isDefined(scope.assetAttribute) && isNaN(newValue)) {\n scope.assetAttribute.value = oldValue;\n }\n });\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-date\n * @restrict E\n * @description\n *\n * Display input field for asset attributes type of date data type\n *\n * @param {object} assetAttribute The model to set\n * @param {string} country string detailing current user's country on file\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeDate', function () {\n return {\n restrict: 'E',\n templateUrl: 'app/components/assetAttributeEngine/asset-attribute-date/asset-attribute-date.html',\n scope: {\n assetAttribute: '=',\n country: '@'\n },\n link: function (scope) {\n scope.attributeType = scope.assetAttribute.businessAssetAttributeType;\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-boolean\n * @restrict E\n * @description\n *\n * Display input field for asset attributes type of boolean data type\n *\n * @param {object} assetAttribute The model to set\n * @param {string} country string detailing current user's country on file\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeBoolean', function ($translate) {\n return {\n restrict: 'E',\n templateUrl: 'app/components/assetAttributeEngine/asset-attribute-boolean/asset-attribute-boolean.html',\n scope: {\n assetAttribute: '=',\n country: '@'\n },\n link: function (scope) {\n var stringValue = scope.assetAttribute.value.toString();\n scope.assetAttribute.value = (stringValue.toLowerCase() === 'true');\n scope.attributeType = scope.assetAttribute.businessAssetAttributeType;\n scope.checkboxLabel = $translate.instant('assetForm.attributeTypeOptions.checkbox');\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name asset-attribute.asset-attribute-databound-manufacturer\n * @restrict E\n * @description\n *\n * Display input field for asset attributes type of date data type\n *\n * @param {object} assetAttribute The model to set\n * @param {string} country string detailing current user's country on file\n *\n */\n\n'use strict';\n\nangular.module('asset-attribute')\n .directive('assetAttributeDataboundManufacturer', function () {\n return {\n restrict: 'E',\n templateUrl: 'app/components/assetAttributeEngine/asset-attribute-databound-manufacturer/asset-attribute-databound-manufacturer.html',\n scope: {\n assetAttribute: '=',\n country: '@'\n },\n link: function (scope) {\n if (angular.isObject(scope.assetAttribute.value)) {\n scope.assetAttribute.value = scope.assetAttribute.value.id;\n }\n scope.attributeType = scope.assetAttribute.businessAssetAttributeType;\n }\n };\n });\n\n'use strict';\n\nangular.module('workTypeReport', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'report']);\n\n'use strict';\n\nangular.module('workTypeReport')\n .controller('WorkTypeReportListController', function ($scope, $state, initData, reportFiltersService, workTypeReportService, queryHelpers, orderByHelpers, filterStateService) {\n var self = this;\n var queryDefaults = reportFiltersService.getFilters({});\n var pageChanging = false;\n\n var filtersCopy = angular.copy(self.filters);\n\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'includeDescendants', 'returnAverages', 'assetRollUp', 'isLocation', 'filterId', 'requestDateRange', 'completionDateRange'];\n\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.listData = initData.initResponse.data;\n self.totalListData = initData.totals;\n self.totalCount = initData.initResponse.total;\n self.filters = initData.filters;\n\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n filtersCopy = angular.copy(self.filters);\n queryDefaults = reportFiltersService.getFilters({});\n\n self.viewWorkOrders = function (id) {\n filtersCopy = angular.copy(self.filters);\n delete filtersCopy.orderBy;\n delete filtersCopy.page;\n delete filtersCopy.pageSize;\n filtersCopy.workType = id;\n filtersCopy.includeDescendants = filtersCopy.assetRollUp;\n $state.go('secure.workOrderList', filtersCopy);\n };\n\n var setData = function (response) {\n self.listData = response.data;\n self.filterState.totalCount = response.total;\n };\n\n var updateFilters = function () {\n var filtersToCheck = ['purpose', 'status', 'workType', 'requestDateTo', 'requestDateFrom', 'requestDateRange', 'completionDateFrom', 'completionDateTo', 'completionDateRange', 'businessAsset', 'assetRollUp', 'page', 'orderBy', 'returnAverages'];\n if (reportFiltersService.compareFilters(self.filters, filtersCopy, filtersToCheck)) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n filtersCopy = angular.copy(self.filters);\n pageChanging = false;\n\n workTypeReportService.loadWorkTypes(filtersCopy).then(function (workTypes) {\n workTypeReportService.getListData(filtersCopy, workTypes).then(setData);\n });\n\n workTypeReportService.getTotalData(filtersCopy).then(function (totals) {\n self.totalListData = totals;\n });\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n self.workTypeReportFilter = function () {\n self.openWhen = { value: true };\n };\n\n self.setFilters = function (value, save) {\n self.filters = reportFiltersService.getFilters(value.query);\n filterStateService.setFilters(value, save);\n };\n\n self.clearFilters = function (removeMyFilter) {\n self.filters = reportFiltersService.getFilters(\n {\n orderBy: self.filters.orderBy,\n assetRollUp: self.filters.includeDescendants\n });\n filterStateService.clearFilters(removeMyFilter);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.isFilterApplied = function () {\n return reportFiltersService.isFilterApplied(self.filters);\n };\n\n self.chartRoute = function () {\n $state.go('secure.report.workTypeChart', self.filters);\n };\n\n self.export = function () {\n workTypeReportService.exportWorkTypeReport(self.filters);\n };\n\n $scope.$watch('workTypeReport.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('workTypeReport')\n .controller('WorkTypeReportChartController', function ($scope, $state, $translate, $element, initData, workTypeReportService, reportChartPrintService, reportFiltersService, queryHelpers, filterStateService) {\n var self = this;\n var queryDefaults = reportFiltersService.getFilters({});\n var filtersCopy = {};\n var emptyData = {\n dataArray: [['', ''], ['', { v: 0 }]]\n };\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'includeDescendants', 'returnAverages', 'assetRollUp', 'isLocation', 'filterId', 'requestDateRange', 'completionDateRange'];\n\n self.filters = initData.filters;\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n self.workOrderLabels = {\n title: $translate.instant('workTypeReports.workOrdersBy'),\n yAxis: $translate.instant('reports.byWorkOrders.numberOf')\n };\n\n self.laborHoursLabels = {\n title: $translate.instant('workTypeReports.laborHoursBy'),\n yAxis: $translate.instant('reports.byLaborHours.hours')\n };\n\n self.costLabels = {\n title: $translate.instant('workTypeReports.costBy'),\n yAxis: $translate.instant('reports.byCost.cost')\n };\n\n self.costLegend = [\n $translate.instant('reports.byCost.purchase'),\n $translate.instant('reports.byCost.service'),\n $translate.instant('reports.byCost.labor')\n ];\n\n self.workOrderChartData = angular.copy(emptyData);\n self.laborChartData = angular.copy(emptyData);\n self.costChartData = angular.copy([['', '', ''], ['', { v: 0 }, { v: 0 }]]);\n\n var updateFilters = function () {\n var filtersToCheck = ['purpose', 'status', 'workType', 'requestDateTo', 'requestDateFrom', 'requestDateRange', 'completionDateFrom', 'completionDateTo', 'completionDateRange', 'businessAsset', 'assetRollUp'];\n if (reportFiltersService.compareFilters(self.filters, filtersCopy, filtersToCheck)) {\n return;\n }\n\n filtersCopy = angular.copy(self.filters);\n\n self.workOrderLabels.title = $translate.instant('workTypeReports.workOrdersBy');\n self.laborHoursLabels.title = $translate.instant('workTypeReports.laborHoursBy');\n self.costLabels.title = $translate.instant('workTypeReports.costBy');\n\n workTypeReportService.loadWorkTypes(self.filters).then(function (workTypes) {\n self.workOrderChartData = workTypeReportService.workOrderChartData(filtersCopy, workTypes, self.workOrderLabels);\n self.laborChartData = workTypeReportService.laborChartData(filtersCopy, workTypes, self.laborHoursLabels);\n self.costChartData = workTypeReportService.costChartData(filtersCopy, workTypes, self.costLabels);\n });\n\n delete (filtersCopy.orderBy);\n queryHelpers.updateState(filtersCopy, queryDefaults);\n };\n\n self.isFilterApplied = function () {\n return reportFiltersService.isFilterApplied(self.filters);\n };\n\n self.clickFunctionObject = {\n chartFunction: function (id) {\n filtersCopy = angular.copy(self.filters);\n delete filtersCopy.orderBy;\n delete filtersCopy.page;\n delete filtersCopy.pageSize;\n filtersCopy.workType = id;\n filtersCopy.includeDescendants = filtersCopy.assetRollUp;\n $state.go('secure.workOrderList', filtersCopy);\n }\n };\n\n self.listRoute = function () {\n var filterCopy = angular.copy(self.filters);\n delete (filterCopy.orderBy);\n $state.go('secure.report.workTypeList', filterCopy);\n };\n\n self.printCharts = function () {\n var chartOne = angular.element($element.find('.work-order-chart svg'))[0].parentNode.innerHTML;\n var chartTwo = angular.element($element.find('.cost-chart svg'))[0].parentNode.innerHTML;\n var chartThree = angular.element($element.find('.labor-hours-chart svg'))[0].parentNode.innerHTML;\n\n var costLegend = $element.find('.cost-chart .chart-legend')[0] && angular.element($element.find('.cost-chart .chart-legend'))[0].parentNode.innerHTML;\n costLegend = costLegend || '';\n chartTwo = costLegend + chartTwo;\n\n if (!chartOne || !chartTwo || !chartThree) {\n return;\n }\n var html = [chartOne, chartTwo, chartThree];\n reportChartPrintService.printCharts(html, self.filters, {\n workOrderChartData: self.workOrderChartData,\n laborHoursChartData: self.laborChartData,\n costChartData: self.costChartData\n }, 'workType');\n };\n\n self.workTypeReportFilter = function () {\n self.openWhen = { value: true };\n };\n\n self.setFilters = function (value, save) {\n self.filters = reportFiltersService.getFilters(value.query);\n filterStateService.setFilters(value, save);\n };\n\n self.clearFilters = function (removeMyFilter) {\n self.filters = reportFiltersService.getFilters({\n orderBy: self.filters.orderBy,\n assetRollUp: self.filters.includeDescendants\n });\n filterStateService.clearFilters(removeMyFilter);\n };\n\n $scope.$watch('workTypeReport.filters', updateFilters, true);\n });\n\n/**\n * @ngdoc service\n * @name workTypeReport.workTypeReportService\n * @requires $q - {@link https://docs.angularjs.org/api/ng/service/$q read the docs}\n * @requires $filter - {@link https://docs.angularjs.org/api/ng/service/$filter read the docs}\n * @requires $translate - {@link https://angular-translate.github.io/docs/#/api/pascalprecht.translate.$translate read the docs}\n * @requires DudeApi - {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApi.DudeApi read the docs}\n * @requires report.reportFiltersService\n * @requires report.reportTooltipService\n * @requires report.reportDataService\n *\n * @description\n * Service for supporting the gathering and parsing of data for the Work Type Report\n *\n */\n'use strict';\n\nangular.module('workTypeReport')\n .service('workTypeReportService', function ($q, $filter, $translate, DudeApi, reportFiltersService, reportTooltipService, reportDataService) {\n var CHART_ITEMS_TO_SHOW = 5;\n var pageSize;\n\n /**\n * @ngdoc method\n * @name loadWorkTypes\n * @methodOf workTypeReport.workTypeReportService\n *\n * @description\n * Get the list of work types.\n *\n * @param {object} filter The object containing the current filters\n */\n var loadWorkTypes = function (filter) {\n var deferred = $q.defer();\n var workTypes = [];\n if (filter.workType && filter.workType.length) {\n filter.workType.forEach(function (workTypeId) {\n workTypes.push(DudeApi.WorkTypeEntity.get({ id: workTypeId }).$promise);\n });\n $q.all(workTypes).then(deferred.resolve, deferred.reject);\n } else {\n deferred.resolve(workTypes);\n }\n return deferred.promise;\n };\n\n var getFilters = function (query) {\n return reportFiltersService.toApiFilter(query);\n };\n\n var getData = function (query) {\n var filters = reportFiltersService.toApiFilter(query);\n return DudeApi.WorkTypesSummaryEntity.query(filters).$promise;\n };\n\n /**\n * @ngdoc method\n * @name getTotalData\n * @methodOf workTypeReport.workTypeReportService\n *\n * @description\n * Gets the totals data for the list view of work orders by work types\n *\n * @param {object} query An object containing the filters to query with\n */\n var getTotalData = function (query) {\n var filters = reportFiltersService.toApiFilter(query);\n return DudeApi.WorkTypesTotalEntity.query(filters).$promise;\n };\n\n /**\n * @ngdoc method\n * @name getListData\n * @methodOf workTypeReport.workTypeReportService\n *\n * @description\n * Gets the data for the list view of work orders by work type\n *\n * @param {object} query An object containing the filters to query with\n * @param {array} workTypes Array of Work Types to return data for\n */\n var getListData = function (query, workTypes) {\n return getData(query).then(function (pagedWorkType) {\n workTypes.forEach(function (workType) {\n var matches = $filter('filter')(pagedWorkType.data, function (value) {\n return value.workType.id === workType.id;\n }).length;\n\n if (matches) {\n return;\n }\n\n pagedWorkType.count++;\n pagedWorkType.data.push({\n workType: workType,\n count: {\n workOrders: 0,\n laborHours: 0\n },\n cost: {\n labor: 0,\n purchase: 0,\n total: 0\n }\n });\n });\n return pagedWorkType;\n });\n };\n\n var fetchStandardChartData = function (filter, workTypes, endPoint, textPlural, textSingular, labels) {\n filter = reportFiltersService.toApiFilter(filter);\n filter.pageSize = workTypes.length || pageSize || CHART_ITEMS_TO_SHOW;\n\n var dataObject = {\n idArray: [],\n dataArray: [[$translate.instant('workTypeReports.workTypes'), '', {\n type: 'string',\n role: 'tooltip',\n p: { html: true }\n }]],\n resolved: false\n };\n\n getData(filter).then(function (results) {\n results.data.forEach(function (summary) {\n var text = summary.count[endPoint] === 1 ? textSingular : textPlural;\n if (summary.count[endPoint] > 0) {\n dataObject.dataArray.push([\n summary.workType.name,\n { v: summary.count[endPoint], f: $filter('number')(summary.count[endPoint]) + ' ' + text },\n reportTooltipService.standardTooltip(summary.workType, $filter('number')(summary.count[endPoint]) + ' ' + text)\n ]);\n dataObject.idArray.push(summary.workType.id);\n }\n });\n\n reportDataService.topLabel(workTypes, results, dataObject, labels, 5);\n\n workTypes.forEach(function (workType) {\n if (dataObject.idArray.indexOf(workType.id) > -1 || dataObject.idArray.length >= filter.pageSize) {\n return;\n }\n\n dataObject.dataArray.push([\n workType.name,\n { v: 0, f: '0' + textPlural },\n ''\n ]);\n dataObject.idArray.push(workType.id);\n });\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name workOrderChartData\n * @methodOf workTypeReport.workTypeReportService\n *\n * @description\n * Returns the number of work orders broken down by Work Type.\n *\n * @param {object} filter The object containing the current filters\n * @param {array} workTypes Array of Work Types to return data for\n * @param {object} labels The object that contains the labels for the chart\n * @param {boolean} isDrillDown Defines if the data is for a drill down chart\n */\n var workOrderChartData = function (filter, workTypes, labels, isDrillDown) {\n isDrillDown = isDrillDown || false;\n pageSize = isDrillDown ? 1000 : CHART_ITEMS_TO_SHOW;\n filter.orderBy = 'Count/WorkOrders desc,WorkType/Name asc';\n\n return fetchStandardChartData(filter, workTypes, 'workOrders', $translate.instant('reports.byWorkOrders.workOrders'), $translate.instant('reports.byWorkOrders.workOrder'), labels);\n };\n\n /**\n * @ngdoc method\n * @name laborChartData\n * @methodOf workTypeReport.workTypeReportService\n *\n * @description\n * Returns the work order labor hours broken down by Work Type.\n *\n * @param {object} filter The object containing the current filters\n * @param {object} workTypes Array of Work Types to return data for\n * @param {object} labels The object that contains the labels for the chart\n * @param {boolean} isDrillDown Defines if the data is for a drill down chart\n */\n var laborChartData = function (filter, workTypes, labels, isDrillDown) {\n isDrillDown = isDrillDown || false;\n pageSize = isDrillDown ? 1000 : CHART_ITEMS_TO_SHOW;\n filter.orderBy = 'Count/LaborHours desc,WorkType/Name asc';\n\n return fetchStandardChartData(filter, workTypes, 'laborHours', $translate.instant('reports.byLaborHours.hours'), $translate.instant('reports.byLaborHours.hour'), labels);\n };\n\n /**\n * @ngdoc method\n * @name costChartData\n * @methodOf workTypeReport.workTypeReportService\n *\n * @description\n * Returns the work order cost data broken down by Work Type.\n *\n * @param {object} filter The object containing the current filters\n * @param {array} workTypes Array of Work Types to return data for\n * @param {object} labels The object that contains the labels for the chart\n * @param {boolean} isDrillDown Defines if the data is for a drill down chart\n */\n var costChartData = function (filter, workTypes, labels, isDrillDown) {\n isDrillDown = isDrillDown || false;\n pageSize = isDrillDown ? 1000 : CHART_ITEMS_TO_SHOW;\n\n filter = reportFiltersService.toApiFilter(filter);\n filter.pageSize = workTypes.length || pageSize;\n filter.orderBy = 'Cost/Total desc,WorkType/Name asc';\n\n var dataObject = {\n idArray: [],\n dataArray: [[$translate.instant('workTypeReports.workTypes'),\n '', { type: 'string', role: 'tooltip', p: { html: true } },\n '', { type: 'string', role: 'tooltip', p: { html: true } },\n '', { type: 'string', role: 'tooltip', p: { html: true } }]],\n resolved: false\n };\n\n getData(filter).then(function (results) {\n results.data.forEach(function (summary) {\n if (!summary.cost) {\n return;\n }\n\n var laborCost = $filter('currency')(summary.cost.labor) + ' ' + $translate.instant('reports.byCost.labor');\n var purchaseCost = $filter('currency')(summary.cost.purchase) + ' ' + $translate.instant('reports.byCost.purchase');\n var serviceCost = $filter('currency')(summary.cost.service) + ' ' + $translate.instant('reports.byCost.service');\n var totalCost = $filter('currency')(summary.cost.total) + ' ' + $translate.instant('reports.byCost.total');\n\n var tooltip = reportTooltipService.costChartTooltip(summary.workType, laborCost, purchaseCost, serviceCost, totalCost);\n\n if (summary.cost.total > 0) {\n dataObject.dataArray.push([\n summary.workType.name,\n { v: summary.cost.purchase, f: laborCost },\n tooltip,\n { v: summary.cost.service, f: serviceCost },\n tooltip,\n { v: summary.cost.labor, f: purchaseCost },\n tooltip\n ]);\n dataObject.idArray.push(summary.workType.id);\n }\n });\n\n reportDataService.topLabel(workTypes, results, dataObject, labels, 5);\n\n workTypes.forEach(function (workType) {\n if (dataObject.idArray.indexOf(workType.id) > -1 || dataObject.idArray.length >= filter.pageSize) {\n return;\n }\n\n dataObject.dataArray.push([\n workType.name,\n { v: 0, f: '0' + $translate.instant('reports.byLaborHours.hours') },\n '',\n { v: 0, f: '0' + $translate.instant('reports.byLaborHours.hours') },\n ''\n ]);\n dataObject.idArray.push(workType.id);\n });\n\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name exportWorkTypeReport\n * @methodOf workTypeReport.workTypeReportService\n *\n * @description\n * Exports a csv of work orders by work type\n *\n * @param {object} query An object containing the filters to query with\n */\n var exportWorkTypeReport = function (query) {\n var filters = getFilters(query);\n reportDataService.exportReport(filters, 'workordersbyworktype');\n };\n\n return {\n loadWorkTypes: loadWorkTypes,\n getListData: getListData,\n workOrderChartData: workOrderChartData,\n laborChartData: laborChartData,\n costChartData: costChartData,\n exportWorkTypeReport: exportWorkTypeReport,\n getTotalData: getTotalData\n };\n });\n\n'use strict';\n\nangular.module('workTypeReport')\n .config(function ($stateProvider, permission, moment, workOrderEnums, dateHelperProvider, market) {\n var routeParams = 'status&workType&purpose&requestDateTo&requestDateFrom&requestDateRange&completionDateTo&completionDateFrom&completionDateRange&dateRange&businessAsset&includeDescendants&assetRollUp&orderBy&returnAverages&filterId';\n var defaults = {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.complete, workOrderEnums.status.onHold],\n toDate: dateHelperProvider.getEndOfDay(moment().subtract(1, 'month').endOf('month')).toISOString(),\n fromDate: dateHelperProvider.getStartOfDay(moment().subtract(1, 'month').startOf('month')).toISOString()\n };\n\n var getActiveSavedFilter = function ($stateParams, myFilters, savedFiltersService) {\n var queryParams = $stateParams;\n if (queryParams.filterId) {\n return savedFiltersService.getFilterIfExistsForUser(queryParams.filterId, myFilters);\n }\n return null;\n };\n\n var getQueryParams = function ($location, $stateParams, activeSavedFilter) {\n var defaultCopy = angular.copy(defaults);\n var queryParams = $stateParams;\n queryParams.status = (queryParams.status || defaultCopy.status);\n queryParams.assetRollUp = queryParams.includeDescendants || queryParams.assetRollUp || null;\n queryParams.includeDescendants = null;\n if (!queryParams.requestDateTo && !queryParams.requestDateFrom && !queryParams.completionDateFrom && !queryParams.completionDateTo && !queryParams.dateRange) {\n queryParams.requestDateTo = defaultCopy.toDate;\n queryParams.requestDateFrom = defaultCopy.fromDate;\n }\n\n if (!queryParams.filterId) {\n queryParams.status = queryParams.status || defaultCopy.status;\n }\n // If requesting a saved filter created for a different page or by a different user, remove the filter id\n if (queryParams.filterId && !activeSavedFilter) {\n delete queryParams.filterId;\n $location.search('filterId', null);\n }\n return queryParams;\n };\n\n $stateProvider\n .state('secure.report.workTypeList', {\n url: 'workType/list?page&pageSize&' + routeParams,\n templateUrl: 'app/components/workTypeReport/workTypeReportList.html',\n controller: 'WorkTypeReportListController',\n controllerAs: 'workTypeReport',\n permissions: [permission.workTypes.create, permission.workTypes.update, permission.workTypes.delete],\n markets: [market.he, market.k12, market.ips],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/workType/list');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $q, $stateParams, myFilters, activeSavedFilter, workTypeReportService, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter);\n if (!queryParams.orderBy || (queryParams.orderBy && queryParams.orderBy.indexOf('TotalsWithDescendants') > -1)) {\n queryParams.orderBy = 'Count/WorkOrders desc,WorkType/Name asc';\n }\n var filters = reportFiltersService.toApiFilter(queryParams);\n\n return $q.all({\n initResponse: workTypeReportService.loadWorkTypes(filters).then(function (workTypes) {\n return workTypeReportService.getListData(filters, workTypes);\n }),\n filters: filters,\n totals: workTypeReportService.getTotalData(filters),\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n });\n }\n }\n })\n .state('secure.report.workTypeChart', {\n url: 'workType/chart?' + routeParams,\n templateUrl: 'app/components/workTypeReport/workTypeReportChart.html',\n controller: 'WorkTypeReportChartController',\n controllerAs: 'workTypeReport',\n permissions: [permission.workTypes.create, permission.workTypes.update, permission.workTypes.delete],\n markets: [market.he, market.k12, market.ips],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/workType/chart');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $stateParams, activeSavedFilter, marketizr, myFilters, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter);\n var filters = reportFiltersService.getFilters(queryParams);\n\n return {\n filters: filters,\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n };\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('workTypeList')\n .factory('workTypeListFilterService', function ($location, pagingHelpers) {\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Parent/Name asc,Name asc',\n q: params.q || null,\n isActive: params.isActive || null,\n hasParent: params.hasParent || true\n };\n\n return currentFilter;\n };\n\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter\n };\n });\n\n'use strict';\n\nangular.module('workTypeList')\n .service('workTypeListService', function (DudeApi, workTypeListFilterService) {\n var getListData = function (query) {\n var filters = workTypeListFilterService.toApiFilter(query);\n\n return DudeApi.WorkTypeEntity.query(filters);\n };\n\n return {\n getListData: getListData\n };\n });\n\n'use strict';\n\nangular.module('workTypeList')\n .config(function ($stateProvider, market, permission) {\n $stateProvider\n .state('secure.workTypeList', {\n url: 'workTypes?page&pageSize&q&isActive',\n templateUrl: 'app/components/workTypeList/workTypeList.html',\n controller: 'WorkTypeListController',\n controllerAs: 'workTypeList',\n permissions: [permission.workTypes.create, permission.workTypes.update, permission.workTypes.delete],\n markets: [market.k12, market.ips, market.he],\n resolve: {\n initData: function ($q, $stateParams, workTypeListService, workTypeListFilterService) {\n var queryParams = $stateParams;\n var filters = workTypeListFilterService.getFilters(queryParams);\n\n return $q.all({\n initResponse: workTypeListService.getListData(filters).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('workTypeList')\n .controller('WorkTypeListController', function ($scope, $state, DudeApi, workTypeListService, workTypeListFilterService, queryHelpers, orderByHelpers, initData) {\n var self = this;\n var queryDefaults = workTypeListFilterService.getFilters({});\n var pageChanging = false;\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n workTypeListService.getListData(self.filters).$promise.then(setData);\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n // view model\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.totalCount = initData.initResponse.total;\n self.listData = initData.initResponse.data;\n self.panelOpen = false;\n self.updated = false;\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.isActive = cloned.isActive !== '' ? cloned.isActive : null;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, workTypeListFilterService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.openPanel = function (workType) {\n if (!workType) {\n workType = new DudeApi.WorkTypeEntity({});\n }\n self.workType = workType;\n self.panelOpen = true;\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.clearFilters = function () {\n self.filters = workTypeListFilterService.getFilters({});\n };\n\n $scope.$watch('workTypeList.filters', updateFilters, true);\n\n $scope.$watch('workTypeList.updated', function (newVal) {\n if (!newVal) {\n return;\n }\n workTypeListService.getListData(self.filters).$promise.then(setData);\n self.updated = false;\n });\n });\n\n'use strict';\n\nangular.module('workOrderTransactions', ['translate', 'dudeAuth', 'dudeControls', 'sumFilter', 'helpers']);\n\n/**\n * @ngdoc directive\n * @name workOrderTransactions.work-order-transactions\n * @restrict E\n * @description\n *\n * Renders the transactions section of the work order form\n *\n * @param {array} transactions The work order transactions\n * @param {array} spies The array of spies used by the scroll spy\n * @param {number} workOrderId The Id of the work order the transactions are attached to\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .component('workOrderTransactions', {\n bindings: {\n transactions: '=',\n spies: '=',\n workOrderId: '<'\n },\n templateUrl: 'app/components/workOrderTransactions/workOrderTransactions.html',\n controller: 'WorkOrderTransactionsComponent',\n controllerAs: 'transactions'\n })\n .controller('WorkOrderTransactionsComponent', function ($filter, $uibModal, $q, $translate, userContext, log, transactionHelpers, permission, TRANSACTIONS_CONSTANTS) {\n var self = this;\n var readonly;\n var READ_ONLY = 'ReadOnly';\n\n var removeTransaction = function (transactionId) {\n self.transactions = $filter('filter')(self.transactions, function (returnedTransaction) {\n return returnedTransaction.id !== transactionId;\n });\n };\n\n var deleteTransaction = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/workOrderTransactions/deleteConfirmModal.html',\n controller: 'DeleteConfirmModalController',\n controllerAs: 'deleteConfirmModalController',\n size: 'sm',\n backdrop: 'static'\n });\n\n return modalInstance.result.then(function () {\n var transactionToDelete = transactionHelpers.transactionReference(self.transaction);\n return transactionToDelete.$delete({ id: transactionToDelete.id, workorderId: self.workOrderId }).then(function () {\n removeTransaction(transactionToDelete.id);\n log.notify({\n type: 'success',\n title: $translate.instant('transactions.notify.deleteTransaction.title'),\n message: $translate.instant('transactions.notify.deleteTransaction.message')\n });\n });\n });\n };\n\n var saveTransaction = function () {\n var newTransaction = transactionHelpers.transactionReference(self.transaction);\n if (self.transaction.delete) {\n deleteTransaction(newTransaction);\n return $q.resolve();\n } else if (readonly === READ_ONLY) {\n return $q.resolve();\n }\n\n var promise = newTransaction.id ? newTransaction.$update({\n id: newTransaction.id,\n workorderId: self.workOrderId\n }) : newTransaction.$save({ workorderId: self.workOrderId });\n return promise.then(function () {\n log.notify({\n type: 'success',\n title: $translate.instant('transactions.notify.saveTransaction.title'),\n message: $translate.instant('transactions.notify.saveTransaction.message')\n });\n transactionHelpers.getTransactions(self.workOrderId).$promise.then(function (results) {\n self.transactions = transactionHelpers.parseTransactions(results.data, userContext);\n });\n });\n };\n\n self.permission = permission.transactions.updateAny;\n self.serviceTypes = TRANSACTIONS_CONSTANTS.serviceType;\n self.panelObject = {};\n\n self.addTransaction = function (value, type) {\n readonly = '';\n self.transaction = angular.copy(value) || transactionHelpers.defaultTransaction[type](userContext.user);\n\n if (self.transaction.id && !self.transaction.isEditable) {\n readonly = READ_ONLY;\n }\n\n var buttonFunctions = {\n saveFunction: saveTransaction,\n saveButtonText: readonly === READ_ONLY ? $translate.instant('general.actions.ok') : $translate.instant('general.actions.save')\n };\n\n if (self.transaction.id && readonly !== READ_ONLY) {\n buttonFunctions.deleteFunction = deleteTransaction;\n }\n\n var translationType;\n switch (type) {\n default:\n translationType = 'transactionsPanel';\n break;\n case 'purchase':\n translationType = 'purchaseTransactionsPanel';\n break;\n case 'service':\n translationType = 'serviceTransactionsPanel';\n break;\n }\n\n var panelTitle;\n if (self.transaction && self.transaction.id && readonly !== READ_ONLY) {\n panelTitle = $translate.instant('transactions.' + translationType + '.edit');\n } else if (readonly === READ_ONLY) {\n panelTitle = $translate.instant('transactions.' + translationType + '.view');\n } else {\n panelTitle = $translate.instant('transactions.' + translationType + '.new');\n }\n\n self.panelObject = {\n titles: {\n title: panelTitle,\n subtitle: self.transaction && self.transaction.id ? '(' + self.transaction.id + ')' : ''\n },\n buttonFunctions: buttonFunctions,\n readOnly: readonly === READ_ONLY,\n open: true,\n template: 'app/components/workOrderTransactions/' + type + 'Transactions' + readonly + '.html',\n transaction: self.transaction\n };\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderTransactions.transactionsPanel\n * @restrict E\n * @description\n *\n * Renders the labor transactions sliding panel\n *\n */\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .component('transactionsPanel', {\n bindings: {\n saveAttempt: '<',\n templateUrl: '@',\n transaction: '='\n },\n template: '
',\n controller: 'TransactionsPanelComponent',\n controllerAs: 'transactionsPanel'\n })\n .controller('TransactionsPanelComponent', function ($scope, $translate, $filter, TRANSACTIONS_CONSTANTS, roles) {\n var self = this;\n self.roles = [roles.admin, roles.technician];\n self.laborTypes = [\n {\n value: 'regular',\n name: $translate.instant('transactions.transactionsPanel.labor.regular')\n },\n {\n value: 'overtime',\n name: $translate.instant('transactions.transactionsPanel.labor.overtime')\n },\n {\n value: 'doubletime',\n name: $translate.instant('transactions.transactionsPanel.labor.doubletime')\n }\n ];\n self.serviceTypes = TRANSACTIONS_CONSTANTS.serviceType;\n\n var parseStringNumber = function (number) {\n if (typeof number === 'string') {\n return parseFloat(number.replace(/,/g, ''));\n }\n return number;\n };\n\n var setTotalCost = function () {\n var cost;\n var quantity = parseStringNumber(self.transaction.typeAttributes.quantity);\n var itemCost = Math.round(parseStringNumber(self.transaction.typeAttributes.unitCost) * 100) / 100;\n cost = quantity * itemCost;\n self.transaction.typeAttributes.totalCost = cost;\n };\n\n self.$onInit = function () {\n if (self.transaction.typeAttributes.type === 'purchase') {\n if (self.transaction.typeAttributes.unitCost && self.transaction.typeAttributes.quantity) {\n setTotalCost();\n }\n $scope.$watch('transactionsPanel.transaction.typeAttributes.quantity', function (newVal) {\n if (newVal && self.transaction.typeAttributes.unitCost) {\n setTotalCost();\n } else {\n self.transaction.typeAttributes.totalCost = '';\n }\n });\n\n $scope.$watch('transactionsPanel.transaction.typeAttributes.unitCost', function (newVal) {\n if (newVal && self.transaction.typeAttributes.quantity) {\n setTotalCost();\n } else {\n self.transaction.typeAttributes.totalCost = '';\n }\n });\n }\n };\n });\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .service('transactionHelpers', function (DudeApi, permissionsHelper, TRANSACTIONS_CONSTANTS) {\n var defaultQuery = {\n orderBy: 'TransactionDate desc,CreatedDateTime desc',\n includeAudit: true\n };\n\n var parseTransactions = function (transactions, userContext) {\n var parsedTransactions = [];\n transactions.forEach(function (transaction) {\n if (permissionsHelper.userAllowed('Transactions-UpdateAny')) {\n transaction.isEditable = true;\n } else {\n transaction.isEditable = (transaction.typeAttributes.user !== null && transaction.typeAttributes.user.id === userContext.user.id) ||\n transaction.createdByUser.id === userContext.user.id;\n }\n\n parsedTransactions.push(transaction);\n });\n return parsedTransactions;\n };\n\n var transactionReference = function (transaction) {\n return new DudeApi.WorkOrderTransactionEntity(transaction);\n };\n\n var defaultTransaction = {\n labor: function (user) {\n return {\n transactionDate: new Date(),\n typeAttributes: {\n type: TRANSACTIONS_CONSTANTS.type.labor,\n laborType: TRANSACTIONS_CONSTANTS.laborType.regular,\n user: user\n }\n };\n },\n purchase: function (user) {\n return {\n transactionDate: new Date(),\n typeAttributes: {\n type: TRANSACTIONS_CONSTANTS.type.purchase,\n user: user,\n quantity: '1',\n unitCost: '0.00'\n }\n };\n },\n service: function () {\n return {\n transactionDate: new Date(),\n typeAttributes: {\n type: TRANSACTIONS_CONSTANTS.type.service,\n cost: '0.00',\n serviceType: TRANSACTIONS_CONSTANTS.serviceType.contract\n }\n };\n }\n };\n\n var getTransactions = function (workOrderId) {\n defaultQuery.workorderId = workOrderId;\n return DudeApi.WorkOrderTransactionEntity.query(defaultQuery);\n };\n\n return {\n transactionReference: transactionReference,\n defaultTransaction: defaultTransaction,\n getTransactions: getTransactions,\n parseTransactions: parseTransactions\n };\n });\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .constant('TRANSACTIONS_CONSTANTS', {\n type: {\n labor: 'labor',\n purchase: 'purchase',\n service: 'service'\n },\n laborType: {\n regular: 'regular',\n overTime: 'overTime',\n doubleTime: 'doubleTime'\n },\n serviceType: {\n contract: 'Contract',\n rental: 'EquipmentRental',\n other: 'Other'\n }\n });\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .filter('transactionTypeSum', function () {\n return function (array, type) {\n var total = 0;\n\n array.forEach(function (value) {\n var itemResult = value;\n\n if (itemResult.typeAttributes.type === type) {\n total += parseFloat(itemResult.typeAttributes.cost);\n }\n });\n return total;\n };\n });\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .filter('transactionHours', function () {\n return function (array) {\n var total = 0;\n\n array.forEach(function (value) {\n var itemResult = value;\n\n if (itemResult.typeAttributes.type === 'labor') {\n total += parseFloat(itemResult.typeAttributes.hours);\n }\n });\n return total;\n };\n });\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .filter('serviceTypeFilter', function ($translate, TRANSACTIONS_CONSTANTS) {\n var statuses = [];\n statuses[TRANSACTIONS_CONSTANTS.serviceType.contract] = $translate.instant('transactions.serviceTypes.contract');\n statuses[TRANSACTIONS_CONSTANTS.serviceType.rental] = $translate.instant('transactions.serviceTypes.rental');\n statuses[TRANSACTIONS_CONSTANTS.serviceType.other] = $translate.instant('transactions.serviceTypes.other');\n\n return function (input) {\n var value = statuses[input];\n if (!value) {\n return 'Unknown';\n }\n return value;\n };\n });\n\n'use strict';\n\nangular.module('workOrderTransactions')\n .controller('DeleteConfirmModalController', function ($uibModalInstance) {\n var self = this;\n\n self.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n self.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n'use strict';\n\nangular.module('workOrderTasks', ['translate', 'dudeControls', 'taskBook']);\n\n'use strict';\n\nangular.module('workOrderTasks')\n .directive('workOrderTasks', function (taskBookService) {\n return {\n templateUrl: 'app/components/workOrderTasks/workOrderTasks.html',\n scope: {\n tasks: '=',\n spies: '=',\n editMode: '=',\n tasksToDelete: '='\n },\n link: function (scope) {\n scope.mode = scope.editMode ? 'completed_edit' : 'completed_readonly';\n\n // Create a task book out of the tasks for the task book directive.\n scope.taskBook = {\n tasks: scope.tasks\n };\n\n scope.addTasks = function (numberOfTasksToAdd) {\n taskBookService.addTasks(scope.taskBook.tasks, numberOfTasksToAdd);\n };\n\n scope.hideButton = true;\n\n scope.$watch('tasks', function (newVal) {\n scope.taskBook.tasks = newVal;\n }, true);\n }\n };\n });\n\n'use strict';\n\nangular.module('workOrderQuickActions', ['dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'helpers', 'maintenanceConstants']);\n\n/**\n * @ngdoc service\n * @name workOrderQuickActions.workOrderQuickActionsService\n * @requires DudeApi\n * @requires moment\n *\n * @description\n * Service for supporting work order quick actions\n *\n */\n\n'use strict';\n\nangular.module('workOrderQuickActions')\n .factory('workOrderQuickActionsService', function (DudeApi, moment) {\n /**\n * @ngdoc method\n * @name print\n * @methodOf workOrderQuickActions.workOrderQuickActionsService\n *\n * @description\n * Prints the work order\n *\n * @param {number} id The id of the work order\n */\n var print = function (id) {\n DudeApi.workOrderPrintService.print({ id: id, timezone: moment.tz.guess() });\n };\n\n return {\n print: print\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderQuickActions.status-quick-action\n * @restrict E\n * @description\n * Handles the quick action for starting or completing a work order\n *\n * @param {object} workOrder A work order resource object\n * @param {object} panelOptions An object containing sliding panel options\n * @param {object} editingObject An object containing the work order and transaction being edited\n * @param {boolean} ngDisabled Sets the buttons to disabled or enabled (optional)\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderQuickActions')\n .component('statusQuickAction', {\n templateUrl: 'app/components/workOrderQuickActions/statusQuickAction.html',\n bindings: {\n workOrder: '=',\n editingObject: '=',\n panelOptions: '=',\n ngDisabled: '=?'\n },\n controller: 'StatusQuickActionComponent',\n controllerAs: 'quickAction'\n });\n\nangular.module('workOrderQuickActions')\n .controller('StatusQuickActionComponent', function ($q, $scope, workOrderEnums, log, $translate, userContext, roleHelpers, transactionHelpers) {\n var self = this;\n var isTechnician = roleHelpers.isTechnician();\n self.status = workOrderEnums.status;\n\n var addTechnicianAsAssignee = function (workOrder) {\n if (!isTechnician) {\n return;\n }\n var alreadyAssigned = false;\n workOrder.assignees.forEach(function (assignee) {\n alreadyAssigned = assignee.id === userContext.user.id || alreadyAssigned;\n });\n if (!alreadyAssigned) {\n workOrder.assignees.push(userContext.user);\n }\n };\n\n var startWorkOrder = function (workOrder) {\n workOrder.status = self.status.workInProgress;\n addTechnicianAsAssignee(workOrder);\n workOrder.$update({ id: workOrder.id }).then(function () {\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderForm.notificationTitle'),\n message: $translate.instant('workOrderForm.notification')\n });\n });\n };\n\n var completeWorkOrder = function (workOrder) {\n self.editingObject.workOrder = angular.copy(workOrder);\n self.editingObject.workOrder.status = self.status.complete;\n self.editingObject.workOrder.completionDateTime = new Date();\n self.editingObject.transaction = transactionHelpers.defaultTransaction.labor(userContext.user);\n var completionWatcher = $scope.$watch('quickAction.editingObject.workOrder.completionDateTime', function (newVal) {\n if (!newVal) {\n return;\n }\n self.editingObject.transaction.transactionDate = angular.copy(newVal);\n });\n self.panelOptions.functions.saveFunction = function () {\n var promises = [];\n completionWatcher();\n\n workOrder.status = self.editingObject.workOrder.status;\n workOrder.completionDateTime = self.editingObject.workOrder.completionDateTime;\n workOrder.actionTaken = self.editingObject.workOrder.actionTaken;\n promises.push(workOrder.$update({ id: workOrder.id }));\n\n if (self.editingObject.transaction.transactionDate && self.editingObject.transaction.typeAttributes.hours) {\n self.editingObject.transaction = transactionHelpers.transactionReference(self.editingObject.transaction);\n promises.push(self.editingObject.transaction.$save({ workorderId: workOrder.id }));\n }\n return $q.all(promises).then(function () {\n self.editingObject.workOrder = {};\n self.editingObject.transaction = {};\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderForm.notificationTitle'),\n message: $translate.instant('workOrderForm.notification')\n });\n });\n };\n self.panelOptions.titles.title = $translate.instant('workOrderList.complete');\n self.panelOptions.titles.subtitle = '(' + $translate.instant('workOrderList.wo') + ' ' + self.editingObject.workOrder.displayId + ')';\n self.panelOptions.open = true;\n };\n\n self.quickStatusChange = function (workOrder) {\n switch (workOrder.status) {\n case self.status.newRequest:\n startWorkOrder(workOrder);\n break;\n case self.status.workInProgress:\n completeWorkOrder(workOrder);\n break;\n default:\n break;\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderQuickActions.schedule-quick-action\n * @restrict E\n * @description\n *\n * Displays the quick action form elements for schedule\n *\n * @param {date} dueDate The date the work is due\n * @param {date} requestDate The date the work is requested\n * @param {date} startDate The date the work is scheduled to start\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderQuickActions')\n .component('scheduleQuickAction', {\n templateUrl: 'app/components/workOrderQuickActions/scheduleQuickAction.html',\n bindings: {\n dueDate: '=',\n requestDate: '=',\n startDate: '='\n },\n controller: function ($timeout) {\n // This time out is necessary in order to focus after the ng-if is triggered\n $timeout(function () {\n angular.element('#scheduledStart input').focus();\n });\n },\n controllerAs: 'quickAction'\n });\n\n/**\n * @ngdoc directive\n * @name workOrderQuickActions.assignee-quick-action\n * @restrict E\n * @description\n *\n * Displays the quick action form elements for assignees\n *\n * @param {array} assignees The list of user objects to display\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderQuickActions')\n .component('assigneeQuickAction', {\n templateUrl: 'app/components/workOrderQuickActions/assigneeQuickAction.html',\n bindings: {\n assignees: '='\n },\n controller: function ($timeout, roles) {\n var self = this;\n\n self.roles = [roles.admin, roles.technician];\n\n // This time out is necessary in order to focus after the ng-if is triggered\n $timeout(function () {\n // We have to use angular element to focus like this because of how the typeahead is structured\n angular.element('.work-order-quick-actions .dude-rxtypeahead input')[0].focus();\n });\n },\n controllerAs: 'quickAction'\n });\n\n'use strict';\n\nangular.module('workOrderList', ['ui.router', 'dudeAuth', 'dudeControls', 'dudeApi', 'marketizr', 'workOrderForm', 'workOrderFilters', 'translate', 'workOrderQuickActions', 'helpers', 'maintenanceConstants']);\n\n/**\n * @ngdoc service\n * @name workOrderList.workOrderListService\n * @requires DudeApi\n * @requires workOrderFilters.workOrderFilters\n * @requires moment\n *\n * @description\n * Service for supporting the work order list with retrieving updating and exporting data\n *\n */\n\n'use strict';\n\nangular.module('workOrderList')\n .factory('workOrderListService', function (DudeApi, marketizr, market, workOrderFilters, moment) {\n var getFilters = function (query, isMap) {\n var filters = workOrderFilters.toApiFilter(query, isMap);\n return filters;\n };\n\n /**\n * @ngdoc method\n * @name getListData\n * @methodOf workOrderList.workOrderListService\n *\n * @description\n * Gets the data for the work order list\n *\n * @param {object} query An object containing the filters to query with\n * @param {boolean} isMap A boolean which states whether or not the data is for the work order map\n * @returns {promise} A promise containing the page wrapped work order list data\n */\n var getListData = function (query, isMap) {\n var filters = getFilters(query, isMap);\n return DudeApi.WorkOrderEntity.query(filters);\n };\n\n /**\n * @ngdoc method\n * @name exportSpreadsheet\n * @methodOf workOrderList.workOrderListService\n *\n * @description\n * Exports a csv of work orders\n *\n * @param {object} query An object containing the filters to query with\n */\n var exportSpreadsheet = function (query) {\n var filters = getFilters(query, false);\n delete filters.page;\n delete filters.pageSize;\n\n if (marketizr.hasMarkets([market.he, market.ips, market.k12])) {\n filters.template = 'Public';\n }\n\n if (filters.orderBy && filters.orderBy.indexOf('DueDate') > -1) {\n filters.orderBy = 'DueDate';\n }\n\n filters.includeTransactions = true;\n filters.includeTasks = true;\n filters.timezone = moment.tz.guess();\n\n DudeApi.workOrderExportService.download(filters);\n };\n\n return {\n getListData: getListData,\n exportSpreadsheet: exportSpreadsheet\n };\n });\n\n'use strict';\n\nangular.module('workOrderList')\n .config(function ($stateProvider, workOrderEnums) {\n var queryParams = [\n 'q',\n 'status',\n 'priority',\n 'assignees',\n 'requestDateTo',\n 'requestDateFrom',\n 'pageSize',\n 'page',\n 'orderBy',\n 'unassigned',\n 'businessAsset',\n 'includeDescendants',\n 'purpose',\n 'completionDateTo',\n 'completionDateFrom',\n 'dueDateFrom',\n 'dueDateTo',\n 'scheduledStartDateFrom',\n 'scheduledStartDateTo',\n 'hasScheduledStartDate',\n 'pmSchedule',\n 'failureReason',\n 'woid',\n 'project',\n 'workType'\n ].join('&');\n $stateProvider\n .state('secure.workOrderList', {\n url: 'workorders?' + queryParams,\n templateUrl: 'app/components/workOrderList/workOrderList.html',\n controller: 'WorkOrderListController',\n controllerAs: 'workOrderList',\n resolve: {\n initData: function ($q, $stateParams, workOrderListService, workOrderFilters, marketizr, market, roleHelpers, userContext) {\n queryParams = $stateParams;\n\n // Requester Role Check\n if (roleHelpers.isRequester()) {\n queryParams = {\n requestedBy: userContext.user.id\n };\n // Admin/Technician Role Check\n } else {\n queryParams.status = (queryParams.status || [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress]);\n queryParams.includeDescendants = queryParams.businessAsset ? queryParams.includeDescendants : 'true';\n if (queryParams.assignees === 'none') {\n queryParams.assignees = null;\n } else if (queryParams.assignees !== null && roleHelpers.isTechnician() && queryParams.assignees !== 'all') {\n queryParams.assignees = queryParams.assignees || userContext.user.id;\n } else if (queryParams.assignees === 'all' && marketizr.hasMarkets(market.k12, market.ips, market.he)) {\n delete queryParams.assignees;\n }\n }\n\n var filters = workOrderFilters.getFilters(queryParams);\n\n return $q.all({\n initResponse: workOrderListService.getListData(filters).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('workOrderList')\n .controller('WorkOrderListController', function ($scope, $state, $location, $timeout, $stateParams, $q, moment, DudeApi, bulkPrintHelperService, userContext, clientHelperService, responsiveBreakpoints, log, $translate, workOrderListService, initData, workOrderFilters, queryHelpers, orderByHelpers, roleHelpers, workOrderEnums, market) {\n var self = this;\n\n var queryDefaults = workOrderFilters.getFilters({});\n var pageChanging = false;\n var quickAssigneeWatcher;\n var quickScheduleWatcher;\n\n var quickUpdates = {\n assignee: 'UpdateAssignee',\n scheduled: 'UpdateSchedule'\n };\n\n var lastQuickActionIndex;\n var lastQuickActionName;\n\n self.screenSize = clientHelperService.getCurrentScreenSize();\n self.breakpoints = responsiveBreakpoints;\n\n self.panelOptions = {};\n self.editing = {};\n\n self.market = market;\n\n // view model\n self.listData = initData.initResponse.data;\n self.filters = initData.filters;\n self.totalCount = initData.initResponse.total;\n self.sortable = orderByHelpers.initSort(self.filters.orderBy);\n $scope.sortFieldList = '';\n $scope.sortDirectionList = '';\n self.bulkWorkOrders = [];\n\n self.panelOptions.functions = {\n saveFunction: function () {\n return $q.resolve();\n },\n cancelFunction: function () {\n self.editing.workOrder = {};\n }\n };\n self.panelOptions.open = false;\n self.panelOptions.titles = {};\n self.editing.workOrder = {};\n self.editing.transaction = {};\n\n // priority and status values\n self.priority = workOrderEnums.priority;\n self.status = workOrderEnums.status;\n\n self.isRequester = roleHelpers.isRequester();\n self.isTechnician = roleHelpers.isTechnician();\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.status = cloned.status === 'all' ? [] : cloned.status;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, workOrderFilters.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (items) {\n self.filters.orderBy = items;\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.export = function () {\n workOrderListService.exportSpreadsheet(self.filters);\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (workOrderFilters.checkFilterDifferences(newVal, oldVal)) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n newVal.page = 1;\n }\n\n pageChanging = false;\n\n workOrderListService.getListData(newVal).$promise.then(setData);\n\n var stateVal = workOrderFilters.getFilters(angular.copy(newVal));\n stateVal.requestedBy = null;\n\n queryHelpers.updateState(stateVal, queryDefaults);\n\n // reset these so that the quick actions open properly\n lastQuickActionIndex = null;\n lastQuickActionName = null;\n };\n\n var updateWorkOrder = function (index) {\n self.listData[index].$update({ id: self.listData[index].id }).then(function () {\n switch (lastQuickActionName) {\n case quickUpdates.assignee:\n self.listData[index].quickActionsUpdateAssignee = true;\n break;\n case quickUpdates.scheduled:\n self.listData[index].quickActionsUpdateSchedule = true;\n break;\n default:\n break;\n }\n\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderForm.notificationTitle'),\n message: $translate.instant('workOrderForm.notification')\n });\n });\n };\n\n self.closeLastQuickAction = function () {\n if (lastQuickActionIndex !== null && lastQuickActionName !== null) {\n switch (lastQuickActionName) {\n case quickUpdates.assignee: {\n quickAssigneeWatcher();\n self.listData[lastQuickActionIndex].quickActionsUpdateAssignee = false;\n delete self.listData[lastQuickActionIndex].assigneesCopy;\n break;\n }\n case quickUpdates.scheduled: {\n quickScheduleWatcher();\n self.listData[lastQuickActionIndex].quickActionsUpdateSchedule = false;\n break;\n }\n default:\n break;\n }\n }\n lastQuickActionIndex = null;\n lastQuickActionName = null;\n };\n\n self.updateAssignees = function (index) {\n var workOrder = self.listData[index];\n workOrder.quickActionsUpdateAssignee = true;\n\n self.closeLastQuickAction();\n\n if (workOrder.quickActionsUpdateAssignee) {\n lastQuickActionIndex = index;\n lastQuickActionName = quickUpdates.assignee;\n\n quickAssigneeWatcher = $scope.$watchCollection(function () {\n return workOrder.assignees;\n }, function (newVal, oldVal) {\n if (angular.equals(newVal, oldVal)) {\n return;\n }\n updateWorkOrder(index);\n }, true);\n } else {\n lastQuickActionIndex = null;\n lastQuickActionName = null;\n }\n };\n\n self.updateSchedule = function (index) {\n var workOrder = self.listData[index];\n workOrder.quickActionsUpdateSchedule = true;\n\n self.closeLastQuickAction();\n\n if (workOrder.quickActionsUpdateSchedule) {\n lastQuickActionIndex = index;\n lastQuickActionName = quickUpdates.scheduled;\n\n quickScheduleWatcher = $scope.$watch(function () {\n return workOrder;\n }, function (newVal, oldVal) {\n var oldSchedStartDate;\n var newSchedStartDate;\n var oldDueDate;\n var newDueDate;\n\n oldSchedStartDate = oldVal.scheduledStartDate === null ? oldVal.scheduledStartDate : moment(oldVal.scheduledStartDate).format('YYYY-MM-DD');\n newSchedStartDate = newVal.scheduledStartDate === null ? newVal.scheduledStartDate : moment(newVal.scheduledStartDate).format('YYYY-MM-DD');\n oldDueDate = oldVal.dueDateTime === null ? oldVal.dueDateTime : moment(oldVal.dueDateTime).format('YYYY-MM-DD');\n newDueDate = newVal.dueDateTime === null ? newVal.dueDateTime : moment(newVal.dueDateTime).format('YYYY-MM-DD');\n\n if ((oldSchedStartDate !== newSchedStartDate) || (oldDueDate !== newDueDate)) {\n updateWorkOrder(index);\n }\n }, true);\n } else {\n lastQuickActionIndex = null;\n lastQuickActionName = null;\n }\n };\n\n var getInitialBulk = function () {\n var idArray = angular.copy($stateParams.woid);\n if (!idArray) {\n return;\n } else if (!Array.isArray(idArray)) {\n idArray = [idArray];\n }\n\n self.listData.forEach(function (workOrder) {\n if (idArray.indexOf(workOrder.id + '') > -1) {\n workOrder.bulk = true;\n self.bulkWorkOrders.push(workOrder);\n }\n });\n\n self.allBulk = self.listData.length > 0 && self.bulkWorkOrders.length === self.listData.length;\n };\n\n getInitialBulk();\n\n self.updateBulk = function (event, workOrder) {\n event.stopPropagation();\n if (!self.bulkWorkOrders.length) {\n self.closeLastQuickAction();\n workOrder.bulk = true;\n self.bulkWorkOrders.push(workOrder);\n } else {\n var bulkCopy = angular.copy(self.bulkWorkOrders);\n var alreadyExists = bulkCopy.some(function (bulkWorkOrder, index) {\n var match = bulkWorkOrder.id === workOrder.id;\n if (match) {\n workOrder.bulk = false;\n self.bulkWorkOrders.splice(index, 1);\n }\n return match;\n });\n\n if (!alreadyExists) {\n workOrder.bulk = true;\n self.bulkWorkOrders.push(workOrder);\n }\n }\n };\n\n $scope.$watchCollection('workOrderList.bulkWorkOrders', function () {\n var params = workOrderFilters.getFilters(angular.copy(self.filters));\n\n params.woid = self.bulkWorkOrders.map(function (workOrder) {\n return workOrder.id;\n });\n\n self.allBulk = self.listData.length > 0 && self.bulkWorkOrders.length === self.listData.length;\n queryHelpers.updateState(params, queryDefaults);\n });\n\n self.bulkAction = function (actionType) {\n self.bulkPanelOpen = true;\n self.bulkActionType = actionType;\n };\n\n self.bulkPrint = function (isSummary) {\n var entity = isSummary ? 'WorkOrderBulkPrintSummaryEntity' : 'WorkOrderBulkPrintEntity';\n var labels = {\n title: $translate.instant('workOrderList.title'),\n display: $translate.instant('workOrderList.bulkActions.printLabels.display'),\n loading: $translate.instant('workOrderList.bulkActions.printLabels.loading')\n };\n var bulkPrintBody = { workOrderId: [], timeZone: moment.tz.guess(), orderBy: self.filters.orderBy };\n self.bulkWorkOrders.forEach(function (workOrder) {\n bulkPrintBody.workOrderId.push(workOrder.id);\n });\n\n bulkPrintHelperService.bulkPrint(entity, bulkPrintBody, labels);\n self.clearAll();\n };\n\n self.selectAllBulk = function () {\n var bulkState = self.bulkWorkOrders.length < self.listData.length;\n self.bulkWorkOrders = [];\n\n self.listData.forEach(function (workOrder) {\n workOrder.bulk = bulkState;\n if (bulkState) {\n self.bulkWorkOrders.push(workOrder);\n }\n });\n };\n\n self.clearAll = function () {\n self.allBulk = false;\n self.bulkWorkOrders.forEach(function (workOrder) {\n workOrder.bulk = false;\n });\n self.bulkWorkOrders = [];\n };\n\n self.edit = function (id) {\n if (self.bulkWorkOrders.length) {\n return;\n }\n\n $state.go('secure.workOrderFormEdit', { id: id });\n };\n\n self.viewWorkOrderReadOnly = function (id) {\n $state.go('secure.workOrderFormReadOnly', { id: id });\n };\n\n $scope.$watch('workOrderList.filters', updateFilters, true);\n });\n\n/**\n * @ngdoc directive\n * @name workOrderList.work-order-bulk-action\n * @restrict E\n * @description\n * Handles the sliding panel and logic for bulk actions\n *\n * @param {array} workOrders An array of work orders to perform actions against\n * @param {boolean} panelOpen A boolean stating whether or not the sliding panel is open\n * @param {string} action The bulk action to perform\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderList')\n .component('workOrderBulkAction', {\n templateUrl: 'app/components/workOrderList/workOrderBulkAction.html',\n bindings: {\n panelOpen: '=',\n workOrders: '=',\n action: '='\n },\n controller: 'WorkOrderBulkActionComponent',\n controllerAs: 'bulkAction'\n });\n\nangular.module('workOrderList')\n .controller('WorkOrderBulkActionComponent', function ($q, $scope, $translate, log, roles) {\n var self = this;\n self.assignees = [];\n self.roles = [roles.admin, roles.technician];\n\n self.assignmentTypes = {\n replace: 'replace',\n add: 'add'\n };\n\n var addAssignees = function (workOrder) {\n var workOrderAssignees = angular.copy(workOrder.assignees);\n self.assignees.forEach(function (assignee) {\n var isPresent = workOrderAssignees.some(function (workOrderAssignee) {\n return assignee.id === workOrderAssignee.id;\n });\n\n if (!isPresent) {\n workOrder.assignees.push(assignee);\n }\n });\n };\n\n self.panelFunctions = {\n saveFunction: function () {\n var promises = [];\n self.workOrders.forEach(function (workOrder) {\n if (self.assignmentType === self.assignmentTypes.replace) {\n workOrder.assignees = angular.copy(self.assignees);\n } else {\n addAssignees(workOrder);\n }\n\n promises.push(workOrder.$update({ id: workOrder.id }));\n });\n\n return $q.all(promises).then(function (results) {\n self.workOrders = [];\n self.assignees = [];\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderForm.notificationTitle'),\n message: results.length + ' ' + $translate.instant('workOrderList.bulkActions.updatedSuccessfully')\n });\n });\n },\n cancelFunction: function () {\n self.assignees = [];\n }\n };\n\n $scope.$watch('bulkAction.panelOpen', function (newVal) {\n if (newVal) {\n self.assignmentType = angular.copy(self.assignmentTypes.add);\n self.panelTitles = {\n title: $translate.instant('workOrderList.assign'),\n subtitle: '(' + self.workOrders.length + ' ' + $translate.instant('workOrderList.selected') + ')'\n };\n }\n });\n });\n\n/**\n * @ngdoc directive\n * @name workOrderList.multiple-assignees\n * @restrict E\n * @description\n *\n * Displays a list of users\n *\n * @param {array} assignees The list of user objects to display\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderList')\n .component('multipleAssignees', {\n templateUrl: 'app/components/workOrderList/multipleAssignees.html',\n bindings: {\n assignees: '='\n },\n controller: 'MultipleAssigneesComponent',\n controllerAs: 'multipleAssignees'\n });\n\nangular.module('workOrderList')\n .controller('MultipleAssigneesComponent', function () {\n });\n\n'use strict';\n\nangular.module('workOrderInventory', ['ui.bootstrap', 'page-controls', 'inventory-controls']);\n\n/**\n * @ngdoc service\n * @name workOrderInventory.workOrderInventoryService\n * @requires $q\n * @requires DudeApi\n * @requires userContext\n *\n * @description\n * Service for supporting the work order inventory section\n *\n */\n\n'use strict';\n\nangular.module('workOrderInventory')\n .service('workOrderInventoryService', function ($q, DudeApi, userContext) {\n /**\n * @ngdoc method\n * @name getInventoryTransactions\n * @methodOf workOrderInventory.workOrderInventoryService\n *\n * @description\n * Gets the inventory transactions associated to the work order.\n *\n * @param {int} displayId The work order display ID.\n */\n var getInventoryTransactions = function (displayId) {\n if (userContext && userContext.products && userContext.products.InventoryManager) {\n var inventoryTransactions;\n var query = {\n workOrderDisplayIds: [displayId]\n };\n\n return $q(function (resolve) {\n DudeApi.InventoryTransactionEntity.query(query).$promise\n .then(function (transactions) {\n inventoryTransactions = transactions.data;\n\n var promises = inventoryTransactions.map(function (inventoryTransaction) {\n return DudeApi.BusinessAssetEntity.get({ id: inventoryTransaction.inventoryTransactionDetails[0].businessAssetId }).$promise;\n });\n\n $q.all(promises).then(function (assets) {\n inventoryTransactions.forEach(function (inventoryTransaction, index) {\n inventoryTransaction.asset = assets[index];\n });\n\n resolve(inventoryTransactions);\n });\n });\n });\n }\n\n return $q(function (resolve) {\n resolve([]);\n });\n };\n\n return {\n getInventoryTransactions: getInventoryTransactions\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderInventory.workOrderInventory\n * @restrict E\n * @description\n * @requires workOrderInventoryService\n *\n * Displays a work order's inventory-specific information on the work order form.\n *\n * @param {Array} inventoryTransactions Array of Inventory Transactions associated to work order.\n * @param {boolean} openWhen The value to watch for when to open the sliding panel.\n * @param {Object} spies Scroll spy object.\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderInventory')\n .component('workOrderInventory', {\n templateUrl: 'app/components/workOrderInventory/workOrderInventory.html',\n bindings: {\n inventoryTransactions: '=',\n openWhen: '=',\n spies: '=',\n workOrder: '<'\n },\n controller: 'WorkOrderInventoryController',\n controllerAs: 'workOrderInventory'\n })\n .controller('WorkOrderInventoryController', function (workOrderInventoryService) {\n var self = this;\n\n self.$onInit = function () {\n workOrderInventoryService.getInventoryTransactions(self.workOrder.displayId).then(function (inventoryTransactions) {\n self.inventoryTransactions = inventoryTransactions;\n });\n };\n });\n\n/**\n * @ngdoc service\n * @name history.workOrderHistoryListService\n *\n * @description\n * Service for the work order history list page.\n *\n * @requires $q\n * @requires DudeApi\n * @requires historyService\n *\n */\n\n'use strict';\n\nangular.module('history')\n .service('workOrderHistoryListService', function ($q, DudeApi, historyService) {\n /**\n * @ngdoc method\n * @name convertToHistoryFilter\n * @methodOf history.workOrderHistoryListService\n *\n * @description\n * Takes Core filters and converts them to a history filter for the results\n * from Core.\n *\n * @param {object} filters Object containing the filters for Core.\n * @param {string} objectType The type of change object to query for\n *\n * @returns {Promise} currentFilter The filter object updated to have all of the\n * desired filters plus all of the default ones.\n */\n var convertToHistoryFilter = function (filters, objectType) {\n return $q(function (resolve) {\n var newFilters = angular.copy(filters);\n newFilters.includeSubCollections = true;\n newFilters.objectType = objectType;\n\n var workOrderFilters = {};\n\n if (filters.q != null && typeof filters.q === 'string' && filters.q.trim().length > 0) {\n workOrderFilters.q = filters.q;\n workOrderFilters.includeDisplayIds = true;\n } else if (typeof filters.q === 'string') {\n delete filters.q;\n }\n\n if ((filters.businessAsset != null && !Array.isArray(filters.businessAsset)) || (Array.isArray(filters.businessAsset) && filters.businessAsset.length > 0)) {\n workOrderFilters.businessAsset = filters.businessAsset;\n // TODO Uncomment line below when new filter is ready\n // workOrderFilters.includeDescendants = filters.includeDescendants;\n }\n\n if (Object.keys(workOrderFilters).length > 0) {\n DudeApi.WorkOrderEntity.query(workOrderFilters).$promise\n .then(function (response) {\n newFilters.q = null;\n // TODO Uncomment line below when new filter is ready\n // newFilters.includeDescendants = null;\n newFilters.businessAsset = [];\n newFilters.objectIds = response.data.map(function (workOrder) {\n return workOrder.id;\n });\n if (response.total > 0) {\n historyService.queryHistory(newFilters).then(resolve);\n } else {\n resolve({ data: [], total: 0 });\n }\n });\n } else {\n historyService.queryHistory(filters).then(resolve);\n }\n });\n };\n\n /**\n * @ngdoc method\n * @name getWorkOrdersForHistory\n * @methodOf history.workOrderHistoryListService\n *\n * @description\n * Gets all of the work orders for the history records brought in\n *\n * @param {Array} workOrderChanges The work order changes\n *\n * @returns {Promise} A promise containing the result from getting the work orders associated with the work order changes\n */\n var getWorkOrdersForHistory = function (workOrderChanges) {\n var woIds = workOrderChanges.map(function (change) {\n if (change.parent) {\n return change.parent.objectId;\n }\n return change.self.objectId;\n }).filter(function (value, index, arr) {\n return arr.indexOf(value) === index;\n });\n return DudeApi.WorkOrderEntity.query({ ids: woIds }).$promise;\n };\n\n return {\n convertToHistoryFilter: convertToHistoryFilter,\n getWorkOrdersForHistory: getWorkOrdersForHistory\n };\n });\n\n'use strict';\n\nangular.module('history')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.history.workorders', {\n url: 'workorders?orderBy&page&pageSize&q&businessAsset&includeDescendants&changeDateTimeTo&changeDateTimeFrom&userIds&fields&objectId',\n templateUrl: 'app/components/workOrderHistoryList/workOrderHistoryList.html',\n controller: 'WorkOrderHistoryListController',\n controllerAs: 'workOrderHistoryList',\n permissions: [permission.history.read],\n resolve: {\n initialState: function ($stateParams, $q, DudeApi, historyService, workOrderHistoryListService, historyChangeTypes) {\n var queryParams = $stateParams;\n // TODO Uncomment line below when new filter is ready\n // queryParams.includeDescendants = queryParams.businessAsset ? queryParams.includeDescendants : 'true';\n var filters = historyService.toApiFilter(queryParams);\n var workOrderHistory = workOrderHistoryListService.convertToHistoryFilter(filters, historyChangeTypes.workOrder);\n\n return $q.all({\n filters: filters,\n workOrderHistory: workOrderHistory\n });\n },\n workOrders: function (initialState, workOrderHistoryListService) {\n return workOrderHistoryListService.getWorkOrdersForHistory(initialState.workOrderHistory.data);\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('history')\n .controller('WorkOrderHistoryListController', function ($q, $scope, $translate, moment, queryHelpers, clientHelperService, responsiveBreakpoints, historyService, initialState, workOrders, workOrderHistoryListService, historyChangeTypes, filterStateService) {\n var self = this;\n var pageChanging = false;\n var queryDefaults = historyService.getFilters({});\n // TODO Uncomment line below when new filter is ready\n // var isEduMarket = marketizr.hasMarkets([market.k12, market.ips, market.he]);\n var ignoreBadges = ['page', 'pageSize', 'orderBy', 'includeDescendants'];\n var lastUpdated = new Date().getTime();\n\n var changesIds = function (changes) {\n return changes.map(function (change) {\n change.workOrderId = change.parent != null ? change.parent.objectId : change.self.objectId;\n return change;\n });\n };\n\n var setWorkOrders = function (wos, now) {\n if (now < lastUpdated) {\n return;\n }\n self.workOrders = wos.data.reduce(function (map, val) {\n map[val.id] = val;\n return map;\n }, {});\n };\n\n var setData = function (response, now) {\n if (now < lastUpdated) {\n return;\n }\n lastUpdated = now;\n self.changes = changesIds(response.data);\n var existsInList = false;\n self.changes.forEach(function (change) {\n if (self.activeChange && change.key === self.activeChange.key) {\n existsInList = true;\n }\n });\n\n if (!existsInList && self.changes.length > 0) {\n self.activeChange = self.changes[0];\n } else if (self.changes.length === 0) {\n self.activeChange = null;\n }\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n var now = new Date().getTime();\n if (now > lastUpdated) {\n lastUpdated = now;\n }\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n var changesResponse;\n workOrderHistoryListService.convertToHistoryFilter(self.filters, historyChangeTypes.workOrder)\n .then(function (response) {\n changesResponse = response;\n return workOrderHistoryListService.getWorkOrdersForHistory(response.data);\n })\n .then(function (wos) {\n setWorkOrders(wos, now);\n return changesResponse;\n })\n .then(function (response) {\n setData(response, now);\n });\n queryHelpers.updateState(newVal, queryDefaults);\n };\n\n self.filters = initialState.filters;\n filterStateService.setState({}, ignoreBadges);\n self.totalCount = initialState.workOrderHistory.total;\n\n self.changes = changesIds(initialState.workOrderHistory.data);\n self.activeChange = (self.changes && self.changes[0]) || null;\n\n $scope.$watch('workOrderHistoryList.filters', updateFilters, true);\n\n setWorkOrders(workOrders, lastUpdated);\n\n self.setActiveChange = function (change) {\n self.activeChange = change;\n };\n\n self.openFilters = function () {\n self.filterOpen = true;\n };\n\n self.clearFilters = function () {\n self.filters = historyService.toApiFilter({});\n // TODO Uncomment line below when new filter is ready\n // if (isEduMarket) {\n // self.filters.includeDescendants = 'true';\n // }\n };\n\n self.openPanel = function () {\n if (clientHelperService.getCurrentScreenSize().breakpoint === responsiveBreakpoints.xs) {\n self.panelOptions = {\n buttonFunctions: {\n saveFunction: function () {\n return $q.resolve();\n },\n saveButtonText: $translate.instant('general.actions.close')\n },\n titles: {\n title: moment(self.activeChange.changeDateTime).format('MM/DD/YYYY') + ' | ' + moment(self.activeChange.changeDateTime).format('hh:mm:ss a'),\n subtitle: '( ID ' + self.workOrders[self.activeChange.workOrderId].displayId + ' )'\n }\n };\n self.panelOpen = true;\n }\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n queryHelpers.updateState(self.filters, queryDefaults);\n });\n\n/**\n * @ngdoc service\n * @name history.workOrderHistoryFiltersService\n *\n * @description\n * Service for the work order history filters component.\n *\n * @require historyService\n */\n\n'use strict';\n\nangular.module('history')\n .service('workOrderHistoryFiltersService', function (historyService) {\n var fields = {\n details: [\n {\n name: historyService.translateFallback('history.changeFields.description'),\n value: 'workorder-description'\n },\n {\n name: historyService.translateFallback('history.changeFields.businessAsset'),\n value: 'workorder-businessAsset'\n },\n {\n name: historyService.translateFallback('history.changeFields.locationDescription'),\n value: 'workorder-locationDescription'\n },\n {\n name: historyService.translateFallback('history.changeFields.status'),\n value: 'workorder-status'\n },\n {\n name: historyService.translateFallback('history.changeFields.priority'),\n value: 'workorder-priority'\n },\n {\n name: historyService.translateFallback('history.changeFields.workType'),\n value: 'workorder-workType'\n },\n {\n name: historyService.translateFallback('history.changeFields.purpose'),\n value: 'workorder-purpose'\n },\n {\n name: historyService.translateFallback('history.changeFields.assignees'),\n value: 'workorder-assignees'\n },\n {\n name: historyService.translateFallback('history.changeFields.requestDateTime'),\n value: 'workorder-requestDateTime'\n },\n {\n name: historyService.translateFallback('history.changeFields.requestedBy'),\n value: 'workorder-requestedBy'\n }\n ],\n planning: [\n {\n name: historyService.translateFallback('history.changeFields.estimatedHours'),\n value: 'workorder-estimatedHours'\n },\n {\n name: historyService.translateFallback('history.changeFields.estimatedCost'),\n value: 'workorder-estimatedCost'\n },\n {\n name: historyService.translateFallback('history.changeFields.scheduledStartDate'),\n value: 'workorder-scheduledStartDate'\n },\n {\n name: historyService.translateFallback('history.changeFields.dueDateTime'),\n value: 'workorder-dueDateTime'\n }\n ],\n tasks: [\n {\n name: historyService.translateFallback('history.changeFields.notes'),\n value: 'task-notes'\n },\n {\n name: historyService.translateFallback('history.changeFields.order'),\n value: 'task-order'\n },\n {\n name: historyService.translateFallback('history.changeFields.status'),\n value: 'task-status'\n },\n {\n name: historyService.translateFallback('history.changeFields.title'),\n value: 'task-title'\n },\n {\n name: historyService.translateFallback('history.changeFields.procedure'),\n value: 'task-procedure'\n }\n ],\n completion: [\n {\n name: historyService.translateFallback('history.changeFields.actionTaken'),\n value: 'workorder-actionTaken'\n },\n {\n name: historyService.translateFallback('history.changeFields.completionDateTime'),\n value: 'workorder-completionDateTime'\n }\n ],\n attachments: [\n {\n name: historyService.translateFallback('history.changeFields.name'),\n value: 'attachment-name'\n }\n ],\n laborTransactions: [\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.hours'),\n value: 'labortransaction-typeAttributes.hours'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.laborType'),\n value: 'labortransaction-typeAttributes.laborType'\n },\n {\n name: historyService.translateFallback('history.changeFields.name'),\n value: 'labortransaction-typeAttributes.user'\n },\n {\n name: historyService.translateFallback('history.changeFields.transactionDate'),\n value: 'labortransaction-transactionDate'\n }\n ],\n purchaseTransactions: [\n {\n name: historyService.translateFallback('history.changeFields.itemPurchased'),\n value: 'purchasetransaction-description'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.quantity'),\n value: 'purchasetransaction-typeAttributes.quantity'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.unitCost'),\n value: 'purchasetransaction-typeAttributes.unitCost'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.cost'),\n value: 'purchasetransaction-typeAttributes.cost'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.purchaseOrder'),\n value: 'purchasetransaction-typeAttributes.purchaseOrder'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.supplierName'),\n value: 'purchasetransaction-typeAttributes.supplierName'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.user'),\n value: 'purchasetransaction-typeAttributes.user'\n },\n {\n name: historyService.translateFallback('history.changeFields.transactionDate'),\n value: 'purchasetransaction-transactionDate'\n }\n ],\n serviceTransactions: [\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.serviceType'),\n value: 'servicetransaction-typeAttributes.serviceType'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.vendor'),\n value: 'servicetransaction-typeAttributes.supplierName'\n },\n {\n name: historyService.translateFallback('history.changeFields.transactionDate'),\n value: 'servicetransaction-transactionDate'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.cost'),\n value: 'servicetransaction-typeAttributes.cost'\n },\n {\n name: historyService.translateFallback('history.changeFields.typeAttributes.purchaseOrder'),\n value: 'servicetransaction-typeAttributes.purchaseOrder'\n },\n {\n name: historyService.translateFallback('history.changeFields.notes'),\n value: 'servicetransaction-description'\n }\n ],\n links: [\n {\n name: historyService.translateFallback('history.changeFields.description'),\n value: 'weblink-description'\n },\n {\n name: historyService.translateFallback('history.changeFields.title'),\n value: 'weblink-title'\n },\n {\n name: historyService.translateFallback('history.changeFields.url'),\n value: 'weblink-url'\n }\n ]\n };\n\n /**\n * @ngdoc method\n * @name getFields\n * @methodOf history.workOrderHistoryFiltersService\n *\n * @description\n * Returns the list of field filters we wish to provide to the checkbox filter component\n *\n * @returns {object} Contains the different field sections with each field for filtering\n */\n var getFields = function () {\n return fields;\n };\n\n return {\n getFields: getFields\n };\n });\n\n/**\n * @ngdoc directive\n * @restrict E\n * @name history.workOrderHistoryFilters\n * @description\n *\n * The work order history filter\n *\n * @param {any} filters The items to filter on.\n * @param {boolean} openWhen Determines when sliding panel should open\n * @param {function} clearFunction function reference to handle the clear action\n *\n */\n\n'use strict';\n\nangular.module('history')\n .component('workOrderHistoryFilters', {\n templateUrl: 'app/components/workOrderHistoryFilters/workOrderHistoryFilters.html',\n bindings: {\n filters: '=',\n openWhen: '=',\n clearFunction: '&'\n },\n controller: 'WorkOrderHistoryFiltersController',\n controllerAs: 'workOrderHistoryFilters'\n })\n .controller('WorkOrderHistoryFiltersController', function ($q, $scope, $translate, moment, marketizr, market, roles, workOrderHistoryFiltersService) {\n var self = this;\n var filtersTemp;\n\n var now = moment();\n var thisWeekStart = moment(now.startOf('week'));\n var thisWeekEnd = moment(now.endOf('week'));\n\n var lastWeek = moment().subtract(1, 'weeks');\n var lastWeekStart = moment(lastWeek.startOf('week'));\n var lastWeekEnd = moment(lastWeek.endOf('week'));\n\n var thisMonthStart = moment(moment().startOf('month'));\n var thisMonthEnd = moment(moment().endOf('month'));\n\n var lastMonth = moment().subtract(1, 'months');\n var lastMonthStart = moment(lastMonth.startOf('month'));\n var lastMonthEnd = moment(lastMonth.endOf('month'));\n\n self.roles = [roles.admin, roles.technician, roles.requester];\n\n self.usersTitle = $translate.instant('workOrderHistoryFilters.usersTitle');\n\n self.fields = workOrderHistoryFiltersService.getFields();\n self.fieldTitles = [\n 'details',\n 'planning',\n 'tasks',\n 'completion',\n 'laborTransactions',\n 'purchaseTransactions',\n 'serviceTransactions',\n 'attachments',\n 'links'\n ];\n\n self.dateIncrements = [\n {\n text: $translate.instant('workOrderHistoryFilters.dateIncrements.thisWeek'),\n startDate: thisWeekStart,\n endDate: thisWeekEnd\n },\n {\n text: $translate.instant('workOrderHistoryFilters.dateIncrements.lastWeek'),\n startDate: lastWeekStart,\n endDate: lastWeekEnd\n },\n {\n text: $translate.instant('workOrderHistoryFilters.dateIncrements.thisMonth'),\n startDate: thisMonthStart,\n endDate: thisMonthEnd\n },\n {\n text: $translate.instant('workOrderHistoryFilters.dateIncrements.lastMonth'),\n startDate: lastMonthStart,\n endDate: lastMonthEnd\n }\n ];\n\n var setFiltersBack = function () {\n if (filtersTemp) {\n self.filters = filtersTemp;\n }\n };\n\n self.isEduMarket = marketizr.hasMarkets([market.k12, market.he, market.ips]);\n\n self.browseOptions = {\n type: 'slidingPanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n },\n 'asset-category': {\n filter: 'isLocation'\n }\n }\n };\n\n self.$onInit = function () {\n self.placeHolder = $translate.instant('workOrderHistoryFilters.searchPlaceholder');\n self.titles = { title: $translate.instant('workOrderHistoryFilters.title') };\n self.filters.changeDateTimeTo = self.filters.changeDateTimeTo ? moment(self.filters.changeDateTimeTo).toISOString() : null;\n self.filters.changeDateTimeFrom = self.filters.changeDateTimeFrom ? moment(self.filters.changeDateTimeFrom).toISOString() : null;\n self.filters.userIds = self.filters.userIds ? self.filters.userIds : [];\n self.filters.fields = self.filters.fields ? self.filters.fields : [];\n\n self.buttonFunctions = {\n saveFunction: function () {\n return $q.resolve();\n },\n saveButtonText: $translate.instant('workOrderHistoryFilters.actions.apply'),\n cancelFunction: function () {\n setFiltersBack();\n }\n };\n\n $scope.$watch('workOrderHistoryFilters.openWhen', function (newVal) {\n if (!newVal) {\n return;\n }\n filtersTemp = angular.copy(self.filters);\n });\n };\n });\n\n'use strict';\n\nangular.module('workOrderFormReadOnly', ['ui.router', 'dudeControls', 'dudeControlsFile', 'dudeApi', 'dudeAuth', 'translate', 'helpers']);\n\n'use strict';\n\nangular.module('workOrderFormReadOnly')\n .config(function ($stateProvider) {\n $stateProvider\n .state('secure.workOrderFormReadOnly', {\n url: 'workordersreadonly/:id',\n templateUrl: 'app/components/workOrderFormReadOnly/requesterFormReadOnly.html',\n controller: 'WorkOrderFormReadOnlyController',\n controllerAs: 'workOrderForm',\n resolve: {\n workOrder: function ($stateParams, DudeApi) {\n return DudeApi.WorkOrderEntity.get({ id: $stateParams.id, includeAudit: true }).$promise;\n },\n attachments: function ($stateParams, DudeApi) {\n return DudeApi.WorkOrderAttachmentEntity.query({ workorderId: $stateParams.id }).$promise;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('workOrderFormReadOnly')\n .controller('WorkOrderFormReadOnlyController', function ($scope, $state, $translate, attachments, attachmentHelpers, DudeApi, fileHelpers, market, marketizr, workOrder, workOrderEnums, log) {\n var self = this;\n self.attachments = attachments.data;\n self.isEduMarket = marketizr.hasMarkets([market.k12, market.he, market.ips]);\n self.workOrder = workOrder.result ? workOrder.result : workOrder;\n self.status = workOrderEnums.status;\n self.spies = [];\n self.files = fileHelpers.populateFiles(self.attachments);\n var offsetPadding = 50;\n self.headerOffset = angular.element('.main-nav').outerHeight(true) + angular.element('.header-container').outerHeight(true) + offsetPadding;\n\n var saveUploadedAttachment = function (file) {\n var attachment = attachmentHelpers.saveAttachmentReference(file, new DudeApi.WorkOrderAttachmentEntity());\n attachment.$save({ workorderId: workOrder.id }).then(function () {\n self.attachments.push(attachment);\n file.saved = true;\n log.notify({\n type: 'success',\n title: $translate.instant('attachments.notify.upload.success'),\n message: file.filename + ' ' + $translate.instant('workOrderForm.notify.upload.successBody')\n });\n });\n };\n\n var uploadSuccessHandler = function (file) {\n return function (response) {\n response.uploading = false;\n var fileToExtend = self.files[self.files.indexOf(file)];\n angular.extend(fileToExtend, response);\n saveUploadedAttachment(fileToExtend);\n };\n };\n\n var uploadErrorHandler = function (file) {\n return function (error) {\n var fileToExtend = self.files[self.files.indexOf(file)];\n angular.extend(fileToExtend, {\n uploading: false,\n error: true,\n errorMessage: fileHelpers.errorMessage(error.data.message)\n });\n\n log.notify({\n type: 'error',\n title: $translate.instant('attachments.notify.upload.error'),\n message: error.data.message\n });\n };\n };\n\n var addToList = function (file) {\n // if they have set the file, and then cancel on the next one\n // the file comes back as undefined, this check makes sure we\n // do nothing in this case\n if (!angular.isDefined(file)) {\n return null;\n }\n\n var object = {\n name: file.name\n };\n\n self.files.push(object);\n return object;\n };\n\n self.upload = function () {\n var transformedFile = addToList(self.file);\n var upload = fileHelpers.uploadFile(self.file);\n upload.then(uploadSuccessHandler(transformedFile), uploadErrorHandler(transformedFile));\n };\n\n $scope.$watch('workOrderForm.file', function (newVal, oldVal) {\n if (newVal === oldVal || !newVal) {\n return;\n }\n self.upload();\n });\n });\n\n/**\n * @ngdoc service\n * @name workOrderForm.workOrderFormHelpers\n * @requires $state\n * @requires userContext\n * @requires helpers.roleHelpers\n * @requires workOrderEnums\n * @requires helpers.defaultPurposesService\n * @requires $q\n * @requires DudeApi\n *\n * @description\n * Service for supporting the work order form by setting up the form for various roles along with useful functionality\n *\n */\n\n'use strict';\n\nangular.module('workOrderForm')\n .factory('workOrderFormHelpers', function ($state, $q, DudeApi, marketizr, market, userContext, roleHelpers, workOrderEnums, defaultPurposesService) {\n /**\n * @ngdoc method\n * @name setToday\n * @methodOf workOrderForm.workOrderFormHelpers\n *\n * @description\n * Sets the date to today's date zeroing out seconds and milliseconds\n *\n * @param {boolean} zeroOutTime A boolean which will cause all time to be set to zero if set to true\n * @returns {date} Today's date\n */\n var setToday = function (zeroOutTime) {\n var date = new Date();\n date.setSeconds(0);\n date.setMilliseconds(0);\n\n if (zeroOutTime) {\n date.setHours(0);\n date.setMinutes(0);\n }\n\n return date;\n };\n\n /**\n * @ngdoc method\n * @name setDefaults\n * @methodOf workOrderForm.workOrderFormHelpers\n *\n * @description\n * Sets the defaults for a work order for set roles\n *\n * @param {object} workOrder An object containing the current work order information\n */\n var setDefaults = function (workOrder) {\n workOrder.status = workOrderEnums.status.newRequest;\n workOrder.priority = workOrderEnums.priority.medium;\n\n workOrder.requestedBy = angular.copy(userContext.user);\n\n defaultPurposesService.getPurpose(defaultPurposesService.purposeKeys.reactivePurpose).then(function (purpose) {\n workOrder.purpose = purpose;\n });\n\n if (!Array.isArray(workOrder.assignees)) {\n workOrder.assignees = [];\n }\n\n workOrder.downtimeTracking = {};\n workOrder.requestDateTime = setToday();\n if (marketizr.hasMarkets([market.k12, market.ips, market.he])) {\n workOrder.scheduledStartDate = setToday();\n }\n if (roleHelpers.isTechnician()) {\n workOrder.assignees = [userContext.user];\n }\n };\n\n /**\n * @ngdoc method\n * @name saveRoute\n * @methodOf workOrderForm.workOrderFormHelpers\n *\n * @description\n * Navigates from the new work order on save to different routes depending on the users role\n *\n * @param {number} id The id of the saved work order\n */\n var saveRoute = function (id) {\n if (roleHelpers.isRequester()) {\n $state.go('secure.workOrderList');\n } else {\n $state.go('secure.workOrderFormEdit', { id: id });\n }\n };\n\n /**\n * @ngdoc method\n * @name setDowntimeTrackingDuration\n * @methodOf workOrderForm.workOrderFormHelpers\n *\n * @description\n * Sets the downtime tracking in terms of milliseconds to save to the api\n *\n * @param {object} workOrder The work order object for the current work order\n */\n var setDowntimeTrackingDuration = function (workOrder) {\n workOrder.downtimeTracking.duration = 0;\n\n if (workOrder.downtimeTracking.hours) {\n workOrder.downtimeTracking.hours = (typeof workOrder.downtimeTracking.hours) === 'number' ? workOrder.downtimeTracking.hours : parseInt(workOrder.downtimeTracking.hours.replace(/,/g, ''), 10);\n workOrder.downtimeTracking.duration = parseFloat(workOrder.downtimeTracking.hours) * 60 * 60 * 1000;\n }\n\n if (workOrder.downtimeTracking.minutes) {\n workOrder.downtimeTracking.duration += (parseFloat(workOrder.downtimeTracking.minutes) * 60 * 1000);\n }\n };\n\n /**\n * @ngdoc method\n * @name readDowntimeTrackingDuration\n * @methodOf workOrderForm.workOrderFormHelpers\n *\n * @description\n * Reads the downtime tracking in terms of milliseconds and converts it to the form's hours and minute fields\n *\n * @param {object} workOrder The work order object for the current work order\n */\n var readDowntimeTrackingDuration = function (workOrder) {\n if (!workOrder.downtimeTracking) {\n return;\n }\n\n if (workOrder.downtimeTracking.duration) {\n workOrder.downtimeTracking.hours = Math.floor(workOrder.downtimeTracking.duration / (1000 * 60 * 60));\n workOrder.downtimeTracking.minutes = Math.floor((workOrder.downtimeTracking.duration / (1000 * 60)) % 60);\n }\n };\n\n return {\n setDefaults: setDefaults,\n setToday: setToday,\n saveRoute: saveRoute,\n setDowntimeTrackingDuration: setDowntimeTrackingDuration,\n readDowntimeTrackingDuration: readDowntimeTrackingDuration\n };\n });\n\n'use strict';\n\nangular.module('workOrderForm')\n .config(function ($stateProvider, permission) {\n // secure. base route in dudeAuth\n $stateProvider\n .state('secure.workOrderFormNew', {\n url: 'workorders/new?businessAsset&project',\n templateUrl: 'app/components/workOrderForm/workOrderForm.html',\n controller: 'WorkOrderFormController',\n controllerAs: 'workOrderForm',\n resolve: {\n workOrder: function ($stateParams, DudeApi, workOrderFormHelpers) {\n var entity = new DudeApi.WorkOrderEntity({});\n workOrderFormHelpers.setDefaults(entity);\n if (angular.isDefined($stateParams.businessAsset)) {\n return DudeApi.BusinessAssetEntity.get({ id: $stateParams.businessAsset }).$promise.then(function (asset) {\n entity.businessAsset = asset;\n return entity;\n });\n } else if (angular.isDefined($stateParams.project)) {\n return DudeApi.ProjectEntity.get({ id: $stateParams.project }).$promise.then(function (project) {\n entity.project = project;\n return entity;\n });\n }\n return entity;\n },\n attachments: function () {\n return [];\n },\n transactions: function () {\n return [];\n },\n tasks: function () {\n return [];\n },\n hasInventory: function () {\n return false;\n },\n areaRoomNumberHelper: function (roleHelpers, settingsHelpers) {\n if (!roleHelpers.isRequester()) {\n return false;\n }\n return settingsHelpers.getLocationDescription();\n }\n }\n })\n .state('secure.workOrderFormEdit', {\n url: 'workorders/:id',\n templateUrl: 'app/components/workOrderForm/workOrderForm.html',\n controller: 'WorkOrderFormController',\n controllerAs: 'workOrderForm',\n permissions: [permission.workOrders.update],\n resolve: {\n workOrder: function ($stateParams, DudeApi) {\n return DudeApi.WorkOrderEntity.get({ id: $stateParams.id, includeAudit: true }).$promise;\n },\n attachments: function ($stateParams, DudeApi) {\n return DudeApi.WorkOrderAttachmentEntity.query({ workorderId: $stateParams.id }).$promise;\n },\n transactions: function ($stateParams, DudeApi) {\n var query = {\n workorderId: $stateParams.id,\n orderBy: 'TransactionDate desc,CreatedDateTime desc',\n includeAudit: true\n };\n return DudeApi.WorkOrderTransactionEntity.query(query).$promise;\n },\n tasks: function ($stateParams, DudeApi) {\n var query = {\n workorderId: $stateParams.id,\n orderBy: 'Order asc'\n };\n return DudeApi.WorkOrderTaskEntity.query(query).$promise;\n },\n hasInventory: function (userContext) {\n return userContext && userContext.products && userContext.products.InventoryManager != null;\n },\n areaRoomNumberHelper: function () {\n return false;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('workOrderForm')\n .controller('WorkOrderFormController', function ($scope, $state, $filter, $q, $document, $translate, $uibModal, DudeApi, slidingPanelSelectStorageAreaService, userContext, log, permissionsHelper, permission, moment, market, marketizr, roleHelpers, workOrderFormHelpers, workOrder, transactions, attachments, tasks, hasInventory, fileHelpers, attachmentHelpers, transactionHelpers, historyChangeTypes, areaRoomNumberHelper) {\n var self = this;\n var filesUploadingCount = 0;\n var canAddInventoryTransactionIssue = permissionsHelper.userAllowed(permission.inventoryTransactions.issue);\n var isEduMarket = marketizr.hasMarkets([market.k12, market.ips, market.he]);\n self.workOrder = workOrder.result ? workOrder.result : workOrder;\n self.market = market;\n self.files = [];\n self.links = [];\n self.userContext = userContext;\n self.attachments = attachments.data;\n self.isNew = !workOrder.id;\n self.canAddTasks = permissionsHelper.userAllowed(permission.workOrders.createTasks);\n self.isTechnician = roleHelpers.isTechnician();\n self.isRequester = roleHelpers.isRequester();\n self.storageAreas = [];\n self.openStoragePanel = false;\n self.openIssueToWorkOrder = false;\n self.openHistoryPanel = false;\n self.areaRoomNumberHelper = areaRoomNumberHelper;\n self.inventory = {\n hasInventory: hasInventory,\n inventoryTransactions: []\n };\n self.historyEntity = {\n objectId: self.workOrder.id,\n objectType: historyChangeTypes.workOrder,\n parentId: null,\n parentType: null,\n includeSubCollections: true\n };\n\n self.tasks = angular.isDefined(tasks.data) ? tasks.data : [];\n var originalTasks = angular.copy(self.tasks);\n self.tasksToDelete = [];\n\n self.spies = [];\n var offsetPadding = 50;\n self.headerOffset = angular.element('.main-nav').outerHeight(true) + angular.element('.header-container').outerHeight(true) + offsetPadding;\n\n if (!self.isNew) {\n self.files = fileHelpers.populateFiles(self.attachments);\n self.transactions = transactionHelpers.parseTransactions(transactions.data, userContext);\n }\n\n workOrderFormHelpers.readDowntimeTrackingDuration(workOrder);\n // Private methods\n\n var removeAttachmentErrors = function () {\n self.files = $filter('filter')(self.files, function (file) {\n return file.id;\n });\n };\n\n var workOrderSaveSuccess = function (id) {\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderForm.notificationTitle'),\n message: $translate.instant('workOrderForm.notification')\n });\n\n workOrderFormHelpers.saveRoute(id);\n\n if (!self.isNew) {\n self.disableSave = false;\n }\n };\n\n var newWorkOrderAttachmentHandler = function (id) {\n var promises = [];\n for (var i = 0; i < self.files.length; i++) {\n if (self.files[i].mime) {\n var attachment = attachmentHelpers.saveAttachmentReference(self.files[i], new DudeApi.WorkOrderAttachmentEntity());\n promises.push(attachment.$save({ workorderId: id }));\n }\n }\n\n return $q.all(promises);\n };\n\n var removeFromList = function (fileIndex) {\n self.files.splice(fileIndex, 1);\n };\n\n var deleteFile = function (file) {\n // calls file api to remove file but doesn't handle result since user doesn't care if this succeeds for fails\n fileHelpers.deleteFile(file).$promise.then(angular.noop, angular.noop);\n };\n\n var deleteWarning = function (index, file) {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/attachments/attachmentDeleteWarningModal.html',\n controller: 'AttachmentDeleteWarningModalController',\n size: 'sm',\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n var attachment = attachmentHelpers.deleteAttachmentReference(file, self.attachments, new DudeApi.WorkOrderAttachmentEntity(), 'workOrder');\n attachment.$delete({ workorderId: workOrder.id, id: attachment.workOrderAttachmentId }).then(function () {\n removeFromList(index);\n deleteFile(file);\n log.notify({\n type: 'success',\n title: $translate.instant('attachments.notify.deleteAttachment.title'),\n message: attachment.name + ' ' + $translate.instant('attachments.notify.deleteAttachment.message')\n });\n });\n });\n };\n\n var setUploadCheckInvalid = function () {\n $scope.form.uploadCheck.$setValidity('uploadInProgress', false);\n };\n\n var setUploadCheckValid = function () {\n $scope.form.uploadCheck.$setValidity('uploadInProgress', true);\n };\n\n var performUploadCheckValidation = function () {\n if (filesUploadingCount > 0) {\n setUploadCheckInvalid();\n } else {\n setUploadCheckValid();\n }\n };\n\n var addToList = function (file) {\n // if they have set the file, and then cancel on the next one\n // the file comes back as undefined, this check makes sure we\n // do nothing in this case\n if (!angular.isDefined(file)) {\n return null;\n }\n\n filesUploadingCount++;\n performUploadCheckValidation();\n var object = {\n name: file.name\n };\n\n self.files.push(object);\n return object;\n };\n\n var saveUploadedAttachment = function (file) {\n var attachment = attachmentHelpers.saveAttachmentReference(file, new DudeApi.WorkOrderAttachmentEntity());\n attachment.$save({ workorderId: workOrder.id }).then(function () {\n self.attachments.push(attachment);\n file.saved = true;\n log.notify({\n type: 'success',\n title: $translate.instant('attachments.notify.upload.success'),\n message: file.filename + ' ' + $translate.instant('workOrderForm.notify.upload.successBody')\n });\n });\n };\n\n var uploadSuccessHandler = function (file) {\n return function (response) {\n filesUploadingCount--;\n performUploadCheckValidation();\n response.uploading = false;\n var fileToExtend = self.files[self.files.indexOf(file)];\n angular.extend(fileToExtend, response);\n\n if (!self.isNew) {\n saveUploadedAttachment(fileToExtend);\n }\n };\n };\n\n var uploadErrorHandler = function (file) {\n return function (error) {\n filesUploadingCount--;\n performUploadCheckValidation();\n var fileToExtend = self.files[self.files.indexOf(file)];\n angular.extend(fileToExtend, {\n uploading: false,\n error: true,\n errorMessage: fileHelpers.errorMessage(error.data.message)\n });\n\n log.notify({\n type: 'error',\n title: $translate.instant('attachments.notify.upload.error'),\n message: error.data.message\n });\n };\n };\n\n var skipNavigationWarningModal = function () {\n self.skipNavigationWarning = true;\n };\n\n var saveTasksPromises = function () {\n var promises = [];\n var i;\n\n // delete tasks\n for (i = 0; i < self.tasksToDelete.length; i++) {\n var deleteTask = self.tasksToDelete[i];\n if (deleteTask.id) {\n var deleteTaskPromise = DudeApi.WorkOrderTaskEntity.delete({\n workorderId: self.workOrder.id,\n id: deleteTask.id\n }).$promise;\n\n promises.push(deleteTaskPromise);\n }\n }\n // add tasks\n for (i = 0; i < self.tasks.length; i++) {\n var task = self.tasks[i];\n task.order = i + 1; // Make sure this is correct in the future\n\n // Check to see if the task has changed and if not then don't make the call\n if (!angular.equals(originalTasks[i], task) && task.title) {\n var addTasksPromise = task.id ? DudeApi.WorkOrderTaskEntity.update({\n workorderId: self.workOrder.id,\n id: task.id\n },\n task).$promise : DudeApi.WorkOrderTaskEntity.save({\n workorderId: self.workOrder.id\n },\n task).$promise;\n\n promises.push(addTasksPromise);\n }\n }\n\n return promises;\n };\n\n self.showHistoryPanel = function () {\n self.openHistoryPanel = true;\n };\n\n self.canInventory = function () {\n return !self.isNew && self.inventory && self.inventory.hasInventory && canAddInventoryTransactionIssue;\n };\n\n self.saveWorkOrder = function () {\n self.disableSave = true;\n\n if (!isEduMarket && workOrder.downtimeTracking) {\n workOrderFormHelpers.setDowntimeTrackingDuration(workOrder);\n }\n\n var promise = !self.isNew ? workOrder.$update({\n id: workOrder.id,\n includeAudit: true\n }) : workOrder.$save({ includeAudit: true });\n var workOrderId;\n promise.then(function (data) {\n workOrderId = data.id;\n skipNavigationWarningModal();\n if (self.isNew) {\n self.workOrder.updatedDateTime = data.updatedDateTime;\n return newWorkOrderAttachmentHandler(data.id);\n }\n removeAttachmentErrors();\n\n if (data.downtimeTracking) {\n workOrderFormHelpers.readDowntimeTrackingDuration(data);\n // Display the hours with commas if needed\n data.downtimeTracking.hours = data.downtimeTracking.hours ? $filter('number')(data.downtimeTracking.hours) : null;\n data.downtimeTracking.cost = data.downtimeTracking.cost ? $filter('number')(data.downtimeTracking.cost, 2) : null;\n }\n self.workOrder.updatedDateTime = data.updatedDateTime;\n return $q.resolve();\n }).then(function () {\n var promises = [];\n self.links.forEach(function (link) {\n // Links without IDs haven't been saved.\n if (!link.id) {\n link.objectId = workOrderId;\n promises.push(DudeApi.WebLinksEntity.save(link).$promise);\n }\n });\n\n if (promises.length > 0) {\n return $q.all(promises);\n }\n\n return $q.resolve();\n }).then(function () {\n return $q.all(saveTasksPromises()).then(function () {\n DudeApi.WorkOrderTaskEntity.query({\n workorderId: self.workOrder.id,\n orderBy: 'Order asc'\n })\n .$promise.then(function (response) {\n self.tasks = response.data;\n originalTasks = angular.copy(self.tasks);\n self.tasksToDelete.length = 0;\n });\n });\n }).then(function () {\n workOrderSaveSuccess(workOrderId);\n // Scroll to the top on save for edit\n $document.scrollTop(0);\n }, function () {\n self.disableSave = false;\n });\n };\n\n self.upload = function () {\n var transformedFile = addToList(self.file);\n var upload = fileHelpers.uploadFile(self.file);\n upload.then(uploadSuccessHandler(transformedFile), uploadErrorHandler(transformedFile));\n };\n\n self.deleteAttachment = function (index, file) {\n if (self.isNew) {\n removeFromList(index);\n deleteFile(file);\n } else {\n deleteWarning(index, file);\n }\n };\n\n self.printWorkOrder = function () {\n DudeApi.workOrderPrintService.print({ id: workOrder.id, timezone: moment.tz.guess() });\n };\n\n self.assetBrowseOptions = {\n type: 'slidingPanel',\n keepFiltersOpen: true,\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n }\n }\n };\n\n $scope.$watch('workOrderForm.tasksToDelete', function (newVal, oldVal) {\n if (newVal === oldVal) {\n return;\n }\n if (newVal.length > 0) {\n $scope.form.$dirty = true;\n }\n }, true);\n\n $scope.$watch('workOrderForm.file', function (newVal, oldVal) {\n if (newVal === oldVal || !newVal) {\n return;\n }\n self.upload();\n });\n });\n\n'use strict';\n\nangular.module('workOrderFilters', ['translate', 'dudeAuth', 'dudeControls', 'helpers', 'maintenanceConstants']);\n\n/**\n * @ngdoc service\n * @name workOrderFilters.workOrderFilters\n * @requires pagingHelpers {@link http://frontend.dudesoln.com/ng-docs/DudeControls/#/api/filterHelpers.pagingHelpersService read the docs}\n * @requires helpers.roleHelpers\n * @requires userContext {@link http://frontend.dudesoln.com/ng-docs/DudeBase/#/api/dudeAuth.userContext read the docs}\n * @requires workOrderEnums {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApiConstants.workOrderEnums read the docs}\n *\n * @description\n * Service for supporting the work order list by handling filter logic\n *\n */\n\n'use strict';\n\nangular.module('workOrderFilters')\n .factory('workOrderFilters', function (pagingHelpers, roleHelpers, userContext, workOrderEnums, moment) {\n var filterKeys = ['page', 'pageSize', 'q', 'orderBy', 'priority', 'status', 'purpose', 'project', 'trade', 'requestDateFrom', 'requestDateTo', 'completionDateFrom', 'completionDateTo', 'assignees', 'businessAsset', 'unassigned', 'pmSchedule', 'includeDescendants', 'failureReason', 'hasScheduledStartDate', 'scheduledStartDateTo', 'scheduledStartDateFrom', 'dueDateFrom', 'dueDateTo', 'workType'];\n\n var checkArray = function (value) {\n if (!Array.isArray(value)) {\n var array = [];\n array.push(value);\n return array;\n }\n return value;\n };\n\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf workOrderFilters.workOrderFilters\n *\n * @description\n * Returns a filter object parsed and formatted ready to use with the api\n *\n * @param {object} params An object containing the filter params to use\n * @param {boolean} isMap A boolean that states whether or not to use sorting and paging with the param object\n * @returns {object} Filter object\n */\n var getFilters = function (params, isMap) {\n var filters = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'RequestDateTime desc',\n q: params.q || null,\n priority: params.priority || [],\n status: params.status || [],\n workType: params.workType || [],\n purpose: params.purpose || [],\n project: params.project || [],\n trade: params.trade || [],\n requestDateFrom: params.requestDateFrom || null,\n requestDateTo: params.requestDateTo || null,\n completionDateFrom: params.completionDateFrom || null,\n completionDateTo: params.completionDateTo || null,\n assignees: params.assignees || null,\n businessAsset: params.businessAsset || [],\n unassigned: params.unassigned || null,\n pmSchedule: params.pmSchedule || null,\n includeDescendants: params.includeDescendants || null,\n failureReason: params.failureReason || [],\n scheduledStartDateFrom: params.scheduledStartDateFrom ? new Date(params.scheduledStartDateFrom).toISOString() : null,\n scheduledStartDateTo: params.scheduledStartDateTo ? new Date(params.scheduledStartDateTo).toISOString() : null,\n hasScheduledStartDate: params.hasScheduledStartDate || null,\n dueDateFrom: params.dueDateFrom || null,\n dueDateTo: params.dueDateTo || null\n };\n\n if (roleHelpers.isRequester()) {\n filters.requestedBy = userContext.user.id;\n }\n\n filters.priority = checkArray(filters.priority);\n filters.status = checkArray(filters.status);\n filters.workType = checkArray(filters.workType);\n filters.purpose = checkArray(filters.purpose);\n filters.project = checkArray(filters.project);\n filters.trade = checkArray(filters.trade);\n filters.businessAsset = checkArray(filters.businessAsset);\n filters.failureReason = checkArray(filters.failureReason);\n\n if (angular.isDefined(isMap) && isMap === true) {\n delete filters.page;\n delete filters.pageSize;\n delete filters.orderBy;\n }\n\n return filters;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf workOrderFilters.workOrderFilters\n *\n * @description\n * Converts a filter object to a useable state by the api\n *\n * @param {object} currentFilter An object containing the filter params to use\n * @param {boolean} isMap A boolean that states whether or not to use sorting and paging with the param object\n * @returns {object} Filter object\n */\n var toApiFilter = function (currentFilter, isMap) {\n var filter = getFilters(angular.copy(currentFilter), isMap);\n\n if (filter.unassigned === 'unassigned' && filter.assignees) {\n filter.unassigned = null;\n }\n\n if (filter.unassigned && filter.unassigned === 'unassigned') {\n filter.assignees = 'null';\n }\n\n if (filter.includeDescendants === 'false') {\n filter.includeDescendants = null;\n }\n\n if (filter.hasScheduledStartDate === 'false') {\n filter.scheduledStartDateFrom = null;\n filter.scheduledStartDateTo = null;\n }\n\n if (filter.status && (filter.status === 'all' || filter.status[0] === 'all')) {\n delete filter.status;\n }\n\n if (filter.priority && (filter.priority === 'all' || filter.priority[0] === 'all')) {\n delete filter.priority;\n }\n\n if (filter.orderBy && filter.orderBy.indexOf('DueDateTime') > -1) {\n filter.hasDueDate = true;\n } else {\n delete filter.hasDueDate;\n }\n\n return filter;\n };\n\n /**\n * @ngdoc method\n * @name setEndOfDayYesterday\n * @methodOf workOrderFilters.workOrderFilters\n *\n * @description\n * Returns a ISO string date set to the end of the day of the day before today\n *\n * @returns {string} Date ISO string\n */\n var setEndOfDayYesterday = function () {\n var date = new Date();\n date = new Date(date.setDate(date.getDate() - 1));\n date.setHours(23);\n date.setMinutes(59);\n date.setSeconds(59);\n date.setMilliseconds(0);\n date = date.toISOString();\n return date;\n };\n\n /**\n * @ngdoc method\n * @name setOverdueFilter\n * @methodOf workOrderFilters.workOrderFilters\n *\n * @description\n * Returns a filter object used to show the overdue work orders\n *\n * @returns {object} Filter object\n */\n var setOverdueFilter = function () {\n var filter = {};\n var dueDateParam = 'dueDateTo';\n filter[dueDateParam] = setEndOfDayYesterday();\n filter.status = [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress];\n filter.orderBy = 'DueDateTime asc';\n return filter;\n };\n\n /**\n * @ngdoc method\n * @name setUnscheduledFilter\n * @methodOf workOrderFilters.workOrderFilters\n *\n * @description\n * Returns a filter object used to show the unscheduled work orders\n *\n * @returns {object} Filter object\n */\n var setUnscheduledFilter = function () {\n var filter = {};\n filter.hasScheduledStartDate = 'false';\n filter.status = [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress];\n return filter;\n };\n\n var dateComparison = function (oldDate, newDate) {\n if (!oldDate && !newDate) {\n return true;\n } else if ((oldDate && !newDate) || (newDate && !oldDate)) {\n return false;\n }\n return moment(new Date(newDate)).isSame(new Date(oldDate), 'days');\n };\n\n /**\n * @ngdoc method\n * @name checkFilterDifferences\n * @methodOf workOrderFilters.workOrderFilters\n *\n * @description\n * Checks to see if there are any differences in filters\n *\n * @param {object} oldVal An object containing the new version of the filters\n * @param {object} newVal An object containing the prior version of the filters\n * @returns {boolean} A boolean stating whether or not the filters have changed\n */\n var checkFilterDifferences = function (oldVal, newVal) {\n var unchanged = true;\n filterKeys.forEach(function (key) {\n var status;\n if (key.indexOf('Date') > -1) {\n status = dateComparison(oldVal[key], newVal[key]);\n } else if (key.indexOf('assignees') > -1) {\n var assignee1 = Array.isArray(oldVal[key]) ? oldVal[key][0] : oldVal[key];\n var assignee2 = Array.isArray(newVal[key]) ? newVal[key][0] : newVal[key];\n status = angular.equals(assignee1, assignee2);\n } else {\n status = angular.equals(oldVal[key], newVal[key]);\n }\n\n unchanged = unchanged && status;\n });\n return unchanged;\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n setOverdueFilter: setOverdueFilter,\n setEndOfDayYesterday: setEndOfDayYesterday,\n checkFilterDifferences: checkFilterDifferences,\n setUnscheduledFilter: setUnscheduledFilter\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderFilters.work-order-filters\n * @description\n *\n * Displays the filter section for the work order list or map\n *\n * @param {object} filters stores the value of all defined filters\n * @param {boolean} hideFilters stores whether or not the filters are hidden so that they may be toggled\n * @param {boolean} isDisabled states whether or not to disable filters (optional)\n *\n */\n\n'use strict';\n\nangular.module('workOrderFilters')\n .component('workOrderFilters', {\n templateUrl: 'app/components/workOrderFilters/workOrderFilters.html',\n bindings: {\n filters: '=',\n hideFilters: '=',\n isDisabled: '=?'\n },\n controller: 'WorkOrderFiltersController',\n controllerAs: 'workOrderFilters'\n })\n .controller('WorkOrderFiltersController', function ($scope, $window, $timeout, marketizr, market, moment, workOrderEnums, $translate, workOrderFilters, roleHelpers, roles) {\n var self = this;\n var isEduMarket = marketizr.hasMarkets([market.k12, market.he, market.ips]);\n var mobileWidth = 768;\n var openDefault = {\n open: true\n };\n\n self.roles = [roles.admin, roles.technician];\n self.market = market;\n self.sorting = {};\n self.isRequester = roleHelpers.isRequester();\n self.isTechnician = roleHelpers.isTechnician();\n self.overdueFilter = workOrderFilters.getFilters(workOrderFilters.setOverdueFilter());\n self.unscheduledFilter = workOrderFilters.getFilters(workOrderFilters.setUnscheduledFilter());\n self.dueDateFilterName = 'dueDate';\n self.workType = {};\n self.assigneeTitle = $translate.instant('workOrderFilters.assignee');\n\n self.assetBrowseOptions = {\n type: 'slidingPanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n }\n }\n };\n\n if (isEduMarket) {\n self.assetHideCheckBox = true;\n }\n\n if (self.isRequester) {\n self.additionalFilters = {\n isLocation: true\n };\n self.assetBrowseOptions.keepFiltersOpen = true;\n } else {\n self.assetBrowseOptions.filterPanel['asset-category'] = {\n filter: 'isLocation'\n };\n }\n\n var hasDateFunction = function (string) {\n string = string.slice(3);\n var firstCharacter = string[0].toLowerCase();\n return firstCharacter + string.slice(1);\n };\n\n var parseKeys = function (key) {\n // IMPORTANT the objects used to track open or closed on the component must be named the same as the corresponding filter keys\n\n var modifiedKey;\n var dateIndex = key.indexOf('Date');\n if (key === 'unassigned') {\n // Apply unassigned filter changes to the assignees accordion\n modifiedKey = 'assignees';\n } else if (dateIndex > -1) {\n // Since date filters have an additional to and from extension strip that to find the right accordion\n modifiedKey = key.indexOf('has') > -1 ? hasDateFunction(key) : key.slice(0, dateIndex + 4);\n } else {\n modifiedKey = key;\n }\n return modifiedKey;\n };\n\n // priority defaults to open.\n self.priority = angular.copy(openDefault);\n\n self.assignedToVisible = function () {\n return !roleHelpers.isRequester();\n };\n\n self.unassignedFilter = function () {\n if (self.filters.unassigned === 'unassigned') {\n self.filters.unassigned = null;\n } else {\n self.filters.unassigned = 'unassigned';\n self.assignees.filter = null;\n self.filters.assignees = null;\n }\n };\n\n self.dueDateSort = function () {\n self.filters.orderBy = 'DueDateTime asc';\n self.filters.status = ['NewRequest', 'WorkInProgress'];\n };\n\n self.setScheduled = function () {\n self.filters.hasScheduledStartDate = null;\n self.scheduledDatesDisabled = false;\n self.currentScheduledRange = $translate.instant('workOrderFilters.dateRanges.all');\n };\n\n var setUnscheduled = function () {\n self.filters.hasScheduledStartDate = 'false';\n self.scheduledDatesDisabled = true;\n self.currentScheduledRange = $translate.instant('workOrderFilters.dateRanges.unscheduled');\n };\n\n var now = moment();\n var todayStart = new Date(now.startOf('day'));\n var todayEnd = new Date(now.endOf('day'));\n var thisWeekStart = new Date(now.startOf('week'));\n var thisWeekEnd = new Date(now.endOf('week'));\n\n var yesterday = moment().subtract(1, 'day');\n var yesterdayStart = new Date(yesterday.startOf('day'));\n var yesterdayEnd = new Date(yesterday.endOf('day'));\n\n var lastWeek = moment().subtract(1, 'weeks');\n var lastWeekStart = new Date(lastWeek.startOf('week'));\n var lastWeekEnd = new Date(lastWeek.endOf('week'));\n\n var nextWeek = moment().add(1, 'weeks');\n var nextWeekStart = new Date(nextWeek.startOf('week'));\n var nextWeekEnd = new Date(nextWeek.endOf('week'));\n\n var thisMonthStart = new Date(moment().startOf('month'));\n var thisMonthEnd = new Date(moment().endOf('month'));\n\n var nextMonth = moment().add(1, 'months');\n var nextMonthStart = new Date(nextMonth.startOf('month'));\n var nextMonthEnd = new Date(nextMonth.endOf('month'));\n\n var eduScheduledStartRanges = [\n {\n text: $translate.instant('workOrderFilters.dateIncrements.thisWeek'),\n startDate: thisWeekStart,\n endDate: thisWeekEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.nextWeek'),\n startDate: nextWeekStart,\n endDate: nextWeekEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.thisMonth'),\n startDate: thisMonthStart,\n endDate: thisMonthEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.nextMonth'),\n startDate: nextMonthStart,\n endDate: nextMonthEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateRanges.unscheduled'),\n startDate: -2,\n endDate: -2,\n activeFunction: setUnscheduled\n }\n ];\n\n var mfgScheduledStartRanges = [\n {\n text: $translate.instant('workOrderFilters.dateRanges.next7'),\n startDate: moment().hours(0).minutes(0).seconds(0),\n endDate: moment().add(7, 'days').hours(23).minutes(59).seconds(59)\n },\n {\n text: $translate.instant('workOrderFilters.dateRanges.next30'),\n startDate: moment().hours(0).minutes(0).seconds(0),\n endDate: moment().add(30, 'days').hours(23).minutes(59).seconds(59)\n },\n {\n text: $translate.instant('workOrderFilters.dateRanges.unscheduled'),\n startDate: -2,\n endDate: -2,\n activeFunction: setUnscheduled\n }\n ];\n\n self.scheduledStartRanges = isEduMarket ? eduScheduledStartRanges : mfgScheduledStartRanges;\n\n self.dueDateIncrements = [\n {\n text: $translate.instant('workOrderFilters.dateIncrements.today'),\n startDate: todayStart,\n endDate: todayEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.thisWeek'),\n startDate: thisWeekStart,\n endDate: thisWeekEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.nextWeek'),\n startDate: nextWeekStart,\n endDate: nextWeekEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.thisMonth'),\n startDate: thisMonthStart,\n endDate: thisMonthEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.nextMonth'),\n startDate: nextMonthStart,\n endDate: nextMonthEnd\n }\n ];\n\n self.requestDateIncrements = [\n {\n text: $translate.instant('workOrderFilters.dateIncrements.today'),\n startDate: todayStart,\n endDate: todayEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.thisWeek'),\n startDate: thisWeekStart,\n endDate: thisWeekEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.lastWeek'),\n startDate: lastWeekStart,\n endDate: lastWeekEnd\n }\n ];\n\n self.completedDateIncrements = [\n {\n text: $translate.instant('workOrderFilters.dateIncrements.today'),\n startDate: todayStart,\n endDate: todayEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.yesterday'),\n startDate: yesterdayStart,\n endDate: yesterdayEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.thisWeek'),\n startDate: thisWeekStart,\n endDate: thisWeekEnd\n },\n {\n text: $translate.instant('workOrderFilters.dateIncrements.lastWeek'),\n startDate: lastWeekStart,\n endDate: lastWeekEnd\n }\n ];\n\n self.clearFilters = function (avoidUpdates) {\n if (self.isDisabled) {\n return;\n }\n self.workType.filter = null;\n self.purpose.filter = null;\n self.project.filter = null;\n self.trade.filter = null;\n self.assignees.filter = null;\n self.businessAsset.filter = null;\n self.failureReason.filter = null;\n if (!avoidUpdates) {\n self.filters = workOrderFilters.getFilters({});\n self.scheduledDatesDisabled = false;\n self.currentScheduledRange = 3;\n self.currentScheduledIncrement = 5;\n }\n\n if (isEduMarket) {\n self.filters.includeDescendants = 'true';\n }\n };\n\n self.openQuickFilters = function (openArray) {\n if ($window.innerWidth < mobileWidth) {\n // On mobile hide the filters after using a quick filter\n self.hideFilters = true;\n } else {\n openArray.forEach(function (param) {\n // open all of the filters on the passed in array that are affected by this quick filter\n self[param].open = true;\n });\n }\n };\n\n self.quickFilters = [\n {\n name: 'Overdue',\n filters: self.overdueFilter,\n callback: self.setScheduled,\n openList: ['status', 'dueDate']\n }, {\n name: 'Unscheduled',\n filters: self.unscheduledFilter,\n callback: setUnscheduled,\n openList: ['scheduledStartDate', 'status']\n }\n ];\n\n self.$onInit = function () {\n Object.keys(self.filters).forEach(function (key) {\n var keyToUse = parseKeys(key);\n if (Array.isArray(self.filters[key])) {\n // if the value is an array and it is not empty then open the accordion\n self[key] = self.filters[key].length > 0 ? angular.copy(openDefault) : {};\n } else if (self.filters[key]) {\n // If the filter has value open the accordion\n self[keyToUse] = angular.copy(openDefault);\n } else if (!self[keyToUse]) {\n // If the filter does not have value and the accordion has not been opened then set the accordion closed\n self[keyToUse] = {};\n }\n });\n\n $scope.$watch('filters.scheduledStartDateTo', function () {\n if (self.filters.hasScheduledStartDate === 'false') {\n setUnscheduled();\n } else {\n self.setScheduled();\n }\n });\n\n $scope.$watch('filters.scheduledStartDateFrom', function () {\n if (self.filters.hasScheduledStartDate === 'false') {\n setUnscheduled();\n } else {\n self.setScheduled();\n }\n });\n\n $scope.$watch('assignees.filter', function (newVal, oldVal) {\n if (newVal === oldVal) {\n return;\n }\n\n if (newVal !== null) {\n self.filters.unassigned = null;\n }\n });\n };\n });\n\n'use strict';\n\nangular.module('workOrderComments', ['translate', 'dudeAuth', 'dudeControls']);\n\n'use strict';\n\nangular.module('workOrderComments')\n .controller('workOrderCommentsDeleteModalController', function ($uibModalInstance, $scope) {\n $scope.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n/**\n * @ngdoc service\n * @name workOrderComments.workOrderCommentsService\n * @requires DudeApi\n *\n * @description\n * Service for supporting work order comments\n *\n */\n\n'use strict';\n\nangular.module('workOrderComments')\n .service('workOrderCommentsService', function (DudeApi) {\n var COMMENT_PAGE_SIZE = 1000;\n /**\n * @ngdoc method\n * @name getCommentData\n * @methodOf workOrderComments.workOrderCommentsService\n *\n * @description\n * Gets the data for the work order comments\n *\n * @param {int} workOrderId the work order id to query with\n * @returns {promise} A promise containing the page wrapped work order comment data\n */\n\n var getCommentData = function (workOrderId) {\n var filters = {\n ownerId: workOrderId,\n ownerType: 'workorder',\n pageSize: COMMENT_PAGE_SIZE,\n includeAudit: true\n };\n\n return DudeApi.CommentEntity.query(filters).$promise;\n };\n\n return {\n getCommentData: getCommentData\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderComments.work-order-comments\n * @restrict E\n * @description\n *\n * Renders the comments section of the work order form\n *\n * @param {int} workOrderId The work order id\n * @param {boolean} saveAttempt Declares whether or not an attempt to save has been made\n * @param {array} spies The array of spies used by the scroll spy\n *\n */\n\n'use strict';\n\nangular.module('workOrderComments')\n .component('workOrderComments', {\n bindings: {\n workOrderId: '<',\n saveAttempt: '<',\n spies: '='\n },\n templateUrl: 'app/components/workOrderComments/workOrderComments.html',\n controller: 'WorkOrderCommentsComponent',\n controllerAs: 'workOrderComments'\n })\n .controller('WorkOrderCommentsComponent', function ($translate, $uibModal, DudeApi, log, workOrderCommentsService, permissionsHelper, permission, roleHelpers, userContext) {\n var self = this;\n\n var showDeleteMessage = function () {\n log.notify({\n title: $translate.instant('workOrderComments.notify.delete.title'),\n type: 'success',\n message: $translate.instant('workOrderComments.notify.delete.message')\n });\n };\n\n var showSaveMessage = function () {\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderComments.notify.save.title'),\n message: $translate.instant('workOrderComments.notify.save.message')\n });\n };\n\n var parseComments = function (comments, userId) {\n var parsedComments = [];\n comments.forEach(function (comment) {\n comment.isEditable = false;\n if (permissionsHelper.userAllowed(permission.users.create) || (comment.postedBy.id !== null && comment.postedBy.id === userId)) {\n comment.isEditable = true;\n }\n if (comment.audit.updatedDateTime > comment.audit.createdDateTime) {\n comment.edited = true;\n }\n // boolean value and checkbox value are flipped\n comment.isInternalCheckbox = !comment.isInternal;\n parsedComments.push(comment);\n });\n return parsedComments;\n };\n\n self.saveComment = function () {\n var newComment = new DudeApi.CommentEntity({\n text: self.comment.text,\n owner: {\n id: self.workOrderId,\n type: 'workorder'\n },\n isInternal: !self.comment.isInternalCheckbox\n });\n\n newComment.$save().then(function () {\n showSaveMessage();\n self.comment.text = null;\n self.comment.isInternalCheckbox = true;\n return workOrderCommentsService.getCommentData(self.workOrderId);\n }).then(function (response) {\n self.comments = parseComments(response.data, self.currentUserId);\n });\n };\n\n self.updateComment = function (comment) {\n comment.isInternal = !self.editingComment.isInternalCheckbox;\n comment.$update({\n id: comment.id\n }).then(function () {\n showSaveMessage();\n return workOrderCommentsService.getCommentData(self.workOrderId);\n }).then(function (response) {\n self.comments = parseComments(response.data, self.currentUserId);\n self.editingComment = null;\n });\n };\n\n self.setEditComment = function (comment) {\n if (self.editingComment && comment.id === self.editingComment.id) {\n comment.isInternal = self.editingComment.isInternal;\n self.editingComment = null;\n return;\n }\n self.editingComment = angular.copy(comment);\n };\n\n self.deleteComment = function (comment) {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/workOrderComments/workOrderCommentsDeleteConfirmModal.html',\n controller: 'workOrderCommentsDeleteModalController',\n size: 'sm',\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n comment.$delete({\n id: comment.id\n }).then(function () {\n showDeleteMessage();\n return workOrderCommentsService.getCommentData(self.workOrderId);\n }).then(function (response) {\n self.comments = parseComments(response.data, self.currentUserId);\n });\n });\n };\n\n self.$onInit = function () {\n self.currentUserId = userContext.user.id;\n\n workOrderCommentsService.getCommentData(self.workOrderId).then(function (response) {\n self.comments = parseComments(response.data, self.currentUserId);\n });\n\n self.isRequester = roleHelpers.isRequester();\n\n self.comment = {\n text: '',\n isInternalCheckbox: true\n };\n };\n });\n\n'use strict';\n\nangular.module('workOrderCalendarMonth', ['ui.router', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'workOrderCalendar']);\n\n'use strict';\n\nangular.module('workOrderCalendarMonth')\n .config(function ($stateProvider, permission) {\n // secure. base route in dudeAuth\n $stateProvider\n .state('secure.workOrderCalendar.month', {\n url: 'month?year&month&day&status&assignees&unassigned&purpose&businessAsset&includeDescendants&workType',\n templateUrl: 'app/components/workOrderCalendarMonth/workOrderCalendarMonth.html',\n controller: 'WorkOrderCalendarMonthController',\n controllerAs: 'workOrderCalendar',\n permissions: permission.calendarEvents.read,\n resolve: {\n initData: function ($q, $stateParams, moment, clientHelperService, responsiveBreakpoints, workOrderEnums, workOrderCalendarService, workOrderFilters) {\n var isMobile = clientHelperService.getCurrentScreenSize().breakpoint === responsiveBreakpoints.xs;\n var queryParams = $stateParams;\n var targetDate = new Date();\n\n queryParams.status = (queryParams.status || [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.onHold]);\n queryParams.includeDescendants = queryParams.businessAsset ? queryParams.includeDescendants === 'true' : true;\n\n if (queryParams.month && queryParams.year && queryParams.day) {\n targetDate = new Date(queryParams.month + '/' + queryParams.day + '/' + queryParams.year);\n var dates = workOrderCalendarService.getDateRange(targetDate);\n queryParams.scheduledStartDateFrom = dates.startDate;\n queryParams.scheduledStartDateTo = dates.endDate;\n }\n\n var filters = workOrderFilters.getFilters(queryParams);\n\n if (isMobile) {\n filters.scheduledStartDateFrom = moment(targetDate).hours(0).minutes(0).seconds(0).milliseconds(0).toISOString();\n filters.scheduledStartDateTo = moment(targetDate).hours(23).minutes(59).seconds(59).milliseconds(999).toISOString();\n }\n\n var projectionFilter = angular.copy(filters);\n if (moment(new Date()).isSame(new Date(projectionFilter.scheduledStartDateFrom), 'month') || moment(new Date()).isAfter(new Date(projectionFilter.scheduledStartDateFrom), 'month')) {\n projectionFilter.scheduledStartDateFrom = moment(new Date()).add(1, 'days').set('hour', 0).set('minute', 0).toISOString();\n }\n\n return $q.all({\n filters: filters,\n calendarEvents: workOrderCalendarService.getCalendarData('CalendarEventsEntity', filters).then(function (results) {\n return isMobile ? results : workOrderCalendarService.parseCalendarData(results, targetDate, 'secure.workOrderFormEdit');\n }),\n calendarProjections: ((queryParams.status.indexOf(workOrderEnums.status.newRequest) > -1 || queryParams.status.indexOf('all') > -1) && !moment(targetDate).isBefore(new Date(), 'month')) ? workOrderCalendarService.getCalendarData('CalendarProjectionEntity', projectionFilter).then(function (results) {\n return isMobile ? results : workOrderCalendarService.parseCalendarData(results, targetDate);\n }) : null,\n targetDate: targetDate,\n isMobile: isMobile\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('workOrderCalendarMonth')\n .controller('WorkOrderCalendarMonthController', function ($scope, $filter, $q, $state, $translate, roles, moment, clientHelperService, responsiveBreakpoints, workOrderEnums, queryHelpers, marketizr, market, workOrderFilters, initData, workOrderCalendarService) {\n var self = this;\n\n self.clearFilters = function () {\n self.filters = workOrderFilters.getFilters({});\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n self.filters.includeDescendants = true;\n }\n };\n\n var queryDefaults = workOrderFilters.getFilters({});\n self.isMobile = initData.isMobile;\n self.screenSize = clientHelperService.getCurrentScreenSize();\n self.isMobilePhone = clientHelperService.isMobile();\n self.priority = workOrderEnums.priority;\n self.market = market;\n\n self.assigneeTitle = $translate.instant('workOrderCalendar.assignee');\n self.assigneeRoles = [roles.admin, roles.technician];\n\n if (self.isMobile) {\n self.mobileEvents = initData.calendarEvents.data;\n if (initData.calendarProjections) {\n self.mobileEvents = self.mobileEvents.concat(initData.calendarProjections.data);\n }\n self.counts = $filter('workOrderType')(self.mobileEvents);\n self.events = [[], []];\n } else {\n self.events = [angular.copy(initData.calendarEvents)];\n if (initData.calendarProjections) {\n self.events.push(angular.copy(initData.calendarProjections));\n }\n }\n\n self.filters = initData.filters;\n self.targetDate = initData.targetDate;\n self.targetDateCopy = new Date(angular.copy(self.targetDate));\n self.updatedEvent = {};\n self.isToday = moment(initData.targetDate).isSame(new Date(), 'day');\n\n self.filters.month = moment(self.targetDate).month() + 1;\n self.filters.year = moment(self.targetDate).year();\n self.filters.day = moment(self.targetDate).date();\n\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n self.assetHideCheckBox = true;\n self.filters.includeDescendants = true;\n }\n\n self.assetBrowseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n },\n 'asset-category': {\n filter: 'isLocation'\n }\n }\n };\n\n var maximumForwardMonth = 5;\n var lastMonthTarget = self.isMobile ? null : angular.copy(self.targetDate);\n var lastDayTarget = self.isMobile ? angular.copy(self.targetDate) : null;\n var ignoreWatcher = true;\n\n workOrderCalendarService.getDateRange(self.targetDate);\n\n var monthDifference = function (newTargetDate) {\n var yearDiff = moment(newTargetDate).year() - moment().year();\n return yearDiff * 12 + moment(newTargetDate).month() - moment().month(); // eslint-disable-line no-mixed-operators\n };\n\n self.monthLimit = monthDifference(self.targetDate) > maximumForwardMonth;\n\n self.setMonth = function (increment) {\n var newTargetDate = increment === 0 ? angular.copy(self.targetDate) : new Date(moment(self.targetDate).add(increment, 'months').date(1));\n\n if (moment(newTargetDate).isSame(new Date(), 'months') && !moment(self.targetDate).isSame(new Date(), 'months')) {\n newTargetDate = new Date();\n }\n\n if (lastMonthTarget && moment(lastMonthTarget).isSame(newTargetDate, 'months') && (self.events[0].length || self.events[1].length)) {\n return;\n }\n\n self.monthLimit = monthDifference(newTargetDate) > maximumForwardMonth;\n\n self.targetDate = newTargetDate;\n var dates = workOrderCalendarService.getDateRange(self.targetDate);\n self.filters.scheduledStartDateFrom = dates.startDate;\n self.filters.scheduledStartDateTo = dates.endDate;\n var promises = [];\n var projectionFilter = angular.copy(self.filters);\n if (moment(new Date()).isSame(new Date(self.filters.scheduledStartDateFrom), 'month') || moment(new Date()).isAfter(new Date(projectionFilter.scheduledStartDateFrom), 'month')) {\n projectionFilter.scheduledStartDateFrom = moment(new Date()).add(1, 'days').set('hour', 0).set('minute', 0).toISOString();\n }\n\n promises.push(workOrderCalendarService.getCalendarData('CalendarEventsEntity', self.filters).then(function (results) {\n self.events[0] = workOrderCalendarService.parseCalendarData(results, self.targetDate, 'secure.workOrderFormEdit');\n }));\n\n if ((self.filters.status.indexOf(workOrderEnums.status.newRequest) > -1 || self.filters.status.indexOf('all') > -1) && monthDifference(newTargetDate) > -1) {\n promises.push(workOrderCalendarService.getCalendarData('CalendarProjectionEntity', projectionFilter).then(function (results) {\n self.events[1] = workOrderCalendarService.parseCalendarData(results, self.targetDate);\n }));\n } else if (self.events[1]) {\n self.events[1] = [];\n }\n\n $q.all(promises).then(function () {\n var query = angular.copy(self.filters);\n query.month = moment(self.targetDate).month() + 1;\n query.year = moment(self.targetDate).year();\n query.day = moment(self.targetDate).date();\n self.filters.month = angular.copy(query.month);\n self.filters.year = angular.copy(query.year);\n self.filters.day = angular.copy(query.day);\n delete query.scheduledStartDateFrom;\n delete query.scheduledStartDateTo;\n delete query.pageSize;\n queryHelpers.updateState(query, queryDefaults);\n lastMonthTarget = angular.copy(self.targetDate);\n });\n };\n\n self.setDay = function (targetDate) {\n var newTargetDate = new Date(targetDate);\n var mobileEvents;\n var mobileProjections = [];\n self.monthLimit = monthDifference(newTargetDate) > maximumForwardMonth;\n\n if (lastDayTarget && moment(lastDayTarget).isSame(newTargetDate, 'days') && self.mobileEvents.length) {\n return;\n }\n\n self.isToday = moment(newTargetDate).isSame(new Date(), 'day');\n self.targetDate = newTargetDate;\n self.filters.scheduledStartDateFrom = moment(newTargetDate).hours(0).minutes(0).seconds(0).milliseconds(0).toISOString();\n self.filters.scheduledStartDateTo = moment(newTargetDate).hours(23).minutes(59).seconds(59).milliseconds(999).toISOString();\n var promises = [];\n\n var queryForProjections = (self.filters.status.indexOf(workOrderEnums.status.newRequest) > -1 || self.filters.status.indexOf('all') > -1) && moment(new Date()).isBefore(new Date(self.filters.scheduledStartDateFrom), 'day');\n\n promises.push(workOrderCalendarService.getCalendarData('CalendarEventsEntity', self.filters).then(function (results) {\n mobileEvents = results.data;\n }));\n\n if (queryForProjections) {\n promises.push(workOrderCalendarService.getCalendarData('CalendarProjectionEntity', self.filters).then(function (results) {\n mobileProjections = results.data;\n }));\n }\n\n $q.all(promises).then(function () {\n self.mobileEvents = angular.copy(mobileEvents);\n self.mobileEvents = self.mobileEvents.concat(mobileProjections);\n self.counts = $filter('workOrderType')(self.mobileEvents);\n var query = angular.copy(self.filters);\n query.month = moment(self.targetDate).month() + 1;\n query.year = moment(self.targetDate).year();\n query.day = moment(self.targetDate).date();\n self.filters.month = angular.copy(query.month);\n self.filters.year = angular.copy(query.year);\n self.filters.day = angular.copy(query.day);\n delete query.scheduledStartDateFrom;\n delete query.scheduledStartDateTo;\n delete query.pageSize;\n queryHelpers.updateState(query, queryDefaults);\n lastDayTarget = angular.copy(self.targetDate);\n });\n };\n\n self.dropFunction = function (event) {\n workOrderCalendarService.updateWorkOrder(event);\n };\n\n self.dayFunction = function (date, id) {\n var routeParams = angular.copy(self.filters);\n routeParams.year = date.year();\n routeParams.month = date.month() + 1;\n routeParams.day = date.date();\n routeParams.id = id;\n\n $state.go('secure.workOrderCalendar.day', routeParams);\n };\n\n self.isFilterApplied = function () {\n return workOrderCalendarService.isFilterApplied(self.filters);\n };\n\n $scope.$watch('workOrderCalendar.targetDateCopy', function (newVal) {\n if (ignoreWatcher) {\n ignoreWatcher = false;\n return;\n }\n\n if (self.isMobile) {\n self.setDay(newVal);\n } else {\n self.setMonth(0);\n }\n });\n\n $scope.$watch('workOrderCalendar.screenSize', function (newVal, oldVal) {\n if (angular.equals(newVal, oldVal)) {\n return;\n }\n\n var isMobile = newVal.breakpoint === responsiveBreakpoints.xs;\n\n if (isMobile === self.isMobile) {\n return;\n }\n\n self.isMobile = isMobile;\n\n if (self.isMobile) {\n self.targetDateCopy = angular.copy(self.targetDate);\n } else {\n self.setMonth(0);\n }\n }, true);\n\n $scope.$watch('workOrderCalendar.filters', function (newVal, oldVal) {\n var unchanged = angular.equals(newVal.purpose, oldVal.purpose);\n unchanged = unchanged && angular.equals(newVal.status, oldVal.status);\n unchanged = unchanged && angular.equals(newVal.businessAsset, oldVal.businessAsset);\n unchanged = unchanged && angular.equals(newVal.assignees, oldVal.assignees);\n unchanged = unchanged && angular.equals(newVal.unassigned, oldVal.unassigned);\n unchanged = unchanged && angular.equals(newVal.includeDescendants, oldVal.includeDescendants);\n unchanged = unchanged && angular.equals(newVal.workType, oldVal.workType);\n if (unchanged) {\n return;\n }\n\n lastDayTarget = null;\n lastMonthTarget = null;\n if (self.isMobile) {\n self.setDay(self.targetDate);\n } else {\n self.setMonth(0);\n }\n }, true);\n });\n\n'use strict';\n\nangular.module('workOrderCalendarDay', ['ui.router', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'workOrderCalendar']);\n\n'use strict';\n\nangular.module('workOrderCalendarDay')\n .config(function ($stateProvider, permission) {\n // secure. base route in dudeAuth\n $stateProvider\n .state('secure.workOrderCalendar.day', {\n url: 'day?year&month&day&status&assignees&unassigned&purpose&businessAsset&includeDescendants&id&workType',\n templateUrl: 'app/components/workOrderCalendarDay/workOrderCalendarDay.html',\n controller: 'WorkOrderCalendarDayController',\n controllerAs: 'workOrderCalendar',\n permissions: permission.calendarEvents.read,\n resolve: {\n initData: function ($q, $stateParams, moment, clientHelperService, responsiveBreakpoints, workOrderEnums, workOrderCalendarService, workOrderFilters) {\n var queryParams = $stateParams;\n var targetDate = new Date();\n\n queryParams.status = (queryParams.status || [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.onHold]);\n queryParams.includeDescendants = queryParams.businessAsset ? queryParams.includeDescendants === 'true' : true;\n\n if (queryParams.month && queryParams.year && queryParams.day) {\n targetDate = new Date(queryParams.month + '/' + queryParams.day + '/' + queryParams.year);\n }\n\n var filters = workOrderFilters.getFilters(queryParams);\n\n filters.scheduledStartDateFrom = moment(targetDate).hours(0).minutes(0).seconds(0).milliseconds(0).toISOString();\n filters.scheduledStartDateTo = moment(targetDate).hours(23).minutes(59).seconds(59).milliseconds(999).toISOString();\n\n return $q.all({\n filters: filters,\n calendarEvents: workOrderCalendarService.getCalendarData('CalendarEventsEntity', filters).then(function (results) {\n return results;\n }),\n calendarProjections: moment(targetDate).isSameOrAfter(new Date(), 'day') ? workOrderCalendarService.getCalendarData('CalendarProjectionEntity', filters).then(function (results) {\n return results;\n }) : null,\n targetDate: targetDate,\n id: queryParams.id\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('workOrderCalendarDay')\n .controller('WorkOrderCalendarDayController', function ($scope, $filter, $q, $translate, roles, moment, clientHelperService, responsiveBreakpoints, workOrderEnums, queryHelpers, marketizr, market, workOrderFilters, initData, workOrderCalendarService) {\n var self = this;\n\n self.clearFilters = function () {\n self.filters = workOrderFilters.getFilters({});\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n self.filters.includeDescendants = true;\n }\n };\n\n var queryDefaults = workOrderFilters.getFilters({});\n self.isMobilePhone = clientHelperService.isMobile();\n self.priority = workOrderEnums.priority;\n self.market = market;\n\n self.assigneeTitle = $translate.instant('workOrderCalendar.assignee');\n self.assigneeRoles = [roles.admin, roles.technician];\n\n self.mobileEvents = initData.calendarEvents.data;\n if (initData.calendarProjections) {\n self.mobileEvents = self.mobileEvents.concat(initData.calendarProjections.data);\n }\n\n self.counts = $filter('workOrderType')(self.mobileEvents);\n self.filters = initData.filters;\n self.targetDate = initData.targetDate;\n self.targetDateCopy = new Date(angular.copy(self.targetDate));\n self.updatedEvent = {};\n self.targetId = initData.id;\n self.isToday = moment(initData.targetDate).isSame(new Date(), 'day');\n\n self.filters.month = moment(self.targetDate).month() + 1;\n self.filters.year = moment(self.targetDate).year();\n self.filters.day = moment(self.targetDate).date();\n\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n self.assetHideCheckBox = true;\n self.filters.includeDescendants = true;\n }\n\n self.assetBrowseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n },\n 'asset-category': {\n filter: 'isLocation'\n }\n }\n };\n\n var ignoreWatcher = true;\n\n workOrderCalendarService.getDateRange(self.targetDate);\n\n self.maxDay = moment(new Date()).add(6, 'months').endOf('month');\n self.maxDayLimit = moment(self.targetDate).isSameOrAfter(self.maxDay, 'day');\n\n self.setDay = function (targetDate, filterChange) {\n var newTargetDate = new Date(targetDate);\n var mobileEvents;\n var mobileProjections = [];\n self.maxDayLimit = moment(self.targetDate).isSameOrAfter(self.maxDay, 'day');\n\n if (moment(self.targetDate).isSame(newTargetDate, 'days') && !filterChange) {\n return;\n }\n\n self.isToday = moment(newTargetDate).isSame(new Date(), 'day');\n self.targetDate = newTargetDate;\n self.filters.scheduledStartDateFrom = moment(newTargetDate).hours(0).minutes(0).seconds(0).milliseconds(0).toISOString();\n self.filters.scheduledStartDateTo = moment(newTargetDate).hours(23).minutes(59).seconds(59).milliseconds(999).toISOString();\n var promises = [];\n\n var queryForProjections = (self.filters.status.indexOf(workOrderEnums.status.newRequest) > -1 || self.filters.status.indexOf('all') > -1) && moment(new Date()).isBefore(new Date(self.filters.scheduledStartDateFrom), 'day');\n\n promises.push(workOrderCalendarService.getCalendarData('CalendarEventsEntity', self.filters).then(function (results) {\n mobileEvents = results.data;\n }));\n\n if (queryForProjections) {\n promises.push(workOrderCalendarService.getCalendarData('CalendarProjectionEntity', self.filters).then(function (results) {\n mobileProjections = results.data;\n }));\n }\n\n $q.all(promises).then(function () {\n self.mobileEvents = angular.copy(mobileEvents);\n self.mobileEvents = self.mobileEvents.concat(mobileProjections);\n self.counts = $filter('workOrderType')(self.mobileEvents);\n var query = angular.copy(self.filters);\n query.month = moment(self.targetDate).month() + 1;\n query.year = moment(self.targetDate).year();\n query.day = moment(self.targetDate).date();\n self.filters.month = angular.copy(query.month);\n self.filters.year = angular.copy(query.year);\n self.filters.day = angular.copy(query.day);\n delete query.scheduledStartDateFrom;\n delete query.scheduledStartDateTo;\n delete query.pageSize;\n queryHelpers.updateState(query, queryDefaults);\n });\n };\n\n self.isFilterApplied = function () {\n return workOrderCalendarService.isFilterApplied(self.filters);\n };\n\n self.updateDate = function (increment) {\n self.targetDateCopy = moment(self.targetDateCopy).add(increment, 'day');\n };\n\n $scope.$watch('workOrderCalendar.targetDateCopy', function (newVal) {\n if (ignoreWatcher) {\n ignoreWatcher = false;\n return;\n }\n\n self.setDay(newVal);\n });\n\n $scope.$watch('workOrderCalendar.filters', function (newVal, oldVal) {\n var unchanged = angular.equals(newVal.purpose, oldVal.purpose);\n unchanged = unchanged && angular.equals(newVal.status, oldVal.status);\n unchanged = unchanged && angular.equals(newVal.businessAsset, oldVal.businessAsset);\n unchanged = unchanged && angular.equals(newVal.assignees, oldVal.assignees);\n unchanged = unchanged && angular.equals(newVal.unassigned, oldVal.unassigned);\n unchanged = unchanged && angular.equals(newVal.includeDescendants, oldVal.includeDescendants);\n unchanged = unchanged && angular.equals(newVal.workType, oldVal.workType);\n if (unchanged) {\n return;\n }\n\n self.setDay(self.targetDate, true);\n }, true);\n });\n\n'use strict';\n\nangular.module('workOrderCalendar', ['ui.router', 'dudeControls', 'dudeControlsCalendar', 'dudeApi', 'dudeAuth', 'translate', 'workOrderQuickActions', 'maintenanceConstants']);\n\n'use strict';\n\nangular.module('workOrderCalendar')\n .filter('workOrderType', function () {\n return function (workOrders) {\n var typeCounts = {\n reactive: 0,\n planned: 0\n };\n workOrders = workOrders || [];\n workOrders.forEach(function (workOrder) {\n if (workOrder.workOrderType.toLowerCase() === 'reactive') {\n typeCounts.reactive++;\n } else {\n typeCounts.planned++;\n }\n });\n\n return typeCounts;\n };\n });\n\n/**\n * @ngdoc service\n * @name workOrderCalendar.workOrderCalendarService\n * @requires DudeApi\n * @requires dataHelperService\n * @requires workOrderFilters.workOrderFilters\n * @requires moment\n * @requires log\n * @requires $translate\n *\n * @description\n * Service for supporting the gathering and parsing of data for the work order calendar module\n *\n */\n\n'use strict';\n\nangular.module('workOrderCalendar')\n .factory('workOrderCalendarService', function ($translate, DudeApi, dataHelperService, moment, marketizr, market, log, workOrderFilters) {\n var workOrderCategories = {\n reactive: 'Reactive',\n pmGenerated: 'PM Generated',\n scheduled: 'Scheduled'\n };\n\n var calendarIcons = {\n reactive: 'fa-briefcase',\n scheduled: 'fa-refresh'\n };\n\n // The max number of weeks shown by the calendar\n var maxWeeks = 6;\n\n /**\n * @ngdoc method\n * @name getDateRange\n * @methodOf workOrderCalendar.workOrderCalendarService\n *\n * @description\n * Gets the start and end date of a visible month view of a calendar\n *\n * @param {date} date The target date of the month to use to find the start and end of the month\n * @returns {object} An object that contains the startDate and endDate to that defined the bounds of the visible month view\n */\n var getDateRange = function (date) {\n date = date || new Date();\n var startDate = moment(date).startOf('month').startOf('week');\n var endDate = moment(date).endOf('month').endOf('week');\n var weekDiff = moment(endDate).isoWeek() - moment(startDate).isoWeek();\n if (weekDiff < maxWeeks) {\n endDate = moment(endDate).add(7, 'days');\n }\n return {\n startDate: startDate.toISOString(),\n endDate: endDate.toISOString()\n };\n };\n\n var getFilters = function (query) {\n query.pageSize = 1000;\n query.scheduledStartDateFrom = query.scheduledStartDateFrom || moment().startOf('month').startOf('week').toISOString();\n query.scheduledStartDateTo = query.scheduledStartDateTo || moment().endOf('month').endOf('week').toISOString();\n var filters = workOrderFilters.toApiFilter(query);\n delete filters.orderBy;\n return filters;\n };\n\n /**\n * @ngdoc method\n * @name getCalendarData\n * @methodOf workOrderCalendar.workOrderCalendarService\n *\n * @description\n * Gets all of the calendar data from the Calendar Events Entity\n *\n * @param {object} entity The entity to query on.\n * @param {object} query The filters object to query with. This will get parsed internally to add calendar defaults\n * @returns {Promise} A promise that returns with all of the data returned in the page wrapper format\n */\n var getCalendarData = function (entity, query) {\n var filters = getFilters(query);\n return dataHelperService.queryAll(entity, filters);\n };\n\n /**\n * @ngdoc method\n * @name generateCalendarId\n * @methodOf workOrderCalendar.workOrderCalendarService\n *\n * @description\n * A function for generating a unique id for calendar events\n *\n * @param {object} data The object containing event data\n * @returns {string} id The id string to use\n */\n var generateCalendarId = function (data) {\n var id;\n if (data.workOrderId) {\n id = 'wo-' + data.workOrderId;\n } else {\n id = 'pm-' + data.pmScheduleId;\n id += data.businessAsset ? '-' + data.businessAsset.id : '';\n }\n return id;\n };\n\n /**\n * @ngdoc method\n * @name parseCalendarData\n * @methodOf workOrderCalendar.workOrderCalendarService\n *\n * @description\n * Parses an object containing a data array of work orders into a useable format for the event calendar component\n *\n * @param {object} workOrders The object containing the data array of work orders\n * @param {date} targetDate This date is used to determine whether events are inside or outside of the month when mapping them to the event calendar object. It defaults to today's date (optional)\n * @param {string} route The route for the calendar object\n * @returns {array} An array of event objects\n */\n var parseCalendarData = function (workOrders, targetDate) {\n targetDate = targetDate || new Date();\n\n return workOrders.data.map(function (data) {\n var calendarObject;\n var id = generateCalendarId(data);\n var title;\n var assetName = data.businessAsset !== null ? data.businessAsset.name : '';\n\n var classes = [data.priority.toLowerCase()];\n classes.push(data.displayId ? 'woid-' + data.displayId : 'pmid-' + data.pmScheduleId);\n classes.push(data.workOrderType.split(' ').join('').toLowerCase());\n\n var date = moment(new Date(data.scheduledStartDate)).hours(23).minutes(59).seconds(59).millisecond(0);\n var requestDate = moment(data.requestDate);\n\n // Full calendar needs both a start and end date when creating constraints for drag and drop, so creating one a couple years out\n var endDate = moment(date).add(2, 'y');\n if (date < moment(targetDate).startOf('month').toDate() || date > moment(targetDate).endOf('month').toDate()) {\n classes.push('other-month-event');\n }\n\n var priorityOrder = '1';\n switch (data.priority) {\n case 'High':\n priorityOrder = '2';\n break;\n case 'Medium':\n priorityOrder = '3';\n break;\n case 'Low':\n priorityOrder = '4';\n break;\n default:\n break;\n }\n\n if (data.workOrderId) {\n title = priorityOrder + data.workOrderId;\n } else {\n // the highest number a work order can be is 4, 5 forces pm's to the bottom.\n title = '5' + data.pmScheduleId + assetName;\n }\n\n calendarObject = {\n title: title,\n icon: data.workOrderType === workOrderCategories.reactive ? calendarIcons.reactive : calendarIcons.scheduled,\n startEditable: classes.indexOf('projected') === -1,\n assetName: assetName,\n description: marketizr.hasMarkets([market.k12, market.he, market.ips]) ? data.workType.name : data.eventDescription,\n workOrderId: data.workOrderId,\n start: date,\n pmScheduleId: data.pmScheduleId,\n priority: data.priority.toLowerCase(),\n id: id,\n className: classes,\n constraint: {\n start: requestDate,\n end: endDate\n }\n };\n\n return calendarObject;\n });\n };\n\n /**\n * @ngdoc method\n * @name updateWorkOrder\n * @methodOf workOrderCalendar.workOrderCalendarService\n *\n * @description\n * A function for handling the update of a work order post drag and drop\n *\n * @param {object} event The object containing event data\n */\n var updateWorkOrder = function (event) {\n if (event.id) {\n DudeApi.WorkOrderEntity.get({ id: event.workOrderId }).$promise.then(function (workOrder) {\n var newDate = new Date(event.start);\n var dayChange = Math.ceil(moment(workOrder.scheduledStartDate).hours(0).minutes(0).diff(moment(newDate).hours(0).minutes(0), 'days', true));\n\n if (dayChange === 0) {\n return;\n }\n\n if (workOrder.dueDateTime) {\n workOrder.dueDateTime = moment(workOrder.dueDateTime).subtract(dayChange, 'days').hours(23).minutes(59).seconds(59).toISOString();\n }\n\n workOrder.scheduledStartDate = moment(new Date(event.start)).hours(23).minutes(59).seconds(59).millisecond(0).toISOString();\n workOrder.$update({ id: workOrder.id }).then(function () {\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderForm.notificationTitle'),\n message: $translate.instant('workOrderForm.notification')\n });\n });\n });\n }\n };\n\n /**\n * @ngdoc method\n * @name isFilterApplied\n * @methodOf workOrderCalendar.workOrderCalendarService\n *\n * @description\n * Checks against relevant values to see if a calendar filter is applied\n *\n * @param {object} filters The object containing the current filters\n * @returns {Boolean} A boolean stating whether or not filters are applied\n */\n var isFilterApplied = function (filters) {\n var cloned = angular.copy(filters);\n cloned.status = cloned.status === 'all' || cloned.status[0] === 'all' ? [] : cloned.status;\n cloned.scheduledStartDateFrom = null;\n cloned.scheduledStartDateTo = null;\n var defaultValue = workOrderFilters.getFilters({});\n var equalValue = angular.equals(cloned.status, defaultValue.status);\n equalValue = equalValue && angular.equals(cloned.assignees, defaultValue.assignees);\n equalValue = equalValue && angular.equals(cloned.purpose, defaultValue.purpose);\n equalValue = equalValue && angular.equals(cloned.businessAsset, defaultValue.businessAsset);\n return !equalValue;\n };\n\n return {\n getCalendarData: getCalendarData,\n parseCalendarData: parseCalendarData,\n generateCalendarId: generateCalendarId,\n getDateRange: getDateRange,\n updateWorkOrder: updateWorkOrder,\n isFilterApplied: isFilterApplied\n };\n });\n\n'use strict';\n\nangular.module('workOrderCalendar')\n .config(function ($stateProvider) {\n $stateProvider\n .state('secure.workOrderCalendar',\n {\n abstract: true,\n url: 'workOrderCalendar/',\n template: '
',\n controllerAs: 'workOrderCalendar'\n });\n });\n\n/**\n * @ngdoc directive\n * @name workOrderCalendar.work-order-calendar-navigation\n * @description\n *\n * Displays the navigation tabs for the month and day\n *\n * @param {object} filters the filter object to pass through on route\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderCalendar')\n .component('workOrderCalendarNavigation', {\n bindings: {\n filters: '='\n },\n templateUrl: 'app/components/workOrderCalendar/calendarNavigation.html',\n controller: function ($state) {\n var self = this;\n self.isActiveRoute = function (parameter) {\n return $state.current.url.indexOf(parameter) === 0;\n };\n },\n controllerAs: 'calendarNavigation'\n });\n\n/**\n * @ngdoc directive\n * @name workOrderCalendar.mobile-calendar\n * @restrict E\n * @description\n *\n * Renders a mobile day view of the calendar\n *\n * @param {array} events The array of events to render\n * @param {string} targetId The target id of an event to highlight\n * @param {date} targetDate The date displayed\n *\n * \n */\n\n'use strict';\n\nangular.module('workOrderCalendar')\n .component('calendarDayView', {\n bindings: {\n events: '=',\n targetId: '=?',\n targetDate: '=?'\n },\n templateUrl: 'app/components/workOrderCalendar/calendarDayView.html',\n controller: function ($timeout, $scope, $document, $state, DudeApi, moment, log, workOrderEnums, $translate, workOrderCalendarService, workOrderQuickActionsService) {\n var self = this;\n\n var quickAssigneeWatcher;\n var quickScheduleWatcher;\n\n var quickUpdates = {\n assignee: 'UpdateAssignee',\n scheduled: 'UpdateSchedule'\n };\n\n var lastQuickActionIndex;\n var lastQuickActionName;\n\n $scope.$watchCollection('calendarDayView.events', function () {\n self.workOrders = [];\n self.projections = [];\n self.events.forEach(function (event) {\n if (event.workOrderId) {\n self.workOrders.push(event);\n } else {\n self.projections.push(event);\n }\n });\n });\n\n self.compareIds = function (event) {\n var eventId = workOrderCalendarService.generateCalendarId(event);\n return eventId === self.targetId;\n };\n\n if (self.targetId) {\n $timeout(function () {\n var targetElement = angular.element('.selected-day')[0];\n $document.scrollToElement(targetElement, 150);\n });\n }\n\n $timeout(function () {\n self.targetId = null;\n }, 3000);\n\n self.status = workOrderEnums.status;\n self.priority = workOrderEnums.priority;\n\n self.printWorkOrder = function (id) {\n workOrderQuickActionsService.print(id);\n };\n\n self.edit = function (event) {\n if (event.workOrderId) {\n $state.go('secure.workOrderFormEdit', { id: event.workOrderId });\n } else {\n DudeApi.PmScheduleEntity.get({ id: event.pmScheduleId }).$promise.then(function (result) {\n $state.go('secure.pmScheduleEdit', {\n id: result.workOrderTemplateId\n });\n });\n }\n };\n\n var updateWorkOrder = function (workOrder, event) {\n workOrder.$update({ id: workOrder.id }).then(function () {\n switch (lastQuickActionName) {\n case quickUpdates.assignee:\n event.quickActionsUpdateAssignee = true;\n break;\n case quickUpdates.scheduled:\n event.quickActionsUpdateSchedule = true;\n break;\n default:\n break;\n }\n\n log.notify({\n type: 'success',\n title: $translate.instant('workOrderForm.notificationTitle'),\n message: $translate.instant('workOrderForm.notification')\n });\n });\n };\n\n self.closeLastQuickAction = function () {\n if (lastQuickActionIndex !== null && lastQuickActionName !== null) {\n switch (lastQuickActionName) {\n case quickUpdates.assignee: {\n quickAssigneeWatcher();\n self.workOrders[lastQuickActionIndex].quickActionsUpdateAssignee = false;\n delete self.workOrders[lastQuickActionIndex].assigneesCopy;\n break;\n }\n case quickUpdates.scheduled: {\n quickScheduleWatcher();\n var event = self.workOrders[lastQuickActionIndex];\n event.quickActionsUpdateSchedule = false;\n break;\n }\n default:\n break;\n }\n }\n lastQuickActionIndex = null;\n lastQuickActionName = null;\n };\n\n self.updateAssignees = function (index) {\n var event = self.workOrders[index];\n event.quickActionsUpdateAssignee = true;\n var workOrder = DudeApi.WorkOrderEntity.get({ id: event.workOrderId });\n\n self.closeLastQuickAction();\n\n if (event.quickActionsUpdateAssignee) {\n lastQuickActionIndex = index;\n lastQuickActionName = quickUpdates.assignee;\n\n quickAssigneeWatcher = $scope.$watchCollection(function () {\n return event.assignees;\n }, function (newVal, oldVal) {\n if (angular.equals(newVal, oldVal)) {\n return;\n }\n\n workOrder.assignees = angular.copy(event.assignees);\n updateWorkOrder(workOrder, event);\n }, true);\n } else {\n lastQuickActionIndex = null;\n lastQuickActionName = null;\n }\n };\n\n self.updateSchedule = function (index) {\n var event = self.workOrders[index];\n event.quickActionsUpdateSchedule = true;\n var workOrder = DudeApi.WorkOrderEntity.get({ id: event.workOrderId });\n\n self.closeLastQuickAction();\n\n if (event.quickActionsUpdateSchedule) {\n lastQuickActionIndex = index;\n lastQuickActionName = quickUpdates.scheduled;\n\n quickScheduleWatcher = $scope.$watch(function () {\n return event;\n }, function (newVal, oldVal) {\n var oldSchedStartDate;\n var newSchedStartDate;\n var oldDueDate;\n var newDueDate;\n\n oldSchedStartDate = oldVal.scheduledStartDate === null ? oldVal.scheduledStartDate : moment(oldVal.scheduledStartDate).format('YYYY-MM-DD');\n newSchedStartDate = newVal.scheduledStartDate === null ? newVal.scheduledStartDate : moment(newVal.scheduledStartDate).format('YYYY-MM-DD');\n oldDueDate = oldVal.dueDate === null ? oldVal.dueDateTime : moment(oldVal.dueDateTime).format('YYYY-MM-DD');\n newDueDate = newVal.dueDate === null ? newVal.dueDateTime : moment(newVal.dueDateTime).format('YYYY-MM-DD');\n\n if ((oldSchedStartDate !== newSchedStartDate) || (oldDueDate !== newDueDate)) {\n workOrder.scheduledStartDate = angular.copy(event.scheduledStartDate);\n event.faded = !moment(event.scheduledStartDate).isSame(self.targetDate, 'day');\n workOrder.dueDateTime = angular.copy(event.dueDate);\n updateWorkOrder(workOrder, event);\n }\n }, true);\n } else {\n lastQuickActionIndex = null;\n lastQuickActionName = null;\n }\n };\n },\n controllerAs: 'calendarDayView'\n });\n\n/**\n * @ngdoc service\n * @name webLinkSection.webLinkSectionService\n * @requires DudeApi\n *\n * @description\n * Service for supporting the web link section\n *\n * @requires DudeApi\n *\n */\n\n'use strict';\n\nangular.module('webLinkSection')\n .service('webLinkSectionService', function (DudeApi) {\n /**\n * @ngdoc method\n * @name getWorkOrderWebLinks\n * @methodOf webLinkSection.webLinkSectionService\n *\n * @description Gets the web links from the back end\n *\n * @param {int} id The id of the entity\n * @param {int} objectTypeId for the entity\n */\n var getWebLinks = function (id, objectTypeId) {\n // 1 is the ID for a weblink WorkOrder object type. It will be 1 across all environments.\n return DudeApi.WebLinksEntity.query({ objectId: id, objectTypeId: objectTypeId }).$promise;\n };\n\n return {\n getWebLinks: getWebLinks\n };\n });\n\n/**\n * @ngdoc directive\n * @name webLinkSection.webLinkSection\n * @restrict E\n * @description\n *\n * Displays div containing link\n *\n * @param {Array} links the array of links\n * @param {Array} spies array of objects with properties containing the id and name of the anchors to be updated from this element\n * @param {int} spyPosition the position of the scroll spy\n * @param {int} objectId The id of the entity the user is currently editing. Must be passed through\n * for non-new entities, as it is used to determine if the entity is new. (Optional)\n * @param {string} entity The type of entity you are retrieving links for i.e workOrder, businessAsset, or pmSchedule\n *\n */\n\n'use strict';\n\nangular.module('webLinkSection')\n .component('webLinkSection', {\n templateUrl: 'app/components/webLinkSection/webLinkSection.html',\n bindings: {\n links: '=',\n spies: '=',\n spyPosition: '<',\n objectId: ' 0 ? self.links : [];\n }\n };\n });\n\n'use strict';\n\nangular.module('webLinkSection')\n .constant('webLinkObjectTypes', {\n workOrder: 'workOrder',\n businessAsset: 'businessAsset'\n });\n\n'use strict';\n\nangular.module('webLinkSection')\n .constant('webLinkObjectTypeIds', {\n workOrder: 1,\n businessAsset: 2\n });\n\n'use strict';\n\nangular.module('webLinkSection')\n .controller('DeleteConfirmModalController', function ($uibModalInstance) {\n var self = this;\n\n self.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n self.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n/**\n * @ngdoc directive\n * @name webLinkSection.webLinkCard\n * @restrict E\n * @description\n *\n * Creates a web link card that displays a link and its thumbnail.\n *\n * @param {object} link The link in string form.\n * @param {function} openPanel The function used to open the webLinkSlidingPanel.\n * @param {function} deleteLink The function used to delete the link.\n *\n * Usage: \n */\n\n'use strict';\n\nangular.module('webLinkSection')\n .component('webLinkCard', {\n templateUrl: 'app/components/webLinkCard/webLinkCard.html',\n bindings: {\n link: '<',\n openPanel: '&',\n deleteLink: '&'\n },\n controller: 'WebLinkCardController',\n controllerAs: 'webLinkCard'\n })\n .controller('WebLinkCardController', function () {\n var self = this;\n\n var setListDescription = function () {\n if (self.link && self.link.description && self.link.description.length > 300) {\n self.listDescription = self.link.description.substr(0, 300) + '...';\n } else if (self.link && self.link.description) {\n self.listDescription = self.link.description;\n } else {\n self.listDescription = null;\n }\n };\n\n self.$onInit = function () {\n setListDescription();\n };\n });\n\n'use strict';\n\nangular.module('userList', ['ui.router', 'dudeAuth', 'dudeControls', 'dudeApi', 'translate', 'filterHelpers', 'userForm']);\n\n'use strict';\n\nangular.module('userList')\n .factory('userListFilterService', function (pagingHelpers) {\n var getFilters = function (params) {\n var filters = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'FirstName asc,LastName asc',\n q: params.q || null,\n roles: params.roles || null,\n isEnabled: params.isEnabled || null,\n products: params.products || null,\n notInProducts: params.notInProducts || null\n };\n return filters;\n };\n\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter\n };\n });\n\n'use strict';\n\nangular.module('userList')\n .service('userListService', function (DudeApi, pagingHelpers, userListFilterService, usersTypeaheadQuery) {\n var products = usersTypeaheadQuery.defaultQuery().products;\n\n var getUsers = function (query) {\n var filters = userListFilterService.toApiFilter(query);\n return DudeApi.UserEntity.query(filters);\n };\n\n var getListData = function (query) {\n query.products = products;\n return getUsers(query);\n };\n\n var getModalData = function (query) {\n query.notInProducts = products;\n return getUsers(query);\n };\n\n return {\n getListData: getListData,\n getModalData: getModalData\n };\n });\n\n'use strict';\n\nangular.module('userList')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.userList', {\n url: 'users?roles&isEnabled&q&pageSize&page&orderBy',\n templateUrl: 'app/components/userList/userList.html',\n controller: 'UserListController',\n controllerAs: 'userList',\n permissions: [permission.users.create, permission.users.update],\n resolve: {\n initData: function ($stateParams, $q, userListService, userListFilterService) {\n var queryParams = $stateParams;\n var filters = userListFilterService.getFilters(queryParams);\n\n return $q.all({\n initResponse: userListService.getListData(filters).$promise,\n imports: userListService.getModalData({}).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('userList')\n .controller('UserListController', function ($scope, $state, $uibModal, $translate, initData, userListService, userListFilterService, queryHelpers, orderByHelpers) {\n var self = this;\n\n var queryDefaults = userListFilterService.getFilters({});\n var pageChanging = false;\n\n // view model\n self.listData = initData.initResponse.data;\n self.importList = initData.imports;\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.totalCount = initData.initResponse.total;\n\n self.roles = [\n {\n value: '',\n name: $translate.instant('filterRole.roles.all')\n },\n {\n value: '1',\n name: $translate.instant('filterRole.roles.admin')\n },\n {\n value: '2',\n name: $translate.instant('filterRole.roles.tech')\n },\n {\n value: '5',\n name: $translate.instant('filterRole.roles.requester')\n }\n ];\n\n self.importUsers = function () {\n $uibModal.open({\n templateUrl: 'app/components/userList/importUserModal.html',\n controller: 'ImportUserModalController',\n size: 'md',\n backdrop: 'static',\n resolve: {\n users: function () {\n return self.importList;\n }\n }\n });\n };\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (angular.equals(oldVal, newVal)) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n newVal.page = 1;\n }\n\n pageChanging = false;\n\n userListService.getListData(newVal).$promise.then(setData);\n\n queryHelpers.updateState(newVal, queryDefaults);\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.roles = cloned.roles !== '' ? cloned.roles : null;\n cloned.isEnabled = cloned.isEnabled !== '' ? cloned.isEnabled : null;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, userListFilterService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (items) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, items);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.editUser = function (id) {\n $state.go('secure.userEdit', { id: id });\n };\n\n self.clearFilters = function () {\n self.filters = userListFilterService.getFilters({});\n };\n\n $scope.$watch('userList.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('userList')\n .controller('ImportUserModalController', function ($uibModalInstance, $scope, $state, userListService, userListFilterService, users) {\n $scope.deleteModal = false;\n $scope.users = users;\n $scope.filters = userListFilterService.getFilters({});\n\n $scope.pageChanged = function () {\n userListService.getModalData($scope.filters).$promise.then(function (results) {\n $scope.users = results;\n });\n };\n\n $scope.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.importUser = function (user) {\n $uibModalInstance.dismiss('cancel');\n $state.go('secure.userImport', { id: user.id });\n };\n });\n\n'use strict';\n\nangular.module('userForm', ['ui.router', 'dudeAuth', 'dudeControls', 'dudeApi', 'translate', 'dudeLog']);\n\n'use strict';\n\nangular.module('userForm')\n .service('userRoleService', function ($translate) {\n // set up requester information\n var REQUESTER_ID = 5;\n\n var roleTypes = [{\n id: 1,\n roleName: $translate.instant('userForm.roles.admin')\n }, {\n id: 2,\n roleName: $translate.instant('userForm.roles.tech')\n }, {\n id: REQUESTER_ID,\n roleName: $translate.instant('userForm.roles.requester')\n }];\n\n var setRole = function (user) {\n if (!user.id || user.roles.length < 1) {\n user.roles = [\n roleTypes[1]\n ];\n }\n };\n\n return {\n roleTypes: roleTypes,\n setRole: setRole,\n requesterId: REQUESTER_ID\n };\n });\n\n'use strict';\n\nangular.module('userForm')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.userCreate', {\n url: 'users/new',\n templateUrl: 'app/components/userForm/userForm.html',\n controller: 'UserFormController',\n controllerAs: 'userForm',\n permissions: [permission.users.create],\n resolve: {\n user: function (DudeApi) {\n return new DudeApi.UserEntity({});\n },\n myProfile: function () {\n return false;\n }\n }\n })\n .state('secure.userMe', {\n url: 'users/me',\n templateUrl: 'app/components/userForm/userForm.html',\n controller: 'UserFormController',\n controllerAs: 'userForm',\n resolve: {\n user: function (DudeApi) {\n return DudeApi.MeEntity.get().$promise;\n },\n myProfile: function () {\n return true;\n }\n }\n })\n .state('secure.userEdit', {\n url: 'users/:id',\n templateUrl: 'app/components/userForm/userForm.html',\n controller: 'UserFormController',\n controllerAs: 'userForm',\n permissions: [permission.users.update],\n resolve: {\n user: function ($stateParams, DudeApi) {\n return DudeApi.UserEntity.get({ id: $stateParams.id }).$promise;\n },\n myProfile: function () {\n return false;\n }\n }\n })\n .state('secure.userImport', {\n url: 'users/import/:id',\n templateUrl: 'app/components/userForm/userForm.html',\n controller: 'UserFormController',\n controllerAs: 'userForm',\n permissions: [permission.users.update],\n resolve: {\n user: function ($stateParams, DudeApi) {\n return DudeApi.UserEntity.get({ id: $stateParams.id }).$promise;\n },\n myProfile: function () {\n return false;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('userForm')\n .controller('UserFormController', function ($scope, $filter, $state, DudeApi, $translate, log, roleHelpers, user, myProfile, permissionsHelper, userRoleService, emailRegex, userContext, pmAssociationsService) {\n var self = this;\n self.user = user;\n self.emailRegex = emailRegex;\n self.activationSent = false;\n self.myProfile = myProfile;\n self.editUserRole = permissionsHelper.userAllowed('Users-Create');\n self.isCsc = user.roles && user.roles.length ? user.roles[0].roleName === roleHelpers.roles.CSC : false;\n // value needs to be flipped so if isEnabled is true, then the checkbox is not checked\n self.disableLogin = user.id ? !user.isEnabled : false;\n self.myId = userContext.user.id === user.id;\n var badEmails = [];\n var messageTitle = $translate.instant('userForm.notify.success.saveTitle');\n var messagePrefix = $translate.instant('userForm.notify.success.saveMessage');\n\n self.title = function () {\n if ($state.current.name === 'secure.userImport' || !user.id) {\n return $translate.instant('userForm.createTitle');\n } else if (self.myProfile) {\n return $translate.instant('userForm.myProfile');\n }\n return $translate.instant('userForm.editTitle');\n };\n\n // set up requester information\n self.requester = false;\n\n self.roleTypes = userRoleService.roleTypes;\n\n var defaultPhoneNumber = function () {\n return { id: '', type: 1, number: '', extension: '' };\n };\n\n if (self.user.id && !myProfile) {\n pmAssociationsService.isAssociated({ assignees: self.user.id }).then(function (result) {\n self.associations = result.total;\n self.associationsValidation = pmAssociationsService.validationMessage($translate.instant('userForm.user'), self.associations);\n });\n }\n\n self.saveUser = function () {\n var clone = angular.copy(user);\n\n clone.phones = $filter('filter')(clone.phones, function (phone) {\n return self.phoneHasValue(phone);\n });\n\n // flips the value in the checkbox so when the box is checked, isEnabled is false\n clone.isEnabled = !self.disableLogin;\n\n var promise = clone.id ? clone.$update({ id: clone.id }) : clone.$save();\n\n promise.then(function () {\n log.notify({\n title: messageTitle,\n type: 'success',\n message: clone.firstName + ' ' + clone.lastName + messagePrefix\n });\n if (!myProfile) {\n $state.go('secure.userList');\n }\n }, function (response) {\n var isEmailPlatformUnique = true;\n for (var i = 0; i < response.data.validationErrors.length; i++) {\n if (response.data.validationErrors[i].field === 'email' && response.data.validationErrors[i].code === 'V1005') {\n // if validation message == V1005 then email already exists\n badEmails.push(user.email);\n isEmailPlatformUnique = false;\n break;\n }\n }\n\n $scope.form.email.$setValidity('uniqueEmail', isEmailPlatformUnique);\n });\n };\n\n self.resendActivation = function () {\n DudeApi.ResendActivationEntity.save({ id: user.id }, { userId: user.id }).$promise\n .then(function () {\n log.notify({\n title: 'Sent Successfully',\n type: 'success',\n message: 'Activation link sent to ' + user.firstName + ' ' + user.lastName\n });\n });\n self.activationSent = true;\n };\n\n self.addPhone = function () {\n user.phones.push(defaultPhoneNumber());\n };\n\n self.removePhone = function (index) {\n if (user.phones.length > 1) {\n user.phones.splice(index, 1);\n } else {\n user.phones[index] = defaultPhoneNumber();\n }\n };\n\n self.phoneHasValue = function (phone) {\n return phone ? (phone.number || phone.extension) : false;\n };\n\n var init = function () {\n user.phones = !user.phones || user.phones.length === 0 ? user.phones = [defaultPhoneNumber()] : user.phones;\n\n userRoleService.setRole(user);\n\n // The returned roles must be an array so when creating a user it is necessary to create this array and stuff the default role id inside an object\n if (!user.id) {\n user.hourlyRate = 0;\n }\n };\n\n init();\n\n $scope.$watch('userForm.user.email', function (newVal, oldVal) {\n if (newVal === oldVal || !badEmails.length) {\n return;\n }\n\n var validity = badEmails.indexOf(newVal) < 0;\n $scope.form.email.$setValidity('uniqueEmail', validity);\n });\n\n $scope.$watchCollection('userForm.user.roles', function (newVal) {\n if (newVal.length && newVal[0].id === userRoleService.requesterId) {\n self.user.hourlyRate = '0.00';\n self.requester = true;\n } else {\n self.requester = false;\n }\n });\n });\n\n\n'use strict';\n\nangular.module('tradeList', ['ui.router', 'dudeControls', 'dudeApi', 'translate', 'dudeLog']);\n\n'use strict';\n\nangular.module('tradeList')\n .factory('tradeListFilterService', function ($location, pagingHelpers) {\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Name asc',\n q: params.q || null,\n isActive: params.isActive || null\n };\n\n return currentFilter;\n };\n\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter\n };\n });\n\n'use strict';\n\nangular.module('tradeList')\n .service('tradeListService', function (DudeApi, tradeListFilterService) {\n var getListData = function (query) {\n var filters = tradeListFilterService.toApiFilter(query);\n return DudeApi.TradeEntity.query(filters);\n };\n\n return {\n getListData: getListData\n };\n });\n\n'use strict';\n\nangular.module('tradeList')\n .config(function ($stateProvider, permission, market) {\n $stateProvider\n .state('secure.tradeList', {\n url: 'trades?page&pageSize&q&isActive',\n templateUrl: 'app/components/tradeList/tradeList.html',\n controller: 'TradeListController',\n controllerAs: 'tradeList',\n permissions: [permission.trades.create, permission.trades.update, permission.trades.delete],\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n initData: function ($q, $stateParams, tradeListService, tradeListFilterService) {\n var queryParams = $stateParams;\n var filters = tradeListFilterService.getFilters(queryParams);\n\n return $q.all({\n initResponse: tradeListService.getListData(filters).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('tradeList')\n .controller('TradeListController', function ($scope, $state, tradeListService, tradeListFilterService, queryHelpers, orderByHelpers, initData) {\n var self = this;\n var queryDefaults = tradeListFilterService.getFilters({});\n var pageChanging = false;\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n tradeListService.getListData(self.filters).$promise.then(setData);\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n // view model\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.totalCount = initData.initResponse.total;\n self.listData = initData.initResponse.data;\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.isActive = cloned.isActive !== '' ? cloned.isActive : null;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, tradeListFilterService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.editTrade = function (id) {\n $state.go('secure.tradeEdit', {\n id: id\n });\n };\n\n self.clearFilters = function () {\n self.filters = tradeListFilterService.getFilters({});\n };\n\n $scope.$watch('tradeList.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('tradeForm', ['ui.router', 'ui.bootstrap', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'helpers', 'dudeLog']);\n\n'use strict';\n\nangular.module('tradeForm')\n .config(function ($stateProvider, permission, market) {\n $stateProvider\n .state('secure.tradeCreate', {\n url: 'trades/new',\n templateUrl: 'app/components/tradeForm/tradeForm.html',\n controller: 'TradeFormController',\n controllerAs: 'tradeForm',\n permissions: permission.trades.create,\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n trade: function (DudeApi) {\n return new DudeApi.TradeEntity({ isActive: true });\n },\n workOrderCount: function () {\n return 0;\n },\n workOrderTemplateCount: function () {\n return 0;\n }\n }\n })\n .state('secure.tradeEdit', {\n url: 'trades/:id',\n templateUrl: 'app/components/tradeForm/tradeForm.html',\n controller: 'TradeFormController',\n controllerAs: 'tradeForm',\n permissions: permission.trades.update,\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n trade: function ($stateParams, DudeApi) {\n return DudeApi.TradeEntity.get({ id: $stateParams.id }).$promise;\n },\n workOrderCount: function ($stateParams, DudeApi, tradeDeleteFilterService) {\n var filter = tradeDeleteFilterService.toApiFilter({ id: $stateParams.id });\n return DudeApi.WorkOrderEntity.query(filter).$promise;\n },\n workOrderTemplateCount: function ($stateParams, DudeApi, tradeDeleteFilterService) {\n var filter = tradeDeleteFilterService.toApiFilter({ id: $stateParams.id });\n return DudeApi.WorkOrderTemplateEntity.query(filter).$promise;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('tradeForm')\n .controller('TradeFormController', function ($state, log, $uibModal, $translate, trade, workOrderCount, workOrderTemplateCount, pmAssociationsService) {\n var self = this;\n\n self.trade = trade;\n\n if (self.trade.id) {\n pmAssociationsService.isAssociated({ trade: self.trade.id }).then(function (result) {\n self.associations = result.total;\n self.associationsValidation = pmAssociationsService.validationMessage($translate.instant('tradeForm.trade'), self.associations);\n });\n }\n\n // private\n var showDeleteMessage = function () {\n log.notify({\n title: $translate.instant('tradeForm.notify.delete.title'),\n type: 'success',\n message: $translate.instant('tradeForm.notify.delete.message')\n });\n };\n\n var confirmDelete = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/tradeForm/tradeDeleteConfirmModal.html',\n controller: 'TradeDeleteModalController',\n size: 'sm',\n backdrop: 'static',\n resolve: {\n workOrderCount: function () {\n return '';\n },\n workOrderTemplateCount: function () {\n return '';\n }\n }\n });\n\n modalInstance.result.then(function () {\n trade.$delete({ id: trade.id }).then(function () {\n showDeleteMessage();\n $state.go('secure.tradeList');\n });\n });\n };\n\n var deleteWarning = function (count, templateCount) {\n $uibModal.open({\n templateUrl: 'app/components/tradeForm/tradeDeleteWarningModal.html',\n controller: 'TradeDeleteModalController',\n size: 'md',\n backdrop: 'static',\n resolve: {\n workOrderCount: function () {\n return count;\n },\n workOrderTemplateCount: function () {\n return templateCount;\n }\n }\n });\n };\n\n // public\n self.deleteTrade = function () {\n if (workOrderCount.total === 0 && workOrderTemplateCount.total === 0) {\n confirmDelete();\n } else {\n deleteWarning(workOrderCount.total, workOrderTemplateCount.total);\n }\n };\n\n self.saveTrade = function () {\n var promise = trade.id ? trade.$update({ id: trade.id }) : trade.$save();\n\n promise.then(function () {\n log.notify({\n title: $translate.instant('tradeForm.notify.success.title'),\n type: 'success',\n message: $translate.instant('tradeForm.notify.success.message')\n });\n\n $state.go('secure.tradeList');\n });\n };\n });\n\n\n'use strict';\n\nangular.module('tradeForm')\n .controller('TradeDeleteModalController', function ($uibModalInstance, $scope, workOrderCount, workOrderTemplateCount) {\n $scope.workOrderCount = workOrderCount;\n $scope.workOrderTemplateCount = workOrderTemplateCount;\n\n $scope.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n'use strict';\n\nangular.module('tradeForm')\n .service('tradeDeleteFilterService', function () {\n var toApiFilter = function (filter) {\n var filters = {\n trade: filter.id\n };\n return filters;\n };\n\n return {\n toApiFilter: toApiFilter\n };\n });\n\n'use strict';\n\nangular.module('taskBook', ['translate', 'dudeApi', 'dudeControls', 'dudeLog']);\n\n'use strict';\n\nangular.module('taskBook')\n .factory('taskBookService', function (DudeApi) {\n var addTasks = function (array, numberOfTasksToAdd) {\n if (!angular.isArray(array)) {\n array = [];\n }\n\n for (var i = 0; i < numberOfTasksToAdd; i++) {\n array.push(new DudeApi.TaskBookTaskEntity({ status: 'Incomplete' }));\n }\n return array;\n };\n\n var removeTask = function (array, index) {\n array.splice(index, 1);\n return array;\n };\n\n var removeEmptyTasks = function (array) {\n for (var i = array.length - 1; i >= 0; i--) {\n var item = array[i];\n if (!item.title && !item.procedure) {\n array.splice(i, 1);\n }\n }\n };\n\n return {\n addTasks: addTasks,\n removeTask: removeTask,\n removeEmptyTasks: removeEmptyTasks\n };\n });\n\n/**\n * @ngdoc directive\n * @name pmScheduleTasksForm.task-book\n * @restrict E\n * @description\n *\n * Creates a repeatable list for showing and editing task and procedures for a task book.\n *\n * @param {object} taskBook The task book object. Must include an array of tasks\n * @param {object} tasksToDelete An array of tasks that were removed. This array is used by the calling service to call the api DELETE\n * @param {number} seedTasks Default: 5 Automatically start with blank tasks\n * @param {string} mode Default create Mode to set the view to\n * @param {boolean} hideButton Hides the add button\n *\n * Usage: \n */\n\n'use strict';\n\nangular.module('taskBook')\n .component('taskBook', {\n templateUrl: 'app/components/taskbook/taskBook.html',\n bindings: {\n taskBook: '=',\n tasksToDelete: '=?',\n mode: '=?',\n focusFirst: '=?',\n hideButton: '\n *\n */\n\n'use strict';\n\nangular.module('taskBookSelect')\n .directive('taskBookSelect', function (DudeApi, popBoxService, taskBookService) {\n return {\n restrict: 'E',\n templateUrl: 'app/components/taskBookSelect/taskBookSelect.html',\n scope: {\n taskBook: '=',\n linkId: '=',\n tasksToDelete: '=?',\n showLink: '=?'\n },\n link: function (scope) {\n scope.ACTIONS = {\n COPY: 'copy',\n LINK: 'link',\n REPLACE: 'replace',\n ADD: 'add'\n };\n var popBoxName = 'pm-schedule-tasks-pop-box';\n scope.tasksToDelete = scope.tasksToDelete || [];\n\n var isPopBoxOpen = false;\n\n var linkTaskBook = function (taskBook, tasks) {\n scope.linkId = scope.popbox.taskBookTypeahead.id; // Set this id to a var so we can save it to the schedule later\n scope.taskBook.isMaster = taskBook.isMaster; // should always be true\n scope.taskBook.title = taskBook.title;\n scope.taskBook.tasks = tasks.data;\n taskBookService.removeEmptyTasks(scope.taskBook.tasks);\n };\n\n var setDefaults = function () {\n // defaults\n scope.popbox = {\n taskBookTypeahead: null,\n action: scope.ACTIONS.COPY,\n copy: {\n action: scope.ACTIONS.ADD\n },\n showLink: angular.isUndefined(scope.showLink) || (scope.showLink === 'true')\n };\n };\n\n var removeIds = function (tasks) {\n for (var i = 0; i < tasks.length; i++) {\n delete tasks[i].id;\n }\n };\n\n var removeTasks = function () {\n for (var i = (scope.taskBook.tasks.length - 1); i > -1; i--) {\n taskBookService.removeTask(scope.taskBook.tasks, i);\n }\n };\n\n var copyTaskbook = function (copiedTaskBook) {\n // if the current taskBook isMaster, we need to remove its Ids before copying to properly save the new copied TaskBook.\n if (scope.taskBook.isMaster) {\n removeIds(scope.taskBook.tasks);\n }\n taskBookService.removeEmptyTasks(scope.taskBook.tasks);\n removeIds(copiedTaskBook.data);\n\n if (scope.popbox.copy.action === scope.ACTIONS.REPLACE) {\n // if replace, move current scope to deleteTasks. Then remove all tasks from scope\n if (!scope.taskBook.isMaster) {\n [].push.apply(scope.tasksToDelete, scope.taskBook.tasks);\n }\n removeTasks();\n }\n\n for (var i = 0; i < copiedTaskBook.data.length; i++) {\n copiedTaskBook.data[i].status = 'Incomplete';\n }\n\n // Removed direct assignment of taskBook.tasks http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html\n [].push.apply(scope.taskBook.tasks, copiedTaskBook.data);\n\n scope.taskBook.id = scope.taskBook.isMaster ? null : scope.taskBook.id;\n scope.linkId = null; // need to remove consumer to know how to save\n scope.taskBook.isMaster = false;\n scope.taskBook.title = null;\n };\n\n scope.openPopBox = function (event) {\n setDefaults();\n popBoxService.open(event, popBoxName);\n isPopBoxOpen = true;\n };\n\n scope.closePopBox = function () {\n popBoxService.close(null, popBoxName);\n isPopBoxOpen = false;\n };\n\n scope.togglePopBox = function (event) {\n if (isPopBoxOpen) {\n scope.closePopBox();\n } else {\n scope.openPopBox(event);\n }\n };\n\n scope.popBoxOk = function () {\n var query = {\n taskBookId: scope.popbox.taskBookTypeahead.id,\n orderby: 'Order asc'\n };\n DudeApi.TaskBookTaskEntity.query(query).$promise.then(function (response) {\n if (scope.popbox.action === scope.ACTIONS.COPY) {\n copyTaskbook(response);\n } else if (scope.popbox.action === scope.ACTIONS.LINK) {\n linkTaskBook(scope.popbox.taskBookTypeahead, response);\n }\n scope.popbox.taskBookTypeahead = null;\n setDefaults();\n scope.closePopBox();\n });\n };\n\n scope.areThereTaskOrProceduresFilledOut = function () {\n if (!angular.isArray(scope.taskBook.tasks)) {\n return;\n }\n\n for (var i = 0; i < scope.taskBook.tasks.length; i++) {\n var task = scope.taskBook.tasks[i];\n if (task.title || task.procedure) {\n return true; // eslint-disable-line consistent-return\n }\n }\n };\n\n var init = function () {\n setDefaults();\n };\n\n init();\n }\n };\n });\n\n'use strict';\n\nangular.module('taskBookList', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate']);\n\n'use strict';\n\nangular.module('taskBookList')\n .factory('taskBookListFilterService', function (pagingHelpers) {\n var getFilters = function (params) {\n // if Adding a new search filter make sure to add it to the\n // isSearching() function below.\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Title asc',\n q: params.q || null,\n isMaster: true\n };\n\n return currentFilter;\n };\n\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n // Checks to see if you are in search mode.\n var isSearching = function (filters) {\n return (filters.q !== null && filters.q !== '');\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n isSearching: isSearching\n };\n });\n\n'use strict';\n\nangular.module('taskBookList')\n .service('taskBookListService', function (DudeApi, taskBookListFilterService) {\n var getListData = function (query) {\n var filters = taskBookListFilterService.toApiFilter(query);\n return DudeApi.TaskBookEntity.query(filters);\n };\n\n return {\n getListData: getListData\n };\n });\n\n'use strict';\n\nangular.module('taskBookList')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.taskBookList', {\n url: 'taskbooks?page&pageSize&q',\n templateUrl: 'app/components/taskBookList/taskBookList.html',\n controller: 'TaskBookListController',\n controllerAs: 'taskBookList',\n permissions: [permission.taskBooks.create, permission.taskBooks.update, permission.taskBooks.delete],\n resolve: {\n initData: function ($q, $stateParams, taskBookListService, taskBookListFilterService) {\n var queryParams = $stateParams;\n var filters = taskBookListFilterService.getFilters(queryParams);\n\n return $q.all({\n initResponse: taskBookListService.getListData(filters).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('taskBookList')\n .controller('TaskBookListController', function ($scope, $location, $state, taskBookListService, taskBookListFilterService, queryHelpers, orderByHelpers, initData) {\n var self = this;\n var queryDefaults = taskBookListFilterService.getFilters({});\n var pageChanging = false;\n\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(self.filters.orderBy);\n self.totalCount = initData.initResponse.total;\n self.listData = initData.initResponse.data;\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (angular.equals(oldVal, newVal)) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n newVal.page = 1;\n }\n\n pageChanging = false;\n\n taskBookListService.getListData(newVal).$promise.then(setData);\n queryHelpers.updateState(newVal, queryDefaults);\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n // Reset a cleared search to null not empty string\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.isActive = cloned.isActive !== '' ? cloned.isActive : null;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, taskBookListFilterService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.showSearchResults = function () {\n // List out possible filters and if one is set then we show search\n return taskBookListFilterService.isSearching(self.filters);\n };\n\n self.clearFilters = function () {\n self.filters = taskBookListFilterService.getFilters({});\n };\n\n self.editTaskBook = function (id) {\n $state.go('secure.taskBookEdit', {\n id: id\n });\n };\n\n $scope.$watch('taskBookList.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('taskBookForm', ['ui.router', 'ui.bootstrap', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'dudeLog', 'taskBook']);\n\n'use strict';\n\nangular.module('taskBookForm')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.taskBookCreate', {\n url: 'taskbooks/new',\n templateUrl: 'app/components/taskBookForm/taskBookForm.html',\n controller: 'TaskBookFormController',\n controllerAs: 'taskBookForm',\n permissions: permission.taskBooks.create,\n resolve: {\n taskBook: function (DudeApi) {\n return new DudeApi.TaskBookEntity({\n tasks: [],\n isMaster: true\n });\n },\n pmScheduleCount: function () {\n return { total: 0 };\n }\n }\n })\n .state('secure.taskBookEdit', {\n url: 'taskbooks/:id',\n templateUrl: 'app/components/taskBookForm/taskBookForm.html',\n controller: 'TaskBookFormController',\n controllerAs: 'taskBookForm',\n permissions: permission.taskBooks.update,\n resolve: {\n taskBook: function ($stateParams, DudeApi) {\n var taskBook;\n return DudeApi.TaskBookEntity.get({ id: $stateParams.id, includeAudit: true }).$promise\n .then(function (_taskBook) {\n taskBook = _taskBook;\n return DudeApi.TaskBookTaskEntity.query({\n taskBookId: _taskBook.id,\n orderBy: 'Order asc'\n }).$promise;\n })\n .then(function (_taskBookSummary) {\n taskBook.tasks = _taskBookSummary.data;\n return taskBook;\n });\n },\n pmScheduleCount: function ($stateParams, DudeApi) {\n return DudeApi.PmScheduleEntity.query({\n taskBookId: $stateParams.id,\n pagesize: 1\n }).$promise.then(function (response) {\n return response.total;\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('taskBookForm')\n .controller('TaskBookFormController', function ($q, $state, $scope, $timeout, $translate, $filter, $uibModal, log, taskBook, taskBookService, pmScheduleCount) {\n var self = this;\n self.taskBook = taskBook;\n var startingTaskBook = angular.copy(taskBook); // used to compare if we need to PUT\n self.tasksToDelete = [];\n self.updatedTime = $filter('date')(self.taskBook.updatedDateTime, 'MM/dd/yyyy h:mm a');\n\n var goToTaskBookList = function () {\n $state.go('secure.taskBookList');\n };\n\n var errorFn = function () {\n log.notify({\n title: $translate.instant('taskBookForm.notify.failure.title'),\n type: 'error',\n message: $translate.instant('taskBookForm.notify.failure.message')\n });\n };\n\n var successToast = function () {\n log.notify({\n title: $translate.instant('taskBookForm.notify.success.title'),\n type: 'success',\n message: $translate.instant('taskBookForm.notify.success.message')\n });\n };\n var skipNavigationWarningModal = function () {\n self.skipNavigationWarning = true;\n };\n\n var init = function () {\n // If there are no tasks then add some\n if (!angular.isArray(self.taskBook.tasks) || self.taskBook.tasks.length === 0) {\n taskBookService.addTasks(self.taskBook.tasks, 5);\n }\n\n // Wait til the form is loaded and set it to not dirty\n $timeout(function () {\n $scope.form.$dirty = false;\n }, 100);\n };\n\n self.saveTaskBook = function () {\n skipNavigationWarningModal();\n\n var _taskBook = angular.copy(taskBook);\n var taskBookPromise = _taskBook.id ? _taskBook.$update({ id: taskBook.id }) : _taskBook.$save();\n\n taskBookPromise.then(function (_savedTaskBook) {\n var promises = [];\n var i;\n\n // delete tasks\n for (i = 0; i < self.tasksToDelete.length; i++) {\n var deleteTask = self.tasksToDelete[i];\n var deleteTaskPromise = deleteTask.$delete({\n id: deleteTask.id,\n taskBookId: _savedTaskBook.id\n });\n\n promises.push(deleteTaskPromise);\n }\n\n // add tasks\n for (i = 0; i < taskBook.tasks.length; i++) {\n var task = taskBook.tasks[i];\n task.order = i + 1; // Make sure this is correct in the future\n\n // Check to see if the task has changed and if not then dont make the call\n if (!angular.equals(task, startingTaskBook.tasks[i]) && task.title) {\n var addTasksPromise = task.id ? task.$update({\n taskBookId: _savedTaskBook.id,\n id: task.id\n }) : task.$save({ taskBookId: _savedTaskBook.id });\n\n promises.push(addTasksPromise);\n }\n }\n\n $q.all(promises).then(function () {\n successToast();\n goToTaskBookList();\n }, errorFn);\n });\n };\n\n var showDeleteMessage = function () {\n log.notify({\n title: $translate.instant('taskBookForm.notify.delete.title'),\n type: 'success',\n message: $translate.instant('taskBookForm.notify.delete.message')\n });\n };\n\n var confirmDelete = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/taskBookForm/taskBookDeleteConfirmModal.html',\n controller: 'TaskBookDeleteModalController',\n size: 'sm',\n resolve: {\n pmScheduleCount: function () {\n return pmScheduleCount;\n }\n },\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n taskBook.$delete({ id: taskBook.id }).then(function () {\n showDeleteMessage();\n $state.go('secure.taskBookList');\n });\n });\n };\n\n var deleteWarning = function () {\n $uibModal.open({\n templateUrl: 'app/components/taskBookForm/taskBookDeleteWarningModal.html',\n controller: 'TaskBookDeleteModalController',\n size: 'md',\n backdrop: 'static',\n resolve: {\n pmScheduleCount: function () {\n return pmScheduleCount;\n }\n }\n });\n };\n\n self.deleteTaskBook = function () {\n if (pmScheduleCount > 0) {\n deleteWarning();\n } else {\n confirmDelete();\n }\n };\n\n init();\n });\n\n\n'use strict';\n\nangular.module('taskBookForm')\n .controller('TaskBookDeleteModalController', function ($uibModalInstance, $scope, pmScheduleCount) {\n $scope.pmScheduleCount = pmScheduleCount;\n\n $scope.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n/**\n * @ngdoc service\n * @name dashboard.statusReportService\n * @requires DudeApi - {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApi.DudeApi read the docs}\n * @requires pagingHelpers {@link http://frontend.dudesoln.com/ng-docs/DudeControls/#/api/filterHelpers.pagingHelpersService read the docs}\n *\n * @description\n * Service for getting status reports from the Report API.\n *\n */\n\n'use strict';\n\nangular.module('dashboard')\n .service('statusReportService', function (DudeApi, pagingHelpers) {\n var checkArray = function (value) {\n return !Array.isArray(value) ? [value] : value;\n };\n\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf dashboard.statusReportService\n *\n * @description\n * Returns a filter object parsed and formatted\n *\n * @param {object} params An object containing the filter params to use\n * @returns {object} Filter object\n */\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: parseInt(params.pageSize, 10) || parseInt(pagingHelpers.defaults.pageSize, 10),\n orderBy: params.orderBy || null,\n status: params.status || []\n };\n\n currentFilter.status = checkArray(currentFilter.status);\n\n return currentFilter;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf dashboard.statusReportService\n *\n * @description\n * Converts a filter object to a useable state by the api\n *\n * @param {object} currentFilter An object containing the filter params to use\n * @returns {object} Filter object\n */\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n /**\n * @ngdoc method\n * @name getData\n * @methodOf dashboard.statusReportService\n *\n * @description\n * Returns status based on the query passed in.\n *\n * @param {object} query query An object containing the query to pass to the API.\n * @returns {object} The results from the API as an object.\n */\n var getData = function (query) {\n var filters = toApiFilter(query);\n\n return DudeApi.StatusesSummaryEntity.query(filters).$promise;\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n getData: getData\n };\n });\n\n'use strict';\n\nangular.module('helpers', ['marketizr', 'maintenanceConstants']);\n\n'use strict';\n\nangular.module('helpers')\n .filter('status', function ($translate, workOrderEnums) {\n var statuses = [];\n statuses[workOrderEnums.status.newRequest] = $translate.instant('statuses.newRequest');\n statuses[workOrderEnums.status.workInProgress] = $translate.instant('statuses.workInProgress');\n statuses[workOrderEnums.status.complete] = $translate.instant('statuses.complete');\n statuses[workOrderEnums.status.void] = $translate.instant('statuses.void');\n statuses[workOrderEnums.status.onHold] = $translate.instant('statuses.onHold');\n\n return function (input) {\n var value = statuses[input];\n if (!value) {\n return 'Unknown';\n }\n return value;\n };\n });\n\n/**\n * @ngdoc service\n * @name settingsForm.settingsHelpers\n * @requires DudeApi\n *\n * @description\n * Service for handling the default purpose values\n *\n */\n\n'use strict';\n\nangular.module('settingsForm')\n .service('settingsHelpers', function ($filter, $translate, DudeApi, LABOR_HOUR_TYPE) {\n var KEYS = {\n LOCATION_DESCRIPTION: 'MM-helpers-locationDescription'\n };\n\n var defaultLocationDescription = {\n text: $translate.instant('settingsForm.areaRoomNumber.defaultText'),\n isRequired: false\n };\n\n /**\n * @ngdoc method\n * @name saveSetting\n * @methodOf settingsForm.settingsHelpers\n *\n * @description\n * Sets a default setting to the key provided\n *\n * @param {string} key The storage key for this setting\n * @param {object} value The value to store\n * @param {boolean} isNew A boolean that tells if this needs to be a new save or an update to an existing\n * @returns {Promise} A promise that resolves to the saved default\n */\n var saveSetting = function (key, value, isNew) {\n var defaultSetting = {\n key: key,\n value: value || {}\n };\n\n return isNew ? DudeApi.AccountSettingsEntity.save(defaultSetting).$promise : DudeApi.AccountSettingsEntity.update({ id: key }, defaultSetting).$promise;\n };\n\n /**\n * @ngdoc method\n * @name overtimeRateTypeReference\n * @methodOf settingsForm.settingsHelpers\n *\n * @description\n * Sets a default setting to the key provided\n *\n * @param {array} laborHourTypes The array labor hour types to filter through\n * @returns {array} An array of labor hour types that have type overtime\n */\n var overtimeRateTypeReference = function (laborHourTypes) {\n return $filter('filter')(laborHourTypes, function (laborHourType) {\n return laborHourType.type === LABOR_HOUR_TYPE.overtime;\n })[0];\n };\n\n /**\n * @ngdoc method\n * @name getLocationDescription\n * @methodOf settingsForm.settingsHelpers\n *\n * @description\n * returns a location description object\n *\n * @returns {object} An object containing the location description text and required boolean\n */\n var getLocationDescription = function () {\n return DudeApi.AccountSettingsEntity.get({ id: KEYS.LOCATION_DESCRIPTION }).$promise.then(function (result) {\n var locationDescriptionObject = result.value.text ? result.value : defaultLocationDescription;\n locationDescriptionObject.exists = true;\n return locationDescriptionObject;\n }, function () {\n return defaultLocationDescription;\n });\n };\n\n /**\n * @ngdoc method\n * @name doubletimeRateTypeReference\n * @methodOf settingsForm.settingsHelpers\n *\n * @description\n * Sets a default setting to the key provided\n *\n * @param {array} laborHourTypes The array labor hour types to filter through\n * @returns {array} An array of labor hour types that have type doubletime\n */\n var doubletimeRateTypeReference = function (laborHourTypes) {\n return $filter('filter')(laborHourTypes, function (laborHourType) {\n return laborHourType.type === LABOR_HOUR_TYPE.doubletime;\n })[0];\n };\n\n return {\n overtimeRateTypeReference: overtimeRateTypeReference,\n doubletimeRateTypeReference: doubletimeRateTypeReference,\n saveSetting: saveSetting,\n getLocationDescription: getLocationDescription,\n keys: KEYS\n };\n });\n\n'use strict';\n\nangular.module('settingsForm')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.settingsEdit', {\n url: 'settings',\n templateUrl: 'app/components/settingsForm/settingsForm.html',\n controller: 'SettingsFormController',\n controllerAs: 'settingsForm',\n permissions: permission.laborHourTypes.update,\n resolve: {\n initData: function ($q, $stateParams, laborHourTypesService) {\n return $q.all({\n laborHourTypes: laborHourTypesService.getLaborHourTypes().$promise\n });\n },\n requesterPurpose: function (defaultPurposesService) {\n return defaultPurposesService.getPurpose(defaultPurposesService.purposeKeys.reactivePurpose);\n },\n plannedPurpose: function (defaultPurposesService) {\n return defaultPurposesService.getPurpose(defaultPurposesService.purposeKeys.plannedPurpose);\n },\n areaRoomNumber: function (settingsHelpers) {\n return settingsHelpers.getLocationDescription();\n },\n accountAlert: function (DudeApi) {\n var alert = {\n message: '',\n roles: []\n };\n\n return DudeApi.AccountAlertsEntity.query().$promise\n .then(function (result) {\n if (result.data.length > 0) {\n alert = result.data[0];\n }\n\n return alert;\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('settingsForm')\n .controller('SettingsFormController', function ($scope, $q, $translate, $filter, $state, log, settingsHelpers, defaultPurposesService, initData, requesterPurpose, plannedPurpose, areaRoomNumber, accountAlert, market, marketizr) {\n var self = this;\n var laborHourTypes = initData.laborHourTypes.data;\n\n self.market = market;\n\n self.otRateMultiplier = settingsHelpers.overtimeRateTypeReference(laborHourTypes);\n self.dtRateMultiplier = settingsHelpers.doubletimeRateTypeReference(laborHourTypes);\n\n self.defaultReactivePurpose = requesterPurpose;\n self.defaultPlannedPurpose = plannedPurpose;\n\n self.areaRoomNumber = areaRoomNumber;\n\n self.accountAlert = accountAlert;\n\n self.spies = [];\n var offsetPadding = 50;\n self.headerOffset = angular.element('.main-nav').outerHeight(true) + angular.element('.header-container').outerHeight(true) + offsetPadding;\n\n var addLaborHourTypeUpdates = function (promises) {\n if ($scope.form.otRateMultiplier.$dirty) {\n promises.push(self.otRateMultiplier.$update({ id: self.otRateMultiplier.id }));\n }\n\n if ($scope.form.dtRateMultiplier.$dirty) {\n promises.push(self.dtRateMultiplier.$update({ id: self.dtRateMultiplier.id }));\n }\n\n return promises;\n };\n\n var settingsaveSuccess = function () {\n self.areaRoomNumber.exists = true;\n log.notify({\n type: 'success',\n message: $translate.instant('settingsForm.saveSuccess')\n });\n };\n\n var queuePromises = function (formSectionUpdates) {\n var promises = [];\n\n for (var i = 0; i < formSectionUpdates.length; i++) {\n promises = formSectionUpdates[i](promises);\n }\n\n return promises;\n };\n\n self.save = function () {\n var promises = queuePromises([addLaborHourTypeUpdates]);\n promises.push(settingsHelpers.saveSetting(defaultPurposesService.purposeKeys.reactivePurpose, self.defaultReactivePurpose, false));\n promises.push(settingsHelpers.saveSetting(defaultPurposesService.purposeKeys.plannedPurpose, self.defaultPlannedPurpose, false));\n if (marketizr.hasMarkets([self.market.k12, self.market.he, self.market.ips])) {\n promises.push(settingsHelpers.saveSetting(settingsHelpers.keys.LOCATION_DESCRIPTION, self.areaRoomNumber, !self.areaRoomNumber.exists));\n }\n return $q.all(promises).then(settingsaveSuccess);\n };\n });\n\n'use strict';\n\nangular.module('settingsForm')\n .service('laborHourTypesService', function (DudeApi) {\n var getLaborHourTypes = function () {\n return DudeApi.LaborHourTypeEntity.query({});\n };\n return {\n getLaborHourTypes: getLaborHourTypes\n };\n });\n\n'use strict';\n\nangular.module('settingsForm')\n .constant('LABOR_HOUR_TYPE', {\n overtime: 'Overtime',\n doubletime: 'Doubletime'\n });\n\n'use strict';\n\nangular.module('routeInterceptor', ['ui.router', 'dudeAuth', 'dudeApi']);\n\n'use strict';\n\nangular.module('routeInterceptor')\n .config(function ($stateProvider) {\n $stateProvider\n .state('secure.interceptor', {\n url: 'landing',\n controller: 'RouteInterceptorController'\n });\n });\n\n'use strict';\n\nangular.module('routeInterceptor')\n .controller('RouteInterceptorController', function ($state, marketizr, market, roleHelpers) {\n if (roleHelpers.isRequester()) {\n $state.go('secure.workOrderFormNew');\n } else if (roleHelpers.isTechnician() && !marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n $state.go('secure.workOrderList');\n } else {\n $state.go('secure.dashboard');\n }\n });\n\n'use strict';\n\nangular.module('report', ['dudeAuth', 'reportFilters', 'dudeControlsCharts', 'maintenanceConstants']);\n\n/**\n * @ngdoc service\n * @name report.reportTooltipService\n *\n * @description\n * Service for generating tooltip text for the reporting charts\n *\n */\n\n'use strict';\n\nangular.module('report')\n .service('reportTooltipService', function () {\n var getAncestorPath = function (object) {\n var string = '';\n if (object.ancestorIdPath) {\n string += '
    ';\n var hierarchy = object.ancestorNamePath.split('|');\n hierarchy.forEach(function (parent) {\n if (parent.length) {\n string += '
  1. ' + parent + '
  2. ';\n }\n });\n string += '
';\n }\n return string;\n };\n\n /**\n * @ngdoc method\n * @name standardTooltip\n * @methodOf report.reportTooltipService\n *\n * @description\n * Returns a string to use in the tooltip for a chart segment\n *\n * @param {object} object The data object containing the name and asset data\n * @param {string} displayValue The user friendly display of the data value of a segment of a chart\n * @returns {string} The string to use in the tooltip\n */\n var standardTooltip = function (object, displayValue) {\n var text = object.value || object.name;\n var string = '
' + text + '
';\n string += getAncestorPath(object);\n string += '
' + displayValue + '
';\n return string;\n };\n\n /**\n * @ngdoc method\n * @name costChartTooltip\n * @methodOf report.reportTooltipService\n *\n * @description\n * Returns a string to use in the tooltip for a cost chart segment\n *\n * @param {object} object The data object containing the name and asset data\n * @param {string} laborCost The user friendly display of the labor cost of a segment of a chart\n * @param {string} purchaseCost The user friendly display of the purchase cost of a segment of a chart\n * @param {string} serviceCost The user friendly display of the service cost of a segment of a chart\n * @param {string} totalCost The user friendly display of the total cost of a segment of a chart\n * @returns {string} The string to use in the tooltip\n */\n var costChartTooltip = function (object, laborCost, purchaseCost, serviceCost, totalCost) {\n var text = object.value || object.name;\n var string = '
' + text + '
';\n string += getAncestorPath(object);\n string += '
' + laborCost + '
';\n string += '
' + serviceCost + '
';\n string += '
' + purchaseCost + '
';\n string += '
' + totalCost + '
';\n return string;\n };\n\n return {\n standardTooltip: standardTooltip,\n costChartTooltip: costChartTooltip\n };\n });\n\n/**\n * @ngdoc directive\n * @name report.report-navigation\n * @restrict E\n * @description\n *\n * Displays the navigation tabs and sets the current one active for the reports pages\n *\n * @param {object} filters the filter object to pass through on route\n *\n * \n */\n\n'use strict';\n\nangular.module('report')\n .component('reportNavigation', {\n bindings: {\n filters: '='\n },\n templateUrl: 'app/components/reports/reportNavigation.html',\n controller: 'ReportNavigationComponent',\n controllerAs: 'reportNavigation'\n })\n .controller('ReportNavigationComponent', function ($state, market) {\n var self = this;\n\n self.isActiveRoute = function (parameter) {\n return $state.current.url.indexOf(parameter + '/') === 0;\n };\n\n self.isChartView = $state.current.url.indexOf('chart') !== -1;\n\n self.market = market;\n\n self.routeTo = function (routeParam, ignoreChartCheck) {\n var reportType = self.isChartView && !ignoreChartCheck ? 'Chart' : 'List';\n var route = 'secure.report.' + routeParam + reportType;\n var filterCopy = angular.copy(self.filters);\n delete filterCopy.orderBy;\n delete filterCopy.filterId;\n\n if (routeParam === 'locations' || routeParam === 'equipment') {\n delete filterCopy.businessAsset;\n }\n\n $state.go(route, filterCopy);\n };\n });\n\n/**\n * @ngdoc directive\n * @name report.report-list-totals\n * @restrict E\n * @description\n *\n * Displays the totals for the current report list\n *\n * @param {object} data the data object containing the fields to display for totals\n *\n * \n */\n\n'use strict';\n\nangular.module('report')\n .component('reportListTotals', {\n bindings: {\n data: '='\n },\n templateUrl: 'app/components/reports/reportListTotals.html',\n controller: 'ReportListTotalsController',\n controllerAs: 'reportListTotals'\n })\n .controller('ReportListTotalsController', function () {\n });\n\n/**\n * @ngdoc service\n * @name report.reportDataService\n * @requires DudeApi - {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApi.DudeApi read the docs}\n * @requires moment - {@link http://momentjs.com/docs/ read the docs}\n * @requires $translate - {@link https://angular-translate.github.io/docs/#/api/pascalprecht.translate.$translate read the docs}\n *\n * @description\n * Service for supporting and working with data from the report pages\n *\n */\n\n'use strict';\n\nangular.module('report')\n .service('reportDataService', function (DudeApi, moment, $translate) {\n var top = $translate.instant('reports.top');\n\n /**\n * @ngdoc method\n * @name topLabel\n * @methodOf report.reportDataService\n *\n * @description\n * Expands the chart title to include the top count if needed\n *\n * @param {array} filterArray An array of filters\n * @param {object} results The returned results object from the api in its paging wrapper\n * @param {object} dataObject The data object to be passed to the charting service\n * @param {object} labels An object of labels to be used with the chart\n * @param {number} count The maximum count of items to be shown\n */\n var topLabel = function (filterArray, results, dataObject, labels, count) {\n if (filterArray.length === 0 && results.total > 5 && dataObject.idArray.length === count && labels.title.indexOf(('(' + top)) < 0) {\n labels.title += ' (' + top + ' ' + count + ')';\n }\n };\n\n /**\n * @ngdoc method\n * @name exportReport\n * @methodOf report.reportDataService\n *\n * @description\n * Downloads a specified work order reports exported report\n *\n * @param {object} query The filters to query with\n * @param {string} target The target endpoint to export from\n */\n var exportReport = function (query, target) {\n delete query.page;\n delete query.pageSize;\n query.timezone = moment.tz.guess();\n\n DudeApi.workOrderExportService.download(query, target);\n };\n\n return {\n topLabel: topLabel,\n exportReport: exportReport\n };\n });\n\n/**\n * @ngdoc service\n * @name report.reportChartPrintService\n * @requires $q - {@link https://docs.angularjs.org/api/ng/service/$q read the docs}\n * @requires $filter - {@link https://docs.angularjs.org/api/ng/service/$filter read the docs}\n * @requires $translate - {@link https://angular-translate.github.io/docs/#/api/pascalprecht.translate.$translate read the docs}\n * @requires DudeApi - {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApi.DudeApi read the docs}\n * @requires bulkPrintHelperService\n *\n * @description\n * Service for printing the report charts to pdf\n *\n */\n'use strict';\n\nangular.module('report')\n .service('reportChartPrintService', function ($q, $filter, $translate, DudeApi, bulkPrintHelperService) {\n var chartContentDivTag = '
';\n var chartContentNoPageBreak = '
';\n\n // Opening tag for each summary table\n var summaryTableTag = '';\n\n var getNamesFromIds = function (id, entity) {\n return DudeApi[entity].get({ id: id }).$promise.then(function (response) {\n return response.name || response.value;\n });\n };\n\n var buildDrillDownHtml = function (chart, title, filterSection, drillDownData) {\n var drillDownSummary = '';\n var optimalSize = 9;\n var workOrderChart = chart.includes('Work Orders');\n var costChart = chart.includes('pop-box-report-drill-down-chart-cost');\n var laborChart = chart.includes('pop-box-report-drill-down-chart-labor');\n\n if (!workOrderChart && !costChart && !laborChart) {\n return '';\n }\n\n if ((drillDownData.dataArray.length > optimalSize) && !laborChart) {\n drillDownSummary += '' +\n title +\n filterSection +\n '

' +\n chartContentDivTag +\n '
';\n } else if ((drillDownData.dataArray.length > optimalSize) && laborChart) {\n drillDownSummary += '
' +\n title +\n filterSection +\n '

' +\n chartContentNoPageBreak +\n '
';\n }\n\n if (workOrderChart) {\n drillDownSummary += summaryTableTag +\n '
' +\n '' +\n '';\n } else if (costChart) {\n drillDownSummary += summaryTableTag +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '';\n } else if (laborChart) {\n drillDownSummary += summaryTableTag +\n '' +\n '' +\n '';\n }\n\n if (!costChart) {\n for (var i = 1; i < drillDownData.dataArray.length; i++) {\n drillDownSummary += '' +\n '' +\n '' +\n '';\n }\n } else {\n for (var j = 1; j < drillDownData.dataArray.length; j++) {\n var totalCost = drillDownData.dataArray[j][1].v + drillDownData.dataArray[j][3].v + drillDownData.dataArray[j][5].v;\n drillDownSummary += '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '';\n }\n }\n\n drillDownSummary += '
' +\n drillDownData.name + '' +\n $translate.instant('reports.byWorkOrders.workOrders') +\n '
' + drillDownData.name + '' + $translate.instant('reports.byCost.purchase') + '' + $translate.instant('reports.byCost.service') + '' + $translate.instant('reports.byCost.labor') + '' + $translate.instant('general.total') + '
' +\n drillDownData.name + '' +\n $translate.instant('reports.byCost.hours') +\n '
' + drillDownData.dataArray[i][0] + '' + drillDownData.dataArray[i][1].v + '
' + drillDownData.dataArray[j][0] + '' + $filter('currency')(drillDownData.dataArray[j][1].v) + '' + $filter('currency')(drillDownData.dataArray[j][3].v) + '' + $filter('currency')(drillDownData.dataArray[j][5].v) + '' + $filter('currency')(totalCost) + '
';\n\n if (workOrderChart) {\n return '' +\n title +\n filterSection +\n chartContentDivTag +\n '
' +\n '
' + drillDownData.name + '
' +\n chart +\n '
' +\n drillDownSummary +\n '
' +\n '
';\n } else if (costChart) {\n return '' +\n title +\n filterSection +\n chartContentDivTag +\n '
' +\n chart +\n drillDownSummary +\n '
' +\n '
';\n } else if (laborChart) {\n return '' +\n title +\n filterSection +\n (drillDownData.dataArray.length > optimalSize ? chartContentDivTag : chartContentNoPageBreak) +\n '
' +\n chart +\n drillDownSummary +\n '
' +\n '
';\n }\n return '';\n };\n\n var buildChartHtml = function (html, labels, summary, filter, type) {\n // The report title, displayed on each page\n var reportTitle = '' + $translate.instant('reports.reportTitle.' + type) + '';\n\n // Displays the filter information under the report title on each page\n var ignoredFilters = ['page', 'pageSize', 'orderBy', 'returnAverages', 'dateRange', 'isLocation', 'assetRollUp'];\n var filtersMessage = '
';\n\n var drillDownWorkOrders = '';\n var drillDownCost = '';\n var drillDownLabor = '';\n var includesDrillDowns = (html.length > 3) && (html[3].workOrder !== '' || html[3].cost !== '' || html[3].labor !== '');\n\n Object.keys(filter).forEach(function (key) {\n if (filter[key] == null || ignoredFilters.indexOf(key) !== -1 || (Array.isArray(filter[key]) && filter[key].length === 0)) {\n return;\n }\n var value;\n if (key === 'status') {\n value = [];\n filter[key].forEach(function (val) {\n value.push($translate.instant('reports.statuses.' + val));\n });\n value = value.join(', ');\n } else {\n value = Array.isArray(filter[key]) ? filter[key].join(', ') : filter[key].toString();\n value = key.indexOf('completionDate') !== -1 || key.indexOf('requestDate') !== -1 ? new Date(value).toLocaleString() : value;\n }\n filtersMessage += '
' + $translate.instant('reports.filters.' + key) + ':
' +\n '
' + value + '
';\n });\n filtersMessage += '
';\n\n if (includesDrillDowns) {\n drillDownWorkOrders = buildDrillDownHtml(html[3].workOrder, reportTitle, filtersMessage, summary.drillDownData);\n drillDownCost = buildDrillDownHtml(html[3].cost, reportTitle, filtersMessage, summary.drillDownData);\n drillDownLabor = buildDrillDownHtml(html[3].labor, reportTitle, filtersMessage, summary.drillDownData);\n }\n\n // Warning to put over graph if no data\n var noDataWarning = '
' +\n '
' + $translate.instant('reports.noDataMessage') + '
' +\n '
';\n\n // Work order summary chart\n var workOrdersChartSummary = summaryTableTag +\n '' +\n '' + $translate.instant('reports.' + type) + '' +\n '' + $translate.instant('reports.byWorkOrders.workOrders') + '' +\n '';\n\n for (var i = 1; i < summary.workOrderChartData.dataArray.length; i++) {\n workOrdersChartSummary += '' +\n '' + summary.workOrderChartData.dataArray[i][0] + '' +\n '' + summary.workOrderChartData.dataArray[i][1].v + '' +\n '';\n }\n workOrdersChartSummary += '';\n workOrdersChartSummary = summary.workOrderChartData.dataArray.length > 1 ? workOrdersChartSummary : '';\n\n // Cost summary chart\n var costChartSummary = summaryTableTag +\n '' +\n '' + $translate.instant('reports.' + type) + '' +\n '' + $translate.instant('reports.byCost.purchase') + '' +\n '' + $translate.instant('reports.byCost.service') + '' +\n '' + $translate.instant('reports.byCost.labor') + '' +\n '' + $translate.instant('general.total') + '' +\n '';\n\n for (var j = 1; j < summary.costChartData.dataArray.length; j++) {\n var totalCost = summary.costChartData.dataArray[j][1].v + summary.costChartData.dataArray[j][3].v + summary.costChartData.dataArray[j][5].v;\n costChartSummary += '' +\n '' + summary.costChartData.dataArray[j][0] + '' +\n '' + $filter('currency')(summary.costChartData.dataArray[j][1].v) + '' +\n '' + $filter('currency')(summary.costChartData.dataArray[j][3].v) + '' +\n '' + $filter('currency')(summary.costChartData.dataArray[j][5].v) + '' +\n '' + $filter('currency')(totalCost) + '' +\n '';\n }\n costChartSummary += '';\n costChartSummary = summary.costChartData.dataArray.length > 1 ? costChartSummary : '';\n\n // Labor hours summary chart\n var laborHoursChartSummary = summaryTableTag +\n '' +\n '' + $translate.instant('reports.' + type) + '' +\n '' + $translate.instant('reports.byLaborHours.hours') + '' +\n '';\n\n for (var k = 1; k < summary.laborHoursChartData.dataArray.length; k++) {\n laborHoursChartSummary += '' +\n '' + summary.laborHoursChartData.dataArray[k][0] + '' +\n '' + summary.laborHoursChartData.dataArray[k][1].v + '' +\n '';\n }\n laborHoursChartSummary += '';\n laborHoursChartSummary = summary.laborHoursChartData.dataArray.length > 1 ? laborHoursChartSummary : '';\n\n // Choose whether or not to show the no data warning\n var noWorkOrderData = summary.workOrderChartData.dataArray.length > 1 ? '' : noDataWarning;\n var noCostData = summary.costChartData.dataArray.length > 1 ? '' : noDataWarning;\n var noLaborHoursData = summary.laborHoursChartData.dataArray.length > 1 ? '' : noDataWarning;\n\n return '' +\n '' + labels.title + '' +\n '' +\n '' +\n '' +\n reportTitle +\n filtersMessage +\n chartContentDivTag +\n '
' +\n '
' +\n html[0] +\n noWorkOrderData +\n workOrdersChartSummary +\n '
' +\n '
' +\n '' +\n drillDownWorkOrders +\n reportTitle +\n filtersMessage +\n chartContentDivTag +\n '
' +\n '
' +\n html[1] +\n noCostData +\n costChartSummary +\n '
' +\n '
' +\n '' +\n drillDownCost +\n reportTitle +\n filtersMessage +\n (includesDrillDowns && html[3].labor.includes('pop-box-report-drill-down-chart-labor') ? chartContentDivTag : chartContentNoPageBreak) +\n '
' +\n '
' +\n html[2] +\n noLaborHoursData +\n laborHoursChartSummary +\n '
' +\n '
' +\n '' +\n drillDownLabor +\n '' +\n '';\n };\n\n /**\n * @ngdoc method\n * @name printCharts\n * @methodOf report.reportChartPrintService\n *\n * @description\n * Requests a URL from the report api containing the charts\n *\n * @param {Array} html The markup to be printed to pdf\n * @param {object} filterBody The filters used to generate the chart\n * @param {object} summary The summary data to be printed below the chart\n * @param {string} type The type of chart to be printed\n */\n var printCharts = function (html, filterBody, summary, type) {\n var promises = [];\n var filters = angular.copy(filterBody);\n if (filters.businessAsset && filters.businessAsset.length) {\n filters.businessAsset.forEach(function (asset) {\n promises.push(getNamesFromIds(asset, 'BusinessAssetEntity'));\n });\n } else {\n filters.businessAsset = [];\n }\n if (filters.workType && filters.workType.length) {\n filters.workType.forEach(function (workType) {\n promises.push(getNamesFromIds(workType, 'WorkTypeEntity'));\n });\n } else {\n filters.workType = [];\n }\n if (filters.purpose && filters.purpose.length) {\n filters.purpose.forEach(function (purpose) {\n promises.push(getNamesFromIds(purpose, 'PurposeEntity'));\n });\n } else {\n filters.purpose = [];\n }\n\n return $q.all(promises).then(function (namesData) {\n filters.businessAsset = !filters.businessAsset.length ? [] : namesData.slice(0, filters.businessAsset.length);\n filters.workType = !filters.workType.length ? [] : namesData.slice(filters.businessAsset.length, filters.workType.length + filters.businessAsset.length);\n filters.purpose = !filters.purpose.length ? [] : namesData.slice(filters.workType.length + filters.businessAsset.length, filters.purpose.length + filters.workType.length + filters.businessAsset.length);\n var renderedHtml = buildChartHtml(html, {\n title: $translate.instant('reports.reportTitle.' + type)\n }, summary, filters, type);\n return bulkPrintHelperService.bulkPrint('ReportChartPdfEntity',\n {\n fileName: type + 'ReportCharts.pdf',\n title: $translate.instant('reports.reportTitle.' + type),\n html: renderedHtml,\n orientation: 'landscape'\n },\n {\n title: $translate.instant('reports.reportTitle.' + type),\n display: $translate.instant('reports.loadingReport.' + type),\n loading: $translate.instant('reports.loadingReport.' + type)\n });\n });\n };\n\n return {\n printCharts: printCharts\n };\n });\n\n'use strict';\n\nangular.module('report')\n .config(function ($stateProvider) {\n $stateProvider\n .state('secure.report',\n {\n abstract: true,\n url: 'report/',\n template: '
',\n controllerAs: 'report'\n });\n });\n\n'use strict';\n\nangular.module('reportFilters', ['translate', 'dudeAuth', 'dudeControls']);\n\n/**\n * @ngdoc service\n * @name report.reportFiltersService\n * @requires $location - {@link https://docs.angularjs.org/api/ng/service/$location read the docs}\n * @requires pagingHelpers - {@link http://frontend.dudesoln.com/ng-docs/DudeControls/#/api/filterHelpers.pagingHelpersService read the docs}\n *\n * @description\n * Service for supporting the filtering of the report pages\n *\n */\n\n'use strict';\n\nangular.module('reportFilters')\n .factory('reportFiltersService', function ($location, $translate, marketizr, market, moment, pagingHelpers, userContext) {\n var isEdu = marketizr.hasMarkets([market.k12, market.he, market.ips]);\n\n var currentYear = moment().year();\n var lastMonth = moment().subtract(1, 'months');\n var lastYear = moment().subtract(1, 'year');\n var fiscalStartDate = moment(userContext.account.fiscalStartDate).year(currentYear);\n var fiscalEndDate = moment(fiscalStartDate).add(1, 'year').subtract(1, 'day');\n\n if (moment().isBefore(fiscalStartDate, 'day')) {\n fiscalStartDate = moment(fiscalStartDate).subtract(1, 'year');\n fiscalEndDate = moment(fiscalEndDate).subtract(1, 'year');\n }\n\n var lastFiscalStart = moment(fiscalStartDate).subtract(1, 'year');\n var lastFiscalEnd = moment(fiscalEndDate).subtract(1, 'year');\n\n // Presently used for edu markets\n var dateIncrements = [\n {\n text: $translate.instant('reportFilters.dateRange.thisMonth'),\n startDate: moment().startOf('month'),\n endDate: moment().endOf('month')\n },\n {\n text: $translate.instant('reportFilters.dateRange.lastMonth'),\n startDate: moment(lastMonth).startOf('month'),\n endDate: moment(lastMonth).endOf('month')\n },\n {\n text: $translate.instant('reportFilters.dateRange.thisFiscalYear'),\n startDate: fiscalStartDate,\n endDate: fiscalEndDate\n },\n {\n text: $translate.instant('reportFilters.dateRange.lastFiscalYear'),\n startDate: lastFiscalStart,\n endDate: lastFiscalEnd\n },\n {\n text: $translate.instant('reportFilters.dateRange.thisCalendarYear'),\n startDate: moment().startOf('year'),\n endDate: moment().endOf('year')\n },\n {\n text: $translate.instant('reportFilters.dateRange.lastCalendarYear'),\n startDate: moment(lastYear).startOf('year'),\n endDate: moment(lastYear).endOf('year')\n }\n ];\n\n // Presently used for non-edu markets\n var dateRanges = [\n {\n text: $translate.instant('reportFilters.dateRange.last7'),\n startDate: moment().subtract(7, 'days').hours(0).minutes(0).seconds(0),\n endDate: moment().hours(23).minutes(59).seconds(59)\n },\n {\n text: $translate.instant('reportFilters.dateRange.last30'),\n startDate: moment().subtract(30, 'days').hours(0).minutes(0).seconds(0),\n endDate: moment().hours(23).minutes(59).seconds(59)\n },\n {\n text: $translate.instant('reportFilters.dateRange.last90'),\n startDate: moment().subtract(90, 'days').hours(0).minutes(0).seconds(0),\n endDate: moment().hours(23).minutes(59).seconds(59)\n }\n ];\n\n var checkArray = function (value) {\n if (!Array.isArray(value)) {\n var array = [];\n array.push(value);\n return array;\n }\n return value;\n };\n\n var getDateRanges = function () {\n return (isEdu) ? dateIncrements : dateRanges;\n };\n\n var interpretDateRanges = function (filters, ranges) {\n var dates = ranges || getDateRanges();\n var dateIntervals = dates.reduce(function (pv, cv) {\n pv[cv.text] = {\n from: cv.startDate,\n to: cv.endDate\n };\n return pv;\n }, {});\n\n var dateTypes = [\n {\n from: 'requestDateFrom',\n to: 'requestDateTo',\n range: 'requestDateRange'\n },\n {\n from: 'completionDateFrom',\n to: 'completionDateTo',\n range: 'completionDateRange'\n },\n {\n from: 'dateFrom',\n to: 'dateTo',\n range: 'dateRange'\n }\n ];\n\n return dateTypes.reduce(function (pv, cv) {\n if (pv[cv.range] && pv[cv.range].toLowerCase() !== 'custom' && pv[cv.range].toLowerCase() !== 'all') {\n pv[cv.from] = new Date(dateIntervals[pv[cv.range]].from).toISOString();\n pv[cv.to] = new Date(dateIntervals[pv[cv.range]].to).toISOString();\n }\n return pv;\n }, filters);\n };\n\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf report.reportFiltersService\n *\n * @description\n * Returns a filter object parsed and formatted\n *\n * @param {object} params An object containing the filter params to use\n * @param {array} ranges An array containing date ranges\n * @returns {object} Filter object\n */\n var getFilters = function (params, ranges) {\n var isAssetReport = params.isLocation === true || params.isLocation === false;\n var defaultOrderBy = 'Count/WorkOrders desc';\n if (isAssetReport && ((isEdu && params.returnAverages === 'true') || params.assetRollUp)) {\n defaultOrderBy = 'TotalsWithDescendants/Count/WorkOrders desc';\n }\n if (!isAssetReport && params.orderBy && params.orderBy.indexOf('TotalsWithDescendants') > -1) {\n params.orderBy = null;\n }\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: parseInt(params.pageSize, 10) || parseInt(pagingHelpers.defaults.pageSize, 10),\n orderBy: params.orderBy || defaultOrderBy,\n status: params.status || [],\n purpose: params.purpose || [],\n requestDateFrom: params.requestDateFrom || null,\n requestDateTo: params.requestDateTo || null,\n requestDateRange: params.requestDateRange || null,\n completionDateFrom: params.completionDateFrom || null,\n completionDateTo: params.completionDateTo || null,\n completionDateRange: params.completionDateRange || null,\n dateFrom: params.dateFrom || null,\n dateTo: params.dateTo || null,\n dateRange: params.dateRange || null,\n businessAsset: params.businessAsset || [],\n includeDescendants: params.includeDescendants || null,\n assetRollUp: params.assetRollUp || null,\n workType: params.workType || [],\n assignees: params.assignees || null,\n returnAverages: params.returnAverages === 'true' ? 'true' : 'false',\n isLocation: (params.isLocation === true || params.isLocation === false) ? params.isLocation : null,\n filterId: params.filterId || null\n };\n\n if (isEdu && currentFilter.assetRollUp === null) {\n currentFilter.assetRollUp = 'true';\n }\n currentFilter.status = checkArray(currentFilter.status);\n currentFilter.purpose = checkArray(currentFilter.purpose);\n currentFilter.businessAsset = checkArray(currentFilter.businessAsset);\n currentFilter.workType = checkArray(currentFilter.workType);\n currentFilter = interpretDateRanges(currentFilter, ranges);\n return currentFilter;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf report.reportFiltersService\n *\n * @description\n * Converts a filter object to a useable state by the api\n *\n * @param {object} currentFilter An object containing the filter params to use\n * @param {array} ranges An array containing date ranges\n * @returns {object} Filter object\n */\n var toApiFilter = function (currentFilter, ranges) {\n var filter = getFilters(currentFilter, ranges);\n\n if (filter.status && (filter.status === 'all' || filter.status[0] === 'all')) {\n delete filter.status;\n }\n\n return filter;\n };\n\n /**\n * @ngdoc method\n * @name isFilterApplied\n * @methodOf report.reportFiltersService\n *\n * @description\n * Checks to see if a filter is applied\n *\n * @param {object} filters An object containing the current filters\n * @returns {boolean} A boolean stating whether or not filters are applied\n */\n var isFilterApplied = function (filters) {\n var cloned = angular.copy(filters);\n cloned.status = cloned.status === 'all' ? [] : cloned.status;\n cloned.dateRange = cloned.dateRange === 'all' ? null : cloned.dateRange;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, getFilters({}));\n };\n\n /**\n * @ngdoc method\n * @name compareFilters\n * @methodOf report.reportFiltersService\n *\n * @description\n * Loops through the filters and verifies if any of them have changed\n *\n * @param {object} newFilter An object containing the new filters\n * @param {object} originalFilter An object containing the prior filters\n * @param {array} filtersToCheck An array of filters to check\n * @returns {boolean} A boolean stating whether or not filters have changed\n */\n var compareFilters = function (newFilter, originalFilter, filtersToCheck) {\n var equals = true;\n filtersToCheck.forEach(function (param) {\n equals = equals && angular.equals(newFilter[param], originalFilter[param]);\n });\n return equals;\n };\n\n return {\n getDateRanges: getDateRanges,\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n isFilterApplied: isFilterApplied,\n compareFilters: compareFilters\n };\n });\n\n/**\n * @ngdoc directive\n * @name reportFilters.report-filters\n * @restrict E\n * @description\n *\n * Displays the filter section for the reports\n *\n * @param {object} filters stores the value of all defined filters\n * @param {function} setFunction function reference to set the filters\n * @param {object} openWhen Determines when sliding panel should open\n * @param {function} clearFunction function reference to handle the clear action\n *\n */\n\n'use strict';\n\nangular.module('reportFilters')\n .directive('reportFilters', function ($state, marketizr, market, reportFiltersService) {\n return {\n restrict: 'E',\n replace: true,\n scope: {\n filters: '=',\n setFunction: '&',\n openWhen: '=',\n clearFunction: '&'\n },\n templateUrl: 'app/components/reportFilters/reportFilters.html',\n link: function (scope, element, attrs) {\n var assetToggle = attrs.assetToggle || 'includeDescendants';\n\n scope.market = market;\n scope.dateValues = reportFiltersService.getDateRanges();\n\n // This is setting the correct query parameter name for the report.\n scope.checkbox = {\n state: scope.filters[assetToggle]\n };\n\n scope.assetBrowseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n }\n }\n };\n\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n scope.assetBrowseOptions.filterPanel['asset-category'] = {\n filter: 'isLocation'\n };\n scope.assetHideCheckBox = true;\n scope.filters.assetRollUp = 'true';\n }\n\n if ($state.current.url.indexOf('locations/') !== -1) {\n scope.assetAdditionalFilters = {\n isLocation: true,\n includeDescendants: true\n };\n delete scope.assetBrowseOptions.filterPanel['asset-category'];\n }\n\n if ($state.current.url.indexOf('equipment/') !== -1) {\n scope.assetAdditionalFilters = {\n isLocation: false,\n includeDescendants: true\n };\n scope.assetBrowseOptions.filterPanel['equipment-location'] = { filter: 'parentId' };\n delete scope.assetBrowseOptions.filterPanel['asset-category'];\n }\n\n scope.clearFilters = function (removeMyFilter) {\n scope.cleared = { value: true };\n scope.clearFunction(removeMyFilter);\n };\n\n scope.setFilters = function (value, save) {\n scope.cleared = { value: false };\n scope.setFunction(value, save);\n };\n\n scope.$watch('checkbox.state', function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n scope.filters[assetToggle] = newVal;\n });\n }\n };\n });\n\n'use strict';\n\nangular.module('purposeReport', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'report']);\n\n'use strict';\n\nangular.module('purposeReport')\n .controller('PurposeReportListController', function ($scope, $state, filterStateService, initData, reportFiltersService, purposeReportService, queryHelpers, orderByHelpers) {\n var self = this;\n var queryDefaults = reportFiltersService.getFilters({});\n var pageChanging = false;\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'includeDescendants', 'returnAverages', 'assetRollUp', 'filterId', 'requestDateRange', 'completionDateRange'];\n\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.listData = initData.initResponse.data;\n self.totalListData = initData.totals;\n self.filters = initData.filters;\n var filtersCopy = angular.copy(self.filters);\n\n self.viewWorkOrders = function (id) {\n filtersCopy = angular.copy(self.filters);\n delete filtersCopy.orderBy;\n delete filtersCopy.page;\n delete filtersCopy.pageSize;\n filtersCopy.purpose = id;\n filtersCopy.includeDescendants = filtersCopy.assetRollUp;\n $state.go('secure.workOrderList', filtersCopy);\n };\n\n var setData = function (response) {\n self.listData = response.data;\n self.filterState.totalCount = response.total;\n };\n\n var updateFilters = function () {\n var filtersToCheck = ['purpose', 'status', 'workType', 'requestDateTo', 'requestDateFrom', 'requestDateRange', 'completionDateFrom', 'completionDateTo', 'completionDateRange', 'businessAsset', 'assetRollUp', 'page', 'orderBy', 'returnAverages'];\n if (reportFiltersService.compareFilters(self.filters, filtersCopy, filtersToCheck)) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n filtersCopy = angular.copy(self.filters);\n pageChanging = false;\n\n purposeReportService.loadPurposes(filtersCopy).then(function (purposes) {\n purposeReportService.getListData(filtersCopy, purposes).then(setData);\n });\n\n purposeReportService.getTotalData(filtersCopy).then(function (totals) {\n self.totalListData = totals;\n });\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n self.purposeReportFilter = function () {\n self.openWhen = { value: true };\n };\n\n self.setFilters = function (value, save) {\n self.filters = reportFiltersService.getFilters(value.query);\n filterStateService.setFilters(value, save);\n };\n\n self.clearFilters = function (removeMyFilter) {\n self.filters = reportFiltersService.getFilters(\n {\n orderBy: self.filters.orderBy,\n assetRollUp: self.filters.includeDescendants\n });\n filterStateService.clearFilters(removeMyFilter);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.isFilterApplied = function () {\n return reportFiltersService.isFilterApplied(self.filters);\n };\n\n self.chartRoute = function () {\n $state.go('secure.report.purposeChart', self.filters);\n };\n\n self.export = function () {\n purposeReportService.exportPurposeReport(self.filters);\n };\n\n $scope.$watch('purposeReport.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('purposeReport')\n .controller('PurposeReportChartController', function ($element, $scope, $state, $translate, filterStateService, initData, market, reportChartPrintService, purposeReportService, reportFiltersService, queryHelpers) {\n var self = this;\n var queryDefaults = reportFiltersService.getFilters({});\n var filtersCopy = {};\n var emptyData = {\n dataArray: [['', ''], ['', { v: 0 }]]\n };\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'includeDescendants', 'returnAverages', 'assetRollUp', 'filterId', 'requestDateRange', 'completionDateRange'];\n\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n self.market = market;\n\n self.filters = initData.filters;\n\n self.workOrderLabels = {\n title: $translate.instant('purposeReports.workOrdersBy'),\n yAxis: $translate.instant('reports.byWorkOrders.numberOf')\n };\n\n self.laborHoursLabels = {\n title: $translate.instant('purposeReports.laborHoursBy'),\n yAxis: $translate.instant('reports.byLaborHours.hours')\n };\n\n self.costLabels = {\n title: $translate.instant('purposeReports.costBy'),\n yAxis: $translate.instant('reports.byCost.cost')\n };\n\n self.costLegend = [\n $translate.instant('reports.byCost.purchase'),\n $translate.instant('reports.byCost.service'),\n $translate.instant('reports.byCost.labor')\n ];\n\n self.workOrderChartData = angular.copy(emptyData);\n self.laborChartData = angular.copy(emptyData);\n self.costChartData = angular.copy([['', '', ''], ['', { v: 0 }, { v: 0 }]]);\n\n var updateFilters = function () {\n var filtersToCheck = ['purpose', 'status', 'workType', 'requestDateTo', 'requestDateFrom', 'requestDateRange', 'completionDateFrom', 'completionDateTo', 'completionDateRange', 'businessAsset', 'assetRollUp'];\n if (reportFiltersService.compareFilters(self.filters, filtersCopy, filtersToCheck)) {\n return;\n }\n\n filtersCopy = angular.copy(self.filters);\n\n self.workOrderLabels.title = $translate.instant('purposeReports.workOrdersBy');\n self.laborHoursLabels.title = $translate.instant('purposeReports.laborHoursBy');\n self.costLabels.title = $translate.instant('purposeReports.costBy');\n\n purposeReportService.loadPurposes(self.filters).then(function (purposes) {\n self.workOrderChartData = purposeReportService.workOrderChartData(filtersCopy, purposes, self.workOrderLabels);\n self.laborChartData = purposeReportService.laborChartData(filtersCopy, purposes, self.laborHoursLabels);\n self.costChartData = purposeReportService.costChartData(filtersCopy, purposes, self.costLabels);\n });\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n self.purposeReportFilter = function () {\n self.openWhen = { value: true };\n };\n\n self.setFilters = function (value, save) {\n self.filters = reportFiltersService.getFilters(value.query);\n filterStateService.setFilters(value, save);\n };\n\n self.clearFilters = function (removeMyFilter) {\n self.filters = reportFiltersService.getFilters(\n {\n orderBy: self.filters.orderBy,\n assetRollUp: self.filters.includeDescendants\n });\n filterStateService.clearFilters(removeMyFilter);\n };\n\n self.isFilterApplied = function () {\n return reportFiltersService.isFilterApplied(self.filters);\n };\n\n self.clickFunctionObject = {\n chartFunction: function (id) {\n filtersCopy = angular.copy(self.filters);\n delete filtersCopy.orderBy;\n delete filtersCopy.page;\n delete filtersCopy.pageSize;\n filtersCopy.purpose = id;\n filtersCopy.includeDescendants = filtersCopy.assetRollUp;\n $state.go('secure.workOrderList', filtersCopy);\n }\n };\n\n self.listRoute = function () {\n $state.go('secure.report.purposeList', self.filters);\n };\n\n self.printCharts = function () {\n var chartOne = angular.element($element.find('.work-order-chart svg'))[0].parentNode.innerHTML;\n var chartTwo = angular.element($element.find('.cost-chart svg'))[0].parentNode.innerHTML;\n var chartThree = angular.element($element.find('.labor-hours-chart svg'))[0].parentNode.innerHTML;\n\n var costLegend = $element.find('.cost-chart .chart-legend')[0] && angular.element($element.find('.cost-chart .chart-legend'))[0].parentNode.innerHTML;\n costLegend = costLegend || '';\n chartTwo = costLegend + chartTwo;\n\n if (!chartOne || !chartTwo || !chartThree) {\n return;\n }\n var html = [chartOne, chartTwo, chartThree];\n reportChartPrintService.printCharts(html, self.filters, {\n workOrderChartData: self.workOrderChartData,\n laborHoursChartData: self.laborChartData,\n costChartData: self.costChartData\n }, 'purpose');\n };\n\n $scope.$watch('purposeReport.filters', updateFilters, true);\n });\n\n/**\n * @ngdoc service\n * @name purposeReport.purposeReportService\n * @requires $q - {@link https://docs.angularjs.org/api/ng/service/$q read the docs}\n * @requires $filter - {@link https://docs.angularjs.org/api/ng/service/$filter read the docs}\n * @requires $translate - {@link https://angular-translate.github.io/docs/#/api/pascalprecht.translate.$translate read the docs}\n * @requires $log - {@link https://docs.angularjs.org/api/ng/service/$log read the docs}\n * @requires DudeApi - {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApi.DudeApi read the docs}\n * @requires report.reportFiltersService\n * @requires report.reportTooltipService\n * @requires report.reportDataService\n *\n * @description\n * Service for supporting the gathering and parsing of data for the Purpose Report\n *\n */\n'use strict';\n\nangular.module('purposeReport')\n .service('purposeReportService', function ($q, $filter, $translate, DudeApi, reportFiltersService, reportTooltipService, reportDataService) {\n var CHART_ITEMS_TO_SHOW = 5;\n\n /**\n * @ngdoc method\n * @name loadPurposes\n * @methodOf purposeReport.purposeReportService\n *\n * @description\n * Get the list of purposes.\n *\n * @param {object} filter The object containing the current filters\n */\n var loadPurposes = function (filter) {\n var deferred = $q.defer();\n var purposes = [];\n if (filter.purpose && filter.purpose.length) {\n filter.purpose.forEach(function (purposeId) {\n purposes.push(DudeApi.PurposeEntity.get({ id: purposeId }).$promise);\n });\n $q.all(purposes).then(deferred.resolve, deferred.reject);\n } else {\n deferred.resolve(purposes);\n }\n return deferred.promise;\n };\n\n var getFilters = function (query) {\n var filters = reportFiltersService.toApiFilter(query);\n return filters;\n };\n\n var getData = function (query) {\n var filters = reportFiltersService.toApiFilter(query);\n return DudeApi.PurposesSummaryEntity.query(filters).$promise;\n };\n\n /**\n * @ngdoc method\n * @name getTotalData\n * @methodOf purposeReport.purposeReportService\n *\n * @description\n * Gets the totals data for the list view of work orders by purpose\n *\n * @param {object} query An object containing the filters to query with\n */\n\n var getTotalData = function (query) {\n var filters = reportFiltersService.toApiFilter(query);\n return DudeApi.PurposesTotalEntity.query(filters).$promise;\n };\n\n /**\n * @ngdoc method\n * @name getListData\n * @methodOf purposeReport.purposeReportService\n *\n * @description\n * Gets the data for the list view of work orders by purpose\n *\n * @param {object} query An object containing the filters to query with\n * @param {array} purposes Array of Purposes to return data for\n */\n var getListData = function (query, purposes) {\n return getData(query).then(function (pagedPurposes) {\n purposes.forEach(function (purpose) {\n var matches = $filter('filter')(pagedPurposes.data, function (value) {\n return value.purpose.id === purpose.id;\n }).length;\n\n if (matches) {\n return;\n }\n\n pagedPurposes.count++;\n pagedPurposes.data.push({\n purpose: purpose,\n count: {\n workOrders: 0,\n laborHours: 0\n },\n cost: {\n labor: 0,\n purchase: 0,\n total: 0\n }\n });\n });\n return pagedPurposes;\n });\n };\n\n var fetchStandardChartData = function (filter, purposes, endPoint, textPlural, textSingular, labels) {\n filter = reportFiltersService.toApiFilter(filter);\n filter.pageSize = purposes.length || CHART_ITEMS_TO_SHOW;\n\n var dataObject = {\n idArray: [],\n dataArray: [[$translate.instant('purposeReports.purposes'),\n '', { type: 'string', role: 'tooltip', p: { html: true } }]],\n resolved: false\n };\n\n getData(filter).then(function (results) {\n results.data.forEach(function (summary) {\n var text = summary.count[endPoint] === 1 ? textSingular : textPlural;\n if (summary.count[endPoint] > 0) {\n dataObject.dataArray.push([\n summary.purpose.value,\n { v: summary.count[endPoint], f: $filter('number')(summary.count[endPoint]) + ' ' + text },\n reportTooltipService.standardTooltip(summary.purpose, $filter('number')(summary.count[endPoint]) + ' ' + text)\n ]);\n dataObject.idArray.push(summary.purpose.id);\n }\n });\n\n reportDataService.topLabel(purposes, results, dataObject, labels, 5);\n\n purposes.forEach(function (purpose) {\n if (dataObject.idArray.indexOf(purpose.id) > -1 || dataObject.idArray.length >= filter.pageSize) {\n return;\n }\n\n dataObject.dataArray.push([\n purpose.value,\n { v: 0, f: '0' + textPlural },\n ''\n ]);\n dataObject.idArray.push(purpose.id);\n });\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name workOrderChartData\n * @methodOf purposeReport.purposeReportService\n *\n * @description\n * Returns the number of work order broken down by Purpose.\n *\n * @param {object} filter The object containing the current filters\n * @param {array} purposes Array of Purposes to return data for\n * @param {object} labels The object that contains the labels for the chart\n */\n var workOrderChartData = function (filter, purposes, labels) {\n filter.orderBy = 'Count/WorkOrders desc,Purpose/Value asc';\n\n return fetchStandardChartData(filter, purposes, 'workOrders', $translate.instant('reports.byWorkOrders.workOrders'), $translate.instant('reports.byWorkOrders.workOrder'), labels);\n };\n\n /**\n * @ngdoc method\n * @name laborChartData\n * @methodOf purposeReport.purposeReportService\n *\n * @description\n * Returns the work order labor hours broken down by Purpose.\n *\n * @param {object} filter The object containing the current filters\n * @param {object} purposes Array of Purposes to return data for\n * @param {object} labels The object that contains the labels for the chart\n */\n var laborChartData = function (filter, purposes, labels) {\n filter.orderBy = 'Count/LaborHours desc,Purpose/Value asc';\n\n return fetchStandardChartData(filter, purposes, 'laborHours', $translate.instant('reports.byLaborHours.hours'), $translate.instant('reports.byLaborHours.hour'), labels);\n };\n\n /**\n * @ngdoc method\n * @name costChartData\n * @methodOf purposeReport.purposeReportService\n *\n * @description\n * Returns the work order cost data broken down by Purpose.\n *\n * @param {object} filter The object containing the current filters\n * @param {array} purposes Array of Purposes to return data for\n * @param {object} labels The object that contains the labels for the chart\n */\n var costChartData = function (filter, purposes, labels) {\n filter = reportFiltersService.toApiFilter(filter);\n filter.pageSize = purposes.length || CHART_ITEMS_TO_SHOW;\n filter.orderBy = 'Cost/Total desc,Purpose/Value asc';\n\n var dataObject = {\n idArray: [],\n dataArray: [[$translate.instant('purposeReports.purposes'),\n '', { type: 'string', role: 'tooltip', p: { html: true } },\n '', { type: 'string', role: 'tooltip', p: { html: true } },\n '', { type: 'string', role: 'tooltip', p: { html: true } }]],\n resolved: false\n };\n\n getData(filter).then(function (results) {\n results.data.forEach(function (summary) {\n if (!summary.cost) {\n return;\n }\n\n var laborCost = $filter('currency')(summary.cost.labor) + ' ' + $translate.instant('reports.byCost.labor');\n var purchaseCost = $filter('currency')(summary.cost.purchase) + ' ' + $translate.instant('reports.byCost.purchase');\n var serviceCost = $filter('currency')(summary.cost.service) + ' ' + $translate.instant('reports.byCost.service');\n var totalCost = $filter('currency')(summary.cost.total) + ' ' + $translate.instant('reports.byCost.total');\n\n var tooltip = reportTooltipService.costChartTooltip(summary.purpose, laborCost, purchaseCost, serviceCost, totalCost);\n\n if (summary.cost.total > 0) {\n dataObject.dataArray.push([\n summary.purpose.value,\n { v: summary.cost.purchase, f: laborCost },\n tooltip,\n { v: summary.cost.service, f: serviceCost },\n tooltip,\n { v: summary.cost.labor, f: purchaseCost },\n tooltip\n ]);\n dataObject.idArray.push(summary.purpose.id);\n }\n });\n\n reportDataService.topLabel(purposes, results, dataObject, labels, 5);\n\n purposes.forEach(function (purpose) {\n if (dataObject.idArray.indexOf(purpose.id) > -1 || dataObject.idArray.length >= filter.pageSize) {\n return;\n }\n\n dataObject.dataArray.push([\n purpose.value,\n { v: 0, f: '0' + $translate.instant('reports.byLaborHours.hours') },\n '',\n { v: 0, f: '0' + $translate.instant('reports.byLaborHours.hours') },\n ''\n ]);\n dataObject.idArray.push(purpose.id);\n });\n\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name exportPurposeReport\n * @methodOf purposeReport.purposeReportService\n *\n * @description\n * Exports a csv of work orders by purpose\n *\n * @param {object} query An object containing the filters to query with\n */\n var exportPurposeReport = function (query) {\n var filters = getFilters(query, false);\n reportDataService.exportReport(filters, 'workordersbypurpose');\n };\n\n return {\n loadPurposes: loadPurposes,\n getListData: getListData,\n workOrderChartData: workOrderChartData,\n laborChartData: laborChartData,\n costChartData: costChartData,\n exportPurposeReport: exportPurposeReport,\n getTotalData: getTotalData\n };\n });\n\n'use strict';\n\nangular.module('purposeReport')\n .config(function ($stateProvider, permission, moment, workOrderEnums, dateHelperProvider) {\n var routeParams = 'status&workType&purpose&requestDateTo&requestDateFrom&requestDateRange&completionDateTo&completionDateFrom&completionDateRange&dateRange&businessAsset&includeDescendants&assetRollUp&orderBy&returnAverages&filterId';\n var defaults = {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.complete, workOrderEnums.status.onHold],\n toDate: dateHelperProvider.getEndOfDay(new Date()).toISOString(),\n // The default from date is 7 days in the past so we subtract 7 days worth of milliseconds from now to get the correct date\n fromDate: dateHelperProvider.getStartOfDay(moment().subtract(7, 'days')).toISOString()\n };\n var getActiveSavedFilter = function ($stateParams, myFilters, savedFiltersService) {\n var queryParams = $stateParams;\n if (queryParams.filterId) {\n return savedFiltersService.getFilterIfExistsForUser(queryParams.filterId, myFilters);\n }\n return null;\n };\n var getQueryParams = function ($location, $stateParams, activeSavedFilter, marketizr, market) {\n var defaultCopy = angular.copy(defaults);\n var queryParams = $stateParams;\n queryParams.assetRollUp = queryParams.includeDescendants || queryParams.assetRollUp || null;\n queryParams.includeDescendants = null;\n if (!queryParams.requestDateTo && !queryParams.requestDateFrom && !queryParams.completionDateFrom && !queryParams.completionDateTo && !queryParams.dateRange) {\n queryParams.requestDateTo = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.toDate : dateHelperProvider.getEndOfDay(moment().subtract(1, 'month').endOf('month')).toISOString();\n queryParams.requestDateFrom = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.fromDate : dateHelperProvider.getStartOfDay(moment().subtract(1, 'month').startOf('month')).toISOString();\n }\n if (!queryParams.filterId) {\n queryParams.status = queryParams.status || defaultCopy.status;\n }\n // If requesting a saved filter created for a different page or by a different user, remove the filter id\n if (queryParams.filterId && !activeSavedFilter) {\n delete queryParams.filterId;\n $location.search('filterId', null);\n }\n return queryParams;\n };\n\n $stateProvider\n .state('secure.report.purposeList', {\n url: 'purpose/list?page&pageSize&' + routeParams,\n templateUrl: 'app/components/purposeReport/purposeReportList.html',\n controller: 'PurposeReportListController',\n controllerAs: 'purposeReport',\n permissions: [permission.purposes.create, permission.purposes.update, permission.purposes.delete],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/purpose/list');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $q, $stateParams, activeSavedFilter, marketizr, market, myFilters, purposeReportService, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n queryParams.returnAverages = queryParams.returnAverages || null;\n\n if (!queryParams.orderBy || (queryParams.orderBy && queryParams.orderBy.indexOf('TotalsWithDescendants') > -1)) {\n queryParams.orderBy = 'Count/WorkOrders desc,Purpose/Value asc';\n }\n\n var filters = reportFiltersService.toApiFilter(queryParams);\n\n return $q.all({\n initResponse: purposeReportService.loadPurposes(filters).then(function (purposes) {\n return purposeReportService.getListData(filters, purposes);\n }),\n filters: filters,\n totals: purposeReportService.getTotalData(filters),\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n });\n }\n }\n })\n .state('secure.report.purposeChart', {\n url: 'purpose/chart?' + routeParams,\n templateUrl: 'app/components/purposeReport/purposeReportChart.html',\n controller: 'PurposeReportChartController',\n controllerAs: 'purposeReport',\n permissions: [permission.purposes.create, permission.purposes.update, permission.purposes.delete],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/purpose/chart');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $stateParams, activeSavedFilter, marketizr, market, myFilters, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n var filters = reportFiltersService.getFilters(queryParams);\n\n return {\n filters: filters,\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n };\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('purposePanel', ['ui.router', 'dudeControls', 'dudeApi', 'maintenanceSlidingPanels']);\n\nangular.module('purposePanel')\n .constant('purposePanelVariables', {\n panelName: 'purposePanel'\n });\n\n/**\n * @ngdoc service\n * @name purposePanel.purposePanelService\n * @requires DudeApi\n * @requires purposeDeleteFilterService\n *\n * @description\n * Service for supporting the purposePanel component.\n *\n */\n\n'use strict';\n\nangular.module('purposePanel')\n .service('purposePanelService', function (DudeApi, purposeDeleteFilterService) {\n /**\n * @ngdoc method\n * @name deletePurpose\n * @methodOf purposePanel.purposePanelService\n *\n * @description\n * Deletes the purpose by the passed-in purpose ID.\n *\n * @param {int} purposeId The ID of the purpose that is in need of deleting.\n * @returns {object} The result from the API.\n */\n var deletePurpose = function (purposeId) {\n return DudeApi.PurposeEntity.delete({ id: purposeId });\n };\n\n /**\n * @ngdoc method\n * @name addPurpose\n * @methodOf purposePanel.purposePanelService\n *\n * @description\n * Adds the purpose that is passed in.\n *\n * @param {object} purpose The purpose being added.\n * @returns {object} The result from the API.\n */\n var addPurpose = function (purpose) {\n return DudeApi.PurposeEntity.save(purpose);\n };\n\n /**\n * @ngdoc method\n * @name updatePurpose\n * @methodOf purposePanel.purposePanelService\n *\n * @description\n * Updates the purpose that is passed in.\n *\n * @param {object} purpose The purpose being updated.\n * @returns {object} The result from the API.\n */\n var updatePurpose = function (purpose) {\n return DudeApi.PurposeEntity.update({ id: purpose.id }, purpose);\n };\n\n /**\n * @ngdoc method\n * @name workOrderCount\n * @methodOf purposePanel.purposePanelService\n *\n * @description\n * Grabs all work orders associated to the purpose that is passed in.\n *\n * @param {int} purposeId The ID of the purpose being checked.\n * @returns {object} The result from the API.\n */\n var workOrderCount = function (purposeId) {\n var filter = purposeDeleteFilterService.toApiFilter({ id: purposeId });\n\n return DudeApi.WorkOrderEntity.query(filter).$promise.then(function (workOrders) {\n return workOrders.total;\n });\n };\n\n /**\n * @ngdoc method\n * @name workOrderTemplateCount\n * @methodOf purposePanel.purposePanelService\n *\n * @description\n * Grabs all work order templates associated to the purpose that is passed in.\n *\n * @param {int} purposeId The ID of the purpose being checked.\n * @returns {object} The result from the API.\n */\n var workOrderTemplateCount = function (purposeId) {\n var filter = purposeDeleteFilterService.toApiFilter({ id: purposeId });\n\n return DudeApi.WorkOrderTemplateEntity.query(filter).$promise.then(function (workOrderTemplates) {\n return workOrderTemplates.total;\n });\n };\n\n /**\n * @ngdoc method\n * @name getPurposeTypes\n * @methodOf purposeList.purposeListService\n *\n * @description\n * Queries the purpose type entity for a list of purposes\n *\n * @returns {Promise} A promise that resolves to the list of purpose types\n */\n var getPurposeTypes = function () {\n return DudeApi.PurposeTypeEntity.query().$promise;\n };\n\n return {\n deletePurpose: deletePurpose,\n addPurpose: addPurpose,\n updatePurpose: updatePurpose,\n workOrderCount: workOrderCount,\n workOrderTemplateCount: workOrderTemplateCount,\n getPurposeTypes: getPurposeTypes\n\n };\n });\n\n/**\n * @ngdoc directive\n * @name purposePanel.purposePanel\n * @restrict E\n * @description\n *\n * The panel that allows the user to edit/create/delete purposes.\n *\n * @param {array} purposes Array of purposes.\n * @param {int} totalCount The total number of purposes\n */\n\n'use strict';\n\nangular.module('purposePanel')\n .component('purposePanel', {\n templateUrl: 'app/components/purposePanel/purposePanel.html',\n bindings: {\n purposes: '=',\n totalCount: '='\n },\n controllerAs: 'purposePanel',\n controller: 'PurposePanelController'\n }).controller('PurposePanelController', function ($q, $stateParams, $uibModal, $translate, $timeout, log, maintenanceSlidingPanelsService, purposePanelService, purposePanelVariables, purposeListService, pmAssociationsService) {\n var self = this;\n var workOrderCount;\n var workOrderTemplateCount;\n\n var showDeleteMessage = function () {\n log.notify({\n title: $translate.instant('purposePanel.notify.delete.title'),\n type: 'success',\n message: $translate.instant('purposePanel.notify.delete.message')\n });\n };\n\n var confirmDelete = function (fromSaveInactive) {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/purposePanel/purposeDeleteConfirmModal.html',\n controller: 'PurposeDeleteModalController',\n controllerAs: 'purposeDeleteModalController',\n size: 'sm',\n backdrop: 'static',\n resolve: {\n workOrderCount: function () {\n return '';\n },\n workOrderTemplateCount: function () {\n return '';\n },\n purpose: function () {\n return self.purpose;\n },\n fromSaveInactive: function () {\n return fromSaveInactive;\n }\n }\n });\n\n return $q(function (resolve) {\n modalInstance.result.then(function () {\n return purposePanelService.deletePurpose(self.purpose.id).$promise.then(function () {\n resolve();\n });\n });\n });\n };\n\n var deleteWarning = function (count, templateCount, fromSaveInactive) {\n $uibModal.open({\n templateUrl: 'app/components/purposePanel/purposeDeleteWarningModal.html',\n controller: 'PurposeDeleteModalController',\n controllerAs: 'purposeDeleteModalController',\n size: 'md',\n backdrop: 'static',\n resolve: {\n workOrderCount: function () {\n return count;\n },\n workOrderTemplateCount: function () {\n return templateCount;\n },\n purpose: function () {\n return self.purpose;\n },\n fromSaveInactive: function () {\n return fromSaveInactive;\n }\n }\n });\n };\n\n var setSelectedNull = function () {\n // Waits for panel to close\n $timeout(function () {\n self.selected = null;\n }, 500);\n };\n\n var setUpEditPanel = function () {\n self.titles = { title: $translate.instant('purposePanel.editTitle') };\n\n self.purposeTypes.some(function (purposeType, index) {\n if (self.purpose.purposeType && purposeType.id === self.purpose.purposeType.id) {\n self.selected = self.purposeTypes[index];\n\n return true;\n }\n\n return false;\n });\n self.buttonFunctions.deleteFunction = function () {\n if (workOrderCount === 0 && workOrderTemplateCount === 0 && !self.purpose.isDefault) {\n return $q(function (resolve, reject) {\n confirmDelete().then(function () {\n purposeListService.getListData($stateParams).$promise.then(function (purposes) {\n self.purposes = purposes.data;\n self.totalCount = purposes.total;\n showDeleteMessage();\n setSelectedNull();\n resolve();\n });\n }).catch(function () {\n reject();\n });\n });\n }\n\n return $q(function (resolve, reject) {\n deleteWarning(workOrderCount, workOrderTemplateCount, false);\n reject();\n });\n };\n };\n\n self.$onInit = function () {\n maintenanceSlidingPanelsService.initializeService();\n $timeout(function () {\n purposePanelService.getPurposeTypes().then(function (purposeTypes) {\n self.purposeTypes = purposeTypes.data;\n });\n\n self.setPurposeType = function () {\n self.purpose.purposeType = self.selected;\n };\n\n self.buttonFunctions = {\n saveFunction: function () {\n return $q(function (resolve, reject) {\n if (self.isNew) {\n purposePanelService.addPurpose(self.purpose).$promise.then(function () {\n purposeListService.getListData($stateParams).$promise.then(function (purposes) {\n self.purposes = purposes.data;\n self.totalCount = purposes.total;\n log.notify({\n title: $translate.instant('purposePanel.notify.success.title'),\n type: 'success',\n message: $translate.instant('purposePanel.notify.success.message')\n });\n setSelectedNull();\n resolve();\n });\n }).catch(function () {\n reject();\n });\n } else if (!self.isNew && self.purpose.isDefault && !self.purpose.isActive) {\n deleteWarning(null, null, true);\n reject();\n } else {\n purposePanelService.updatePurpose(self.purpose).$promise.then(function () {\n purposeListService.getListData($stateParams).$promise.then(function (purposes) {\n self.purposes = purposes.data;\n self.totalCount = purposes.total;\n log.notify({\n title: $translate.instant('purposePanel.notify.success.title'),\n type: 'success',\n message: $translate.instant('purposePanel.notify.success.message')\n });\n setSelectedNull();\n resolve();\n });\n }).catch(function () {\n reject();\n });\n }\n });\n },\n cancelFunction: function () {\n setSelectedNull();\n self.saveAttempt = false;\n }\n };\n\n maintenanceSlidingPanelsService.subscribe(purposePanelVariables.panelName, function (options) {\n self.purpose = angular.copy(options.purpose);\n self.isNew = !self.purpose.id;\n if (!self.isNew) {\n var promises = [];\n promises.push(purposePanelService.workOrderCount(self.purpose.id).then(function (workOrders) {\n workOrderCount = workOrders;\n }));\n promises.push(purposePanelService.workOrderTemplateCount(self.purpose.id).then(function (workOrderTemplates) {\n workOrderTemplateCount = workOrderTemplates;\n }));\n $q.all(promises).then(function () {\n self.openWhen = true;\n setUpEditPanel();\n });\n\n pmAssociationsService.isAssociated({ purpose: self.purpose.id }).then(function (result) {\n self.associations = result.total;\n self.associationsValidation = pmAssociationsService.validationMessage($translate.instant('purposePanel.purpose'), self.associations);\n });\n } else {\n self.openWhen = true;\n self.titles = { title: $translate.instant('purposePanel.newTitle') };\n self.selected = null;\n delete self.buttonFunctions.deleteFunction;\n }\n });\n });\n };\n });\n\n'use strict';\n\nangular.module('purposePanel')\n .controller('PurposeDeleteModalController', function ($uibModalInstance, $translate, workOrderCount, workOrderTemplateCount, purpose, fromSaveInactive) {\n var self = this;\n\n self.workOrderCount = workOrderCount;\n self.workOrderTemplateCount = workOrderTemplateCount;\n self.purpose = purpose;\n self.fromSaveInactive = fromSaveInactive;\n\n self.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n self.ok = function () {\n $uibModalInstance.close();\n };\n\n self.getTitle = function () {\n if (self.fromSaveInactive) {\n return $translate.instant('purposePanel.deleteModal.cannotInactivateTitle');\n }\n return $translate.instant('purposePanel.deleteModal.title');\n };\n });\n\n/**\n * @ngdoc service\n * @name purposePanel.purposeDeleteFilterService\n *\n * @description\n * Service for supporting filtering by purpose.\n *\n */\n\n'use strict';\n\nangular.module('purposePanel')\n .service('purposeDeleteFilterService', function () {\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf purposePanel.purposeDeleteFilterService\n *\n * @description\n * Returns the updated filter.\n *\n * @param {object} filter The untouched filters object.\n * @returns {object} filters The updated filters object.\n */\n var toApiFilter = function (filter) {\n var filters = {\n purpose: filter.id\n };\n return filters;\n };\n\n return {\n toApiFilter: toApiFilter\n };\n });\n\n'use strict';\n\nangular.module('purposeList', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'helpers', 'translate', 'purposePanel', 'maintenanceSlidingPanels']);\n\n/**\n * @ngdoc service\n * @name purposeList.purposeListFilterService\n *\n * @description\n * Service for supporting filtering by purpose.\n *\n */\n\n'use strict';\n\nangular.module('purposeList')\n .factory('purposeListFilterService', function ($location, DudeApi, pagingHelpers) {\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf purposeList.purposeListFilterService\n *\n * @description\n * Returns the updated filter.\n *\n * @param {object} params The untouched filters object.\n * @returns {object} The updated filters object.\n */\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Value asc',\n q: params.q || null,\n isActive: params.isActive || null,\n purposeTypeId: params.purposeTypeId || null\n };\n\n return currentFilter;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf purposeList.purposeListFilterService\n *\n * @description\n * Returns the updated filter.\n *\n * @param {object} currentFilter The untouched filters object.\n * @returns {object} The updated filters object.\n */\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter\n };\n });\n\n/**\n * @ngdoc service\n * @name purposeList.purposeListService\n * @requires DudeApi\n * @requires purposeList.purposeListFilterService\n *\n * @description\n * Service for supporting the purpose list\n *\n */\n\n'use strict';\n\nangular.module('purposeList')\n .service('purposeListService', function (DudeApi, purposeListFilterService) {\n /**\n * @ngdoc method\n * @name getListData\n * @methodOf purposeList.purposeListService\n *\n * @description\n * Queries the purpose entity for a list of purposes\n *\n * @param {object} query The filters object used to query the purpose entity with\n * @returns {Promise} A promise that resolves to the paged wrapper of purposes\n */\n var getListData = function (query) {\n var filters = purposeListFilterService.toApiFilter(query);\n return DudeApi.PurposeEntity.query(filters);\n };\n\n return {\n getListData: getListData\n };\n });\n\n'use strict';\n\nangular.module('purposeList')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.purposeList', {\n url: 'purposes?page&pageSize&q&isActive&purposeTypeId',\n templateUrl: 'app/components/purposeList/purposeList.html',\n controller: 'PurposeListController',\n controllerAs: 'purposeList',\n permissions: [permission.purposes.create, permission.purposes.update, permission.purposes.delete],\n resolve: {\n initData: function ($q, $stateParams, defaultPurposesService, purposeListService, purposeListFilterService) {\n var queryParams = $stateParams;\n var filters = purposeListFilterService.getFilters(queryParams);\n return $q.all({\n initResponse: purposeListService.getListData(filters).$promise,\n filters: filters,\n reactiveDefault: defaultPurposesService.getPurpose(defaultPurposesService.purposeKeys.reactivePurpose),\n plannedDefault: defaultPurposesService.getPurpose(defaultPurposesService.purposeKeys.plannedPurpose)\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('purposeList')\n .controller('PurposeListController', function ($scope, $state, purposeListService, purposeListFilterService, purposePanelVariables, maintenanceSlidingPanelsService, queryHelpers, orderByHelpers, initData) {\n var self = this;\n var queryDefaults = purposeListFilterService.getFilters({});\n var pageChanging = false;\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n purposeListService.getListData(self.filters).$promise.then(setData);\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n // view model\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.totalCount = initData.initResponse.total;\n self.listData = initData.initResponse.data;\n self.reactiveDefault = initData.reactiveDefault;\n self.plannedDefault = initData.plannedDefault;\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.isActive = cloned.isActive !== '' ? cloned.isActive : null;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, purposeListFilterService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.openPurposePanel = function (isNew, purpose) {\n if (isNew) {\n purpose = {\n isActive: true\n };\n } else {\n purpose.isDefault = (purpose.id === self.reactiveDefault.id) || (purpose.id === self.plannedDefault.id);\n }\n\n maintenanceSlidingPanelsService.openPanel(purposePanelVariables.panelName, { purpose: purpose });\n };\n\n self.clearFilters = function () {\n self.filters = purposeListFilterService.getFilters({});\n };\n\n $scope.$watch('purposeList.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('projectList', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'helpers', 'translate']);\n\n/**\n * @ngdoc service\n * @name projectList.projectListFilterService\n * @requires DudeApi\n *\n * @description\n * Service for filtering the project list\n *\n */\n\n'use strict';\n\nangular.module('projectList')\n .factory('projectListFilterService', function ($location, pagingHelpers) {\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf projectList.projectListFilterService\n *\n * @description\n * Gets the filter object for projects\n *\n * @param {object} params The params to convert into the filters object\n * @returns {object} The filter object to use\n */\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Name asc',\n q: params.q || null\n };\n\n return currentFilter;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf projectList.projectListFilterService\n *\n * @description\n * Gets the filter object for projects\n *\n * @param {object} currentFilter The currentFilter to convert into the filters object\n * @returns {object} The filter object to use\n */\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter\n };\n });\n\n/**\n * @ngdoc service\n * @name projectList.projectListService\n * @requires DudeApi\n *\n * @description\n * Service for supporting the project list\n *\n */\n\n'use strict';\n\nangular.module('projectList')\n .service('projectListService', function (DudeApi) {\n /**\n * @ngdoc method\n * @name getListData\n * @methodOf projectList.projectListService\n *\n * @description\n * Queries the project entity for a list of projects\n *\n * @param {object} query The filters object used to query the project entity with\n * @returns {Promise} A promise that resolves to the paged wrapper of projects\n */\n var getListData = function (query) {\n return DudeApi.ProjectEntity.query(query);\n };\n\n return {\n getListData: getListData\n };\n });\n\n'use strict';\n\nangular.module('projectList')\n .config(function ($stateProvider, market, permission) {\n $stateProvider\n .state('secure.projectList', {\n url: 'projects?page&pageSize&q&orderBy',\n templateUrl: 'app/components/projectList/projectList.html',\n controller: 'ProjectListController',\n controllerAs: 'projectList',\n permissions: [permission.projects.create, permission.projects.update, permission.projects.delete],\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n initData: function ($q, $stateParams, projectListService, projectListFilterService) {\n var queryParams = $stateParams;\n var filters = projectListFilterService.getFilters(queryParams);\n return $q.all({\n initResponse: projectListService.getListData(filters).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('projectList')\n .controller('ProjectListController', function ($scope, $state, queryHelpers, projectListService, projectListFilterService, initData) {\n var self = this;\n var queryDefaults = projectListFilterService.getFilters({});\n var pageChanging = false;\n\n // view model\n self.totalCount = initData.initResponse.total;\n self.listData = initData.initResponse.data;\n self.filters = initData.filters;\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n projectListService.getListData(self.filters).$promise.then(setData);\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.clearFilters = function () {\n self.filters = projectListFilterService.getFilters({});\n };\n\n $scope.$watch('projectList.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('projectForm', ['ui.router', 'ui.bootstrap', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'dudeLog', 'maintenanceConstants']);\n\n'use strict';\n\nangular.module('projectForm')\n .config(function ($stateProvider, market, permission) {\n $stateProvider\n .state('secure.projectCreate', {\n url: 'projects/new',\n templateUrl: 'app/components/projectForm/projectForm.html',\n controller: 'ProjectFormController',\n controllerAs: 'projectForm',\n permissions: permission.projects.create,\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n project: function (DudeApi) {\n return new DudeApi.ProjectEntity({ isActive: true });\n }\n }\n })\n .state('secure.projectEdit', {\n url: 'projects/:id',\n templateUrl: 'app/components/projectForm/projectForm.html',\n controller: 'ProjectFormController',\n controllerAs: 'projectForm',\n permissions: permission.projects.update,\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n project: function ($stateParams, DudeApi) {\n return DudeApi.ProjectEntity.get({ id: $stateParams.id, includeDetails: true }).$promise;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('projectForm')\n .controller('ProjectFormController', function ($scope, $state, log, workOrderEnums, $translate, project) {\n var self = this;\n var barStates = {\n danger: 'danger',\n warning: 'warning',\n success: 'success'\n };\n self.project = project;\n self.activeProject = angular.copy(project.isActive);\n var emptyCost = {\n purchase: 0,\n labor: 0,\n service: 0,\n total: 0\n };\n\n var skipNavigationWarningModal = function () {\n self.skipNavigationWarning = true;\n };\n\n self.totalCost = project.workOrders ? project.workOrders.totalCost : emptyCost;\n\n self.workOrderCount = project.workOrders ? project.workOrders.workOrderCount : 0;\n self.workOrderFilters = {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.complete]\n };\n\n if (project.id) {\n self.workOrderFilters.project = project.id;\n }\n\n self.saveProject = function () {\n var promise = project.id ? project.$update({ id: project.id }) : project.$save();\n\n promise.then(function (result) {\n self.activeProject = angular.copy(project.isActive);\n skipNavigationWarningModal();\n log.notify({\n title: $translate.instant('projectForm.notify.success.title'),\n type: 'success',\n message: $translate.instant('projectForm.notify.success.message')\n });\n\n $state.go('secure.projectEdit', { id: result.id });\n });\n };\n\n $scope.$watch('projectForm.project.budgetedAmount', function (newVal) {\n self.budget = angular.copy(newVal) || 0;\n\n if (typeof self.budget === 'string') {\n self.budget = parseFloat(self.budget.replace(/,/g, ''));\n }\n\n if (self.totalCost.total > self.budget) {\n self.barState = barStates.danger;\n self.barValue = 100;\n } else if (self.budget === 0) {\n self.barState = barStates.success;\n self.barValue = 0;\n } else if (self.totalCost.total === self.budget) {\n self.barState = barStates.warning;\n self.barValue = 100;\n } else {\n self.barValue = (self.totalCost.total / self.budget) * 100;\n self.barState = self.barValue > 80 ? barStates.warning : barStates.success;\n }\n self.budgetRemainder = self.budget - self.totalCost.total;\n });\n });\n\n\n'use strict';\n\nangular.module('pmScheduleRecurrence', []);\n\n/**\n * @ngdoc directive\n * @name pmScheduleRecurrence.pmscheduleRecurrence\n * @restrict E\n * @description\n *\n * Generates the sliding panel that houses the recurrence pattern\n *\n * @param {boolean} openWhen Opens the sliding panel when true\n * @param {object} schedule The schedule to add the pattern to\n *\n */\n\n'use strict';\n\nangular.module('pmScheduleRecurrence')\n .component('pmscheduleRecurrence', {\n templateUrl: 'app/components/pmScheduleRecurrence/pmScheduleRecurrence.html',\n controller: 'PmScheduleRecurrenceController',\n controllerAs: 'pmScheduleRecurrence',\n bindings: {\n openWhen: '=',\n schedule: '='\n }\n })\n .controller('PmScheduleRecurrenceController', function ($scope, $q, $translate) {\n var self = this;\n self.titles = { title: $translate.instant('pmScheduleRecurrence.scheduling') };\n\n self.slidingButtons = {\n saveFunction: function () {\n self.schedule.recurrencePattern = self.scheduleType !== 'metered' ? angular.copy(self.recurrencePatternModel) : null;\n self.schedule.scheduleType = angular.copy(self.scheduleType);\n self.schedule.meterInterval = angular.copy(self.meterInterval);\n\n return $q(function (resolve) {\n resolve();\n });\n },\n saveButtonText: $translate.instant('pmScheduleRecurrence.add')\n };\n\n $scope.$watch('pmScheduleRecurrence.openWhen', function (newVal) {\n if (!newVal) {\n return;\n }\n\n self.scheduleType = angular.copy(self.schedule.scheduleType);\n self.recurrencePatternModel = angular.copy(self.schedule.recurrencePattern);\n self.meterInterval = angular.copy(self.schedule.meterInterval);\n });\n });\n\n'use strict';\n\nangular.module('pmScheduleMeterReading', ['dudeApi', 'dudeAuth']);\n\n/**\n * @ngdoc directive\n * @name pmScheduleAssets.pmScheduleMeterReading\n * @restrict E\n * @description\n *\n * Generates the sliding panel that houses the Starting Intervals for metered assets\n *\n * @param {boolean} openWhen Opens the sliding panel when true\n * @param {object} schedule The schedule with metered assets on which to add starting thresholds\n *\n */\n\n'use strict';\n\nangular.module('pmScheduleMeterReading')\n .component('pmScheduleMeterReading', {\n templateUrl: 'app/components/pmScheduleMeterReading/pmScheduleMeterReading.html',\n controller: 'pmScheduleMeterReadingController',\n controllerAs: 'pmScheduleMeterReading',\n bindings: {\n openWhen: '=',\n schedule: '='\n }\n })\n .controller('pmScheduleMeterReadingController', function ($scope, $q, $translate, DudeApi, pmScheduleType) {\n var self = this;\n self.scheduleTypes = pmScheduleType;\n self.titles = { title: $translate.instant('pmScheduleMeterReading.panelTitle') };\n\n self.slidingButtons = {\n saveFunction: function () {\n self.meteredAssets.forEach(function (asset) {\n asset.startingThreshold = asset.meteredAttribute.value;\n });\n\n self.schedule.businessAssets = angular.copy(self.meteredAssets);\n\n return $q(function (resolve) {\n resolve();\n });\n },\n saveButtonText: $translate.instant('pmScheduleMeterReading.done')\n };\n\n self.browseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'business-asset-type': {\n filter: 'businessAssetTypeId'\n }\n\n }\n };\n\n $scope.$watch('pmScheduleMeterReading.openWhen', function (newVal) {\n if (!newVal) {\n return;\n }\n\n self.meteredAssets = angular.copy(self.schedule.businessAssets).filter(function (asset) {\n return asset.isMetered;\n });\n\n self.notMeteredAssets = angular.copy(self.schedule.businessAssets).filter(function (asset) {\n return !asset.isMetered;\n });\n\n self.isMetered = self.schedule && (self.schedule.scheduleType === self.scheduleTypes.METERED || self.schedule.scheduleType === self.scheduleTypes.MIXED);\n\n self.meteredAssets.forEach(function (asset) {\n DudeApi.BusinessAssetAttributeEntity.query({\n businessAssetId: asset.id,\n attributeTypeKey: 'meter'\n }).$promise.then(function (result) {\n asset.meteredAttribute = result.data.filter(function (attribute) { return attribute.isMetered; })[0];\n asset.meteredAttribute.value = asset.startingThreshold || '';\n });\n });\n });\n });\n\n'use strict';\n\nangular.module('pmScheduleList', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'pmScheduleFilters']);\n\n'use strict';\n\nangular.module('pmScheduleList')\n .service('pmScheduleListService', function (DudeApi, pmScheduleFiltersService) {\n var getListData = function (query) {\n var filters = pmScheduleFiltersService.toApiFilter(query);\n return DudeApi.WorkOrderTemplateEntity.query(filters);\n };\n return {\n getListData: getListData\n };\n });\n\n'use strict';\n\nangular.module('pmScheduleList')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.pmScheduleList', {\n url: 'pmschedules?page&pageSize&q&isActive&businessAssets&pmScheduleTypes&purpose',\n templateUrl: 'app/components/pmScheduleList/pmScheduleList.html',\n controller: 'PmScheduleListController',\n controllerAs: 'pmScheduleList',\n permissions: [permission.pmSchedules.create, permission.pmSchedules.update, permission.pmSchedules.delete],\n resolve: {\n initData: function ($q, $stateParams, pmScheduleListService, pmScheduleFiltersService) {\n var queryParams = $stateParams;\n var filters = pmScheduleFiltersService.getFilters(queryParams);\n\n return $q.all({\n initResponse: pmScheduleListService.getListData(filters).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('pmScheduleList')\n .controller('PmScheduleListController', function ($scope, $state, queryHelpers, orderByHelpers, marketizr, market, pmScheduleListService, pmScheduleFiltersService, initData) {\n var self = this;\n var queryDefaults = pmScheduleFiltersService.getFilters({});\n var pageChanging = false;\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n pmScheduleListService.getListData(self.filters).$promise.then(setData);\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n // view model\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.totalCount = initData.initResponse.total;\n self.listData = initData.initResponse.data;\n\n self.assetBrowseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n },\n 'asset-category': {\n filter: 'isLocation'\n }\n }\n };\n\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n self.assetHideCheckBox = true;\n self.filters.includeDescendants = true;\n }\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.isActive = cloned.isActive !== '' ? cloned.isActive : null;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, pmScheduleFiltersService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.editPmSchedule = function (workOrderTemplate) {\n $state.go('secure.pmScheduleEdit', {\n id: workOrderTemplate.id\n });\n };\n\n self.clearFilters = function () {\n self.filters = pmScheduleFiltersService.getFilters({});\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n self.filters.includeDescendants = true;\n }\n };\n\n $scope.$watch('pmScheduleList.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('pmScheduleForm', ['ui.router', 'ui.bootstrap', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'dudeLog', 'duScroll', 'pmSchedule', 'taskBookSelect']);\n\n'use strict';\n\nangular.module('pmScheduleForm')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.pmScheduleCreate', {\n url: 'pmschedules/new',\n templateUrl: 'app/components/pmScheduleForm/pmScheduleForm.html',\n controller: 'PmScheduleFormController',\n controllerAs: 'pmScheduleForm',\n permissions: permission.pmSchedules.create,\n resolve: {\n workOrderTemplate: function (DudeApi, defaultPurposesService) {\n return defaultPurposesService.getPurpose(defaultPurposesService.purposeKeys.plannedPurpose)\n .then(function (_purpose) {\n return new DudeApi.WorkOrderTemplateEntity({\n priority: 2,\n purpose: _purpose,\n dueDateOffset: 1\n });\n });\n },\n schedules: function () {\n return {\n data: []\n };\n },\n workOrderCount: function () {\n return 0;\n }\n }\n })\n .state('secure.pmScheduleEdit', {\n url: 'pmschedules/:id',\n templateUrl: 'app/components/pmScheduleForm/pmScheduleForm.html',\n controller: 'PmScheduleFormController',\n controllerAs: 'pmScheduleForm',\n permissions: permission.pmSchedules.update,\n resolve: {\n workOrderTemplate: function ($stateParams, DudeApi) {\n var taskBook;\n return DudeApi.WorkOrderTemplateEntity.get({ id: $stateParams.id }).$promise\n .then(function (template) {\n if (!template.taskBookId) {\n return template;\n }\n return DudeApi.TaskBookEntity.get({ id: template.taskBookId }).$promise\n .then(function (_taskBook) {\n taskBook = _taskBook;\n return DudeApi.TaskBookTaskEntity.query({\n taskBookId: _taskBook.id,\n orderBy: 'Order asc'\n }).$promise;\n })\n .then(function (_taskBookSummary) {\n taskBook.tasks = _taskBookSummary.data;\n template.taskBook = taskBook;\n return template;\n });\n });\n },\n schedules: function ($stateParams, DudeApi) {\n return DudeApi.PmScheduleEntity.query({ workOrderTemplate: $stateParams.id }).$promise;\n },\n workOrderCount: function ($stateParams, DudeApi) {\n return DudeApi.WorkOrderEntity.get({ workOrderTemplate: $stateParams.id, pageSize: 1 }).$promise.then(function (response) {\n return response.total;\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('pmScheduleForm')\n .controller('PmScheduleFormController', function ($scope, $q, $state, log, $uibModal, $translate, $document, DudeApi, workOrderTemplate, workOrderCount, schedules, market, pmScheduleHelper) {\n var self = this;\n var startingTaskBook = angular.copy(workOrderTemplate.taskBook) || [];\n\n self.market = market;\n self.workOrderTemplate = workOrderTemplate;\n self.skipNavigationWarning = false;\n self.spies = [];\n self.schedules = schedules.data;\n self.schedulesToDelete = [];\n\n var skipNavigationWarningModal = function () {\n self.skipNavigationWarning = true;\n };\n\n var saveSuccess = function () {\n skipNavigationWarningModal();\n\n log.notify({\n title: $translate.instant('pmScheduleForm.notify.success.title'),\n type: 'success',\n message: $translate.instant('pmScheduleForm.notify.success.message')\n });\n\n $state.go('secure.pmScheduleList');\n };\n\n var saveTaskBook = function (taskBook, template) {\n // Save Task Book\n if (self.taskBookLinkId) {\n template.taskBookId = self.taskBookLinkId;\n\n return [template.$update({ id: template.id }).$promise];\n }\n\n var _taskBook = angular.copy(taskBook);\n\n if (taskBook && (taskBook.tasks.length === 0 || (taskBook.tasks.length > 0 && (taskBook.tasks[0].title == null || taskBook.tasks[0].title === '')))) {\n // This deletes a task book that is not a master task book and doesnt have any tasks assigned to it\n if (taskBook.id) {\n template.taskBookId = null;\n return template.$update({ id: template.id }).then(function () {\n return taskBook.$delete({ id: _taskBook.id });\n });\n // This will stop the saving process so that we dont save a blank taskbook with out tasks\n }\n return undefined; // fix eslint consistent return message\n }\n\n // Save/update the taskbook and its tasks\n var taskBookPromise = _taskBook.id ? taskBook.$update({ id: _taskBook.id }) : taskBook.$save();\n\n return taskBookPromise.then(function (_savedTaskBook) {\n var taskBookPromises = [];\n\n workOrderTemplate.taskBookId = _savedTaskBook.id;\n taskBookPromises.push(template.$update({ id: template.id }).$promise);\n\n // delete tasks\n self.tasksToDelete.forEach(function (taskToDelete) {\n if (taskToDelete.id) {\n var deleteTaskPromise = taskToDelete.$delete({\n id: taskToDelete.id,\n taskBookId: _savedTaskBook.id\n });\n\n taskBookPromises.push(deleteTaskPromise);\n }\n });\n\n // add tasks\n _taskBook.tasks.forEach(function (task, i) {\n task.order = i + 1; // Make sure this is correct in the future\n\n // Check to see if the task has changed and if not then dont make the call\n if (!angular.equals(task, startingTaskBook.task) && task.title) {\n var addTasksPromise = task.id ? task.$update({\n taskBookId: _savedTaskBook.id,\n id: task.id\n }) : task.$save({ taskBookId: _savedTaskBook.id });\n\n taskBookPromises.push(addTasksPromise);\n }\n });\n\n return taskBookPromises; // $q.all();\n });\n };\n\n var deleteSchedules = function () {\n if (self.schedulesToDelete.length > 0) {\n return self.schedulesToDelete.map(function (id) {\n return DudeApi.PmScheduleEntity.delete({ id: id }).$promise;\n });\n }\n return [];\n };\n\n self.save = function () {\n if (!self.schedules || !pmScheduleHelper.scheduleIsValid(self.schedules[self.schedules.length - 1])) {\n return;\n }\n\n $q.all(deleteSchedules()).then(function () {\n // save workorder template\n var taskBook = angular.copy(workOrderTemplate.taskBook);\n var workOrderTemplatePromise = workOrderTemplate.id ? workOrderTemplate.$update({ id: workOrderTemplate.id }) : workOrderTemplate.$save();\n\n workOrderTemplatePromise.then(function (savedWorkOrderTemplate) {\n // save the schedules\n var promises = self.schedules.map(function (schedule) {\n schedule.workOrderTemplateId = schedule.workOrderTemplateId || savedWorkOrderTemplate.id;\n\n return schedule.id ? schedule.$update({ id: schedule.id }) : schedule.$save();\n });\n\n if (taskBook) {\n promises.concat(saveTaskBook(taskBook, savedWorkOrderTemplate));\n }\n\n $q.all(promises).then(function () {\n saveSuccess();\n });\n });\n });\n };\n\n // DELETE\n var showDeleteMessage = function () {\n log.notify({\n title: $translate.instant('pmScheduleDelete.notify.delete.title'),\n type: 'success',\n message: $translate.instant('pmScheduleDelete.notify.delete.message')\n });\n };\n\n var confirmDelete = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/pmScheduleForm/pmScheduleDeleteConfirmModal.html',\n controller: 'PmScheduleDeleteModalController',\n size: 'sm',\n resolve: {\n workOrderCount: function () {\n return workOrderCount;\n }\n },\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n $q.all(deleteSchedules()).then(function () {\n self.workOrderTemplate.$delete({ id: self.workOrderTemplate.id }).then(function () {\n skipNavigationWarningModal();\n showDeleteMessage();\n $state.go('secure.pmScheduleList');\n });\n });\n });\n };\n\n var deleteWarning = function () {\n $uibModal.open({\n templateUrl: 'app/components/pmScheduleForm/pmScheduleDeleteWarningModal.html',\n controller: 'PmScheduleDeleteModalController',\n size: 'md',\n backdrop: 'static',\n resolve: {\n workOrderCount: function () {\n return workOrderCount;\n }\n }\n });\n };\n\n self.deletePmSchedule = function () {\n if (self.schedules.length > 0 || workOrderCount > 0) {\n deleteWarning();\n } else {\n confirmDelete();\n }\n };\n\n self.addSchedule = function () {\n self.schedules.push(pmScheduleHelper.addSchedule());\n $document.scrollToElement(angular.element('.pmschedule-details'), 100, 300);\n };\n\n self.addTaskBook = function () {\n self.workOrderTemplate.taskBook = pmScheduleHelper.addTaskBook();\n self.taskBookLinkId = null;\n self.tasksToDelete = [];\n };\n\n $scope.$watch('pmScheduleForm.workOrderTemplate.taskBook.isMaster', function (newVal) {\n self.taskBookMode = newVal ? 'readonly' : 'edit';\n });\n\n $scope.$watch('pmScheduleForm.tasksToDelete', function (newVal, oldVal) {\n if (newVal === oldVal) {\n return;\n }\n if (newVal.length > 0) {\n $scope.form.$dirty = true;\n }\n }, true);\n });\n\n\n'use strict';\n\nangular.module('pmScheduleForm')\n .controller('PmScheduleDeleteModalController', function ($uibModalInstance, $scope, workOrderCount) {\n $scope.workOrderCount = workOrderCount;\n\n $scope.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n'use strict';\n\nangular.module('pmScheduleFilters', ['filterHelpers']);\n\n/**\n * @ngdoc service\n * @name pmScheduleFilters.pmScheduleFiltersService\n * @requires pagingHelpers\n *\n * @description\n * Service for handling the pm schedule filters\n *\n */\n\n'use strict';\n\nangular.module('pmScheduleFilters')\n .factory('pmScheduleFiltersService', function ($location, pagingHelpers) {\n var checkArray = function (value) {\n return Array.isArray(value) ? value : [value];\n };\n\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf pmScheduleFilters.pmScheduleFiltersService\n *\n * @description\n * Gets the default filters for Pm Schedule\n *\n * @param {object} params The filter params\n * @returns {Promise} A promise that resolves to the default filters\n */\n var getFilters = function (params) {\n var filters = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Description asc',\n q: params.q || null,\n isActive: params.isActive || null,\n businessAssets: checkArray(params.businessAssets || []),\n includeDescendants: params.includeDescendants || null,\n purpose: checkArray(params.purpose || [])\n };\n\n return filters;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf pmScheduleFilters.pmScheduleFiltersService\n *\n * @description\n * Sets the filters\n *\n * @param {object} currentFilter The current filters\n * @returns {Promise} A promise that resolves to the filters\n */\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter\n };\n });\n\n/**\n * @ngdoc directive\n * @name pmScheduleForm.pmscheduleDetails\n * @restrict E\n * @description\n *\n * Generates the form/list for adding and editing the PM Schedule Recurrence Pattern, Assignees, and Assets.\n *\n * @param {array} schedules The schedules object from the Work Order template\n * @param {array} spies The scroll spy array\n *\n */\n\n'use strict';\n\nangular.module('pmScheduleForm')\n .component('pmscheduleDetails', {\n templateUrl: 'app/components/pmScheduleDetails/pmScheduleDetails.html',\n controller: 'PmScheduleDetailsController',\n controllerAs: 'pmScheduleDetails',\n bindings: {\n schedules: '=',\n schedulesToDelete: '=?',\n workOrderTemplate: '<',\n spies: '=',\n saveAttempt: '='\n }\n })\n .controller('PmScheduleDetailsController', function ($scope, $translate, $uibModal, $state, DudeApi, log, pmScheduleHelper, pmScheduleType) {\n var self = this;\n self.scheduleTypes = pmScheduleType;\n self.defaultScheduleType = self.scheduleTypes.FIXED;\n self.isActive = null;\n self.isValid = true;\n\n var showValidationToast = function () {\n self.isValid = false;\n log.notify({\n type: 'error',\n title: $translate.instant('pmScheduleDetails.validation.error.title'),\n message: $translate.instant('pmScheduleDetails.validation.error.message')\n });\n };\n\n var removeScrollSpy = function () {\n if (self.schedules.length === 0) {\n self.spies.forEach(function (spy, index) {\n if (spy.name === $translate.instant('pmScheduleForm.cards.schedule.title')) {\n self.spies.splice(index, 1);\n }\n });\n }\n };\n\n self.setActive = function (index) {\n if (self.isActive === null) {\n self.isActive = index;\n } else if (self.isActive !== index && !pmScheduleHelper.scheduleIsValid(self.schedules[self.isActive])) {\n showValidationToast();\n }\n };\n\n self.inActivate = function () {\n self.isActive = null;\n self.isValid = true;\n };\n\n self.done = function (index) {\n if (!pmScheduleHelper.scheduleIsValid(self.schedules[index])) {\n showValidationToast();\n return false;\n }\n\n // if the scheduleType is switched, we need to ensure starting threshold is removed from assets.\n if (self.schedules[index].scheduleType !== self.scheduleTypes.METERED && self.schedules[index].scheduleType !== self.scheduleTypes.MIXED) {\n self.schedules[index].businessAssets.forEach(function (asset) {\n asset.startingThreshold = null;\n });\n }\n\n // Sets commited flag so we dont show close and show delete for new items w/o an id\n if (!self.schedules[index].id) {\n self.schedules[index].__commited = true;\n }\n\n self.inActivate();\n\n return true;\n };\n\n self.cancel = function (index) {\n self.schedules.splice(index, 1);\n removeScrollSpy();\n self.inActivate();\n };\n\n self.delete = function (index) {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/pmScheduleDetails/pmScheduleDeleteConfirmModal.html',\n controller: 'PmScheduleDetailsDeleteModalController',\n controllerAs: 'pmScheduleDetailsDeleteModal',\n size: 'md',\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n if (self.schedules[index].id) {\n self.schedulesToDelete = Array.isArray(self.schedulesToDelete) ? self.schedulesToDelete : [];\n self.schedulesToDelete.push(self.schedules[index].id);\n }\n\n self.schedules.splice(index, 1);\n removeScrollSpy();\n self.inActivate();\n });\n };\n\n self.addRecurrence = function (schedule, index) {\n if (index !== self.isActive) {\n return;\n }\n\n self.editingSchedule = schedule;\n self.openRecurrenceSlidingPanel = true;\n };\n\n self.addAssets = function (schedule, index) {\n if (index !== self.isActive) {\n return;\n }\n\n self.editingSchedule = schedule;\n self.openAssetsSlidingPanel = true;\n };\n\n self.addAssignees = function (schedule, index) {\n if (index !== self.isActive) {\n return;\n }\n self.editingSchedule = schedule;\n self.openAssigneesSlidingPanel = true;\n };\n\n self.addReadings = function (schedule, index) {\n if (index !== self.isActive) {\n return;\n }\n\n self.editingSchedule = schedule;\n self.openReadingsSlidingPanel = true;\n };\n\n self.addSchedule = function () {\n if (!self.done(self.schedules.length - 1)) {\n return;\n }\n\n self.schedules.push(pmScheduleHelper.addSchedule());\n\n // Clone recurrence pattern from previous schedule\n if (self.schedules.length >= 2) {\n var currentIndex = self.schedules.length - 1;\n var previousIndex = self.schedules.length - 2;\n self.schedules[currentIndex].scheduleType = angular.copy(self.schedules[previousIndex].scheduleType);\n self.schedules[currentIndex].recurrencePattern = angular.copy(self.schedules[previousIndex].recurrencePattern);\n }\n\n self.isValid = true;\n };\n\n self.hasRecurrencePattern = function (schedule) {\n return schedule.scheduleType === self.scheduleTypes.METERED || (schedule.recurrencePattern != null && schedule.recurrencePattern.pattern !== null);\n };\n\n self.viewWorkOrders = function (scheduleId) {\n $state.go('secure.workOrderList', { pmSchedule: scheduleId });\n };\n\n self.getPeriodTranslationKey = function (period) {\n if (!period) {\n return undefined;\n }\n period = period.toLowerCase();\n\n if (period === 'day') {\n return 'recurrencePattern.daily';\n }\n return 'recurrencePattern.' + period + 'ly';\n };\n\n self.$onInit = function () {\n $scope.$watch('pmScheduleDetails.schedules.length', function (newVal, oldVal) {\n if (newVal >= oldVal) {\n var idx = newVal - 1;\n if (!pmScheduleHelper.scheduleIsValid(self.schedules[idx])) {\n self.setActive(idx);\n }\n }\n });\n\n $scope.$watchGroup([\n 'pmScheduleDetails.workOrderTemplate.purpose',\n 'pmScheduleDetails.workOrderTemplate.workType',\n 'pmScheduleDetails.workOrderTemplate.trade',\n 'pmScheduleDetails.editingSchedule.assignees'], function () {\n if ($scope.scheduleForm.active) {\n $scope.scheduleForm.active.$validate();\n }\n });\n\n // reset save attempt\n self.saveAttempt = false;\n $scope.$watch('pmScheduleDetails.saveAttempt', function (newVal) {\n if (newVal) {\n self.done(self.schedules.length - 1);\n self.saveAttempt = false;\n }\n });\n };\n });\n\n\n'use strict';\n\nangular.module('pmScheduleForm')\n .controller('PmScheduleDetailsDeleteModalController', function ($uibModalInstance) {\n var self = this;\n\n self.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n self.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n'use strict';\n\nangular.module('pmScheduleForm')\n .directive('pmInactiveAssociationValidator', function () {\n return {\n scope: {\n workOrderTemplate: '=pmInactiveAssociationValidator',\n schedule: '='\n },\n require: 'ngModel',\n link: function (scope, elm, attrs, ctrl) {\n if (scope.workOrderTemplate.workType) {\n ctrl.$validators.pmWorkTypeAssociation = function (modelValue, viewValue) {\n return !viewValue || scope.workOrderTemplate.workType.isActive;\n };\n }\n\n if (scope.schedule.assignees && scope.schedule.assignees.length) {\n ctrl.$validators.pmAssigneeAssociation = function (modelValue, viewValue) {\n var inactiveUser = scope.schedule.assignees.some(function (assignee) {\n return !assignee.isEnabled;\n });\n return !viewValue || !inactiveUser;\n };\n }\n\n if (scope.workOrderTemplate.purpose) {\n ctrl.$validators.pmPurposeAssociation = function (modelValue, viewValue) {\n return !viewValue || scope.workOrderTemplate.purpose.isActive;\n };\n }\n\n if (scope.workOrderTemplate.trade) {\n ctrl.$validators.pmTradeAssociation = function (modelValue, viewValue) {\n return !viewValue || scope.workOrderTemplate.trade.isActive;\n };\n }\n }\n };\n });\n\n'use strict';\n\nangular.module('pmScheduleAssignees', ['helpers']);\n\n/**\n * @ngdoc directive\n * @name pmScheduleAssignees.pmscheduleAssignees\n * @restrict E\n * @description\n *\n * Generates the sliding panel that houses the assignees typeahead\n *\n * @param {boolean} openWhen Opens the sliding panel when true\n * @param {object} schedule The schedule to add the assignees to\n *\n */\n\n'use strict';\n\nangular.module('pmScheduleAssignees')\n .component('pmscheduleAssignees', {\n templateUrl: 'app/components/pmScheduleAssignees/pmScheduleAssignees.html',\n controller: 'PmScheduleAssigneesController',\n controllerAs: 'pmScheduleAssignees',\n bindings: {\n openWhen: '=',\n schedule: '='\n }\n })\n .controller('PmScheduleAssigneesController', function ($scope, $q, $translate, roles) {\n var self = this;\n self.titles = { title: $translate.instant('pmScheduleAssignees.select') + ' ' + $translate.instant('pmScheduleAssignees.assignees') };\n self.roles = [roles.admin, roles.technician];\n\n self.slidingButtons = {\n saveFunction: function () {\n self.schedule.assignees = angular.copy(self.assigneesModel);\n\n return $q(function (resolve) {\n resolve();\n });\n },\n saveButtonText: $translate.instant('pmScheduleAssignees.add')\n };\n\n self.browseOptions = {\n type: 'slidingpanel'\n };\n\n $scope.$watch('pmScheduleAssignees.openWhen', function (newVal) {\n if (!newVal) {\n return;\n }\n\n self.assigneesModel = angular.copy(self.schedule.assignees);\n });\n });\n\n'use strict';\n\nangular.module('pmScheduleAssets', []);\n\n/**\n * @ngdoc directive\n * @name pmScheduleAssets.pmscheduleAssets\n * @restrict E\n * @description\n *\n * Generates the sliding panel that houses the Assets typeahead\n *\n * @param {boolean} openWhen Opens the sliding panel when true\n * @param {object} schedule The schedule to add the assets to\n *\n */\n\n'use strict';\n\nangular.module('pmScheduleAssets')\n .component('pmscheduleAssets', {\n templateUrl: 'app/components/pmScheduleAssets/pmScheduleAssets.html',\n controller: 'PmScheduleAssetsController',\n controllerAs: 'pmScheduleAssets',\n bindings: {\n openWhen: '=',\n schedule: '='\n }\n })\n .controller('PmScheduleAssetsController', function ($scope, $q, $translate) {\n var self = this;\n self.titles = { title: $translate.instant('pmScheduleAssets.select') + ' ' + $translate.instant('pmScheduleAssets.locationOrEquipment') };\n\n self.slidingButtons = {\n saveFunction: function () {\n self.schedule.businessAssets = angular.copy(self.businessAssetsModel);\n\n return $q(function (resolve) {\n resolve();\n });\n },\n saveButtonText: $translate.instant('pmScheduleAssets.add')\n };\n\n self.browseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n },\n 'asset-category': {\n filter: 'isLocation'\n },\n 'business-asset-type': {\n filters: ''\n }\n }\n };\n\n $scope.$watch('pmScheduleAssets.openWhen', function (newVal) {\n if (!newVal) {\n return;\n }\n\n self.businessAssetsModel = angular.copy(self.schedule.businessAssets);\n });\n });\n\n'use strict';\n\nangular.module('pmSchedule', ['translate', 'pmScheduleForm', 'pmScheduleList', 'pmScheduleAssets', 'pmScheduleAssignees', 'pmScheduleRecurrence', 'pmScheduleMeterReading', 'helpers']);\n\n/**\n * @ngdoc service\n * @name pmSchedule.pmScheduleHelper\n * @requires DudeApi\n *\n * @description\n * Helper service for shared calls of PM Schedules\n *\n */\n\n'use strict';\n\nangular.module('pmSchedule')\n .service('pmScheduleHelper', function (DudeApi, taskBookService, pmScheduleType) {\n /**\n * @ngdoc method\n * @name addSchedule\n * @methodOf pmSchedule.pmScheduleHelper\n *\n * @description\n * Returns a new PMScheduleEntity from DudeAPI\n *\n * @returns {object} A new PMScheduleEntity from Dude Api\n */\n var addSchedule = function () {\n return new DudeApi.PmScheduleEntity({\n isActive: true,\n scheduleType: pmScheduleType.FIXED\n });\n };\n\n /**\n * @ngdoc method\n * @name addTaskBook\n * @methodOf pmSchedule.pmScheduleHelper\n *\n * @description\n * Returns a new TaskBookEntity from DudeAPI\n *\n * @returns {object} A new TaskBookEntity from Dude Api\n */\n var addTaskBook = function () {\n var taskBook = new DudeApi.TaskBookEntity({\n tasks: [],\n isMaster: false\n });\n if (!angular.isArray(taskBook.tasks) || taskBook.tasks.length === 0) {\n taskBookService.addTasks(taskBook.tasks, 5);\n }\n return taskBook;\n };\n\n /**\n * @ngdoc method\n * @name hasValidAssets\n * @methodOf pmSchedule.pmScheduleHelper\n *\n * @param {object} schedule The schedule to check the validity of\n *\n * @description\n * Returns whether or not a schedule has valid assets\n *\n * @returns {boolean} true if the assets are valid\n */\n var hasValidAssets = function (schedule) {\n if (!schedule.businessAssets || schedule.businessAssets.length === 0) {\n return false;\n }\n\n var isValid = true;\n\n if (schedule.scheduleType === pmScheduleType.METERED || schedule.scheduleType === pmScheduleType.MIXED) {\n schedule.businessAssets.forEach(function (asset) {\n isValid = isValid && asset.isMetered && asset.startingThreshold;\n });\n }\n return isValid;\n };\n\n /**\n * @ngdoc method\n * @name isValidSchedule\n * @methodOf pmSchedule.pmScheduleHelper\n *\n * @param {object} schedule The schedule to check the validity of\n *\n * @description\n * Returns whether or not a schedule is valid\n *\n * @returns {boolean} true if the schedule is valid\n */\n var isValidSchedule = function (schedule) {\n // if schedule is not metered, must have recurrence\n // if schedule is metered, must have meter interval\n var scheduleRecurrenceIsValid = (schedule.scheduleType !== pmScheduleType.METERED && schedule.recurrencePattern != null && schedule.recurrencePattern.period != null)\n || ((schedule.scheduleType === pmScheduleType.METERED || schedule.scheduleType === pmScheduleType.MIXED) && schedule.meterInterval !== null);\n\n return scheduleRecurrenceIsValid && hasValidAssets(schedule);\n };\n\n return {\n addSchedule: addSchedule,\n addTaskBook: addTaskBook,\n scheduleIsValid: isValidSchedule,\n assetsAreValid: hasValidAssets\n };\n });\n\n'use strict';\n\nangular.module('notifications', ['ui.router', 'dudeAuth', 'dudeControls', 'dudeApi', 'translate', 'dudeLog']);\n\n'use strict';\n\nangular.module('notifications')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.notifications', {\n url: 'profile/notifications',\n templateUrl: 'app/components/notifications/notifications.html',\n controller: 'notificationsController',\n controllerAs: 'notifications',\n permissions: permission.users.create,\n resolve: {\n notifications: function ($stateParams, DudeApi) {\n return DudeApi.MyNotificationSettingEntity.query().$promise;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('notifications')\n .controller('notificationsController', function ($translate, DudeApi, log, notifications) {\n var self = this;\n\n self.settings = notifications.data.filter(function (setting) {\n var keepSetting = setting.name.indexOf('WorkOrder') > -1;\n if (keepSetting) {\n setting.disabled = false;\n setting.formLabel = $translate.instant('notifications.' + setting.name + '.email');\n }\n return keepSetting;\n });\n\n self.updateSetting = function (setting) {\n setting.email = !setting.email;\n setting.disabled = true;\n DudeApi.MyNotificationSettingEntity.update({ id: setting.id }, setting).$promise\n .then(function () {\n log.notify({\n title: $translate.instant('notifications.label'),\n type: 'success',\n message: $translate.instant('notifications.updated')\n });\n })\n .finally(function () {\n setting.disabled = false;\n });\n };\n });\n\n'use strict';\n\nangular.module('navbar', ['dudeAuth', 'dudeControlsShell', 'dudeControls', 'translate', 'dudeLog']);\n\n/**\n * @ngdoc service\n * @name navbar.supportPanelService\n * @requires DudeApi\n *\n * @description\n * Helper service setting up the support panel of the navbar\n *\n */\n\n'use strict';\n\nangular.module('navbar')\n .service('supportPanelService', function (marketizr, market, roleHelpers) {\n var educationMarkets = [market.k12, market.he, market.ips];\n var manufacturingMarkets = [market.mfg, market.gov, market.club, market.other];\n /**\n * @ngdoc method\n * @name helpLink\n * @methodOf navbar.supportPanelService\n *\n * @description\n * Returns the appropriate help link for the given role and market\n *\n * @returns {string} The url for the help link for the given role and market\n */\n var helpLink = function () {\n var link;\n switch (true) {\n // EDU Requester\n case marketizr.hasMarkets(educationMarkets) && roleHelpers.isRequester():\n link = 'http://help.dudesolutions.com/Content/Documentation/Maintenance/Maintenance%20Manager%20Education/User%20Roles/Requester/Maintenance%20Manager%20Requester.htm';\n break;\n // MFG Requester\n case marketizr.hasMarkets(manufacturingMarkets) && roleHelpers.isRequester():\n link = 'http://help.dudesolutions.com/Content/Documentation/Maintenance/Maintenance%20Manager%20Manufacturing/User%20Roles/Requester/Maintenance%20Manager%20Requester.htm';\n break;\n // EDU Technician\n case marketizr.hasMarkets(educationMarkets) && roleHelpers.isTechnician():\n link = 'http://help.dudesolutions.com/Content/Documentation/Maintenance/Maintenance%20Manager%20Education/User%20Roles/Technician/Maintenance%20Manager%20Technician.htm';\n break;\n // MFG Technician\n case marketizr.hasMarkets(manufacturingMarkets) && roleHelpers.isTechnician():\n link = 'http://help.dudesolutions.com/Content/Documentation/Maintenance/Maintenance%20Manager%20Manufacturing/User%20Roles/Technician/Maintenance%20Manager%20Technician.htm';\n break;\n // EDU Administrator\n case marketizr.hasMarkets(educationMarkets) && !roleHelpers.isTechnician() && !roleHelpers.isRequester():\n link = 'http://help.dudesolutions.com/Content/Documentation/Maintenance/Maintenance%20Manager%20Education/Maintenance%20Manager.htm';\n break;\n // MFG Administrator (default)\n default:\n link = 'http://help.dudesolutions.com/Content/Documentation/Maintenance/Maintenance%20Manager%20Manufacturing/Maintenance%20Manager.htm';\n break;\n }\n\n return link;\n };\n\n return {\n helpLink: helpLink\n };\n });\n\n'use strict';\n\nangular.module('navbar')\n .controller('NavbarController', function ($rootScope, $state, $translate, authService, featuresHelper, DudeApi, log, marketizr, market, roleHelpers, supportPanelService) {\n var self = this;\n var userName = '';\n\n self.title = {\n text: $translate.instant('navBar.product'),\n routerPath: 'secure.interceptor'\n };\n\n self.isRequester = roleHelpers.isRequester();\n self.isTechnician = roleHelpers.isTechnician();\n\n self.support = {\n phoneText: $translate.instant('helpDropdown.phone.phoneDisplay'),\n phoneHref: $translate.instant('helpDropdown.phone.phoneHref'),\n emailTitle: $translate.instant('helpDropdown.email.title'),\n emailAddress: $translate.instant('helpDropdown.email.address'),\n helpLink: supportPanelService.helpLink(),\n liveChat: true\n };\n\n self.logout = function (event) {\n event.preventDefault();\n authService.logout();\n };\n\n var toggleSearch = function () {\n self.search.isSearching = !self.search.isSearching;\n };\n\n var search = function () {\n if (isNaN(self.search.searchParam)) {\n log.notify({\n type: 'error',\n message: $translate.instant('navBar.invalidId')\n });\n } else if (parseInt(self.search.searchParam, 10)) {\n var filter = {\n displayId: self.search.searchParam\n };\n DudeApi.WorkOrderEntity.query(filter).$promise.then(function (response) {\n if (response.data.length === 1) {\n // close the search bar\n if (self.search.isSearching) {\n toggleSearch();\n }\n self.search.searchParam = '';\n $state.go('secure.workOrderFormEdit', { id: response.data[0].id });\n } else {\n log.notify({\n type: 'error',\n message: $translate.instant('navBar.invalidId')\n });\n }\n });\n }\n };\n\n self.search = self.isRequester ? null : {\n searchFunction: search,\n toggleSearch: toggleSearch,\n placeholder: $translate.instant('navBar.WOID')\n };\n\n var createNavigationArray = function () {\n self.navigationArray = [\n {\n name: self.isRequester ? $translate.instant('navBar.requester.newWorkOrder') : $translate.instant('workOrderForm.new'),\n routerPath: 'secure.workOrderFormNew',\n icon: 'fa-plus',\n hasPermission: true,\n type: 'button'\n },\n {\n name: $translate.instant('dashboard.title'),\n routerPath: 'secure.dashboard',\n icon: 'fa-home',\n hasPermission: !self.isRequester && (!self.isTechnician || marketizr.hasMarkets([market.k12, market.he, market.ips])),\n type: 'navigation'\n },\n {\n name: self.isRequester ? $translate.instant('navBar.requester.workOrders') : $translate.instant('workOrderList.workOrders'),\n routerPath: 'secure.workOrderList',\n icon: 'fa-list',\n hasPermission: true,\n type: 'navigation'\n },\n {\n name: $translate.instant('navBar.calendar'),\n routerPath: 'secure.workOrderCalendar.month',\n icon: 'fa-calendar',\n hasPermission: !self.isTechnician && !self.isRequester,\n type: 'navigation'\n },\n {\n name: $translate.instant('navBar.reports'),\n routerPath: 'secure.report.locationsChart',\n icon: 'fa-area-chart',\n hasPermission: !self.isRequester && !self.isTechnician,\n type: 'navigation'\n },\n {\n name: $translate.instant('navBar.locationsOrEquipment'),\n routerPath: 'secure.assetList',\n icon: 'fa-briefcase',\n hasPermission: self.isTechnician,\n type: 'navigation'\n },\n {\n name: $translate.instant('navBar.history'),\n routerPath: 'secure.history.workorders',\n type: 'navigation',\n icon: 'fa-header',\n hasPermission: !self.isRequester\n },\n {\n name: $translate.instant('navBar.admin'),\n icon: 'fa-gear',\n hasPermission: !self.isTechnician && !self.isRequester,\n type: 'navigation',\n accordion: [\n {\n name: $translate.instant('navBar.locationsOrEquipment'),\n routerPath: 'secure.assetList',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.floorPlanList'),\n routerPath: 'secure.floorPlanList',\n hasPermission: featuresHelper.hasFeature('floorplans')\n },\n {\n name: $translate.instant('navBar.types'),\n routerPath: 'secure.assetTypeList',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.departments'),\n routerPath: 'secure.departmentList',\n hasPermission: featuresHelper.hasFeature('departments')\n },\n {\n name: $translate.instant('navBar.projects'),\n routerPath: 'secure.projectList',\n hasPermission: marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov])\n },\n {\n name: $translate.instant('navBar.purposes'),\n routerPath: 'secure.purposeList',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.schedules'),\n routerPath: 'secure.pmScheduleList',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.taskBooks'),\n routerPath: 'secure.taskBookList',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.trades'),\n routerPath: 'secure.tradeList',\n hasPermission: marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov])\n },\n {\n name: $translate.instant('navBar.users'),\n routerPath: 'secure.userList',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.workTypes'),\n routerPath: 'secure.workTypeList',\n hasPermission: marketizr.hasMarkets([market.k12, market.ips, market.he])\n },\n {\n name: 'divider',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.settings'),\n routerPath: 'secure.settingsEdit',\n hasPermission: true\n }\n ]\n },\n {\n name: $translate.instant('navBar.userSettings'),\n icon: 'fa-user',\n hasPermission: true,\n type: 'iconMenu',\n accordion: [\n {\n name: userName,\n type: 'text',\n hasPermission: true\n },\n {\n name: 'divider',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.editProfile'),\n routerPath: 'secure.userMe',\n icon: 'fa-pencil',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.changePassword'),\n routerPath: 'secure.changePassword',\n icon: 'fa-key',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.notificationSettings'),\n routerPath: 'secure.notifications',\n icon: 'fa-envelope',\n hasPermission: !self.isRequester && !self.isTechnician\n },\n {\n name: 'divider',\n hasPermission: true\n },\n {\n name: $translate.instant('navBar.logout'),\n clickFunction: self.logout,\n icon: 'fa-sign-out',\n hasPermission: true\n }\n ]\n }\n ];\n };\n\n authService.getContext().then(function (data) {\n self.profile = data;\n self.title.subText = data.user.account.name;\n\n self.support.accountNumber = data.account.number;\n self.support.profile = data;\n\n userName = data.user.firstName + ' ' + data.user.lastName;\n createNavigationArray();\n });\n });\n\n'use strict';\n\nangular.module('meterReading', ['dudeControls', 'dudeApi', 'translate', 'assetFilters', 'dudeLog']);\n\n/**\n * @ngdoc directive\n * @name meterReading.meterReading\n * @restrict E\n * @description\n *\n * Generates the sliding panel that houses the Asset's usage tracking\n *\n * @param {boolean} openWhen Opens the sliding panel when true\n * @param {object} asset The asset to update\n *\n */\n\n'use strict';\n\nangular.module('meterReading')\n .component('meterReading', {\n templateUrl: 'app/components/meterReading/meterReading.html',\n controller: 'MeterReadingController',\n controllerAs: 'meterReading',\n bindings: {\n openWhen: '=',\n asset: '='\n }\n })\n .controller('MeterReadingController', function ($scope, $q, $translate, log, DudeApi, assetFormService, userContext) {\n var self = this;\n\n self.$onInit = function () {\n self.titles = { title: $translate.instant('meterReading.title') };\n self.country = userContext.account.location.country;\n\n self.slidingButtons = {\n saveFunction: function () {\n return $q.all(assetFormService.saveAttributes(self.attributes, self.asset)).then(function () {\n log.notify({\n title: $translate.instant('meterReading.notify.success.title'),\n type: 'success',\n message: $translate.instant('meterReading.notify.success.message')\n });\n });\n },\n saveButtonText: $translate.instant('general.actions.save')\n };\n\n $scope.$watch('meterReading.openWhen', function (newVal) {\n if (!newVal) {\n self.attributes = [];\n return;\n }\n DudeApi.BusinessAssetAttributeEntity.query({\n businessAssetId: self.asset.id,\n attributeTypeKey: 'meter'\n }).$promise.then(function (attributes) {\n self.attributes = attributes.data;\n });\n });\n };\n });\n\n'use strict';\n\nangular.module('maintenanceSlidingPanels', []);\n\n/**\n * @ngdoc service\n * @name maintenanceSlidingPanels.maintenanceSlidingPanelsService\n *\n * @description\n * Service for communicating between maintenance sliding panels.\n *\n */\n\n'use strict';\n\nangular.module('maintenanceSlidingPanels')\n .service('maintenanceSlidingPanelsService', function () {\n var openPanelCallbacks = {};\n\n /**\n * @ngdoc method\n * @name initializeService\n * @methodOf maintenanceSlidingPanels.maintenanceSlidingPanelsService\n *\n * @description\n * Initializes the variables so they are reset on page load\n *\n */\n var initializeService = function () {\n openPanelCallbacks = {};\n };\n\n /**\n * @ngdoc method\n * @name openPanel\n * @methodOf maintenanceSlidingPanels.maintenanceSlidingPanelsService\n *\n * @description\n * Opens the designated panel\n *\n * @param {string} panelName The string identifier for the panel to open\n * @param {object} options Any options to be included when opening the panel\n *\n */\n var openPanel = function (panelName, options) {\n if (openPanelCallbacks[panelName] && typeof openPanelCallbacks[panelName] === 'function') {\n openPanelCallbacks[panelName](options);\n }\n };\n\n /**\n * @ngdoc method\n * @name subscribe\n * @methodOf maintenanceSlidingPanels.maintenanceSlidingPanelsService\n *\n * @description\n * Subscribes a callback that should open the component's panel\n *\n * @param {string} panelName The string identifier for the panel to open\n * @param {function} openPanelCallback The callback that contains the function that will open the panel\n *\n */\n var subscribe = function (panelName, openPanelCallback) {\n openPanelCallbacks[panelName] = openPanelCallback;\n };\n\n return {\n initializeService: initializeService,\n openPanel: openPanel,\n subscribe: subscribe\n };\n });\n\n'use strict';\n\nangular.module('locationReport', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'report', 'assetReport']);\n\n'use strict';\n\nangular.module('locationReport')\n .config(function ($stateProvider, permission, moment, workOrderEnums, dateHelperProvider) {\n var routeParams = 'status&workType&purpose&requestDateTo&requestDateFrom&requestDateRange&completionDateTo&completionDateFrom&completionDateRange&businessAsset&includeDescendants&assetRollUp&orderBy&filterId';\n var defaults = {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.complete, workOrderEnums.status.onHold],\n toDate: dateHelperProvider.getEndOfDay(new Date()).toISOString(),\n // The default from date is 7 days in the past so we subtract 7 days worth of milliseconds from now to get the correct date\n fromDate: dateHelperProvider.getStartOfDay(moment().subtract(7, 'days')).toISOString()\n };\n\n var getActiveSavedFilter = function ($stateParams, myFilters, savedFiltersService) {\n var queryParams = $stateParams;\n if (queryParams.filterId) {\n return savedFiltersService.getFilterIfExistsForUser(queryParams.filterId, myFilters);\n }\n return null;\n };\n\n var getQueryParams = function ($location, $stateParams, activeSavedFilter, marketizr, market) {\n var defaultCopy = angular.copy(defaults);\n var queryParams = $stateParams;\n queryParams.includeDescendants = null;\n queryParams.isLocation = true;\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n queryParams.assetRollUp = 'true';\n } else {\n queryParams.assetRollUp = queryParams.includeDescendants || queryParams.assetRollUp || null;\n }\n if (!queryParams.requestDateTo && !queryParams.requestDateFrom && !queryParams.completionDateFrom && !queryParams.completionDateTo && !queryParams.requestDateRange && !queryParams.completionDateRange) {\n queryParams.requestDateTo = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.toDate : dateHelperProvider.getEndOfDay(moment().subtract(1, 'month').endOf('month')).toISOString();\n queryParams.requestDateFrom = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.fromDate : dateHelperProvider.getStartOfDay(moment().subtract(1, 'month').startOf('month')).toISOString();\n }\n if (!queryParams.filterId) {\n queryParams.status = queryParams.status || defaultCopy.status;\n }\n // If requesting a saved filter created for a different page or by a different user, remove the filter id\n if (queryParams.filterId && !activeSavedFilter) {\n delete queryParams.filterId;\n $location.search('filterId', null);\n }\n return queryParams;\n };\n\n $stateProvider\n .state('secure.report.locationsList', {\n url: 'locations/list?' + routeParams,\n templateUrl: 'app/components/locationReport/locationList.html',\n controller: 'LocationReportListController',\n controllerAs: 'locationReport',\n permissions: [permission.purposes.create, permission.purposes.update, permission.purposes.delete],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/locations/list');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $q, $stateParams, activeSavedFilter, assetReportService, marketizr, market, myFilters, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n var filters = reportFiltersService.toApiFilter(queryParams);\n\n return $q.all({\n initResponse: assetReportService.loadAssets(filters).then(function (assets) {\n return assetReportService.getListData(filters, assets);\n }),\n filters: filters,\n totals: assetReportService.getTotalData(filters),\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n });\n }\n }\n })\n .state('secure.report.locationsChart', {\n url: 'locations/chart?' + routeParams,\n templateUrl: 'app/components/locationReport/locationChart.html',\n controller: 'LocationReportChartController',\n controllerAs: 'locationReport',\n permissions: [permission.businessAssets.create, permission.businessAssets.update, permission.businessAssets.delete],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/locations/chart');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $stateParams, activeSavedFilter, marketizr, market, myFilters, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n var filters = reportFiltersService.getFilters(queryParams);\n\n return {\n filters: filters,\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n };\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('locationReport')\n .controller('LocationReportListController', function ($translate, initData) {\n var self = this;\n\n self.title = $translate.instant('locationReports.location');\n\n self.initData = angular.copy(initData);\n });\n\n'use strict';\n\nangular.module('locationReport')\n .controller('LocationReportChartController', function (initData) {\n var self = this;\n\n self.initData = angular.copy(initData);\n });\n\n/**\n * @ngdoc service\n * @name workOrderInventory.issueToWorkOrderService\n * @requires $q\n * @requires DudeApi\n *\n * @description\n * Service for supporting the issueToWorkOrder component.\n *\n */\n\n'use strict';\n\nangular.module('workOrderInventory')\n .service('issueToWorkOrderService', function ($q, DudeApi) {\n /**\n * @ngdoc method\n * @name assignAssets\n * @methodOf workOrderInventory.issueToWorkOrderService\n *\n * @description\n * Assigns assets to all of the storage area objects.\n *\n * @param {object} storageAreas Object containing all of the storage areas.\n * @returns {promise} Promise that will contain all of the storage areas with their associated assets.\n */\n var assignAssets = function (storageAreas) {\n var promises = storageAreas.map(function (storageArea) {\n return DudeApi.BusinessAssetEntity.get({ id: storageArea.businessAssetId }).$promise;\n });\n\n return $q.all(promises).then(function (assets) {\n return $q(function (resolve) {\n resolve(storageAreas.map(function (storageArea, index) {\n storageArea.asset = assets[index];\n return storageArea;\n }));\n });\n });\n };\n\n /**\n * @ngdoc method\n * @name getItemStorageAreas\n * @methodOf workOrderInventory.issueToWorkOrderService\n *\n * @description\n * Gets all storage areas associated to an inventory item and then calls assignAssets() to assign\n * assets to each storage area.\n *\n * @param {int} id The inventory item's ID.\n * @returns {promise} Promise that will contain all of the storage areas with their associated assets.\n */\n var getItemStorageAreas = function (id) {\n return $q(function (resolve) {\n DudeApi.InventoryItemStorageAreaEntity.get({ inventoryItemId: id }).$promise.then(function (storageAreas) {\n assignAssets(storageAreas.data).then(function (results) {\n resolve(results);\n });\n });\n });\n };\n\n return {\n getItemStorageAreas: getItemStorageAreas\n };\n });\n\n/**\n * @ngdoc directive\n * @name workOrderInventory.issue-to-work-order\n * @restrict E\n * @description\n *\n * The panel that allows the user to assign an Inventory Item from a storage area\n * to a work order.\n *\n * @param {boolean} openWhen The value to watch for when to open the sliding panel.\n * @param {array} storageAreas Array of storage areas being worked with.\n * @param {boolean} openStoragePanel True to open the storage panel.\n * @param {object} inventoryItem The inventory item being added to the work order.\n * @param {array} inventoryTransactions The array of transactions associated to this work order.\n * @param {object} workOrder The work order being looked at.\n *\n */\n\n'use strict';\n\nangular.module('workOrderInventory')\n .component('issueToWorkOrder', {\n templateUrl: 'app/components/issueToWorkOrder/issueToWorkOrder.html',\n bindings: {\n openWhen: '=',\n storageAreas: '=',\n openStoragePanel: '=',\n inventoryItem: '=',\n inventoryTransactions: '=',\n workOrder: '<'\n },\n controllerAs: 'issueToWorkOrder',\n controller: 'IssueToWorkOrderController'\n }).controller('IssueToWorkOrderController', function ($q, $scope, $translate, $timeout, log, DudeApi, issueToWorkOrderService, slidingPanelSaveVariables, slidingPanelSelectStorageAreaService, quantityAdjustmentsService) {\n var self = this;\n var originalStorageAreas;\n var ISSUE_TO_WORK_ORDER_TRANSACTION_ID = 3;\n slidingPanelSelectStorageAreaService.initializeService();\n\n self.$onInit = function () {\n self.selectedStorageArea = null;\n self.originalSelected = null;\n self.issuedFromOpen = true;\n self.issuedToOpen = false;\n self.quantityToIssue = $translate.instant('issueToWorkOrder.quantityToIssue');\n self.titles = { title: $translate.instant('issueToWorkOrder.title'), subtitle: '(' + $translate.instant('issueToWorkOrder.subtitle') + ' ' + self.workOrder.displayId + ')' };\n self.additionalFilters = { isActive: true, hasQuantityOnHand: true };\n $timeout(function () {\n slidingPanelSelectStorageAreaService.subscribeStorageAreaCallback(function (storageArea) {\n if (!storageArea) {\n self.inventoryItem = null;\n }\n self.getSelectedStorageArea();\n originalStorageAreas = angular.copy(self.storageAreas);\n if (self.selectedStorageArea != null) {\n self.quantityInfo = quantityAdjustmentsService.instantiateWorkOrderQuantities([self.workOrder]);\n self.issuedFromOpen = false;\n self.issuedToOpen = true;\n }\n });\n });\n\n self.panelFunctions = {\n saveFunction: function () {\n var transaction = {\n inventoryItem: {\n id: self.inventoryItem.id\n },\n inventoryTransactionReason: {\n id: ISSUE_TO_WORK_ORDER_TRANSACTION_ID\n },\n transactionDateTime: new Date().toISOString(),\n workOrderDisplayId: self.workOrder.displayId,\n inventoryTransactionDetails: [{\n businessAssetId: self.selectedStorageArea.asset.id,\n transactionQuantity: self.quantityInfo[self.workOrder.displayId].newQuantity * -1\n }]\n };\n\n if (transaction.inventoryTransactionDetails[0].transactionQuantity === 0 ||\n transaction.inventoryTransactionDetails[0].transactionQuantity === '' ||\n transaction.inventoryTransactionDetails[0].transactionQuantity == null) {\n log.notify({\n title: $translate.instant('issueToWorkOrder.notify.moreThanZeroTitle'),\n type: 'error',\n message: $translate.instant('issueToWorkOrder.notify.moreThanZeroMessage')\n });\n\n return $q.reject();\n }\n\n var promises = [];\n var returnedTransaction;\n\n promises.push(DudeApi.InventoryTransactionEntity.save(transaction).$promise);\n promises.push(DudeApi.BusinessAssetEntity.get({\n id: transaction.inventoryTransactionDetails[0].businessAssetId\n }).$promise);\n\n return $q.all(promises).then(function (results) {\n returnedTransaction = results[0];\n returnedTransaction.asset = results[1];\n\n self.inventoryTransactions.push(returnedTransaction);\n self.panelFunctions.cancelFunction();\n\n log.notify({\n title: $translate.instant('issueToWorkOrder.notify.successTitle'),\n type: 'success',\n message: $translate.instant('issueToWorkOrder.notify.successMessage')\n });\n\n return slidingPanelSaveVariables.closeAll;\n });\n },\n cancelFunction: function () {\n self.selectedStorageArea = null;\n self.inventoryItem = null;\n self.issuedFromOpen = true;\n self.issuedToOpen = false;\n slidingPanelSelectStorageAreaService.setStorageArea(null);\n self.quantityInfo = quantityAdjustmentsService.instantiateWorkOrderQuantities([self.workOrder]);\n self.storageAreas = angular.copy(originalStorageAreas);\n }\n };\n\n $scope.$watch('issueToWorkOrder.inventoryItem', function (newVal) {\n self.selectedStorageArea = null;\n if (!newVal || !newVal.id) {\n return;\n }\n\n issueToWorkOrderService.getItemStorageAreas(newVal.id).then(function (storageAreas) {\n self.storageAreas = storageAreas;\n self.inventoryItem = newVal;\n self.openStoragePanelFunction();\n });\n });\n };\n\n self.getSelectedStorageArea = function () {\n self.selectedStorageArea = slidingPanelSelectStorageAreaService.getStorageArea();\n };\n\n self.openStoragePanelFunction = function () {\n self.openStoragePanel = true;\n };\n });\n\n/**\n * @ngdoc directive\n * @name history.historyListNavigation\n * @restrict E\n * @description\n *\n * The navigation tabs for choosing which type of history you'd like to see\n *\n * @param {object} filters Filters for the history list\n */\n\n'use strict';\n\nangular.module('history')\n .component('historyListNavigation', {\n bindings: {\n filters: '=?'\n },\n controller: 'HistoryListNavigationController',\n controllerAs: 'historyListNavigation',\n templateUrl: 'app/components/historyList/historyListNavigation.html'\n\n })\n .controller('HistoryListNavigationController', function ($state) {\n var self = this;\n\n self.isActiveRoute = function (parameter) {\n return $state.current.url.indexOf(parameter) === 0;\n };\n\n self.routeTo = function (routeParam) {\n var route = 'secure.history.' + routeParam;\n var filterCopy = angular.copy(self.filters);\n delete filterCopy.orderBy;\n\n $state.go(route, filterCopy);\n };\n });\n\n'use strict';\n\nangular.module('history')\n .config(function ($stateProvider) {\n $stateProvider\n .state('secure.history',\n {\n abstract: true,\n url: 'history/',\n template: '
',\n controllerAs: 'history'\n });\n });\n\n/**\n * @ngdoc directive\n * @name history.historySlidingPanel\n * @requires $scope\n * @requires $q\n * @requires $translate\n * @requires $timeout\n * @requires history.historyService\n *\n * @restrict E\n * @description\n *\n * The panel that allows the user to view history of an object.\n *\n * @param {boolean} openWhen The value to watch for when to open the sliding panel.\n * @param {object} object An object containing the ID, objectType, parent ID, parent type,\n * and whether or not to include sub collections for each object that history\n * is needed for.\n * @param {string} displayId The display id for the work order\n *\n */\n\n'use strict';\n\nangular.module('history')\n .component('historySlidingPanel', {\n templateUrl: 'app/components/history/historySlidingPanel.html',\n bindings: {\n openWhen: '=',\n object: '<',\n displayId: '<'\n },\n controllerAs: 'historySlidingPanel',\n controller: 'HistorySlidingPanelController'\n }).controller('HistorySlidingPanelController', function ($scope, $state, $q, $translate, $timeout, moment, historyService, slidingPanelCloseService) {\n var self = this;\n\n self.events = [];\n\n self.close = function () {\n slidingPanelCloseService.closeSinglePanel(self.randomPanelName, true);\n $timeout(function () {\n self.events = [];\n }, 500);\n };\n\n self.navigate = function () {\n $state.go('secure.history.workorders', { q: self.displayId });\n };\n\n self.$onInit = function () {\n self.titles = {\n title: $translate.instant('history.slidingPanelHeader')\n };\n self.panelFunctions = {\n forceTransclude: true,\n cancelFunction: function () {\n $timeout(function () {\n self.events = [];\n }, 500);\n }\n };\n\n $scope.$watch('historySlidingPanel.openWhen', function (newVal) {\n if (!newVal) {\n return;\n }\n self.emptyMessage = $translate.instant('history.loading');\n\n historyService.getFullObjectHistory(self.object).then(function (response) {\n self.events = response.data;\n\n self.emptyMessage = $translate.instant('history.noHistory');\n self.events.forEach(function (event) {\n if (!event.impersonatedByUser) {\n event.userName = event.user ? event.user.firstName + ' ' + event.user.lastName : 'System Generated';\n } else {\n event.userName = $translate.instant('general.cscUser');\n }\n });\n });\n });\n };\n });\n\n/**\n * @ngdoc service\n * @name history.historyFieldNamesService\n *\n * @description\n * Service for translating each of the field names to be human readable\n *\n * @requires $filter\n * @requires $translate\n * @requires moment\n *\n */\n\n'use strict';\n\nangular.module('history')\n .service('historyFieldNamesService', function ($filter, $translate, moment) {\n /**\n * @ngdoc method\n * @name getFieldStrings\n * @methodOf history.historyFieldNamesService\n *\n * @description Returns the human readable strings for the before and after values of the field\n *\n * @param {object} detail The properties of the change\n */\n var getFieldStrings = function (detail) {\n switch (detail.field) {\n case 'requestDateTime':\n case 'completionDateTime':\n case 'completedDateTime':\n detail.beforeString = detail.before && moment(detail.before).format('MM/DD/YYYY hh:mm:ss A');\n detail.afterString = detail.after && moment(detail.after).format('MM/DD/YYYY hh:mm:ss A');\n break;\n case 'transactionDate':\n case 'dueDateTime':\n case 'scheduledStartDate':\n detail.beforeString = detail.before && moment(detail.before).format('MM/DD/YYYY');\n detail.afterString = detail.after && moment(detail.after).format('MM/DD/YYYY');\n break;\n case 'requestedBy':\n case 'typeAttributes.user':\n case 'completedByUser':\n detail.beforeString = detail.before && detail.before.firstName + ' ' + detail.before.lastName;\n detail.afterString = detail.after && detail.after.firstName + ' ' + detail.after.lastName;\n break;\n case 'purpose':\n detail.beforeString = detail.before && detail.before.value;\n detail.afterString = detail.after && detail.after.value;\n break;\n case 'workType':\n case 'businessAsset':\n case 'trade':\n case 'project':\n case 'downtimeTracking.failureReason':\n detail.beforeString = detail.before && detail.before.name;\n detail.afterString = detail.after && detail.after.name;\n break;\n case 'downtimeTracking.cost':\n detail.beforeString = detail.before && $filter('currency')(detail.before);\n detail.afterString = detail.after && $filter('currency')(detail.after);\n break;\n case 'downtimeTracking.duration':\n detail.beforeString = detail.before && moment.duration(detail.before, 's').hours() + 'h ' + moment.duration(detail.before, 's').minutes() + 'm';\n detail.afterString = detail.after && moment.duration(detail.after, 's').hours() + 'h ' + moment.duration(detail.after, 's').minutes() + 'm';\n break;\n case 'assignees':\n detail.beforeString = '';\n if (detail.before !== null) {\n detail.before.forEach(function (assignee, index) {\n detail.beforeString += assignee.firstName + ' ' + assignee.lastName;\n if (index !== detail.before.length - 1) {\n detail.beforeString += ', ';\n }\n });\n }\n detail.afterString = '';\n if (detail.after !== null) {\n detail.after.forEach(function (assignee, index) {\n detail.afterString += assignee.firstName + ' ' + assignee.lastName;\n if (index !== detail.after.length - 1) {\n detail.afterString += ', ';\n }\n });\n }\n break;\n case 'typeAttributes.rate':\n detail.beforeString = detail.before != null && $filter('currency')(detail.before) + ' ' + $translate.instant('history.perHour');\n detail.afterString = detail.after != null && $filter('currency')(detail.after) + ' ' + $translate.instant('history.perHour');\n break;\n case 'typeAttributes.laborType':\n case 'typeAttributes.serviceType':\n detail.beforeString = detail.before && $translate.instant('history.transactionFields.' + detail.before);\n detail.afterString = detail.after && $translate.instant('history.transactionFields.' + detail.after);\n break;\n case 'status':\n detail.beforeString = detail.before && $translate.instant('history.status.' + detail.before);\n detail.afterString = detail.after && $translate.instant('history.status.' + detail.after);\n break;\n default:\n detail.beforeString = detail.before;\n detail.afterString = detail.after;\n break;\n }\n\n if (detail.field.toLowerCase().indexOf('cost') !== -1) {\n if (detail.beforeString && typeof detail.beforeString === 'number') {\n detail.beforeString = $filter('currency')(detail.beforeString) || detail.beforeString;\n }\n\n if (detail.afterString && typeof detail.afterString === 'number') {\n detail.afterString = $filter('currency')(detail.afterString) || detail.afterString;\n }\n }\n };\n\n return {\n getFieldStrings: getFieldStrings\n };\n });\n\n/**\n * @ngdoc directive\n * @name history.historyEventCard\n * @restrict E\n * @description\n *\n * Card showing the title of the updated section and changes for all updated fields within the section.\n *\n * @param {object} changeEvent The history event that contains the changes.\n */\n\n'use strict';\n\nangular.module('history')\n .component('historyEventCard', {\n templateUrl: 'app/components/history/historyEventCard.html',\n bindings: {\n changeEvent: '<'\n },\n controllerAs: 'historyEventCard',\n controller: 'HistoryEventCardController'\n });\n\nangular.module('history')\n .controller('HistoryEventCardController', function ($q, $translate, $scope, roleHelpers, historyBlacklistedFields, historyFieldNamesService, historyService) {\n var self = this;\n self.update = 'Update';\n self.isWorkOrderType = false;\n\n var objectTypes = [\n 'labortransaction',\n 'purchasetransaction',\n 'servicetransaction',\n 'attachment',\n 'weblink',\n 'task'\n ];\n self.isTechnician = roleHelpers.isTechnician();\n\n self.translateFallback = function (path) {\n return historyService.translateFallback(path);\n };\n\n var setNames = function () {\n var changeObject = self.changeEvent.self;\n if (objectTypes.indexOf(changeObject.objectType) !== -1) {\n self.isWorkOrderType = false;\n self.name = $translate.instant('history.objectTypes.' + changeObject.objectType);\n\n if (changeObject.objectType.indexOf('transaction') !== -1) {\n self.subname = '(' + changeObject.objectId + ')';\n } else if (changeObject.objectType.indexOf('task') !== -1) {\n self.subname = self.changeEvent.extraData && self.changeEvent.extraData.order ? '(' + self.changeEvent.extraData.order + ')' : '';\n } else {\n self.subname = null;\n }\n } else {\n self.isWorkOrderType = true;\n self.name = $translate.instant('history.objectTypes.details');\n }\n\n for (var i = 0; i < self.changeEvent.details.length; i++) {\n if (historyBlacklistedFields.indexOf(self.changeEvent.details[i].field) !== -1) {\n self.changeEvent.details.splice(i, 1);\n i--;\n } else {\n historyFieldNamesService.getFieldStrings(self.changeEvent.details[i]);\n }\n }\n\n self.changeEvent.details.sort(function (a, b) {\n var textA = self.translateFallback('history.changeFields.' + a.field).toUpperCase() + ' ' + self.translateFallback('history.changeTypes.' + a.changeType);\n var textB = self.translateFallback('history.changeFields.' + b.field).toUpperCase() + ' ' + self.translateFallback('history.changeTypes.' + b.changeType);\n return (textA < textB) ? -1 : 1;\n });\n };\n\n self.$onInit = function () {\n setNames();\n\n $scope.$watch('historyEventCard.changeEvent', function (newVal) {\n if (!newVal) {\n return;\n }\n setNames();\n });\n };\n\n self.tracker = function (index) {\n return self.changeEvent.key + '_' + index;\n };\n });\n\n'use strict';\n\nangular.module('history')\n .constant('historyChangeTypes', {\n attachment: 'attachment',\n task: 'task',\n laborTransaction: 'labortransaction',\n serviceTransaction: 'servicetransaction',\n purchaseTransaction: 'purchasetransaction',\n webLink: 'weblink',\n workOrder: 'workorder'\n });\n\n'use strict';\n\nangular.module('history')\n .constant('historyBlacklistedFields', [\n 'id',\n 'mime',\n 'small.shareableUri',\n 'small.mime',\n 'medium.shareableUri',\n 'medium.mime',\n 'fileApiId',\n 'fileApiViewToken',\n 'fileState',\n 'fileType',\n 'downloadUri',\n 'shareableUri',\n 'isTemporary',\n 'typeAttributes.type',\n 'thumbnail',\n 'objectId',\n 'objectType',\n 'pmSchedule',\n 'workOrderTemplate',\n 'downtimeTracking.id'\n ]);\n\n/**\n * @ngdoc service\n * @name history.historyService\n * @requires $q\n * @requires DudeApi\n * @requires pagingHelpers\n *\n * @description\n * Service for making calls to the history api.\n *\n */\n\n'use strict';\n\nangular.module('history')\n .service('historyService', function ($translate, $q, DudeApi, pagingHelpers) {\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf history.historyService\n *\n * @description\n * Gets default filters for API calls.\n *\n * @param {object} params Object containing all of the desired filters.\n *\n * @returns {object} currentFilter The filter object updated to have all of the\n * desired filters plus all of the default ones.\n */\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'ChangeDateTime desc',\n objectId: params.objectId || null,\n objectIds: params.objectIds || [],\n objectType: params.objectType || null,\n parentId: params.parentId || null,\n parentType: params.parentType || null,\n userIds: params.userIds || [],\n fields: params.fields || [],\n includeSubCollections: params.includeSubCollections || null,\n // TODO Uncomment line below when new filter is ready\n // includeDescendants: params.includeDescendants || null,\n businessAsset: params.businessAsset || [],\n changeDateTimeFrom: params.changeDateTimeFrom || null,\n changeDateTimeTo: params.changeDateTimeTo || null,\n q: params.q || null\n };\n\n return currentFilter;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf history.historyService\n *\n * @description\n * Updates filters to get them ready for API calls.\n *\n * @param {object} currentFilter Object containing all of the desired filters.\n *\n * @returns {object} The filter object updated to have all of the desired\n * filters plus all of the default ones, with all of them\n * ready to pass to the API.\n */\n var toApiFilter = function (currentFilter) {\n // TODO Uncomment line below when new filter is ready\n // if (currentFilter.includeDescendants === 'false') {\n // currentFilter.includeDescendants = null;\n // }\n\n return getFilters(currentFilter);\n };\n\n /**\n * @ngdoc method\n * @name queryHistory\n * @methodOf history.historyService\n *\n * @description\n * Queries the history API with the given filter.\n *\n * @param {object} filter Object containing all of the desired filters.\n *\n * @returns {array} A list of history events matching the passed filters.\n */\n var queryHistory = function (filter) {\n filter = toApiFilter(filter);\n\n return DudeApi.HistoryEntity.query(filter).$promise;\n };\n\n /**\n * @ngdoc method\n * @name getFullObjectHistory\n * @methodOf history.historyService\n *\n * @description\n * Gets one object's full history.\n *\n * @param {object} object An object containing the objectId, objectType, parentID, parentType,\n * and whether or not to include sub collections for each object that history\n * is needed for.\n * @param {int} object.objectId The ID of the object in question. Null for a query on a parent.\n * @param {Array} object.objectIds An array of IDs to search for. Null for a query on a parent.\n * @param {string} object.objectType The type of the object in question.\n * @param {int} object.parentId The ID of the object's parent. Null if it doesn't have a parent. Required if id is null.\n * @param {string} object.parentType The type of the object's parent. Null if it doesn't have a parent. Required if id is null.\n * @param {boolean} object.includeSubCollections Whether or not to include the object's sub-collections in the response from\n * the API.\n *\n * @returns {array} Every history event for the given object.\n */\n var getFullObjectHistory = function (object) {\n var filter = toApiFilter({\n objectIds: object.objectIds,\n objectId: object.objectId,\n objectType: object.objectType,\n parentId: object.parentId,\n parentType: object.parentType,\n includeSubCollections: object.includeSubCollections\n });\n\n return queryHistory(filter);\n };\n\n /**\n * @ngdoc method\n * @name getHistoryEventByKey\n * @methodOf history.historyService\n *\n * @description\n * Gets one specific history event.\n *\n * @param {object} couchBaseKey Object containing the key for the desired history event.\n *\n * @returns {Promise} The history event with the given key.\n */\n var getHistoryEventByKey = function (couchBaseKey) {\n return DudeApi.HistoryEntity.get(couchBaseKey).$promise;\n };\n\n /**\n * @ngdoc method\n * @name translateFallback\n * @methodOf history.historyService\n *\n * @description\n * Takes in a binding, checks to see if the binding exists in translation and returns\n * either the translated binding or the last segment of the translation changed from camel\n * case to human readable form.\n *\n * @param {string} jsonPath String representing the path to look for in the translation\n *\n * @returns {string} Translated string or fallback\n */\n var translateFallback = function (jsonPath) {\n var output = $translate.instant(jsonPath);\n if (output === jsonPath) {\n var words = jsonPath.split('.');\n var lastWord = words[words.length - 1];\n output = '';\n for (var i = 0; i < lastWord.length; i++) {\n var char = lastWord.charAt(i);\n if (i === 0) {\n output += char.toUpperCase();\n } else if (char !== char.toLowerCase() && char === char.toUpperCase()) {\n output += ' ' + char;\n } else {\n output += char;\n }\n }\n }\n return output;\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n queryHistory: queryHistory,\n getFullObjectHistory: getFullObjectHistory,\n getHistoryEventByKey: getHistoryEventByKey,\n translateFallback: translateFallback\n };\n });\n\n/**\n * @ngdoc directive\n * @name helpers.sticky-element\n * @restrict A\n * @description\n *\n * Adds stickiness to an element causing it to stick to the bottom of the header when scrolling down\n * and return to its initial position when scrolling back up.\n *\n * @requires $window\n * @requires $timeout\n * @requires responsiveBreakpoints\n * @requires clientHelperService\n */\n\n'use strict';\n\nangular.module('helpers')\n .directive('stickyElement', function ($window, $timeout, responsiveBreakpoints, clientHelperService) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n var HEADER_OFFSET = parseInt(attrs.offset, 10) || 97;\n var MOBILE_OFFSET = parseInt(attrs['mobile-offest'], 10) || 40;\n var $win = angular.element($window);\n if (scope._stickyElements === undefined) {\n scope._stickyElements = [];\n\n var addRemoveStickyClass = function () {\n var pos = clientHelperService.getCurrentScreenSize().breakpoint === responsiveBreakpoints.xs ? $win.scrollTop() + MOBILE_OFFSET : $win.scrollTop() + HEADER_OFFSET;\n for (var i = 0; i < scope._stickyElements.length; i++) {\n var item = scope._stickyElements[i];\n if (!item.isStuck && pos > item.initialPosition) {\n item.element.addClass('sticky-element-stuck');\n item.isStuck = true;\n } else if (item.isStuck && pos < item.initialPosition) {\n item.element.removeClass('sticky-element-stuck');\n item.isStuck = false;\n }\n }\n };\n\n var recheckPositions = function () {\n for (var i = 0; i < scope._stickyElements.length; i++) {\n var item = scope._stickyElements[i];\n if (!item.isStuck) {\n item.initialPosition = item.element.offset().top;\n }\n }\n };\n $win.on('scroll.sticky', addRemoveStickyClass);\n $win.on('load.sticky', recheckPositions);\n $win.on('resize.sticky', recheckPositions);\n\n scope.$on('$destroy', function () {\n $win.off('.sticky');\n });\n }\n var item;\n $timeout(function () {\n item = {\n element: element,\n isStuck: false,\n initialPosition: element.offset().top\n };\n\n scope._stickyElements.push(item);\n });\n }\n };\n });\n\n'use strict';\n\nangular.module('helpers')\n .constant('roles', {\n admin: 1,\n technician: 2,\n requester: 5\n });\n\n/**\n * @ngdoc service\n * @name helpers.roleHelpers\n *\n * @description\n * Service for handling roles\n *\n */\n\n'use strict';\n\nangular.module('helpers')\n .service('roleHelpers', function (permissionsHelper, permission) {\n /**\n * @ngdoc method\n * @name isRequester\n * @methodOf helpers.roleHelpers\n *\n * @description\n * Checks if the users role is a requester\n *\n * @returns {boolean} A boolean indicating if the user role is a requester\n */\n var isRequester = function () {\n return !permissionsHelper.userAllowed(permission.workOrders.readAllDetails);\n };\n\n /**\n * @ngdoc method\n * @name isTechnician\n * @methodOf helpers.roleHelpers\n *\n * @description\n * Checks if the users role is a technician\n *\n * @returns {boolean} A boolean indicating if the user role is a technician\n */\n var isTechnician = function () {\n return !permissionsHelper.userAllowed(permission.users.create) && permissionsHelper.userAllowed(permission.workOrders.readAllDetails);\n };\n\n /**\n * @ngdoc method\n * @name isCsc\n * @methodOf helpers.roleHelpers\n *\n * @description\n * Checks if the users role is CSC\n *\n * @returns {boolean} A boolean indicating if the user role is CSC\n */\n var isCsc = function () {\n return permissionsHelper.userAllowed(permission.assetTemplate.read);\n };\n\n var roles = {\n CSC: 'CSC'\n };\n\n return {\n isRequester: isRequester,\n isTechnician: isTechnician,\n isCsc: isCsc,\n roles: roles\n };\n });\n\n'use strict';\n\nangular.module('helpers')\n .directive('pmAssociationValidator', function () {\n return {\n scope: {\n association: '=pmAssociationValidator',\n invertCheck: '=?'\n },\n require: 'ngModel',\n link: function (scope, elm, attrs, ctrl) {\n ctrl.$validators.pmAssociation = function (modelValue, viewValue) {\n if (scope.invertCheck) {\n return !viewValue || !scope.association;\n }\n return viewValue || !scope.association;\n };\n }\n };\n });\n\n/**\n * @ngdoc service\n * @name helpers.pmAssociationsService\n *\n * @description\n * Service for checking pm associations\n *\n */\n\n'use strict';\n\nangular.module('helpers')\n .service('pmAssociationsService', function ($translate, DudeApi) {\n /**\n * @ngdoc method\n * @name isAssociated\n * @methodOf helpers.pmAssociationsService\n *\n * @description\n * Checks if the attribute is associated to pm's\n *\n * @param {object} filters The filter object to pass\n * @returns {Promise} A promise that resolves to the first associated workOrderTemplate\n */\n var isAssociated = function (filters) {\n filters.pageSize = 1;\n filters.isActive = true;\n\n if (filters.assignees) {\n return DudeApi.PmScheduleEntity.query(filters).$promise;\n }\n\n return DudeApi.WorkOrderTemplateEntity.query(filters).$promise;\n };\n\n /**\n * @ngdoc method\n * @name validationMessage\n * @methodOf helpers.pmAssociationsService\n *\n * @description\n * Returns the validation message for the association to pms for a given attribute and count\n *\n * @param {string} type The attribute name\n * @param {number} number The number of pm associations\n * @returns {string} A string containing the validation message to display\n */\n var validationMessage = function (type, number) {\n var text = '';\n // \"Cannot disable this user because they are associated with 1 active PM Schedule. Please reassign the PM Schedule.\"\n text += type === 'user' ? $translate.instant('helpers.pmAssociations.cannotDisable') : $translate.instant('helpers.pmAssociations.cannotInactivate');\n text += type;\n text += type === 'user' ? $translate.instant('helpers.pmAssociations.theyAreAssociated') : $translate.instant('helpers.pmAssociations.itIsAssociated');\n text += number;\n text += number > 1 ? $translate.instant('helpers.pmAssociations.multiPm') : $translate.instant('helpers.pmAssociations.singlePm');\n return text;\n };\n\n return {\n isAssociated: isAssociated,\n validationMessage: validationMessage\n };\n });\n\n'use strict';\n\nangular.module('helpers')\n .constant('permission', {\n workOrders: {\n create: 'WorkOrders-Create',\n read: 'WorkOrders-Read',\n update: 'WorkOrders-Update',\n receiveCreatedNotification: 'WorkOrders-ReceiveCreatedNotification',\n readAllDetails: 'WorkOrders-ReadAllDetails',\n createTasks: 'WorkOrders-CreateTasks',\n deleteTasks: 'WorkOrders-DeleteTasks'\n },\n users: {\n create: 'Users-Create',\n read: 'Users-Read',\n update: 'Users-Update'\n },\n purposes: {\n create: 'Purposes-Create',\n read: 'Purposes-Read',\n update: 'Purposes-Update',\n delete: 'Purposes-Delete'\n },\n trades: {\n create: 'Trades-Create',\n read: 'Trades-Read',\n update: 'Trades-Update',\n delete: 'Trades-Delete'\n },\n workTypes: {\n create: 'WorkTypes-Create',\n read: 'WorkTypes-Read',\n update: 'WorkTypes-Update',\n delete: 'WorkTypes-Delete'\n },\n businessAssets: {\n create: 'BusinessAssets-Create',\n read: 'BusinessAssets-Read',\n update: 'BusinessAssets-Update',\n delete: 'BusinessAssets-Delete'\n },\n businessAssetTypes: {\n create: 'BusinessAssetTypes-Create',\n read: 'BusinessAssetTypes-Read',\n update: 'BusinessAssetTypes-Update',\n delete: 'BusinessAssetTypes-Delete'\n },\n laborHourTypes: {\n create: 'LaborHourTypes-Create',\n read: 'LaborHourTypes-Read',\n update: 'LaborHourTypes-Update',\n delete: 'LaborHourTypes-Delete'\n },\n transactions: {\n create: 'Transactions-Create',\n read: 'Transactions-Read',\n updateAny: 'Transactions-UpdateAny',\n deleteAny: 'Transactions-DeleteAny'\n },\n pmSchedules: {\n create: 'PmSchedules-Create',\n read: 'PmSchedules-Read',\n update: 'PmSchedules-Update',\n delete: 'PmSchedules-Delete'\n },\n taskBooks: {\n create: 'TaskBooks-Create',\n read: 'TaskBooks-Read',\n update: 'TaskBooks-Update',\n delete: 'TaskBooks-Delete'\n },\n calendarEvents: {\n create: 'CalendarEvents-Create',\n read: 'CalendarEvents-Read',\n update: 'CalendarEvents-Update'\n },\n inventoryItems: {\n create: 'InventoryItems-Create',\n read: 'InventoryItems-Read',\n update: 'InventoryItems-Update',\n delete: 'InventoryItems-Delete'\n },\n inventoryTransactions: {\n create: 'InventoryTransactions-Create',\n read: 'InventoryTransactions-Read',\n issue: 'InventoryTransactions-CreateIssue'\n },\n inventoryTransactionReasons: {\n read: 'InventoryTransactionReasons-Read'\n },\n accounts: {\n create: 'Accounts-Create',\n read: 'Accounts-Read',\n update: 'Accounts-Update',\n delete: 'Accounts-Delete'\n },\n departments: {\n create: 'Departments-Create',\n read: 'Departments-Read',\n update: 'Departments-Update'\n },\n projects: {\n create: 'Projects-Create',\n read: 'Projects-Read',\n update: 'Projects-Update'\n },\n comments: {\n update: 'Comments-Update',\n delete: 'Comments-Delete'\n },\n history: {\n read: 'History-Read'\n },\n floorPlans: {\n create: 'Floorplans-Create',\n read: 'Floorplans-Read',\n update: 'Floorplans-Update',\n delete: 'Floorplans-Delete'\n }\n });\n\n/**\n * @ngdoc service\n * @name helpers.defaultPurposesService\n * @requires DudeApi\n *\n * @description\n * Service for handling the default purpose values\n *\n */\n\n'use strict';\n\nangular.module('helpers')\n .service('defaultPurposesService', function ($q, DudeApi, marketizr, market, settingsHelpers) {\n var purposeKeys = Object.freeze({\n reactivePurpose: 'MM-defaults-reactivePurpose',\n plannedPurpose: 'MM-defaults-plannedPurpose'\n });\n\n var defaultPurposes = {\n planned: 'Preventive Maintenance'\n };\n\n var allPurposes = null;\n\n var getAllPurposes = function () {\n return $q(function (resolve) {\n if (allPurposes) {\n resolve(allPurposes);\n } else {\n DudeApi.PurposeEntity.query({ pageSize: 1000 }).$promise.then(function (purposes) {\n allPurposes = purposes.data;\n resolve(allPurposes);\n });\n }\n });\n };\n\n var getPurposeByType = function (purposes, key, isNew, purposeToQuery) {\n var valueToSet;\n return DudeApi.PurposeTypeEntity.query().$promise.then(function (purposeTypes) {\n var correctPurposeTypes = purposeTypes.data.filter(function (purposeType) {\n return purposeType.name === purposeToQuery;\n });\n if (correctPurposeTypes.length > 0) {\n valueToSet = purposes.filter(function (p) {\n return p.purposeType && p.purposeType.id === correctPurposeTypes[0].id;\n });\n valueToSet = valueToSet.length > 0 ? valueToSet[0] : null;\n if (!valueToSet) {\n for (var i = 0; i < purposes.length; i++) {\n if (purposes[i].purposeType) {\n valueToSet = purposes[i];\n break;\n }\n }\n valueToSet = valueToSet || purposes[0];\n settingsHelpers.saveSetting(key, valueToSet, isNew);\n return valueToSet;\n }\n settingsHelpers.saveSetting(key, valueToSet, isNew);\n return valueToSet;\n }\n valueToSet = purposes.length > 0 ? purposes[0] : null;\n settingsHelpers.saveSetting(key, valueToSet, isNew);\n return valueToSet;\n });\n };\n\n var setDefaultPurpose = function (key, isNew, updatedDefault) {\n var purposeToQuery;\n if (marketizr.hasMarkets([market.k12, market.ips, market.he, market.gov, market.other])) {\n defaultPurposes.reactive = 'Reactive Maintenance';\n } else if (marketizr.hasMarkets([market.mfg])) {\n defaultPurposes.reactive = 'Breakdown Maintenance';\n } else {\n defaultPurposes.reactive = 'Corrective Maintenance';\n }\n if (updatedDefault) {\n purposeToQuery = updatedDefault;\n } else {\n purposeToQuery = key === purposeKeys.reactivePurpose ? defaultPurposes.reactive : defaultPurposes.planned;\n }\n return getAllPurposes().then(function (purposes) {\n var valueToSet = purposes.filter(function (p) {\n return p.value === purposeToQuery;\n });\n valueToSet = valueToSet.length > 0 ? valueToSet[0] : null;\n if (!valueToSet && !isNew && updatedDefault) {\n return setDefaultPurpose(key, isNew);\n } else if (!valueToSet) {\n return getPurposeByType(purposes, key, isNew, purposeToQuery);\n }\n settingsHelpers.saveSetting(key, valueToSet, isNew).catch(function () {\n if (isNew) {\n settingsHelpers.saveSetting(key, valueToSet, false);\n }\n });\n return valueToSet;\n });\n };\n\n /**\n * @ngdoc method\n * @name getPurpose\n * @methodOf helpers.defaultPurposesService\n *\n * @description\n * Gets the purpose object for the default value. If it finds no value with the provided key it will try to set it to the base default purpose\n *\n * @param {string} key The key for the location of the purpose\n * @returns {Promise} A promise that resolves to the default purpose\n */\n var getPurpose = function (key) {\n allPurposes = null;\n return DudeApi.AccountSettingsEntity.get({ id: key }).$promise.then(function (result) {\n if (result && result.value && result.value.id && result.value.value) {\n return DudeApi.PurposeEntity.get({ id: result.value.id }).$promise.then(function (purpose) {\n if (purpose.value !== result.value.value && result.value.purposeType) {\n return setDefaultPurpose(key, false);\n } else if (result && result.value.id && !result.value.purposeType) {\n return setDefaultPurpose(key, false, result.value.value);\n }\n return purpose;\n }, function () {\n return setDefaultPurpose(key, false);\n });\n } else if (result) {\n return setDefaultPurpose(key, false);\n }\n return setDefaultPurpose(key, true);\n }, function () {\n return setDefaultPurpose(key, true);\n });\n };\n\n return {\n purposeKeys: purposeKeys,\n getPurpose: getPurpose\n };\n });\n\nangular.module('helpers')\n .filter('commaSeparate', function () {\n return function (input, option) {\n if (!option) {\n throw Error('Comma Separate filter requires at least one option');\n }\n\n if (!input || !Array.isArray(input) || input.length < 1) {\n return '';\n }\n\n return input.map(function (item) {\n return item[option];\n }).join(', ');\n };\n });\n\n'use strict';\n\nangular.module('floorPlanList', ['dudeControlsFile', 'translate', 'dudeControls', 'ui.router']);\n\n/**\n * @ngdoc directive\n * @name floorPlanList.floorPlanListPanel\n * @restrict E\n * @description\n *\n * Renders the floorPlanPanel sliding panel\n *\n * @param {object} panelObject The setting for the panel.\n */\n\n'use strict';\n\nangular.module('floorPlanList')\n .component('floorPlanListPanel', {\n templateUrl: 'app/components/floorPlanList/floorPlanListPanel.html',\n bindings: {\n panelObject: '<'\n },\n controller: 'FloorPlanListPanelComponent',\n controllerAs: 'floorPlanListPanel'\n })\n .controller('FloorPlanListPanelComponent', function ($scope, $q, $translate, $state, fileHelpers, log, DudeApi) {\n var self = this;\n var MINIMUM_WIDTH = 850;\n var MINIMUM_HEIGHT = 500;\n var ALLOWED_FILE_TYPE = 'image';\n self.file = '';\n self.asset = '';\n self.entity = null;\n self.minimumSizeError = $translate.instant('attachments.notify.upload.errors.fileMinimumSize');\n self.fileTooLarge = $translate.instant('attachments.notify.upload.errors.fileLargeSize');\n self.saveAttempt = false;\n\n self.assetBrowseOptions = {\n type: 'slidingPanel',\n keepFiltersOpen: true,\n filterPanel: {\n search: {\n filter: 'q'\n }\n }\n };\n\n var uploadErrorHandler = function (file) {\n return function (error) {\n var errorMessage = error.data.message.length ? error.data.message : error.data.validationErrors[0].message;\n\n angular.extend(file, {\n uploading: false,\n error: true,\n errorMessage: fileHelpers.errorMessage(errorMessage)\n });\n\n self.isGenericFileError = self.file.errorMessage && (self.file.errorMessage !== self.minimumSizeError && self.file.errorMessage !== self.fileTooLarge);\n\n if (error.data.message.length) {\n log.notify({\n type: 'error',\n title: $translate.instant('floorPlanList.notify.upload.error'),\n message: error.data.message\n });\n }\n };\n };\n\n var saveErrorHandler = function () {\n self.saveError = true;\n return $q.reject();\n };\n\n self.buttonFunctions = {\n saveFunction: function () {\n self.saveError = false;\n\n if (!self.entity) {\n return $q.reject();\n }\n\n var floorPlan = new DudeApi.FloorPlanEntity({\n fileId: self.entity.id,\n name: self.entity.filename,\n fileViewToken: fileHelpers.shareableGuid(self.entity),\n businessAsset: self.asset\n });\n\n return floorPlan.$save().then(function (response) {\n log.notify({\n title: $translate.instant('floorPlanList.notify.upload.success.title'),\n type: 'success',\n message: $translate.instant('floorPlanList.notify.upload.success.message') + ' ' + self.asset.name\n });\n $state.go('secure.assetFloorPlanView', { id: response.id });\n }, saveErrorHandler);\n },\n cancelFunction: function () {\n self.file = '';\n self.asset = '';\n self.entity = null;\n self.saveAttempt = false;\n self.saveError = false;\n }\n };\n\n self.upload = function () {\n var options = {\n minWidth: MINIMUM_WIDTH,\n minHeight: MINIMUM_HEIGHT,\n allowedUploadTypes: ALLOWED_FILE_TYPE\n };\n self.uploading = true;\n var upload = fileHelpers.uploadFile(self.file, options);\n upload.then(function (result) {\n self.entity = result;\n }, uploadErrorHandler(self.file));\n };\n\n self.$onInit = function () {\n $scope.$watch('floorPlanListPanel.file', function (newVal, oldVal) {\n if (!newVal || newVal === oldVal) {\n return;\n }\n self.upload();\n });\n };\n });\n\n/**\n * @ngdoc service\n * @name floorPlanList.floorPlanListService\n * @requires DudeApi\n *\n * @description\n * Service for supporting the list of floor plans\n *\n */\n\n'use strict';\n\nangular.module('floorPlanList')\n .service('floorPlanListService', function (DudeApi, pagingHelpers) {\n /**\n * @ngdoc method\n * @name getListData\n * @methodOf floorPlanList.floorPlanListService\n *\n * @description\n * Gets a list of floor plans\n *\n * @param {object} filter An object containing the filters to query with\n * @returns {Promise} A promise that resolves to the paged list of floor plans\n */\n var getListData = function (filter) {\n return DudeApi.FloorPlanEntity.query(filter);\n };\n\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf floorPlanList.floorPlanListService\n *\n * @description\n * Gets the filter object to query with\n *\n * @param {object} params The params to parse into the floor plan filter object\n * @returns {object} A filter object ready to query against the floor plans entity\n */\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'BusinessAsset/Name asc'\n };\n\n return currentFilter;\n };\n\n return {\n getListData: getListData,\n getFilters: getFilters\n };\n });\n\n'use strict';\n\nangular.module('floorPlanList')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.floorPlanList', {\n url: 'floorPlans?page&orderBy',\n templateUrl: 'app/components/floorPlanList/floorPlanList.html',\n controller: 'FloorPlanListController',\n controllerAs: 'floorPlanList',\n feature: 'floorplans',\n permissions: [permission.floorPlans.read],\n resolve: {\n initData: function ($q, $stateParams, floorPlanListService) {\n var filters = floorPlanListService.getFilters($stateParams);\n return $q.all({\n filters: filters,\n initResponse: floorPlanListService.getListData(filters).$promise\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('floorPlanList')\n .controller('FloorPlanListController', function ($scope, $translate, queryHelpers, floorPlanListService, initData, appConfig) {\n var self = this;\n var queryDefaults = floorPlanListService.getFilters({});\n var pageChanging = false;\n\n self.listData = initData.initResponse.data;\n self.filters = initData.filters;\n self.totalCount = initData.initResponse.total;\n self.imageUrlPrefix = appConfig.api.file + '/file/public/';\n\n self.openFloorPlanListPanel = function () {\n self.panelObject = {\n titles: {\n title: $translate.instant('floorPlanList.newFloorPlan')\n },\n open: true,\n template: 'app/components/floorPlanList/floorPlanListPanel.html'\n };\n };\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n floorPlanListService.getListData(self.filters).$promise.then(setData);\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n $scope.$watch('floorPlanList.filters', updateFilters, true);\n });\n\n/**\n * @ngdoc directive\n * @name filters.filter-workorder-status\n * @restrict E\n * @description\n *\n * The Work Order Status checkbox filter\n *\n * @param {any} filter The item to filter on\n * @param {boolean} isOpen True to open the filter. (Optional)\n *\n */\n\n'use strict';\n\nangular.module('workOrderFilters')\n .component('filterWorkorderStatus', {\n templateUrl: 'app/components/filterWorkorderStatus/filterWorkorderStatus.html',\n require: {\n filterPanelController: '^filterPanel'\n },\n bindings: {\n filter: '=',\n isOpen: '=?'\n },\n controller: 'FilterWorkorderStatusController',\n controllerAs: 'filterWorkorderStatus'\n })\n .controller('FilterWorkorderStatusController', function (workOrderEnums) {\n var self = this;\n\n self.status = workOrderEnums.status;\n\n self.updateStatuses = function (status) {\n var index = self.filter.indexOf(status);\n if (index > -1) {\n self.filter.splice(index, 1);\n } else {\n self.filter.push(status);\n }\n\n if (self.filter.length === 0) {\n self.filter.push('all');\n } else {\n var checkedAll = self.filter.indexOf('all');\n\n if (checkedAll > -1) {\n self.filter.splice(checkedAll, 1);\n }\n }\n };\n\n self.showBadge = function () {\n if (self.filter.indexOf('all') > -1) {\n return '';\n }\n\n return self.filterPanelController.showBadge(self.filter);\n };\n\n self.$onInit = function () {\n self.isOpen = self.isOpen || self.filterPanelController.openOnLoad(self.filter);\n };\n });\n\n/**\n * @ngdoc directive\n * @name filters.filter-workorder-priority\n * @restrict E\n * @description\n *\n * The Work Order Priority checkbox filter\n *\n * @param {any} filter The item to filter on\n * @param {boolean} isOpen True to open the filter. (Optional)\n *\n */\n\n'use strict';\n\nangular.module('workOrderFilters')\n .component('filterWorkorderPriority', {\n templateUrl: 'app/components/filterWorkorderPriority/filterWorkorderPriority.html',\n require: {\n filterPanelController: '^filterPanel'\n },\n bindings: {\n filter: '=',\n isOpen: '=?'\n },\n controller: 'FilterWorkorderPriorityController',\n controllerAs: 'filterWorkorderPriority'\n })\n .controller('FilterWorkorderPriorityController', function (workOrderEnums) {\n var self = this;\n\n self.priority = workOrderEnums.priority;\n\n self.updatePriorities = function (priority) {\n var index = self.filter.indexOf(priority);\n if (index > -1) {\n self.filter.splice(index, 1);\n } else {\n self.filter.push(priority);\n }\n\n if (self.filter.length === 0) {\n self.filter.push('all');\n } else {\n var checkedAll = self.filter.indexOf('all');\n\n if (checkedAll > -1) {\n self.filter.splice(checkedAll, 1);\n }\n }\n };\n\n self.showBadge = function () {\n if (self.filter.indexOf('all') > -1) {\n return '';\n }\n\n return self.filterPanelController.showBadge(self.filter);\n };\n\n self.$onInit = function () {\n self.isOpen = self.isOpen || self.filterPanelController.openOnLoad(self.filter);\n };\n });\n\n/**\n * @ngdoc directive\n * @name reportFilters.report-date-filter\n * @restrict E\n * @description\n *\n * Displays the report filter for selecting a completion date filter or request date filter\n *\n * @param {object} filters the filter object to check against for completionDate and requestDate filters\n * @param {boolean} cleared the boolean that is watched for when filters are cleared\n * @param {array} dateValues array of objects containing date values (Optional)\n *\n */\n\n'use strict';\n\nangular.module('workOrderFilters')\n .directive('workOrderDateFilter', function ($translate, marketizr, market) {\n return {\n restrict: 'E',\n replace: true,\n scope: {\n filters: '=',\n cleared: '=?',\n dateValues: ' 1) {\n pathArray.pop();\n }\n return 'MM-Filter' + pathArray.join('-');\n };\n\n var buildKey = function (id) {\n return buildPrefix() + '-' + id;\n };\n\n var sanitizeDateRanges = function (filters) {\n var dateTypes = [\n {\n to: 'requestDateTo',\n from: 'requestDateFrom',\n range: 'requestDateRange'\n },\n {\n to: 'completionDateTo',\n from: 'completionDateFrom',\n range: 'completionDateRange'\n },\n {\n to: 'dateTo',\n from: 'dateFrom',\n range: 'dateRange'\n }\n ];\n\n return dateTypes.reduce(function (pv, cv) {\n if (pv[cv.range] && pv[cv.range].toLowerCase() !== 'custom') {\n delete pv[cv.to];\n delete pv[cv.from];\n }\n return pv;\n }, filters);\n };\n\n /**\n * @ngdoc method\n * @name getSavedFilters\n * @methodOf filterBar.savedFiltersService\n *\n * @description\n * Gets a user's saved filters from the User Settings Entity\n *\n * @param {string} path The path to build the saved filters key prefix (optional)\n * @returns {Promise} A promise that returns with all of the data returned in the page wrapper format\n */\n var getSavedFilters = function (path) {\n return DudeApi.UserSettingsEntity.query({\n userId: userContext.user.id,\n prefix: buildPrefix(path)\n }).$promise.then(function (result) {\n return result.data;\n });\n };\n\n /**\n * @ngdoc method\n * @name getFilterIfExistsForUser\n * @methodOf filterBar.savedFiltersService\n *\n * @description\n * Retrieves the saved filter if it exists for the current user\n *\n * @param {string} id The filter id for the saved filter\n * @param {object} myFilters a user's saved filters\n * @returns {object} The saved filter if it exists for the user\n */\n var getFilterIfExistsForUser = function (id, myFilters) {\n var savedFilter = null;\n myFilters.forEach(function (item) {\n if (item.value && item.value.query && item.value.query.filterId === id) {\n savedFilter = item.value;\n }\n });\n return savedFilter;\n };\n\n var saveUserSetting = function (key, value, isNew) {\n var defaultSetting = {\n key: key,\n value: value || {}\n };\n return isNew ? DudeApi.UserSettingsEntity.save({ userId: userContext.user.id }, defaultSetting).$promise : DudeApi.UserSettingsEntity.update({ settingKey: key, userId: userContext.user.id }, defaultSetting).$promise;\n };\n\n /**\n * @ngdoc method\n * @name setSavedFilter\n * @methodOf filterBar.savedFiltersService\n *\n * @description\n * Sets a user's saved filter via the User Settings Entity\n *\n * @param {string} name the name of the saved filter specified by the user\n * @param {object} filters stores the value of all defined filters\n * @returns {Promise} A promise that returns with the saved filter user setting\n */\n var setSavedFilter = function (name, filters) {\n var isCreate = (!filters.filterId);\n var query = angular.copy(filters);\n\n if (isCreate) {\n query.filterId = dudeGuid.generate();\n }\n\n var key = buildKey(query.filterId);\n var value = {\n name: name,\n query: sanitizeDateRanges(query)\n };\n\n return saveUserSetting(key, value, isCreate)\n .catch(function () {\n if (isCreate) {\n saveUserSetting(key, value, false);\n }\n });\n };\n\n /**\n * @ngdoc method\n * @name deleteSavedFilter\n * @methodOf filterBar.savedFiltersService\n *\n * @description\n * Deletes a user's saved filter via the User Settings Entity\n *\n * @returns {Promise} A promise that returns an empty object\n */\n var deleteSavedFilter = function () {\n return DudeApi.UserSettingsEntity.delete({\n userId: userContext.user.id,\n settingKey: buildKey($location.search().filterId)\n }).$promise;\n };\n\n return {\n getSavedFilters: getSavedFilters,\n getFilterIfExistsForUser: getFilterIfExistsForUser,\n setSavedFilter: setSavedFilter,\n deleteSavedFilter: deleteSavedFilter\n };\n });\n\n/**\n * @ngdoc service\n * @name filterBar.filterStateService\n *\n * @description\n * Service for storing the state of applied saved filter, my filters, ignore for badges, and total count\n */\n\n'use strict';\n\nangular.module('filterBar')\n .factory('filterStateService', function () {\n /**\n * @ngdoc property\n * @name state\n * @propertyOf filterBar.filterStateService\n *\n * @description\n * Stores the state of applied saved filter, my filters, ignore for badges, and total count\n */\n var state = {};\n\n var findSavedFilterIndex = function (id) {\n var savedFilterIndex = -1;\n state.myFilters.some(function (item, index) {\n if (item.value.query.filterId === id) {\n savedFilterIndex = index;\n return true;\n }\n return false;\n });\n return savedFilterIndex;\n };\n\n /**\n * @ngdoc method\n * @name setState\n * @methodOf filterBar.filterStateService\n *\n * @description\n * Updates the state for page load\n *\n * @param {object} data Initial values for filter states coming from the route\n * @param {array} ignoreForBadge List of filters which should not count towards total badge count\n */\n var setState = function (data, ignoreForBadge) {\n state.activeSavedFilter = data.activeSavedFilter;\n state.myFilters = data.myFilters;\n if (data.initResponse) {\n state.totalCount = data.initResponse.total || 0;\n }\n state.ignoreForBadge = ignoreForBadge;\n };\n\n /**\n * @ngdoc method\n * @name setFilters\n * @methodOf filterBar.filterStateService\n *\n * @description\n * Updates the state of activeSavedFilter and myFilters during an apply\n *\n * @param {object} value The object containing the current filter being applied\n * @param {boolean} save Whether or not the current filter is being saved\n */\n var setFilters = function (value, save) {\n state.activeSavedFilter = value.query.filterId ? value : null;\n if (save) {\n var savedFilterIndex = findSavedFilterIndex(value.query.filterId);\n if (savedFilterIndex > -1) {\n state.myFilters[savedFilterIndex] = { value: value };\n } else {\n state.myFilters.push({ value: value });\n }\n }\n };\n\n /**\n * @ngdoc method\n * @name clearFilters\n * @methodOf filterBar.filterStateService\n *\n * @description\n * Updates the state of activeSavedFilter and myFilters during a clear\n *\n * @param {boolean} removeMyFilter Whether or not the current filter is being deleted\n */\n var clearFilters = function (removeMyFilter) {\n if (removeMyFilter) {\n var savedFilterIndex = findSavedFilterIndex(state.activeSavedFilter.query.filterId);\n if (savedFilterIndex > -1) {\n state.myFilters.splice(savedFilterIndex, 1);\n }\n }\n state.activeSavedFilter = null;\n };\n\n return {\n clearFilters: clearFilters,\n setState: setState,\n setFilters: setFilters,\n state: state\n };\n });\n\n/**\n * @ngdoc directive\n * @name filterBar.filter-bar\n * @restrict E\n * @description\n *\n * Displays a horizontal element which contains filter options both adhoc and saved\n *\n * @param {string} name of the filter-bar element (optional)\n * @param {string} title of the filter-bar element - doesn't manifest visually (optional)\n * @param {function} clearFunction function reference to handle the clear action\n * @param {function} toggleFilters function reference to handle the display of filter options\n * @param {Object} filters the filters\n * @param {function} setFunction function reference to set the filters (optional)\n * @param {boolean} disableMyFilters Disables the ability to save custom filters (optional)\n **/\n\n'use strict';\n\nangular.module('filterBar')\n .component('filterBar', {\n templateUrl: 'app/components/filter-bar/filter-bar.html',\n bindings: {\n name: '@?',\n title: '@?',\n clearFunction: '&',\n toggleFilters: '&',\n filters: '<',\n setFunction: '&?',\n disableMyFilters: ' 0) {\n return pv + tempFilters[key].length;\n } else if (!angular.isArray(tempFilters[key]) && tempFilters[key]) {\n return pv + 1;\n }\n return pv;\n }, 0);\n };\n });\n\n'use strict';\n\nangular.module('failureReport', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'report']);\n\n'use strict';\n\nangular.module('failureReport')\n .controller('FailureReportListController', function ($scope, $state, filterStateService, initData, reportFiltersService, failureReportService, queryHelpers, orderByHelpers) {\n var self = this;\n var queryDefaults = reportFiltersService.getFilters({});\n var pageChanging = false;\n\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.listData = initData.initResponse.data;\n self.filters = initData.filters;\n\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'includeDescendants', 'returnAverages', 'assetRollUp', 'isLocation', 'filterId', 'requestDateRange', 'completionDateRange'];\n\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n var setData = function (response) {\n self.listData = response.data;\n self.filterState.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n failureReportService.loadAssets(self.filters).then(function (purposes) {\n failureReportService.getListData(self.filters, purposes).then(setData);\n });\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.failureReportFilter = function () {\n self.openWhen = { value: true };\n };\n\n self.setFilters = function (value, save) {\n self.filters = reportFiltersService.getFilters(value.query);\n filterStateService.setFilters(value, save);\n };\n\n self.clearFilters = function (removeMyFilter) {\n self.filters = reportFiltersService.getFilters(\n {\n orderBy: self.filters.orderBy,\n assetRollUp: self.filters.includeDescendants\n });\n filterStateService.clearFilters(removeMyFilter);\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.status = cloned.status === 'all' ? [] : cloned.status;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, reportFiltersService.getFilters({}));\n };\n\n self.getFailures = function (failureReport) {\n failureReport.failureToggle = !failureReport.failureToggle;\n\n if (failureReport.failureToggle) {\n failureReportService.getAssetFailures(self.filters, failureReport.asset.id).then(function (result) {\n failureReport.failureSummary = result.data;\n });\n }\n };\n\n self.routeToWorkOrders = function (failure, asset) {\n var filterCopy = angular.copy(self.filters);\n delete filterCopy.orderBy;\n filterCopy.includeDescendants = angular.copy(filterCopy.assetRollUp);\n delete filterCopy.assetRollUp;\n filterCopy.failureReason = failure;\n filterCopy.businessAsset = asset;\n $state.go('secure.workOrderList', filterCopy);\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.chartRoute = function () {\n $state.go('secure.report.failureChart', self.filters);\n };\n\n self.export = function () {\n failureReportService.exportFailureReport(self.filters);\n };\n\n $scope.$watch('failureReport.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('failureReport')\n .controller('FailureReportChartController', function ($log, $scope, $state, $translate, clientHelperService, failureReportService, filterStateService, initData, popBoxService, queryHelpers, reportFiltersService, responsiveBreakpoints) {\n var self = this;\n var queryDefaults = reportFiltersService.getFilters({});\n var emptyData = {\n dataArray: [['', ''], ['', { v: 0 }]]\n };\n var primaryFiltersCopy = {};\n\n self.screenSize = clientHelperService.getCurrentScreenSize();\n\n self.DRILLDOWN_POPBOX = 'asset-drill-down-chart';\n\n self.filters = initData.filters;\n\n self.assetLabels = {\n title: $translate.instant('failureReports.failuresBy'),\n yAxis: $translate.instant('failureReports.numberOf')\n };\n\n self.failureLabels = {\n title: $translate.instant('failureReports.title'),\n yAxis: $translate.instant('failureReports.numberOf')\n };\n\n self.assetChartData = angular.copy(emptyData);\n self.failureReasonChartData = angular.copy(emptyData);\n\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'includeDescendants', 'returnAverages', 'assetRollUp', 'isLocation', 'filterId', 'requestDateRange', 'completionDateRange'];\n\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n var updateFilters = function () {\n var filtersToCheck = ['purpose', 'status', 'requestDateTo', 'requestDateFrom', 'requestDateRange', 'completionDateFrom', 'completionDateTo', 'completionDateRange', 'businessAsset', 'includeDescendants', 'assetRollUp'];\n if (reportFiltersService.compareFilters(self.filters, primaryFiltersCopy, filtersToCheck)) {\n return;\n }\n primaryFiltersCopy = angular.copy(self.filters);\n self.assetLabels.title = $translate.instant('failureReports.failuresBy');\n\n failureReportService.loadAssets(primaryFiltersCopy).then(function (purposes) {\n self.assetChartData = failureReportService.workOrderChartData(primaryFiltersCopy, purposes, self.assetLabels);\n });\n\n queryHelpers.updateState(primaryFiltersCopy, queryDefaults);\n popBoxService.close(self.DRILLDOWN_POPBOX);\n };\n\n self.failureReportFilter = function () {\n self.openWhen = { value: true };\n };\n\n self.setFilters = function (value, save) {\n self.filters = reportFiltersService.getFilters(value.query);\n filterStateService.setFilters(value, save);\n };\n\n self.clearFilters = function (removeMyFilter) {\n self.filters = reportFiltersService.getFilters(\n {\n orderBy: self.filters.orderBy,\n assetRollUp: self.filters.includeDescendants\n });\n filterStateService.clearFilters(removeMyFilter);\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.status = cloned.status === 'all' ? [] : cloned.status;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, reportFiltersService.getFilters({}));\n };\n\n var convertAssetRollUp = function (filter) {\n filter.includeDescendants = angular.copy(filter.assetRollUp);\n delete filter.assetRollUp;\n };\n\n var desktopFailureReasonChartFunction = function (filterCopy) {\n failureReportService.loadAssets(filterCopy).then(function (assets) {\n self.failureReasonChartData = failureReportService.failureReasonChartData(filterCopy, assets[0], self.failureLabels, self.activeAsset);\n });\n\n $log.log('Open drill down pop-box');\n popBoxService.open(self.DRILLDOWN_POPBOX);\n };\n\n self.clickFunctionObject = {\n chartFunction: function (id) {\n $log.log('Asset Failure bar clicked');\n var filterCopy = angular.copy(self.filters);\n delete filterCopy.orderBy;\n filterCopy.businessAsset = [id];\n\n var index = self.assetChartData.idArray.indexOf(id);\n\n self.activeAsset = {\n name: self.assetChartData.dataArray[index + 1][0] + ' ' + $translate.instant('failureReports.failureReasons'),\n id: id,\n value: self.assetChartData.dataArray[index + 1][1].v,\n failures: [],\n filters: angular.copy(filterCopy)\n };\n\n convertAssetRollUp(self.activeAsset.filters);\n\n if (!id) {\n popBoxService.close(self.DRILLDOWN_POPBOX);\n return;\n }\n\n if (self.screenSize.breakpoint > responsiveBreakpoints.xs) {\n desktopFailureReasonChartFunction(filterCopy);\n } else {\n failureReportService.getAssetFailures(filterCopy, id).then(function (results) {\n self.activeAsset.failures = results.data.map(function (summary) {\n return summary.failureReason.id;\n });\n self.routeToWorkOrders(self.activeAsset.id);\n });\n }\n }\n };\n\n self.clearSelection = function () {\n self.assetChartData.clearSelection = true;\n self.failureReasonChartData = angular.copy(emptyData);\n self.activeAsset = {};\n };\n\n self.routeToWorkOrders = function (asset) {\n var filtersCopy = angular.copy(self.filters);\n delete filtersCopy.orderBy;\n convertAssetRollUp(filtersCopy);\n filtersCopy.businessAsset = asset;\n filtersCopy.failureReason = self.activeAsset.failures;\n\n $state.go('secure.workOrderList', filtersCopy);\n };\n\n self.subChartClickObject = {\n chartFunction: function (id) {\n var filtersCopy = angular.copy(self.filters);\n delete filtersCopy.orderBy;\n convertAssetRollUp(filtersCopy);\n filtersCopy.businessAsset = self.activeAsset.id;\n filtersCopy.failureReason = id;\n\n $state.go('secure.workOrderList', filtersCopy);\n }\n };\n\n self.listRoute = function () {\n $state.go('secure.report.failureList', self.filters);\n };\n\n $scope.$watch('failureReport.filters', updateFilters, true);\n });\n\n/**\n * @ngdoc service\n * @name failureReport.failureReportService\n * @requires $q - {@link https://docs.angularjs.org/api/ng/service/$q read the docs}\n * @requires $filter - {@link https://docs.angularjs.org/api/ng/service/$filter read the docs}\n * @requires $translate - {@link https://angular-translate.github.io/docs/#/api/pascalprecht.translate.$translate read the docs}\n * @requires DudeApi - {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApi.DudeApi read the docs}\n * @requires report.reportFiltersService\n * @requires report.reportTooltipService\n * @requires report.reportDataService\n *\n * @description\n * Service for supporting the failure report\n *\n */\n\n'use strict';\n\nangular.module('failureReport')\n .service('failureReportService', function ($q, $filter, $translate, DudeApi, reportFiltersService, reportTooltipService, reportDataService) {\n var CHART_ITEMS_TO_SHOW = 5;\n\n /**\n * @ngdoc method\n * @name loadAssets\n * @methodOf failureReport.failureReportService\n *\n * @description\n * Returns a promise containing the business assets\n *\n * @param {object} filter An object containing the filter to use\n * @returns {promise} Promise containing the list of business assets\n */\n var loadAssets = function (filter) {\n if (filter.businessAsset && filter.businessAsset.length) {\n var promises = filter.businessAsset.map(function (assetId) {\n return DudeApi.BusinessAssetEntity.get({ id: assetId }).$promise;\n });\n\n return $q.all(promises);\n }\n\n var deferred = $q.defer();\n\n deferred.resolve([]);\n return deferred.promise;\n };\n\n var getData = function (query) {\n var filters = reportFiltersService.toApiFilter(query);\n return DudeApi.FailuresSummaryEntity.query(filters).$promise;\n };\n\n /**\n * @ngdoc method\n * @name getAssetFailures\n * @methodOf failureReport.failureReportService\n *\n * @description\n * Gets data and parses it into a format to be used with google charts\n *\n * @param {object} filters An object containing the filter to use\n * @param {number} assetId The business asset expected to drill into\n * @returns {Promise} An promise containing the asset failures summary\n */\n var getAssetFailures = function (filters, assetId) {\n var copy = angular.copy(filters);\n copy.orderBy = 'Count desc,FailureReason/Name asc';\n copy.id = assetId;\n return DudeApi.AssetFailuresSummaryEntity.query(copy).$promise;\n };\n\n /**\n * @ngdoc method\n * @name getListData\n * @methodOf failureReport.failureReportService\n *\n * @description\n * Returns an object containing paged asset report data. It adds missing assets that are passed in via an array\n *\n * @param {object} query An object containing the filter to use\n * @param {array} assets An array of expected assets\n * @returns {object} Returns a page wrapper containing a list of failure report data\n */\n var getListData = function (query, assets) {\n if (!query.orderBy || !(query.orderBy.indexOf('Asset/') === 0 || query.orderBy.indexOf('Self/') === 0)) {\n query.orderBy = query.assetRollUp === 'true' ? 'Totals/Failures desc' : 'Self/Failures desc';\n query.orderBy += ',Asset/Value asc';\n }\n\n return getData(query).then(function (pagedAssets) {\n assets.forEach(function (asset) {\n var matched = pagedAssets.data.some(function (value) {\n return value.asset.id === asset.id;\n });\n\n if (matched) {\n return;\n }\n\n pagedAssets.count++;\n pagedAssets.data.push({\n asset: {\n value: asset.name,\n id: asset.id,\n ancestorIdPath: asset.ancestorIdPath,\n ancestorNamePath: asset.ancestorNamePath\n },\n self: {\n failures: 0\n },\n descendants: {\n failures: 0\n },\n totals: {\n failures: 0\n }\n });\n });\n\n if (query.assetRollUp === 'true') {\n pagedAssets.data.forEach(function (asset) {\n if (!asset.totals) {\n return;\n }\n asset.self.failures = asset.totals.failures;\n });\n }\n return pagedAssets;\n });\n };\n\n var fetchStandardChartData = function (filter, assets, endPoint, textPlural, textSingular, labels) {\n filter.orderBy += ',Asset/Value asc';\n filter = reportFiltersService.toApiFilter(filter);\n filter.pageSize = assets.length || CHART_ITEMS_TO_SHOW;\n\n var dataObject = {\n idArray: [],\n hierarchyArray: [],\n dataArray: [[$translate.instant('purposeReports.purposes'), '', {\n type: 'string',\n role: 'tooltip',\n p: { html: true }\n }]],\n resolved: false\n };\n\n getData(filter).then(function (results) {\n var idHash = {};\n results.data.forEach(function (summary) {\n var value = summary.self[endPoint];\n if (filter.assetRollUp === 'true') {\n value = summary.totals[endPoint];\n }\n var text = value === 1 ? textSingular : textPlural;\n if (value > 0) {\n dataObject.dataArray.push([\n summary.asset.value,\n { v: value, f: $filter('number')(value) + ' ' + text },\n reportTooltipService.standardTooltip(summary.asset, $filter('number')(value) + ' ' + text)\n ]);\n dataObject.hierarchyArray.push(summary.asset.ancestorNamePath);\n dataObject.idArray.push(summary.asset.id);\n idHash[summary.asset.id] = true;\n }\n });\n\n reportDataService.topLabel(assets, results, dataObject, labels, 5);\n\n assets.forEach(function (asset) {\n if (idHash[asset.id]) {\n return;\n }\n\n dataObject.dataArray.push([\n asset.name,\n { v: 0, f: '0' + textPlural },\n ''\n ]);\n dataObject.idArray.push(asset.id);\n });\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name workOrderChartData\n * @methodOf failureReport.failureReportService\n *\n * @description\n * Gets data and parses it into a format to be used with google charts\n *\n * @param {object} filter An object containing the filter to use\n * @param {array} assets The business assets expected to show up\n * @param {object} labels An object containing the labels to use with the chart\n * @returns {object} An object containing all that is needed to show the work order chart\n */\n var workOrderChartData = function (filter, assets, labels) {\n filter.orderBy = filter.assetRollUp === 'true' ? 'Totals/Failures desc' : 'Self/Failures desc';\n\n return fetchStandardChartData(filter, assets, 'failures', $translate.instant('failureReports.failures'), $translate.instant('failureReports.failure'), labels);\n };\n\n /**\n * @ngdoc method\n * @name getWorkOrderFilters\n * @methodOf failureReport.failureReportService\n *\n * @description\n * Parses an object of filters used on the report into a filters object to use with the work order list\n *\n * @param {number} id The business asset id to view on the work order list\n * @param {object} filters An object containing the filters to use\n * @returns {object} An object containing the filters to use on the work order list\n */\n var getWorkOrderFilters = function (id, filters) {\n var filtersCopy = angular.copy(filters);\n delete filtersCopy.orderBy;\n delete filtersCopy.page;\n delete filtersCopy.pageSize;\n filtersCopy.includeDescendants = filtersCopy.assetRollUp;\n delete filtersCopy.assetRollUp;\n filtersCopy.businessAsset = id;\n return filtersCopy;\n };\n\n /**\n * @ngdoc method\n * @name failureReasonChartData\n * @methodOf failureReport.failureReportService\n *\n * @description\n * Gets data and parses it into a format to be used with google charts\n *\n * @param {object} filters An object containing the filters to use\n * @param {object} asset The business asset to drill into\n * @param {object} labels An object containing the labels to use with the chart\n * @param {object} activeAsset The asset object for the selected asset\n * @returns {object} An object containing all that is needed to show the failure reason chart\n */\n var failureReasonChartData = function (filters, asset, labels, activeAsset) {\n var copy = angular.copy(filters);\n delete copy.businessAsset;\n copy.orderBy = 'Count desc,FailureReason/Name asc';\n copy.id = asset.id;\n\n var dataObject = {\n idArray: [],\n dataArray: [['', '', {\n type: 'string',\n role: 'tooltip',\n p: { html: true }\n }]],\n resolved: false\n };\n\n DudeApi.AssetFailuresSummaryEntity.query(copy).$promise.then(function (result) {\n result.data.forEach(function (summary) {\n var value = summary.count;\n var text = value === 1 ? $translate.instant('reports.byWorkOrders.workOrder') : $translate.instant('reports.byWorkOrders.workOrders');\n if (value > 0) {\n dataObject.dataArray.push([\n summary.failureReason.name,\n { v: value, f: $filter('number')(value) + ' ' + text },\n reportTooltipService.standardTooltip(summary.failureReason, $filter('number')(value) + ' ' + text)\n ]);\n dataObject.idArray.push(summary.failureReason.id);\n }\n });\n activeAsset.failures = dataObject.idArray;\n activeAsset.filters.failureReason = dataObject.idArray;\n reportDataService.topLabel([asset], result, dataObject, labels, 5);\n\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name exportFailureReport\n * @methodOf failureReport.failureReportService\n *\n * @description\n * Downloads a spreadsheet of the asset report list\n *\n * @param {object} query An object containing the filter to use\n */\n var exportFailureReport = function (query) {\n var filters = reportFiltersService.toApiFilter(angular.copy(query));\n reportDataService.exportReport(filters, 'failuresbyasset');\n };\n\n return {\n loadAssets: loadAssets,\n getListData: getListData,\n workOrderChartData: workOrderChartData,\n getWorkOrderFilters: getWorkOrderFilters,\n failureReasonChartData: failureReasonChartData,\n getAssetFailures: getAssetFailures,\n exportFailureReport: exportFailureReport\n };\n });\n\n'use strict';\n\nangular.module('failureReport')\n .config(function ($stateProvider, permission, moment, workOrderEnums, dateHelperProvider, market) {\n var routeParams = 'status&purpose&requestDateTo&requestDateFrom&requestDateRange&completionDateTo&completionDateFrom&completionDateRange&dateRange&businessAsset&includeDescendants&assetRollUp&failureReason&orderBy&filterId';\n var defaults = {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.complete, workOrderEnums.status.onHold],\n toDate: dateHelperProvider.getEndOfDay(new Date()).toISOString(),\n // The default from date is 7 days in the past so we subtract 7 days worth of milliseconds from now to get the correct date\n fromDate: dateHelperProvider.getStartOfDay(moment().subtract(7, 'days')).toISOString()\n };\n\n var getActiveSavedFilter = function ($stateParams, myFilters, savedFiltersService) {\n var queryParams = $stateParams;\n if (queryParams.filterId) {\n return savedFiltersService.getFilterIfExistsForUser(queryParams.filterId, myFilters);\n }\n return null;\n };\n\n var getQueryParams = function ($location, $stateParams, activeSavedFilter, marketizr) {\n var defaultCopy = angular.copy(defaults);\n var queryParams = $stateParams;\n queryParams.assetRollUp = queryParams.includeDescendants || queryParams.assetRollUp || null;\n queryParams.includeDescendants = null;\n if (!queryParams.requestDateTo && !queryParams.requestDateFrom && !queryParams.completionDateFrom && !queryParams.completionDateTo && !queryParams.dateRange) {\n queryParams.requestDateTo = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.toDate : dateHelperProvider.getEndOfDay(moment().subtract(1, 'month').endOf('month')).toISOString();\n queryParams.requestDateFrom = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.fromDate : dateHelperProvider.getStartOfDay(moment().subtract(1, 'month').startOf('month')).toISOString();\n }\n if (!queryParams.filterId) {\n queryParams.status = queryParams.status || defaultCopy.status;\n }\n // If requesting a saved filter created for a different page or by a different user, remove the filter id\n if (queryParams.filterId && !activeSavedFilter) {\n delete queryParams.filterId;\n $location.search('filterId', null);\n }\n return queryParams;\n };\n\n $stateProvider\n .state('secure.report.failureList', {\n url: 'failure/list?page&pageSize&' + routeParams,\n templateUrl: 'app/components/failureReport/failureReportList.html',\n controller: 'FailureReportListController',\n controllerAs: 'failureReport',\n permissions: [permission.purposes.create, permission.purposes.update, permission.purposes.delete],\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/failure/list');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $q, $stateParams, activeSavedFilter, marketizr, myFilters, failureReportService, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n if (!queryParams.orderBy || !(queryParams.orderBy.indexOf('Asset/') === 0 || queryParams.orderBy.indexOf('Self/') === 0)) {\n queryParams.orderBy = queryParams.assetRollUp === 'true' ? 'Totals/Failures desc' : 'Self/Failures desc';\n queryParams.orderBy += ',Asset/Value asc';\n }\n var filters = reportFiltersService.toApiFilter(queryParams);\n\n return $q.all({\n initResponse: failureReportService.loadAssets(filters).then(function (purposes) {\n return failureReportService.getListData(filters, purposes);\n }),\n filters: filters,\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n });\n }\n }\n })\n .state('secure.report.failureChart', {\n url: 'failure/chart?' + routeParams,\n templateUrl: 'app/components/failureReport/failureReportChart.html',\n controller: 'FailureReportChartController',\n controllerAs: 'failureReport',\n permissions: [permission.purposes.create, permission.purposes.update, permission.purposes.delete],\n markets: [market.mfg, market.club, market.other, market.gov],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/failure/chart');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $stateParams, activeSavedFilter, marketizr, myFilters, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n var filters = reportFiltersService.getFilters(queryParams);\n\n return {\n filters: filters,\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n };\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('equipmentReport', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'report', 'assetReport']);\n\n'use strict';\n\nangular.module('equipmentReport')\n .config(function ($stateProvider, permission, moment, workOrderEnums, dateHelperProvider) {\n var routeParams = 'status&workType&purpose&requestDateTo&requestDateFrom&requestDateRange&completionDateTo&completionDateFrom&completionDateRange&dateRange&businessAsset&includeDescendants&assetRollUp&orderBy&filterId';\n var defaults = {\n status: [workOrderEnums.status.newRequest, workOrderEnums.status.workInProgress, workOrderEnums.status.complete, workOrderEnums.status.onHold],\n toDate: dateHelperProvider.getEndOfDay(new Date()).toISOString(),\n // The default from date is 7 days in the past so we subtract 7 days worth of milliseconds from now to get the correct date\n fromDate: dateHelperProvider.getStartOfDay(moment().subtract(7, 'days')).toISOString()\n };\n var getActiveSavedFilter = function ($stateParams, myFilters, savedFiltersService) {\n var queryParams = $stateParams;\n\n if (queryParams.filterId) {\n return savedFiltersService.getFilterIfExistsForUser(queryParams.filterId, myFilters);\n }\n return null;\n };\n\n var getQueryParams = function ($location, $stateParams, activeSavedFilter, marketizr, market) {\n var defaultCopy = angular.copy(defaults);\n var queryParams = $stateParams;\n queryParams.includeDescendants = null;\n queryParams.isLocation = false;\n if (marketizr.hasMarkets([market.k12, market.he, market.ips])) {\n queryParams.assetRollUp = 'true';\n } else {\n queryParams.assetRollUp = queryParams.includeDescendants || queryParams.assetRollUp || null;\n }\n if (!queryParams.requestDateTo && !queryParams.requestDateFrom && !queryParams.completionDateFrom && !queryParams.completionDateTo && !queryParams.dateRange) {\n queryParams.requestDateTo = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.toDate : dateHelperProvider.getEndOfDay(moment().subtract(1, 'month').endOf('month')).toISOString();\n queryParams.requestDateFrom = marketizr.hasMarkets([market.mfg, market.club, market.other, market.gov]) ? defaultCopy.fromDate : dateHelperProvider.getStartOfDay(moment().subtract(1, 'month').startOf('month')).toISOString();\n }\n if (!queryParams.filterId) {\n queryParams.status = queryParams.status || defaultCopy.status;\n }\n // If requesting a saved filter created for a different page or by a different user, remove the filter id\n if (queryParams.filterId && !activeSavedFilter) {\n delete queryParams.filterId;\n $location.search('filterId', null);\n }\n return queryParams;\n };\n\n $stateProvider\n .state('secure.report.equipmentList', {\n url: 'equipment/list?page&pageSize&' + routeParams,\n templateUrl: 'app/components/equipmentReport/equipmentList.html',\n controller: 'EquipmentReportListController',\n controllerAs: 'equipmentReport',\n permissions: [permission.purposes.create, permission.purposes.update, permission.purposes.delete],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/equipment/list');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $q, $stateParams, activeSavedFilter, assetReportService, market, marketizr, myFilters, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n var filters = reportFiltersService.toApiFilter(queryParams);\n\n return $q.all({\n initResponse: assetReportService.loadAssets(filters).then(function (assets) {\n return assetReportService.getListData(filters, assets);\n }),\n filters: filters,\n totals: assetReportService.getTotalData(filters),\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n });\n }\n }\n })\n .state('secure.report.equipmentChart', {\n url: 'equipment/chart?' + routeParams,\n templateUrl: 'app/components/equipmentReport/equipmentChart.html',\n controller: 'EquipmentReportChartController',\n controllerAs: 'equipmentReport',\n permissions: [permission.businessAssets.create, permission.businessAssets.update, permission.businessAssets.delete],\n resolve: {\n myFilters: function (savedFiltersService) {\n return savedFiltersService.getSavedFilters('/report/equipment/chart');\n },\n activeSavedFilter: getActiveSavedFilter,\n initData: function ($location, $stateParams, activeSavedFilter, market, marketizr, myFilters, reportFiltersService) {\n var queryParams = getQueryParams($location, $stateParams, activeSavedFilter, marketizr, market);\n var filters = reportFiltersService.getFilters(queryParams);\n\n return {\n filters: filters,\n myFilters: myFilters,\n activeSavedFilter: activeSavedFilter\n };\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('equipmentReport')\n .controller('EquipmentReportListController', function ($translate, initData) {\n var self = this;\n\n self.title = $translate.instant('equipmentReports.title');\n\n self.initData = angular.copy(initData);\n });\n\n'use strict';\n\nangular.module('equipmentReport')\n .controller('EquipmentReportChartController', function (initData) {\n var self = this;\n\n self.initData = angular.copy(initData);\n });\n\n'use strict';\n\nangular.module('employeeReport', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate', 'report', 'filterBar']);\n\n'use strict';\n\nangular.module('employeeReport')\n .controller('EmployeeReportListController', function ($scope, $state, filterStateService, initData, market, reportFiltersService, queryHelpers, orderByHelpers, workOrderEnums, employeeReportService) {\n var self = this;\n var queryDefaults = reportFiltersService.getFilters({}, employeeReportService.getDateIncrements());\n var pageChanging = false;\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'includeDescendants', 'returnAverages', 'assetRollUp', 'filterId', 'dateRange'];\n\n self.sortable = orderByHelpers.initSort(initData.filters.orderBy);\n self.listData = initData.initResponse.data;\n self.filters = initData.filters;\n self.complete = workOrderEnums.status.complete;\n self.market = market;\n\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n var openSummaries = [];\n\n var setData = function (response) {\n self.listData = response.data;\n self.filterState.totalCount = response.total;\n\n self.listData.forEach(function (employee) {\n if (openSummaries.indexOf(employee.assignee.id) > -1) {\n self.getDrillDownData(employee);\n }\n });\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (oldVal === newVal) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n self.filters.page = 1;\n }\n\n pageChanging = false;\n\n employeeReportService.getData(self.filters).then(setData);\n\n queryHelpers.updateState(self.filters, queryDefaults);\n };\n\n var updateOpenList = function (employee) {\n var employeeIndex = openSummaries.indexOf(employee.assignee.id);\n if (employee.showLabor && employeeIndex === -1) {\n openSummaries.push(employee.assignee.id);\n } else if (!employee.showLabor && employeeIndex > -1) {\n openSummaries.splice(employeeIndex, 1);\n }\n };\n\n self.getDrillDownData = function (employee) {\n if (employee.laborHours === 0 && employee.completedWorkOrders === 0) {\n return;\n }\n var query = angular.copy(self.filters);\n query.orderBy = 'laborHours desc';\n if (employee.laborTransactions) {\n employee.showLabor = !employee.showLabor;\n updateOpenList(employee);\n } else {\n employeeReportService.getDrillDownData(query, employee.assignee.id).then(function (results) {\n employee.showLabor = true;\n employee.laborTransactions = results.data;\n employee.totalTransactions = results.total;\n updateOpenList(employee);\n });\n }\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n cloned.status = cloned.status === 'all' ? [] : cloned.status;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, reportFiltersService.getFilters({}, employeeReportService.getDateIncrements()));\n };\n\n self.employeeReportFilter = function () {\n self.openWhen = true;\n };\n\n self.clearFilters = function (removeMyFilter) {\n self.filters = reportFiltersService.getFilters({\n orderBy: 'laborHours desc',\n assetRollUp: self.filters.assetRollUp\n }, employeeReportService.getDateIncrements());\n filterStateService.clearFilters(removeMyFilter);\n };\n\n self.setFilters = function (value, save) {\n self.filters = reportFiltersService.getFilters(value.query, employeeReportService.getDateIncrements());\n filterStateService.setFilters(value, save);\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.export = function () {\n employeeReportService.exportEmployeeReport(self.filters);\n };\n\n $scope.$watch('employeeReport.filters', updateFilters, true);\n });\n\n/**\n * @ngdoc directive\n * @name reportFilters.employee-report-filters\n * @restrict E\n * @description\n *\n * Displays the filter section for the reports\n *\n * @param {object} filters stores the value of all defined filters\n * @param {function} setFunction function reference to set the filters\n * @param {string} assetToggle sets the filter to use with the asset checkbox defaults to include descendants (optional)\n * @param {boolean} openWhen Determines when sliding panel should open\n * @param {function} clearFunction function reference to handle the clear action\n */\n\n'use strict';\n\nangular.module('employeeReport')\n .component('employeeReportFilters', {\n templateUrl: 'app/components/employeeReport/employeeReportFilters.html',\n bindings: {\n filters: '=',\n setFunction: '&',\n assetToggle: '= PASSWORD_LENGTH) {\n return true;\n }\n\n return false;\n };\n }\n };\n });\n\n'use strict';\n\nangular.module('changePassword')\n .directive('passwordValidator', function () {\n return {\n require: 'ngModel',\n link: function (scope, elm, attrs, ctrl) {\n // checks for mixed case, or at least one special character, or at least one number\n var PASSWORD_FORMAT = /(?=.*[a-z])(?=.*[A-Z])|(_|[^\\w])|\\d/;\n\n ctrl.$validators.validPassword = function (modelValue, viewValue) {\n if (ctrl.$isEmpty(modelValue)) {\n // consider empty control valid\n return true;\n }\n\n if (PASSWORD_FORMAT.test(viewValue)) {\n return true;\n }\n\n return false;\n };\n }\n };\n });\n\n'use strict';\n\nangular.module('changePassword')\n .directive('matchPasswordValidator', function () {\n return {\n scope: {\n match: '=matchPasswordValidator'\n },\n require: 'ngModel',\n link: function (scope, elm, attrs, ctrl) {\n ctrl.$validators.matchPassword = function (modelValue, viewValue) {\n if (ctrl.$isEmpty(modelValue)) {\n // consider empty control valid\n return true;\n }\n\n if (viewValue === scope.match || scope.match === '') {\n return true;\n }\n\n return false;\n };\n }\n };\n });\n\n'use strict';\n\nangular.module('changePassword')\n .config(function ($stateProvider) {\n $stateProvider\n .state('secure.changePassword', {\n url: 'profile/changePassword',\n templateUrl: 'app/components/changePassword/changePassword.html',\n controller: 'changePasswordController',\n controllerAs: 'changePassword'\n });\n });\n\n'use strict';\n\nangular.module('changePassword')\n .controller('changePasswordController', function ($state, $scope, $translate, DudeApi, log) {\n var self = this;\n\n self.passwords = {\n oldPassword: '',\n newPassword: '',\n reenterPassword: ''\n };\n var badPasswords = [];\n self.changePassword = function () {\n DudeApi.ChangePasswordEntity.save(self.passwords).$promise\n .then(function () {\n log.notify({\n title: $translate.instant('changePassword.toast.success.title'),\n type: 'success',\n message: $translate.instant('changePassword.toast.success.body')\n });\n $state.go('secure.userMe');\n }, function (response) {\n var isOldPassword = true;\n for (var i = 0; i < response.data.validationErrors.length; i++) {\n if (response.data.validationErrors[i].field === 'oldPassword' && response.data.validationErrors[i].code === 'V1042') {\n // if validation message == V1005 then email already exists\n badPasswords.push(self.passwords.oldPassword);\n isOldPassword = false;\n break;\n }\n }\n\n $scope.form.currentPassword.$setValidity('matchesOld', isOldPassword);\n });\n };\n\n $scope.$watch('changePassword.passwords.oldPassword', function (newVal, oldVal) {\n if (newVal === oldVal || !badPasswords.length) {\n return;\n }\n\n var validity = badPasswords.indexOf(newVal) < 0;\n $scope.form.currentPassword.$setValidity('matchesOld', validity);\n });\n });\n\n/**\n * @ngdoc service\n * @name dashboard.assetWorkTypeReportService\n * @requires DudeApi - {@link http://frontend.dudesoln.com/ng-docs/DudeApi/#/api/dudeApi.DudeApi read the docs}\n * @requires pagingHelpers {@link http://frontend.dudesoln.com/ng-docs/DudeControls/#/api/filterHelpers.pagingHelpersService read the docs}\n *\n * @description\n * Service for getting work type reports from the Report API.\n *\n */\n\n'use strict';\n\nangular.module('dashboard')\n .service('assetWorkTypeReportService', function (DudeApi, pagingHelpers) {\n /**\n * @ngdoc method\n * @name getFilters\n * @methodOf dashboard.assetWorkTypeReportService\n *\n * @description\n * Returns a filter object parsed and formatted\n *\n * @param {object} params An object containing the filter params to use\n * @returns {object} Filter object\n */\n var getFilters = function (params) {\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: parseInt(params.pageSize, 10) || parseInt(pagingHelpers.defaults.pageSize, 10),\n orderBy: params.orderBy || null,\n assignees: params.assignees || null,\n status: params.status || null\n };\n\n return currentFilter;\n };\n\n /**\n * @ngdoc method\n * @name toApiFilter\n * @methodOf dashboard.assetWorkTypeReportService\n *\n * @description\n * Converts a filter object to a useable state by the api\n *\n * @param {object} currentFilter An object containing the filter params to use\n * @returns {object} Filter object\n */\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n /**\n * @ngdoc method\n * @name getData\n * @methodOf dashboard.assetWorkTypeReportService\n *\n * @description\n * Returns work type based on the query passed in.\n *\n * @param {object} query query An object containing the query to pass to the API.\n * @returns {object} The results from the API as an object.\n */\n var getData = function (query, assetId) {\n var filters = toApiFilter(query);\n filters.id = assetId;\n\n return DudeApi.AssetWorkTypesSummaryEntity.query(filters).$promise;\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n getData: getData\n };\n });\n\n'use strict';\n\nangular.module('assetTypeList', ['ui.router', 'dudeControls', 'dudeApi', 'marketizr', 'translate']);\n\n'use strict';\n\nangular.module('assetTypeList')\n .factory('assetTypeListFilterService', function ($location, pagingHelpers) {\n var getFilters = function (params) {\n // if Adding a new search filter make sure to add it to the\n // isSearching() function below.\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Name asc',\n q: params.q || null,\n isActive: params.isActive || null\n };\n\n return currentFilter;\n };\n\n var toApiFilter = function (currentFilter) {\n return getFilters(currentFilter);\n };\n\n // Checks to see if you are in search mode.\n var isSearching = function (filters) {\n return (filters.q !== null && filters.q !== '') || (filters.isActive !== null && filters.isActive !== '');\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n isSearching: isSearching\n };\n });\n\n'use strict';\n\nangular.module('assetTypeList')\n .service('assetTypeListService', function (DudeApi, assetTypeListFilterService) {\n var getListData = function (query) {\n var filters = assetTypeListFilterService.toApiFilter(query);\n return DudeApi.BusinessAssetTypeEntity.query(filters);\n };\n\n var get = function (id) {\n return DudeApi.BusinessAssetTypeEntity.get({ id: id });\n };\n\n return {\n getListData: getListData,\n get: get\n };\n });\n\n'use strict';\n\nangular.module('assetTypeList')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.assetTypeList', {\n url: 'assettypes?page&pageSize&q&isActive',\n templateUrl: 'app/components/assetTypeList/assetTypeList.html',\n controller: 'assetTypeListController',\n controllerAs: 'assetTypeList',\n permissions: permission.businessAssetTypes.create,\n resolve: {\n initData: function ($q, $stateParams, assetTypeListService, assetTypeListFilterService) {\n var queryParams = $stateParams;\n var filters = assetTypeListFilterService.getFilters(queryParams);\n\n return $q.all({\n initResponse: assetTypeListService.getListData(filters).$promise,\n filters: filters\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('assetTypeList')\n .controller('assetTypeListController', function ($rootScope, $scope, $location, $state, assetTypeListService, assetTypeListFilterService, queryHelpers, orderByHelpers, initData) {\n var self = this;\n var queryDefaults = assetTypeListFilterService.getFilters({});\n var pageChanging = false;\n\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(self.filters.orderBy);\n self.totalCount = initData.initResponse.total;\n self.listData = initData.initResponse.data;\n\n var setData = function (response) {\n self.listData = response.data;\n self.totalCount = response.total;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (angular.equals(oldVal, newVal)) {\n return;\n }\n\n // reset page if filter item triggered this\n if (!pageChanging) {\n newVal.page = 1;\n }\n\n pageChanging = false;\n\n assetTypeListService.getListData(newVal).$promise.then(setData);\n queryHelpers.updateState(newVal, queryDefaults);\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n // Reset a cleared search to null not empty string\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.isActive = cloned.isActive !== '' ? cloned.isActive : null;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, assetTypeListFilterService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.showSearchResults = function () {\n // List out possible filters and if one is set then we show search\n return assetTypeListFilterService.isSearching(self.filters);\n };\n\n self.clearFilters = function () {\n self.filters = assetTypeListFilterService.getFilters({});\n };\n\n self.editAssetType = function (id) {\n $state.go('secure.assetTypeEdit', {\n id: id\n });\n };\n\n $scope.$watch('assetTypeList.filters', updateFilters, true);\n });\n\n'use strict';\n\nangular.module('assetTypeForm', ['ui.router', 'ui.bootstrap', 'dudeControls', 'dudeApi', 'dudeAuth', 'translate', 'dudeLog']);\n\n'use strict';\n\nangular.module('assetTypeForm')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.assetTypeCreate', {\n url: 'assettypes/new',\n templateUrl: 'app/components/assetTypeForm/assetTypeForm.html',\n controller: 'AssetTypeFormController',\n controllerAs: 'assetTypeForm',\n permissions: permission.businessAssetTypes.create,\n resolve: {\n assetType: function (DudeApi) {\n var queryParams = { q: 'Area' };\n return DudeApi.BusinessAssetCategoryEntity.query(queryParams).$promise.then(function (response) {\n var assetCategory = null;\n if (response.data.length > 0 && response.data[0].name === queryParams.q) {\n assetCategory = response.data[0];\n }\n return new DudeApi.BusinessAssetTypeEntity({\n isActive: true,\n businessAssetCategories: [assetCategory]\n });\n });\n },\n assetCount: function () {\n return 0;\n },\n assetCategories: function (DudeApi) {\n var queryParams = {\n orderby: 'DisplayOrder asc'\n };\n return DudeApi.BusinessAssetCategoryEntity.query(queryParams).$promise.then(function (response) {\n return response.data;\n });\n }\n }\n })\n .state('secure.assetTypeEdit', {\n url: 'assettypes/:id',\n templateUrl: 'app/components/assetTypeForm/assetTypeForm.html',\n controller: 'AssetTypeFormController',\n controllerAs: 'assetTypeForm',\n permissions: permission.businessAssetTypes.update,\n resolve: {\n assetType: function ($stateParams, DudeApi) {\n return DudeApi.BusinessAssetTypeEntity.get({ id: $stateParams.id }).$promise;\n },\n assetCount: function ($stateParams, DudeApi, assetTypeDeleteFilterService) {\n var filter = assetTypeDeleteFilterService.toApiFilter({ id: $stateParams.id });\n return DudeApi.BusinessAssetEntity.query(filter).$promise;\n },\n assetCategories: function (DudeApi) {\n var queryParams = {\n orderby: 'DisplayOrder asc'\n };\n return DudeApi.BusinessAssetCategoryEntity.query(queryParams).$promise.then(function (response) {\n return response.data;\n });\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('assetTypeForm')\n .controller('AssetTypeFormController', function ($scope, $state, log, $uibModal, $translate, DudeApi, assetType, assetCount, assetCategories) {\n var self = this;\n self.assetType = assetType;\n self.attributeTypes = null;\n self.attributeTypeCache = {};\n self.isNew = !self.assetType.id;\n self.assetCategories = assetCategories;\n self.selectedCategories = {};\n assetType.businessAssetCategories.forEach(function (category) {\n self.selectedCategories[category.id] = true;\n });\n var goToAssetList = function () {\n $state.go('secure.assetTypeList');\n };\n\n var showDeleteMessage = function () {\n log.notify({\n title: $translate.instant('assetTypeForm.notify.delete.title'),\n type: 'success',\n message: $translate.instant('assetTypeForm.notify.delete.message')\n });\n };\n\n var confirmDelete = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/assetTypeForm/assetTypeDeleteConfirmModal.html',\n controller: 'assetTypeDeleteModalController',\n size: 'sm',\n backdrop: 'static',\n resolve: {\n count: function () {\n return '';\n }\n }\n });\n\n modalInstance.result.then(function () {\n assetType.$delete({\n id: assetType.id\n }).then(function () {\n showDeleteMessage();\n $state.go('secure.assetTypeList');\n });\n });\n };\n\n var deleteWarning = function (count) {\n $uibModal.open({\n templateUrl: 'app/components/assetTypeForm/assetTypeDeleteWarningModal.html',\n controller: 'assetTypeDeleteModalController',\n size: 'md',\n backdrop: 'static',\n resolve: {\n count: function () {\n return count;\n }\n }\n });\n };\n\n self.saveAssetType = function () {\n var promise = assetType.id ? assetType.$update({\n id: assetType.id\n }) : assetType.$save();\n\n promise.then(function () {\n log.notify({\n title: $translate.instant('assetTypeForm.notify.success.title'),\n type: 'success',\n message: $translate.instant('assetTypeForm.notify.success.message')\n });\n\n goToAssetList();\n });\n };\n\n self.deleteAssetType = function () {\n if (assetCount.total === 0) {\n confirmDelete('');\n } else {\n deleteWarning(assetCount.total);\n }\n };\n\n $scope.$watch('assetTypeForm.selectedCategories', function () {\n var categories = [];\n $scope.form.categoryCheck.$setValidity('categoryRequired', false);\n Object.keys(self.selectedCategories).forEach(function (categoryId) {\n if (self.selectedCategories[categoryId]) {\n $scope.form.categoryCheck.$setValidity('categoryRequired', true);\n categories.push({ id: categoryId });\n }\n });\n assetType.businessAssetCategories = categories;\n }, true);\n });\n\n'use strict';\n\nangular.module('assetTypeForm')\n .controller('assetTypeDeleteModalController', function ($uibModalInstance, $scope, count) {\n $scope.count = count;\n\n $scope.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n'use strict';\n\nangular.module('assetTypeForm')\n .service('assetTypeDeleteFilterService', function () {\n var toApiFilter = function (filter) {\n var filters = {\n businessAssetTypeId: filter.id\n };\n return filters;\n };\n\n return {\n toApiFilter: toApiFilter\n };\n });\n\n/**\n * @ngdoc directive\n * @restrict E\n * @name assetTypeForm.asset-category-attributes\n * @description\n *\n * The asset category attribute type list\n *\n * @param {object} The asset category for which you would like to retrieve attributes\n *\n * \n *\n */\n\n'use strict';\n\nangular.module('assetTypeForm')\n .component('assetCategoryAttributes', {\n templateUrl: 'app/components/assetTypeForm/assetCategoryAttributes.html',\n bindings: {\n category: '='\n },\n controller: 'AssetCategoryAttributesController',\n controllerAs: 'assetCategoryAttributes'\n })\n .controller('AssetCategoryAttributesController', function ($translate, DudeApi) {\n var self = this;\n self.$onInit = function () {\n self.attributeTypes = [];\n\n if (!self.attributeTypes.length) {\n DudeApi.BusinessAssetCategoryAttributeTypeEntity.query({\n id: self.category.id,\n orderBy: 'order'\n }).$promise.then(function (response) {\n // need to translate in controller so that we can alphabetize before rendering\n response.data.forEach(function (attr) {\n attr._translatedKey = $translate.instant('assetForm.attributeTypes.' + attr.key);\n });\n\n self.attributeTypes = response.data;\n });\n }\n };\n });\n\n/**\n * @ngdoc directive\n * @name assetReport.assetReportList\n * @restrict E\n * @description\n *\n * Displays the equipment list report or location list report based on the boolean passed in\n *\n * @param {boolean} isLocation The value to determine if it is a location report or equipment report.\n * @param {object} initData An object that contains the inital filters, list data, and totals count.\n * @param {string} reportTitle A string that displays the title of the report, used in the list column.\n *\n */\n\n'use strict';\n\nangular.module('assetReport')\n .component('assetReportList', {\n templateUrl: 'app/components/assetReport/assetReportList.html',\n bindings: {\n isLocation: ' 0) {\n dataObject.dataArray.push([\n summary.asset.value,\n { v: value, f: $filter('number')(value) + ' ' + text },\n reportTooltipService.standardTooltip(summary.asset, $filter('number')(value) + ' ' + text)\n ]);\n dataObject.hierarchyArray.push(summary.asset.ancestorNamePath);\n dataObject.idArray.push(summary.asset.id);\n }\n });\n\n reportDataService.topLabel(assets, results, dataObject, labels, 5);\n\n assets.forEach(function (asset) {\n if (dataObject.idArray.indexOf(asset.id) > -1 || dataObject.idArray.length >= filter.pageSize) {\n return;\n }\n\n dataObject.dataArray.push([\n asset.name,\n { v: 0, f: '0' + textPlural },\n ''\n ]);\n dataObject.idArray.push(asset.id);\n });\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name workOrderChartData\n * @methodOf assetReport.assetReportService\n *\n * @description\n * Gets data and parses it into a format to be used with google charts\n *\n * @param {object} filter An object containing the filter to use\n * @param {array} assets The business assets expected to show up\n * @param {object} labels An object containing the labels to use with the chart\n * @returns {object} An object containing all that is needed to show the work order chart\n */\n var workOrderChartData = function (filter, assets, labels) {\n filter.orderBy = filter.assetRollUp === 'true' ? 'TotalsWithDescendants/Count/WorkOrders desc' : 'Count/WorkOrders desc';\n\n return fetchStandardChartData(filter, assets, 'workOrders', $translate.instant('reports.byWorkOrders.workOrders'), $translate.instant('reports.byWorkOrders.workOrder'), labels);\n };\n\n /**\n * @ngdoc method\n * @name laborChartData\n * @methodOf assetReport.assetReportService\n *\n * @description\n * Gets data and parses it into a format to be used with google charts\n *\n * @param {object} filter An object containing the filter to use\n * @param {array} assets The business assets expected to show up\n * @param {object} labels An object containing the labels to use with the chart\n * @returns {object} An object containing all that is needed to show the labor hours chart\n */\n var laborChartData = function (filter, assets, labels) {\n filter.orderBy = filter.assetRollUp === 'true' ? 'TotalsWithDescendants/Count/LaborHours desc' : 'Count/LaborHours desc';\n\n return fetchStandardChartData(filter, assets, 'laborHours', $translate.instant('reports.byLaborHours.hours'), $translate.instant('reports.byLaborHours.hour'), labels);\n };\n\n /**\n * @ngdoc method\n * @name costChartData\n * @methodOf assetReport.assetReportService\n *\n * @description\n * Gets data and parses it into a format to be used with google charts\n *\n * @param {object} filter An object containing the filter to use\n * @param {array} assets The business assets expected to show up\n * @param {object} labels An object containing the labels to use with the chart\n * @returns {object} An object containing all that is needed to show the cost chart\n */\n var costChartData = function (filter, assets, labels) {\n filter = reportFiltersService.toApiFilter(filter);\n filter.pageSize = assets.length || CHART_ITEMS_TO_SHOW;\n filter.orderBy = filter.assetRollUp === 'true' ? 'TotalsWithDescendants/Cost/Total desc' : 'Cost/Total desc';\n filter.orderBy += ',Asset/Value asc';\n\n var dataObject = {\n idArray: [],\n dataArray: [[$translate.instant('assetReport.assets'), '', {\n type: 'string',\n role: 'tooltip',\n p: { html: true }\n }, '', { type: 'string', role: 'tooltip', p: { html: true } }, '', { type: 'string', role: 'tooltip', p: { html: true } }]],\n resolved: false\n };\n\n getData(filter).then(function (results) {\n results.data.forEach(function (summary) {\n if (!summary.cost) {\n return;\n }\n\n var root = filter.assetRollUp === 'true' ? angular.copy(summary.totalsWithDescendants) : angular.copy(summary);\n\n var laborCost = {\n value: root.cost.labor,\n display: $filter('currency')(root.cost.labor) + ' ' + $translate.instant('reports.byCost.labor')\n };\n var purchaseCost = {\n value: root.cost.purchase,\n display: $filter('currency')(root.cost.purchase) + ' ' + $translate.instant('reports.byCost.purchase')\n };\n var serviceCost = {\n value: root.cost.service,\n display: $filter('currency')(root.cost.service) + ' ' + $translate.instant('reports.byCost.service')\n };\n var totalCost = {\n value: root.cost.total,\n display: $filter('currency')(root.cost.total) + ' ' + $translate.instant('reports.byCost.total')\n };\n\n var tooltip = reportTooltipService.costChartTooltip(summary.asset, laborCost.display, purchaseCost.display, serviceCost.display, totalCost.display);\n\n if (totalCost.value > 0) {\n dataObject.dataArray.push([\n summary.asset.value,\n { v: purchaseCost.value, f: purchaseCost.display },\n tooltip,\n { v: serviceCost.value, f: serviceCost.display },\n tooltip,\n { v: laborCost.value, f: laborCost.display },\n tooltip\n ]);\n dataObject.idArray.push(summary.asset.id);\n }\n });\n\n reportDataService.topLabel(assets, results, dataObject, labels, 5);\n\n assets.forEach(function (asset) {\n if (dataObject.idArray.indexOf(asset.id) > -1 || dataObject.idArray.length >= filter.pageSize) {\n return;\n }\n dataObject.dataArray.push([\n asset.name,\n { v: 0, f: '0' + $translate.instant('reports.byLaborHours.hours') },\n '',\n { v: 0, f: '0' + $translate.instant('reports.byLaborHours.hours') },\n ''\n ]);\n dataObject.idArray.push(asset.id);\n });\n\n dataObject.resolved = true;\n });\n return dataObject;\n };\n\n /**\n * @ngdoc method\n * @name exportAssetReport\n * @methodOf assetReport.assetReportService\n *\n * @description\n * Downloads a spreadsheet of the asset report list\n *\n * @param {object} query An object containing the filter to use\n */\n var exportAssetReport = function (query) {\n var filters = reportFiltersService.toApiFilter(angular.copy(query));\n reportDataService.exportReport(filters, 'workordersbyasset');\n };\n\n /**\n * @ngdoc method\n * @name getWorkOrderFilters\n * @methodOf assetReport.assetReportService\n *\n * @description\n * Parses an object of filters used on the report into a filters object to use with the work order list\n *\n * @param {number} id The business asset id to view on the work order list\n * @param {object} filters An object containing the filters to use\n * @returns {object} An object containing the filters to use on the work order list\n */\n var getWorkOrderFilters = function (id, filters) {\n var filtersCopy = angular.copy(filters);\n delete filtersCopy.orderBy;\n delete filtersCopy.page;\n delete filtersCopy.pageSize;\n filtersCopy.includeDescendants = filtersCopy.assetRollUp;\n delete filtersCopy.assetRollUp;\n filtersCopy.businessAsset = id;\n return filtersCopy;\n };\n\n return {\n loadAssets: loadAssets,\n getData: getData,\n getListData: getListData,\n workOrderChartData: workOrderChartData,\n laborChartData: laborChartData,\n costChartData: costChartData,\n getWorkOrderFilters: getWorkOrderFilters,\n exportAssetReport: exportAssetReport,\n getTotalData: getTotalData\n };\n });\n\n'use strict';\n\nangular.module('assetList', ['ui.router', 'dudeControls', 'dudeApi', 'filterBar', 'marketizr', 'translate', 'assetFilters', 'meterReading', 'maintenanceConstants']);\n\n'use strict';\n\nangular.module('assetList')\n .service('assetListService', function (DudeApi, assetFiltersService) {\n var getListData = function (query) {\n var filters = assetFiltersService.toApiFilter(query);\n return DudeApi.BusinessAssetEntity.query(filters);\n };\n\n var get = function (id) {\n return DudeApi.BusinessAssetEntity.get({ id: id });\n };\n\n return {\n getListData: getListData,\n get: get\n };\n });\n\n'use strict';\n\nangular.module('assetList')\n .config(function ($stateProvider, permission) {\n $stateProvider\n .state('secure.assetList', {\n url: 'assets?page&pageSize&q&isActive&parentId&businessAssetTypeId&isWorkOrderAsset&isInventoryStorageArea&isLocation&isMetered',\n templateUrl: 'app/components/assetList/assetList.html',\n controller: 'AssetListController',\n controllerAs: 'assetList',\n permissions: [permission.businessAssets.create, permission.businessAssets.update, permission.businessAssets.delete],\n resolve: {\n initData: function ($q, $stateParams, assetListService, assetFiltersService) {\n var queryParams = $stateParams;\n var filters = assetFiltersService.getFilters(queryParams);\n\n return $q.all({\n initResponse: assetListService.getListData(filters).$promise,\n filters: filters\n });\n },\n products: function (DudeApi, permissionsHelper) {\n if (permissionsHelper.userAllowed('AccountProducts-Read')) {\n return DudeApi.AccountProductsEntity.query().$promise;\n }\n return { data: [] };\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('assetList')\n .controller('AssetListController', function ($rootScope, $scope, $location, $state, $translate, assetListService, assetFiltersService, filterStateService, queryHelpers, orderByHelpers, initData, workOrderEnums, roleHelpers, products) {\n var self = this;\n var INVENTORY_MANAGER = 'Inventory Manager';\n var queryDefaults = assetFiltersService.getFilters({});\n var pageChanging = false;\n var assetListParentAsset = {\n id: null,\n isActive: true,\n ancestorIdPath: '',\n ancestorNamePath: ''\n };\n\n self.parentAsset = assetListParentAsset;\n self.filters = initData.filters;\n self.sortable = orderByHelpers.initSort(self.filters.orderBy);\n self.listData = initData.initResponse.data;\n self.isPmSchedule = initData.isPmSchedule;\n self.workOrderStatuses = Object.keys(workOrderEnums.status).map(function (key) { return workOrderEnums.status[key]; });\n self.isTechnician = roleHelpers.isTechnician();\n self.panelOpen = false;\n self.updated = false;\n self.disableMyFilters = true;\n\n var ignoreForBadge = ['page', 'pageSize', 'orderBy', 'searchFromCurrentNode', 'includeDescendants'];\n filterStateService.setState(initData, ignoreForBadge);\n self.filterState = filterStateService.state;\n\n // Check permissions on checkboxes\n self.hasInventory = false;\n products.data.forEach(function (product) {\n if (product.name === INVENTORY_MANAGER) {\n self.hasInventory = true;\n }\n });\n\n self.openPanel = function (asset) {\n if (!asset) {\n self.panelOpen = false;\n }\n self.asset = asset;\n self.panelOpen = true;\n };\n\n var setBreadCrumbData = function () {\n if (self.parentId !== undefined && self.parentId !== 'null') {\n assetListService.get(self.parentId).$promise.then(\n function (response) {\n var parentAsset = response;\n if (self.filters.searchFromCurrentNode || !self.isFilterApplied()) {\n parentAsset.ancestorIdPath += '/' + response.id;\n parentAsset.ancestorNamePath += '|' + response.name;\n } else {\n response.ancestorIdPath = '';\n response.ancestorNamePath = '';\n }\n self.parentAsset = parentAsset;\n }\n );\n } else {\n self.parentAsset = assetListParentAsset;\n }\n };\n\n var broadcastAssetTotal = function () {\n $rootScope.$broadcast('dude-maintenance:pmschedule-asset-total', { total: self.totalCount });\n };\n\n var setData = function (response) {\n self.listData = response.data;\n self.filterState.totalCount = response.total;\n setBreadCrumbData();\n broadcastAssetTotal();\n };\n\n var updateParentIdQueryParameter = function () {\n var queryString = $location.search();\n self.parentId = queryString.parentId;\n };\n\n var updateFilters = function (newVal, oldVal) {\n if (angular.equals(oldVal, newVal)) {\n return;\n }\n // reset page if filter item triggered this\n if (!pageChanging) {\n newVal.page = 1;\n }\n\n pageChanging = false;\n assetListService.getListData(newVal).$promise.then(setData);\n queryHelpers.updateState(newVal, queryDefaults);\n updateParentIdQueryParameter();\n };\n\n self.isFilterApplied = function () {\n var cloned = angular.copy(self.filters);\n // Reset a cleared search to null not empty string\n cloned.q = cloned.q !== '' ? cloned.q : null;\n cloned.isActive = cloned.isActive !== '' ? cloned.isActive : null;\n // Removed parent since its not part of filters\n cloned.parentId = null;\n // Always set this to true when determining if we are filters since it is an internal state.\n cloned.searchFromCurrentNode = true;\n // ignoring orderBy since we only care about applied filters\n return !angular.equals(cloned, assetFiltersService.getFilters({ orderBy: cloned.orderBy }));\n };\n\n self.sort = function (item) {\n self.filters.orderBy = orderByHelpers.sort(self.sortable, item);\n };\n\n self.pageChanged = function () {\n // prevent page from changing on filter reload\n pageChanging = true;\n };\n\n self.getChild = function (asset) {\n if (asset.hasChildren) {\n self.filters.parentId = asset.id;\n self.filters.q = null;\n }\n };\n\n self.showAssetRowBreadCrumb = function () {\n return self.isFilterApplied();\n };\n\n self.assetCreate = function () {\n $state.go('secure.assetCreate', {\n parentId: self.parentId\n });\n };\n\n self.assetFilter = function () {\n self.openAssetFilterSlidingPanel = true;\n };\n\n self.clearFilters = function () {\n self.filters = assetFiltersService.getFilters({\n pmSchedule: this.isPmSchedule // This will trigger the isActive filter to be true and to set the is searching flag.\n });\n self.storageAreaParams = {\n isWorkOrderAsset: null,\n isInventoryStorageArea: null\n };\n };\n\n self.setFilters = function (value) {\n self.filters = assetFiltersService.getFilters(value.query);\n };\n\n self.edit = function (asset) {\n $state.go('secure.assetEdit', { id: asset.id });\n };\n\n $scope.$watch('assetList.filters', updateFilters, true);\n\n // start up\n updateParentIdQueryParameter();\n setBreadCrumbData();\n });\n\n'use strict';\n\nangular.module('assetForm', ['ui.router', 'ui.bootstrap', 'dudeControls', 'dudeControlsFile', 'dudeApi', 'dudeAuth', 'translate', 'dudeLog', 'asset-attribute']);\n\n'use strict';\n\nangular.module('assetForm')\n .service('assetFormService', function ($filter, DudeApi) {\n var setExcludeItems = function (asset, property) {\n var excludeItems = [asset[property]];\n return DudeApi.BusinessAssetEntity.query({\n parentId: asset.id,\n includeDescendants: true\n }).$promise\n .then(function (result) {\n result.data.forEach(function (child) {\n excludeItems.push(child[property]);\n });\n return excludeItems;\n });\n };\n\n var attributeSaveHandler = function (assetAttributes, asset) {\n var attributePromises = [];\n for (var i = 0; i < assetAttributes.length; i++) {\n if (assetAttributes[i].businessAssetAttributeType.isMeterable && !assetAttributes[i].isMetered && (!assetAttributes[i].unitOfMeasure || !assetAttributes[i].unitOfMeasure.id)) {\n continue; // eslint-disable-line no-continue\n } else if (!assetAttributes[i].unitOfMeasure || !assetAttributes[i].unitOfMeasure.id) {\n continue; // eslint-disable-line no-continue\n }\n\n var attributePromise = assetAttributes[i].id ? assetAttributes[i].$update({\n businessAssetId: asset.id,\n id: assetAttributes[i].id\n })\n : assetAttributes[i].$save({ businessAssetId: asset.id });\n attributePromises.push(attributePromise);\n }\n\n return attributePromises;\n };\n\n var saveAttributes = function (assetAttributes, asset) {\n // post new databound attribute value\n var databoundAttributes = assetAttributes.filter(function (attribute) {\n return attribute.businessAssetAttributeType.valueType === 'Databound';\n });\n\n if (databoundAttributes[0]) {\n if (databoundAttributes[0].businessAssetAttributeType.key === 'manufacturer' && databoundAttributes[0].value !== null &&\n databoundAttributes[0].value !== undefined && databoundAttributes[0].value._isNew) {\n return DudeApi.ManufacturerEntity.save(databoundAttributes[0].value).$promise.then(function (result) {\n databoundAttributes[0].value = result.id;\n\n return attributeSaveHandler(assetAttributes, asset);\n });\n }\n // set databound object value to id\n databoundAttributes[0].value = !databoundAttributes[0].value ? '' : databoundAttributes[0].value.id;\n return attributeSaveHandler(assetAttributes, asset);\n }\n return attributeSaveHandler(assetAttributes, asset);\n };\n\n return {\n setExcludeItems: setExcludeItems,\n saveAttributes: saveAttributes\n };\n });\n\n'use strict';\n\nangular.module('assetForm')\n .config(function ($stateProvider, permission) {\n var assetNamePathSeparator = '|';\n var assetIdPathSeparator = '/';\n $stateProvider\n .state('secure.assetCreate', {\n url: 'assets/new?parentId',\n templateUrl: 'app/components/assetForm/assetForm.html',\n controller: 'AssetFormController',\n controllerAs: 'assetForm',\n permissions: permission.businessAssets.create,\n resolve: {\n asset: function ($stateParams, DudeApi) {\n var asset = new DudeApi.BusinessAssetEntity({\n isActive: true,\n ancestorIdPath: '',\n ancestorNamePath: '',\n businessAssetCategory: null,\n businessAssetType: null,\n businessAssetAttributes: []\n });\n if (angular.isUndefined($stateParams.parentId)) {\n return asset;\n }\n return DudeApi.BusinessAssetEntity.get({ id: $stateParams.parentId }).$promise.then(function (parent) {\n asset.ancestorIdPath += assetIdPathSeparator + parent.id;\n asset.ancestorNamePath += assetNamePathSeparator + parent.name;\n asset.parent = parent;\n return asset;\n });\n },\n inventory: function ($stateParams, DudeApi, userContext) {\n if (userContext && userContext.products && userContext.products.InventoryManager) {\n return {\n hasInventory: true,\n totalTransactions: 0\n };\n }\n return {\n hasInventory: false,\n totalTransactions: 0\n };\n },\n attachments: function () {\n return [];\n }\n }\n })\n .state('secure.assetEdit', {\n url: 'assets/:id',\n templateUrl: 'app/components/assetForm/assetForm.html',\n controller: 'AssetFormController',\n controllerAs: 'assetForm',\n permissions: permission.businessAssets.update,\n resolve: {\n asset: function ($stateParams, DudeApi) {\n var asset;\n return DudeApi.BusinessAssetEntity.get({ id: $stateParams.id }).$promise.then(function (_asset) {\n asset = _asset;\n if (asset.parent !== null) {\n asset.parent.ancestorIdPath = asset.ancestorIdPath.replace(assetIdPathSeparator + asset.parent.id, '');\n asset.parent.ancestorNamePath = asset.ancestorNamePath.replace(assetNamePathSeparator + asset.parent.name, '');\n }\n return DudeApi.BusinessAssetCategoryEntity.query({ id: asset.businessAssetCategory.id }).$promise;\n }).then(function (assetCategory) {\n asset.businessAssetCategory = assetCategory;\n return DudeApi.BusinessAssetCategoryAttributeTypeEntity.query({ id: asset.businessAssetCategory.id }).$promise;\n }).then(function (categoryAttributes) {\n asset.businessAssetCategory.businessAssetAttributeTypes = categoryAttributes.data;\n return DudeApi.BusinessAssetTypeEntity.query({ id: asset.businessAssetType.id }).$promise;\n }).then(function (assetType) {\n asset.businessAssetType = assetType;\n return DudeApi.BusinessAssetAttributeTypeEntity.query({ businessAssetTypeId: asset.businessAssetType.id }).$promise;\n }).then(function (currentAttributeTypes) {\n asset.businessAssetType.businessAssetAttributeTypes = currentAttributeTypes.data;\n return DudeApi.BusinessAssetAttributeEntity.query({ businessAssetId: asset.id }).$promise;\n }).then(function (assetAttributes) {\n asset.businessAssetAttributes = assetAttributes.data;\n return asset;\n });\n },\n inventory: function ($stateParams, $q, DudeApi, userContext) {\n if (userContext && userContext.products && userContext.products.InventoryManager) {\n var inventoryItemQueryResults = DudeApi.InventoryItemEntity.query({\n businessAssetIds: [$stateParams.id],\n hasQuantityOnHand: true,\n pageSize: 1\n }).$promise.then(function (result) {\n return result.total !== 0;\n });\n var inventoryTransactionQueryResults = DudeApi.InventoryTransactionEntity.query({\n businessAssetIds: [$stateParams.id],\n includeDescendants: true,\n pageSize: 1\n }).$promise.then(function (transactions) {\n return {\n hasInventory: true,\n totalTransactions: transactions.total\n };\n });\n var promises = {\n inventoryItemQueryResults: inventoryItemQueryResults,\n inventoryTransactionQueryResults: inventoryTransactionQueryResults\n };\n\n return $q.all(promises).then(function (results) {\n return {\n hasQuantity: results.inventoryItemQueryResults,\n hasInventory: results.inventoryTransactionQueryResults.hasInventory,\n totalTransactions: results.inventoryTransactionQueryResults.totalTransactions\n };\n });\n }\n return {\n hasQuantity: false,\n hasInventory: false,\n totalTransactions: 0\n };\n },\n attachments: function ($stateParams, DudeApi) {\n return DudeApi.BusinessAssetAttachmentEntity.query({ businessAssetId: $stateParams.id }).$promise;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('assetForm')\n .controller('AssetFormController', function ($q, $scope, $state, $filter, $stateParams, $translate, $uibModal, $timeout, DudeApi, log, permissionsHelper, webLinkSectionService, webLinkObjectTypeIds, assetFormService, asset, inventory, userContext, attachments, fileHelpers, attachmentHelpers) {\n var self = this;\n self.regex = '[^|]*';\n var filesUploadingCount = 0;\n self.asset = asset;\n self.filter = '';\n self.country = userContext.account.location.country;\n var parentId = $stateParams.parentId;\n self.url = $state.current.url;\n self.files = [];\n self.excludeItems = {\n property: 'id',\n items: []\n };\n self.attachments = attachments.data;\n self.isNew = !asset.id;\n self.isAdmin = permissionsHelper.userAllowed('BusinessAssets-Delete');\n self.spies = [];\n var offsetPadding = 50;\n self.headerOffset = angular.element('.main-nav').outerHeight(true) + angular.element('.header-container').outerHeight(true) + offsetPadding;\n self.openAttachmentSection = self.attachments && self.attachments.length > 0;\n self.assetTypeFilter = self.asset.businessAssetCategory ? { businessAssetCategoryId: self.asset.businessAssetCategory.id } : {};\n\n self.hasQuantity = inventory.hasQuantity;\n\n // Check permissions on checkboxes\n self.hasInventory = inventory.hasInventory;\n self.hasWorkOrderAssetUpdatePermission = permissionsHelper.userAllowed('WorkOrderAsset-Update');\n self.hasInventoryStorageAreaUpdatePermission = permissionsHelper.userAllowed('InventoryStorage-Update');\n\n self.assetBrowseOptions = {\n type: 'slidingpanel',\n filterPanel: {\n search: {\n filter: 'q'\n },\n 'asset-node-search': {\n filters: ''\n },\n 'asset-category': {\n filter: 'isLocation'\n }\n }\n };\n\n if (self.asset.id) {\n webLinkSectionService.getWebLinks(self.asset.id, webLinkObjectTypeIds.businessAsset).then(function (response) {\n self.links = response.data;\n });\n } else {\n self.links = [];\n }\n\n // Check for the work order asset checkbox, default as true\n if (self.hasInventory && self.hasWorkOrderAssetUpdatePermission) {\n self.asset.isWorkOrderAsset = self.asset.isWorkOrderAsset != null ? self.asset.isWorkOrderAsset : true;\n } else {\n delete self.asset.isWorkOrderAsset;\n }\n\n // Check for the inventory storage checkbox, default as false\n if (self.hasInventory && self.hasInventoryStorageAreaUpdatePermission) {\n self.asset.isInventoryStorageArea = self.asset.isInventoryStorageArea != null ? self.asset.isInventoryStorageArea : false;\n } else {\n delete self.asset.isInventoryStorageArea;\n }\n\n // attachments\n if (!self.isNew) {\n self.files = fileHelpers.populateFiles(self.attachments);\n assetFormService.setExcludeItems(self.asset, 'id').then(function (itemList) {\n self.excludeItems.items = itemList;\n });\n }\n\n if (angular.isDefined(self.asset) && self.asset.parentId !== null) {\n parentId = self.asset.parentId;\n }\n\n var removeAttachmentErrors = function () {\n self.files = $filter('filter')(self.files, function (file) {\n return file.id;\n });\n };\n\n var newBusinessAssetAttachmentHandler = function (id) {\n var promises = [];\n for (var i = 0; i < self.files.length; i++) {\n if (self.files[i].mime) {\n var attachment = attachmentHelpers.saveAttachmentReference(self.files[i], new DudeApi.BusinessAssetAttachmentEntity());\n promises.push(attachment.$save({\n businessAssetId: id\n }));\n }\n }\n };\n\n var removeFromList = function (fileIndex) {\n self.files.splice(fileIndex, 1);\n };\n\n var deleteFile = function (file) {\n // calls file api to remove file but doesn't handle result since user doesn't care if this succeeds or fails\n fileHelpers.deleteFile(file).$promise.then(angular.noop, angular.noop);\n };\n\n var deleteAttachmentWarning = function (index, file) {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/attachments/attachmentDeleteWarningModal.html',\n controller: 'AttachmentDeleteWarningModalController',\n size: 'sm',\n backdrop: 'static'\n });\n\n modalInstance.result.then(function () {\n var attachment = attachmentHelpers.deleteAttachmentReference(file, self.attachments, new DudeApi.BusinessAssetAttachmentEntity(), 'businessAsset');\n attachment.$delete({\n businessAssetId: asset.id,\n id: attachment.businessAssetAttachmentId\n }).then(function () {\n removeFromList(index);\n deleteFile(file);\n log.notify({\n type: 'success',\n title: $translate.instant('attachments.notify.deleteAttachment.title'),\n message: attachment.name + ' ' + $translate.instant('attachments.notify.deleteAttachment.message')\n });\n });\n });\n };\n\n var performUploadCheckValidation = function () {\n $scope.form.uploadCheck.$setValidity('uploadInProgress', filesUploadingCount <= 0);\n };\n\n var addToList = function (file) {\n // if they have set the file, and then cancel on the next one\n // the file comes back as undefined, this check makes sure we\n // do nothing in this case\n if (!angular.isDefined(file)) {\n return null;\n }\n\n filesUploadingCount++;\n performUploadCheckValidation();\n var object = {\n name: file.name\n };\n\n self.files.push(object);\n return object;\n };\n\n var saveUploadedAttachment = function (file) {\n var attachment = attachmentHelpers.saveAttachmentReference(file, new DudeApi.BusinessAssetAttachmentEntity());\n attachment.$save({\n businessAssetId: asset.id\n }).then(function () {\n self.attachments.push(attachment);\n file.saved = true;\n log.notify({\n type: 'success',\n title: $translate.instant('attachments.notify.upload.success'),\n message: file.filename + ' ' + $translate.instant('assetForm.notify.upload.successBody')\n });\n });\n };\n\n var uploadSuccessHandler = function (file) {\n return function (response) {\n filesUploadingCount--;\n performUploadCheckValidation();\n response.uploading = false;\n var fileToExtend = self.files[self.files.indexOf(file)];\n angular.extend(fileToExtend, response);\n\n if (!self.isNew) {\n saveUploadedAttachment(fileToExtend);\n }\n };\n };\n\n var uploadErrorHandler = function (file) {\n return function (error) {\n filesUploadingCount--;\n performUploadCheckValidation();\n var fileToExtend = self.files[self.files.indexOf(file)];\n angular.extend(fileToExtend, {\n uploading: false,\n error: true,\n errorMessage: fileHelpers.errorMessage(error.data.message)\n });\n\n log.notify({\n type: 'error',\n title: $translate.instant('attachments.notify.upload.error'),\n message: error.data.message\n });\n };\n };\n\n self.upload = function () {\n var transformedFile = addToList(self.file);\n var upload = fileHelpers.uploadFile(self.file);\n upload.then(uploadSuccessHandler(transformedFile), uploadErrorHandler(transformedFile));\n };\n\n self.deleteAttachment = function (index, file) {\n if (self.isNew) {\n removeFromList(index);\n deleteFile(file);\n } else {\n deleteAttachmentWarning(index, file);\n }\n };\n\n var skipNavigationWarningModal = function () {\n self.skipNavigationWarning = true;\n };\n\n var showDeleteMessage = function () {\n log.notify({\n title: $translate.instant('assetForm.notify.delete.title'),\n type: 'success',\n message: $translate.instant('assetForm.notify.delete.message')\n });\n };\n\n var confirmDelete = function () {\n var modalInstance = $uibModal.open({\n templateUrl: 'app/components/assetForm/assetDeleteConfirmModal.html',\n controller: 'assetDeleteModalController',\n size: 'sm',\n backdrop: 'static',\n resolve: {\n count: function () {\n return self.asset.hasChildren;\n }\n }\n });\n\n modalInstance.result.then(function () {\n asset.$delete({\n id: asset.id\n }).then(function () {\n showDeleteMessage();\n $state.go('secure.assetList', {\n parentId: parentId\n });\n });\n });\n };\n\n var deleteWarning = function (count) {\n $uibModal.open({\n templateUrl: 'app/components/assetForm/assetDeleteWarningModal.html',\n controller: 'assetDeleteModalController',\n size: 'md',\n backdrop: 'static',\n resolve: {\n count: function () {\n return count;\n }\n }\n });\n };\n\n var resetParentId = function (assetToReset) {\n return assetToReset.parent !== null ? assetToReset.parent.id : assetToReset.parent;\n };\n\n var errorFn = function () {\n log.notify({\n title: $translate.instant('assetForm.notify.failure.title'),\n type: 'error',\n message: $translate.instant('assetForm.notify.failure.message')\n });\n };\n\n self.saveAsset = function () {\n var _asset = angular.copy(asset);\n var assetAttributes = angular.copy(_asset.businessAssetAttributes);\n // clean up dto. dynamic attribute engine is done with these properties.\n delete _asset.businessAssetType.businessAssetAttributeTypes;\n var promise = _asset.id ? _asset.$update({\n id: _asset.id\n }) : _asset.$save();\n\n promise.then(function (savedAsset) {\n skipNavigationWarningModal();\n if (self.isNew) {\n newBusinessAssetAttachmentHandler(savedAsset.id, new DudeApi.BusinessAssetAttachmentEntity());\n } else {\n removeAttachmentErrors();\n }\n\n $q.all(assetFormService.saveAttributes(assetAttributes, _asset))\n .then(function () {\n log.notify({\n title: $translate.instant('assetForm.notify.success.title'),\n type: 'success',\n message: $translate.instant('assetForm.notify.success.message')\n });\n return resetParentId(savedAsset);\n }, errorFn)\n .then(function (savedParentId) {\n var promises = [];\n\n self.links.forEach(function (link) {\n // Links without IDs haven't been saved.\n if (!link.id) {\n link.objectId = savedAsset.id;\n promises.push(DudeApi.WebLinksEntity.save(link).$promise);\n }\n });\n $q.all(promises).then(function () {\n $state.go('secure.assetList', {\n parentId: savedParentId\n });\n });\n });\n });\n };\n\n self.deleteAsset = function () {\n if (inventory.totalTransactions === 0) {\n confirmDelete('');\n } else {\n deleteWarning(inventory.totalTransactions);\n }\n };\n\n self.addAttachment = function () {\n $timeout(function () {\n attachmentHelpers.openFileSelector();\n });\n };\n\n $scope.$watch('assetForm.file', function (newVal, oldVal) {\n if (newVal === oldVal || !newVal) {\n return;\n }\n self.upload();\n });\n\n $scope.$watch('assetForm.asset.businessAssetCategory', function (newVal, oldVal) {\n if (angular.equals(newVal, oldVal)) {\n return;\n }\n self.asset.businessAssetType = null;\n self.assetTypeFilter = newVal === null ? {} : { businessAssetCategoryId: newVal.id };\n });\n\n var removeScrollSpy = function (spyName) {\n self.spies.forEach(function (spy, index) {\n if (spy.name === $translate.instant(spyName)) {\n self.spies.splice(index, 1);\n }\n });\n };\n\n $scope.$watch('assetForm.files.length', function (newVal, oldVal) {\n if (newVal && newVal === oldVal) {\n return;\n }\n if (!newVal) {\n removeScrollSpy('assetForm.attachments.title');\n } else if (oldVal === 0) {\n self.spies.push({\n id: '#attachmentsSection',\n name: $translate.instant('assetForm.attachments.title'),\n position: 3\n });\n self.spies.sort(function (a, b) {\n if (a.position > b.position) {\n return 1;\n }\n if (a.position < b.position) {\n return -1;\n }\n return 0;\n });\n }\n });\n\n $scope.$watch('assetForm.links.length', function (newVal, oldVal) {\n if (newVal && newVal === oldVal) {\n return;\n }\n if (!newVal) {\n removeScrollSpy('webLinkSection.title');\n }\n });\n\n self.meteredAttributes = function () {\n if (!self.asset.businessAssetAttributes) {\n return [];\n }\n\n var hasMeteredAttributes = self.asset.businessAssetAttributes.filter(function (attribute) {\n return attribute.isMetered === true || attribute.transactionCount > 0;\n });\n\n if (hasMeteredAttributes.length === 0) {\n removeScrollSpy($translate.instant('assetForm.metering.title'));\n }\n\n return hasMeteredAttributes;\n };\n\n self.showAssetUsage = function () {\n self.asset.businessAssetAttributes.forEach(function (attribute) {\n if (attribute.businessAssetAttributeType.isMeterable) {\n attribute.isMetered = true;\n }\n });\n self.showAssetUsageFlag = true;\n };\n\n self.hasMeterableAttributes = function () {\n if (!self.asset.businessAssetAttributes) {\n return false;\n }\n var meterableAttributes = self.asset.businessAssetAttributes.filter(function (attribute) {\n return attribute.businessAssetAttributeType.isMeterable === true;\n });\n\n return meterableAttributes.length > 0;\n };\n\n self.addLinks = function () {\n self.openWebLinksPanel = true;\n };\n });\n\n\n'use strict';\n\nangular.module('assetForm')\n .controller('assetDeleteModalController', function ($uibModalInstance, $scope, count) {\n $scope.count = count;\n\n $scope.close = function () {\n $uibModalInstance.dismiss('cancel');\n };\n\n $scope.ok = function () {\n $uibModalInstance.close();\n };\n });\n\n'use strict';\n\nangular.module('assetFloorPlanView', ['dudeControls', 'ui.router', 'dudeApi']);\n\n/**\n * @ngdoc service\n * @name assetFloorPlanView.assetFloorPlanViewService\n * @requires DudeApi\n *\n * @description\n * Service for supporting the asset view of floor plans\n *\n */\n\n'use strict';\n\nangular.module('assetFloorPlanView')\n .service('assetFloorPlanViewService', function (DudeApi) {\n /**\n * @ngdoc method\n * @name get\n * @methodOf assetFloorPlanView.assetFloorPlanViewService\n *\n * @description\n * Gets a single floor plan\n *\n * @param {number} id The id of the floor plan to get\n * @returns {Promise} A promise that resolves to the specified floor plan\n */\n var get = function (id) {\n return DudeApi.FloorPlanEntity.get({ id: id });\n };\n\n return {\n get: get\n };\n });\n\n'use strict';\n\nangular.module('assetFloorPlanView')\n .config(function ($stateProvider) {\n $stateProvider\n .state('secure.assetFloorPlanView', {\n url: 'assetFloorPlanView/:id',\n templateUrl: 'app/components/assetFloorPlanView/assetFloorPlanView.html',\n controller: 'AssetFloorPlanViewController',\n controllerAs: 'assetFloorPlanView',\n feature: 'floorplans',\n resolve: {\n floorPlan: function ($stateParams, DudeApi, assetFloorPlanViewService) {\n return assetFloorPlanViewService.get($stateParams.id).$promise;\n }\n }\n });\n });\n\n'use strict';\n\nangular.module('assetFloorPlanView')\n .controller('AssetFloorPlanViewController', function ($state, floorPlan, appConfig) {\n var self = this;\n self.floorPlan = floorPlan;\n self.imageUrl = appConfig.api.file + '/file/public/' + floorPlan.fileViewToken;\n\n self.navigateToFloorPlanList = function () {\n $state.go('secure.floorPlanList');\n };\n });\n\n'use strict';\n\nangular.module('assetFilters')\n .factory('assetFiltersService', function ($location, pagingHelpers) {\n // Checks to see if you are in search mode.\n var isSearching = function (filters) {\n return (filters.q !== null && filters.q !== '') ||\n (filters.isActive !== null && filters.isActive !== '' && filters.pmSchedule === null) ||\n (filters.businessAssetTypeId && filters.businessAssetTypeId !== null && filters.businessAssetTypeId.length > 0) ||\n (filters.isMetered !== null && filters.isMetered !== '') ||\n (angular.isDefined(filters.isLocation) && filters.isLocation !== null && filters.isLocation !== '');\n };\n\n var getFilters = function (params) {\n // if Adding a new search filter make sure to add it to the\n // isSearching() function below.\n\n var currentFilter = {\n page: params.page || pagingHelpers.defaults.page,\n pageSize: params.pageSize || pagingHelpers.defaults.pageSize,\n orderBy: params.orderBy || 'Name asc',\n q: params.q || null,\n isInventoryStorageArea: params.isInventoryStorageArea || null,\n isWorkOrderAsset: params.isWorkOrderAsset || null,\n parentId: params.parentId || null,\n isActive: params.isActive || (params.pmSchedule || null),\n businessAssetTypeId: params.businessAssetTypeId || null,\n searchFromCurrentNode: params.searchFromCurrentNode || true,\n includeDescendants: params.includeDescendants || null,\n isMetered: params.isMetered || null,\n isLocation: params.isLocation || null,\n pmSchedule: params.pmSchedule || null // used to set the isActive to true and fix isSearching()\n };\n\n return currentFilter;\n };\n\n var toApiFilter = function (currentFilter) {\n // Need to make a copy other wise back button on\n // page 2+ will not work and a parentID.\n currentFilter = angular.copy(currentFilter);\n\n if (!currentFilter.searchFromCurrentNode) {\n currentFilter.parentId = null;\n } else if (!isSearching(currentFilter) && (currentFilter.parentId === null || angular.isUndefined(currentFilter.parentId))) {\n currentFilter.parentId = ' ';\n }\n\n if (isSearching(currentFilter)) {\n currentFilter.includeDescendants = true;\n }\n\n return getFilters(currentFilter);\n };\n\n return {\n getFilters: getFilters,\n toApiFilter: toApiFilter,\n isSearching: isSearching\n };\n });\n\n/**\n * @ngdoc directive\n * @restrict E\n * @name assetFilters.asset-filters\n * @description\n *\n * The Inventory Storage Area or Work Order Asset filter\n *\n * @param {any} filters The item to filter on\n * @param {object} parentAsset The parent asset\n * @param {object} showStorageAreas One way bind on whether or not the storage area filter is shown (optional)\n * @param {boolean} openWhen Determines when sliding panel should open\n * @param {function} setFunction function reference to set the filters\n * @param {function} clearFunction function reference to handle the clear action\n **/\n\n'use strict';\n\nangular.module('assetFilters')\n .component('assetFilters', {\n templateUrl: 'app/components/assetFilters/assetFilters.html',\n bindings: {\n filters: '=',\n parentAsset: '=',\n showStorageAreas: '
\");\n$templateCache.put(\"app/components/assetFloorPlanView/assetFloorPlanView.html\",\"

{{::\\'assetFloorPlanView.title\\' | translate }}

{{::assetFloorPlanView.floorPlan.businessAsset.name}}
\\\"{{::\\'assetFloorPlanView.floorPlanFor\\'
\");\n$templateCache.put(\"app/components/assetForm/assetDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/assetForm/assetDeleteWarningModal.html\",\"\");\n$templateCache.put(\"app/components/assetForm/assetForm.html\",\"

{{::(assetForm.asset.id ? \\'assetForm.editTitle\\' : \\'assetForm.createTitle\\') | translate}}

{{::\\'general.validation.required\\' | translate }}

{{::\\'general.validation.required\\' | translate }} {{::\\'assetForm.validation.invalidCharacter\\' | translate }}

*{{::\\'assetForm.hasQuantityWarning\\' | translate}}

{{::\\'general.validation.required\\' | translate }}

{{::\\'general.validation.required\\' | translate }}

{{::\\'general.validation.required\\' | translate }}

{{::\\'general.validation.required\\' | translate }} {{::\\'assetForm.validation.categoryNullError\\' | translate }}

0\\\" has-permissions=BusinessAssets-Delete>  {{::\\'assetForm.inactiveWarning\\' | translate}}
{{:: \\'assetForm.attributes\\' | translate}}
{{:: \\'assetForm.noAttributesMessage\\' | translate}}
0\\\">
{{::\\'assetForm.metering.title\\' | translate}}
0\\\"> 0\\\">

{{::\\'assetForm.buildAForm.assetUsage.cardHeader\\' | translate }}

{{::\\'assetForm.buildAForm.assetUsage.cardBody\\' | translate }}

{{::\\'assetForm.attachments.title\\' | translate}}

{{::\\'assetForm.cards.attachment.body\\' | translate}}

{{::\\'assetForm.links.title\\' | translate}}

{{::\\'assetForm.cards.link.body\\' | translate}}
\");\n$templateCache.put(\"app/components/assetList/assetList.html\",\"

{{::\\'assetList.title\\' | translate}}

{{::\\'general.sort\\' | translate}}
  • {{::\\'assetList.name\\' | translate}}
{{::\\'assetList.name\\' | translate}}
{{::\\'assetList.category\\' | translate}}
{{::\\'general.noResults\\' | translate}}
    \");\n$templateCache.put(\"app/components/assetList/assetListRow.html\",\"
    \");\n$templateCache.put(\"app/components/assetList/pmScheduleAssetListRow.html\",\"
    {{::asset.name}}

    \");\n$templateCache.put(\"app/components/assetReport/assetReportChart.html\",\"

    {{::\\'reports.title\\' | translate}}

    \");\n$templateCache.put(\"app/components/assetReport/assetReportList.html\",\"

    {{::\\'reports.title\\' | translate}}

    {{::\\'general.sort\\' | translate}}
    • {{::assetReport.title}}
    • {{::\\'reports.count\\' | translate}}
    • {{::\\'general.hours\\' | translate}}
    • {{::\\'reports.byCost.labor\\' | translate}}
    • {{::\\'reports.byCost.purchase\\' | translate}}
    • {{::\\'reports.byCost.service\\' | translate}}
    • {{::\\'general.total\\' | translate}}
    {{assetReport.title}}
    {{::\\'reports.count\\' | translate}}
    {{::\\'general.total\\' | translate}}
    {{::\\'general.hours\\' | translate}}
    {{::\\'general.total\\' | translate}}
    {{::\\'reports.byCost.labor\\' | translate}}
    {{::\\'general.total\\' | translate}}
    {{::\\'reports.byCost.purchase\\' | translate}}
    {{::\\'general.total\\' | translate}}
    {{::\\'reports.byCost.service\\' | translate}}
    {{::\\'general.total\\' | translate}}
    {{::\\'reports.byCost.cost\\' | translate}}
    {{::\\'general.noResults\\' | translate}}
    {{::value.asset.value}}
    {{::value.count.workOrders | number}}
    {{::value.count.laborHours| number:2}}
    {{::value.cost.labor | currency}}
    {{::value.cost.purchase | currency}}
    {{::value.cost.service | currency}}
    {{::value.cost.total | currency}}
    {{::\\'reports.byWorkOrders.workOrders\\' | translate}} {{::value.count.workOrders | number}}
    {{::\\'reports.byLaborHours.hours\\' | translate}} {{::value.count.laborHours | number:2}}
    {{::\\'general.total\\' | translate}} {{::value.cost.total | currency}}
    {{::\\'reports.byCost.labor\\' | translate}} {{::value.cost.labor | currency}}
    {{::\\'reports.byCost.purchase\\' | translate}} {{::value.cost.purchase | currency}}
    {{::\\'reports.byCost.service\\' | translate}} {{::value.cost.service | currency}}
      \");\n$templateCache.put(\"app/components/assetTypeForm/assetCategoryAttributes.html\",\"
      \");\n$templateCache.put(\"app/components/assetTypeForm/assetTypeDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/assetTypeForm/assetTypeDeleteWarningModal.html\",\"\");\n$templateCache.put(\"app/components/assetTypeForm/assetTypeForm.html\",\"

      {{::\\'assetTypeForm.dudeAsset\\' | translate}}

      {{::(assetTypeForm.assetType.id ? \\'assetTypeForm.editTitle\\' : \\'assetTypeForm.createTitle\\') | translate}}

      {{::\\'general.validation.required\\' | translate}}

      {{::\\'general.validation.required\\' | translate }}

      {{::\\'general.validation.required\\' | translate}}

      {{::\\'general.validation.required\\' | translate }}

      \");\n$templateCache.put(\"app/components/assetTypeList/assetTypeList.html\",\"

      {{::\\'assetTypeList.title\\' | translate}}

      {{::\\'general.sort\\' | translate}}
      • {{::\\'assetTypeList.name\\' | translate}}
      {{::\\'assetTypeList.name\\' | translate}}
      {{::\\'general.noResults\\' | translate}}
      {{::assetType.name}}
      {{::\\'assetTypeList.inactive\\' | translate}}
        \");\n$templateCache.put(\"app/components/changePassword/changePassword.html\",\"

        {{:: \\'changePassword.title\\' | translate}}

        {{::\\'general.validation.required\\' | translate }} {{::\\'changePassword.validation.old\\' | translate }}

        {{::\\'general.validation.required\\' | translate }} {{::\\'changePassword.validation.length\\' | translate}} {{::\\'changePassword.validation.invalid\\' | translate }}

        {{::\\'general.validation.required\\' | translate }} {{::\\'changePassword.validation.length\\' | translate}} {{::\\'changePassword.validation.invalid\\' | translate }} {{::\\'changePassword.validation.match\\' | translate }}

        \");\n$templateCache.put(\"app/components/dashboard/dashboard.html\",\"

        {{::\\'dashboard.title\\' | translate}}

        \");\n$templateCache.put(\"app/components/departmentForm/departmentForm.html\",\"

        {{::(departmentForm.department.id ? \\'departmentForm.editTitle\\' : \\'departmentForm.createTitle\\') | translate}}

        {{::\\'general.validation.required\\' | translate}}

        {{::\\'general.validation.required\\' | translate }}

        \");\n$templateCache.put(\"app/components/departmentList/departmentList.html\",\"

        {{::\\'departmentList.title\\' | translate}}

        {{::\\'departmentList.name\\' | translate}}
        {{::\\'general.noResults\\' | translate}}
        {{::department.name}} {{::\\'general.inactive\\' | translate}}
          \");\n$templateCache.put(\"app/components/employeeReport/employeeReportFilters.html\",\"
          \");\n$templateCache.put(\"app/components/employeeReport/employeeReportList.html\",\"

          {{::\\'reports.title\\' | translate}}

          {{::\\'general.sort\\' | translate}}
          • {{::\\'employeeReports.title\\' | translate}}
          • {{::\\'employeeReports.hoursLogged\\' | translate}}
          • {{::\\'employeeReports.completedWO\\' | translate}}
          {{::\\'employeeReports.title\\' | translate}}
          {{::\\'employeeReports.completedWO\\' | translate}}
          {{::\\'employeeReports.hoursLogged\\' | translate}}
          {{::\\'general.noResults\\' | translate}}
          {{::employee.assignee.firstName}} {{::employee.assignee.lastName}}
          {{::\\'general.disabled\\' | translate}}
          {{::\\'employeeReports.completedWO\\' | translate}}
          {{employee.completedWorkOrders}}
          {{::\\'employeeReports.hoursLogged\\' | translate}}
          {{employee.laborHours}}
          {{::\\'employeeReports.workOrder\\' | translate}}
          {{::\\'employeeReports.workType\\' | translate}} {{::\\'employeeReports.trade\\' | translate}}
          {{::\\'general.hours\\' | translate}}
          {{::\\'employeeReports.noHours\\' | translate}}
          employeeReport.filters.pageSize\\\">
            \");\n$templateCache.put(\"app/components/equipmentReport/equipmentChart.html\",\"\");\n$templateCache.put(\"app/components/equipmentReport/equipmentList.html\",\"\");\n$templateCache.put(\"app/components/failureReport/failureReportChart.html\",\"

            {{::\\'reports.title\\' | translate}}

            \");\n$templateCache.put(\"app/components/failureReport/failureReportList.html\",\"

            {{::\\'reports.title\\' | translate}}

            {{::\\'general.sort\\' | translate}}
            • {{::\\'reports.locationOrEquipment\\' | translate}}
            • {{::\\'failureReports.numberOf\\' | translate}}
            • {{::\\'failureReports.numberOf\\' | translate}}
            {{::\\'reports.locationOrEquipment\\' | translate}}
            {{::\\'failureReports.numberOf\\' | translate}}
            {{::\\'failureReports.numberOf\\' | translate}}
            {{::\\'general.noResults\\' | translate}}
            {{::value.asset.value}}
            {{::value.self.failures | number}}
            {{::\\'failureReports.numberOf\\' | translate}} {{::value.self.failures | number}}
            {{::\\'failureReports.failureReasons\\' | translate}}
              \");\n$templateCache.put(\"app/components/filter-bar/filter-bar.html\",\"
              • {{filterBar.filters | badges: filterBar.filterState.ignoreForBadge}}
              • {{\\'filterBar.myFilter\\' | translate }}: {{filterBar.filterState.activeSavedFilter.name}}

              \");\n$templateCache.put(\"app/components/filterAssetCategory/filterAssetCategory.html\",\"
              \");\n$templateCache.put(\"app/components/filterAssetNodeSearch/filterAssetNodeSearch.html\",\"
              \");\n$templateCache.put(\"app/components/filterCheckboxGroup/filterCheckboxGroup.html\",\"
              \");\n$templateCache.put(\"app/components/filterProject/filterProject.html\",\"\");\n$templateCache.put(\"app/components/filterPurposeType/filterPurposeType.html\",\"\");\n$templateCache.put(\"app/components/filterReportDateRange/filterReportDateRange.html\",\"\");\n$templateCache.put(\"app/components/filterStorageArea/filterStorageArea.html\",\"
              \");\n$templateCache.put(\"app/components/filterWorkType/filterWorkType.html\",\"\");\n$templateCache.put(\"app/components/filterWorkorderDate/filterWorkorderDate.html\",\"\");\n$templateCache.put(\"app/components/filterWorkorderDate/workOrderDateFilter.html\",\"
              \");\n$templateCache.put(\"app/components/filterWorkorderPriority/filterWorkorderPriority.html\",\"
              \");\n$templateCache.put(\"app/components/filterWorkorderStatus/filterWorkorderStatus.html\",\"
              \");\n$templateCache.put(\"app/components/floorPlanList/floorPlanList.html\",\"

              {{::\\'floorPlanList.title\\' | translate}}

              {{::\\'general.noResults\\' | translate}}
              {{::floorPlan.businessAsset.name}}
                \");\n$templateCache.put(\"app/components/floorPlanList/floorPlanListPanel.html\",\"
                {{::\\'floorPlanList.floorPlanHelperText\\' | translate}}
                {{::\\'floorPlanList.addFloorPlan\\' | translate}}
                {{floorPlanListPanel.entity.filename}}
                ({{::\\'floorPlanList.allowedFileTypes\\' | translate}})
                {{floorPlanListPanel.entity.filename}}
                {{::\\'floorPlanList.added\\' | translate}}: {{floorPlanListPanel.entity.createdDateTime | date: \\'MM/dd/yyyy | mm:hh a\\'}}
                {{::\\'general.validation.required\\' | translate }} {{::\\'floorPlanList.minimumSizeError\\' | translate}} {{::\\'floorPlanList.maximumSizeError\\' | translate}} {{::floorPlanListPanel.file.errorMessage}}

                {{::\\'floorPlanList.assignToLocation\\' | translate}} ({{::\\'floorPlanList.floorTypes\\' | translate}})

                {{::\\'general.validation.required\\' | translate }} {{::\\'floorPlanList.saveError\\' | translate}}

                \");\n$templateCache.put(\"app/components/history/historyEventCard.html\",\"

                {{historyEventCard.name}} {{historyEventCard.subname}}

                {{::historyEventCard.translateFallback(\\'history.changeFields.\\' + change.field)}} ({{::\\'history.changeTypes.\\' + change.changeType | translate }})
                {{::\\'history.from\\' | translate}} {{::change.beforeString}}
                {{::\\'history.to\\' | translate}} {{::change.afterString}}
                {{::\\'history.value\\' | translate}} {{::change.beforeString}}
                {{::\\'history.value\\' | translate}} {{::change.afterString}}
                \");\n$templateCache.put(\"app/components/history/historySlidingPanel.html\",\"
                {{historySlidingPanel.emptyMessage}}
                {{::historyEvent.changeDateTime | date:\\'MM/dd/yyyy\\'}} {{::historyEvent.changeDateTime | date:\\'hh:mm:ss a\\'}} {{::historyEvent.userName}}
                \");\n$templateCache.put(\"app/components/historyList/historyListNavigation.html\",\"
                \");\n$templateCache.put(\"app/components/issueToWorkOrder/issueToWorkOrder.html\",\"
                {{::\\'issueToWorkOrder.selectText\\' | translate}}
                {{::\\'issueToWorkOrder.issuedFrom\\' | translate}}
                {{::issueToWorkOrder.inventoryItem.name }}
                {{::\\'issueToWorkOrder.unitOfIssue\\' | translate}} {{::issueToWorkOrder.inventoryItem.unitOfIssue}}
                {{::\\'issueToWorkOrder.storageArea\\' | translate}} {{::issueToWorkOrder.selectedStorageArea.asset.name }}
                {{::\\'issueToWorkOrder.transferableQuantity\\' | translate}} {{ issueToWorkOrder.selectedStorageArea.availableQuantity }}
                {{::\\'issueToWorkOrder.issuedTo\\' | translate}}
                {{::\\'issueToWorkOrder.selectTextAbove\\' | translate}}
                \");\n$templateCache.put(\"app/components/locationReport/locationChart.html\",\"\");\n$templateCache.put(\"app/components/locationReport/locationList.html\",\"\");\n$templateCache.put(\"app/components/meterReading/meterReading.html\",\"

                {{::\\'meterReading.helperMessage\\' | translate}}

                {{::meterReading.asset.name}}
                \");\n$templateCache.put(\"app/components/navbar/navbar.html\",\"
                \");\n$templateCache.put(\"app/components/notifications/notifications.html\",\"

                {{::\\'notifications.title\\' | translate}}

                \");\n$templateCache.put(\"app/components/pmScheduleAssets/pmScheduleAssets.html\",\"
                {{::\\'pmScheduleAssets.helperMessage\\' | translate}}
                \");\n$templateCache.put(\"app/components/pmScheduleAssignees/pmScheduleAssignees.html\",\"
                {{::\\'pmScheduleAssignees.helperMessage\\' | translate}}
                \");\n$templateCache.put(\"app/components/pmScheduleDetails/pmScheduleDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/pmScheduleDetails/pmScheduleDetails.html\",\"
                {{\\'pmScheduleForm.cards.schedule.title\\' | translate}}
                {{::\\'pmScheduleDetails.locationOrEquipment\\' | translate}}: {{::\\'pmScheduleDetails.select\\' | translate}} 0\\\">{{schedule.businessAssets | commaSeparate:\\'name\\'}} {{::\\'general.validation.required\\' | translate}}
                0\\\">
                {{::\\'pmScheduleDetails.readings\\' | translate}}: {{::\\'pmScheduleDetails.setReadings\\' | translate}} 0\\\">{{::\\'pmScheduleDetails.startReadings\\' | translate}} {{::\\'general.validation.required\\' | translate}}

                {{::\\'pmScheduleDetails.validation.active.workType\\'| translate}} {{::\\'pmScheduleDetails.validation.active.purpose\\' | translate}} {{::\\'pmScheduleDetails.validation.active.trade\\' | translate}} {{::\\'pmScheduleDetails.validation.active.assignee\\' | translate}}

                \");\n$templateCache.put(\"app/components/pmScheduleForm/pmScheduleDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/pmScheduleForm/pmScheduleDeleteWarningModal.html\",\"\");\n$templateCache.put(\"app/components/pmScheduleForm/pmScheduleForm.html\",\"

                {{::(pmScheduleForm.workOrderTemplate.id ? \\'pmScheduleForm.editTitle\\' : \\'pmScheduleForm.createTitle\\') | translate}}

                {{::\\'general.validation.required\\' | translate}}

                {{::\\'general.validation.required\\' | translate }}

                {{::\\'general.required\\' | translate}}

                {{::\\'general.validation.required\\' | translate }}


                {{::\\'pmScheduleForm.validation.estimatedHours.max\\' | translate}} {{::\\'pmScheduleForm.validation.estimatedHours.min\\' | translate}}

                {{::\\'pmScheduleForm.validation.estimatedCost.max\\' | translate}} {{::\\'pmScheduleForm.validation.estimatedCost.min\\' | translate}}


                {{::\\'pmScheduleForm.settings\\' | translate}}
                {{::\\'pmScheduleForm.validation.min\\' | translate }} {{::\\'pmScheduleForm.validation.max\\' | translate }}
                0\\\">
                {{\\'pmScheduleForm.cards.task.title\\' | translate}}
                {{::\\'pmScheduleForm.cards.task.linkedTo\\' | translate}}:  {{pmScheduleForm.workOrderTemplate.taskBook.title}}

                {{::\\'pmScheduleForm.cards.schedule.title\\' | translate}} {{::\\'general.validation.required\\' | translate}}

                {{::\\'pmScheduleForm.cards.schedule.body\\' | translate}}

                {{::\\'pmScheduleForm.cards.task.title\\' | translate}}

                {{::\\'pmScheduleForm.cards.task.body\\' | translate}}
                {{::\\'general.actions.cancel\\' | translate}}
                \");\n$templateCache.put(\"app/components/pmScheduleList/pmScheduleList.html\",\"

                {{::\\'pmScheduleList.title\\' | translate}}

                {{::\\'general.sort\\' | translate}}
                • {{::\\'pmScheduleList.schedule\\' | translate}}
                {{::\\'pmScheduleList.schedule\\' | translate}}
                {{::\\'general.noResults\\' | translate}}
                {{::pmSchedule.description}}
                  \");\n$templateCache.put(\"app/components/pmScheduleMeterReading/pmScheduleMeterReading.html\",\"
                  {{::\\'pmScheduleMeterReading.helperMessage\\' | translate}}


                  0\\\">
                  0\\\">

                  {{::\\'pmScheduleMeterReading.notTrackedHeader\\' | translate}}

                  {{::\\'pmScheduleMeterReading.removeWarning\\' | translate}}

                  \");\n$templateCache.put(\"app/components/pmScheduleRecurrence/pmScheduleRecurrence.html\",\"
                  {{::\\'pmScheduleRecurrence.helperMessage\\' | translate}}
                  \");\n$templateCache.put(\"app/components/projectForm/projectForm.html\",\"

                  {{::(projectForm.project.id ? \\'projectForm.editTitle\\' : \\'projectForm.createTitle\\') | translate}}

                  {{::\\'general.validation.required\\' | translate}}

                  {{::\\'general.validation.required\\' | translate }}

                  {{::\\'projectForm.validation.budgetedAmount.max\\' | translate}} {{::\\'projectForm.validation.budgetedAmount.min\\' | translate}}

                  {{::\\'projectForm.tracking.title\\' | translate}}
                  {{::projectForm.totalCost.total | currency}} {{::\\'general.of\\' | translate}} {{projectForm.budget | currency}} $0.00 {{::\\'general.spent\\' | translate}}
                  {{::\\'projectForm.tracking.remaining\\' | translate}}
                  {{projectForm.budgetRemainder | currency}}
                  {{::\\'projectForm.tracking.purchases\\' | translate}} {{::projectForm.totalCost.purchase | currency}}
                  {{::\\'projectForm.tracking.labor\\' | translate}} {{::projectForm.totalCost.labor | currency}}
                  {{::\\'projectForm.tracking.services\\' | translate}} {{::projectForm.totalCost.service | currency}}
                  {{::\\'projectForm.tracking.total\\' | translate}} {{::projectForm.totalCost.total | currency}}

                  0\\\">{{:: \\'projectForm.workOrder.association\\' | translate}} 0\\\">{{projectForm.workOrderCount}}{{::\\'projectForm.workOrder.noAssociation\\' | translate}}
                  \");\n$templateCache.put(\"app/components/projectList/projectList.html\",\"

                  {{::\\'projectList.title\\' | translate}}

                  {{::\\'projectList.name\\' | translate}}
                  {{::\\'general.noResults\\' | translate}}
                  {{::project.name}}
                  {{::project.description}}
                  {{::\\'general.inactive\\' | translate}}
                    \");\n$templateCache.put(\"app/components/purposeList/purposeList.html\",\"

                    {{::\\'purposeList.title\\' | translate}}

                    {{::\\'general.sort\\' | translate}}
                    • {{::\\'purposeList.name\\' | translate}}
                    • {{::\\'purposeList.purposeType\\' | translate}}
                    {{::\\'purposeList.name\\' | translate}}
                    {{::\\'purposeList.purposeType\\' | translate}}
                    {{::\\'general.noResults\\' | translate}}
                    {{ purpose.value }}
                    {{ purpose.purposeType.name }}
                    {{::\\'purposeList.inactive\\' | translate}}
                    {{::\\'purposeList.default\\' | translate}}
                      \");\n$templateCache.put(\"app/components/purposePanel/purposeDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/purposePanel/purposeDeleteWarningModal.html\",\"\");\n$templateCache.put(\"app/components/purposePanel/purposePanel.html\",\"
                      {{::\\'general.validation.required\\' | translate}}

                      {{::\\'general.validation.required\\' | translate }}

                      {{::\\'general.validation.required\\' | translate}}

                      {{::\\'general.validation.required\\' | translate }}

                      {{purposePanel.associationsValidation}}

                      \");\n$templateCache.put(\"app/components/purposeReport/purposeReportChart.html\",\"

                      {{::\\'reports.title\\' | translate}}

                      \");\n$templateCache.put(\"app/components/purposeReport/purposeReportList.html\",\"

                      {{::\\'reports.title\\' | translate}}

                      {{::\\'general.sort\\' | translate}}
                      • {{::\\'purposeReports.title\\' | translate}}
                      • {{::\\'reports.count\\' | translate}}
                      • {{::\\'general.hours\\' | translate}}
                      • {{::\\'reports.byCost.labor\\' | translate}}
                      • {{::\\'reports.byCost.purchase\\' | translate}}
                      • {{::\\'reports.byCost.service\\' | translate}}
                      • {{::\\'general.total\\' | translate}}
                      {{::\\'purposeReports.title\\' | translate}}
                      {{::\\'reports.count\\' | translate}}
                      {{::\\'general.total\\' | translate}}
                      {{::\\'reports.avg\\' | translate}}
                      {{::\\'general.hours\\' | translate}}
                      {{::\\'general.total\\' | translate}}
                      {{::\\'reports.avg\\' | translate}}
                      {{::\\'reports.byCost.labor\\' | translate}}
                      {{::\\'general.total\\' | translate}}
                      {{::\\'reports.avg\\' | translate}}
                      {{::\\'reports.byCost.purchase\\' | translate}}
                      {{::\\'general.total\\' | translate}}
                      {{::\\'reports.avg\\' | translate}}
                      {{::\\'reports.byCost.service\\' | translate}}
                      {{::\\'general.total\\' | translate}}
                      {{::\\'reports.byCost.cost\\' | translate}}
                      {{::\\'reports.avg\\' | translate}}
                      {{::\\'general.total\\' | translate}} {{::\\'reports.byCost.cost\\' | translate}}
                      {{::\\'general.noResults\\' | translate}}
                      {{::value.purpose.value}}
                      {{::value.count.workOrders | number}}
                      {{::value.count.laborHours| number:2}}
                      {{::value.cost.labor | currency}}
                      {{::value.cost.purchase | currency}}
                      {{::value.cost.service | currency}}
                      {{::value.cost.total | currency}}
                      {{::\\'reports.byWorkOrders.workOrders\\' | translate}} {{::value.count.workOrders | number}}
                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'general.hours\\' | translate}} {{::value.count.laborHours | number:2}}
                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'general.total\\' | translate}} {{::\\'reports.byCost.cost\\' | translate}} {{::value.cost.total | currency}}
                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'reports.byCost.labor\\' | translate}} {{::value.cost.labor | currency}}
                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'reports.byCost.purchase\\' | translate}} {{::value.cost.purchase | currency}}
                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'reports.byCost.service\\' | translate}} {{::value.cost.service | currency}}
                        \");\n$templateCache.put(\"app/components/reportFilters/reportFilters.html\",\"
                        \");\n$templateCache.put(\"app/components/reports/reportListTotals.html\",\"
                        {{::\\'reports.totals\\' | translate}}
                        {{::\\'reports.byWorkOrders.workOrders\\' | translate}} {{reportListTotals.data.count.workOrders | number}}
                        {{::\\'reports.byCost.hours\\' | translate}} {{reportListTotals.data.count.laborHours | number:2}}
                        {{::\\'reports.byCost.labor\\' | translate}}
                        99999 && reportListTotals.data.cost.labor <= 999999, \\'font-size-base\\': reportListTotals.data.cost.labor > 999999 && reportListTotals.data.cost.labor <= 9999999, \\'font-size-sm\\': reportListTotals.data.cost.labor > 9999999}\\\">{{reportListTotals.data.cost.labor | currency}}
                        {{::\\'reports.byCost.purchase\\' | translate}}
                        99999 && reportListTotals.data.cost.purchase <= 999999, \\'font-size-base\\': reportListTotals.data.cost.purchase > 999999 && reportListTotals.data.cost.purchase <= 9999999, \\'font-size-sm\\': reportListTotals.data.cost.purchase > 9999999}\\\">{{reportListTotals.data.cost.purchase | currency}}
                        {{::\\'reports.byCost.service\\' | translate}}
                        99999 && reportListTotals.data.cost.service <= 999999, \\'font-size-base\\': reportListTotals.data.cost.service > 999999 && reportListTotals.data.cost.service <= 9999999, \\'font-size-sm\\': reportListTotals.data.cost.service > 9999999}\\\">{{reportListTotals.data.cost.service | currency}}
                        {{::\\'reports.byCost.total\\' | translate}}
                        99999 && reportListTotals.data.cost.total <= 999999, \\'font-size-base\\': reportListTotals.data.cost.total > 999999 && reportListTotals.data.cost.total <= 9999999, \\'font-size-sm\\': reportListTotals.data.cost.total > 9999999}\\\">{{reportListTotals.data.cost.total | currency}}
                        {{::\\'reports.byWorkOrders.workOrders\\' | translate}} {{::reportListTotals.data.count.workOrders | number}}
                        {{::\\'reports.totals\\' | translate}}
                        {{::\\'reports.byLaborHours.hours\\' | translate}} {{::reportListTotals.data.count.laborHours | number:2}}
                        {{::\\'reports.byCost.labor\\' | translate}} {{::reportListTotals.data.cost.labor | currency}}
                        {{::\\'reports.byCost.purchase\\' | translate}} {{::reportListTotals.data.cost.purchase | currency}}
                        {{::\\'reports.byCost.service\\' | translate}} {{::reportListTotals.data.cost.service | currency}}
                        {{::\\'reports.byCost.total\\' | translate}}
                        99999 && reportListTotals.data.cost.labor <= 999999, \\'font-size-base\\': reportListTotals.data.cost.labor > 999999 && reportListTotals.data.cost.labor <= 9999999, \\'font-size-sm\\': reportListTotals.data.cost.labor > 9999999}\\\">{{::reportListTotals.data.cost.total | currency}}
                        \");\n$templateCache.put(\"app/components/reports/reportNavigation.html\",\"
                        \");\n$templateCache.put(\"app/components/settingsForm/settingsForm.html\",\"

                        {{::\\'settingsForm.pageTitle\\' | translate}}

                        {{:: \\'settingsForm.laborRateMultipliers.sectionTitle\\' | translate}}
                        {{::\\'settingsForm.laborRateMultipliers.infoText\\' | translate}}
                        {{::\\'general.validation.required\\' | translate}}
                        {{::\\'settingsForm.laborRateMultipliers.rateTypeHelperText\\' | translate}}

                        {{::\\'general.validation.required\\' | translate }} {{::\\'settingsForm.laborRateMultipliers.validation.number\\' | translate }} {{::\\'settingsForm.laborRateMultipliers.validation.min\\' | translate }} {{::\\'settingsForm.laborRateMultipliers.validation.max\\' | translate }}

                        {{::\\'general.validation.required\\' | translate}}
                        {{::\\'settingsForm.laborRateMultipliers.rateTypeHelperText\\' | translate}}

                        {{::\\'general.validation.required\\' | translate }} {{::\\'settingsForm.laborRateMultipliers.validation.number\\' | translate }} {{::\\'settingsForm.laborRateMultipliers.validation.min\\' | translate }} {{::\\'settingsForm.laborRateMultipliers.validation.max\\' | translate }}

                        {{:: \\'settingsForm.purpose.sectionTitle\\' | translate}}
                        {{::\\'settingsForm.purpose.helperText\\' | translate}}
                        {{:: \\'registrationLink.requesterRegistration.sectionTitle\\' | translate}}
                        {{:: \\'settingsForm.areaRoomNumber.sectionTitle\\' | translate}}
                        {{::\\'settingsForm.areaRoomNumber.helperText\\' | translate}}
                        \");\n$templateCache.put(\"app/components/taskBookForm/taskBookDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/taskBookForm/taskBookDeleteWarningModal.html\",\"\");\n$templateCache.put(\"app/components/taskBookForm/taskBookForm.html\",\"

                        {{::!taskBookForm.taskBook.id ? \\'taskBookForm.createTitle\\' : \\'taskBookForm.editTitle\\' | translate}}

                        {{::\\'general.validation.required\\' | translate}}

                        {{::\\'general.validation.required\\' | translate }}

                          {{::taskBookForm.updatedTime | translate}}
                        {{::\\'taskBookForm.tasksAndProceduresHeading\\' | translate}}
                        \");\n$templateCache.put(\"app/components/taskBookList/taskBookList.html\",\"

                        {{::\\'taskBookList.title\\' | translate}}

                        {{::\\'general.sort\\' | translate}}
                        • {{::\\'taskBookList.name\\' | translate}}
                        {{::\\'taskBookList.name\\' | translate}}
                        {{::\\'general.noResults\\' | translate}}
                        {{::taskBook.title}}
                          \");\n$templateCache.put(\"app/components/taskBookSelect/taskBookPopBox.html\",\"

                          {{::\\'taskBookSelect.popbox.linkMessage\\' | translate}}

                          0 && areThereTaskOrProceduresFilledOut()\\\"> {{::\\'taskBookSelect.popbox.linkWarning\\' | translate}}
                          {{::\\'taskBookSelect.popbox.copyMessage\\' | translate}}
                          \");\n$templateCache.put(\"app/components/taskBookSelect/taskBookSelect.html\",\"
                          \");\n$templateCache.put(\"app/components/taskbook/taskBook.html\",\"
                          {{taskBook.mode === taskBook.MODES.COMPLETED_EDIT ? \\'taskBook.noTasksAdded\\' : \\'taskBook.noResults\\' | translate}}
                          0\\\" task-book=taskBook.taskBook link-id=null tasks-to-delete=taskBook.tasksToDelete show-link=false>
                          {{$index + 1}}.
                          {{$index + 1}}. {{task.title}}

                          {{::\\'general.validation.required\\' | translate }}



                          \");\n$templateCache.put(\"app/components/tradeForm/tradeDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/tradeForm/tradeDeleteWarningModal.html\",\"\");\n$templateCache.put(\"app/components/tradeForm/tradeForm.html\",\"

                          {{::(tradeForm.trade.id ? \\'tradeForm.editTitle\\' : \\'tradeForm.createTitle\\') | translate}}

                          {{::\\'general.validation.required\\' | translate}}

                          {{::\\'general.validation.required\\' | translate }}

                          {{tradeForm.associationsValidation}}

                          \");\n$templateCache.put(\"app/components/tradeList/tradeList.html\",\"

                          {{::\\'tradeList.title\\' | translate}}

                          {{::\\'general.sort\\' | translate}}
                          • {{::\\'tradeList.name\\' | translate}}
                          {{::\\'tradeList.name\\' | translate}}
                          {{::\\'general.noResults\\' | translate}}
                          {{::trade.name}}
                          {{::\\'tradeList.inactive\\' | translate}}
                            \");\n$templateCache.put(\"app/components/userForm/userForm.html\",\"

                            {{::userForm.title()}}

                            {{::\\'general.required\\' | translate}}

                            {{::\\'general.validation.required\\' | translate }}

                            {{::\\'general.required\\' | translate}}

                            {{::\\'general.validation.required\\' | translate }}

                            {{::\\'general.required\\' | translate}}

                            {{::\\'general.validation.required\\' | translate }} {{::\\'general.validation.email\\' | translate }} {{::\\'general.validation.email\\' | translate}} {{::\\'general.validation.emailAlreadyExists\\' | translate}}

                            {{::userForm.user.roles[0].roleName}}

                            {{::userForm.user.roles[0].roleName}}

                            {{::\\'userForm.validation.hourlyRate.number\\' | translate }} {{::\\'userForm.validation.hourlyRate.max\\' | translate }} {{::\\'userForm.validation.hourlyRate.min\\' | translate }}

                            {{userForm.associationsValidation}}


                            {{::\\'userForm.phone\\' | translate}}
                            1\\\" ng-click=userForm.removePhone($index) aria-label=\\\"{{::\\'userForm.delete\\' | translate}}\\\">
                            Change Password
                            \");\n$templateCache.put(\"app/components/userList/importUserModal.html\",\"\");\n$templateCache.put(\"app/components/userList/userList.html\",\"

                            {{::\\'userList.title\\' | translate}}

                            {{::\\'general.sort\\' | translate}}
                            • {{::\\'userList.name\\' | translate}}
                            {{::\\'userList.name\\' | translate}}
                            {{::\\'userList.email\\' | translate}}
                            {{::\\'userList.role\\' | translate}}
                            {{::\\'general.noResults\\' | translate}}
                            {{::user.firstName}} {{::user.lastName}}
                            {{::user.roles[0].roleName}}
                            {{::\\'general.disabled\\' | translate}}
                            {{::\\'general.notActivated\\' | translate}}
                              \");\n$templateCache.put(\"app/components/webLinkCard/webLinkCard.html\",\"\");\n$templateCache.put(\"app/components/webLinkSection/deleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/webLinkSection/webLinkSection.html\",\"\");\n$templateCache.put(\"app/components/workOrderCalendar/calendarDayView.html\",\"
                              {{::\\'workOrderCalendar.noScheduledWork\\' | translate}}  
                              ID: {{event.displayId}}
                              {{::event.businessAsset.name}}
                              {{::event.eventDescription}}
                              {{::event.workType.name}}
                              {{::\\'workOrderList.recurring\\' | translate}}
                              {{::\\'workOrderCalendar.dayPmProjections\\' | translate}}
                              {{::event.businessAsset.name}}
                              {{::event.eventDescription}}
                              {{::event.workType.name}}
                              {{::\\'workOrderList.recurring\\' | translate}}
                              \");\n$templateCache.put(\"app/components/workOrderCalendar/calendarNavigation.html\",\"
                              \");\n$templateCache.put(\"app/components/workOrderCalendarDay/workOrderCalendarDay.html\",\"
                              {{workOrderCalendar.counts.reactive}}
                              {{workOrderCalendar.counts.planned}}
                              {{workOrderCalendar.targetDate | date:\\'MMMM d\\'}} ({{::\\\"workOrderCalendar.today\\\" | translate}})
                              \");\n$templateCache.put(\"app/components/workOrderCalendarMonth/workOrderCalendarMonth.html\",\"
                              {{workOrderCalendar.counts.reactive}}
                              {{workOrderCalendar.counts.planned}}
                              {{workOrderCalendar.targetDate | date:\\'MMMM yyyy\\'}}
                              \");\n$templateCache.put(\"app/components/workOrderComments/workOrderComments.html\",\"
                              {{::\\'workOrderComments.comments\\' | translate}}
                              {{::comment.postedBy.firstName}} {{::comment.postedBy.lastName}}
                              {{::\\'workOrderComments.submitted\\' | translate}}: {{::(comment.audit.createdDateTime | date:\\'MM/dd/yyyy h:mm a\\')}} {{::\\'workOrderComments.edited\\' | translate}}: {{(comment.audit.updatedDateTime | date:\\'MM/dd/yyyy h:mm a\\')}}
                              {{comment.text}}
                              {{::\\'workOrderComments.privateComment\\' | translate}}
                              {{::\\'workOrderComments.commentBelow\\' | translate}}
                              \");\n$templateCache.put(\"app/components/workOrderComments/workOrderCommentsDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/workOrderFilters/workOrderFilters.html\",\"
                              >
                              \");\n$templateCache.put(\"app/components/workOrderForm/requesterForm.html\",\"
                              {{::\\'general.required\\' | translate}}

                              {{::\\'general.validation.required\\' | translate }}

                              {{::\\'general.required\\' | translate}} {{::\\'workOrderForm.assetInWarranty\\' | translate}}

                              {{::\\'general.validation.required\\' | translate }}

                              {{::\\'general.required\\' | translate}}

                              {{::\\'general.validation.required\\' | translate }}

                              {{::\\'general.required\\' | translate}}
                              {{workOrderForm.areaRoomNumberHelper.text}}

                              {{::\\'general.validation.required\\' | translate }}

                              \");\n$templateCache.put(\"app/components/workOrderForm/standardForm.html\",\" 0 || (workOrderForm.canAddTasks && !workOrderForm.workOrder.pmSchedule)\\\" spies=workOrderForm.spies tasks=workOrderForm.tasks tasks-to-delete=workOrderForm.tasksToDelete edit-mode=\\\"workOrderForm.canAddTasks && !workOrderForm.workOrder.pmSchedule\\\">\");\n$templateCache.put(\"app/components/workOrderForm/workOrderForm.html\",\"

                              {{::\\'workOrderForm.new\\' | translate}}

                              {{\\'workOrderForm.edit\\' | translate}} {{workOrderForm.workOrder.displayId}} ( {{::\\'workOrderForm.lastUpdated\\' | translate}} {{::workOrderForm.workOrder.updatedDateTime | date:\\'MM/dd/yyyy h:mm a\\'}} )

                              {{::\\'workOrderForm.newRequest\\' | translate}}

                              = 2 && !workOrderForm.isRequester\\\">
                              \");\n$templateCache.put(\"app/components/workOrderFormReadOnly/requesterFormReadOnly.html\",\"
                              {{::\\'workOrderFormReadOnly.title\\' | translate}} {{::(workOrderForm.workOrder.displayId)}}
                              {{::(workOrderForm.workOrder.description)}}
                              {{::(workOrderForm.workOrder.businessAsset.name)}}
                              {{::(workOrderForm.workOrder.workType.name)}}
                              {{::workOrderForm.workOrder.locationDescription}}
                              {{::(workOrderForm.workOrder.trade.name)}}
                              {{::(workOrderForm.workOrder.purpose.value)}}
                              {{::\\'workOrderFormReadOnly.details.title\\' | translate}}
                              {{::(workOrderForm.workOrder.status | status)}}
                              {{::\\'workOrderList.completed\\' | translate}} | {{::(workOrderForm.workOrder.completionDateTime | date: \\'MM/dd/yyyy h:mma\\')}}
                              {{assignee.firstName}} {{assignee.lastName}}{{$last ? \\'\\' : \\', \\'}}
                              {{::(workOrderForm.workOrder.requestedBy.firstName)}} {{::(workOrderForm.workOrder.requestedBy.lastName)}} | {{::(workOrderForm.workOrder.requestDateTime | date: \\'MM/dd/yyyy h:mma\\')}}
                              {{::(workOrderForm.workOrder.project.name)}}
                              {{::(workOrderForm.workOrder.actionTaken)}}
                              = 2\\\">
                              \");\n$templateCache.put(\"app/components/workOrderHistoryFilters/workOrderHistoryFilters.html\",\"

                              {{::\\'workOrderHistoryFilters.title\\' | translate}}

                              {{::\\'workOrderHistoryFilters.fieldsChanged\\' | translate}} 0\\\">{{workOrderHistoryFilters.filters.fields.length}}
                              \");\n$templateCache.put(\"app/components/workOrderHistoryList/workOrderHistoryList.html\",\"

                              {{::\\'historyList.title\\' | translate}}

                              {{::\\'general.noResults\\' | translate}}
                              0\\\">
                              {{::change.changeDateTime | date: \\'MM/dd/yyyy\\'}}
                              {{::change.changeDateTime | date: \\'hh:mm:ss a\\'}}
                              {{::\\'historyList.id\\' | translate}} {{::workOrderHistoryList.workOrders[change.workOrderId].displayId}}
                              {{::change.user.firstName}} {{::change.user.lastName}}
                              {{::\\'general.cscUser\\' | translate}}
                              {{::\\'historyList.id\\' | translate}} {{::workOrderHistoryList.workOrders[change.workOrderId].displayId}}
                              {{::workOrderHistoryList.workOrders[change.workOrderId].businessAsset.name}}
                                \");\n$templateCache.put(\"app/components/workOrderInventory/workOrderInventory.html\",\"
                                {{::\\'workOrderInventory.title\\' | translate}}
                                {{::\\'workOrderInventory.noTransactions\\' | translate}}
                                {{::inventoryTransaction.inventoryItem.name}}
                                {{::inventoryTransaction.inventoryItem.description}}
                                {{::inventoryTransaction.inventoryTransactionDetails[0].transactionQuantity * -1}} {{::inventoryTransaction.inventoryItem.unitOfIssue}}
                                \");\n$templateCache.put(\"app/components/workOrderList/multipleAssignees.html\",\"
                                {{assignee.firstName}} {{assignee.lastName}} ,
                                \");\n$templateCache.put(\"app/components/workOrderList/requesterList.html\",\"

                                {{::\\'workOrderList.myRequests\\' | translate}}

                                {{::\\'workOrderList.woid\\' | translate}}
                                {{::\\'workOrderList.status\\' | translate}}
                                {{::\\'workOrderList.requested\\' | translate}}
                                {{::\\'workOrderList.assignedTo\\' | translate}}
                                {{::\\'general.noResults\\' | translate}}
                                {{::workorder.displayId}}
                                {{::(workorder.status | status)}}
                                {{::\\'workOrderList.completed\\' | translate}}
                                {{::\\'workOrderList.requested\\' | translate}}: {{::(workorder.requestDateTime | date:\\'MM/dd/yyyy h:mma\\')}}
                                {{::\\'workOrderList.assignedTo\\' | translate}}:
                                {{::workorder.locationDescription}} - {{::workorder.businessAsset.name}}
                                {{::\\'workOrderList.actionTaken\\' | translate}}: {{::workorder.actionTaken}}
                                  \");\n$templateCache.put(\"app/components/workOrderList/workOrderBulkAction.html\",\"

                                  {{::\\'general.validation.required\\' | translate }}

                                  \");\n$templateCache.put(\"app/components/workOrderList/workOrderList.html\",\"
                                  {{workOrderList.bulkWorkOrders.length}} {{::\\'workOrderList.selected\\' | translate}}
                                  {{::\\'general.clearAll\\' | translate}}
                                  0\\\">
                                  {{::\\'workOrderList.woid\\' | translate}}
                                  {{::\\'workOrderList.status\\' | translate}}
                                  {{::\\'workOrderList.purpose\\' | translate}}
                                  {{::\\'workOrderList.workType\\' | translate}}
                                  {{::\\'workOrderList.requested\\' | translate}}
                                  {{::\\'workOrderList.assignedTo\\' | translate}}
                                  {{::\\'workOrderList.noResultsFound\\' | translate}}
                                  {{::workorder.displayId}}
                                  {{workorder.status | status}}
                                  {{::workorder.purpose.value}}
                                  {{::workorder.workType.name}}
                                  {{::(workorder.requestDateTime | date:\\'MM/dd/yyyy h:mma\\')}}
                                  {{::workorder.locationDescription}} - {{::workorder.businessAsset.name}}
                                  {{::\\'workOrderList.recurring\\' | translate}}
                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate}} {{::\\'general.validation.timeEmpty\\' | translate}} {{::\\'workOrderForm.validation.completionDateBeforeMin\\' | translate}}

                                    {{::workOrderList.editing.transaction.typeAttributes.user.firstName}} {{::workOrderList.editing.transaction.typeAttributes.user.lastName}}

                                    {{::\\'transactions.validation.laborHours.max\\' | translate }} {{::\\'transactions.validation.laborHours.min\\' | translate }}

                                    \");\n$templateCache.put(\"app/components/workOrderQuickActions/assigneeQuickAction.html\",\"
                                    \");\n$templateCache.put(\"app/components/workOrderQuickActions/scheduleQuickAction.html\",\"
                                    \");\n$templateCache.put(\"app/components/workOrderQuickActions/statusQuickAction.html\",\"
                                    \");\n$templateCache.put(\"app/components/workOrderTasks/workOrderTasks.html\",\"
                                    {{::\\'workOrderTasks.title\\' | translate}}
                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/deleteConfirmModal.html\",\"
                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/laborTransactions.html\",\"
                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }} {{::\\'transactions.validation.laborHours.number\\' | translate }} {{::\\'transactions.validation.laborHours.max\\' | translate }} {{::\\'transactions.validation.laborHours.min\\' | translate }}

                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }}

                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }}

                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/laborTransactionsReadOnly.html\",\"

                                    {{transactionsPanel.transaction.typeAttributes.hours}}

                                    {{::\\'transactions.transactionsPanel.labor.\\' + transactionsPanel.transaction.typeAttributes.laborType | translate }}

                                    {{::transactionsPanel.transaction.typeAttributes.user.firstName}} {{::transactionsPanel.transaction.typeAttributes.user.lastName}}

                                    {{(transactionsPanel.transaction.transactionDate | date:\\'MM/dd/yyyy\\')}}

                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/purchaseTransactions.html\",\"
                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }}

                                    {{transactionsPanel.transaction.typeAttributes.totalCost | currency}}

                                    {{::\\'transactions.validation.purchaseQuantity.max\\' | translate }} {{::\\'transactions.validation.purchaseQuantity.min\\' | translate }}

                                    {{::\\'transactions.validation.purchaseItemCost.max\\' | translate }} {{::\\'transactions.validation.purchaseItemCost.min\\' | translate }}

                                    {{transactionsPanel.transaction.typeAttributes.totalCost | currency}}
                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }}

                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }}

                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/purchaseTransactionsReadOnly.html\",\"

                                    {{transactionsPanel.transaction.description}}

                                    {{transactionsPanel.transaction.typeAttributes.quantity | number}}

                                    {{transactionsPanel.transaction.typeAttributes.unitCost | currency}}

                                    {{transactionsPanel.transaction.typeAttributes.totalCost | currency}}

                                    {{transactionsPanel.transaction.typeAttributes.purchaseOrder}} 

                                    {{transactionsPanel.transaction.typeAttributes.supplierName}} 

                                    {{::transactionsPanel.transaction.typeAttributes.user.firstName}} {{::transactionsPanel.transaction.typeAttributes.user.lastName}}

                                    {{(transactionsPanel.transaction.transactionDate | date:\\'MM/dd/yyyy\\')}}

                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/serviceTransactions.html\",\"
                                    {{::\\'transactions.serviceTransactionsPanel.type\\'| translate}}
                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }}

                                    {{::\\'general.required\\' | translate}}

                                    {{::\\'general.validation.required\\' | translate }}

                                    {{::\\'transactions.validation.serviceTotalCost.max\\' | translate }} {{::\\'transactions.validation.serviceTotalCost.min\\' | translate }}

                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/serviceTransactionsReadOnly.html\",\"

                                    {{transactionsPanel.transaction.typeAttributes.serviceType | serviceTypeFilter}}

                                    {{transactionsPanel.transaction.typeAttributes.supplierName}} 

                                    {{(transactionsPanel.transaction.transactionDate | date:\\'MM/dd/yyyy\\')}}

                                    {{transactionsPanel.transaction.typeAttributes.cost | currency}}

                                    {{transactionsPanel.transaction.typeAttributes.purchaseOrder}} 

                                    {{transactionsPanel.transaction.description}}

                                    \");\n$templateCache.put(\"app/components/workOrderTransactions/workOrderTransactions.html\",\"
                                    0\\\">
                                    {{::\\'transactions.purchase\\' | translate}}  {{(transactions.transactions| transactionTypeSum:\\'purchase\\') | currency}}
                                    {{::\\'transactions.service\\' | translate}}  {{(transactions.transactions| transactionTypeSum:\\'service\\') | currency}}
                                    {{::\\'transactions.labor\\' | translate}} ({{(transactions.transactions | transactionHours) | number}} ) {{(transactions.transactions | transactionTypeSum:\\'labor\\') | currency}}
                                    {{::\\'transactions.totalCosts\\' | translate}}
                                    {{(transactions.transactions | sum:\\'typeAttributes.cost\\') | currency}}
                                    0\\\">
                                    {{::\\'transactions.noTransactions.labor\\' | translate}}
                                    {{::\\'transactions.date\\' | translate}}
                                    {{::\\'transactions.details\\' | translate}}
                                    {{::\\'transactions.type\\' | translate}}
                                    {{::\\'transactions.cost\\' | translate}}
                                    {{::\\'transactions.noTransactions\\' | translate}}
                                    {{::transaction.transactionDate | date:\\'MM/dd/yyyy\\'}}
                                    {{::transaction.typeAttributes.hours}} ({{\\'transactions.abbreviations.\\' + transaction.typeAttributes.laborType | translate}}) {{::\\'general.at\\' | translate}} {{transaction.typeAttributes.rate * transaction.typeAttributes.multiplier | currency}}/{{::\\'general.abbreviations.hour\\' | translate}}
                                    {{::transaction.description}}
                                    {{::transaction.typeAttributes.supplierName}} | {{::transaction.typeAttributes.user.firstName}} {{::transaction.typeAttributes.user.lastName}} {{(transaction.typeAttributes.serviceType | serviceTypeFilter)}}
                                    {{::transaction.typeAttributes.cost | currency}} - - -
                                    {{::transaction.typeAttributes.type}}
                                    \");\n$templateCache.put(\"app/components/workTypeList/workTypeList.html\",\"

                                    {{::\\'workTypeList.title\\' | translate}}

                                    {{::\\'general.sort\\' | translate}}
                                    • {{::\\'workTypeList.name\\' | translate}}
                                    • {{::\\'workTypeList.category\\' | translate}}
                                    {{::\\'workTypeList.name\\' | translate}}
                                    {{::\\'workTypeList.category\\' | translate}}
                                    {{::\\'workTypeList.name\\' | translate}}
                                    {{::\\'workTypeList.category\\' | translate}}
                                    {{::\\'general.noResults\\' | translate}}
                                    {{::workType.name}}
                                    {{::workType.parent.name}}
                                    {{::\\'workTypeList.inactive\\' | translate}}
                                      \");\n$templateCache.put(\"app/components/workTypeReport/workTypeReportChart.html\",\"

                                      {{::\\'reports.title\\' | translate}}

                                      \");\n$templateCache.put(\"app/components/workTypeReport/workTypeReportList.html\",\"

                                      {{::\\'reports.title\\' | translate}}

                                      {{::\\'general.sort\\' | translate}}
                                      • {{::\\'workTypeReports.title\\' | translate}}
                                      • {{::\\'reports.count\\' | translate}}
                                      • {{::\\'general.hours\\' | translate}}
                                      • {{::\\'reports.byCost.labor\\' | translate}}
                                      • {{::\\'reports.byCost.purchase\\' | translate}}
                                      • {{::\\'reports.byCost.service\\' | translate}}
                                      • {{::\\'general.total\\' | translate}}
                                      {{::\\'workTypeReports.title\\' | translate}}
                                      {{::\\'reports.count\\' | translate}}
                                      {{::\\'general.total\\' | translate}}
                                      {{::\\'reports.avg\\' | translate}}
                                      {{::\\'general.hours\\' | translate}}
                                      {{::\\'general.total\\' | translate}}
                                      {{::\\'reports.avg\\' | translate}}
                                      {{::\\'reports.byCost.labor\\' | translate}}
                                      {{::\\'general.total\\' | translate}}
                                      {{::\\'reports.avg\\' | translate}}
                                      {{::\\'reports.byCost.purchase\\' | translate}}
                                      {{::\\'general.total\\' | translate}}
                                      {{::\\'reports.avg\\' | translate}}
                                      {{::\\'reports.byCost.service\\' | translate}}
                                      {{::\\'general.total\\' | translate}}
                                      {{::\\'reports.byCost.cost\\' | translate}}
                                      {{::\\'reports.avg\\' | translate}}
                                      {{::\\'general.total\\' | translate}} {{::\\'reports.byCost.cost\\' | translate}}
                                      {{::\\'general.noResults\\' | translate}}
                                      {{::value.workType.name}}
                                      {{::value.count.workOrders | number}}
                                      {{::value.count.laborHours| number:2}}
                                      {{::value.cost.labor | currency}}
                                      {{::value.cost.purchase | currency}}
                                      {{::value.cost.service | currency}}
                                      {{::value.cost.total | currency}}
                                      {{::\\'reports.byWorkOrders.workOrders\\' | translate}} {{::value.count.workOrders | number}}
                                      {{::\\'reports.byLaborHours.hours\\' | translate}} {{::value.count.laborHours | number:2}}
                                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'general.total\\' | translate}} {{::\\'reports.byCost.cost\\' | translate}} {{::value.cost.total | currency}}
                                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'reports.byCost.labor\\' | translate}} {{::value.cost.labor | currency}}
                                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'reports.byCost.purchase\\' | translate}} {{::value.cost.purchase | currency}}
                                      {{::\\'general.total\\' | translate}} {{::\\'reports.avg\\' | translate}} {{::\\'reports.byCost.service\\' | translate}} {{::value.cost.service | currency}}
                                      workTypeReport.filters.pageSize\\\">
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-attribute-boolean/asset-attribute-boolean.html\",\"
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-attribute-databound-manufacturer/asset-attribute-databound-manufacturer.html\",\"
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-attribute-date/asset-attribute-date.html\",\"
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-attribute-double/asset-attribute-double.html\",\"
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-attribute-integer/asset-attribute-integer.html\",\"
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-attribute-money/asset-attribute-money.html\",\"

                                        {{::attributeType._translatedKey}} {{::\\'assetForm.validation.money.number\\' | translate }} {{::attributeType._translatedKey}} {{::\\'assetForm.validation.money.max\\' | translate }} {{::attributeType._translatedKey}} {{::\\'assetForm.validation.money.min\\' | translate }}

                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-attribute-string/asset-attribute-string.html\",\"
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-usage/asset-usage.html\",\"
                                        {{assetUsage.uom}}
                                        {{::\\'assetUsage.lastReading\\' | translate}}: {{::assetUsage.transactions[0].reading | number}} {{::assetUsage.uom | lowercase}}
                                        {{::\\'assetUsage.lastReading\\' | translate}}
                                        {{::\\'assetUsage.list.recordedDate\\' | translate}}
                                        {{::\\'assetUsage.list.readingType\\' | translate}}
                                        {{::transaction.reading}}
                                        {{::transaction.createdDateTime | date:\\'short\\'}}
                                        {{::assetUsage.uom}}
                                        \");\n$templateCache.put(\"app/components/assetAttributeEngine/asset-usage/assetStopTrackingWarningModal.html\",\"\");\n$templateCache.put(\"app/components/assetReport/assetReportDrillDown/reportDrillDownChart.html\",\"
                                        {{reportDrillDownChart.activeAsset.name}}
                                        \");\n$templateCache.put(\"app/components/assetReport/assetReportDrilldownList/assetReportDrilldownList.html\",\"
                                        {{::value.asset.value}}
                                        {{::value.count.workOrders | number}}
                                        {{::value.count.laborHours| number:2}}
                                        {{::value.cost.labor | currency}}
                                        {{::value.cost.purchase | currency}}
                                        {{::value.cost.service | currency}}
                                        {{::value.cost.total | currency}}
                                        {{::\\'reports.byWorkOrders.workOrders\\' | translate}} {{::value.count.workOrders | number}}
                                        {{::\\'reports.byLaborHours.hours\\' | translate}} {{::value.count.laborHours | number:2}}
                                        {{::\\'general.total\\' | translate}} {{::value.cost.total | currency}}
                                        {{::\\'reports.byCost.labor\\' | translate}} {{::value.cost.labor | currency}}
                                        {{::\\'reports.byCost.purchase\\' | translate}} {{::value.cost.purchase | currency}}
                                        {{::\\'reports.byCost.service\\' | translate}} {{::value.cost.service | currency}}
                                        {{drilldownList.subListTitle}}
                                        {{::\\'reports.count\\' | translate}}
                                        {{::\\'general.hours\\' | translate}}
                                        {{::\\'reports.byCost.labor\\' | translate}}
                                        {{::\\'reports.byCost.purchase\\' | translate}}
                                        {{::\\'reports.byCost.service\\' | translate}}
                                        {{::\\'reports.byCost.cost\\' | translate}}
                                        {{::summary.workType.name}}
                                        {{::summary.count.workOrders | number}}
                                        {{::summary.count.laborHours| number:2}}
                                        {{::summary.cost.labor | currency}}
                                        {{::summary.cost.purchase | currency}}
                                        {{::summary.cost.service | currency}}
                                        {{::summary.cost.total | currency}}
                                        {{::\\'reports.byWorkOrders.workOrders\\' | translate}} {{::summary.count.workOrders | number}}
                                        {{::\\'reports.byLaborHours.hours\\' | translate}} {{::summary.count.laborHours | number:2}}
                                        {{::\\'general.total\\' | translate}} {{::summary.cost.total | currency}}
                                        {{::\\'reports.byCost.labor\\' | translate}} {{::summary.cost.labor | currency}}
                                        {{::\\'reports.byCost.purchase\\' | translate}} {{::summary.cost.purchase | currency}}
                                        {{::\\'reports.byCost.service\\' | translate}} {{::summary.cost.service | currency}}
                                        \");\n$templateCache.put(\"app/components/dashboard/k12Admin/k12AdminDashboard.html\",\"
                                        {{::\\'dashboard.byLocationAndWorkType\\' | translate}} ({{::\\'dashboard.topFive\\' | translate}})
                                        {{::\\'general.noResults\\' | translate}}
                                        0\\\">
                                        {{::assetReport.asset.value}} {{::k12AdminDashboard.assetTotals[assetReport.asset.id]}}
                                        {{::\\'dashboard.byStatus\\' | translate}}
                                        {{::\\'general.noResults\\' | translate}}
                                        1\\\">
                                        {{::\\'dashboard.noWorkOrders\\' | translate}} 0\\\" ng-click=k12AdminDashboard.goToTotal()>{{::\\'general.total\\' | translate}}: {{::k12AdminDashboard.totalWorkOrders}}

                                        {{ k12AdminDashboard.statusCounts[k12AdminDashboard.newRequests] }}

                                        {{ k12AdminDashboard.statusCounts[k12AdminDashboard.inProgress] }}

                                        {{ k12AdminDashboard.statusCounts[k12AdminDashboard.onHold] }}

                                        \");\n$templateCache.put(\"app/components/dashboard/k12Tech/k12TechDashboard.html\",\"
                                        {{::\\'dashboard.myByLocationAndWorkType\\' | translate}} ({{::\\'dashboard.topFive\\' | translate}})
                                        {{::\\'general.noResults\\' | translate}}
                                        0\\\">
                                        {{::assetReport.asset.value}} {{::k12TechDashboard.assetTotals[assetReport.asset.id]}}
                                        {{::\\'dashboard.myByPurpose\\' | translate}} 5\\\">({{::\\'dashboard.topFive\\' | translate}})
                                        {{::\\'general.noResults\\' | translate}}
                                        1\\\">
                                        \");\n$templateCache.put(\"app/components/dashboard/mfgAdmin/mfgAdminDashboard.html\",\"
                                        {{::\\'dashboard.openByAssignee\\' | translate}} 6\\\">({{::\\'dashboard.topSeven\\' | translate}})
                                        {{::\\'general.noResults\\' | translate}}
                                        {{::assignee.assignee.firstName}} {{:: assignee.assignee.lastName}}
                                        {{assignee.count.workOrders | number}}
                                        {{::\\'dashboard.byPurpose\\' | translate}} 5\\\">({{::\\'dashboard.topFive\\' | translate}})
                                        {{::\\'general.noResults\\' | translate}}
                                        1\\\">
                                        {{\\'dashboard.requestedLastThirtyDays\\' | translate}}
                                        \");\n$templateCache.put(\"app/components/filter-bar/filter-actions-button/filter-actions-button.html\",\"\");\n$templateCache.put(\"app/components/filter-bar/my-filters-button/my-filters-button.html\",\"

                                        {{:: \\'myFiltersButton.noSavedFilters\\' | translate}}

                                        \");\n$templateCache.put(\"app/components/filter-bar/saved-filters/saved-filter-delete-confirmation-modal.html\",\"\");\n$templateCache.put(\"app/components/filter-bar/saved-filters/saved-filters-review.html\",\"

                                        {{::\\'savedFilters.review.instructions\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate }}

                                        \");\n$templateCache.put(\"app/components/filter-bar/sliding-filter-panel/sliding-filter-panel.html\",\"

                                        {{::\\'slidingFilterPanel.title\\' | translate}}

                                        {{::slidingFilterPanel.filterState.activeSavedFilter.name}}

                                        \");\n$templateCache.put(\"app/components/settingsForm/accountAlertSettings/accountAlertSettings.html\",\"
                                        {{:: \\'accountAlertSettings.sectionTitle\\' | translate}}
                                        {{::\\'accountAlertSettings.helperText\\' | translate }}
                                        {{::\\'general.validation.required\\' | translate}}

                                        {{accountAlertSettings.accountAlert.message}}

                                        {{::\\'general.validation.required\\' | translate}}

                                        {{ accountAlertSettings.mapJoinRoles() }}

                                        \");\n$templateCache.put(\"app/components/settingsForm/accountAlertSettings/deleteConfirmModal.html\",\"
                                        \");\n$templateCache.put(\"app/components/settingsForm/registrationLink/deleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/settingsForm/registrationLink/generateNewConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/settingsForm/registrationLink/registrationLink.html\",\"
                                        {{::\\'registrationLink.requesterRegistration.helperText\\' | translate }}
                                        A
                                        {{::\\'registrationLink.requesterRegistration.share.label\\' | translate }}
                                        {{::\\'registrationLink.requesterRegistration.share.subLabel\\' | translate }}
                                        B
                                        {{::\\'registrationLink.requesterRegistration.send.label\\' | translate }}
                                        {{::\\'registrationLink.requesterRegistration.send.subLabel\\' | translate }}

                                        0\\\">{{::\\'registrationLink.requesterRegistration.error.emails\\' | translate }}{{ registrationLink.badEmails.join(\\', \\') }}

                                        \");\n$templateCache.put(\"app/components/webLinkSection/webLinkSlidingPanel/webLinkSlidingPanel.html\",\"
                                        {{::\\'webLinkSlidingPanel.formDescription\\' | translate}}{{::webLinkSlidingPanel.translatedEntity}}

                                        {{::\\'general.validation.required\\' | translate }} {{::\\'webLinkSlidingPanel.validation.url\\' | translate }}


                                        {{::\\'webLinkSlidingPanel.updateData\\' | translate}}
                                        {{webLinkSlidingPanel.link.title}} \\\"{{::\\'webLinkSlidingPanel.altDefaultPrefix\\'
                                        {{::\\'webLinkSlidingPanel.noThumbnail\\' | translate}}
                                        {{::\\'webLinkSlidingPanel.refreshForThumbnail\\' | translate}}
                                        \");\n$templateCache.put(\"app/components/workOrderForm/completion/workOrderCompletion.html\",\"
                                        {{::\\'workOrderForm.completion\\' | translate}}
                                        {{::\\'workOrderForm.downtime.hours\\' | translate}}
                                        {{::\\'workOrderForm.downtime.minutes\\' | translate}}

                                        {{::\\'workOrderForm.validation.downtime.hours.max\\' | translate}} {{::\\'workOrderForm.validation.downtime.hours.min\\' | translate}}

                                        {{::\\'workOrderForm.validation.downtime.minutes.max\\' | translate}} {{::\\'workOrderForm.validation.downtime.minutes.min\\' | translate }}

                                        {{::\\'workOrderForm.downtime.cost\\' | translate}}

                                        {{::\\'workOrderForm.validation.downtime.cost.max\\' | translate}} {{::\\'workOrderForm.validation.downtime.cost.min\\' | translate}}

                                        {{::\\'workOrderForm.validation.downtime.hours.max\\' | translate }} {{::\\'workOrderForm.validation.downtime.hours.min\\' | translate }}

                                        {{::\\'workOrderForm.validation.downtime.minutes.max\\' | translate }} {{::\\'workOrderForm.validation.downtime.minutes.min\\' | translate }}

                                        {{::\\'workOrderForm.validation.downtime.cost.max\\' | translate }} {{::\\'workOrderForm.validation.downtime.cost.min\\' | translate }}

                                        {{::\\'general.required\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate}} {{::\\'general.validation.timeEmpty\\' | translate}} {{::\\'workOrderForm.validation.completionDateBeforeMin\\' | translate}}

                                        \");\n$templateCache.put(\"app/components/workOrderForm/details/statusChangeConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/workOrderForm/details/workOrderDetails.html\",\"
                                        {{::\\'general.required\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate }}

                                        {{::workOrderDetails.workOrder.businessAsset.name}}
                                        {{::\\'general.required\\' | translate}}
                                        {{::\\'workOrderForm.assetViewDetails\\' | translate}} | {{::\\'workOrderForm.assetRecordUsage\\' | translate}} | {{::\\'workOrderForm.assetInWarranty\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate }}


                                        {{::\\'general.required\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate }}

                                        {{::\\'general.required\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate }} {{::\\'general.validation.timeEmpty\\' | translate }} {{::\\'workOrderForm.validation.requestDateAfterMax\\' | translate}}

                                        {{::workOrderDetails.createdBy}} {{::\\'workOrderForm.systemGenerated\\' | translate}}

                                        {{::workOrderDetails.createdTime}}

                                        \");\n$templateCache.put(\"app/components/workOrderForm/planning/workOrderPlanning.html\",\"
                                        {{::\\'workOrderForm.planning\\' | translate}}

                                        {{::workOrderPlanning.workOrder.estimatedHours | number:2}}

                                        {{::\\'workOrderForm.validation.estimatedHours.max\\' | translate}} {{::\\'workOrderForm.validation.estimatedHours.min\\' | translate}}

                                        {{::workOrderPlanning.workOrder.estimatedCost | number:2}}

                                        {{::\\'workOrderForm.validation.estimatedCost.max\\' | translate}} {{::\\'workOrderForm.validation.estimatedCost.min\\' | translate}}

                                        {{workOrderPlanning.workOrder.scheduledStartDate | date: \\'MM/dd/yyyy\\'}}

                                        {{::workOrderPlanning.workOrder.dueDateTime | date: \\'MM/dd/yyyy\\'}}

                                        \");\n$templateCache.put(\"app/components/workOrderHistoryList/workOrderHistorySummary/workOrderHistorySummary.html\",\"

                                        {{::\\'workOrderHistorySummary.workOrderID\\' | translate}} {{workOrderHistorySummary.workOrder.displayId}}

                                        {{::\\'workOrderHistorySummary.user\\' | translate}}
                                        {{::\\'general.cscUser\\' | translate}}
                                        {{::workOrderHistorySummary.activeChange.user.firstName}} {{::workOrderHistorySummary.activeChange.user.lastName}}
                                        {{::\\'workOrderHistorySummary.locationEquipment\\' | translate}}
                                        {{workOrderHistorySummary.workOrder.businessAsset.name}}
                                        {{::\\'workOrderHistorySummary.description\\' | translate}}
                                        {{workOrderHistorySummary.workOrder.description}}
                                        \");\n$templateCache.put(\"app/components/workTypeList/workTypeFormPanel/workTypeDeleteConfirmModal.html\",\"\");\n$templateCache.put(\"app/components/workTypeList/workTypeFormPanel/workTypeDeleteWarningModal.html\",\"\");\n$templateCache.put(\"app/components/workTypeList/workTypeFormPanel/workTypeFormPanel.html\",\"
                                        {{::\\'general.validation.required\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate }}

                                        {{::\\'general.validation.required\\' | translate}}

                                        {{::\\'general.validation.required\\' | translate }}

                                        {{workTypeForm.associationsValidation}}

                                        \");}]);"],"sourceRoot":"/source/"}