{"version":3,"sources":["../../src/legacy-common/module.js","../../src/legacy-common/app.js","../../src/legacy-common/configuration/app.config.http.js","../../src/legacy-common/configuration/app.config.rootScope.js","../../src/legacy-common/configuration/app.config.translate.js","../../src/legacy-common/configuration/app.config.views.js","../../src/legacy-common/configuration/init.js","../../src/legacy-common/configuration/momentSetup.js","../../src/legacy-common/configuration/RestangularAbortable.js","../../src/legacy-common/decorators/AprimaExceptionHandler.js","../../src/legacy-common/filters/apPatientThumbnailSrc.js","../../src/legacy-common/filters/apPersonThumbnailSrc.js","../../src/legacy-common/models/dosing/DoseRange.js","../../src/legacy-common/models/dosing/DoseRangeInfo.js","../../src/legacy-common/models/imo/ImoPatient.js","../../src/legacy-common/services/AprimaAnalytics.js","../../src/legacy-common/services/AprimaRestangular.js","../../src/legacy-common/services/AuthorizationService.js","../../src/legacy-common/services/CurrentUser.js","../../src/legacy-common/services/DashboardStructure.js","../../src/legacy-common/services/DateUtilities.js","../../src/legacy-common/services/debugLogService.js","../../src/legacy-common/services/DoseRangeUtil.js","../../src/legacy-common/services/ErrorService.js","../../src/legacy-common/services/LanguageFactory.js","../../src/legacy-common/services/ListNavigationService.js","../../src/legacy-common/services/LocalStorageRepository.js","../../src/legacy-common/services/LoginService.js","../../src/legacy-common/services/LogoffService.js","../../src/legacy-common/services/navigation/AppointmentTransitionToHelper.js","../../src/legacy-common/services/navigation/AppRoutes.js","../../src/legacy-common/services/navigation/BrowserWebViewManager.js","../../src/legacy-common/services/navigation/MessageTransitionToHelper.js","../../src/legacy-common/services/navigation/RouteFormatter.js","../../src/legacy-common/services/navigation/TransitionManager.js","../../src/legacy-common/services/navigation/WebViewManager.js","../../src/legacy-common/services/navigation/XamarinWebViewManager.js","../../src/legacy-common/services/NoteTypeRepository.js","../../src/legacy-common/services/promises/%24qHelpers.js","../../src/legacy-common/services/promises/HttpAbortableContext.js","../../src/legacy-common/services/security/Permissions.js","../../src/legacy-common/services/security/SecurityRepository.js","../../src/legacy-common/services/TileGroup.js","../../src/legacy-common/services/WidgetViews.js"],"names":["angular","module","value","window","moment","messageTypes","LabResultMessageGuid","TaskMessageGuid","PortalAppointmentQuestionMessageGuid","PortalBillingQuestionMessageGuid","PortalDemographicsQuestionMessageGuid","PortalGeneralQuestionMessageGuid","PortalRxQuestionMessageGuid","PhoneMessageGuid","LabMessageGuid","AttachmentApprovalGuid","ServiceOrderApprovalMessageGuid","RxRefillRequestMessageGuid","PatientRxRefillRequestMessageGuid","PharmacyRefillRequestMessageGuid","RxRefillAndErxRequestMessageGuid","SupportedMessageTypesForCreate","Types","id","requiredFeature","SubTypes","appointmentScheduleTypes","PatientVisit","name","Event","BlockingEvent","GroupVisit","List","_","values","constant","listData","default","run","CustomModuleRunService","add","$rootScope","ErrorService","RequestTypes","$transitions","requestTypes","addHttpError","httpResponse","messages","type","isAborted","addHttpErrorToScope","this","removeHttpError","removeHttpErrorFromScope","setupDirectiveScope","$scope","onSuccess","TransitionManager","AprimaAnalytics","DeviceSettings","toaster","goBack","sendEvent","isEmpty","obj","isPhone","isPhoneOrOverride","isTablet","isTabletOrOverride","isBrowser","isBrowserOrOverride","tryToastModelStateError","response","modelState","ModelState","data","commandResult","forEach","e","pop","LocalStorageRepository","LanguageFactory","currentLanguage","getLang","navigator","userLanguage","language","setLang","factory","gettextCatalog","text","getString","Bridge","AppRoutes","$uibModalStack","transition","dismissAll","toState","targetState","toStateName","appRoute","find","state","nativeSettings","ctrlSetsUpPage","setupPage","$location","$log","$state","$watch","path","a","output","current","description","info","sendPageView","momentSetup","fn","removeOffset","utcOffset","utc","formatRemoveOffset","format","startOfDate","startOf","toDate","Restangular","HttpAbortableContext","$qHelpers","abortableFields","wrapCallsToRestangularizedElement","restangularizedElement","promiseInterceptor","functions","key","elementFn","wrappedKey","result","apply","arguments","isPromise","setRestangularFields","setOnElemRestangularized","element","isCollection","route","restangularObject","configuration","isRestangularized","promisesToAbort","promise","abortPromises","abortableContext","httpConfig","restangularFields","defaults","timeout","abortPromise","wrap","config","$provide","decorator","$delegate","$injector","exception","cause","message","get","sendException","ex","filter","patientId","height","width","url","ServerInfoRepository","personId","isFeatureSupported","ObjUtil","DoseRange","mapFromDto","defineReadonlyProps","Id","WeightRequired","BodySurfaceAreaRequired","LowDose","LowDoseUnits","HighDose","HighDoseUnits","MaximumDosePerDay","MaximumDosePerDayUnits","MaximumSingleDose","MaximumSingleDoseUnits","MaximumLifetimeDose","MaximumLifetimeDoseUnits","NteAmountPerSingleDose","NteAmountPerSingleDoseUnits","LowFrequency","HighFrequency","LowDuration","HighDuration","AdjustedLowDose","AdjustedHighDose","AdjustedMaximumSingleDose","AdjustedMaximumDosePerDay","AdjustedMaximumLifetimeDose","AdjustedNteAmountPerSingleDose","RangeLowDose","RangeLowDoseUnits","RangeHighDose","RangeHighDoseUnits","RangeLowDoseForm","RangeLowDoseFormUnits","RangeHighDoseForm","RangeHighDoseFormUnits","NtePediDailyDoseStrength","NtePediDailyDoseStrengthUnits","NtePediDailyDoseForm","NtePediDailyDoseFormUnits","IngredientStrength","IngredientStrengthUomAbbr","IngredientStrengthUomDesc","IngredientVolume","IngredientVolumeUomAbbr","IngredientVolumeUomDesc","WeightKg","BodySurfaceArea","ErrorMsg","HasError","DoseRangeInfo","call","MaxMinInformation","DateUtilities","femaleRegex","maleRegex","ImoPatient","mapFromApi","patient","FirstName","LastName","birthDate","BirthDate","DateOfBirth","deathDate","DeathDate","ageInfo","getPersonAge","gender","Gender","GenderName","GenderAnsi","age","ageInYears","standardizedAge","parseFloat","isNaN","round","standardizedGender","test","hasAge","hasGender","$timeout","sendTiming","category","label","timingValue","page","trackTiming","stopTiming","timing","endTime","Date","getTime","diff","startTime","action","trackEvent","location","trackPageChange","trackException","startTiming","stop","partial","BrowserService","debugLogService","alwaysIgnoreCache","debugModeValue","getSupportedFeatures","endpointBase","options","isString","ignoreCache","isLegacyIE","debugMode","withConfig","RestangularConfigurer","clientUrl","getClientURL","Error","urlComponents","replace","SERVER_API_VERSION","baseUrl","c","isNull","join","setBaseUrl","headers","Auth-Token","getJsonWebToken","ApiKey","API_KEY","fireEvent","Pragma","Expires","setDefaultHeaders","debugModeFeature","features","isArray","supportedFeatures","intersection","length","addFullRequestInterceptor","operation","what","_5","parameters","toLowerCase","getDebugMode","params","assignIn","t","toJSON","debug","levels","addResponseInterceptor","log","JSON","stringify","setErrorInterceptor","status","deviceId","getDeviceId","jwt","msg","alternativeLoginRoute","statementslogin","login","errorCode","parseInt","getUrl","parent","disableCaching","CurrentUser","isUserProvider","user","permissions","IsProvider","icd10User","ICD10User","LogOffService","LogInService","previousTransition","$on","evt","on","setRedirect","logoff","then","opts","replaceCurrentState","isAuthenticated","getUserName","fullName","getUserFullName","userId","getUserID","token","clientId","getClientID","clientURL","getUserPermissions","VersionService","widgetViews","mapV1ConfigurationsToV2","configs","map","Type","ExternalId","Name","DisplayOrder","PhoneTiles","mapTiles","TabletTiles","DesktopTiles","numColumns","WidgetDescriptors","tile","partialRight","mapTile","index","collection","TileDescriptorId","Heading","ColumnSpan","Math","min","Column","IsCollapsed","Filter","routeSuffix","undefined","checkVersionValid","getPrmAssemblyVersion","MIN_PRM_DASHBOARD_VERSION","repositoryRoute","mapFn","identity","words","years","en_us","es_mx","months","days","weeks","deceased","lang","_getPersonAge","displayAge","person","ageString","langCode","code","birthdate","units","display","getDurationString","refDate","parse","duration","humanize","getPersonAgeAbbr","unit","isValid","charAt","end","_units","_age","_deceased","birthDateMoment","locale","tempDeathDate","deathdate","disableDebugMode","enableDebugMode","AdjustedForWeight","NumUtil","StringBuilder","SystemGuid","createWeightBasedMaxMinInformation","weightBasedDoseRange","sb","init","addDoseRange","LowDoseAmount","LowDoseAmountUnits","HighDoseAmount","HighDoseAmountUnits","Length","AppendLine","LowDoseForm","LowDoseFormUnits","HighDoseForm","HighDoseFormUnits","addNTEInfo","NTEAmount","NTEAmountUnits","NTEForm","NTEFormUnits","nte","nteUnits","Append","numFormat","addSingleDoseNTEInfo","NTESingleDoseAmount","NTESingleDoseAmountUnits","ToString","formatAgeInDays","getWeightBasedSummary","mapVariableDosingFromDto","variableDosingDto","variableDosing","isDisabled","minAge","MinAgeInDays","maxAge","MaxAgeInDays","defaultDosingQuantity","DefaultDosingQuantity","defaultMaximumDoseQuantity","DefaultMaximumDoseQuantity","variableDosingTypeId","VariableDosingTypeId","overrides","Overrides","override","overrideDosingQuantity","OverrideDosingQuantity","overrideMaximumDoseQuantity","OverrideMaximumDoseQuantity","calculationErrors","CalculationErrors","processedDosingType","processDosingType","unitDescription","dosingUnits","maxUnitDescription","maxDoseUnits","summary","mapVariableDosingToDto","processDoseRanges","variableDoseRanges","weightBasedDoseRanges","WeightBasedDoseRanges","doseRange","matches","match","maxMinInformationRows","GetMaxMinWarningMsg","drc","amount","frequencyPerDay","durationOfTherapyInDays","indexOf","dailyDose","dosingValue","dosePerDay","multiply","strength","isMilliliterUnitVolume","divide","dailyDosing","fdbDosingInformation","CreateMaxMinInformation","includeErrorMsg","doseLow","doseHigh","doseFormLow","doseFormHigh","doseUnit","doseResult","max","bsa","getHighLowDose","formDoseResult","getHighLowFormDose","doseUnitOnly","CalculateDosingInformation","mg","ml","totalML","dose","timesPerDay","convertDose","dosingUnitMilliliter","calculateMLFromMGDosing","adjustedMG","floor","num1","num2","remainder","formatted","trunc","subtract","dosingUnitMilligram","calculateMGDosing","allowsBsaAdjustment","patientAgeInDays","canCalculateByMg","strengthUomAbbr","isMg","ageInDays","weightBasedDosing","maxDose","DosingCalculatorUnitGPerKgPerDay","DosingCalculatorUnitMcgPerKgPerDay","DosingCalculatorUnitMgPerKgPerDay","DosingCalculatorUnitMlPerKgPerDay","low","lowUnits","high","highUnits","doseFormRange","len","substr","num","gettext","convertToErrorMessages","displayErrorMessages","error","asHtml","errors","err","title","body","bodyOutputType","scope","reason","responseMessage","unhandled","httpError","hasOwnProperty","push","getGenericError","flatMap","validationResult","ValidationResult","IsValid","Errors","ErrorMessage","statusText","genericError","Message","TranslateService","currentLang","langOptions","normalizeToUnderscore","updateCurrentLangCode","use","getLangOptions","getActiveLanguage","$filter","cachedEnumerators","activeItems","buildAndCacheEnumerator","enumeratorName","list","orderPredicate","transitionFunction","enumerator","buildEnumerator","setActiveItemById","getEnumerator","callbackFunction","currentIndex","item","next","lookupIndex","canGoNext","currentItem","previous","first","last","moveToNextItem","moveToPreviousItem","moveToFirstItem","moveToLastItem","moveToItem","Exception","canGoPrevious","getNavStatus","canGoForward","canGoBack","i","toArray","oldIndex","arr","hydrateListNavigationProperties","settings","phone","modes","headerValue","requiresNavSettings","listNavigationProperties","tablet","setAsBridgeHandler","navigationType","registerActiveItemForList","listType","itemId","deregisterActiveItemForList","setActiveItemByIdForEnumerator","storage","WebCommonStorageRepository","trueRegex","falseRegex","overwritePropertiesAndSave","destinationGetter","source","storageKey","destination","assign","set","defaultPropertiesAndSave","getPatientDashboardsKey","isNumber","clearAll","getIsActiveDirectoryUser","setIsActiveDirectoryUser","getClientId","setClientID","setClientId","getNotificationTimeout","setNotificationTimeout","getClientUrl","setClientURL","setClientUrl","getGatewayUrl","setGatewayUrl","setJsonWebToken","removeJsonWebToken","setUserName","username","setBirthDate","getBirthDate","setAccessCode","statementId","getAccessCode","setUserFullName","removeUserName","remove","setUserID","userid","setUserId","getUserId","getIsPatient","setIsPatient","isPatient","removeUserID","setDefaultSuperbillSubmissionMethod","methodId","getDefaultSuperbillSubmissionMethod","setKey","keyType","keyDictionary","activeKeys","split","includes","getKey","k","removeKey","setPatientDashboardWidgets","widget","getPatientDashboardWidgets","setPatientDashboardConfigurations","newList","getPatientDashboardConfigurations","hasV1Tiles","some","val","isUndefined","Tiles","savedConfig","savedTile","removePatientDashboardWidgets","overwritePatientDashboardConfigurations","removePatientDashboardConfigurations","getDashboardTileSettings","setDashboardTileSettings","setDefaultDashboardTileSettings","getAppointmentsListSettings","setAppointmentsListSettings","setDefaultAppointmentsListSettings","getMessagesListSettings","setMessagesListSettings","setDefaultMessagesListSettings","messageSettings","messageFilterId","getAppointmentsBadgeSettings","setAppointmentsBadgeSettings","setDefaultAppointmentsBadgeSettings","getDefaultServiceSiteId","setDefaultServiceSiteId","serviceSiteId","setDeviceId","getPhoneMessageGeneralNoteTypeId","setPhoneMessageGeneralNoteTypeId","getTaskMessageGeneralNoteTypeId","setTaskMessageGeneralNoteTypeId","getPharmacyGeneralNoteTypeId","setPharmacyGeneralNoteTypeId","getPortalMessageGeneralNoteTypeId","setPortalMessageGeneralNoteTypeId","getRxRefillMessageGeneralNoteTypeId","setRxRefillMessageGeneralNoteTypeId","getPharmacyRefillMessageGeneralNoteTypeId","setPharmacyRefillMessageGeneralNoteTypeId","getPatientVitalsDefaultSettingId","setPatientVitalsDefaultSettingId","getMedicationOverrideGeneralNoteTypeId","setMedicationOverrideGeneralNoteTypeId","getCurrentUserLicenses","setCurrentUserLicenses","licenses","getIsERxEnabled","setIsERxEnabled","enabled","getAllowImperialUnits","setAllowImperialUnits","allowed","getApplicationVersion","setApplicationVersion","version","setUserPermissions","permissionObj","prop","mapPermissions","getAskedUserForTouchID","setAskedUserForTouchID","prompt","getUserEnabledTouchID","setUserEnabledTouchID","getOncePerLoginChartConsent","setOncePerLoginChartConsent","clearKeysOfType","clearSessionStorage","clearOldVersionCache","redirectState","redirectParams","isCustomRedirect","customTransition","setDefaultRedirect","isDevice","getRedirect","redirect","$q","when","apFilterFeature","AppointmentScheduleTypes","routes","view","edit","getTransition","apptScheduleType","calendarId","apptId","filteredRoutes","lowerScheduleType","property","patientid","provider","appRoutes","getAppRoutes","setupAppRoutes","newAppRoutes","$get","$window","activateView","go","history","back","MessageTypes","getTransitionForMessage","messageTypeId","messageId","messageSubTypeId","createNew","merge","lowerMessageTypeId","lowerMessageSubTypeId","$urlMatcherFactory","formatRoute","routePattern","compile","formatRelativeRoute","parentRoutePattern","substring","service","WebViewManager","onStart","fromState","from","fromStateName","findKey","cloneDeep","transitionToState","replaceState","warn","formatTransition","targetRoute","isBoolean","$broadcast","getPreviousTransition","BrowserWebViewManager","XamarinWebViewManager","isStandaloneBrowser","isPrm","RouteFormatter","onNavigate","d","rawRoute","completeRoute","appState","parentSeperator","lastIndexOf","parentState","navigate","supportedTabs","UIControl_Note_CC","UIControl_Note_CCHPI","UIControl_Note_Confidential","UIControl_Note_DX","UIControl_Note_DXDSM","UIControl_Note_GeneralNote","UIControl_Note_HPI","UIControl_Note_HX","UIControl_Note_PE","UIControl_Note_Plan","UIControl_Note_Results","UIControl_Note_ROS","UIControl_Note_ROSPE","UIControl_Note_RX","UIControl_Note_SO","UIControl_Note_SP","UIControl_Note_VisitText","UIControl_Note_Vitals","supportedSliders","isNoteTabsSupported","note","isNil","noteTabs","Tabs","isNoteSlidersSupported","noteSliders","Sliders","isNoteTypeSupported","whenFirstSuccess","promises","deferred","defer","results","resolved","rejectionFlagValue","tryResolveToFirstSuccess","resolve","reject","time","timeoutPromise","catch","finally","cancel","delay","abortablePromise","isFunction","previousPromises","shouldRejectOnAbort","once","abort","shouldAbort","replaceChainFnsWithAbortableFns","chainFnKey","wrappedFn","noop","chained","previousPromiseToAbort","abortDeferred","abortedError","Schedule","FullNoteComposer","StrikeoutVisits","AprimaCache","AprimaRestangular","defaultCache","Permissions","httpMode","getPermissions","permissionName","one","withHttpConfig","cache","securityPermission","has","IsAllowed","groupStates","userPreference","allExpanded","allCollapsed","tileGroupName","storageType","disablePersistence","setupTile","tileId","defaultValue","forceDefault","tiles","isCollapsed","groupState","persist","save","toggle","nextState","updateTiles","changeConfiguration","getName","setPersistence","enable","getOrCreateOverride","storagePrefix","setStorageMode","put","newValue","displayName","userPlaceable"],"mappings":"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","file":"aprima-legacy-common.min.js","sourcesContent":["angular.module('aprima-legacy-common', [\r\n 'ui.router',\r\n 'restangular',\r\n 'ngTouch',\r\n 'ngAnimate',\r\n 'truncate',\r\n 'ui.bootstrap',\r\n 'angularLocalStorage',\r\n 'gettext',\r\n 'lodash',\r\n 'toaster',\r\n 'rt.debounce',\r\n 'hmTouchEvents',\r\n\r\n //aprima\r\n 'aprima-core',\r\n 'aprima-bridge',\r\n 'aprima-config'\r\n]);","angular.module('aprima-legacy-common').value('moment', window.moment);\r\n\r\n(function() {\r\n 'use strict';\r\n\r\n var messageTypes = {\r\n LabResultMessageGuid: '',\r\n TaskMessageGuid: '10101010-0000-0000-0000-000000000005',\r\n PortalAppointmentQuestionMessageGuid: 'fd4e2c5d-29c6-4a51-bd20-551d6ed90843',\r\n PortalBillingQuestionMessageGuid: '73366ba8-0149-47e0-875b-cb12bb4cb250',\r\n PortalDemographicsQuestionMessageGuid: 'dffb40d0-2318-41a9-8eef-94c58babb9b9',\r\n PortalGeneralQuestionMessageGuid: '9af1089b-e98b-4758-80f8-0435b143426d',\r\n PortalRxQuestionMessageGuid: 'e94b7146-407d-4f92-a393-de8429b7bfbf',\r\n PhoneMessageGuid: '10101010-0000-0000-0000-000000000003',\r\n LabMessageGuid: 'f05f9c71-a893-46c3-a7fe-37988f48a782',\r\n AttachmentApprovalGuid: '10101010-0000-0000-0000-000000000002',\r\n ServiceOrderApprovalMessageGuid: '10101010-0000-0000-0000-000000000008',\r\n\r\n // These refill message types still need to be handled to keep compatibility with older versions of PRM\r\n // where they are still commonly used.\r\n // Also, there still could be messages of this type in the database even in newer versions of PRM that were created\r\n // before the upgrade where this new message type below was introduced.\r\n // We may want to handle these differently at some point\r\n RxRefillRequestMessageGuid: '136d8762-82ec-487d-9448-f52469a3cdcd',\r\n PatientRxRefillRequestMessageGuid: 'b1b7d286-1fb2-43d0-a883-7946b1cd8751',\r\n PharmacyRefillRequestMessageGuid: 'd7716f70-61d6-4ec0-8ba6-01afc95e99f2',\r\n\r\n // This is the new message type that was recently created.\r\n // Description: Messages of this type are created by the user as part of the manual and electronic Rx Refill workflow.\r\n // Also, currently the patient portal rx refill request messages are a subtype of this message type.\r\n RxRefillAndErxRequestMessageGuid: 'eb31df6b-3685-4639-81f6-026f6278e1dc',\r\n };\r\n\r\n messageTypes.SupportedMessageTypesForCreate = {\r\n Types: [{id: messageTypes.TaskMessageGuid}, {id: messageTypes.PhoneMessageGuid, requiredFeature: 'PhoneMessageCreation'}],\r\n SubTypes: [{id: messageTypes.PortalGeneralQuestionMessageGuid}]\r\n };\r\n\r\n var appointmentScheduleTypes = {\r\n PatientVisit: {\r\n id: 'patientvisit',\r\n name: 'Patient Visit'\r\n },\r\n Event: {\r\n id: 'event',\r\n name: 'Event',\r\n requiredFeature: 'Appointments_DifferentScheduleTypes'\r\n },\r\n BlockingEvent: {\r\n id: 'blockingevent',\r\n name: 'Blocking Event',\r\n requiredFeature: 'Appointments_DifferentScheduleTypes'\r\n },\r\n GroupVisit: {\r\n id: 'groupvisit',\r\n name: 'Group Visit',\r\n requiredFeature: 'Appointments_DifferentScheduleTypes'\r\n }\r\n };\r\n appointmentScheduleTypes.List = _.values(appointmentScheduleTypes);\r\n\r\n var requestTypes = {\r\n listData: 'listData',\r\n default: 'default'\r\n };\r\n\r\n angular.module('aprima-legacy-common').constant('MessageTypes', messageTypes);\r\n angular.module('aprima-legacy-common').constant('AppointmentScheduleTypes', appointmentScheduleTypes);\r\n angular.module('aprima-legacy-common').constant('RequestTypes', requestTypes);\r\n})();","angular.module('aprima-legacy-common').run(['CustomModuleRunService', function(CustomModuleRunService) {\r\n 'use strict';\r\n CustomModuleRunService.add(['$rootScope', 'ErrorService', 'RequestTypes', '$transitions', function ($rootScope, ErrorService, RequestTypes, $transitions) {\r\n\r\n $rootScope.requestTypes = RequestTypes;\r\n\r\n $rootScope.addHttpError = function (httpResponse, messages, type) {\r\n var innerScope = this;\r\n\r\n if(!httpResponse.isAborted) {\r\n return ErrorService.addHttpErrorToScope(innerScope, httpResponse, messages, type);\r\n }\r\n\r\n return httpResponse;\r\n };\r\n\r\n $rootScope.removeHttpError = function (type) {\r\n var innerScope = this;\r\n return ErrorService.removeHttpErrorFromScope(innerScope, type);\r\n };\r\n\r\n $rootScope.setupDirectiveScope = function setupDirectiveScope($scope) {\r\n $scope.addHttpError = $rootScope.addHttpError;\r\n $scope.removeHttpError = $rootScope.removeHttpError;\r\n };\r\n\r\n $transitions.onSuccess({}, function removeHttpErrors() {\r\n //http errors were being persisted between page views and caused valid pages to be rendered as if they had an http error\r\n $rootScope.removeHttpError();\r\n });\r\n\r\n}]);}]);\r\n","angular.module('aprima-legacy-common').run(['CustomModuleRunService', function(CustomModuleRunService) {\r\n 'use strict';\r\n CustomModuleRunService.add(\r\n ['$rootScope', 'TransitionManager', 'AprimaAnalytics', 'DeviceSettings', '_', 'toaster',\r\n function ($rootScope, TransitionManager, AprimaAnalytics, DeviceSettings, _, toaster) {\r\n\r\n $rootScope.goBack = function () {\r\n TransitionManager.goBack();\r\n AprimaAnalytics.sendEvent('user', 'click', 'back button');\r\n };\r\n\r\n $rootScope.isEmpty = function (obj) {\r\n return _.isEmpty(obj);\r\n };\r\n\r\n $rootScope.isPhone = DeviceSettings.isPhoneOrOverride;\r\n $rootScope.isTablet = DeviceSettings.isTabletOrOverride;\r\n $rootScope.isBrowser = DeviceSettings.isBrowserOrOverride;\r\n\r\n $rootScope.tryToastModelStateError = function tryToastModelStateError(response) {\r\n var modelState = response.ModelState || (response.data && response.data.ModelState);\r\n\r\n if(modelState && modelState.commandResult) {\r\n _(modelState.commandResult).forEach(function(e){\r\n toaster.pop('error', '', e);\r\n });\r\n }\r\n };\r\n }]);\r\n}]);\r\n","angular.module('aprima-legacy-common').run(['CustomModuleRunService', function(CustomModuleRunService) {\r\n 'use strict';\r\n CustomModuleRunService.add(\r\n [ 'LocalStorageRepository', 'LanguageFactory',\r\n function (LocalStorageRepository, LanguageFactory) {\r\n var currentLanguage;\r\n if (LocalStorageRepository.getLang()) {\r\n currentLanguage = LocalStorageRepository.getLang();\r\n }\r\n else {\r\n if (navigator.userLanguage) {\r\n // Explorer\r\n currentLanguage = navigator.userLanguage;\r\n }\r\n else if (navigator.language) {\r\n // FF\r\n currentLanguage = navigator.language;\r\n }\r\n }\r\n\r\n if (currentLanguage) {\r\n LanguageFactory.setLang(currentLanguage);\r\n }\r\n }]);\r\n}]);\r\n\r\nangular.module('aprima-legacy-common').factory('aprgettext', ['gettextCatalog', function (gettextCatalog) {\r\n 'use strict';\r\n\r\n //This is a hack. gettext can extract strings from js files much like it can from html files.\r\n //To do this it searches for code that looks like \"gettext('....')\" and extracts the string.\r\n //gettext() however simple returns the string, and doesn't actually translate the string.\r\n //To do this, you have to pass that string to gettextCatalog.getString(), but that prevents\r\n //it from being extracted by the grunt task. The official usage is:\r\n //var translated = gettextCatalog.getString(gettext('Some String'));\r\n //but this usage is overly verbose.\r\n //This hack makes it so that you can use it like:\r\n //var translated = gettext('Some String');\r\n\r\n //When taking a dependency on this, make sure the variable is named 'gettext' and not 'apr_gettext'\r\n\r\n //usage of this should be limited. Most code should be in views. This is useful when calling window.alert\r\n //or toaster.pop();\r\n //todo we should review this and see if anybody has a better solution.\r\n return function (text) {\r\n return gettextCatalog.getString(text);\r\n };\r\n}]);\r\n","angular.module('aprima-legacy-common').run(['CustomModuleRunService', function(CustomModuleRunService) {\r\n 'use strict';\r\n CustomModuleRunService.add(['Bridge', '$transitions', 'AppRoutes', '_', '$uibModalStack', function (Bridge, $transitions, AppRoutes, _, $uibModalStack) {\r\n\r\n $transitions.onSuccess({}, function bridgeSetupPage(transition) {\r\n $uibModalStack.dismissAll('pageTransition');\r\n\r\n var toState = transition.targetState() || {};\r\n var toStateName = toState && toState.name() || '';\r\n var appRoute = _.find(AppRoutes, {state: toStateName});\r\n\r\n if (appRoute && appRoute.nativeSettings && !appRoute.nativeSettings.ctrlSetsUpPage) {\r\n Bridge.setupPage(appRoute.nativeSettings);\r\n }\r\n });\r\n }]);\r\n}]);\r\n\r\n","angular.module('aprima-legacy-common').run(['CustomModuleRunService', function(CustomModuleRunService) {\r\n 'use strict';\r\n CustomModuleRunService.add(\r\n ['$rootScope', '$location', '$log', 'AprimaAnalytics', '$state',\r\n function ($rootScope, $location, $log, AprimaAnalytics, $state) {\r\n\r\n $rootScope.$watch(function () {\r\n return $location.path();\r\n },\r\n function (a) {\r\n var output = ($state.current.description) ? $state.current.description : a;\r\n $log.info('url has changed: ' + output);\r\n AprimaAnalytics.sendPageView(output);\r\n });\r\n }\r\n ]);\r\n}]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-legacy-common').run(['CustomModuleRunService', customRun]);\r\n\r\n function customRun(CustomModuleRunService) {\r\n CustomModuleRunService.add([\r\n 'moment',\r\n momentSetup,\r\n ]);\r\n }\r\n\r\n function momentSetup(\r\n moment\r\n ) {\r\n moment.fn.removeOffset = function removeOffset() {\r\n return this.add(this.utcOffset(), 'minutes').utc();\r\n };\r\n\r\n // the previous logic was this:\r\n // moment(date).add(-moment(date).zone(), 'minutes').toDate().toJSON();\r\n // OR\r\n // moment(date).add(moment(date).utcOffset(), 'minutes').toDate().toJSON();\r\n moment.fn.formatRemoveOffset = function formatRemoveOffset() {\r\n return this.removeOffset().format();\r\n };\r\n\r\n\r\n moment.fn.startOfDate = function() {\r\n return this.startOf('day').toDate();\r\n };\r\n }\r\n\r\n})(window.angular);\r\n","// Adds abortable and aborts functions to all Restangularized Elements globally\r\n// usage examples:\r\n// Restangular.one('route1').abortable().get() => returns AbortablePromise\r\n// Restangular.all('route3').abortable().put() => returns AbortablePromise\r\n// AprimaRestangular.get().one('route2').abortable(abortablePromise1).get() => aborts abortablePromise1, returns AbortablePromise\r\n// Restangular.all('route4').abortable(abortablePromiseList).put() => aborts all promises in abortablePromiseList, returns AbortablePromise\r\n// etc. you get the picture\r\nangular.module('aprima-legacy-common').run(['CustomModuleRunService', function(CustomModuleRunService) {\r\n 'use strict';\r\n CustomModuleRunService.add(\r\n ['Restangular', '_', 'HttpAbortableContext', '$qHelpers', function(Restangular, _, HttpAbortableContext, $qHelpers) {\r\n\r\n var abortableFn = 'abortable';\r\n var abortsFn = 'aborts';\r\n var abortableFields = {};\r\n abortableFields[abortableFn] = abortableFn;\r\n abortableFields[abortsFn] = abortsFn;\r\n //add these as RestangularFields, so that way they will stripped out correctly when calling .plain()\r\n Restangular.setRestangularFields(abortableFields);\r\n Restangular.setOnElemRestangularized(makeElementRequestAbortable);\r\n\r\n function makeElementRequestAbortable(element, isCollection, route, restangularObject) {\r\n if(element && restangularObject.configuration.isRestangularized(element)) {\r\n // aborts passed in promises after sending out request\r\n element[abortsFn] = function(promisesToAbort) {\r\n wrapCallsToRestangularizedElement(this, function(promise) {\r\n $qHelpers.abortPromises(promisesToAbort);\r\n return promise;\r\n });\r\n return this;\r\n };\r\n\r\n // aborts passed in promises after sending out request, and returns an abortable promise\r\n element[abortableFn] = function(promisesToAbort) {\r\n var abortableContext = new HttpAbortableContext(promisesToAbort);\r\n var httpConfig = restangularObject.configuration.restangularFields.httpConfig;\r\n \r\n // withHttpConfig needs to be called before this, so it doesn't get overwritten\r\n this[httpConfig] = _.defaults(this[httpConfig], {timeout: abortableContext.abortPromise});\r\n wrapCallsToRestangularizedElement(this, abortableContext.wrap);\r\n return this;\r\n };\r\n }\r\n return element;\r\n }\r\n \r\n // ideally would use setRestangularizePromiseInterceptor instead of this but it doesn't expect a return value,\r\n // it only allows you to mutate the promise, not wrap it and return a new one like we are doing here\r\n function wrapCallsToRestangularizedElement(restangularizedElement, promiseInterceptor) {\r\n _(restangularizedElement)\r\n .functions()\r\n .forEach(function(key) {\r\n var elementFn = restangularizedElement[key];\r\n var wrappedKey = '_' + key;\r\n restangularizedElement[wrappedKey] = restangularizedElement[wrappedKey] || elementFn;\r\n\r\n restangularizedElement[key] = function() {\r\n var result = elementFn.apply(this, arguments);\r\n\r\n if ($qHelpers.isPromise(result)) {\r\n result = promiseInterceptor(result);\r\n }\r\n\r\n return result;\r\n };\r\n });\r\n\r\n return restangularizedElement;\r\n }\r\n }]);\r\n}]);\r\n","angular.module('aprima-legacy-common').config(['$provide', function($provide) {\r\n 'use strict';\r\n $provide.decorator('$exceptionHandler', ['$delegate', '$injector', function($delegate, $injector) {\r\n var AprimaAnalytics;\r\n\r\n return function customExceptionHandler(exception, cause) {\r\n var message = exception.message + ' (caused by \"' + cause + '\")';\r\n try {\r\n AprimaAnalytics = AprimaAnalytics || $injector.get('AprimaAnalytics');\r\n AprimaAnalytics.sendException(message);\r\n }\r\n catch(ex) { }\r\n $delegate(exception, cause);\r\n };\r\n }]);\r\n}]);\r\n","angular.module('aprima-legacy-common').filter('apPatientThumbnailSrc', [function () {\r\n 'use strict';\r\n return function (patientId, height, width) {\r\n if(!patientId) {\r\n // if the patientId is null or undefined, return undefined because a valid url can't be formed\r\n // and undefined can be handled accordingly\r\n return;\r\n }\r\n\r\n if(height && !width) {\r\n width = height;\r\n }\r\n\r\n var url = 'patients/' + patientId + '/thumbnail';\r\n\r\n if(height) {\r\n url += '?height=' + height + '&width=' + width;\r\n }\r\n\r\n return url;\r\n };\r\n}]);\r\n","(function() {\r\n 'use strict';\r\n angular.module('aprima-legacy-common').filter('apPersonThumbnailSrc', [\r\n 'ServerInfoRepository',\r\n apPersonThumbnailSrc\r\n ]);\r\n\r\n function apPersonThumbnailSrc(\r\n ServerInfoRepository\r\n ) {\r\n return function (personId, height, width) {\r\n if (!personId || !ServerInfoRepository.isFeatureSupported([ 'PersonPhoto' ])) {\r\n // return undefined because a valid url can't be formed\r\n // and undefined can be handled accordingly\r\n return;\r\n }\r\n\r\n if (height && !width) {\r\n width = height;\r\n }\r\n\r\n var url = 'persons/' + personId + '/thumbnail';\r\n\r\n if (height) {\r\n url += '?height=' + height + '&width=' + width;\r\n }\r\n\r\n return url;\r\n };\r\n }\r\n})();\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n // TODO: move to separate module that has models\r\n angular.module('aprima-legacy-common').factory('DoseRange', [\r\n 'ObjUtil',\r\n DoseRangeFactory,\r\n ]);\r\n\r\n function DoseRangeFactory(\r\n ObjUtil\r\n ) {\r\n\r\n DoseRange.mapFromDto = mapFromDto;\r\n return DoseRange;\r\n\r\n function DoseRange(obj) {\r\n ObjUtil.defineReadonlyProps(this, {\r\n Id: obj.Id,\r\n WeightRequired: obj.WeightRequired,\r\n BodySurfaceAreaRequired: obj.BodySurfaceAreaRequired,\r\n LowDose: obj.LowDose,\r\n LowDoseUnits: obj.LowDoseUnits,\r\n HighDose: obj.HighDose,\r\n HighDoseUnits: obj.HighDoseUnits,\r\n MaximumDosePerDay: obj.MaximumDosePerDay,\r\n MaximumDosePerDayUnits: obj.MaximumDosePerDayUnits,\r\n MaximumSingleDose: obj.MaximumSingleDose,\r\n MaximumSingleDoseUnits: obj.MaximumSingleDoseUnits,\r\n MaximumLifetimeDose: obj.MaximumLifetimeDose,\r\n MaximumLifetimeDoseUnits: obj.MaximumLifetimeDoseUnits,\r\n NteAmountPerSingleDose: obj.NteAmountPerSingleDose,\r\n NteAmountPerSingleDoseUnits: obj.NteAmountPerSingleDoseUnits,\r\n LowFrequency: obj.LowFrequency,\r\n HighFrequency: obj.HighFrequency,\r\n LowDuration: obj.LowDuration,\r\n HighDuration: obj.HighDuration,\r\n AdjustedLowDose: obj.AdjustedLowDose,\r\n AdjustedHighDose: obj.AdjustedHighDose,\r\n AdjustedMaximumSingleDose: obj.AdjustedMaximumSingleDose,\r\n AdjustedMaximumDosePerDay: obj.AdjustedMaximumDosePerDay,\r\n AdjustedMaximumLifetimeDose: obj.AdjustedMaximumLifetimeDose,\r\n AdjustedNteAmountPerSingleDose: obj.AdjustedNteAmountPerSingleDose,\r\n RangeLowDose: obj.RangeLowDose,\r\n RangeLowDoseUnits: obj.RangeLowDoseUnits,\r\n RangeHighDose: obj.RangeHighDose,\r\n RangeHighDoseUnits: obj.RangeHighDoseUnits,\r\n RangeLowDoseForm: obj.RangeLowDoseForm,\r\n RangeLowDoseFormUnits: obj.RangeLowDoseFormUnits,\r\n RangeHighDoseForm: obj.RangeHighDoseForm,\r\n RangeHighDoseFormUnits: obj.RangeHighDoseFormUnits,\r\n NtePediDailyDoseStrength: obj.NtePediDailyDoseStrength,\r\n NtePediDailyDoseStrengthUnits: obj.NtePediDailyDoseStrengthUnits,\r\n NtePediDailyDoseForm: obj.NtePediDailyDoseForm,\r\n NtePediDailyDoseFormUnits: obj.NtePediDailyDoseFormUnits,\r\n IngredientStrength: obj.IngredientStrength,\r\n IngredientStrengthUomAbbr: obj.IngredientStrengthUomAbbr,\r\n IngredientStrengthUomDesc: obj.IngredientStrengthUomDesc,\r\n IngredientVolume: obj.IngredientVolume,\r\n IngredientVolumeUomAbbr: obj.IngredientVolumeUomAbbr,\r\n IngredientVolumeUomDesc: obj.IngredientVolumeUomDesc,\r\n WeightKg: obj.WeightKg,\r\n BodySurfaceArea: obj.BodySurfaceArea,\r\n ErrorMsg: obj.ErrorMsg,\r\n HasError: obj.HasError,\r\n });\r\n }\r\n\r\n function mapFromDto(obj) {\r\n if(!obj) {\r\n return null;\r\n }\r\n\r\n return new DoseRange(obj);\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n // TODO: move to separate module that has models\r\n angular.module('aprima-legacy-common').factory('DoseRangeInfo', [\r\n 'DoseRange',\r\n 'ObjUtil',\r\n DoseRangeInfoFactory,\r\n ]);\r\n\r\n function DoseRangeInfoFactory(\r\n DoseRange,\r\n ObjUtil\r\n ) {\r\n\r\n DoseRangeInfo.mapFromDto = mapFromDto;\r\n return DoseRangeInfo;\r\n\r\n function DoseRangeInfo(obj) {\r\n DoseRange.call(this, obj);\r\n\r\n ObjUtil.defineReadonlyProps(this, {\r\n MaxMinInformation: obj.MaxMinInformation,\r\n });\r\n }\r\n\r\n function mapFromDto(obj) {\r\n if(!obj) {\r\n return null;\r\n }\r\n\r\n return new DoseRangeInfo(obj);\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular){\r\n 'use strict';\r\n\r\n // TODO: move to separate module that has models\r\n // provides standard values for age and gender to be used with imo requests\r\n angular.module('aprima-legacy-common').factory('ImoPatient', [\r\n '_',\r\n 'DateUtilities',\r\n 'ObjUtil',\r\n ImoPatientFactory\r\n ]);\r\n\r\n function ImoPatientFactory(\r\n _,\r\n DateUtilities,\r\n ObjUtil\r\n ) {\r\n\r\n var femaleRegex = /^f(emale)?$/i;\r\n var maleRegex = /^m(ale)?$/i;\r\n\r\n ImoPatient.mapFromApi = mapFromApi;\r\n return ImoPatient;\r\n\r\n function ImoPatient(name, ageInYears, gender) {\r\n var standardizedAge = null;\r\n ageInYears = parseFloat(ageInYears);\r\n if(!_.isNaN(ageInYears) && ageInYears >= 0) {\r\n standardizedAge = _.round(ageInYears);\r\n }\r\n\r\n var standardizedGender = null;\r\n if(femaleRegex.test(gender)) {\r\n standardizedGender = 'F';\r\n }\r\n else if(maleRegex.test(gender)) {\r\n standardizedGender = 'M';\r\n }\r\n\r\n ObjUtil.defineReadonlyProps(this, {\r\n name: name,\r\n age: ageInYears,\r\n standardizedAge: standardizedAge,\r\n hasAge: !!standardizedAge || standardizedAge === 0,\r\n gender: gender,\r\n standardizedGender: standardizedGender,\r\n hasGender: !!standardizedGender,\r\n });\r\n }\r\n\r\n function mapFromApi(patient) {\r\n if(!patient) {\r\n return null;\r\n }\r\n\r\n var name = patient.FirstName + ' ' + patient.LastName;\r\n\r\n // BirthDate from PatientDto, DateOfBirth from PatientHeaderDetailsDto\r\n var birthDate = patient.BirthDate || patient.DateOfBirth;\r\n // only PatientDto has DeathDate\r\n var deathDate = patient.DeathDate;\r\n var ageInfo = DateUtilities.getPersonAge(birthDate, deathDate, 'years');\r\n\r\n // Gender from PatientDto, GenderName and GenderAnsi from PatientHeaderDetailsDto\r\n var gender = patient.Gender || patient.GenderName || patient.GenderAnsi;\r\n\r\n return new ImoPatient(name, ageInfo.age, gender);\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-legacy-common').factory('AprimaAnalytics', ['Bridge', '$timeout', '_',\r\n function (Bridge, $timeout, _) {\r\n 'use strict';\r\n\r\n var sendTiming = function (category, label, timingValue, page) {\r\n $timeout(function () {\r\n Bridge.trackTiming(category, label, timingValue, page);\r\n }, 0);\r\n };\r\n\r\n var sendEvent = function (category, action, label, value) {\r\n $timeout(function () {\r\n Bridge.trackEvent(category, action, label, value);\r\n }, 0);\r\n };\r\n\r\n var sendPageView = function (location) {\r\n $timeout(function () {\r\n Bridge.trackPageChange(location);\r\n }, 0);\r\n };\r\n\r\n var sendException = function (message) {\r\n $timeout(function () {\r\n Bridge.trackException(message);\r\n }, 0);\r\n };\r\n\r\n var startTiming = function (page, category, label) {\r\n var now = new Date().getTime();\r\n var timing = {\r\n startTime: now,\r\n page: page,\r\n label: label,\r\n category: category\r\n };\r\n\r\n timing.stop = _.partial(stopTiming, timing);\r\n\r\n return timing;\r\n };\r\n\r\n function stopTiming(timing) {\r\n timing.endTime = new Date().getTime();\r\n timing.value = moment(timing.endTime).diff(moment(timing.startTime), 'millisecond');\r\n sendTiming(timing.category, timing.label, timing.value, timing.page);\r\n }\r\n\r\n return {\r\n sendEvent: sendEvent,\r\n sendTiming: sendTiming,\r\n sendPageView: sendPageView,\r\n sendException: sendException,\r\n startTiming: startTiming,\r\n stopTiming: stopTiming\r\n };\r\n }]\r\n);\r\n","angular.module('aprima-legacy-common').factory('AprimaRestangular',\r\n [\r\n '$log',\r\n '$state',\r\n '_',\r\n 'AppRoutes',\r\n 'Bridge',\r\n 'BrowserService',\r\n 'configuration',\r\n 'debugLogService',\r\n 'LocalStorageRepository',\r\n 'Restangular',\r\n 'TransitionManager',\r\n function(\r\n $log,\r\n $state,\r\n _,\r\n AppRoutes,\r\n Bridge,\r\n BrowserService,\r\n configuration,\r\n debugLogService,\r\n LocalStorageRepository,\r\n Restangular,\r\n TransitionManager\r\n ) {\r\n\r\n 'use strict';\r\n\r\n var alwaysIgnoreCache = false;\r\n var debugModeValue = LocalStorageRepository.getSupportedFeatures();\r\n\r\n //to ignore the cache, you can call this like .get({ignoreCache: true}); or .get('baseurl', {ignoreCache: true});\r\n var get = function(endpointBase, options) {\r\n if (!_.isString(endpointBase) && !options) {\r\n options = endpointBase;\r\n endpointBase = null;\r\n }\r\n\r\n options = _.defaults(options || {}, {\r\n ignoreCache: BrowserService.isLegacyIE(),\r\n debugMode: false\r\n });\r\n\r\n var restangular = Restangular.withConfig(function(RestangularConfigurer) {\r\n\r\n var clientUrl = LocalStorageRepository.getClientURL();\r\n if (!clientUrl) {\r\n throw new Error('Cannot send request (configuration error): empty ClientURL');\r\n }\r\n\r\n var urlComponents = [\r\n clientUrl.replace(/\\/$/, ''),\r\n 'api',\r\n endpointBase ? endpointBase : '',\r\n configuration.SERVER_API_VERSION\r\n ];\r\n\r\n var baseUrl = _.filter(urlComponents, function(c) {\r\n return !_.isNull(c) && !_.isEmpty(c);\r\n }).join('/');\r\n\r\n RestangularConfigurer.setBaseUrl(baseUrl);\r\n\r\n var headers = {\r\n 'Auth-Token': LocalStorageRepository.getJsonWebToken(),\r\n 'ApiKey': configuration.API_KEY\r\n };\r\n\r\n if (options.ignoreCache) {\r\n Bridge.fireEvent('clear-cache', {});\r\n\r\n headers['Cache-Control'] = 'no-cache, no-store, must-revalidate';\r\n headers.Pragma = 'no-cache';\r\n headers.Expires = new Date();\r\n }\r\n\r\n RestangularConfigurer.setDefaultHeaders(headers);\r\n\r\n var isFeatureSupported = function(features) {\r\n\r\n if (!angular.isArray(features)) {\r\n features = [features];\r\n }\r\n\r\n var supportedFeatures = debugModeValue;\r\n\r\n var matchedValues = _.intersection(features, supportedFeatures);\r\n\r\n return matchedValues.length === features.length;\r\n };\r\n\r\n var debugModeFeature = isFeatureSupported('DebuggerFeature');\r\n\r\n if (debugModeFeature) {\r\n\r\n RestangularConfigurer.addFullRequestInterceptor(function(element, operation, what, url, _5, parameters) {\r\n if (alwaysIgnoreCache && operation.toLowerCase() === 'get', 'put', 'post', 'delete') {\r\n if (debugLogService.getDebugMode()) {\r\n return {\r\n params: _.assignIn(parameters, {\r\n t: new Date().toJSON(),\r\n debug: true, //passing debug parameters\r\n levels: 'info,debug,fatal,warn,error'\r\n })\r\n\r\n };\r\n }\r\n }\r\n return element;\r\n });\r\n\r\n //displaying information from the response headers if debugMode is true and status=200\r\n RestangularConfigurer.addResponseInterceptor(function(data, operation, what, url, response/* ,deferred*/) {\r\n if (operation === 'get', 'post', 'put', 'delete') {\r\n if (debugLogService.getDebugMode()) {\r\n $log.log('URL:', url);\r\n $log.log('WHAT:', what);\r\n $log.log('THE HEADERS ARE:', JSON.stringify(response.headers(), null, 2));\r\n\r\n }\r\n }\r\n return data;\r\n });\r\n }\r\n\r\n else {\r\n RestangularConfigurer.addFullRequestInterceptor(function(element, operation, what, url, _5, parameters) {\r\n if (alwaysIgnoreCache && operation.toLowerCase() === 'get') {\r\n return {\r\n params: _.assignIn(parameters, {\r\n t: new Date().toJSON(),\r\n\r\n })\r\n };\r\n }\r\n\r\n return element;\r\n });\r\n }\r\n\r\n RestangularConfigurer.setErrorInterceptor(function(response) {\r\n if (response.status === 401) {\r\n var deviceId = LocalStorageRepository.getDeviceId();\r\n var jwt = LocalStorageRepository.getJsonWebToken();\r\n jwt = typeof jwt === 'undefined' ? 'undefined' : jwt ? jwt.length : '\"falsy token\"';\r\n var msg = 'User logged out by 401. Redirected to login. DeviceId=' + deviceId + ' JWT:' + jwt;\r\n\r\n $log.info(msg);\r\n Bridge.trackException(msg);\r\n\r\n\r\n if($state.current.alternativeLoginRoute){\r\n TransitionManager.transition({ appRoute: AppRoutes.statementslogin.state});\r\n }\r\n else {\r\n TransitionManager.transition({ appRoute: AppRoutes.login.state});\r\n }\r\n }\r\n\r\n //displaying the exception information if debugMode is true and status!=200\r\n else if (debugModeFeature && response.status !== 200) {\r\n if (debugLogService.getDebugMode()) {\r\n $log.log('THE EXCEPTION INFORMATION:', JSON.stringify(response.headers(), null, 2));\r\n\r\n }\r\n }\r\n\r\n if (response.data && response.data.ModelState) {\r\n var errorCode = response.data.ModelState['commandResult-ErrorCode'];\r\n\r\n //errorCode is a string coming from the server. a value of '0' is not falsy.\r\n if (errorCode) {\r\n response.errorCode = parseInt(errorCode);\r\n }\r\n }\r\n\r\n //allows promises to receive these errors\r\n return true;\r\n });\r\n });\r\n\r\n return restangular;\r\n };\r\n\r\n function getUrl(endpointBase, parent){\r\n var urlComponents = [\r\n LocalStorageRepository.getClientURL(),\r\n 'api',\r\n endpointBase ? endpointBase : '',\r\n configuration.SERVER_API_VERSION,\r\n parent\r\n ];\r\n\r\n var baseUrl = _.filter(urlComponents, function(c){\r\n return !_.isNull(c) && !_.isEmpty(c);\r\n }).join('/');\r\n\r\n\r\n var headers = {\r\n 'Auth-Token': LocalStorageRepository.getJsonWebToken(),\r\n 'ApiKey': configuration.API_KEY\r\n };\r\n\r\n return [baseUrl, headers];\r\n\t\t\t}\r\n\r\n return {\r\n get: get,\r\n\t\t\t\tgetUrl: getUrl,\r\n disableCaching: function () {\r\n alwaysIgnoreCache = true;\r\n }\r\n };\r\n }]);\r\n\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-legacy-common').factory('AuthorizationService', [\r\n 'CurrentUser',\r\n 'ServerInfoRepository',\r\n AuthorizationService\r\n ]);\r\n\r\n function AuthorizationService(\r\n CurrentUser,\r\n ServerInfoRepository\r\n ) {\r\n\r\n return {\r\n isUserProvider : isUserProvider,\r\n icd10User: isIcd10User,\r\n };\r\n\r\n function isUserProvider() {\r\n if(ServerInfoRepository.isFeatureSupported('ProviderAuthorization')){\r\n var user = CurrentUser.get();\r\n\r\n // Right now apAuthorization uses this in apPatientContextMenu to determine whether or not to allow the user to add a charge capture.\r\n // In PRM, the permissions aren't filled in, so we can't determine right now whether they are a provider currently with CurrentUser service.\r\n // At least this won't null ref now though:\r\n // This will handle legacy case where it has the string value 'True', or\r\n // the newer case where it is actually bool true\r\n return user.permissions && (user.permissions.IsProvider === 'True' || user.permissions.IsProvider === true);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function isIcd10User() {\r\n var user = CurrentUser.get();\r\n // This will handle legacy case where it has the string value 'True', or\r\n // the newer case where it is actually bool true\r\n return user.permissions && (user.permissions.ICD10User === 'True' || user.permissions.ICD10User === true);\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-legacy-common').factory('CurrentUser', ['LocalStorageRepository', 'TransitionManager', 'Bridge', 'LogOffService', '$state', 'LogInService', '$rootScope',\r\n function (LocalStorageRepository, TransitionManager, Bridge, LogOffService, $state, LogInService, $rootScope) {\r\n 'use strict';\r\n\r\n var previousTransition;\r\n\r\n $rootScope.$on('TransitionActivated', function(evt, transition){\r\n previousTransition = transition;\r\n });\r\n\r\n Bridge.on('force-logoff-user', null, function(){\r\n LogInService.setRedirect(previousTransition);\r\n\r\n LogOffService.logoff().then(function () {\r\n TransitionManager.transition({appRoute: 'login', opts: {replaceCurrentState: true}});\r\n });\r\n });\r\n\r\n return {\r\n\r\n isAuthenticated: function () {\r\n var jwt = LocalStorageRepository.getJsonWebToken();\r\n return !!jwt;\r\n },\r\n\r\n get: function () {\r\n return {\r\n name: LocalStorageRepository.getUserName(),\r\n fullName: LocalStorageRepository.getUserFullName(),\r\n userId: LocalStorageRepository.getUserID(),\r\n token: LocalStorageRepository.getJsonWebToken(),\r\n clientId: LocalStorageRepository.getClientID(),\r\n clientURL: LocalStorageRepository.getClientURL(),\r\n deviceId: LocalStorageRepository.getDeviceId(),\r\n permissions: LocalStorageRepository.getUserPermissions()\r\n };\r\n }\r\n };\r\n}]);\r\n","angular.module('aprima-legacy-common').factory('DashboardStructure',\r\n ['ServerInfoRepository', 'VersionService', 'CurrentUser', 'DeviceSettings', 'widgetViews', 'configuration',\r\n function (ServerInfoRepository, VersionService, CurrentUser, DeviceSettings, widgetViews, configuration) {\r\n 'use strict';\r\n\r\n function mapV1ConfigurationsToV2(configs) {\r\n var result = _.map(configs, mapV1ConfigurationToV2);\r\n\r\n return result;\r\n\r\n function mapV1ConfigurationToV2(config) {\r\n var result = {\r\n Id: config.Type,\r\n ExternalId: '',\r\n Name: config.Type,\r\n DisplayOrder: config.Type === 'All' ? 0 : 1,\r\n PhoneTiles: mapTiles(config, 1),\r\n TabletTiles: mapTiles(config, 2),\r\n DesktopTiles: mapTiles(config, 3)\r\n };\r\n\r\n return result;\r\n }\r\n\r\n function mapTiles(config, numColumns) {\r\n var tiles = _(config.WidgetDescriptors)\r\n .filter(function (tile) {\r\n return tile.Name !== 'header';\r\n })\r\n .map(_.partialRight(mapTile, numColumns))\r\n .value();\r\n\r\n return tiles;\r\n }\r\n\r\n function mapTile(tile, index, collection, numColumns) {\r\n var result = {\r\n Id: tile.Id,\r\n TileDescriptorId: _.find(widgetViews, {name: tile.Name}).id,\r\n Name: tile.Name,\r\n Heading: tile.Heading,\r\n ColumnSpan: Math.min(DeviceSettings.isPhoneOrOverride || tile.Column !== 'dblCol' ? 1 : 2, numColumns || 2),\r\n IsCollapsed: tile.Name === 'remarks' ? false : true,\r\n Filter: tile.Filter\r\n };\r\n\r\n return result;\r\n }\r\n }\r\n\r\n return {\r\n get: function (numColumns) {\r\n var routeSuffix = 'phone';\r\n\r\n switch (numColumns) {\r\n case 1:\r\n routeSuffix = 'phone';\r\n break;\r\n case 2:\r\n routeSuffix = 'tablet';\r\n break;\r\n case 3:\r\n routeSuffix = 'desktop';\r\n break;\r\n case undefined:\r\n case null:\r\n routeSuffix = '';\r\n break;\r\n default:\r\n throw new Error('Unsupported number of columns for dashboard configuration: ' + numColumns);\r\n }\r\n\r\n var isTileV2 = VersionService.checkVersionValid(ServerInfoRepository.getPrmAssemblyVersion(), configuration.MIN_PRM_DASHBOARD_VERSION);\r\n return isTileV2 ?\r\n {\r\n repositoryRoute: 'settings/patient-dashboards/' + routeSuffix,\r\n mapFn: _.identity\r\n } :\r\n {\r\n repositoryRoute: 'settings/patientdashboards/' + CurrentUser.get().userId,\r\n mapFn: mapV1ConfigurationsToV2\r\n };\r\n }\r\n };\r\n }]);\r\n\r\n","angular.module('aprima-legacy-common').factory('DateUtilities',\r\n ['_', 'moment', 'LanguageFactory',\r\n function (_, moment, LanguageFactory) {\r\n 'use strict';\r\n\r\n var words = {\r\n years: {'en_us': 'Years', 'es_mx': 'Años'},\r\n months: {'en_us': 'Months', 'es_mx': 'Meses'},\r\n days: {'en_us': 'Days', 'es_mx': 'DÃas'},\r\n weeks: {'en_us': 'Weeks', 'es_mx': 'Semanas'},\r\n deceased: {'en_us': 'deceased at', 'es_mx': 'fallecido en'}\r\n };\r\n var lang = LanguageFactory.getLang();\r\n\r\n return {\r\n getPersonAge: _getPersonAge,\r\n displayAge: _displayAge,\r\n getDurationString: getDurationString,\r\n getPersonAgeAbbr: _getPersonAgeAbbr\r\n };\r\n\r\n\r\n function _getPersonAgeAbbr(birthDate, deathDate, unit) {\r\n if(!moment(birthDate, 'MM/DD/YYYY').isValid()) {\r\n birthDate = moment(birthDate).format('L');\r\n }\r\n var ageInfo = _getPersonAge(birthDate, deathDate, unit);\r\n var age = ageInfo.age + '' + ageInfo.units.charAt(0).toLowerCase();\r\n return age;\r\n }\r\n // we need to assume the dates from the server are in mm/dd/yyy format\r\n // but we can use momentjs to format based on the language selection\r\n\r\n function _getPersonAge(birthDate, deathDate, unit) {\r\n var _units = 'Years';\r\n var _age = 0;\r\n var _deceased = false;\r\n var end;\r\n var years, months, days, weeks;\r\n var langCode = lang.code.toLowerCase();\r\n var birthDateMoment = birthDate;\r\n\r\n moment.locale(langCode);\r\n\r\n if (!moment(birthDate + '', 'MM/DD/YYYY').isValid()) {\r\n return {\r\n birthdate: '', age: 0, units: words.years[langCode]\r\n };\r\n }\r\n else {\r\n birthDateMoment = moment(birthDate, 'MM/DD/YYYY');\r\n }\r\n\r\n var tempDeathDate = moment(deathDate + '', 'MM/DD/YYYY');\r\n if (tempDeathDate.isValid()) {\r\n end = tempDeathDate;\r\n _deceased = true;\r\n }\r\n else {\r\n end = moment();\r\n }\r\n\r\n years = end.diff(birthDateMoment, 'years');\r\n months = end.diff(birthDateMoment, 'months');\r\n days = end.diff(birthDateMoment, 'days');\r\n weeks = end.diff(birthDateMoment, 'weeks');\r\n\r\n if ((!unit && days < 14) || unit === 'days') {\r\n _age = days;\r\n _units = words.days[langCode] || 'Days';\r\n }\r\n else if ((!unit && months < 2) || unit === 'weeks') {\r\n _age = weeks;\r\n _units = words.weeks[langCode] || 'Weeks';\r\n }\r\n else if ((!unit && years < 2) || unit === 'months') {\r\n _age = months;\r\n _units = words.months[langCode] || 'Months';\r\n }\r\n else {\r\n _age = years;\r\n _units = words.years[langCode] || 'Years';\r\n }\r\n\r\n return {\r\n birthdate: moment(birthDate, 'MM/DD/YYYY').format('L'),\r\n deathdate: moment(deathDate, 'MM/DD/YYYY').format('L'),\r\n age: _age,\r\n units: _units,\r\n deceased: _deceased\r\n };\r\n }\r\n\r\n function _displayAge (person, options) {\r\n var ageString;\r\n var outputString;\r\n var langCode = lang.code.toLowerCase();\r\n\r\n if (!person || person.birthdate === '') {\r\n return '';\r\n }\r\n\r\n ageString = person.age + ' ' + person.units;\r\n\r\n if (person.deceased) {\r\n ageString = words.deceased[langCode] + ' ' + ageString;\r\n }\r\n\r\n if (options && options.display === 'age') {\r\n return ageString;\r\n }\r\n\r\n if (options && options.display === 'birthdate') {\r\n return person.birthdate;\r\n }\r\n outputString = person.birthdate + ' (' + ageString + ')';\r\n return outputString;\r\n }\r\n\r\n function getDurationString(refDate) {\r\n var diff = Date.parse(refDate) - new Date();\r\n var msg = moment.duration(diff).humanize();\r\n if(diff < 0)\r\n return msg + ' ago';\r\n else\r\n return 'in ' + msg;\r\n }\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('debugLogService',[function( ){\r\n'use strict';\r\nvar debugMode = false;\r\nreturn {\r\n disableDebugMode : function () {\r\n debugMode = false; \r\n },\r\n enableDebugMode : function(){\r\n debugMode = true;\r\n },\r\n getDebugMode : function() {\r\n return debugMode;\r\n }\r\n \r\n\r\n};\r\n }]);","(function(angular, Math) {\r\n 'use strict';\r\n\r\n // Copied From iMedica.Prm.BusinessObject.NDD_DoseRangeChecking and converted to js\r\n\r\n // constants\r\n var singleDose = 'single dose ';\r\n var perDay = 'per day ';\r\n var AdjustedForWeight = ' (adjusted for patient\\'s weight)';\r\n var MetricWeightMask = '0.000';\r\n var AdjustedForBodySurfaceArea = ' (adjusted for body surface area)';\r\n var maxPediatricAgeInDays = 6569;\r\n\r\n angular.module('aprima-legacy-common').factory('DoseRangeUtil', [\r\n '_',\r\n 'NumUtil',\r\n 'StringBuilder',\r\n 'SystemGuid',\r\n DoseRangeUtil,\r\n ]);\r\n\r\n function DoseRangeUtil(\r\n _,\r\n NumUtil,\r\n StringBuilder,\r\n SystemGuid\r\n ) {\r\n\r\n var service = {\r\n createWeightBasedMaxMinInformation: createWeightBasedMaxMinInformation,\r\n formatAgeInDays: formatAgeInDays,\r\n getWeightBasedSummary: getWeightBasedSummary,\r\n mapVariableDosingFromDto: mapVariableDosingFromDto,\r\n mapVariableDosingToDto: mapVariableDosingToDto,\r\n processDoseRanges: processDoseRanges,\r\n GetMaxMinWarningMsg: getMaxMinWarningMsg,\r\n CreateMaxMinInformation: createMaxMinInformation,\r\n CalculateDosingInformation: calculateDosingInformation,\r\n allowsBsaAdjustment: allowsBsaAdjustment,\r\n canCalculateByMg: canCalculateByMg,\r\n };\r\n\r\n return service;\r\n\r\n function allowsBsaAdjustment(drc, patientAgeInDays) {\r\n if(!drc) {\r\n return false;\r\n }\r\n\r\n patientAgeInDays = patientAgeInDays || 0;\r\n\r\n var result = drc.BodySurfaceAreaRequired ||\r\n (patientAgeInDays <= maxPediatricAgeInDays &&\r\n drc.WeightRequired &&\r\n canCalculateByMg(drc));\r\n\r\n return result;\r\n }\r\n\r\n function canCalculateByMg(drc) {\r\n var strengthUomAbbr = drc && drc.IngredientStrengthUomAbbr;\r\n\r\n if(!strengthUomAbbr) {\r\n return false;\r\n }\r\n\r\n var isMg = strengthUomAbbr.toLowerCase() === 'mg';\r\n return isMg;\r\n }\r\n\r\n function createWeightBasedMaxMinInformation(weightBasedDoseRange) {\r\n if(!weightBasedDoseRange) {\r\n return '';\r\n }\r\n\r\n var sb = StringBuilder.init();\r\n\r\n addDoseRange(sb, weightBasedDoseRange.LowDoseAmount, weightBasedDoseRange.LowDoseAmountUnits, weightBasedDoseRange.HighDoseAmount, weightBasedDoseRange.HighDoseAmountUnits);\r\n if (sb.Length > 0)\r\n {\r\n sb.AppendLine();\r\n }\r\n\r\n addDoseRange(sb, weightBasedDoseRange.LowDoseForm, weightBasedDoseRange.LowDoseFormUnits, weightBasedDoseRange.HighDoseForm, weightBasedDoseRange.HighDoseFormUnits);\r\n if (sb.Length > 0)\r\n {\r\n sb.AppendLine();\r\n }\r\n\r\n addNTEInfo(sb, weightBasedDoseRange.NTEAmount, weightBasedDoseRange.NTEAmountUnits);\r\n addNTEInfo(sb, weightBasedDoseRange.NTEForm, weightBasedDoseRange.NTEFormUnits);\r\n addSingleDoseNTEInfo(sb, weightBasedDoseRange.NTESingleDoseAmount, weightBasedDoseRange.NTESingleDoseAmountUnits);\r\n\r\n return sb.ToString();\r\n }\r\n\r\n function formatAgeInDays(ageInDays) {\r\n if(ageInDays < 60) {\r\n return numFormat(ageInDays / 7, '0') + ' weeks';\r\n }\r\n if(ageInDays < 730) {\r\n return numFormat(ageInDays / 30.5, '0') + ' months';\r\n }\r\n return numFormat(ageInDays / 365, '0') + ' years';\r\n }\r\n\r\n function getWeightBasedSummary(weightBasedDosing) {\r\n var sb = StringBuilder.init();\r\n if (weightBasedDosing.minAge > 0) {\r\n sb.Append('Age ');\r\n sb.Append(formatAgeInDays(0));\r\n sb.Append(' - ');\r\n sb.AppendLine(formatAgeInDays(weightBasedDosing.minAge - 1));\r\n sb.AppendLine(' Manual Input Required');\r\n }\r\n weightBasedDosing.overrides.forEach(function(doseRange) {\r\n sb.AppendLine();\r\n sb.Append('Age ');\r\n sb.Append(formatAgeInDays(doseRange.minAge));\r\n sb.Append(' - ');\r\n sb.AppendLine(formatAgeInDays(doseRange.maxAge));\r\n sb.Append(' ');\r\n sb.Append(doseRange.overrideDosingQuantity ? doseRange.overrideDosingQuantity : weightBasedDosing.defaultDosingQuantity);\r\n sb.Append(' ');\r\n sb.Append(weightBasedDosing.unitDescription);\r\n\r\n var maxDose = doseRange.overrideMaximumDoseQuantity ? doseRange.overrideMaximumDoseQuantity : weightBasedDosing.defaultMaximumDoseQuantity;\r\n if (maxDose) {\r\n sb.AppendLine();\r\n sb.Append(' Maximum Dose ');\r\n sb.Append(maxDose);\r\n sb.Append(' ');\r\n sb.Append(weightBasedDosing.maxUnitDescription);\r\n }\r\n sb.AppendLine();\r\n });\r\n sb.AppendLine();\r\n sb.Append('Age ');\r\n sb.Append(formatAgeInDays(weightBasedDosing.maxAge + 1));\r\n sb.AppendLine(' and older');\r\n sb.Append(' Manual Input Required');\r\n return sb.ToString();\r\n }\r\n\r\n function mapVariableDosingFromDto(variableDosingDto) {\r\n if(!variableDosingDto) return null;\r\n var variableDosing = {\r\n isDisabled: false,\r\n minAge: variableDosingDto.MinAgeInDays,\r\n maxAge: variableDosingDto.MaxAgeInDays,\r\n defaultDosingQuantity: variableDosingDto.DefaultDosingQuantity,\r\n defaultMaximumDoseQuantity: variableDosingDto.DefaultMaximumDoseQuantity,\r\n variableDosingTypeId: variableDosingDto.VariableDosingTypeId,\r\n overrides: _.map(variableDosingDto.Overrides, mapOverrideFromDto),\r\n calculationErrors: variableDosingDto.CalculationErrors,\r\n };\r\n var processedDosingType = processDosingType(variableDosing.variableDosingTypeId);\r\n variableDosing.unitDescription = processedDosingType.dosingUnits;\r\n variableDosing.maxUnitDescription = processedDosingType.maxDoseUnits;\r\n variableDosing.summary = getWeightBasedSummary(variableDosing);\r\n return variableDosing;\r\n\r\n function mapOverrideFromDto(override) {\r\n return {\r\n minAge: override.MinAgeInDays,\r\n maxAge: override.MaxAgeInDays,\r\n overrideDosingQuantity: override.OverrideDosingQuantity,\r\n overrideMaximumDoseQuantity: override.OverrideMaximumDoseQuantity,\r\n };\r\n }\r\n }\r\n\r\n function mapVariableDosingToDto(variableDosing) {\r\n if (!variableDosing || variableDosing.isDisabled) return null;\r\n return {\r\n DefaultDosingQuantity: variableDosing.defaultDosingQuantity,\r\n DefaultMaximumDoseQuantity: variableDosing.defaultMaximumDoseQuantity,\r\n MaxAgeInDays: variableDosing.maxAge,\r\n MinAgeInDays: variableDosing.minAge,\r\n Overrides: _.map(variableDosing.overrides, mapOverrideToDto),\r\n VariableDosingTypeId: variableDosing.variableDosingTypeId,\r\n };\r\n\r\n function mapOverrideToDto(override) {\r\n return {\r\n MaxAgeInDays: override.maxAge,\r\n MinAgeInDays: override.minAge,\r\n OverrideDosingQuantity: override.overrideDosingQuantity,\r\n OverrideMaximumDoseQuantity: override.overrideMaximumDoseQuantity,\r\n };\r\n }\r\n }\r\n\r\n function processDoseRanges(variableDoseRanges) {\r\n var weightBasedDoseRanges = variableDoseRanges.WeightBasedDoseRanges || [];\r\n var minAge = 365;\r\n var maxAge = 0;\r\n var variableDosingTypeId;\r\n\r\n weightBasedDoseRanges.forEach(function(doseRange) {\r\n var matches = doseRange.MaxMinInformation && doseRange.MaxMinInformation.match(/\\r\\n/g);\r\n var maxMinInformationRows = (matches || []).length + 1;\r\n doseRange.maxMinInformationRows = maxMinInformationRows;\r\n\r\n if (doseRange.MinAgeInDays < minAge) {\r\n minAge = doseRange.MinAgeInDays;\r\n }\r\n if (doseRange.MaxAgeInDays > maxAge) {\r\n maxAge = doseRange.MaxAgeInDays;\r\n }\r\n variableDosingTypeId = doseRange.VariableDosingTypeId;\r\n });\r\n\r\n var processedDosingType = processDosingType(variableDosingTypeId);\r\n\r\n return {\r\n weightBasedDoseRanges: weightBasedDoseRanges,\r\n dosingUnits: processedDosingType.dosingUnits,\r\n maxAge: maxAge,\r\n maxDoseUnits: processedDosingType.maxDoseUnits,\r\n minAge: minAge,\r\n variableDosingTypeId: variableDosingTypeId,\r\n };\r\n }\r\n\r\n function processDosingType(variableDosingTypeId) {\r\n var dosingUnits;\r\n var maxDoseUnits;\r\n\r\n switch(variableDosingTypeId) {\r\n case SystemGuid.DosingCalculatorUnitGPerKgPerDay: {\r\n dosingUnits = 'g/kg/day';\r\n maxDoseUnits = 'g';\r\n break;\r\n }\r\n case SystemGuid.DosingCalculatorUnitMcgPerKgPerDay: {\r\n dosingUnits = 'mcg/kg/day';\r\n maxDoseUnits = 'mcg';\r\n break;\r\n }\r\n case SystemGuid.DosingCalculatorUnitMgPerKgPerDay: {\r\n dosingUnits = 'mg/kg/day';\r\n maxDoseUnits = 'mg';\r\n break;\r\n }\r\n case SystemGuid.DosingCalculatorUnitMlPerKgPerDay: {\r\n dosingUnits = 'mL/kg/day';\r\n maxDoseUnits = 'mL';\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n dosingUnits: dosingUnits,\r\n maxDoseUnits: maxDoseUnits,\r\n };\r\n }\r\n\r\n // this summary copied from PRM\r\n /// \r\n /// Returns >max/min warning message.\r\n /// \r\n /// amount is the dose in either mg or ml\r\n /// number of times taken a day\r\n /// the duration in number days\r\n /// found NDD_DoseRangeChecking\r\n /// max/min warning message\r\n function getMaxMinWarningMsg(drc, amount, frequencyPerDay, durationOfTherapyInDays) {\r\n if (!drc) {\r\n return '';\r\n }\r\n\r\n if(drc.ErrorMsg && -1 === drc.ErrorMsg.indexOf('there is no dosing information supplied for this patient')) {\r\n return drc.ErrorMsg;\r\n }\r\n\r\n amount = amount || 0;\r\n frequencyPerDay = frequencyPerDay || 0;\r\n durationOfTherapyInDays = durationOfTherapyInDays || 0;\r\n\r\n var dailyDose = dailyDosing(drc, amount, frequencyPerDay);\r\n\r\n if (drc.AdjustedLowDose > 0 && dailyDose < drc.AdjustedLowDose) {\r\n return 'The dosing is less than the recommended daily dosing; ' + fdbDosingInformation(drc);\r\n }\r\n else if (drc.AdjustedHighDose > 0 && drc.AdjustedMaximumSingleDose > 0 &&\r\n dailyDose > drc.AdjustedHighDose && dailyDose < drc.AdjustedMaximumSingleDose) {\r\n return 'The dosing is greater than the recommended daily dosing; ' + fdbDosingInformation(drc);\r\n }\r\n else if (drc.AdjustedHighDose > 0 && dailyDose > drc.AdjustedHighDose) {\r\n return 'The dosing is greater than the recommended daily dosing; ' + fdbDosingInformation(drc);\r\n }\r\n else if ((drc.AdjustedMaximumDosePerDay > 0 && dailyDose > drc.AdjustedMaximumDosePerDay) ||\r\n (drc.AdjustedNteAmountPerSingleDose > 0 && dailyDose > drc.AdjustedNteAmountPerSingleDose)) {\r\n return 'The dosing is greater than the recommended maximum single dose; ' + fdbDosingInformation(drc);\r\n }\r\n else if (drc.LowFrequency > 0 && drc.LowFrequency > frequencyPerDay) {\r\n // DRCM Warning Messages #8\r\n return 'Prescribed frequency of administration per day is less than the recommended minimum frequency of administration range for the drug. Please evaluate frequency.';\r\n }\r\n else if (drc.HighFrequency > 0 && frequencyPerDay > drc.HighFrequency) {\r\n // DRCM Warning Messages #9\r\n return 'Prescribed frequency of administration per day is greater than the recommended maximum frequency of administration for the drug. Please evaluate frequency.';\r\n }\r\n else if (drc.LowDuration > 0 && durationOfTherapyInDays < drc.LowDuration) {\r\n // DRCM Warning Messages #10\r\n return 'Prescribed duration is less than the recommended low duration for the drug.';\r\n }\r\n else if (drc.HighDuration > 0 && durationOfTherapyInDays > drc.HighDuration){\r\n // DRCM Warning Messages #11\r\n return 'Prescribed duration is greater than the highest recommended duration for the drug.';\r\n }\r\n\r\n return '';\r\n }\r\n\r\n function createMaxMinInformation(drc, includeErrorMsg) {\r\n if(!drc) {\r\n return '';\r\n }\r\n\r\n var sb = StringBuilder.init();\r\n\r\n if (includeErrorMsg && drc.ErrorMsg && (drc.ErrorMsg.length > 0)) {\r\n sb.AppendLine(drc.ErrorMsg);\r\n sb.AppendLine();\r\n sb.AppendLine();\r\n }\r\n\r\n var doseLow = 0;\r\n var doseHigh = 0;\r\n var doseFormLow = 0;\r\n var doseFormHigh = 0;\r\n\r\n var doseUnit = '';\r\n var doseResult = getHighLowDose(drc);\r\n doseLow = doseResult.doseLow;\r\n doseHigh = doseResult.doseHigh;\r\n\r\n var formDoseResult = getHighLowFormDose(drc);\r\n doseFormLow = formDoseResult.doseFormLow;\r\n doseFormHigh = formDoseResult.doseFormHigh;\r\n\r\n if (doseLow > 0 && doseHigh > 0) {\r\n\r\n sb.Append(fdbDosingInformation(drc));\r\n sb.AppendLine();\r\n sb.AppendLine();\r\n\r\n if (drc.RangeLowDoseUnits) {\r\n doseUnit = drc.RangeLowDoseUnits;\r\n doseUnit = doseUnitOnly(doseUnit);\r\n }\r\n else {\r\n doseUnit = '';\r\n }\r\n\r\n sb.Append('dose ');\r\n sb.Append(numFormat(doseLow, '[0].[00]'));\r\n sb.Append(' ');\r\n sb.Append(doseUnit);\r\n\r\n if (drc.RangeHighDoseUnits) {\r\n doseUnit = drc.RangeHighDoseUnits;\r\n doseUnit = doseUnitOnly(doseUnit);\r\n }\r\n else {\r\n doseUnit = '';\r\n }\r\n\r\n sb.Append(' to ');\r\n sb.Append(numFormat(doseHigh, '[0].[00]'));\r\n sb.Append(' ');\r\n sb.Append(doseUnit);\r\n if (drc.WeightRequired) {\r\n sb.Append(AdjustedForWeight);\r\n }\r\n if (drc.BodySurfaceAreaRequired) {\r\n sb.Append(AdjustedForBodySurfaceArea);\r\n }\r\n }\r\n\r\n if (doseFormLow > 0 && doseFormHigh > 0) {\r\n if (drc.RangeLowDoseFormUnits) {\r\n doseUnit = drc.RangeLowDoseFormUnits;\r\n doseUnit = doseUnitOnly(doseUnit);\r\n }\r\n else {\r\n doseUnit = '';\r\n }\r\n\r\n sb.AppendLine();\r\n sb.Append('dose form ');\r\n sb.Append(numFormat(doseFormLow, '[0].[00]'));\r\n sb.Append(' ');\r\n sb.Append(doseUnit);\r\n\r\n if (drc.RangeHighDoseFormUnits) {\r\n doseUnit = drc.RangeHighDoseFormUnits;\r\n doseUnit = doseUnitOnly(doseUnit);\r\n }\r\n else {\r\n doseUnit = '';\r\n }\r\n\r\n sb.Append(' to ');\r\n sb.Append(numFormat(doseFormHigh, '[0].[00]'));\r\n sb.Append(' ');\r\n sb.Append(doseUnit);\r\n\r\n if (drc.WeightRequired) {\r\n sb.Append(AdjustedForWeight);\r\n }\r\n if (drc.BodySurfaceAreaRequired) {\r\n sb.Append(AdjustedForBodySurfaceArea);\r\n }\r\n }\r\n\r\n return sb.ToString();\r\n }\r\n\r\n function calculateDosingInformation(drc, frequencyPerDay, mg) {\r\n if(!drc) {\r\n return '';\r\n }\r\n\r\n frequencyPerDay = frequencyPerDay || 0;\r\n mg = mg || 0;\r\n\r\n if (mg > 0) {\r\n if (isMilliliterUnitVolume(drc)) {\r\n return calculateMLFromMGDosing(drc, frequencyPerDay, mg);\r\n }\r\n else {\r\n return calculateMGDosing(drc, mg);\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n function isMilliliterUnitVolume(drc) {\r\n if(!drc) {\r\n return false;\r\n }\r\n\r\n if(drc.IngredientVolumeUomAbbr &&\r\n drc.IngredientVolumeUomAbbr.toLowerCase() === 'ml' &&\r\n drc.IngredientVolume > 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function dailyDosing(drc, amount, frequencyPerDay) {\r\n if(!drc) {\r\n return 0;\r\n }\r\n amount = amount || 0;\r\n frequencyPerDay = frequencyPerDay || 0;\r\n\r\n var dosingValue = 0;\r\n var dosePerDay = multiply(amount, frequencyPerDay);\r\n var strength = 0;\r\n if (drc.IngredientStrength >= 0) {\r\n strength = drc.IngredientStrength;\r\n }\r\n if (isMilliliterUnitVolume(drc)) {\r\n dosingValue = multiply(strength, divide(amount, drc.IngredientVolume));\r\n }\r\n else {\r\n dosingValue = multiply(strength, dosePerDay);\r\n }\r\n\r\n return dosingValue;\r\n }\r\n\r\n function addDoseRange(sb, low, lowUnits, high, highUnits) {\r\n if(!sb) {\r\n return;\r\n }\r\n\r\n if (low > 0 && high > 0) {\r\n sb.Append(numFormat(low, '0.00'));\r\n\r\n if (lowUnits) {\r\n sb.Append(' ');\r\n sb.Append(lowUnits);\r\n }\r\n sb.Append(' - ');\r\n sb.Append(numFormat(high, '0.00'));\r\n\r\n if (highUnits) {\r\n sb.Append(' ');\r\n sb.Append(highUnits);\r\n }\r\n }\r\n }\r\n\r\n function addNTEInfo(sb, nte, nteUnits) {\r\n if(!sb) {\r\n return;\r\n }\r\n\r\n if (nte > 0) {\r\n sb.Append('NTE: ');\r\n sb.Append(numFormat(nte, '0.00'));\r\n if (nteUnits) {\r\n sb.Append(' ');\r\n sb.Append(nteUnits);\r\n }\r\n sb.AppendLine();\r\n }\r\n }\r\n\r\n function addSingleDoseNTEInfo(sb, nte, nteUnits) {\r\n if(!sb) {\r\n return;\r\n }\r\n\r\n if (nte > 0) {\r\n sb.Append('Single Dose NTE: ');\r\n sb.Append(numFormat(nte, '0.00'));\r\n if (nteUnits) {\r\n sb.Append(' ');\r\n sb.Append(nteUnits);\r\n }\r\n sb.AppendLine();\r\n }\r\n }\r\n\r\n function doseFormRange(drc, sb) {\r\n if(!drc || !sb) {\r\n return;\r\n }\r\n\r\n addDoseRange(sb, drc.RangeLowDoseForm, drc.RangeLowDoseFormUnits, drc.RangeHighDoseForm, drc.RangeHighDoseFormUnits);\r\n }\r\n\r\n function doseRange(drc, sb) {\r\n if(!drc || !sb) {\r\n return;\r\n }\r\n\r\n addDoseRange(sb, drc.RangeLowDose, drc.RangeLowDoseUnits, drc.RangeHighDose, drc.RangeHighDoseUnits);\r\n }\r\n\r\n function fdbDosingInformation(drc) {\r\n var sb = StringBuilder.init();\r\n\r\n if (isMilliliterUnitVolume(drc)) {\r\n doseFormRange(drc, sb);\r\n if (sb.Length > 0) {\r\n sb.Append('; ');\r\n }\r\n doseRange(drc, sb);\r\n }\r\n else {\r\n doseRange(drc, sb);\r\n if (sb.Length > 0) {\r\n sb.Append('; ');\r\n }\r\n doseFormRange(drc, sb);\r\n }\r\n\r\n return sb.ToString();\r\n }\r\n\r\n /// \r\n /// This method gets the doselow and the dosehigh values from the dosing row and corrects\r\n /// the doselow and dosehigh values by the either the patient's weight or body surface area\r\n /// as required.\r\n /// \r\n /// NDD_DoseRangeChecking row selected for the patient's age\r\n /// returns the the corrected doseLow value\r\n /// returns the the corrected doseHigh value\r\n function getHighLowDose(drc) {\r\n var result = {\r\n doseLow: 0,\r\n doseHigh: 0,\r\n };\r\n\r\n if(!drc) {\r\n return result;\r\n }\r\n\r\n if (drc.RangeLowDose >= 0 && drc.RangeHighDose >= 0) {\r\n result.doseLow = drc.LowDose;\r\n result.doseHigh = drc.HighDose;\r\n }\r\n\r\n if (drc.WeightRequired && drc.WeightKg >= 0) {\r\n result.doseLow = multiply(result.doseLow, Math.max(1, drc.WeightKg));\r\n result.doseHigh = multiply(result.doseHigh, Math.max(1, drc.WeightKg));\r\n }\r\n\r\n if (drc.BodySurfaceAreaRequired && drc.BodySurfaceArea >= 0) {\r\n var bsa = drc.BodySurfaceArea;\r\n result.doseLow = divide(multiply(result.doseLow, bsa), 1.73);\r\n result.doseHigh = divide(multiply(result.doseHigh, bsa), 1.73);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /// \r\n /// This method gets the doseformlow and the doseformhigh values from the dosing row \r\n /// and corrects the doseformlow and doseformhigh values by the either the patient's \r\n /// weight or body surface area as required.\r\n /// \r\n /// NDD_DoseRangeChecking row selected for the patient's age\r\n /// returns the the corrected doseFormLow value\r\n /// returns the the corrected doseFormHigh value\r\n function getHighLowFormDose(drc) {\r\n var result = {\r\n doseFormLow: 0,\r\n doseFormHigh: 0,\r\n };\r\n\r\n if(!drc) {\r\n return result;\r\n }\r\n\r\n if (drc.RangeLowDoseForm >= 0 && drc.RangeHighDoseForm >= 0) {\r\n result.doseFormLow = drc.RangeLowDoseForm;\r\n result.doseFormHigh = drc.RangeHighDoseForm;\r\n }\r\n\r\n if (drc.WeightRequired && drc.WeightKg >= 0) {\r\n result.doseFormLow = multiply(result.doseFormLow, Math.max(1, drc.WeightKg));\r\n result.doseFormHigh = multiply(result.doseFormHigh, Math.max(1, drc.WeightKg));\r\n }\r\n\r\n if (drc.BodySurfaceAreaRequired && drc.BodySurfaceArea >= 0) {\r\n var bsa = drc.BodySurfaceArea;\r\n result.doseFormLow = divide(multiply(result.doseFormLow, bsa), 1.73);\r\n result.doseFormHigh = divide(multiply(result.doseFormHigh, bsa), 1.73);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function doseUnitOnly(doseUnit) {\r\n if(!doseUnit) {\r\n return doseUnit;\r\n }\r\n\r\n var len = doseUnit.indexOf('/');\r\n\r\n if (len > 0) {\r\n doseUnit = doseUnit.substr(0, len);\r\n }\r\n\r\n return doseUnit;\r\n }\r\n\r\n function dosingUnitMilliliter(drc, frequencyPerDay, dose) {\r\n var sb = StringBuilder.init();\r\n frequencyPerDay = frequencyPerDay || 0;\r\n dose = dose || 0;\r\n\r\n if (isMilliliterUnitVolume(drc)) {\r\n var timesPerDay = frequencyPerDay;\r\n\r\n if (frequencyPerDay === 0) {\r\n sb.AppendLine('Cannot calculate a single dose without a frequency.');\r\n timesPerDay = 1;\r\n }\r\n\r\n // do milliliter per day\r\n var convertDose = _.round(divide(dose, timesPerDay), 1);\r\n if (convertDose !== 0) {\r\n sb.AppendLine();\r\n sb.Append('Milliliter(s) ');\r\n\r\n if (frequencyPerDay > 0) {\r\n sb.Append(singleDose);\r\n sb.Append(numFormat(convertDose, '[0].[0]'));\r\n }\r\n else {\r\n sb.Append(perDay);\r\n sb.Append(numFormat(multiply(convertDose, timesPerDay), '[0].[0]'));\r\n }\r\n }\r\n }\r\n\r\n return sb.ToString();\r\n }\r\n\r\n function formatEach(dose) {\r\n dose = dose || 0;\r\n\r\n var result = '';\r\n\r\n var remainder = subtract(dose, Math.trunc(dose));\r\n\r\n if (remainder > 0.499 && remainder < 0.999) {\r\n result = ' 1/2';\r\n }\r\n\r\n result = numFormat(Math.trunc(dose), '[0]') + result;\r\n return result;\r\n }\r\n\r\n function dosingUnitMilligram(mg, strength) {\r\n mg = mg || 0;\r\n strength = strength || 0;\r\n\r\n var sb = StringBuilder.init();\r\n\r\n // do milligram per dose\r\n var convertDose = Math.floor(mg);\r\n if (convertDose !== 0) {\r\n sb.Append('Milligram(s) ');\r\n sb.Append(singleDose);\r\n sb.Append(numFormat(convertDose, '[0]'));\r\n }\r\n\r\n // do tables per dose\r\n convertDose = _.round(mg, 3);\r\n var formatted = formatEach(divide(convertDose, strength));\r\n if (formatted) {\r\n sb.AppendLine();\r\n sb.Append('Each ');\r\n sb.Append(singleDose);\r\n sb.Append(formatted);\r\n }\r\n\r\n return sb.ToString();\r\n }\r\n\r\n function calculateMLFromMGDosing(drc, frequencyPerDay, mg) {\r\n if(!drc) {\r\n return '';\r\n }\r\n\r\n frequencyPerDay = frequencyPerDay || 0;\r\n mg = mg || 0;\r\n\r\n var sb = StringBuilder.init();\r\n\r\n if (drc.WeightRequired && drc.WeightKg >= 0) {\r\n sb.Append(numFormat(multiply(mg, drc.WeightKg), '0.0'));\r\n sb.Append(' mg ');\r\n sb.AppendLine(AdjustedForWeight);\r\n sb.AppendLine();\r\n }\r\n\r\n if (mg > 0 &&\r\n drc.IngredientVolume > 0 &&\r\n drc.IngredientStrength > 0) {\r\n\r\n var ml = divide(drc.IngredientVolume, drc.IngredientStrength);\r\n var totalML = 0;\r\n\r\n if (drc.WeightRequired && drc.WeightKg >= 0) {\r\n totalML = multiply(ml, mg, drc.WeightKg);\r\n }\r\n else {\r\n totalML = multiply(ml, mg);\r\n }\r\n sb.Append(dosingUnitMilliliter(drc, frequencyPerDay, totalML));\r\n\r\n // add calculation information\r\n sb.AppendLine();\r\n sb.Append('Daily total ml: ');\r\n sb.Append(numFormat(totalML, '0.0'));\r\n if (drc.WeightRequired) {\r\n sb.Append(' = ((');\r\n }\r\n else {\r\n sb.Append(' = (');\r\n }\r\n\r\n sb.Append(numFormat(ml, '0.0[000]'));\r\n sb.Append(' (ml per mg) * ');\r\n sb.Append(numFormat(mg, '0.0'));\r\n\r\n if (drc.WeightRequired) {\r\n sb.Append(') * ');\r\n sb.Append(numFormat(drc.WeightKg || 0, MetricWeightMask));\r\n sb.Append('(kg))');\r\n }\r\n else {\r\n sb.Append(')');\r\n }\r\n }\r\n\r\n return sb.ToString();\r\n }\r\n\r\n function calculateMGDosing(drc, mg) {\r\n if(!drc) {\r\n return '';\r\n }\r\n\r\n mg = mg || 0;\r\n\r\n var sb = StringBuilder.init();\r\n\r\n var bsa = 0;\r\n var adjustedMG = mg;\r\n var strength = 0;\r\n if (drc.IngredientStrength >= 0) {\r\n strength = drc.IngredientStrength;\r\n }\r\n\r\n if (drc.WeightRequired) {\r\n adjustedMG = multiply(mg, (drc.WeightKg || 0));\r\n sb.Append(numFormat(adjustedMG, '0.0'));\r\n sb.Append(' mg ');\r\n sb.AppendLine(AdjustedForWeight);\r\n sb.AppendLine();\r\n }\r\n else if (drc.BodySurfaceAreaRequired && drc.BodySurfaceArea >= 0) {\r\n bsa = drc.BodySurfaceArea;\r\n adjustedMG = divide(multiply(bsa, mg), 1.73);\r\n sb.Append(numFormat(adjustedMG, '0.0'));\r\n sb.Append(' mg ');\r\n sb.AppendLine(AdjustedForBodySurfaceArea);\r\n sb.AppendLine();\r\n }\r\n\r\n sb.Append(dosingUnitMilligram(adjustedMG, strength));\r\n\r\n // added calculation information\r\n if (drc.WeightRequired) {\r\n sb.AppendLine();\r\n sb.AppendLine();\r\n sb.Append('Single dose mg: ');\r\n sb.Append(numFormat(adjustedMG, '0.0'));\r\n sb.Append(' = (');\r\n sb.Append(numFormat(mg, '0.0'));\r\n sb.Append('(mg) * ');\r\n sb.Append(numFormat(drc.WeightKg || 0, MetricWeightMask));\r\n sb.Append('(kg))');\r\n }\r\n else if (drc.BodySurfaceAreaRequired) {\r\n // add calculation information\r\n sb.AppendLine();\r\n sb.AppendLine();\r\n sb.Append('Single pediatric dose mg: ');\r\n sb.Append(numFormat(adjustedMG, '0.0'));\r\n sb.Append(' = ((');\r\n sb.Append(numFormat(bsa, '0.0[000]'));\r\n sb.Append(' (bsa m2) * ');\r\n sb.Append(numFormat(mg, '0.0'));\r\n sb.Append(' (adult dose mg)');\r\n sb.AppendLine(') / 1.73)');\r\n sb.AppendLine();\r\n sb.Append('Body Surface Area is calculated using the \\'DuBois and DuBois 2\\' formula.');\r\n }\r\n\r\n return sb.ToString();\r\n }\r\n\r\n function multiply() {\r\n var result = NumUtil.multiply.apply(null, arguments);\r\n return result;\r\n }\r\n\r\n function divide(num1, num2) {\r\n var result = NumUtil.divide(num1, num2);\r\n return result;\r\n }\r\n\r\n function subtract(num1, num2) {\r\n var result = NumUtil.subtract(num1, num2);\r\n return result;\r\n }\r\n\r\n function numFormat(num, format) {\r\n var result = NumUtil.format(num, format);\r\n return result;\r\n }\r\n }\r\n\r\n})(window.angular, window.Math);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-legacy-common').factory('ErrorService', [\r\n '_',\r\n 'aprgettext',\r\n 'RequestTypes',\r\n 'toaster',\r\n ErrorService,\r\n ]);\r\n\r\n function ErrorService(\r\n _,\r\n gettext,\r\n RequestTypes,\r\n toaster\r\n ) {\r\n\r\n return {\r\n convertToErrorMessages: convertToErrorMessages,\r\n displayErrorMessages: displayErrorMessages,\r\n addHttpErrorToScope: addHttpErrorToScope,\r\n removeHttpErrorFromScope: removeHttpErrorFromScope,\r\n };\r\n\r\n function convertToErrorMessages(error) {\r\n var errors = [];\r\n\r\n if (!error) {\r\n errors.push(getGenericError());\r\n return errors;\r\n }\r\n\r\n if(_.isString(error)) {\r\n errors.push(error);\r\n return errors;\r\n }\r\n\r\n var modelState = (error.data && error.data.ModelState) || error.ModelState;\r\n if (modelState) {\r\n _(modelState)\r\n .flatMap(function(value) {\r\n return value || [];\r\n })\r\n .forEach(function (err) {\r\n errors.push(gettext(err));\r\n });\r\n\r\n if (errors.length) {\r\n return errors;\r\n }\r\n }\r\n\r\n var validationResult = (error.data && error.data.ValidationResult) || error.ValidationResult;\r\n if (validationResult && !validationResult.IsValid) {\r\n _(validationResult.Errors)\r\n .forEach(function (err) {\r\n errors.push(gettext(err.ErrorMessage));\r\n });\r\n\r\n if (errors.length) {\r\n return errors;\r\n }\r\n }\r\n\r\n if (error.status && error.statusText) {\r\n errors.push(gettext('An error has occurred. Status: ' + error.status + ': ' + error.statusText));\r\n }\r\n else {\r\n var genericError = getGenericError();\r\n if(error.Message) {\r\n genericError += ' ' + error.Message;\r\n }\r\n errors.push(genericError);\r\n }\r\n return errors;\r\n }\r\n\r\n function displayErrorMessages(error, asHtml) {\r\n var errors = _.isArray(error) ? error : convertToErrorMessages(error);\r\n\r\n errors.forEach(function (err) {\r\n toaster.pop({\r\n type: 'error',\r\n title: '',\r\n body: err,\r\n bodyOutputType: asHtml ? 'trustedHtml' : '',\r\n });\r\n });\r\n\r\n return errors;\r\n }\r\n\r\n function getGenericError() {\r\n return gettext('An error has occurred and the process cannot be completed.');\r\n }\r\n\r\n function addHttpErrorToScope(scope, httpResponse, messages, type) {\r\n var error = { type: type || RequestTypes.default };\r\n var key = 'is' + httpResponse.status;\r\n error[key] = true;\r\n error.reason = messages && messages[key];\r\n\r\n if (httpResponse.status === 403) {\r\n error.responseMessage = httpResponse.headers()['reason-phrase'];\r\n }\r\n else {\r\n error.unhandled = true;\r\n }\r\n\r\n error.reason = error.reason || error.responseMessage;\r\n\r\n scope.httpError = error;\r\n\r\n return error;\r\n }\r\n\r\n function removeHttpErrorFromScope(scope, type) {\r\n //only remove it if on this specific scope. This avoids nulling in higher level scopes\r\n //only remove matching types of httpError's\r\n if (scope.hasOwnProperty('httpError') && scope.httpError && ((!type && scope.httpError.type === RequestTypes.default) || scope.httpError.type === type)) {\r\n scope.httpError = null;\r\n }\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-legacy-common').factory(\r\n 'LanguageFactory', ['gettextCatalog', 'LocalStorageRepository', 'TranslateService', function LanguageFactory(gettextCatalog, LocalStorageRepository, TranslateService) {\r\n\r\n 'use strict';\r\n\r\n var currentLang = {code: gettextCatalog.currentLanguage};\r\n var langOptions = [\r\n {\r\n name: 'English',\r\n id: 'en_US'\r\n },\r\n {\r\n name: 'Spanish',\r\n id: 'es_MX'\r\n }\r\n ];\r\n\r\n //sometimes the language has a '-' in it which doesnt match our language formats with '_'\r\n function normalizeToUnderscore(language) {\r\n if (language) {\r\n return language.replace('-', '_');\r\n }\r\n return language;\r\n }\r\n\r\n function updateCurrentLangCode(code) {\r\n gettextCatalog.currentLanguage = normalizeToUnderscore(code);\r\n currentLang.code = code;\r\n TranslateService.use(currentLang.code);\r\n }\r\n\r\n function setLang(language) {\r\n updateCurrentLangCode(language);\r\n LocalStorageRepository.setLang(gettextCatalog.currentLanguage);\r\n }\r\n\r\n function getLang() {\r\n var currentLangCode = (currentLang.code) ? normalizeToUnderscore(currentLang.code) : 'en_US';\r\n updateCurrentLangCode(currentLangCode);\r\n return currentLang;\r\n }\r\n\r\n function getActiveLanguage(){\r\n return _.find(langOptions, {id : getLang().code});\r\n }\r\n\r\n return {\r\n setLang: setLang,\r\n getLang: getLang,\r\n getLangOptions: langOptions,\r\n getActiveLanguage: getActiveLanguage\r\n };\r\n }]);\r\n","angular.module('aprima-legacy-common').\r\n factory('ListNavigationService', ['$log', '$filter', 'Bridge',\r\n function ($log, $filter, Bridge) {\r\n 'use strict';\r\n\r\n var cachedEnumerators = [];\r\n var activeItems = [];\r\n\r\n var registerActiveItemForList = function (listType, itemId, settings, $scope) {\r\n var enumerator = this.getEnumerator(listType);\r\n\r\n if(enumerator){\r\n enumerator.setActiveItemById(itemId);\r\n this.hydrateListNavigationProperties(listType, settings);\r\n this.setAsBridgeHandler(listType, $scope);\r\n }\r\n\r\n activeItems[listType] = itemId;\r\n };\r\n\r\n var deregisterActiveItemForList = function (listType, itemId) {\r\n if (activeItems[listType] && activeItems[listType] === itemId) {\r\n activeItems[listType] = null;\r\n }\r\n };\r\n\r\n //orderPredicate can be prefixed with a '+' or '-' to change the direction of the sort. '+' is ascending and the default.\r\n //'-' is descending\r\n var buildAndCacheEnumerator = function (enumeratorName, list, orderPredicate, transitionFunction) {\r\n var filter = $filter('orderBy');\r\n\r\n var enumerator = this.buildEnumerator(filter(list, orderPredicate), transitionFunction);\r\n\r\n cachedEnumerators[enumeratorName] = enumerator;\r\n\r\n if (activeItems[enumeratorName]) {\r\n enumerator.setActiveItemById(activeItems[enumeratorName]);\r\n }\r\n\r\n return enumerator;\r\n };\r\n\r\n var setActiveItemByIdForEnumerator = function (enumeratorName, id) {\r\n var enumerator = cachedEnumerators[enumeratorName];\r\n if (enumerator) {\r\n enumerator.setActiveItemById(id);\r\n }\r\n };\r\n\r\n var getEnumerator = function (enumeratorName) {\r\n return cachedEnumerators[enumeratorName];\r\n };\r\n\r\n var hydrateListNavigationProperties = function (enumeratorName, settings) {\r\n var enumerator = cachedEnumerators[enumeratorName];\r\n\r\n if (enumerator) {\r\n angular.forEach(settings.phone.modes, function (value) {\r\n angular.forEach(value.headers, function (headerValue) {\r\n if (headerValue.requiresNavSettings) {\r\n headerValue.listNavigationProperties = enumerator.getNavStatus();\r\n }\r\n });\r\n });\r\n\r\n angular.forEach(settings.tablet.modes, function (value) {\r\n angular.forEach(value.headers, function (headerValue) {\r\n if (headerValue.requiresNavSettings) {\r\n headerValue.listNavigationProperties = enumerator.getNavStatus();\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n var setAsBridgeHandler = function (enumeratorName, $scope) {\r\n var enumerator = cachedEnumerators[enumeratorName];\r\n\r\n if (enumerator) {\r\n Bridge.on('navigate-item', $scope, function (data) {\r\n switch (data.navigationType) {\r\n case 'next':\r\n enumerator.moveToNextItem();\r\n break;\r\n case 'previous':\r\n enumerator.moveToPreviousItem();\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n };\r\n\r\n var buildEnumerator = function (list, callbackFunction) {\r\n $log.info('enumerator built');\r\n\r\n var currentIndex = -1;\r\n\r\n var transitionFunction = function (item) {\r\n currentIndex = list.indexOf(item);\r\n\r\n if (callbackFunction) {\r\n callbackFunction(item);\r\n }\r\n };\r\n\r\n var next = function () {\r\n var lookupIndex;\r\n\r\n if (currentIndex !== -1) {\r\n if (currentIndex === (list.length - 1)) {\r\n return null;\r\n }\r\n else {\r\n lookupIndex = currentIndex + 1;\r\n }\r\n }\r\n else {\r\n if (list.length === 0) {\r\n return null;\r\n }\r\n lookupIndex = 0;\r\n }\r\n\r\n return list[lookupIndex];\r\n };\r\n\r\n var previous = function () {\r\n var lookupIndex;\r\n\r\n if (currentIndex !== -1) {\r\n if (currentIndex === 0) {\r\n return null;\r\n }\r\n else {\r\n lookupIndex = currentIndex - 1;\r\n }\r\n }\r\n else {\r\n if (list.length === 0) {\r\n return null;\r\n }\r\n\r\n lookupIndex = list.length - 1;\r\n }\r\n\r\n return list[lookupIndex];\r\n };\r\n\r\n var first = function () {\r\n if (list.length === 0) {\r\n return null;\r\n }\r\n\r\n return list[0];\r\n };\r\n\r\n var last = function () {\r\n if (list.length === 0) {\r\n return null;\r\n }\r\n\r\n return list[list.length - 1];\r\n };\r\n\r\n var moveToNextItem = function () {\r\n var next = this.next();\r\n\r\n if (next) {\r\n transitionFunction(next);\r\n }\r\n };\r\n\r\n var moveToPreviousItem = function () {\r\n var previous = this.previous();\r\n\r\n if (previous) {\r\n transitionFunction(previous);\r\n }\r\n };\r\n\r\n var moveToFirstItem = function () {\r\n transitionFunction(this.first());\r\n };\r\n\r\n var moveToLastItem = function () {\r\n transitionFunction(this.last());\r\n };\r\n\r\n var moveToItem = function (item) {\r\n var indexOf = list.indexOf(item);\r\n\r\n if (indexOf >= 0) {\r\n currentIndex = indexOf;\r\n transitionFunction(item);\r\n }\r\n else {\r\n throw new Exception('Cannot move to item as it does not exist in the list.');\r\n }\r\n };\r\n\r\n var setActiveItemById = function (id) {\r\n for (var i = 0; i <= list.length - 1; i++) {\r\n if (list[i].Id === id) {\r\n currentIndex = i;\r\n break;\r\n }\r\n }\r\n };\r\n\r\n var canGoNext = function () {\r\n return (currentIndex !== -1) && (currentIndex !== (list.length - 1));\r\n };\r\n\r\n var canGoPrevious = function () {\r\n return (currentIndex !== -1) && (currentIndex !== 0);\r\n };\r\n\r\n var getNavStatus = function () {\r\n return {\r\n canGoForward: this.canGoNext(),\r\n canGoBack: this.canGoPrevious()\r\n };\r\n };\r\n\r\n var currentItem = function () {\r\n if (currentIndex !== -1) {\r\n return list[currentIndex];\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n\r\n var toArray = function() {\r\n var oldIndex = currentIndex;\r\n var arr = [];\r\n currentIndex = 0;\r\n\r\n if(currentItem()) {\r\n arr.push(currentItem());\r\n }\r\n\r\n while(canGoNext()){\r\n arr.push(next());\r\n currentIndex++;\r\n }\r\n\r\n currentIndex = oldIndex;\r\n return arr;\r\n };\r\n\r\n return {\r\n next: next,\r\n previous: previous,\r\n first: first,\r\n last: last,\r\n moveToNextItem: moveToNextItem,\r\n moveToPreviousItem: moveToPreviousItem,\r\n moveToFirstItem: moveToFirstItem,\r\n moveToLastItem: moveToLastItem,\r\n moveToItem: moveToItem,\r\n canGoNext: canGoNext,\r\n canGoPrevious: canGoPrevious,\r\n getNavStatus: getNavStatus,\r\n setActiveItemById: setActiveItemById,\r\n currentItem: currentItem,\r\n toArray: toArray\r\n };\r\n };\r\n\r\n return {\r\n buildAndCacheEnumerator: buildAndCacheEnumerator,\r\n getEnumerator: getEnumerator,\r\n buildEnumerator: buildEnumerator,\r\n hydrateListNavigationProperties: hydrateListNavigationProperties,\r\n setAsBridgeHandler: setAsBridgeHandler,\r\n registerActiveItemForList: registerActiveItemForList,\r\n deregisterActiveItemForList: deregisterActiveItemForList,\r\n setActiveItemByIdForEnumerator: setActiveItemByIdForEnumerator\r\n };\r\n }]);","angular.module('aprima-legacy-common').factory('LocalStorageRepository',\r\n ['storage', '_', 'WebCommonStorageRepository',\r\n function (storage, _, WebCommonStorageRepository) {\r\n 'use strict';\r\n\r\n var trueRegex = /^true$/i;\r\n var falseRegex = /^false$/i;\r\n\r\n var overwritePropertiesAndSave = function (destinationGetter, source, storageKey) {\r\n var destination = destinationGetter() || {};\r\n\r\n destination = _.assign(destination, source);\r\n\r\n storage.set(storageKey, destination);\r\n };\r\n\r\n var defaultPropertiesAndSave = function (destinationGetter, source, storageKey) {\r\n var destination = destinationGetter() || {};\r\n\r\n destination = _.defaults(destination, source);\r\n\r\n storage.set(storageKey, destination);\r\n };\r\n\r\n function getPatientDashboardsKey(type) {\r\n var key = 'patientDashboardConfigurations';\r\n\r\n if(angular.isNumber(type)) {\r\n type = '' + type + 'cols';\r\n }\r\n\r\n if(type) {\r\n key += '.' + type;\r\n }\r\n return key;\r\n }\r\n\r\n return {\r\n\r\n clearAll: function () {\r\n WebCommonStorageRepository.clearAll();\r\n },\r\n\r\n getIsActiveDirectoryUser: function() {\r\n return storage.get('activeDirectoryUser');\r\n },\r\n \r\n setIsActiveDirectoryUser: function(value) {\r\n storage.set('activeDirectoryUser', value);\r\n },\r\n\r\n getClientID: function () {\r\n return WebCommonStorageRepository.getClientId();\r\n },\r\n\r\n setClientID: function (value) {\r\n WebCommonStorageRepository.setClientId(value);\r\n },\r\n\r\n getNotificationTimeout: function () {\r\n return storage.get('notificationTimeout');\r\n },\r\n\r\n setNotificationTimeout: function (value) {\r\n storage.set('notificationTimeout', value);\r\n },\r\n\r\n getClientURL: function () {\r\n return WebCommonStorageRepository.getClientUrl();\r\n },\r\n\r\n setClientURL: function (value) {\r\n WebCommonStorageRepository.setClientUrl(value);\r\n },\r\n\r\n getGatewayUrl: function () {\r\n return storage.get('gatewayUrl');\r\n },\r\n\r\n setGatewayUrl: function (value) {\r\n storage.set('gatewayUrl', value);\r\n },\r\n\r\n setJsonWebToken: function (jwt) {\r\n WebCommonStorageRepository.setJsonWebToken(jwt);\r\n },\r\n getJsonWebToken: function () {\r\n return WebCommonStorageRepository.getJsonWebToken();\r\n },\r\n\r\n removeJsonWebToken: function () {\r\n WebCommonStorageRepository.removeJsonWebToken();\r\n },\r\n\r\n setUserName: function (username) {\r\n storage.set('userName', username);\r\n },\r\n\r\n\r\n getUserName: function () {\r\n return storage.get('userName');\r\n },\r\n\r\n setBirthDate: function (birthDate) {\r\n storage.set('birthDate', birthDate);\r\n },\r\n\r\n getBirthDate: function () {\r\n return storage.get('birthDate');\r\n },\r\n\r\n setAccessCode: function (statementId) {\r\n storage.set('accessCode', statementId);\r\n },\r\n\r\n getAccessCode: function () {\r\n return storage.get('accessCode');\r\n },\r\n\r\n setUserFullName: function (name) {\r\n storage.set('userFullName', name);\r\n },\r\n\r\n getUserFullName: function () {\r\n return storage.get('userFullName');\r\n },\r\n\r\n removeUserName: function () {\r\n storage.remove('userName');\r\n },\r\n\r\n setUserID: function (userid) {\r\n WebCommonStorageRepository.setUserId(userid);\r\n },\r\n\r\n getUserID: function () {\r\n return WebCommonStorageRepository.getUserId();\r\n },\r\n\r\n getIsPatient: function () {\r\n return storage.get('isPatient');\r\n },\r\n\r\n setIsPatient: function (isPatient) {\r\n storage.set('isPatient', isPatient);\r\n },\r\n\r\n getSupportedFeatures: function () {\r\n return storage.get('apiSupportedFeatures');\r\n },\r\n removeUserID: function () {\r\n storage.remove('userId');\r\n },\r\n\r\n setLang: function (lang) {\r\n storage.set('lang', lang);\r\n },\r\n\r\n getLang: function () {\r\n var lang = storage.get('lang');\r\n return lang;\r\n },\r\n\r\n setDefaultSuperbillSubmissionMethod: function (methodId) {\r\n storage.set('superbillMethod', methodId);\r\n },\r\n\r\n getDefaultSuperbillSubmissionMethod: function() {\r\n return storage.get('superbillMethod');\r\n },\r\n\r\n setKey: function (key, value, keyType) {\r\n storage.set(key, value);\r\n\r\n if(keyType){\r\n var activeKeys = storage.get(keyType + 'keys');\r\n var keyDictionary;\r\n\r\n if(activeKeys){\r\n keyDictionary = activeKeys.split(',');\r\n }\r\n else{\r\n keyDictionary = [];\r\n }\r\n\r\n if(!_.includes(keyDictionary, key)){\r\n keyDictionary.push(key);\r\n storage.set(keyType + 'keys', keyDictionary.join(','));\r\n }\r\n }\r\n },\r\n\r\n getKey: function (key, keyType) {\r\n var k = storage.get(key);\r\n\r\n // This can be removed after 1 release with it in there. It just needs to be there to build up the initial list.\r\n if(keyType){\r\n var activeKeys = storage.get(keyType + 'keys');\r\n var keyDictionary;\r\n\r\n if(activeKeys){\r\n keyDictionary = activeKeys.split(',');\r\n }\r\n else{\r\n keyDictionary = [];\r\n }\r\n\r\n if(!_.includes(keyDictionary, key)){\r\n keyDictionary.push(key);\r\n storage.set(keyType + 'keys', keyDictionary.join(','));\r\n }\r\n }\r\n\r\n return k;\r\n },\r\n\r\n removeKey: function (key) {\r\n storage.remove(key);\r\n },\r\n setPatientDashboardWidgets: function (widget) {\r\n storage.set('patientDashboardWidgets', widget);\r\n },\r\n\r\n getPatientDashboardWidgets: function () {\r\n var pdw = storage.get('patientDashboardWidgets');\r\n return pdw;\r\n },\r\n setPatientDashboardConfigurations: function (newList, type) {\r\n var list = this.getPatientDashboardConfigurations(type) || [];\r\n var hasV1Tiles = _.some(list, function (val) {\r\n return !_.isUndefined(val.WidgetDescriptors);\r\n });\r\n\r\n if(!_.isEmpty(list) && !hasV1Tiles) {\r\n _.forEach(newList, function (val) {\r\n val.Tiles = _.map(val.Tiles, function (tile) {\r\n var savedConfig = _(list).find({Id: val.Id});\r\n if(savedConfig) {\r\n var savedTile = _(savedConfig.Tiles).find({Id: tile.Id});\r\n if(savedTile) {\r\n return _.defaults(tile, savedTile);\r\n }\r\n }\r\n return tile;\r\n });\r\n });\r\n }\r\n\r\n storage.set(getPatientDashboardsKey(type), newList);\r\n },\r\n\r\n removePatientDashboardWidgets: function () {\r\n storage.remove('patientDashboardWidgets');\r\n },\r\n\r\n overwritePatientDashboardConfigurations: function (newList, type) {\r\n storage.set(getPatientDashboardsKey(type), newList);\r\n },\r\n\r\n getPatientDashboardConfigurations: function (type) {\r\n return storage.get(getPatientDashboardsKey(type));\r\n },\r\n\r\n removePatientDashboardConfigurations: function (type) {\r\n storage.remove(getPatientDashboardsKey(type));\r\n },\r\n\r\n getDashboardTileSettings: function () {\r\n return storage.get('settings.dashboard.tiles');\r\n },\r\n setDashboardTileSettings: function (settings) {\r\n return overwritePropertiesAndSave(this.getDashboardTileSettings, settings, 'settings.dashboard.tiles');\r\n },\r\n setDefaultDashboardTileSettings: function (settings) {\r\n return defaultPropertiesAndSave(this.getDashboardTileSettings, settings, 'settings.dashboard.tiles');\r\n },\r\n\r\n getAppointmentsListSettings: function () {\r\n return storage.get('settings.appointmentslist');\r\n },\r\n setAppointmentsListSettings: function (settings) {\r\n return overwritePropertiesAndSave(this.getAppointmentsListSettings, settings, 'settings.appointmentslist');\r\n },\r\n setDefaultAppointmentsListSettings: function (settings) {\r\n return defaultPropertiesAndSave(this.getAppointmentsListSettings, settings, 'settings.appointmentslist');\r\n },\r\n\r\n getMessagesListSettings: function () {\r\n return storage.get('settings.messageslist');\r\n },\r\n setMessagesListSettings: function (settings) {\r\n return overwritePropertiesAndSave(this.getMessagesListSettings, settings, 'settings.messageslist');\r\n },\r\n setDefaultMessagesListSettings: function (settings) {\r\n var messageSettings = this.getMessagesListSettings();\r\n //for legacy\r\n if(messageSettings && messageSettings.messageFilterId) {\r\n return storage.set('settings.messageslist', settings);\r\n }\r\n return defaultPropertiesAndSave(this.getMessagesListSettings, settings, 'settings.messageslist');\r\n },\r\n\r\n getAppointmentsBadgeSettings: function () {\r\n return storage.get('settings.appointments.badge.settings');\r\n },\r\n setAppointmentsBadgeSettings: function (settings) {\r\n return overwritePropertiesAndSave(this.getAppointmentsBadgeSettings, settings, 'settings.appointments.badge.settings');\r\n },\r\n setDefaultAppointmentsBadgeSettings: function (settings) {\r\n return defaultPropertiesAndSave(this.getAppointmentsBadgeSettings, settings, 'settings.appointments.badge.settings');\r\n },\r\n\r\n getDefaultServiceSiteId: function() {\r\n return storage.get('serviceSiteId');\r\n },\r\n\r\n setDefaultServiceSiteId: function(serviceSiteId) {\r\n storage.set('serviceSiteId', serviceSiteId);\r\n },\r\n\r\n getDeviceId: function () {\r\n return storage.get('deviceId');\r\n },\r\n\r\n setDeviceId: function (deviceId) {\r\n storage.set('deviceId', deviceId);\r\n },\r\n\r\n getPhoneMessageGeneralNoteTypeId: function () {\r\n return storage.get('settings.phoneMessageGeneralNoteTypeId');\r\n },\r\n setPhoneMessageGeneralNoteTypeId: function (id) {\r\n storage.set('settings.phoneMessageGeneralNoteTypeId', id);\r\n },\r\n\r\n getTaskMessageGeneralNoteTypeId: function () {\r\n return storage.get('settings.taskMessageGeneralNoteTypeId');\r\n },\r\n setTaskMessageGeneralNoteTypeId: function (id) {\r\n storage.set('settings.taskMessageGeneralNoteTypeId', id);\r\n },\r\n\r\n getPharmacyGeneralNoteTypeId: function () {\r\n return storage.get('settings.pharmacyGeneralNoteTypeId');\r\n },\r\n setPharmacyGeneralNoteTypeId: function (id) {\r\n storage.set('settings.pharmacyGeneralNoteTypeId', id);\r\n },\r\n\r\n getPortalMessageGeneralNoteTypeId : function () {\r\n return storage.get('settings.portalMessageGeneralNoteTypeId');\r\n },\r\n setPortalMessageGeneralNoteTypeId : function (id) {\r\n storage.set('settings.portalMessageGeneralNoteTypeId', id);\r\n },\r\n\r\n getRxRefillMessageGeneralNoteTypeId : function () {\r\n return storage.get('settings.rxRefillMessageGeneralNoteTypeId');\r\n },\r\n setRxRefillMessageGeneralNoteTypeId : function (id) {\r\n storage.set('settings.rxRefillMessageGeneralNoteTypeId', id);\r\n },\r\n\r\n getPharmacyRefillMessageGeneralNoteTypeId : function () {\r\n return storage.get('settings.pharmacyRefillMessageGeneralNoteTypeId');\r\n },\r\n setPharmacyRefillMessageGeneralNoteTypeId : function (id) {\r\n storage.set('settings.pharmacyRefillMessageGeneralNoteTypeId', id);\r\n },\r\n\r\n getPatientVitalsDefaultSettingId: function () {\r\n\r\n return storage.get('settings.patientVitalsDefaultSettingId');\r\n },\r\n setPatientVitalsDefaultSettingId: function (id) {\r\n storage.set('settings.patientVitalsDefaultSettingId', id);\r\n },\r\n\r\n getMedicationOverrideGeneralNoteTypeId : function () {\r\n return storage.get('settings.medicationOverrideGeneralNoteTypeId');\r\n },\r\n setMedicationOverrideGeneralNoteTypeId : function (id) {\r\n storage.set('settings.medicationOverrideGeneralNoteTypeId', id);\r\n },\r\n\r\n getCurrentUserLicenses: function getCurrentUserLicenses() {\r\n return storage.get('settings.currentUserLicenses');\r\n },\r\n setCurrentUserLicenses: function setCurrentUserLicenses(licenses) {\r\n storage.set('settings.currentUserLicenses', licenses);\r\n },\r\n\r\n getIsERxEnabled: function () {\r\n return storage.get('settings.erxenabled');\r\n },\r\n setIsERxEnabled: function (enabled) {\r\n storage.set('settings.erxenabled', !!enabled);\r\n },\r\n\r\n getAllowImperialUnits: function () {\r\n return storage.get('settings.allowImperialUnitsInPrescription');\r\n },\r\n setAllowImperialUnits: function (allowed) {\r\n storage.set('settings.allowImperialUnitsInPrescription', !!allowed);\r\n },\r\n\r\n getApplicationVersion: function(){\r\n return storage.get('applicationVersion');\r\n },\r\n setApplicationVersion: function(version){\r\n storage.set('applicationVersion', version);\r\n },\r\n getUserPermissions: function(){\r\n return storage.get('userPermissions');\r\n },\r\n setUserPermissions: function(permissions){\r\n permissions = mapPermissions(permissions);\r\n\r\n storage.set('userPermissions', permissions);\r\n },\r\n getAskedUserForTouchID: function() {\r\n return storage.get('askedUserForTouchID');\r\n },\r\n setAskedUserForTouchID: function(prompt) {\r\n storage.set('askedUserForTouchID', prompt);\r\n },\r\n getUserEnabledTouchID: function() {\r\n return storage.get('userEnabledTouchID');\r\n },\r\n setUserEnabledTouchID: function(enabled) {\r\n storage.set('userEnabledTouchID', enabled);\r\n },\r\n getOncePerLoginChartConsent: function() {\r\n return storage.get('OncePerLoginChartConsent');\r\n },\r\n setOncePerLoginChartConsent: function(enabled) {\r\n storage.set('OncePerLoginChartConsent', enabled);\r\n },\r\n\r\n clearKeysOfType: function(keyType){\r\n var activeKeys = storage.get(keyType + 'keys');\r\n if(activeKeys){\r\n var keyDictionary = activeKeys.split(',');\r\n\r\n _.forEach(keyDictionary, function(key){\r\n storage.remove(key);\r\n });\r\n }\r\n\r\n storage.remove(keyType + 'keys');\r\n },\r\n\r\n clearSessionStorage: function(){\r\n clearKeysOfType('list');\r\n clearKeysOfType('metadata');\r\n },\r\n\r\n clearOldVersionCache: function(){\r\n storage.remove('messagetypessupportedforcreate');\r\n }\r\n };\r\n\r\n function mapPermissions(permissions) {\r\n var permissionObj = permissions || {};\r\n\r\n // fix the issue with the backend not returning actually bool values, for some properties here\r\n // it can return things like 'True' and 'False'\r\n // this will coerce those to actual bool values\r\n for(var prop in permissionObj) {\r\n if(trueRegex.test(permissionObj[prop])) {\r\n permissionObj[prop] = true;\r\n }\r\n else if(falseRegex.test(permissionObj[prop])) {\r\n permissionObj[prop] = false;\r\n }\r\n }\r\n\r\n return permissionObj;\r\n }\r\n\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('LogInService',['DeviceSettings',\r\n function (DeviceSettings) {\r\n 'use strict';\r\n\r\n var redirectState, redirectParams, isCustomRedirect, customTransition;\r\n\r\n function setDefaultRedirect(){\r\n isCustomRedirect = false;\r\n\r\n if(!DeviceSettings.isDevice){\r\n redirectState = 'landing';\r\n }\r\n else{\r\n redirectState = 'dashboard';\r\n }\r\n\r\n redirectParams = null;\r\n }\r\n\r\n setDefaultRedirect();\r\n\r\n function setRedirect(transition){\r\n isCustomRedirect = true;\r\n customTransition = transition;\r\n\r\n customTransition.opts.replaceCurrentState = true;\r\n }\r\n\r\n function getRedirectTransition(){\r\n if(isCustomRedirect){\r\n return customTransition;\r\n }\r\n\r\n var redirect = {\r\n appRoute: redirectState,\r\n opts: redirectParams || {}\r\n };\r\n \r\n redirect.opts.replaceCurrentState = true;\r\n\r\n return redirect;\r\n }\r\n\r\n return {\r\n getRedirect: getRedirectTransition,\r\n setDefaultRedirect: setDefaultRedirect,\r\n setRedirect: setRedirect\r\n };\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('LogOffService',\r\n ['AprimaAnalytics', 'Bridge', 'LocalStorageRepository', '$q',\r\n function (AprimaAnalytics, Bridge, LocalStorageRepository, $q) {\r\n 'use strict';\r\n\r\n return {\r\n logoff: logoff,\r\n };\r\n\r\n function logoff() {\r\n LocalStorageRepository.removeJsonWebToken();\r\n LocalStorageRepository.removeUserID();\r\n AprimaAnalytics.sendEvent('user', 'click', 'logoff', 0);\r\n\r\n Bridge.logoff('logoff');\r\n \r\n return $q.when();\r\n }\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('AppointmentTransitionToHelper',\r\n ['apFilterFeatureFilter', 'AppointmentScheduleTypes', function (apFilterFeature, AppointmentScheduleTypes) {\r\n 'use strict';\r\n\r\n var routes = {};\r\n routes[AppointmentScheduleTypes.PatientVisit.id] = {\r\n view: 'appointment',\r\n edit: 'editAppointment',\r\n add: 'addAppointment',\r\n requiredFeature: AppointmentScheduleTypes.PatientVisit.requiredFeature\r\n };\r\n routes[AppointmentScheduleTypes.GroupVisit.id] = {\r\n view: 'groupAppointment',\r\n edit: 'editGroupAppointment',\r\n add: 'addGroupAppointment',\r\n requiredFeature: AppointmentScheduleTypes.GroupVisit.requiredFeature\r\n };\r\n routes[AppointmentScheduleTypes.Event.id] = {\r\n view: 'eventAppointment',\r\n edit: 'editEventAppointment',\r\n add: 'addEventAppointment',\r\n requiredFeature: AppointmentScheduleTypes.Event.requiredFeature\r\n };\r\n routes[AppointmentScheduleTypes.BlockingEvent.id] = {\r\n view: 'blockingEventAppointment',\r\n edit: 'editBlockingEventAppointment',\r\n add: 'addBlockingEventAppointment',\r\n requiredFeature: AppointmentScheduleTypes.BlockingEvent.requiredFeature\r\n };\r\n\r\n function getTransition(apptScheduleType, patientId, calendarId, edit, apptId) {\r\n if(!apptScheduleType) {\r\n return false;\r\n }\r\n\r\n var filteredRoutes = apFilterFeature(routes, 'requiredFeature');\r\n var transition = {\r\n opts: {}\r\n };\r\n var lowerScheduleType = apptScheduleType.toLowerCase();\r\n\r\n if(apptId) {\r\n transition.opts.id = apptId;\r\n var property = !!edit ? 'edit' : 'view';\r\n transition.appRoute = (filteredRoutes[lowerScheduleType] && filteredRoutes[lowerScheduleType][property]) || filteredRoutes[AppointmentScheduleTypes.PatientVisit.id][property];\r\n }\r\n else {\r\n transition.appRoute = (filteredRoutes[lowerScheduleType] && filteredRoutes[lowerScheduleType].add) || filteredRoutes[AppointmentScheduleTypes.PatientVisit.id].add;\r\n }\r\n\r\n if(patientId) {\r\n transition.opts.patientid = patientId;\r\n }\r\n if(calendarId) {\r\n transition.opts.calendarId = calendarId;\r\n }\r\n\r\n return transition;\r\n }\r\n\r\n return {\r\n getTransition: getTransition\r\n };\r\n }]);\r\n","angular.module('aprima-legacy-common').provider('AppRoutes', ['_', function(_){\r\n 'use strict';\r\n\r\n var appRoutes = {\r\n // These functions are used in Angular but not AngularJS.\r\n getAppRoutes: getAppRoutes,\r\n setupAppRoutes: setupAppRoutes,\r\n };\r\n\r\n this.setupAppRoutes = setupAppRoutes;\r\n \r\n function setupAppRoutes(newAppRoutes) {\r\n //does not overwrite existing properties\r\n _.defaults(appRoutes, newAppRoutes);\r\n }\r\n\r\n function getAppRoutes() {\r\n return appRoutes;\r\n }\r\n\r\n this.getAppRoutes = getAppRoutes;\r\n\r\n this.$get = [function(){\r\n return getAppRoutes();\r\n }];\r\n}]);\r\n","//WebViewManager for traditional browsers. It navigates the current window to the new route.\r\nangular.module('aprima-legacy-common').factory('BrowserWebViewManager', ['$window', '$state',\r\n function ($window, $state) {\r\n 'use strict';\r\n\r\n function activateView(appRoute, transition) {\r\n var opts = transition.opts;\r\n if(opts.replaceCurrentState && opts.replaceCurrentState === true){\r\n $state.go(appRoute.state, opts, {location: 'replace'});\r\n }\r\n else{\r\n $state.go(appRoute.state, opts);\r\n }\r\n return true;\r\n }\r\n\r\n function goBack(){\r\n $window.history.back();\r\n }\r\n\r\n return {\r\n activateView: activateView,\r\n goBack : goBack\r\n };\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('MessageTransitionToHelper',\r\n ['MessageTypes', '_', 'apFilterFeatureFilter', function (MessageTypes, _, apFilterFeature) {\r\n 'use strict';\r\n\r\n var routes = {};\r\n routes[MessageTypes.PhoneMessageGuid] = {\r\n route: 'phonemessage'\r\n };\r\n routes[MessageTypes.TaskMessageGuid] = {\r\n route: 'taskmessage'\r\n };\r\n routes[MessageTypes.LabMessageGuid] = {\r\n route: 'labmessage'\r\n };\r\n routes[MessageTypes.PortalAppointmentQuestionMessageGuid] = {\r\n route: 'portalmessage'\r\n };\r\n routes[MessageTypes.PortalBillingQuestionMessageGuid] = {\r\n route: 'portalmessage'\r\n };\r\n routes[MessageTypes.PortalDemographicsQuestionMessageGuid] = {\r\n route: 'portalmessage'\r\n };\r\n routes[MessageTypes.PortalGeneralQuestionMessageGuid] = {\r\n route: 'portalmessage'\r\n };\r\n routes[MessageTypes.PortalRxQuestionMessageGuid] = {\r\n route: 'portalmessage'\r\n };\r\n routes[MessageTypes.AttachmentApprovalGuid] = {\r\n route: 'aamessage'\r\n };\r\n routes[MessageTypes.ServiceOrderApprovalMessageGuid] = {\r\n route: 'serviceorderapprovalmessage'\r\n };\r\n routes[MessageTypes.RxRefillRequestMessageGuid] = {\r\n route: 'rxrefillmessage',\r\n requiredFeature: 'Messages_RxRefill,Visits_RX'\r\n };\r\n routes[MessageTypes.PatientRxRefillRequestMessageGuid] = {\r\n route: 'rxrefillmessage',\r\n requiredFeature: 'Messages_RxRefill,Visits_RX'\r\n };\r\n routes[MessageTypes.PharmacyRefillRequestMessageGuid] = {\r\n route: 'pharmacyrefillmessage',\r\n requiredFeature: 'Messages_PharmacyRefill,Visits_RX'\r\n };\r\n routes[MessageTypes.RxRefillAndErxRequestMessageGuid] = {\r\n route: 'rxrefillmessagev2',\r\n requiredFeature: 'Messages_PharmacyRefill,Visits_RX,Messages_RxRefillRequestV2,Messages_RxChange'\r\n };\r\n\r\n function getTransitionForMessage(messageTypeId, messageId, messageSubTypeId, createNew, options) {\r\n var transition = {\r\n appRoute: 'message',\r\n opts: {\r\n id: messageId\r\n }\r\n };\r\n \r\n if(options){\r\n _.merge(transition.opts, options);\r\n }\r\n\r\n var lowerMessageTypeId = messageTypeId.toLowerCase();\r\n var lowerMessageSubTypeId = messageSubTypeId.toLowerCase();\r\n\r\n var filteredRoutes = apFilterFeature(routes, 'requiredFeature');\r\n\r\n transition.appRoute = (createNew ? 'create' : '') +\r\n ((filteredRoutes[lowerMessageTypeId] && filteredRoutes[lowerMessageTypeId].route) ||\r\n (filteredRoutes[lowerMessageSubTypeId] && filteredRoutes[lowerMessageSubTypeId].route) ||\r\n 'message');\r\n\r\n return transition;\r\n }\r\n\r\n return {\r\n getTransitionForMessage: getTransitionForMessage\r\n };\r\n }]);\r\n","//takes a route pattern and an parameter object and formats the pattern with the parameters.\r\n//reuses the route formatting built in to angular-ui-router library, but exposes it as our own library for easy maintainability.\r\n//it also allows you to write unit tests to discover how the $urlMatcherFactory works internally.\r\nangular.module('aprima-legacy-common').factory('RouteFormatter', ['$urlMatcherFactory', '_', function ($urlMatcherFactory, _) {\r\n 'use strict';\r\n var formatRoute = function (routePattern, params) {\r\n var route;\r\n\r\n params = !_.isUndefined(params) ? params : {};\r\n\r\n route = $urlMatcherFactory.compile(routePattern).format(params);\r\n\r\n return route;\r\n };\r\n\r\n var formatRelativeRoute = function formatRelativeRoute(routePattern, parentRoutePattern, params) {\r\n var route;\r\n\r\n params = !_.isUndefined(params) ? params : {};\r\n if(routePattern.indexOf(parentRoutePattern + '/') === 0)\r\n routePattern = routePattern.substring(parentRoutePattern.length);\r\n route = $urlMatcherFactory.compile(routePattern).format(params);\r\n\r\n return route;\r\n };\r\n\r\n return {\r\n formatRoute: formatRoute,\r\n formatRelativeRoute: formatRelativeRoute\r\n };\r\n}]);\r\n","//Used to invoke transitions in the TransitionManager and will handle transition if the transition is for the current page.\r\nangular.module('aprima-legacy-common').service('TransitionManager', ['$log', '$state', 'AppRoutes', '_', 'WebViewManager', '$rootScope', '$transitions',\r\n function($log, $state, AppRoutes, _, WebViewManager, $rootScope, $transitions) {\r\n 'use strict';\r\n\r\n var previousTransition;\r\n\r\n $transitions.onStart({}, function(transition) {\r\n var fromState = transition.from() || {};\r\n var fromStateName = fromState && fromState.name || '';\r\n var toState = transition.targetState() || {};\r\n var toStateName = toState && toState.name() || '';\r\n var appRoute = _(AppRoutes).findKey({state: fromStateName || toStateName});\r\n\r\n previousTransition = {\r\n appRoute: appRoute,\r\n opts: _.cloneDeep(transition.params('from')),\r\n };\r\n });\r\n\r\n var transitionToState = function(transition, replaceState){\r\n transition = formatTransition(transition);\r\n\r\n if(!transition){\r\n return;\r\n }\r\n\r\n var targetRoute = AppRoutes[transition.appRoute];\r\n\r\n if(!targetRoute) {\r\n $log.warn('Unable to find AppRoute: \"' + transition.appRoute + '\". Aborting transition.');\r\n return false;\r\n }\r\n\r\n if(!_.isBoolean(transition.opts.replaceCurrentState)){\r\n if(_.isBoolean(replaceState)){\r\n transition.opts.replaceCurrentState = replaceState;\r\n }\r\n else if(!$state.current || $state.current.name !== targetRoute.state){\r\n transition.opts.replaceCurrentState = false;\r\n }\r\n else{\r\n transition.opts.replaceCurrentState = true;\r\n }\r\n }\r\n\r\n if(targetRoute.options){\r\n transition.opts = _.merge(transition.opts, targetRoute.options);\r\n }\r\n\r\n $rootScope.$broadcast('TransitionActivated', transition);\r\n\r\n return WebViewManager.activateView(targetRoute, transition);\r\n };\r\n\r\n var replaceCurrentState = function(transition){\r\n transitionToState(transition, true);\r\n };\r\n\r\n function getPreviousTransition(){\r\n return previousTransition;\r\n }\r\n\r\n function formatTransition(transition){\r\n if (!transition) {\r\n $log.warn('Cannot transition to null or undefined transition');\r\n return;\r\n }\r\n\r\n transition = _.defaults(transition, {\r\n type: 'transition',\r\n appRoute: '',\r\n opts: {}\r\n });\r\n\r\n $log.info('TransitionManager postMessage to ' + JSON.stringify(transition));\r\n\r\n return transition;\r\n }\r\n\r\n var goBack = function(){\r\n WebViewManager.goBack();\r\n };\r\n\r\n return {\r\n transition: transitionToState,\r\n replaceCurrentState: replaceCurrentState,\r\n goBack: goBack,\r\n getPreviousTransition: getPreviousTransition\r\n };\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('WebViewManager',\r\n ['$log', 'BrowserWebViewManager', 'XamarinWebViewManager', 'DeviceSettings',\r\n function ($log, BrowserWebViewManager, XamarinWebViewManager, DeviceSettings) {\r\n 'use strict';\r\n\r\n var webViewManager;\r\n\r\n if (DeviceSettings.isStandaloneBrowser) {\r\n $log.info('Using BrowserWebViewManager for standalone browser');\r\n webViewManager = BrowserWebViewManager;\r\n } else if (DeviceSettings.isDevice || DeviceSettings.isPrm) {\r\n $log.info('Using XamarinWebViewManager');\r\n webViewManager = XamarinWebViewManager;\r\n } else {\r\n $log.info('Using BrowserWebViewManager');\r\n webViewManager = BrowserWebViewManager;\r\n }\r\n\r\n return webViewManager;\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('XamarinWebViewManager',\r\n ['RouteFormatter', '_', 'Bridge', '$state',\r\n function (RouteFormatter, _, Bridge, $state) {\r\n 'use strict';\r\n\r\n function completeRoute(appState){\r\n var parentSeperator = appState.state.lastIndexOf('.');\r\n \r\n if(parentSeperator > 0){\r\n var parentState = $state.get(appState.state.substring(0, parentSeperator));\r\n \r\n return completeRoute({state: parentState.name, route: parentState.url}) + appState.route;\r\n }\r\n else{\r\n return appState.route;\r\n }\r\n }\r\n\r\n function activateView(appRoute, transition) {\r\n var rawRoute = appRoute.route;\r\n \r\n if(appRoute.route){\r\n rawRoute = completeRoute(appRoute);\r\n }\r\n \r\n var route = appRoute.route ? RouteFormatter.formatRelativeRoute(rawRoute, $state.get('^').url, transition.opts) : '';\r\n\r\n Bridge.navigate(appRoute, route, transition);\r\n\r\n return true;\r\n }\r\n \r\n Bridge.onNavigate(function (d) {\r\n if (!_.isUndefined(d)) {\r\n var opts = JSON.parse(d.opts);\r\n\r\n if(opts && opts.replaceCurrentState === true){\r\n $state.go(d.state, opts, {location: 'replace'});\r\n }\r\n else{\r\n $state.go(d.state, opts);\r\n }\r\n }\r\n });\r\n\r\n function goBack(){\r\n Bridge.goBack();\r\n }\r\n\r\n return {\r\n activateView: activateView,\r\n goBack : goBack\r\n };\r\n }]);\r\n","angular.module('aprima-legacy-common')\r\n .factory('NoteTypeRepository',\r\n ['_', 'SystemGuid', function (_, SystemGuid) {\r\n 'use strict';\r\n\r\n // TODO: before releasing, comment out those that we don't actually support.\r\n /*jshint camelcase: false */\r\n var supportedTabs = [\r\n '3e4888e6-a0be-4e5b-bdbf-3da7d4f71375', //Assessments\r\n SystemGuid.UIControl_Note_CC,\r\n SystemGuid.UIControl_Note_CCHPI,\r\n 'ffbb556f-ab4e-478f-a2d7-b4b863a344e9', //CDS\r\n SystemGuid.UIControl_Note_Confidential,\r\n '2c513cab-0d52-4e06-b64f-dc6391e464b7', //CPP\r\n SystemGuid.UIControl_Note_DX,\r\n SystemGuid.UIControl_Note_DXDSM,\r\n SystemGuid.UIControl_Note_GeneralNote,\r\n '8b40d89b-3511-42a4-b07b-decadc72647e', //General Note CC\r\n SystemGuid.UIControl_Note_HPI,\r\n SystemGuid.UIControl_Note_HX,\r\n '38080e33-7a49-4e4d-9d5c-ff87319d8307', //Observation\r\n SystemGuid.UIControl_Note_PE,\r\n SystemGuid.UIControl_Note_Plan,\r\n SystemGuid.UIControl_Note_Results,\r\n SystemGuid.UIControl_Note_ROS,\r\n SystemGuid.UIControl_Note_ROSPE,\r\n SystemGuid.UIControl_Note_RX,\r\n '871c47ed-372f-4c89-a4b8-c753951ca93e', //Single CPP\r\n SystemGuid.UIControl_Note_SO,\r\n SystemGuid.UIControl_Note_SP,\r\n SystemGuid.UIControl_Note_VisitText,\r\n SystemGuid.UIControl_Note_Vitals,\r\n ];\r\n\r\n var supportedSliders = [\r\n '2f35a3bb-0778-4cd6-a178-7734e7b4836e', //Attachments\r\n '4836176d-e412-47e9-ab6b-b549515c8007', //Calendar\r\n 'bf9d1d68-cdcc-48f0-8080-1815212914fb', //CCM/CPO\r\n '41e171a8-667a-4ade-aba4-dc7ce21c30d7', //Clinical Decision Support\r\n '87d90295-1cbf-41cd-8582-fad6e0a7a4b9', //Dictation\r\n '142937f8-4c55-4c15-9677-f1a2105a019e', //Education Forms\r\n '5b8fa2e2-31fa-40aa-bbf6-9d969ae5cc71', //Follow-up\r\n '41e171a8-667a-4ade-aba4-dc7ce21c30d7', //Health Maintenance\r\n '48606f65-ddf6-4f83-afaf-7dfb842d13d6', //Numeric Keypad\r\n '881ee22a-9193-45b3-85f5-818e4bd6ece9', //Rx Summary\r\n 'b9d820ab-b216-47bf-af2d-b7ebfb79a137', //Text Note\r\n '14266173-8cfc-4b4e-8fa6-8f95ea61e03d', //Visit Information\r\n ];\r\n\r\n function isNoteTabsSupported(note) {\r\n if(_.isNil(note)) { return false; }\r\n var noteTabs = _.map(note.Tabs, 'TabSliderUid');\r\n\r\n var matchedTabs = _.intersection(noteTabs, supportedTabs);\r\n return matchedTabs.length === noteTabs.length;\r\n }\r\n\r\n function isNoteSlidersSupported(note) {\r\n if(_.isNil(note)) { return false; }\r\n var noteSliders = _.map(note.Sliders, 'TabSliderUid');\r\n\r\n var matchedSliders = _.intersection(noteSliders, supportedSliders);\r\n return matchedSliders.length === noteSliders.length;\r\n }\r\n\r\n function isNoteTypeSupported(note) {\r\n if(_.isNil(note)) { return false; }\r\n return isNoteTabsSupported(note) && isNoteSlidersSupported(note);\r\n }\r\n\r\n return {\r\n isNoteTypeSupported: isNoteTypeSupported,\r\n isNoteTabsSupported: isNoteTabsSupported,\r\n isNoteSlidersSupported: isNoteSlidersSupported,\r\n };\r\n }]);\r\n","angular.module('aprima-legacy-common').factory('$qHelpers', ['$q', '_', '$timeout', function ($q, _, $timeout) {\r\n 'use strict';\r\n\r\n return {\r\n whenFirstSuccess: whenFirstSuccess,\r\n timeout: timeout,\r\n delay: delay,\r\n abortablePromise: abortablePromise,\r\n isPromise: isPromise,\r\n abortPromises: abortPromises,\r\n abortPromise: abortPromise\r\n };\r\n\r\n function whenFirstSuccess(promises) {\r\n //Will resolve to the value of the first successful promise in order.\r\n //Ignores rejected promises unless ALL were rejected, then the returned promise will be rejected.\r\n \r\n var deferred = $q.defer();\r\n var results = [];\r\n var resolved = false;\r\n //Use reference instead of value for comparison.\r\n var rejectionFlagValue = {};\r\n\r\n function tryResolveToFirstSuccess() {\r\n var index = -1;\r\n var length = results ? results.length : 0;\r\n\r\n if (!results || resolved) {\r\n return false;\r\n }\r\n\r\n while (++index < length) {\r\n var result = results[index];\r\n\r\n if (result === undefined) {\r\n return false;\r\n }\r\n\r\n if (result !== rejectionFlagValue) {\r\n resolved = true;\r\n deferred.resolve(result);\r\n results = null;\r\n return false;\r\n }\r\n }\r\n\r\n deferred.reject('Could not resolve first successful promise. All promises were rejected.');\r\n }\r\n\r\n _.forEach(promises, function (promise, index) {\r\n results[index] = undefined;\r\n\r\n promise.then(function (result) {\r\n if (!resolved) {\r\n results[index] = result;\r\n tryResolveToFirstSuccess();\r\n }\r\n }, function () {\r\n if (!resolved) {\r\n results[index] = rejectionFlagValue;\r\n tryResolveToFirstSuccess();\r\n }\r\n });\r\n\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function timeout(promise, time) {\r\n var deferred = $q.defer(),\r\n timeoutPromise = $timeout(function() {\r\n deferred.reject('Promise took too long to resolve and was rejected.');\r\n }, time);\r\n\r\n promise\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n })\r\n .catch(function (err) {\r\n deferred.reject(err);\r\n })\r\n .finally(function() {\r\n $timeout.cancel(timeoutPromise);\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function delay(promise, time) {\r\n var deferred = $q.defer();\r\n\r\n $timeout(function() {\r\n promise\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n })\r\n .catch(function (err) {\r\n deferred.reject(err);\r\n });\r\n }, time);\r\n\r\n return deferred.promise;\r\n }\r\n\r\n function abortablePromise(promise, previousPromises, shouldRejectOnAbort) {\r\n var deferred = $q.defer();\r\n shouldRejectOnAbort = angular.isFunction(shouldRejectOnAbort) ? _.once(shouldRejectOnAbort) : function(){ return true; };\r\n\r\n abortPromises(previousPromises);\r\n\r\n promise\r\n .then(function (result) {\r\n deferred.resolve(result);\r\n }, function (error) {\r\n deferred.reject(error);\r\n });\r\n\r\n var error = {isAborted: true, msg: 'Aborted'};\r\n deferred.promise.abort = function abort() {\r\n var shouldAbort = !!shouldRejectOnAbort(error);\r\n if(shouldAbort) {\r\n deferred.reject(error);\r\n }\r\n return shouldAbort;\r\n };\r\n\r\n replaceChainFnsWithAbortableFns(deferred.promise, 'then');\r\n replaceChainFnsWithAbortableFns(deferred.promise, 'catch');\r\n replaceChainFnsWithAbortableFns(deferred.promise, 'finally');\r\n\r\n return deferred.promise;\r\n }\r\n \r\n function abortPromises(promises) {\r\n if(!_.isArray(promises)) {\r\n abortPromise(promises);\r\n return;\r\n }\r\n\r\n _.forEach(promises, function (promise) {\r\n abortPromise(promise);\r\n });\r\n }\r\n\r\n function abortPromise(promise) {\r\n if(promise && promise.abort){\r\n promise.abort();\r\n }\r\n }\r\n \r\n function replaceChainFnsWithAbortableFns(promise, chainFnKey) {\r\n var wrappedKey = '_' + chainFnKey;\r\n var wrappedFn = promise[wrappedKey] = promise[wrappedKey] || promise[chainFnKey] || angular.noop;\r\n\r\n promise[chainFnKey] = function() {\r\n var chained = wrappedFn.apply(promise, arguments);\r\n if(_.isFunction(chained.abort)) {\r\n return chained;\r\n }\r\n \r\n var newPromise = abortablePromise(chained, null, function() {\r\n return promise.abort();\r\n });\r\n return newPromise;\r\n };\r\n }\r\n\r\n function isPromise(value) {\r\n return !!(value && angular.isFunction(value.then) && angular.isFunction(value.catch) && angular.isFunction(value.finally));\r\n }\r\n}]);","angular.module('aprima-legacy-common').factory('HttpAbortableContext', ['$q', '$qHelpers', '_', function($q, $qHelpers, _) {\r\n 'use strict';\r\n \r\n return HttpAbortableContext;\r\n\r\n function HttpAbortableContext(previousPromiseToAbort) {\r\n var abortDeferred = $q.defer();\r\n var abortPromise = abortDeferred.promise;\r\n\r\n return {\r\n abortPromise: abortPromise,\r\n wrap: function wrap(promise) {\r\n var abortedError;\r\n promise = promise.catch(function(error) {\r\n if(abortedError && error && error.status < 0) {\r\n _.assign(error, abortedError);\r\n }\r\n return $q.reject(error);\r\n });\r\n\r\n return $qHelpers.abortablePromise(promise, previousPromiseToAbort, function(error) {\r\n abortedError = error;\r\n abortDeferred.resolve();\r\n return false;\r\n });\r\n }\r\n };\r\n }\r\n}]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n // Can add to this as necessary\r\n var permissions = {\r\n Schedule: 'schedule',\r\n FullNoteComposer: 'fnc',\r\n StrikeoutVisits: 'strikeoutvisits',\r\n };\r\n\r\n angular.module('aprima-legacy-common').constant('Permissions', permissions);\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-legacy-common').factory('SecurityRepository', [\r\n '_',\r\n '$q',\r\n 'AprimaCache',\r\n 'AprimaRestangular',\r\n SecurityRepository\r\n ]);\r\n\r\n function SecurityRepository(\r\n _,\r\n $q,\r\n AprimaCache,\r\n AprimaRestangular\r\n ) {\r\n\r\n var defaultCache = AprimaCache.Permissions.httpMode;\r\n\r\n var service = {\r\n getPermissions: getPermissions\r\n };\r\n\r\n return service;\r\n\r\n function getPermissions(permissionName) {\r\n var promise = AprimaRestangular.get()\r\n .one('permissions', permissionName)\r\n .withHttpConfig({cache: defaultCache})\r\n .get()\r\n .then(function (securityPermission) {\r\n if (!securityPermission) {\r\n return $q.reject('No permission matches \\'' + permissionName + '\\'');\r\n }\r\n\r\n // Handle legacy case where IsAllowed wasn't a property on the object\r\n if (!_.has(securityPermission, 'IsAllowed')) {\r\n securityPermission.IsAllowed = true;\r\n }\r\n return securityPermission;\r\n });\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-legacy-common').factory('TileGroup', [\r\n '_',\r\n 'AprimaCache',\r\n TileGroupFactory,\r\n ]);\r\n\r\n\r\n function TileGroupFactory(\r\n _,\r\n AprimaCache\r\n ) {\r\n\r\n var groupStates = {\r\n userPreference: 0,\r\n allExpanded: 1,\r\n allCollapsed: 2\r\n };\r\n\r\n return TileGroup;\r\n\r\n function TileGroup(tileGroupName, config, storageType, disablePersistence) {\r\n var self = this;\r\n\r\n self.setupTile = setupTile;\r\n self.toggle = toggle;\r\n self.nextState = nextState;\r\n self.changeConfiguration = changeConfiguration;\r\n self.getName = getName;\r\n self.setPersistence = setPersistence;\r\n\r\n var name = tileGroupName;\r\n var persist = !disablePersistence;\r\n var configuration = config || 'default';\r\n var type = 'tileGroup';\r\n var tiles = {};\r\n var groupState = groupStates.userPreference;\r\n var cache = AprimaCache.getOrCreateOverride(cacheName(), {storagePrefix: 'caches.'});\r\n if(persist) {\r\n cache.setStorageMode(storageType || 'localStorage');\r\n }\r\n\r\n updateTiles();\r\n\r\n function setPersistence(enable) {\r\n persist = !!enable;\r\n }\r\n\r\n function getName() {\r\n return name;\r\n }\r\n\r\n function cacheName() {\r\n return type + '.' + name;\r\n }\r\n\r\n function save() {\r\n return cache.put(configuration, tiles);\r\n }\r\n\r\n function get() {\r\n return cache.get(configuration);\r\n }\r\n\r\n function toggle(tileId) {\r\n var tile = tiles[tileId];\r\n if(!tile) {\r\n return;\r\n }\r\n\r\n tile.isCollapsed = !tile.isCollapsed;\r\n if(groupState === groupStates.userPreference && persist) {\r\n save();\r\n }\r\n }\r\n\r\n function setupTile(tileId, defaultValue, forceDefault) {\r\n var tile = tiles[tileId];\r\n\r\n if(!tile || forceDefault) {\r\n tile = tiles[tileId] = {\r\n isCollapsed: defaultValue\r\n };\r\n }\r\n\r\n if(groupState === groupStates.allExpanded) {\r\n tile.isCollapsed = false;\r\n }\r\n else if(groupState === groupStates.allCollapsed) {\r\n tile.isCollapsed = true;\r\n }\r\n else if(groupState === groupStates.userPreference && persist) {\r\n save();\r\n }\r\n\r\n return tile;\r\n }\r\n\r\n function updateTiles() {\r\n if(groupState === groupStates.userPreference) {\r\n _.merge(tiles, get());\r\n return;\r\n }\r\n\r\n var newValue = groupState === groupStates.allCollapsed;\r\n _.forEach(tiles, function (val) {\r\n val.isCollapsed = newValue;\r\n });\r\n }\r\n\r\n function changeConfiguration(config) {\r\n if(!config || configuration === config) {\r\n return;\r\n }\r\n\r\n configuration = config;\r\n updateTiles();\r\n }\r\n\r\n function nextState() {\r\n groupState = groupState !== groupStates.allCollapsed ?\r\n groupState + 1 :\r\n groupStates.userPreference;\r\n updateTiles();\r\n }\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","\r\nangular.module('aprima-legacy-common').value('widgetViews', [\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000001',\r\n name: 'allergies',\r\n displayName: 'Allergies',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/allergiesTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000002',\r\n name: 'appointments',\r\n displayName: 'Appointments',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/appointmentsTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000003',\r\n name: 'demographics',\r\n displayName: 'Demographics',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/demographicsTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000004',\r\n name: 'header',\r\n displayName: 'Patient Header',\r\n userPlaceable : false,\r\n view: '/patients/views/dashboard-widgets/patientHeaderTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000009',\r\n name: 'problems',\r\n displayName: 'Problem List',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/problemListTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000006',\r\n name: 'medications',\r\n displayName: 'Active Medications',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/medicationsTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000012',\r\n name: 'visits',\r\n displayName: 'Visits',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/visitsTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000010',\r\n name: 'remarks',\r\n displayName: 'Remarks',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/remarksTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000008',\r\n name: 'orders',\r\n displayName: 'Orders',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/ordersTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000007',\r\n name: 'observationResults',\r\n displayName: 'Observation Results',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/observationResultsTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000011',\r\n name: 'vitals',\r\n displayName: 'Vitals',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/vitalsTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000005',\r\n name: 'healthMaintenanceReminders',\r\n displayName: 'Health Reminders',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/healthMaintenanceRemindersTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000013',\r\n name: 'attachments',\r\n displayName: 'Attachments',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/attachmentsTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000014',\r\n name: 'observationValues',\r\n displayName: 'Observation Values',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/observationValuesTile.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000015',\r\n name: 'diagnosisSummaries',\r\n displayName: 'Diagnosis Summaries',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/diagnosisSummariesTiles.html'\r\n },\r\n {\r\n id: '259e6a7b-64a8-437c-82b7-000000000016',\r\n name: 'recalls',\r\n displayName: 'Recalls',\r\n userPlaceable : true,\r\n view: '/patients/views/dashboard-widgets/recallsTile.html'\r\n }\r\n]);"]}