{"version":3,"sources":["../../src/core-ui/directives/partials/apPharmacyTileDragDrop.js","../../src/core-ui/module.js","../../src/core-ui/app.templates.js","../../src/core-ui/components/apCachingSettings.js","../../src/core-ui/components/apDocumentViewerWithDownload.js","../../src/core-ui/components/apErxRequestDetails.js","../../src/core-ui/components/apErxRequestDualRow.js","../../src/core-ui/components/apErxRequestFullRow.js","../../src/core-ui/components/apErxRequestMedication.js","../../src/core-ui/components/apErxRequestPatient.js","../../src/core-ui/components/apErxRequestProvider.js","../../src/core-ui/components/apMultiSelectListItem.js","../../src/core-ui/components/tinymce.js","../../src/core-ui/configuration/app.config.hammer.js","../../src/core-ui/configuration/app.config.jquery.js","../../src/core-ui/configuration/app.run.persistentwarnings.js","../../src/core-ui/decorators/uibDropdownDecorator.js","../../src/core-ui/decorators/uibPagingDecorator.js","../../src/core-ui/decorators/uibTypeaheadDecorators.js","../../src/core-ui/directives/affix.js","../../src/core-ui/directives/apAddress.js","../../src/core-ui/directives/apAndroidHeightFix.js","../../src/core-ui/directives/apAppointmentContextMenu.js","../../src/core-ui/directives/apAuthorization.js","../../src/core-ui/directives/apAutoFocus.js","../../src/core-ui/directives/apBirthdate.js","../../src/core-ui/directives/apCheckbox.js","../../src/core-ui/directives/apContextMenu.js","../../src/core-ui/directives/apDashboardTileHeader.js","../../src/core-ui/directives/apDataGroup.js","../../src/core-ui/directives/apDateFormatter.js","../../src/core-ui/directives/apDateRangeFormatter.js","../../src/core-ui/directives/apDocumentViewer.js","../../src/core-ui/directives/apDynamicFrame.js","../../src/core-ui/directives/apFeatureCheck.js","../../src/core-ui/directives/apFormContainer.js","../../src/core-ui/directives/apFormFocus.js","../../src/core-ui/directives/apFullModal.js","../../src/core-ui/directives/apHideDevice.js","../../src/core-ui/directives/apHighlight.js","../../src/core-ui/directives/apIcdCodeModalCtrl.js","../../src/core-ui/directives/apImageViewer.js","../../src/core-ui/directives/apIncludeReplace.js","../../src/core-ui/directives/apKeyboardSpace.js","../../src/core-ui/directives/apMediaPicker.js","../../src/core-ui/directives/apMessageIcon.js","../../src/core-ui/directives/apMessageNewNote.js","../../src/core-ui/directives/apMessageNotes.js","../../src/core-ui/directives/apMessageStatus.js","../../src/core-ui/directives/apPatientContextMenu.js","../../src/core-ui/directives/apPdf.js","../../src/core-ui/directives/apPharmacyAddress.js","../../src/core-ui/directives/apSaveToFile.js","../../src/core-ui/directives/apScrollableList.js","../../src/core-ui/directives/apScrollOnInput.js","../../src/core-ui/directives/apSelect.js","../../src/core-ui/directives/apSpinner.js","../../src/core-ui/directives/apSsnField.js","../../src/core-ui/directives/apSwipeable.js","../../src/core-ui/directives/apTile.js","../../src/core-ui/directives/apTileManager.js","../../src/core-ui/directives/apVerticalSeparator.js","../../src/core-ui/directives/click/hmClick.js","../../src/core-ui/directives/click/hmStopPropagation.js","../../src/core-ui/directives/click/ngClickDecorator.js","../../src/core-ui/directives/dialHref.js","../../src/core-ui/directives/find/apFindPharmacy.js","../../src/core-ui/directives/find/apFindPrmUser.js","../../src/core-ui/directives/find/apPatientSearch.js","../../src/core-ui/directives/find/apPharmacyItem.js","../../src/core-ui/directives/find/ApReadonlyFindControl.js","../../src/core-ui/directives/focusOn.js","../../src/core-ui/directives/iframeOnload.js","../../src/core-ui/directives/inputs/apAutoGrow.js","../../src/core-ui/directives/inputs/apFocusStr.js","../../src/core-ui/directives/inputs/apTabToStr.js","../../src/core-ui/directives/inputs/contenteditable.js","../../src/core-ui/directives/lazySrc.js","../../src/core-ui/directives/metadata/apCustomInvalid.js","../../src/core-ui/directives/metadata/apFormGroup.js","../../src/core-ui/directives/metadata/apMetadata.js","../../src/core-ui/directives/metadata/apRequired.js","../../src/core-ui/directives/metadata/form.js","../../src/core-ui/directives/multiCheckbox.js","../../src/core-ui/directives/navigation/apTransitionTo.js","../../src/core-ui/directives/navigation/apTransitionToAppointment.js","../../src/core-ui/directives/navigation/apTransitionToMessage.js","../../src/core-ui/directives/navigation/TransitionToHelper.js","../../src/core-ui/directives/ngRepeatColumnReset.js","../../src/core-ui/directives/partials/apAppointmentBrief.js","../../src/core-ui/directives/partials/apAppointmentListItem.js","../../src/core-ui/directives/partials/apdragdrop.js","../../src/core-ui/directives/partials/apMessageAssignTo.js","../../src/core-ui/directives/partials/apMessageListItem.js","../../src/core-ui/directives/partials/apVisitBrief.js","../../src/core-ui/directives/scrollTo.js","../../src/core-ui/directives/selectFix.js","../../src/core-ui/directives/stRatio.js","../../src/core-ui/filters/apFilterFeature.js","../../src/core-ui/filters/apHasFeature.js","../../src/core-ui/filters/apSsnFilter.js","../../src/core-ui/modals/GeneralNotesModal.js","../../src/core-ui/modals/MultiSelectListItemModal.js","../../src/core-ui/services/apConfirm.js","../../src/core-ui/services/apConfirmService.js","../../src/core-ui/services/BarcodeScanningService.js","../../src/core-ui/services/ClickListenerService.js","../../src/core-ui/services/IcdCodeModal.js","../../src/core-ui/services/inputs/ApMultiSelectButton.js","../../src/core-ui/services/inputs/inputSelection.js","../../src/core-ui/services/IntersectionObserverService.js","../../src/core-ui/services/IosDocumentHelper.js","../../src/core-ui/services/MediaService.js","../../src/core-ui/services/PanelConfigurationService.js","../../src/core-ui/services/PersistentWarningService.js","../../src/core-ui/services/PressListenerService.js","../../src/core-ui/services/ScrollerService.js","../../src/core-ui/services/typeahead/enableTypeaheadTrackBy.js","../../src/core-ui/services/typeahead/findTypeahead.js","../../src/core-ui/services/typeahead/positionTypeaheadPopup.js","../../src/core-ui/services/typeahead/setTypeaheadPopupHeight.js","../../src/core-ui/services/typeahead/typeaheadPopupClass.js","../../src/core-ui/services/uxConstants.js","../../src/core-ui/services/ViewportInfo.js","../../src/core-ui/services/WebDocumentHelper.js"],"names":["deletePatientPharmacyModalCtrl","$scope","$modalInstance","cancel","dismiss","ok","close","angular","module","run","$templateCache","put","window","component","templateUrl","controllerAs","controller","_","AprimaCache","this","clearAll","totalSize","info","reduce","caches","sum","cache","size","bindings","disableFullscreen","disableInlinePdf","documentId","documentHelper","downloadFileName","enableDownload","hasStaticUrl","documentDownload","documentGetStaticUrl","documentLoad","vm","downloadingDocument","loadingDocument","canDownloadDocument","canOpenInSeparateTab","onDocumentDownload","finally","onDocumentLoad","requestSettings","onDocumentOpenInSeparateTab","openDocumentInSeparateTab","refillRequest","prescription","patient","label","firstValue","firstText","secondValue","secondText","warn","header","hasWarning","isNil","String","prototype","toUpperCase","call","value","transclude","requestedMed","currentPrescription","rxNormQualifer","BPK","GPK","SCD","SBD","isOpen","medDescriptionText","description","ndcDescription","text","refills","firstInstruction","Instructions","length","Refills","substitutionText","DispenseAsWritten","strengthText","DrugStrength","DrugStrengthUnits","productCodeText","DrugNdc","drugDbCodeText","DrugRxNormCode","qualifier","DrugRxNormQualifier","drugFormText","UnitOfMeasureName","UnitOfMeasureCode","hasDetails","WrittenDate","LastFillDate","ExpirationDate","EffectiveDate","PeriodEnd","DateValidated","SoldDate","PriorAuthorizationDescription","PriorAuthorizationStatusTerm","requestedPatient","currentPatient","requestedProvider","identification","provider","PhysicianReferenceType","PhysicianReferenceNumber","collection","ngDisabled","require","ngModelCtrl","$element","ApMultiSelectButton","MultiSelectListItemModal","formatter","listItem","Description","Name","init","selectedItems","openModal","find","removeFormatting","hideToolbar","useAdvancedToolbar","height","valueChanged","toolbarSelected","tinymceModelOptions","debounce","tinymceOptions","branding","toolbar","plugins","menubar","statusbar","resize","format","browser_spellcheck","remove_linebreaks","onChange","updatedValue","config","Hammer","Tap","defaults","threshold","time","pickBy","forOwn","inputType","inputHandler","element","disabled","apply","arguments","$","fn","extend","firstOrNull","first","SetupPersistentWarningService","$transitions","PersistentWarningService","onSuccess","clear","CustomModuleRunService","add","decorator","$delegate","$document","directive","compile","link","scope","attrs","dropdownCtrl","setToggleElement","ev","currentTarget","on","$on","off","create","ctrl","$attrs","result","$eval","getText","noop","typeaheadTriggerSearch","ngModel","$$lastCommittedViewValue","$setViewValue","$viewValue","$render","stopPropagation","event","$parse","enableTypeaheadTrackBy","findTypeahead","positionTypeaheadPopup","setTypeaheadPopupHeight","typeaheadPopupClass","tElement","typeaheadElement","attr","headerElement","prepend","displayNone","noneAction","noneElement","defaultHeader","matches","model","isDefault","$parent","typeaheadNgModel","triggerSearch","partial","interceptor","selectInterceptor","parsedInterceptor","item","evt","interceptorArgs","$item","$event","$triggerSearch","shouldSelect","parentSelect","select","activeIdx","match","override","selectOther","obj","id","selectMatch","directiveController","$controller","$transclude","domElement","documentElement","documentClickHandlerStart","documentClickHandlerEnd","target","targetModalContainer","parents","contains","originalTarget","ctrls","originalFormatterFn","e","selector","is","focus","typeaheadFormatter","$formatters","pop","push","modelValue","isString","ClickListenerService","restrict","elem","dereg","register","$broadcast","preventDefault","affix","offset","top","Bridge","address","openMap","fireEvent","Address1","Address2","City","State","Zip","Country","$interval","cancelUpdate","css","widthWatch","totalHeight","parentHeight","children","each","outerHeight","$rootScope","SecurityRepository","Permissions","setOptsForApptContextMenu","opts","$emit","getChargeCaptureTransition","appRoute","patientId","appointment","PatientId","Patient","Id","getPatientId","serviceSiteId","ServiceSiteId","deregister","getPermissions","Schedule","then","permission","schedulePermissionAllowed","IsAllowed","catch","AuthorizationService","providerRequired","isUserProvider","$destroy","remove","$timeout","autoFocus","DateUtilities","birthdate","deathdate","display","html","displayAge","getPersonAge","watchRemover","$watchCollection","newval","oldval","person","currentId","$compile","$log","tAttrs","type","hasClass","returnValue","post","postLink","parent","addClass","tabindex","$set","labelText","checkboxLabel","errors","checkBoxId","nextNode","next","nextNodeName","nodeName","toLowerCase","printErrors","after","forEach","error","$window","AprimaAnalytics","PressListenerService","menuTracker","menuElement","broadcastCloseContextMenu","deregisterListener","opened","backdrop","backdrops","deregisterFn","append","addBackdrop","backdropClickHandler","removeBackdrop","removeClass","getBackdrop","handleClick","apContextMenuOnClick","JSON","parse","openFn","apContextMenuOpen","closeFn","apContextMenuClose","setPosition","isUndefined","apContextMenuSetPosition","lastEvent","observer","MutationObserver","resizeMenu","deregisterClose","tryCloseContextMenu","bind","handleOpenContextMenuEvent","pageX","sendEvent","doc","docLeft","pageXOffset","scrollLeft","clientLeft","docTop","pageYOffset","scrollTop","clientTop","elementHeight","scrollHeight","elementWidth","scrollWidth","docHeight","clientHeight","pageY","docWidth","clientWidth","totalWidth","Math","max","left","$apply","srcEvent","startEvent","center","x","y","touches","touch","document","getElementById","apContextMenuTarget","apContextMenuType","observe","childList","subtree","openContextMenu","unbind","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","callback","setTimeout","Debouncer","ticking","requestedDuringTick","DashboardHeader","watchElementSelector","options","defaultOptions","lastY","scroller","topOffset","bottomOffset","scrollUpClass","scrollDownClass","affixedClassName","debouncer","update","debouncedUpdate","handleEvent","constructor","requestTick","rafCallback","getWatchElement","__watchElement","watchElement","isElementInViewport","rect","getBoundingClientRect","bottom","toggleIsVisibleClass","toggleClass","getScrollY","undefined","body","parentNode","getViewportHeight","innerHeight","getDocumentHeight","offsetHeight","getElementHeight","elm","getScrollerHeight","isOutOfBounds","currentScrollY","pastTop","pastBottom","updateScrollPosition","apScroller","toggleTile","apIsVisibleForElement","parseInt","apIsVisibleTopOffset","apIsVisibleBottomOffset","apOnScrollUpClass","apOnScrollDownClass","apIsVisibleClass","addEventListener","toggle","removeEventListener","normal","LanguageFactory","lang","getLang","date","jsdate","removeWatch","output","formatted","thisMoment","langCode","code","isEnglish","replace","moment","locale","isValid","Date","split","startDate","endDate","multiline","BrowserService","ViewportInfo","$sce","imageFormats","htmlFormats","textFormats","pdfFormats","pageWidth","getWidth","pageHeight","getHeight","loadDocument","tryLoadAttachment","page","previousDocumentId","isNumber","pageDetails","currentPage","loadError","attachment","isImage","isHtml","isText","isPdf","loadingAttachment","request","width","attachmentData","Data","includes","Extension","imageData","htmlData","trustAsResourceUrl","textData","atob","blob","base64ToBlob","fileURL","URL","createObjectURL","pdfData","response","loadAttachment","loadPage","$watch","newValue","oldValue","loadingUrl","_resize","newHeight","contentWindow","reload","iframeDocument","content","write","ServerInfoRepository","requiredFeatures","splitRequiredFeatures","isFeatureSupported","containerDisabledExpression","apFormContainerDisabledExpression","input","elementExpression","handler","footer","modalDialog","windowSelector","updateMaxHeight","reservedSpace","closest","paddingTopStr","paddingBottomStr","paddingTop","paddingBottom","apFullModalAlways","getElementsByClassName","attributes","attributeFilter","disconnect","DeviceSettings","isDevice","isPhoneOrOverride","isTabletOrOverride","highlight","repl","replaceWith","$uibModalInstance","DiagnosisRepository","$q","searchParams","loading","modifierIndex","codePromise","modifierPromise","getModifiers","searchForCode","searchCode","trim","codeType","substring","displayCode","topLevel","endsWith","getDiagnoses","all","results","allModifiers","plain","allCodes","filteredCodes","codeModifiers","chain","map","flatten","uniq","matchedCategories","filter","category","matched","Modifiers","intersection","some","modifierCategories","cloneDeep","sortBy","selectedModifiers","updateCategories","diagnosisSelected","addHttpError","remainingModifiers","modifier","Code","searchLevelUp","modifierSelected","pull","isSelected","difference","diagnosis","pageCount","isFullScreenMode","imageElement","initialXCoordinate","initialYCoordinate","minOffsetX","maxOffsetX","minOffsetY","maxOffsetY","initScale","transform","fullscreenImageElement","loadingImage","imageDataWatch","footerHeight","resetElement","className","translate","scale","requestElementUpdate","join","updateElementTransform","pinch","release","min","snapToContainer","touchHandlerDummy","drag","targetX","deltaX","targetY","deltaY","swipe","abs","moveToPage","onPinch","onFsPinch","onRelease","onFsRelease","onTap","onFsTap","get","onDrag","onFsDrag","onSwipe","onFsSwipe","el","contents","keyboardHeight","data","activeElement","tagName","isPhone","KeyboardHeight","style","isIos","template","MediaService","image","onPicked","pickerDescription","pickImage","getMedia","media","fileName","extension","message","messageType","messageTypeId","messageSubTypeId","getMessageTypeIconName","TypeId","MessageTypeId","MessageType","SubTypeId","MessageSubTypeId","MessageSubType","getMessageSubTypeId","state","Urgency","Status","iconName","bindToController","ListService","generalNotes","selectedNote","removeHttpError","selectedNoteChanged","newNote","generalNoteTypeId","listsToLoad","getLists","activate","messageNotes","newNotes","val","DisplayDate","CreatedDate","cal","LastModificationDate","NoteAsHtml","trustAsHtml","Note","watchMessageNotes","setOptsForPatientContextMenu","apConfirm","gettext","ChargeCaptureRepository","TransitionManager","toaster","ExternalPatientsRepository","LocalStorageRepository","ClientInfoRepository","patientDashboardConfigurations","chargeCaptureId","hospitalRoundId","dischargeExternalPatient","dashboardConfigurations","getPatientDashboardConfigurations","isFndEnabled","defaultServiceSiteId","getDefaultServiceSiteId","erxEnabled","getIsERxEnabled","settings","getDashboardTileSettings","tiles","Tiles","chargeCaptureOptions","setup","dischargePatient","dischargingPatient","externalPatient","err","tryToastModelStateError","removeChargeCapture","removingChargeCapture","name","IsSuccess","navigateToDashboard","transition","configId","src","openGMap","isPrm","open","loadText","pdfFormat","_saveAsFile","fileNameToSaveAs","base64String","contentType","downloadDocumentToFile","FileName","$elem","listItemHeight","listItemWindowSize","apScrollableList","scrollTopOnChange","scroll","scrollTo","scrollTopOffset","child","$select","icon","before","addCustomDropdownChevron","spinnerName","SpinnerService","spinnerHtml","spinnerConfiguration","getSpinner","start","startSpinner","apSsnFilter","$parsers","inputValue","transformedInput","ScrollerService","NgZoneService","WebKitMutationObserver","MozMutationObserver","currentPane","paneChanged","useLastHeader","scrollerId","autoResize","scrollDiv","contextRun","zoneAwareObject","paneCount","eventsEnabled","$wrapper","wrapper","container","hammer","initialSetup","mutations","panesChanged","mutation","addedNodes","removedNodes","panes","getPanes","newPane","index","showPane","enableEventsOnce","updatePanes","$evalAsync","getScroller","once","handleHammer","animate","changingPane","runInZoneIfNecessary","updateContainer","targetHeight","updatePageIndicator","pane","adjacentPanes","prev","getAdjacentPanes","percent","scrollStart","paneOffset","dragOffset","direction","DIRECTION_RIGHT","DIRECTION_LEFT","nextPaneHeight","heightDifference","stop","console","log","destroy","zoneAwareLink","tileManager","defaultValue","tileId","Error","isCollapsed","parsedIsCollapsed","assign","isCollapsedWatch","currentScope","newVal","oldVal","tileState","tileGroup","setupTile","defaultCollapsed","TileGroup","self","groupName","tileConfiguration","storageMode","disablePersistence","configurationWatch","changeConfiguration","persistenceWatch","setPersistence","nextState","apVerticalSeparator","registerFromDirective","hasOwnProperty","$provide","dialHref","dialHrefProtocol","protocol","location","href","hmStopPropagation","ApReadonlyFindControl","PatientRepository","PharmacyRepository","patientPharmaciesCache","getOrCreate","maxAge","deleteOnExpire","capacity","directiveDefinition","getPharmacy","searchPharmacies","pharmacy","placeholderText","getSearchTextFromPharmacy","when","cachedPharmacies","getPharmacies","pharmacies","PharmacyId","Address","PrmUserRepository","getUser","searchUsers","prmUser","getSearchTextFromFindPrmUser","FormattedInternalName","LastName","FirstName","QuicksearchFactory","getPatient","updateList","getSearchTextFromPatient","$onChanges","changeObj","currentValue","MasterPharmacy","factory","getItemByIdFn","searchFn","validationKey","idProperty","itemValidatorFn","removeDuplicateDefaults","onInitCtrlFn","getDefaultsFn","initCtrlCallback","validator","isNaN","getDefaultsCallback","selectDisabled","defaultList","useId","parentContainerId","$qHelpers","uxConstants","tempViewValue","noMatchingItem","resetNgModelTimeout","render","selectedItem","placeHolderItem","inputFocus","inputBlur","$rollbackViewValue","blurDebounceTime","itemSelected","searchItems","scrollIntoView","defaultListPromise","defaultsPromise","isArray","isPromise","outstandingCalls","list","defaultItemList","compact","uniqBy","isObject","getDefaultList","searchPromise","parseFromObjectToId","$setValidity","formatFromIdToObject","$modelValue","valueChangedId","$id","$object","formatObject","objectId","parseObject","valueChangedObject","formatOrParsePrimitive","valueChangedPrimitive","$onInit","$viewChangeListeners","$onDestroy","getDefaultHeader","callNoneAction","focusOn","callBack","minHeight","$shadow","position","font","wordWrap","whiteSpace","box-shadow","newWidth","innerWidth","lastWidth","modelWatch","inputSelection","_element","getChildElement","parsedString","searchString","handleFocus","constant","trySelectStr","hasIn","keyCode","parsedConfig","processConfig","configWatch","literal","handleKey","which","selectionEnd","isInteger","brRegex","str","test","removeBreaks","replaceNbsp","$$hasNativeValidators","$isEmpty","toString","Restangular","loadImg","ignoreCache","lazySrc","endpointBase","one","img","Image","loaded","unbindLazySrc","scrollListener","throttle","$observe","removeEventListeners","lazySrcThrottle","unbindUpdateSrc","args","controllerName","directiveName","invalidClassName","validClassName","form","directiveCtrl","field","formCtrl","previousVal","cleanupFns","onValueChanged","onDestroy","cleanupFn","validate","pre","apFormGroup","ApFormGroup","formGroup","$formGroup","addField","removeField","setFieldRequired","fields","parentFormSubmitted","fieldElement","thisField","valid","pristine","required","_$setDirty","$setDirty","$pristine","updateValid","_$setPristine","$setPristine","_$setValidity","$valid","isRequired","$formGroupLabel","getLabel","setFormGroupValidity","$field","isFieldValid","MetadataService","ngMinMaxLengthUnsupportedType","datetime-local","week","month","radio","checkbox","ngMinMaxLengthUnsupportedElement","ap-patient-search","ap-find-pharmacy","ngMinMaxUnsupportedType","email","url","ngMinMaxUnsupportedElement","priority","terminal","metadata","apMetadata","applyApRequired","convertNgModelExprToMetadataExpr","isMinMaxCompatible","applyNgMinMax","isMinMaxLengthCompatible","applyNgMinMaxLength","removeAttr","modelCtrl","fieldId","apRequiredExpr","elementWatches","metadataWatches","$validators","viewValue","getObjectFromMetadata","IsGroupRequired","i","Fields","ValidationGroup","propertyValue","baseModel","FieldName","IsRequired","getIsRequired","apRequired","$validate","metadataObj","modelField","fieldMetaData","clearMetadataWatches","isEmpty","formDirective","setSubmitted","$setSubmitted","selectedlist","sourcelist","selectAll","showAll","selected","formattedDate","orderBy","selection","directiveParams","TransitionToHelper","registerTransitionTo","transitionTo","prmTransitionTo","isFunction","AppointmentTransitionToHelper","getTransition","apptScheduleType","calendarId","apptEdit","apptId","MessageTransitionToHelper","getTransitionForMessage","messageId","createNew","fnGetTransition","registerOpts","parseOptionsFromLink","gesture","preventTransitions","xs","sm","md","lg","showDuration","AppointmentType","getDuration","getDurationString","SettingService","AppointmentScheduleTypes","appt","transitionType","displayDateType","displayStartTime","displayDate","getAppointmentsListSettings","displayEndTime","scheduleType","ScheduleType","isPatientVisit","PatientVisit","scheduleTypeDescription","Age","getPersonAgeAbbr","BirthDate","openAppointmentContextMenu","closeAppointmentContextMenu","getTemplateUrl","dataType","startIndex","dropIndex","sIndex","dindex","draggable","ssIndex","ddIndex","userList","users","clickHandler","reassignHandler","narrow","CurrentUser","currentUserId","userId","isRead","LastReadByUid","$modal","pharmacyDropDownSelection","pharmacyList","pharmacySelected","selectedPharmaryIndex","loadingPharmacy","pharmacyListData","deletePharmacy","pharmacyId","onDeletePatientPharmacy","selectPharmacy","guid","p","PatientPharmacyUid","deletePatientPharmacy","loadPatientPharmacies","setStart","startMoveIndex","setDrop","newList","array","from","to","splice","guidList","l","setPharmacyOrder","orderPharmacy","checkforOut","ph","visit","parsedAttr","offsetTop","ratio","stRatio","inputCollection","featureParam","features","featureList","len","substr","title","currentNote","disableFormatting","maxCharacters","generalNoteTypeKey","openModalOnly","modalInstance","windowClass","resolve","GeneralNotesRepository","generalNotesSupported","searchText","tinymceHeight","includeInactive","originalGeneralNoteType","searchGeneralNoteType","generalNoteTypeList","loadingSearch","initialLoading","getRemainingCharacters","maxLength","shouldSwapButtons","searchGeneralNotes","search","generalNoteList","savePromise","saveGeneralNoteTypeSetting","changeSearchCriteria","searchDebounceTime","appendNote","entry","Notes","promises","getGeneralNoteType","getList","onLoad","orderFn","loadData","items","intersectionBy","previouslySelected","done","load","getItemOrder","countSelected","sumBy","identity","ApConfirmCtrl","okText","cancelText","confirm","scanBarcode","scanResultCallback","barcodeId","unregister","StatusMessage","ScannedResultText","handlerFn","handlerOpts","zoneAwareRegister","attributeName","parsedFn","zoneAwareRegisterFromDirective","hmOptions","hmPropagation","hmTapOnly","zoneAwareHandlerFn","wrapToRunInZoneIfNecessary","shouldDestroy","Manager","propagating","PreventGhostClick","Press","registerHmClick","hammerEv","Event","stopSrcPropagation","isDefaultPrevented","defaultPrevented","ngHandler","registerNgClick","deferred","defer","animation","reject","promise","onOpen","itemFormatter","resultValue","innerValue","defaultFormatterParser","newArray","onClick","blur","childElement","setSelectionRange","indexOf","observeWithSelector","observerCallback","trackerElement","querySelector","intersectionObserver","IntersectionObserver","debug","documentGetStaticUrlPromise","mediaCallback","mediaId","pickMedia","Media","widgetViews","configurations","_getConfiguration","configName","dashboards","_getLayout","widgetSetName","widgets","view","pageViews","widget","TileDescriptorId","userPlaceable","clonedWidget","configurationView","displayName","getConfiguration","getLayout","getLayoutWithConfig","getWidgetsForLayout","selectableWidgets","getPatientDashboardWidgets","Heading","isTemplate","IsCollapsed","saveLayout","removePatientDashboardConfigurations","setPatientDashboardConfigurations","reloadConfigurations","StrConvert","warnings","addOrReplace","key","exist","replaceNewLine","warning","property","getAll","toast","timeout","bodyOutputType","onHideCallback","addScroller","easyScroller","updatePageFn","removeScroller","popupElement","trackByAttr","nameOfIterator","$uibPosition","ngHideClassRegex","popupScope","watch","updatePosition","recalculatePosition","outerWidth","popupBecomingVisible","classList","attributeOldValue","prop","hasAttribute","maxHeight","parseFloat","parentContainerElem","parentElemId","updateHeight","debouncedUpdateHeight","parentElement","availableHeight","updatedHeight","popupClassesValue","doubleClickTime","incrementalSaveTime","offsetWidth","getWindowWidth","getWindowHeight","newWindow"],"mappings":"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","file":"aprima-core-ui.min.js","sourcesContent":["\r\n\r\n\r\n angular.module('aprima-core-ui')\r\n .directive('apPharmacyTileDragDrop',[\r\n 'PatientRepository',\r\n '$uibModal',\r\n function (PatientRepository,$modal){\r\n 'use strict';\r\n return{\r\n scope:{\r\n patientId: '<',\r\n pharmacyDropDownSelection: '<',\r\n pharmacyList: '&',\r\n pharmacySelected:'&'\r\n },\r\n templateUrl:'/core-ui/views/directives/partials/apPharmacyTileDragDrop.html',\r\n link:function($scope){\r\n\r\n \r\n $scope.selectedPharmaryIndex=-1;\r\n $scope.selectedPharmaryIndex=$scope.pharmacyDropDownSelection;\r\n $scope.loadingPharmacy=false;\r\n $scope.pharmacyListData = [];\r\n $scope.deletePharmacy = deletePharmacy; \r\n $scope.selectPharmacy = selectPharmacy;\r\n $scope.onDeletePatientPharmacy = onDeletePatientPharmacy;\r\n $scope.isSelected = isSelected;\r\n $scope.setStart= setStart;\r\n $scope.setDrop= setDrop;\r\n\r\n var startMoveIndex=-1;\r\n\r\n loadPatientPharmacies();\r\n\r\n $scope.$watch('pharmacyDropDownSelection',function(){\r\n \r\n checkforOut();\r\n\r\n });\r\n\r\n function checkforOut(){ \r\n\r\n $scope.selectedPharmaryIndex = -1;\r\n angular.forEach($scope.pharmacyListData, function(ph){\r\n \r\n if(ph.PatientPharmacyUid === $scope.pharmacyDropDownSelection)\r\n {\r\n $scope.selectedPharmaryIndex = $scope.pharmacyDropDownSelection;\r\n }\r\n });\r\n\r\n }\r\n \r\n function setStart(startIndex){\r\n\r\n startMoveIndex = startIndex; \r\n\r\n }\r\n \r\n function setDrop(dropIndex){\r\n\r\n var newList = reorderArray($scope.pharmacyListData,startMoveIndex,dropIndex);\r\n $scope.pharmacyListData = []; \r\n $scope.pharmacyListData = newList;\r\n $scope.$apply(); \r\n orderPharmacy($scope.pharmacyListData,$scope.patientId);\r\n \r\n }\r\n\r\n\r\n function selectPharmacy(guid) {\r\n $scope.selectedPharmaryIndex = guid;\r\n var obj = $scope.pharmacyListData.find( function (p) {return p.PatientPharmacyUid === guid;} ); \r\n $scope.pharmacySelected({pharmacy:obj});\r\n \r\n }\r\n\r\n function reorderArray(array, from, to){\r\n var element = array[from];\r\n array.splice(from, 1);\r\n array.splice(to, 0, element);\r\n return array;\r\n }\r\n\r\n function isSelected(i){\r\n if($scope.selectedPharmaryIndex === i)\r\n return true;\r\n else\r\n return false;\r\n }\r\n\r\n function deletePharmacy(pharmacyId) { \r\n openModal().then(function (selectedItem) { \r\n if(selectedItem)\r\n { \r\n $scope.onDeletePatientPharmacy(pharmacyId);\r\n }\r\n });\r\n }\r\n\r\n \r\n function onDeletePatientPharmacy(guid){\r\n \r\n PatientRepository.deletePatientPharmacy(guid).then(function(){\r\n\r\n loadPatientPharmacies();\r\n });\r\n \r\n\r\n }\r\n\r\n function openModal () {\r\n \r\n var modalInstance = $modal.open({\r\n templateUrl: '/core-ui/modal-views/deletePatientPharmacyConfirmModal.html',\r\n controller: 'deletePatientPharmacyModalCtrl',\r\n controllerAs: 'vm' ,\r\n size:'sm' \r\n });\r\n return modalInstance.result;\r\n\r\n }\r\n\r\n function loadPatientPharmacies(){\r\n\r\n $scope.loadingPharmacy = true;\r\n PatientRepository.getPharmacies($scope.patientId).then(function (data) {\r\n var x = data;\r\n // get first 4 of patient pharmacy\r\n $scope.pharmacyListData = x.splice(0,4); \r\n checkforOut(); \r\n }).finally(function () {\r\n $scope.loadingPharmacy = false; \r\n });\r\n\r\n }\r\n\r\n function orderPharmacy(list, patientId){\r\n\r\n $scope.loadingPharmacy = true; \r\n var guidList = list.map(function(l){\r\n return l.PatientPharmacyUid;\r\n });\r\n PatientRepository.setPharmacyOrder(guidList, patientId).then(function(){ \r\n }).finally(function (){\r\n $scope.loadingPharmacy = false; \r\n });\r\n }\r\n \r\n }\r\n };\r\n }\r\n ]);\r\n\r\n angular.module('aprima-core-ui').controller('deletePatientPharmacyModalCtrl', [\r\n '$scope',\r\n '$uibModalInstance',\r\n deletePatientPharmacyModalCtrl,\r\n ]);\r\n\r\n function deletePatientPharmacyModalCtrl($scope,$modalInstance) {\r\n 'use strict';\r\n \r\n $scope.cancel = cancel;\r\n $scope.ok = ok;\r\n \r\n function cancel() {\r\n $modalInstance.dismiss(false);\r\n }\r\n\r\n function ok() {\r\n $modalInstance.close(true);\r\n }\r\n }","angular.module('aprima-core-ui', [\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 'ui.tinymce',\r\n 'ngSanitize',\r\n\r\n //aprima\r\n 'aprima-core',\r\n 'aprima-bridge',\r\n 'aprima-config',\r\n 'aprima-legacy-common',\r\n 'aprima-provider-api',\r\n]);","angular.module('aprima-core-ui').run(['$templateCache', function($templateCache) {\n 'use strict';\r\n\r\n $templateCache.put('/core-ui/component-views/ap-caching-settings.html',\r\n \"<div class=\\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"form-control-static\\\">\\r\" +\r\n \"\\n\" +\r\n \" Size: {{vm.totalSize()}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <button class=\\\"btn btn-primary\\\"\\r\" +\r\n \"\\n\" +\r\n \" hm-click=\\\"vm.clearAll()\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" Clear Cache\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-erx-request-details.html',\r\n \"<ap-erx-request-medication\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Refill Requested - Medication Prescribed'\\\"\\r\" +\r\n \"\\n\" +\r\n \" requested-med=\\\"vm.refillRequest.PrescribedMedication\\\"\\r\" +\r\n \"\\n\" +\r\n \" current-prescription=\\\"vm.prescription\\\">\\r\" +\r\n \"\\n\" +\r\n \"</ap-erx-request-medication>\\r\" +\r\n \"\\n\" +\r\n \"<ap-erx-request-medication\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Refill Requested - Medication Dispensed'\\\"\\r\" +\r\n \"\\n\" +\r\n \" requested-med=\\\"vm.refillRequest.DispensedMedication\\\">\\r\" +\r\n \"\\n\" +\r\n \"</ap-erx-request-medication>\\r\" +\r\n \"\\n\" +\r\n \"<ap-erx-request-patient\\r\" +\r\n \"\\n\" +\r\n \" requested-patient=\\\"vm.refillRequest\\\"\\r\" +\r\n \"\\n\" +\r\n \" current-patient=\\\"vm.patient\\\">\\r\" +\r\n \"\\n\" +\r\n \"</ap-erx-request-patient>\\r\" +\r\n \"\\n\" +\r\n \"<ap-erx-request-provider\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Prescriber'\\\"\\r\" +\r\n \"\\n\" +\r\n \" requested-provider=\\\"vm.refillRequest\\\">\\r\" +\r\n \"\\n\" +\r\n \"</ap-erx-request-provider>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-erx-request-dual-row.html',\r\n \"<div class=\\\"flex-table-col-group\\\" ng-if=\\\"vm.firstValue || vm.header()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{'flex-table-shaded': vm.header()}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"erx-fixed-label\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"vm.header() ? 'erx-header-label' : 'erx-field-label'\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::vm.label}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-equal\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{'erx-header-label': vm.header()}\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{vm.firstText || vm.firstValue}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-equal\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{'alert-warning': vm.warn() && vm.hasWarning(),\\r\" +\r\n \"\\n\" +\r\n \" 'erx-header-label': vm.header(),\\r\" +\r\n \"\\n\" +\r\n \" 'flex-table-disabled': !vm.header() && !vm.hasOwnProperty('secondText') && !vm.hasOwnProperty('secondValue')}\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{vm.secondText || vm.secondValue}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-erx-request-full-row.html',\r\n \"<div class=\\\"flex-table-col-group\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"vm.value\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{'flex-table-shaded': vm.header()}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"erx-fixed-label erx-field-label\\\" ng-if=\\\"!vm.header()\\\">{{::vm.label}}</div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-auto\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{'erx-header-label': vm.header()}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-transclude>\\r\" +\r\n \"\\n\" +\r\n \" {{vm.value}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-erx-request-medication.html',\r\n \"<div class=\\\"panel panel-default panel-flush\\\" ng-if=\\\"vm.requestedMed\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"panel-heading clickable\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.isOpen = !vm.isOpen\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"pull-right panel-collapser\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ng-class=\\\"vm.isOpen ? 'ap-chevron-up-blue' : 'ap-chevron-down-blue'\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" {{::vm.label}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-table-bordered flex-table-hyphens\\\" uib-collapse=\\\"!vm.isOpen\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"vm.hasOwnProperty('currentPrescription')\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"flex-table-top\\\"\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'eRx Med'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"'eRx Value'\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"'Selected Value'\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Description'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.Name\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-text=\\\"vm.medDescriptionText(vm.requestedMed.Name, vm.requestedMed.NDCDescription)\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.currentPrescription.DrugDescription\\\"\\r\" +\r\n \"\\n\" +\r\n \" warn=\\\"true\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'DEA Schedule'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.DEASchedule\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Patient Instructions'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.Sig\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Quantity'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.Quantity\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-text=\\\"vm.requestedMed.QuantityDescription\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.currentPrescription.Instructions[0].TotalQuantity\\\"\\r\" +\r\n \"\\n\" +\r\n \" warn=\\\"true\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Days Supply'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.Duration\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Refills'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.RefillDescription\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.refills(vm.currentPrescription)\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Pharmacy Notes'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.Comment\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Substitution'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.SubstitutionTerm\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.substitutionText(vm.currentPrescription)\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Strength'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.StrengthDescription\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.strengthText(vm.currentPrescription)\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Product Code'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.ProductCodeDescription\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.productCodeText(vm.currentPrescription)\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Drug DB Code'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.DrugDBCodeDescription\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.drugDbCodeText(vm.currentPrescription)\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Form Code'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedMed.FormDescription\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.drugFormText(vm.currentPrescription)\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"!vm.hasOwnProperty('currentPrescription')\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"flex-table-top\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"'eRx Med'\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Description'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.medDescriptionText(vm.requestedMed.Name, vm.requestedMed.NDCDescription)\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'DEA Schedule'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.DEASchedule\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Patient Instructions'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.Sig\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Quantity'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.QuantityDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Days Supply'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.Duration\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Refills'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.RefillDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Pharmacy Notes'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.Comment\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Substitution'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.SubstitutionTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Strength'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.StrengthDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Product Code'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.ProductCodeDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Drug DB Code'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.DrugDBCodeDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Form Code'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.FormDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"vm.hasDetails()\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"'eRx Request Details'\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Written Date'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.WrittenDate\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter date=\\\"{{vm.requestedMed.WrittenDate}}\\\" format=\\\"date\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-full-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Last Fill Date'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.LastFillDate\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter date=\\\"{{vm.requestedMed.LastFillDate}}\\\" format=\\\"date\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-full-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Expiration Date'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.ExpirationDate\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter date=\\\"{{vm.requestedMed.ExpirationDate}}\\\" format=\\\"date\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-full-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Effective Date'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.EffectiveDate\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter date=\\\"{{vm.requestedMed.EffectiveDate}}\\\" format=\\\"date\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-full-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Period End'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.PeriodEnd\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter date=\\\"{{vm.requestedMed.PeriodEnd}}\\\" format=\\\"date\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-full-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Date Validated'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.DateValidated\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter date=\\\"{{vm.requestedMed.DateValidated}}\\\" format=\\\"date\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-full-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Sold Date'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.SoldDate\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter date=\\\"{{vm.requestedMed.SoldDate}}\\\" format=\\\"date\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-full-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Prior Authorization'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.PriorAuthorizationDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Prior Authorization Status'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedMed.PriorAuthorizationStatusTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-repeat=\\\"diagnosis in vm.requestedMed.Diagnoses track by $index\\\">\\r\" +\r\n \"\\n\" +\r\n \" <!--use / at end instead of closing tag, so that there is no transcluded content-->\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"'Diagnosis ' + ($index + 1)\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Primary'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"diagnosis.PrimaryDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Secondary'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"diagnosis.SecondaryDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Clinical Info'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"diagnosis.ClinicalInformationQualifierTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-repeat=\\\"drugUseEval in vm.requestedMed.DrugUseEvaluations track by $index\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"'Drug Use Evaluation ' + ($index + 1)\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Service Reason'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"drugUseEval.ServiceReasonTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Professional Service'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"drugUseEval.ProfessionalServiceTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Service Result'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"drugUseEval.ServiceResultTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'CoAgent'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"drugUseEval.CoAgentDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Clinical Significance'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"drugUseEval.ClinicalSignificanceTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Acknowledgement Reason'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"drugUseEval.AcknowledgementReason\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"vm.requestedMed.DrugCoverageStatuses.length\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"'Drug Coverage Status'\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" ng-repeat=\\\"drugCoverageStatus in vm.requestedMed.DrugCoverageStatuses track by $index\\\"\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Status'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"drugCoverageStatus\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-repeat=\\\"sig in vm.requestedMed.StructuredSigs track by $index\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"'Structured SIG ' + ($index + 1)\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Sequence'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.RepeatingSigSequenceDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Free Text'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.SigFreeText\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Dose Composite Indicator'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.DoseCompositeIndicatorTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Dose Delivery Method'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.DoseDeliveryMethodDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Dose Delivery Modifier'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.DoseDeliveryMethodModifierDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Dose'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.DoseQuantityDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Dosing Basis'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.DosingBasisDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Body Metric'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.BodyMetricDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Calculated Dose'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.CalculatedDoseDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Vehicle'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.VehicleNameDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Vehicle Quantity'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.VehicleQuantityDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Route of Administration'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.RouteofAdministrationDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Site of Administration'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.SiteofAdministrationDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Administration Timing'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.AdministrationTimingDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Rate of Administration'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.RateOfAdministrationDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Timing Basis'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.TimePeriodBasisDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Frequency'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.FrequencyDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Interval'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.IntervalDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Duration'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.DurationDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Maximum Dose'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.MaximumDoseDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Maximum Dose Variable'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.MaximumDoseVariableDescription\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Stop Indicator'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"sig.StopIndicatorTerm\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-erx-request-patient.html',\r\n \"<div class=\\\"panel panel-default panel-flush\\\" ng-if=\\\"vm.requestedPatient\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"panel-heading clickable\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.isOpen = !vm.isOpen\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"pull-right panel-collapser\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ng-class=\\\"vm.isOpen ? 'ap-chevron-up-blue' : 'ap-chevron-down-blue'\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" Patient\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-table-bordered flex-table-hyphens\\\" uib-collapse=\\\"!vm.isOpen\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"flex-table-top\\\"\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'eRx Patient'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"'eRx Value'\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"'Selected Value'\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Name'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedPatient.PatientLastName + ',' + vm.requestedPatient.PatientFirstName\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-text=\\\"vm.requestedPatient.PatientFullName\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.currentPatient.LastName + ',' + vm.currentPatient.FirstName\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-text=\\\"vm.currentPatient.Name\\\"\\r\" +\r\n \"\\n\" +\r\n \" warn=\\\"true\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Date of Birth'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedPatient.PatientDob\\\"\\r\" +\r\n \"\\n\" +\r\n \" second-value=\\\"vm.currentPatient.BirthDate\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-dual-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Address'\\\"\\r\" +\r\n \"\\n\" +\r\n \" first-value=\\\"vm.requestedPatient.PatientAddress + ', ' + vm.requestedPatient.PatientCityStateZip\\\">\\r\" +\r\n \"\\n\" +\r\n \" </ap-erx-request-dual-row>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-erx-request-provider.html',\r\n \"<div class=\\\"panel panel-default panel-flush\\\" ng-if=\\\"vm.requestedProvider\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"panel-heading clickable\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.isOpen = !vm.isOpen\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"pull-right panel-collapser\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ng-class=\\\"vm.isOpen ? 'ap-chevron-up-blue' : 'ap-chevron-down-blue'\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" {{::vm.label}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-table-bordered flex-table-hyphens\\\" uib-collapse=\\\"!vm.isOpen\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"flex-table-top\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"'eRx Provider'\\\"\\r\" +\r\n \"\\n\" +\r\n \" header=\\\"true\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Name'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedProvider.PhysicianFullName\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Address'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.requestedProvider.PhysicianAddress + ', ' + vm.requestedProvider.PhysicianCityStateZip\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Identification'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.identification(vm.requestedProvider)\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" <ap-erx-request-full-row\\r\" +\r\n \"\\n\" +\r\n \" label=\\\"'Phone'\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.PhysicianPhone\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-multi-select-button.html',\r\n \"<button class=\\\"btn btn-default btn-input-form-control overflow-ellipsis\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.onClick()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.ngDisabled()\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"ap-plus-blue pull-right\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <span>\\r\" +\r\n \"\\n\" +\r\n \" {{vm.innerValue}}\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"</button>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/ap-multi-select-fa-button.html',\r\n \"<button class=\\\"btn btn-default btn-input-form-control overflow-ellipsis\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.onClick()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.ngDisabled()\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"fa fa-plus pull-right\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <span>\\r\" +\r\n \"\\n\" +\r\n \" {{vm.innerValue}}\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"</button>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/apDocumentViewWithDownload.html',\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<div>\\r\" +\r\n \"\\n\" +\r\n \" <ap-document-viewer \\r\" +\r\n \"\\n\" +\r\n \" disable-fullscreen=\\\"$ctrl.disableFullscreen\\\"\\r\" +\r\n \"\\n\" +\r\n \" disable-inline-pdf=\\\"$ctrl.disableInlinePdf\\\"\\r\" +\r\n \"\\n\" +\r\n \" load-function=\\\"$ctrl.onDocumentLoad(documentId, requestSettings)\\\" \\r\" +\r\n \"\\n\" +\r\n \" document-id=\\\"$ctrl.documentId\\\"\\r\" +\r\n \"\\n\" +\r\n \" ></ap-document-viewer>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"<div class=\\\"text-center\\\" ng-show=\\\"$ctrl.canOpenInSeparateTab() && !$ctrl.loadingDocument\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span>{{'Click ' | translate}}<a ng-click=\\\"$ctrl.onDocumentOpenInSeparateTab($ctrl.documentId)\\\">{{'here' | translate}}</a>{{' to view in a separate tab.' | translate}}</span>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"<div class=\\\"text-center\\\" ng-show=\\\"$ctrl.canDownloadDocument() && !$ctrl.loadingDocument\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ng-hide=\\\"$ctrl.downloadingDocument\\\">{{'Download ' | translate}}<a\\r\" +\r\n \"\\n\" +\r\n \" ap-save-to-file=\\\"$ctrl.onDocumentDownload($ctrl.documentId)\\\"\\r\" +\r\n \"\\n\" +\r\n \" file-name=\\\"{{$ctrl.downloadFileName}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" >{{'here.' | translate}}</a></span>\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner ng-show=\\\"$ctrl.downloadingDocument\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/component-views/tinymce.html',\r\n \"<textarea\\r\" +\r\n \"\\n\" +\r\n \" ui-tinymce=\\\"$ctrl.tinymceOptions\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"$ctrl.value\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model-options=\\\"$ctrl.tinymceModelOptions\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-change=\\\"$ctrl.onChange()\\\"\\r\" +\r\n \"\\n\" +\r\n \"></textarea>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/modal-views/deletePatientPharmacyConfirmModal.html',\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-body delete-patient-pharmacy-modal-text\\\" >\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"menu-chevron material-icons delete-patient-pharmacy-modal-icon\\\" style=\\\"font-size: 40px;\\\" >info</span>\\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" <div >\\r\" +\r\n \"\\n\" +\r\n \" <div>Are you sure you want to remove this pharmacy from the patient's account?</div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" <!-- <div style=\\\"font-size: 20px;\\\">Doing so also removes it from this patient's account</div> -->\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-footer\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-table-col-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-equal\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\" class=\\\"btn btn-primary btn-block keep-whitespace-line btn-full-height\\\" ng-click=\\\"ok()\\\">Remove</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-equal\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\" class=\\\"btn btn-default btn-block keep-whitespace-line btn-full-height\\\" ng-click=\\\"cancel()\\\">Cancel</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" \"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/modal-views/generalNotesModal.html',\r\n \"<div ap-full-modal ap-full-modal-always class=\\\"modal-v18 modal-general-notes\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-header\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"row\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-8 heading-title modal-title\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{vm.title}}\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner ng-show=\\\"vm.initialLoading\\\" class=\\\"ng-hide\\\" size=\\\"1\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"gnm-close-x\\\" type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"vm.cancel()\\\">×</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-body\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"row row-full\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-3\\\" id=\\\"search-section\\\" ng-if=\\\"::vm.generalNotesSupported\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"search-section-content\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class= \\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label for=\\\"searchInput\\\">Search</label>\\r\" +\r\n \"\\n\" +\r\n \" <input type=\\\"text\\\" id=\\\"searchInput\\\" ng-model=\\\"vm.searchText\\\" class=\\\"form-control\\\" ng-change=\\\"vm.changeSearchCriteria()\\\">\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label class=\\\"control-label\\\">{{'General Note Type' | translate}}</label>\\r\" +\r\n \"\\n\" +\r\n \" <ap-select>\\r\" +\r\n \"\\n\" +\r\n \" <select class=\\\"form-control\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"GeneralNoteTypeId\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.searchGeneralNoteType\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-options=\\\"entry.Name for entry in vm.generalNoteTypeList track by entry.Id\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-change=\\\"vm.changeSearchCriteria()\\\"\\r\" +\r\n \"\\n\" +\r\n \" >\\r\" +\r\n \"\\n\" +\r\n \" </select>\\r\" +\r\n \"\\n\" +\r\n \" </ap-select>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div>\\r\" +\r\n \"\\n\" +\r\n \" <input type=\\\"checkbox\\\"\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"generalNoteIncludeInactive\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.includeInactive\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-change=\\\"vm.changeSearchCriteria()\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label for=\\\"generalNoteIncludeInactive\\\">{{'Include Inactive' | translate}}</label>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"search-section-results\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"spinner-container text-center\\\" ng-if=\\\"vm.loadingSearch\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner size=\\\"3\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-repeat=\\\"entry in vm.generalNoteList track by entry.Id\\\" ng-if=\\\"!vm.loadingSearch\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-group-item\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-heading overflow-ellipsis\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.appendNote(entry)\\\" id=\\\"gnm-result-{{$index}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"pull-right\\\"><i class=\\\"ap-chevron-right-gray\\\"></i></span>\\r\" +\r\n \"\\n\" +\r\n \" {{::entry.Name}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div id=\\\"tinymce-section\\\" ng-class=\\\"::vm.generalNotesSupported ? 'col-xs-9 col-flush-left' : 'col-xs-12'\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-text\\\" ng-if=\\\"vm.disableFormatting && !!vm.maxCharacters\\\">\\r\" +\r\n \"\\n\" +\r\n \" ({{vm.getRemainingCharacters()}} {{'of' | translate}} {{vm.maxCharacters}})\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <tinymce\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"gnm-tinymce\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"!vm.disableFormatting\\\"\\r\" +\r\n \"\\n\" +\r\n \" height='vm.tinymceHeight'\\r\" +\r\n \"\\n\" +\r\n \" use-advanced-toolbar=\\\"vm.useAdvancedToolbar\\\"\\r\" +\r\n \"\\n\" +\r\n \" value=\\\"vm.currentNote\\\"\\r\" +\r\n \"\\n\" +\r\n \" />\\r\" +\r\n \"\\n\" +\r\n \" <textarea\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"gnm-textarea\\\" \\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"vm.disableFormatting\\\" \\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"!!vm.maxCharacters ? 'textarea-full display-char' : 'textarea-full'\\\" \\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.currentNote\\\"\\r\" +\r\n \"\\n\" +\r\n \" maxlength=\\\"{{vm.maxCharacters}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" </textarea>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-footer modal-footer-multi-button\\\" ng-class=\\\"vm.shouldSwapButtons() ? 'prm-button-order' : ''\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"gnm-cancel\\\" type=\\\"button\\\" class=\\\"btn btn-primary\\\" ng-click=\\\"vm.cancel()\\\">{{'Cancel' | translate}}</button>\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"gnm-ok\\\" type=\\\"button\\\" class=\\\"btn btn-primary\\\" ng-click=\\\"vm.ok()\\\">{{'OK' | translate}}</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/modal-views/multi-select-list-item-modal.html',\r\n \"<div class=\\\"modal-noborder\\\" ap-full-modal>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-header\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'Select All That Apply:' | translate}} ({{vm.countSelected()}})\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"close\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.cancel()\\\">\\r\" +\r\n \"\\n\" +\r\n \" ×\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-body\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"!vm.httpError\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div ng-repeat=\\\"item in vm.items | orderBy: vm.getItemOrder track by item.Id\\\">\\r\" +\r\n \"\\n\" +\r\n \" <input type=\\\"checkbox\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-checkbox-label=\\\"{{vm.formatter(item)}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"select-item-{{$index}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"item.selected\\\">\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-footer modal-footer-multi-button\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"btn btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.clear()\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'Clear' | translate}}\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"btn btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.load(true)\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'Refresh List' | translate}}\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"fa fa-refresh\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"btn btn-primary\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.done()\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" {{::'Done' | translate}}\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/confirm.html',\r\n \"<div id=\\\"ap-confirm\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-header\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"vm.cancel()\\\">×</button>\\r\" +\r\n \"\\n\" +\r\n \" <h4 class=\\\"modal-title\\\" ng-bind-html=\\\"vm.message\\\"></h4>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"modal-footer\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-table-col-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-equal\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"ok-button\\\" class=\\\"btn btn-primary btn-block keep-whitespace-line btn-full-height\\\" type=\\\"button\\\" ng-click=\\\"vm.close(true)\\\">{{vm.okText}}</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"flex-equal\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"cancel-button\\\" class=\\\"btn btn-default btn-block keep-whitespace-line btn-full-height\\\" type=\\\"button\\\" ng-click=\\\"vm.close(false)\\\">{{vm.cancelText}}</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apAddress.html',\r\n \"<address ng-if=\\\"address\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a ng-click=\\\"openMap()\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::address.Address1}}\\r\" +\r\n \"\\n\" +\r\n \" <br/>\\r\" +\r\n \"\\n\" +\r\n \" {{::address.Address2}}\\r\" +\r\n \"\\n\" +\r\n \" <br ng-if=\\\"address.Address2\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" {{::address.City}}<span ng-if=\\\"address.City && (address.State || address.Zip)\\\">,</span> {{::address.State}} {{::address.Zip}}\\r\" +\r\n \"\\n\" +\r\n \" {{::address.Country}}\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \"</address>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apAppointmentContextMenu.html',\r\n \"<div class=\\\"context-menu\\\" id=\\\"appt-context-menu\\\" ng-cloak>\\r\" +\r\n \"\\n\" +\r\n \" <ul class=\\\"dropdown-menu position-fixed\\\" role=\\\"menu\\\">\\r\" +\r\n \"\\n\" +\r\n \" <li class=\\\"dropdown-header\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span translate>Actions</span>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"appointment.PatientId\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\"\\r\" +\r\n \"\\n\" +\r\n \" role=\\\"menuitem\\\"\\r\" +\r\n \"\\n\" +\r\n \" tabindex=\\\"1\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'patientDashboard', opts: {id: appointment.PatientId, appointmentId: appointment.Id}}\\\" translate>\\r\" +\r\n \"\\n\" +\r\n \" View Patient Dashboard\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li>\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\"\\r\" +\r\n \"\\n\" +\r\n \" role=\\\"menuitem\\\"\\r\" +\r\n \"\\n\" +\r\n \" tabindex=\\\"2\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-ap-transition-to-appointment\\r\" +\r\n \"\\n\" +\r\n \" data-appt-schedule-type=\\\"{{appointment.ScheduleType}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-appt-id=\\\"{{appointment.Id}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" View Appointment\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"schedulePermissionAllowed\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\"\\r\" +\r\n \"\\n\" +\r\n \" role=\\\"menuitem\\\"\\r\" +\r\n \"\\n\" +\r\n \" tabindex=\\\"3\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-ap-transition-to-appointment\\r\" +\r\n \"\\n\" +\r\n \" data-appt-schedule-type=\\\"{{appointment.ScheduleType}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-appt-id=\\\"{{appointment.Id}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-appt-edit=\\\"true\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" Edit Appointment\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"schedulePermissionAllowed\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\"\\r\" +\r\n \"\\n\" +\r\n \" role=\\\"menuitem\\\"\\r\" +\r\n \"\\n\" +\r\n \" tabindex=\\\"4\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-ap-transition-to-appointment\\r\" +\r\n \"\\n\" +\r\n \" data-appt-schedule-type=\\\"{{appointment.ScheduleType}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-patient-id=\\\"{{appointment.PatientId}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-calendar-id=\\\"{{appointment.Calendar.Id}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" Add Appointment\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"appointment.PatientId\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\"\\r\" +\r\n \"\\n\" +\r\n \" role=\\\"menuitem\\\"\\r\" +\r\n \"\\n\" +\r\n \" tabindex=\\\"6\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"start-charge-capture\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"getChargeCaptureTransition\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-authorization provider-required=\\\"true\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" Start eMDs Rounds\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" </ul>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apDashboardTileHeader.html',\r\n \"<div class=\\\"panel-heading clickable\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"toggle()\\\"\\r\" +\r\n \"\\n\" +\r\n \" hm-propagation=\\\"true\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-transclude>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<div class=\\\"panel-heading panel-header-sticky clickable\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"toggle()\\\"\\r\" +\r\n \"\\n\" +\r\n \" hm-propagation=\\\"true\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-transclude>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apDataGroup.html',\r\n \"<div class=\\\"col-xs-6 col-md-3 col-lg-2\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"normal === 'false' ? 'text-danger' : ''\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"ap-label\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{label}} \\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <br/>\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"ap-value\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{value}} \\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apDateRangeFormatter.html',\r\n \"<span ng-if=\\\"!multiline\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"start-date\\\" ap-date-formatter data-jsdate=\\\"startDate\\\" data-format=\\\"{{format}}\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"endDate\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span translate>to</span>\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter class=\\\"end-date\\\" data-jsdate=\\\"endDate\\\" data-format=\\\"{{format}}\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"</span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<!-- white space and new lines intentional and necessary! DO NOT REFORMAT THIS! -->\\r\" +\r\n \"\\n\" +\r\n \"<!-- if you have a better way to horizontally and vertically align text, feel free to refactor this.\\r\" +\r\n \"\\n\" +\r\n \" white-space: pre is the magic sauce-->\\r\" +\r\n \"\\n\" +\r\n \"<span ng-if=\\\"multiline\\\" style=\\\"white-space: pre;\\\"><span ap-date-formatter class=\\\"start-date\\\" data-jsdate=\\\"startDate\\\" data-format=\\\"{{format}}\\\"></span><span ng-if=\\\"endDate\\\">\\r\" +\r\n \"\\n\" +\r\n \"<span translate>to</span>\\r\" +\r\n \"\\n\" +\r\n \"<span ap-date-formatter class=\\\"end-date\\\" data-jsdate=\\\"endDate\\\" data-format=\\\"{{format}}\\\"></span></span></span>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apDocumentViewer.html',\r\n \"<div class=\\\"attachment-viewer\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"isImage\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"attachment-viewer-image\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-image-viewer\\r\" +\r\n \"\\n\" +\r\n \" current-page=\\\"pageDetails.currentPage\\\"\\r\" +\r\n \"\\n\" +\r\n \" disable-fullscreen=\\\"disableFullscreen\\\"\\r\" +\r\n \"\\n\" +\r\n \" image-data=\\\"attachment.imageData\\\"\\r\" +\r\n \"\\n\" +\r\n \" page-count=\\\"attachment.PageCount\\\"\\r\" +\r\n \"\\n\" +\r\n \" load-page=\\\"loadPage(page)\\\"\\r\" +\r\n \"\\n\" +\r\n \" ></ap-image-viewer>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"isText\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"attachment-viewer-text\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{attachment.textData}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"isHtml\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"attachment-viewer-html\\\">\\r\" +\r\n \"\\n\" +\r\n \" <!-- tried to dynamically set the height of the frame using http://stackoverflow.com/questions/25880671/how-to-set-the-iframe-content-height-in-my-case\\r\" +\r\n \"\\n\" +\r\n \" This did not work because this page is loaded over http:// and the iframe is loaded with data: and browsers do not allow you to access\\r\" +\r\n \"\\n\" +\r\n \" the contents of iframes when the protocols don't match. -->\\r\" +\r\n \"\\n\" +\r\n \" <iframe ng-src=\\\"{{attachment.htmlData}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" width=\\\"100%\\\"\\r\" +\r\n \"\\n\" +\r\n \" height=\\\"800\\\">\\r\" +\r\n \"\\n\" +\r\n \" </iframe>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"isPdf\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"attachment-viewer-pdf\\\">\\r\" +\r\n \"\\n\" +\r\n \" <p ng-if=\\\"disableInlinePdf\\\" class=\\\"text-center\\\">{{::'This browser is unable to display the document inside of this webpage.' | translate}}</p>\\r\" +\r\n \"\\n\" +\r\n \" <ap-pdf ng-if=\\\"!disableInlinePdf\\\" src=\\\"attachment.pdfData\\\"></ap-pdf>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-show=\\\"!isPdf && !isHtml && !isText && !isImage && !loadingAttachment && !loadError\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"attachment-viewer-unsupported\\\">\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <span ng-show=\\\"attachment.Extension\\\" class=\\\"warning\\\">{{::'Attachment type is not supported' | translate}} ({{attachment.Extension}}).</span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-show=\\\"!attachment.Extension\\\" class=\\\"warning\\\">{{::'Attachment type is not known and cannot be displayed.' | translate}}</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-show=\\\"loadingAttachment && !isImage\\\" class=\\\"col-xs-12 text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner size=\\\"3\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-show=\\\"loadError\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"attachment-viewer-error\\\">\\r\" +\r\n \"\\n\" +\r\n \" <uib-alert type=\\\"danger\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::\\\"An error has occurred and the document could not be loaded.\\\" | translate}}\\r\" +\r\n \"\\n\" +\r\n \" <br />\\r\" +\r\n \"\\n\" +\r\n \" {{::\\\"Please download the document to view it.\\\" | translate}}\\r\" +\r\n \"\\n\" +\r\n \" </uib-alert>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apIcdCodeModal.html',\r\n \"<div id=\\\"icd-10-search-modal\\\" ap-full-modal>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"modal-header\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<button type=\\\"button\\\" class=\\\"close\\\" hm-click=\\\"$dismiss('editing')\\\">×</button><div class=\\\"modal-title\\\"><button class=\\\"btn btn-primary btn-nofill btn-xs vertical-centered btn-inverse\\\" ng-disabled=\\\"topLevel\\\" ng-hide=\\\"codeType === 'ICD9'\\\" hm-click=\\\"searchLevelUp();\\\"><i class=\\\"fa fa-arrow-up\\\"></i></button> {{displayCode}} Codes </div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"modal-body\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<div class=\\\"modal-container\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<div class=\\\"ng-hide\\\" ng-show=\\\"!loading\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<h4 class=\\\"text-center\\\" style=\\\"margin-bottom: 5px;\\\">Modifiers</h4>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<div class=\\\"text-center swipe-indicator\\\" ng-hide=\\\"modifierCategories.length <= 1\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t<i ng-repeat=\\\"category in modifierCategories track by $index\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"fa\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t ng-class=\\\"modifierIndex === $index ? 'fa-circle' : 'fa-circle-o'\\\"/>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<ap-swipeable scroll-div=\\\".modal-body\\\" auto-resize=\\\"true\\\" current-pane=\\\"modifierIndex\\\" class=\\\"autoscaling-swipe-container\\\" ng-hide=\\\"modifierCategories.length == 0\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t<div class=\\\"panel panel-default panel-bordered\\\" ng-repeat=\\\"category in modifierCategories track by $index\\\" id=\\\"modifier-panel-{{$index}}\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t<div class=\\\"panel-heading\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t<h3 class=\\\"panel-title text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t\t{{ category.Description }}\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t</h3>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t<ul class=\\\"list-group\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t<li class=\\\"list-group-item\\\" ng-repeat=\\\"modifier in category.Modifiers\\\" \\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t\tng-class=\\\"{'selected' : modifier.isSelected, 'disabled' : modifier.disabled}\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t\tng-disabled=\\\"modifier.disabled\\\" hm-click=\\\"modifierSelected(modifier)\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t\t<div>{{modifier.Description}}</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t\t</li>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t</ul>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t</ap-swipeable>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<h4 class=\\\"text-center\\\">Codes ({{filteredCodes.length}})</h4>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<ul class=\\\"list-group\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t<li id=\\\"filtered-dx-code-{{$index}}\\\" class=\\\"list-group-item\\\" ng-repeat=\\\"diagnosis in filteredCodes\\\" hm-click=\\\"diagnosisSelected(diagnosis)\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t\t({{::diagnosis.DiagnosisCode10 || diagnosis.DiagnosisCode9}}) {{::diagnosis.DiagnosisDescription}}\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t</li>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t</ul>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<div id=\\\"icd-modal-spinner ng-hide\\\" ng-show=\\\"loading\\\" class=\\\"spinner-container text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<ap-spinner size=\\\"3\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<div class=\\\"col-xs-12 ng-hide\\\" ng-show=\\\"httpError\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<uib-alert type=\\\"danger\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t{{::\\\"An error has occurred and the icd codes could not be loaded.\\\" | translate}}\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t</uib-alert>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apImageViewer.html',\r\n \"<div class=\\\"image-viewer\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"row image-container\\\" ng-cloak>\\r\" +\r\n \"\\n\" +\r\n \"\t\t<div ng-show=\\\"!loadingImage\\\" class=\\\"image-display-host\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<img class=\\\"image-display\\\" ng-src=\\\"{{imageData}}\\\" hm-options=\\\"{preventDefault: true, dragLockToAxis: true, dragBlockHorizontal: true}\\\" \\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\thm-pinch=\\\"onPinch\\\" hm-doubletap=\\\"onTap()\\\" hm-pinchend=\\\"onRelease\\\" hm-panend=\\\"onRelease\\\" hm-panmove=\\\"onDrag\\\" hm-swipe=\\\"onSwipe\\\" />\\r\" +\r\n \"\\n\" +\r\n \" <div ng-show=\\\"!disableFullscreen\\\" class=\\\"fullscreen-overlay\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"pull-right fa fa-arrows-alt\\\" ng-click=\\\"isFullScreenMode = true;\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t<div ng-show=\\\"loadingImage\\\" class=\\\"container image-loading-host\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<ap-spinner size=\\\"3\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"text-center image-footer\\\" ng-show=\\\"pageCount > 1\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<nav>\\r\" +\r\n \"\\n\" +\r\n \" <uib-pagination total-items=\\\"pageCount\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"currentPage\\\"\\r\" +\r\n \"\\n\" +\r\n \" max-size=\\\"4\\\"\\r\" +\r\n \"\\n\" +\r\n \" items-per-page=\\\"1\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-change=\\\"moveToPage()\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"pagination-sm image-viewer-paginator\\\"\\r\" +\r\n \"\\n\" +\r\n \" boundary-links=\\\"true\\\">\\r\" +\r\n \"\\n\" +\r\n \" </uib-pagination>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</nav>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-show=\\\"isFullScreenMode\\\" class=\\\"fullscreen-image-viewer ng-hide\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"fullscreen-overlay\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"pull-right fa fa-times\\\" ng-click=\\\"isFullScreenMode = false;\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <img class=\\\"fullscreen-image-display\\\" ng-hide=\\\"loadingImage\\\" ng-src=\\\"{{imageData}}\\\" hm-options=\\\"{preventDefault: true, dragLockToAxis: true, dragBlockHorizontal: true}\\\" \\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\thm-pinch=\\\"onFsPinch\\\" hm-doubletap=\\\"onFsTap()\\\" hm-pinchend=\\\"onFsRelease\\\" hm-panend=\\\"onFsRelease\\\" hm-panmove=\\\"onFsDrag\\\" hm-swipe=\\\"onFsSwipe\\\" />\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apLoadingModal.html',\r\n \"<div ap-full-modal ap-full-modal-always>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"modal-header\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"$emit('modal-cancel');\\\">×</button>\\r\" +\r\n \"\\n\" +\r\n \" <h4 class=\\\"modal-title\\\" translate>Loading</h4>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"modal-body\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<div class=\\\"col-xs-12 text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<ap-spinner data-size=\\\"3\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apMediaPicker.html',\r\n \"<div>\\r\" +\r\n \"\\n\" +\r\n \" <button class=\\\"btn btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"!image\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"pickImage()\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'Pick Image' | translate}}\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" <img class=\\\"col-xs-flush clickable img-responsive\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-src=\\\"data:image/jpeg;base64,{{image}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"image\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"pickImage()\\\">\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apMessageAssignTo.html',\r\n \"<div class=\\\"row\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-12 col-flush\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"detail-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label class=\\\"control-label\\\" translate>Assigned To</label>\\r\" +\r\n \"\\n\" +\r\n \" <ap-select>\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"input-group-btn\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"reassign-msg-tocreator\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"btn btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"reassignHandler()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"message.Status === 'Complete'\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"fa fa-reply\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <select ng-disabled=\\\"message.Status == 'Complete'\\\" class=\\\"form-control\\\"\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"userList\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"userList\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"userList.Assigned\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-options=\\\"user.Name for user in users track by user.UserId\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-change=\\\"clickHandler()\\\">\\r\" +\r\n \"\\n\" +\r\n \" </select>\\r\" +\r\n \"\\n\" +\r\n \" </ap-select>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apMessageIcon.html',\r\n \"<span ng-switch=\\\"iconName\\\" class=\\\"message-icon\\\" title=\\\"{{iconName}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"lab-urgent\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-lab-important\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"lab-complete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-lab-read\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"lab-incomplete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-lab-unread\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" \\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"phone-urgent\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-phone-important\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"phone-complete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-phone-read\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"phone-incomplete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-phone-unread\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"rx-urgent\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-rx-important\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"rx-complete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-rx-read\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"rx-incomplete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-rx-unread\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"message-urgent\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-generic-important\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"message-complete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-generic-read\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-when=\\\"message-incomplete\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-generic-unread\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <span ng-switch-default>\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-message-generic-unread\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"</span>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apMessageNewNote.html',\r\n \"<div class=\\\"row\\\" ng-if=\\\"vm.message.Status !== 'Complete'\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-12 col-flush\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label class=\\\"control-label\\\" translate>New Note</label>\\r\" +\r\n \"\\n\" +\r\n \" <ap-select ng-if=\\\"vm.generalNoteTypeId\\\">\\r\" +\r\n \"\\n\" +\r\n \" <select class=\\\"form-control\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"NotesList\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"!vm.message.LockInfo.HaveLock\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.selectedNote\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-options=\\\"generalNote.Notes as generalNote.Name for generalNote in vm.generalNotes\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-change=\\\"vm.selectedNoteChanged()\\\">\\r\" +\r\n \"\\n\" +\r\n \" </select>\\r\" +\r\n \"\\n\" +\r\n \" </ap-select>\\r\" +\r\n \"\\n\" +\r\n \" <br ng-if=\\\"vm.generalNoteTypeId\\\" />\\r\" +\r\n \"\\n\" +\r\n \" <textarea id=\\\"message-note\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"!vm.message.LockInfo.HaveLock\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"form-control\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"Note\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.newNote\\\"\\r\" +\r\n \"\\n\" +\r\n \" rows=\\\"1\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-trim=\\\"false\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-auto-grow>\\r\" +\r\n \"\\n\" +\r\n \" </textarea>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apMessageNotes.html',\r\n \"<div class=\\\"row\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-12 col-flush\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label class=\\\"control-label\\\" translate>Message Notes</label>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"row\\\" ng-if=\\\"(messageNotes && messageNotes.length === 0) || (!messageNotes && !message.LatestNote)\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span translate>None</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <!-- TODO: remove when all servers return messageNotes -->\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"row\\\" ng-if=\\\"!messageNotes && message.LatestNote\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-offset-1\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"ap-label\\\">\\r\" +\r\n \"\\n\" +\r\n \" Most Recent Note\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span>\\r\" +\r\n \"\\n\" +\r\n \" <br/>\\r\" +\r\n \"\\n\" +\r\n \" <span>{{::message.LatestNote}}</span>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"row\\\" ng-repeat=\\\"note in messageNotes | orderBy : 'note.DisplayDate' \\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"messageNotes.length > 0\\\">\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-offset-1\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"ap-label\\\">\\r\" +\r\n \"\\n\" +\r\n \" Created by {{note.LastModifiedBy.Name}} on\\r\" +\r\n \"\\n\" +\r\n \" <ap-date-formatter data-jsdate=\\\"note.DisplayDate\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-format=\\\"date-time\\\"></ap-date-formatter>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span>\\r\" +\r\n \"\\n\" +\r\n \" <br/>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-bind-html=\\\"note.NoteAsHtml\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"row\\\" ng-if=\\\"note.InkImage\\\">\\r\" +\r\n \"\\n\" +\r\n \" <img ng-class=\\\"(isPhone || state.mode === 'locked') ? 'col-xs-12 col-md-9 col-flush' : 'col-xs-12 col-sm-9 col-md-6 col-flush'\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-src=\\\"data:image/jpeg;base64,{{note.InkImage}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apMessageStatus.html',\r\n \"<div class=\\\"col-xs-6 col-xs-flush-left\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"detail-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label class=\\\"control-label\\\" translate>Message Status</label>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div><span ng-bind=\\\"message.Status\\\"></span></div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"<div class=\\\"col-xs-6 col-xs-flush-right\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"detail-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"form-group\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label class=\\\"control-label\\\" translate>Type</label>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div>{{message.MessageType.Name}}</div>\\r\" +\r\n \"\\n\" +\r\n \" <div>{{message.MessageSubType.Name}}</div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apModalWizard.html',\r\n \"<div ap-full-modal ap-full-modal-always>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"modal-header\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"$emit('modal-cancel');\\\">×</button>\\r\" +\r\n \"\\n\" +\r\n \" <h4 class=\\\"modal-title\\\">{{selectedStep.title}}</h4>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"modal-body\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<div ng-transclude></div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"modal-footer\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<div ng-if=\\\"options.resultType === 'Patient' || options.resultType === 'DefaultProvider'\\\" class=\\\"row\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-4 btn-modal-spacing\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"previous-btn\\\" type=\\\"submit\\\" ng-hide=\\\"(currentStepNumber() === 1)\\\" class=\\\"btn-modal btn-default\\\" wz-previous>Back</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-4\\\" style=\\\"padding: 0px\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"skip-to-review-btn\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"submit\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"btn-modal btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"closeWizard()\\\">\\r\" +\r\n \"\\n\" +\r\n \" Finish\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-4 btn-modal-spacing\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"next-btn\\\" type=\\\"submit\\\" ng-hide=\\\"(currentStepNumber() === getEnabledSteps().length)\\\" class=\\\"btn-modal btn-default\\\" wz-next>Next</button>\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"finish-btn\\\" type=\\\"submit\\\" ng-show=\\\"(currentStepNumber() === getEnabledSteps().length)\\\" class=\\\"btn-modal btn-default\\\" wz-finish>Next</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"options.resultType !== 'Patient' && options.resultType !== 'DefaultProvider'\\\" class=\\\"row\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-6\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"previous-btn\\\" type=\\\"submit\\\" ng-hide=\\\"(currentStepNumber() === 1)\\\" class=\\\"btn-modal btn-default\\\" wz-previous>Back</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-6\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"next-btn\\\" type=\\\"submit\\\" ng-hide=\\\"(currentStepNumber() === getEnabledSteps().length)\\\" class=\\\"btn-modal btn-default\\\" wz-next>Next</button>\\r\" +\r\n \"\\n\" +\r\n \" <button id=\\\"finish-btn\\\" type=\\\"submit\\\" ng-show=\\\"(currentStepNumber() === getEnabledSteps().length)\\\" class=\\\"btn-modal btn-default\\\" wz-finish>Next</button>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apPatientContextMenu.html',\r\n \"<div class=\\\"context-menu\\\" id=\\\"patient-context-menu\\\" ng-cloak>\\r\" +\r\n \"\\n\" +\r\n \" <ul class=\\\"dropdown-menu position-fixed\\\" role=\\\"menu\\\">\\r\" +\r\n \"\\n\" +\r\n \" <li class=\\\"dropdown-header\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span translate>Actions</span>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a ng-if=\\\"!isFndEnabled\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"pointer\\\"\\r\" +\r\n \"\\n\" +\r\n \" role=\\\"menuitem\\\"\\r\" +\r\n \"\\n\" +\r\n \" tabindex=\\\"1\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"view-patient-dashboard\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'patientDashboard', pageOpts: {sameWindow: true}, opts: {id: patient.Id}}\\\" translate>\\r\" +\r\n \"\\n\" +\r\n \" View Patient Dashboard\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" <fnd-configuration-dropdown-menu ng-if=\\\"isFndEnabled\\\" (navigate-callback)=\\\"navigateToDashboard($event)\\\"></fnd-configuration-dropdown-menu>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id && !hospitalRoundId\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"2\\\" name=\\\"add-external-patient\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'addExternalPatient', opts: {serviceSiteId: defaultServiceSiteId, patientId: patient.Id}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" Add to External Patient List\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id && hospitalRoundId\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"3\\\" name=\\\"edit-external-patient\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'editExternalPatient', opts: {id: patient.Id, hospitalRoundId: hospitalRoundId}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" translate>\\r\" +\r\n \"\\n\" +\r\n \" Edit External Patient\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"schedulePermissionAllowed\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"4\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'addAppointment', opts: {patientid: patient.Id}}\\\" translate>\\r\" +\r\n \"\\n\" +\r\n \" Add Appointment\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"5\\\" name=\\\"start-charge-capture\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'chargeCapture', opts: chargeCaptureOptions}\\\" translate ap-authorization\\r\" +\r\n \"\\n\" +\r\n \" provider-required=\\\"true\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'eMDs Rounds' | translate}}\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"chargeCaptureOptions.chargeCaptureId\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"6\\\" ng-click=\\\"removeChargeCapture();\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner class=\\\"pull-right\\\" ng-show=\\\"removingChargeCapture\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \" {{::'Remove eMDs Round' | translate}}\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id && hospitalRoundId && dischargeExternalPatient\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"6\\\" ng-click=\\\"dischargePatient();\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner class=\\\"pull-right\\\" ng-show=\\\"dischargingPatient\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \" {{::'Discharge Patient' | translate}}\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id && erxEnabled\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" id=\\\"create-rx-context-menu\\\" role=\\\"menuitem\\\" tabindex=\\\"7\\\" ap-feature-check=\\\"\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-required-features=\\\"Visits_RX\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'rxwizarddrugsearch', opts : { patientId: patient.Id }}\\\" translate>\\r\" +\r\n \"\\n\" +\r\n \" Create New Rx\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"8\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'createtaskmessage', opts: {patientid: patient.Id}}\\\" translate>\\r\" +\r\n \"\\n\" +\r\n \" Create a Task Message\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"9\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'createportalmessage', opts: {patientid: patient.Id}}\\\" translate>\\r\" +\r\n \"\\n\" +\r\n \" Create a Portal Message\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-if=\\\"patient.Id\\\" ap-feature-check data-required-features=\\\"PhoneMessageCreation\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"10\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'createphonemessage', opts: {patientid: patient.Id}}\\\" translate>\\r\" +\r\n \"\\n\" +\r\n \" Create a Phone Message\\r\" +\r\n \"\\n\" +\r\n \" </a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li class=\\\"divider\\\" ng-if=\\\"patient.Id && patientDashboardConfigurations && !isFndEnabled\\\"></li>\\r\" +\r\n \"\\n\" +\r\n \" <li class=\\\"dropdown-header\\\" ng-if=\\\"patient.Id && patientDashboardConfigurations && !isFndEnabled\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span translate>Dashboard Configurations</span>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" <li ng-repeat=\\\"configuration in dashboardConfigurations\\\">\\r\" +\r\n \"\\n\" +\r\n \" <a class=\\\"pointer\\\" role=\\\"menuitem\\\" tabindex=\\\"11\\\" ng-if=\\\"patient.Id && patientDashboardConfigurations && !isFndEnabled\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"{ appRoute: 'patientDashboard', pageOpts: {sameWindow: true}, opts: {id: patient.Id, config: configuration.Id}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{configuration.Name}}</a>\\r\" +\r\n \"\\n\" +\r\n \" </li>\\r\" +\r\n \"\\n\" +\r\n \" </ul>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apPatientContextMenuModal.html',\r\n \"<!--<div id=\\\"ap-patient-context-menu-modal\\\" ap-full-modal ap-full-modal-always>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"modal-header\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<button type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"$dismiss('editing')\\\">×</button>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<h4 class=\\\"modal-title\\\" style=\\\"font-weight: bold\\\">Warning: Pending Charge Capture</h4>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"modal-body\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<ap-patient-header patient=\\\"patient\\\" mode=\\\"simple\\\"></ap-patient-header>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <!--<div id=\\\"patient-context-menu-modal-alert\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"row\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"col-xs-12\\\" translate>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"patient-context-menu-group\\\" id=\\\"patient-context-menu-failure\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<span class=\\\"patient-context-menu-alert-header\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--{{::'Patient has an existing Charge Capture that has not yet been submitted.' | translate}}-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</span>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<br>-->\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <!--<br>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<span>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--{{::'Select \\\\\\\"Edit Charge Capture\\\\\\\" to complete the pending Charge Capture for this patient.' | translate}}-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<br>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<br>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--{{::'Select \\\\\\\"Force Continue\\\\\\\" to continue with the Discharge without completing the pending Charge Capture.' | translate}}-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</span>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"modal-footer\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"col-xs-12 col-xs-flush\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"row\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"col-xs-6 col-xs-flush-left\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<button type=\\\"submit\\\" class=\\\"btn btn-primary btn-block\\\" ng-click=\\\"editChargeCapture()\\\">Edit Charge Capture</button>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<div class=\\\"col-xs-6 col-xs-flush-right\\\">-->\\r\" +\r\n \"\\n\" +\r\n \" <!--<button type=\\\"submit\\\" class=\\\"btn btn-primary btn-block\\\" ng-click=\\\"forceContinue()\\\">Force Continue</button>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \" <!--</div>-->\\r\" +\r\n \"\\n\" +\r\n \"<!--</div>-->\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apPharmacyAddress.html',\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<ap-address ng-click=\\\"openGMap()\\\" data-address=\\\"address\\\">\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"</ap-address>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/apSelect.html',\r\n \"<!-- directive will add:\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<span class=\\\"input-group-addon open-select\\\"><i class=\\\"ap-chevron-down-gray\\\"></i></span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"using jquery. I tried the following:\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<div class=\\\"input-group\\\" ng-transclude>\\r\" +\r\n \"\\n\" +\r\n \"<span class=\\\"input-group-addon open-select\\\"><i class=\\\"ap-chevron-down-gray\\\"></i></span>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"but the span was replaced with the transcluded markup.\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"I also tried\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<div class=\\\"input-group\\\">\\r\" +\r\n \"\\n\" +\r\n \"<span ng-transclude></span>\\r\" +\r\n \"\\n\" +\r\n \"<span class=\\\"input-group-addon open-select\\\"><i class=\\\"ap-chevron-down-gray\\\"></i></span>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"which also didn't work because the select was placed inside the span and thus did not match the bootstrap css rules\\r\" +\r\n \"\\n\" +\r\n \"and weren't styled appropriately.\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"-->\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"<div ng-transclude>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/find/apFindPharmacy.html',\r\n \"<div class=\\\"input-group typeahead-search-control has-feedback\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"input-group-btn\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button class=\\\"btn btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.clear()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.selectDisabled()\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"fa fa-times\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"form-control-feedback\\\" ng-show=\\\"vm.outstandingCalls\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner size=\\\"1\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <input\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"text\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"form-control find-pharmacy-search-input rounded-right\\\"\\r\" +\r\n \"\\n\" +\r\n \" placeholder=\\\"{{vm.getSearchTextFromPharmacy(vm.placeHolderItem) || vm.placeholderText}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.selectedItem\\\"\\r\" +\r\n \"\\n\" +\r\n \" uib-typeahead=\\\"pharmacy as vm.getSearchTextFromPharmacy(pharmacy) for pharmacy in vm.searchItems($viewValue)\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-on-select=\\\"vm.itemSelected($item)\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-template-url=\\\"/core-ui/views/directives/find/apFindPharmacyTemplate.html\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-track-by=\\\"Id\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-popup-classes=\\\"dropdown-menu-flush\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-default-header=\\\"vm.getDefaultHeader()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-none-action=\\\"vm.callNoneAction()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-display-none=\\\"vm.displayNone\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-min-length=\\\"0\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-wait-ms=\\\"300\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.selectDisabled()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-popup-parent=\\\"vm.parentContainerId\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-popup-max-height\\r\" +\r\n \"\\n\" +\r\n \" ap-autofocus=\\\"vm.autoFocus\\\"/>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/find/apFindPharmacyTemplate.html',\r\n \"<div class=\\\"list-group-item\\\" ng-class=\\\"match.model.isDefault ? 'default-pharmacy' : 'searched-pharmacy'\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t{{::match.model.Name}}\\r\" +\r\n \"\\n\" +\r\n \"\t\t<div ap-feature-check data-required-features=\\\"EnhancedPharmacySearch\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<div class=\\\"text-success\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t ng-if=\\\"match.model.MasterPharmacy.ConfiguredForEPrescribing\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<i class=\\\"fa fa-check\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t{{'ERx Configured' | translate}}\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<div class=\\\"text-warning\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t ng-if=\\\"match.model.MasterPharmacy && !match.model.MasterPharmacy.ConfiguredForEPrescribing\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<i class=\\\"fa fa-warning\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t{{'ERx Not Configured' | translate}}\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<div class=\\\"text-success\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\tng-if=\\\"match.model.IsMailOrder\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t<i class=\\\"ap-consumer-package-goods sigwriter-drugsearch-icon\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t\t\t{{'Mail Order' | translate}}\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-sub-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t{{::match.model.Phone.PhoneNumber}}\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-details list-item-details-address overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<ap-pharmacy-address address=\\\"match.model.Address\\\"></ap-pharmacy-address>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-details overflow-ellipsis\\\" ng-if=\\\"match.model.MasterPharmacy.CrossStreet\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\tCrossStreet: {{::match.model.MasterPharmacy.CrossStreet}}\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/find/apFindPrmUser.html',\r\n \"<div class=\\\"input-group typeahead-search-control has-feedback\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"input-group-btn\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button class=\\\"btn btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.clear()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.selectDisabled()\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"fa fa-times\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"form-control-feedback\\\" ng-show=\\\"vm.outstandingCalls\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner size=\\\"1\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <input\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"text\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"form-control patient-search-input rounded-right\\\"\\r\" +\r\n \"\\n\" +\r\n \" placeholder=\\\"{{vm.getSearchTextFromFindPrmUser(vm.placeHolderItem) || vm.placeholderText}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.selectedItem\\\"\\r\" +\r\n \"\\n\" +\r\n \" uib-typeahead=\\\"prmUser as vm.getSearchTextFromFindPrmUser(prmUser) for prmUser in vm.searchItems($viewValue)\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-on-select=\\\"vm.itemSelected($item)\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-template-url=\\\"/core-ui/views/directives/find/apFindPrmUserTemplate.html\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-track-by=\\\"Id\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-popup-classes=\\\"dropdown-menu-flush\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-min-length=\\\"0\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-wait-ms=\\\"300\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.selectDisabled()\\\"/>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/find/apFindPrmUserTemplate.html',\r\n \"<div class=\\\"list-group-item\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-content\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::match.model.LastName}}, {{::match.model.FirstName}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-sub-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span translate>Type</span>: {{::match.model.Type}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-details overflow-ellipsis\\\" ng-if=\\\"!!match.model.Notes\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span>{{::match.model.Notes}}</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/find/apPatientSearch.html',\r\n \"<div class=\\\"input-group typeahead-search-control has-feedback\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"input-group-btn\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button class=\\\"btn btn-default\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"vm.clear()\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.selectDisabled()\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"fa fa-times\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </button>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"form-control-feedback\\\" ng-show=\\\"vm.outstandingCalls\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner size=\\\"1\\\"/>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <input\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"text\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"form-control patient-search-input rounded-right\\\"\\r\" +\r\n \"\\n\" +\r\n \" placeholder=\\\"{{vm.getSearchTextFromPatient(vm.placeHolderItem) || vm.placeholderText}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"vm.selectedItem\\\"\\r\" +\r\n \"\\n\" +\r\n \" uib-typeahead=\\\"patient as vm.getSearchTextFromPatient(patient) for patient in vm.searchItems($viewValue)\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-on-select=\\\"vm.itemSelected($item)\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-template-url=\\\"/core-ui/views/directives/find/apPatientSearchTemplate.html\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-track-by=\\\"Id\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-typeahead-popup-classes=\\\"dropdown-menu-flush\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-min-length=\\\"0\\\"\\r\" +\r\n \"\\n\" +\r\n \" typeahead-wait-ms=\\\"300\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-disabled=\\\"vm.selectDisabled()\\\"/>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/find/apPatientSearchTemplate.html',\r\n \"<div class=\\\"list-group-item\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-thumbnail\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t <img lazy-src=\\\"{{match.model.Id | apPatientThumbnailSrc:40:40}}\\\">\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\t <div class=\\\"status-bar-horizontal\\\" ng-if=\\\"!!match.model.Condition\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t style=\\\"background-color: {{match.model.Condition.Color}}\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t </div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-content\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t <div class=\\\"list-item-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t {{::match.model.FirstName}}\\r\" +\r\n \"\\n\" +\r\n \"\t {{::match.model.LastName}}\\r\" +\r\n \"\\n\" +\r\n \"\t </div>\\r\" +\r\n \"\\n\" +\r\n \"\t <div class=\\\"list-item-sub-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t <ap-Birthdate deathdate=\\\"{{match.model.DeathDate}}\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t birthdate=\\\"{{match.model.BirthDate}}\\\"/>\\r\" +\r\n \"\\n\" +\r\n \"\t </div>\\r\" +\r\n \"\\n\" +\r\n \"\t <div class=\\\"list-item-details overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t <span translate>ID</span>: {{::match.model.ExternalId}}\\r\" +\r\n \"\\n\" +\r\n \"\t </div>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/multiSelectCheckBox.html',\r\n \"<div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-show=\\\"showAll\\\">\\r\" +\r\n \"\\n\" +\r\n \" <input type=\\\"checkbox\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"native\\\"\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"all\\\"\\r\" +\r\n \"\\n\" +\r\n \" name=\\\"all\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"selectAll\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label for=\\\"all\\\" class=\\\"label-font\\\">All</label>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-repeat=\\\"item in list track by $index\\\">\\r\" +\r\n \"\\n\" +\r\n \" <input type=\\\"checkbox\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"native\\\"\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"multi-checkbox-list-{{$index}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-model=\\\"item.selected\\\">\\r\" +\r\n \"\\n\" +\r\n \" <label for=\\\"multi-checkbox-list-{{$index}}\\\" class=\\\"label-font\\\">{{item.formattedDate}}</label>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/ngRepeatColumnReset.html',\r\n \"<div class=\\\"clearfix\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"(index && index%(12/xs) === 0 ? 'visible-xs-' + (display||'block') + ' ' : '') +\\r\" +\r\n \"\\n\" +\r\n \" (index && index%(12/(sm||xs)) === 0 ? 'visible-sm-' + (display||'block') + ' ' : '') +\\r\" +\r\n \"\\n\" +\r\n \" (index && index%(12/(md||sm||xs)) === 0 ? 'visible-md-' + (display||'block') + ' ' : '') +\\r\" +\r\n \"\\n\" +\r\n \" (index && index%(12/(lg||md||sm||xs)) === 0 ? 'visible-lg-' + (display||'block') : '')\\\">\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/partials/apAppointmentBrief.html',\r\n \"<div class=\\\"row flexbox flexbox-horizontal-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"pull-left\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"text-center list-item-time-large keep-whitespace-line\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter date=\\\"{{::$ctrl.appointment.StartDate}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" format=\\\"short-day\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter date=\\\"{{::$ctrl.appointment.StartDate}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" format=\\\"short-date\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"::$ctrl.showDuration\\\">({{::$ctrl.getDuration($ctrl.appointment.StartDate) }})<br></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-12 col-xs-flush-right\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-heading\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'Provider'| translate}} :\\r\" +\r\n \"\\n\" +\r\n \" {{::$ctrl.appointment.ProviderName}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-sub-heading\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'Status'| translate}} :\\r\" +\r\n \"\\n\" +\r\n \" {{::$ctrl.appointment.AppointmentStatus.Description}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-details\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::'Reason'| translate}} :\\r\" +\r\n \"\\n\" +\r\n \" <span style=\\\"color:{{::$ctrl.appointment.AppointmentType.Color}}\\\">{{::$ctrl.appointment.AppointmentType.Name}}</span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-show=\\\"::$ctrl.appointment.AppointmentType.Name && $ctrl.appointment.Reason\\\"> - </span>\\r\" +\r\n \"\\n\" +\r\n \" {{::$ctrl.appointment.Reason}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/partials/apAppointmentListItem.html',\r\n \"<div class=\\\"appt-list-item transparency-hack\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-transition-to=\\\"getTransition()\\\"\\r\" +\r\n \"\\n\" +\r\n \" hm-tap-only=\\\"true\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-context-menu\\r\" +\r\n \"\\n\" +\r\n \" ap-context-menu-type=\\\"appointment\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-context-menu-target=\\\"appt-context-menu\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-context-menu-open=\\\"openAppointmentContextMenu();\\\"\\r\" +\r\n \"\\n\" +\r\n \" ap-context-menu-close=\\\"closeAppointmentContextMenu();\\\"\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"appt-{{::appt.Id}}\\\">\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-col-xs text-center-vert pull-right text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span><i class=\\\"ap-chevron-right-gray\\\"></i></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-col-sm text-center-vert list-item-time pull-left text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <!-- date time is sent from server in calendar's time zone local time if the calendar has a timezone.\\r\" +\r\n \"\\n\" +\r\n \" No need to do any shifting -->\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-range-formatter\\r\" +\r\n \"\\n\" +\r\n \" data-start-date=\\\"appt.Date\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-end-date=\\\"appt.EndDate\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-format=\\\"short-time\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-multiline=\\\"true\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"displayEndTime\\\">\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter\\r\" +\r\n \"\\n\" +\r\n \" data-date=\\\"{{appt.Date}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-format=\\\"short-time\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-if=\\\"displayStartTime\\\">\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"keep-whitespace-line\\\" ng-if=\\\"displayDate\\\"><span ap-date-formatter data-date=\\\"{{appt.Date}}\\\" format=\\\"short-day\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter data-date=\\\"{{appt.Date}}\\\" format=\\\"short-date\\\"></span> \\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-thumbnail\\\">\\r\" +\r\n \"\\n\" +\r\n \" <img ng-if=\\\"appt.PatientId\\\" lazy-src=\\\"{{appt.PatientId | apPatientThumbnailSrc:83:82}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"!appt.PatientId\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<i class=\\\"fa fa-calendar fa-5x\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</span>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"status-bar-horizontal\\\"\\r\" +\r\n \"\\n\" +\r\n \" style=\\\"background-color: {{appt.AppointmentStatus.Color}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-content\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"::isPatientVisit\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"heading-title overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::appt.Name}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"heading-subtitle overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::appt.BirthDate}}\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"appt.Age\\\"> | {{::appt.Age}}</span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"appt.Gender\\\"> | {{::appt.Gender.charAt(0)}}</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"::!isPatientVisit\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"heading-title overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::scheduleTypeDescription}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"heading-details overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span>\\r\" +\r\n \"\\n\" +\r\n \" {{appt.AppointmentType.Name || appt.AppointmentType.Description}}\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"(appt.AppointmentType.Name || appt.AppointmentType.Description) && appt.Reason\\\">\\r\" +\r\n \"\\n\" +\r\n \" |\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" {{appt.Reason}}\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"appt.Date && appt.EndDate\\\" class=\\\"heading-details overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter jsdate=\\\"appt.Date\\\" format=\\\"date-time\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" -\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter jsdate=\\\"appt.EndDate\\\" format=\\\"time\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div ng-if=\\\"!appt.Date || !appt.EndDate\\\"\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"heading-details overflow-ellipsis\\\"> \\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/partials/apAppointmentListTemplateSlot.html',\r\n \"<div class=\\\"transparency-hack\\\" >\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-col-sm text-center-vert list-item-time pull-left text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<!-- date time is sent from server in calendar's time zone local time if the calendar has a timezone.\\r\" +\r\n \"\\n\" +\r\n \"\t\tNo need to do any shifting -->\\r\" +\r\n \"\\n\" +\r\n \"\t\t<span ap-date-range-formatter\\r\" +\r\n \"\\n\" +\r\n \"\t\t\tdata-start-date=\\\"appt.Date\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\tdata-end-date=\\\"appt.EndDate\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\tdata-format=\\\"short-time\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\tdata-multiline=\\\"true\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\tng-if=\\\"displayEndTime\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t</span>\\r\" +\r\n \"\\n\" +\r\n \"\t\t<span ap-date-formatter \\r\" +\r\n \"\\n\" +\r\n \"\t\t\tdata-date=\\\"{{appt.Date}}\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\tdata-format=\\\"short-time\\\"\\r\" +\r\n \"\\n\" +\r\n \"\t\t\tng-if=\\\"!displayEndTime\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t</span>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-thumbnail text-center-vert\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<span>\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t<i class=\\\"fa fa-calendar fa-5x\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \"\t\t</span>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\t<div class=\\\"list-item-content text-center-vert\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t<span class=\\\"list-item-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \"\t\t\t{{appt.AppointmentType.Name || appt.AppointmentType.Description}}\\r\" +\r\n \"\\n\" +\r\n \"\t\t</span>\\r\" +\r\n \"\\n\" +\r\n \"\t</div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/partials/apMessageListItem.html',\r\n \"<div class=\\\"message-list-item transparency-hack\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-ap-transition-to-message\\r\" +\r\n \"\\n\" +\r\n \" data-message-id=\\\"{{::$ctrl.message.Id}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-message-type-id=\\\"{{::$ctrl.message.TypeId}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" data-message-sub-type-id=\\\"{{::$ctrl.message.SubTypeId}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"$emit('readMessage', $ctrl.message.Id);\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"$ctrl.isRead() ? 'read' : 'unread'\\\"\\r\" +\r\n \"\\n\" +\r\n \" id=\\\"message-{{::$ctrl.message.Id}}\\\">\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-col-xs text-center-vert list-item-col-xs pull-right text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span>\\r\" +\r\n \"\\n\" +\r\n \" <i ng-class=\\\"::{'ap-chevron-right-gray': !$ctrl.message.IsUrgent, 'ap-important': !!$ctrl.message.IsUrgent}\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"text-center-vert text-right pull-right text-center list-item-sub-heading hidden-xs\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{'hidden': $ctrl.narrow || !$ctrl.message.SubType}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"text-right overflow-ellipsis\\\">{{::$ctrl.message.SubType | characters:20}}</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-col-sm text-center-vert list-item-time pull-left text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ap-message-icon data-message=\\\"$ctrl.message\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"status-bar-vertical\\\"\\r\" +\r\n \"\\n\" +\r\n \" style=\\\"background-color: {{::$ctrl.message.UrgencyColor}}\\\">\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-content\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-heading overflow-ellipsis\\\" >\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"::$ctrl.message.PatientName\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::$ctrl.message.PatientName}}\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-sub-heading overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::$ctrl.message.Type}}\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-class=\\\"{'visible-xs': !$ctrl.narrow}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span>{{::$ctrl.message.SubType}}</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-details overflow-ellipsis\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{::$ctrl.message.Header}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"</div>\\r\" +\r\n \"\\n\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/partials/apPharmacyTileDragDrop.html',\r\n \"<div class=\\\"row\\\" id=\\\"sortlist\\\">\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div ng-show=\\\"loadingPharmacy\\\" class=\\\"spinner-container text-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-spinner size=\\\"3\\\"></ap-spinner>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-md-6\\\" ng-repeat=\\\"pharmacy in pharmacyListData track by $index \\\">\\r\" +\r\n \"\\n\" +\r\n \" <ap-drag-drop data-index=\\\"$index\\\" data-start-index=\\\"setStart(ssIndex)\\\" data-drop-index=\\\"setDrop(ddIndex)\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"panel\\\" id=\\\"ph{{$index}}\\\" \\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{'sigwritter-pharmacy-tile-active':isSelected(pharmacy.PatientPharmacyUid),'sigwritter-pharmacy-tile-deactive':!isSelected(pharmacy.PatientPharmacyUid)}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"panel-title sigwritter-pharmacy-tile-title\\\" >\\r\" +\r\n \"\\n\" +\r\n \" <b>{{pharmacy.Name}}</b>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <!-- <div class=\\\"\\\"> -->\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"sigwritter-pharmacy-title-body\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"sigwritter-pharmacy-properties\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div> <span ng-show=\\\"pharmacy.MasterPharmacy.ConfiguredForEPrescribing\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"menu-chevron material-icons sigwritter-pharmacy-erxconfigured-icon\\\" >done</span>ERx\\r\" +\r\n \"\\n\" +\r\n \" Configured\\r\" +\r\n \"\\n\" +\r\n \" </span> <span ng-show=\\\"pharmacy.MasterPharmacy.IsMailOrder\\\"><i\\r\" +\r\n \"\\n\" +\r\n \" class=\\\"ap-consumer-package-goods sigwriter-drugsearch-icon\\\"></i> Mail Order</span> </div>\\r\" +\r\n \"\\n\" +\r\n \" <span\\r\" +\r\n \"\\n\" +\r\n \" ng-show=\\\"!pharmacy.MasterPharmacy.ConfiguredForEPrescribing && !pharmacy.MasterPharmacy.IsMailOrder\\\"><br>\\r\" +\r\n \"\\n\" +\r\n \" </span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"sigwritter-pharmacy-address-tile \\\">\\r\" +\r\n \"\\n\" +\r\n \" {{pharmacy.Address.Address1}}\\r\" +\r\n \"\\n\" +\r\n \" <span>{{pharmacy.Address.City}}</span><span>{{pharmacy.Address.State}}</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"sigwritter-pharmacy-address-tile \\\">{{pharmacy.Phone.PhoneNumber}} </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"row sigwritter-pharmacy-buttons-section\\\">\\r\" +\r\n \"\\n\" +\r\n \" <button class=\\\"col-md-4 btn btn-sm sigwritter-pharmacy-tile-button\\\" ng-if=\\\"!isSelected(pharmacy.PatientPharmacyUid)\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"selectPharmacy(pharmacy.PatientPharmacyUid)\\\" type=\\\"button\\\">SELECT</button>\\r\" +\r\n \"\\n\" +\r\n \" <button class=\\\"col-md-4 btn btn-sm sigwritter-pharmacy-tile-active-button\\\" disabled\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"selectPharmacy(pharmacy.PatientPharmacyUid)\\\" ng-if=\\\"isSelected(pharmacy.PatientPharmacyUid)\\\"\\r\" +\r\n \"\\n\" +\r\n \" type=\\\"button\\\">SELECTED</button>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-md-1 col-md-offset-1\\\" ng-if=\\\"isSelected(pharmacy.PatientPharmacyUid)\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span class=\\\"menu-chevron material-icons sigwritter-pharmacy-selected-icon\\\" >done</span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-md-1 sigwritter-pharmacy-delete-icon\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-class=\\\"{' col-md-offset-3':isSelected(pharmacy.PatientPharmacyUid),' col-md-offset-5':!isSelected(pharmacy.PatientPharmacyUid)}\\\">\\r\" +\r\n \"\\n\" +\r\n \" <i class=\\\"ap-icondelete\\\" style=\\\"cursor: default;\\\"\\r\" +\r\n \"\\n\" +\r\n \" ng-click=\\\"deletePharmacy(pharmacy.PatientPharmacyUid)\\\"></i>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <!-- </div> -->\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </apdragdrop>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\r\n\r\n $templateCache.put('/core-ui/views/directives/partials/apVisitBrief.html',\r\n \"<div class=\\\"row flexbox flexbox-horizontal-center\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"pull-left\\\">\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"text-center list-item-time-large keep-whitespace-line\\\">\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter date=\\\"{{$ctrl.visit.VisitDate || $ctrl.visit.Date}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" format=\\\"short-day\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <span ap-date-formatter date=\\\"{{$ctrl.visit.VisitDate || $ctrl.visit.Date}}\\\"\\r\" +\r\n \"\\n\" +\r\n \" format=\\\"short-date\\\"></span>\\r\" +\r\n \"\\n\" +\r\n \" <span ng-if=\\\"::$ctrl.showDuration\\\">({{::$ctrl.getDuration($ctrl.visit.VisitDate || $ctrl.visit.Date) }})<br></span>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"col-xs-12 col-xs-flush-right\\\" ng-transclude>\\r\" +\r\n \"\\n\" +\r\n \" <div class=\\\"list-item-heading\\\">\\r\" +\r\n \"\\n\" +\r\n \" {{$ctrl.visit.ProviderName}}\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \" </div>\\r\" +\r\n \"\\n\" +\r\n \"</div>\"\r\n );\r\n\n}]);\n","(function(angular){\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').component('apCachingSettings', {\r\n templateUrl: '/core-ui/component-views/ap-caching-settings.html',\r\n controllerAs: 'vm',\r\n controller: [\r\n '_',\r\n 'AprimaCache',\r\n ApCachingSettings,\r\n ],\r\n });\r\n\r\n function ApCachingSettings(\r\n _,\r\n AprimaCache\r\n ) {\r\n var vm = this;\r\n\r\n vm.clearAll = clearAll;\r\n vm.totalSize = totalSize;\r\n\r\n function clearAll() {\r\n return AprimaCache.clearAll();\r\n }\r\n\r\n function totalSize() {\r\n var info = AprimaCache.info();\r\n if(!info) {\r\n return 0;\r\n }\r\n\r\n var size = _.reduce(info.caches, function(sum, cache) {\r\n var newSum = sum + ((cache && cache.size) || 0);\r\n return newSum;\r\n }, 0);\r\n\r\n return size;\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-core-ui').component('apDocumentViewerWithDownload', {\r\n templateUrl: '/core-ui/component-views/apDocumentViewWithDownload.html',\r\n bindings: {\r\n disableFullscreen: '<?',\r\n disableInlinePdf: '<?',\r\n documentId: '<',\r\n documentHelper: '<?',\r\n downloadFileName: '<?',\r\n enableDownload: '<?',\r\n hasStaticUrl: '<?',\r\n\r\n documentDownload: '&?',\r\n documentGetStaticUrl: '&?',\r\n documentLoad: '&',\r\n },\r\n controller: [\r\n ApDocumentViewerWithDownload,\r\n ],\r\n });\r\n\r\n function ApDocumentViewerWithDownload(\r\n ) {\r\n var vm = this;\r\n\r\n vm.downloadingDocument = false;\r\n vm.loadingDocument = false;\r\n\r\n vm.canDownloadDocument = canDownloadDocument;\r\n vm.canOpenInSeparateTab = canOpenInSeparateTab;\r\n vm.onDocumentDownload = onDocumentDownload;\r\n vm.onDocumentLoad = onDocumentLoad;\r\n vm.onDocumentOpenInSeparateTab = onDocumentOpenInSeparateTab;\r\n\r\n function canDownloadDocument() {\r\n return vm.enableDownload;\r\n }\r\n\r\n function canOpenInSeparateTab() {\r\n return vm.hasStaticUrl;\r\n }\r\n\r\n function onDocumentDownload(documentId) {\r\n vm.downloadingDocument = true;\r\n return vm.documentDownload({\r\n documentId: documentId,\r\n }).finally(function () {\r\n vm.downloadingDocument = false;\r\n });\r\n }\r\n\r\n function onDocumentLoad(documentId, requestSettings) {\r\n vm.loadingDocument = true;\r\n return vm.documentLoad({\r\n documentId: documentId,\r\n requestSettings: requestSettings,\r\n }).finally(function () {\r\n vm.loadingDocument = false;\r\n });\r\n }\r\n\r\n function onDocumentOpenInSeparateTab(documentId) {\r\n if (vm.documentHelper) {\r\n vm.documentHelper.openDocumentInSeparateTab(vm.documentGetStaticUrl({\r\n documentId: documentId,\r\n }));\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-core-ui').component('apErxRequestDetails', {\r\n templateUrl: '/core-ui/component-views/ap-erx-request-details.html',\r\n bindings: {\r\n refillRequest: '<',\r\n prescription: '<?',\r\n patient: '<?',\r\n },\r\n controllerAs: 'vm',\r\n controller: [\r\n ApErxRequestDetails,\r\n ],\r\n });\r\n\r\n function ApErxRequestDetails(\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-core-ui').component('apErxRequestDualRow', {\r\n templateUrl: '/core-ui/component-views/ap-erx-request-dual-row.html',\r\n bindings: {\r\n label: '<?',\r\n firstValue: '<',\r\n firstText: '<?',\r\n secondValue: '<?',\r\n secondText: '<?',\r\n warn: '&',\r\n header: '&',\r\n },\r\n controllerAs: 'vm',\r\n controller: [\r\n '_',\r\n ApErxRequestDualRow,\r\n ],\r\n });\r\n\r\n function ApErxRequestDualRow(\r\n _\r\n ) {\r\n var vm = this;\r\n vm.hasWarning = hasWarning;\r\n\r\n function hasWarning() {\r\n if(_.isNil(vm.firstValue) || _.isNil(vm.secondValue)) {\r\n return false;\r\n }\r\n\r\n var result = String.prototype.toUpperCase.call(vm.firstValue) !== String.prototype.toUpperCase.call(vm.secondValue);\r\n\r\n return result;\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-core-ui').component('apErxRequestFullRow', {\r\n templateUrl: '/core-ui/component-views/ap-erx-request-full-row.html',\r\n bindings: {\r\n label: '<?',\r\n value: '<',\r\n header: '&',\r\n },\r\n transclude: true,\r\n controllerAs: 'vm',\r\n controller: [\r\n ApErxRequestFullRow,\r\n ],\r\n });\r\n\r\n function ApErxRequestFullRow(\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-core-ui').component('apErxRequestMedication', {\r\n templateUrl: '/core-ui/component-views/ap-erx-request-medication.html',\r\n bindings: {\r\n label: '<',\r\n requestedMed: '<',\r\n currentPrescription: '<?',\r\n },\r\n controllerAs: 'vm',\r\n controller: [\r\n ApErxRequestMedication,\r\n ],\r\n });\r\n\r\n function ApErxRequestMedication(\r\n ) {\r\n var vm = this;\r\n var rxNormQualifer = {\r\n BPK: 'RxNorm Branded Package',\r\n GPK: 'RxNorm Branded Package',\r\n SCD: 'RxNorm Branded Package',\r\n SBD: 'RxNorm Semantic Clinical Drug',\r\n };\r\n vm.isOpen = false;\r\n vm.medDescriptionText = medDescriptionText;\r\n vm.refills = refills;\r\n vm.substitutionText = substitutionText;\r\n vm.strengthText = strengthText;\r\n vm.productCodeText = productCodeText;\r\n vm.drugDbCodeText = drugDbCodeText;\r\n vm.drugFormText = drugFormText;\r\n vm.hasDetails = hasDetails;\r\n\r\n function medDescriptionText(description, ndcDescription) {\r\n var text = description;\r\n if(ndcDescription) {\r\n text += ' (NDC Description: ' + ndcDescription + ')';\r\n }\r\n return text;\r\n }\r\n\r\n function refills(prescription) {\r\n var firstInstruction = prescription && prescription.Instructions && prescription.Instructions[0];\r\n if (!firstInstruction || prescription.Instructions.length > 1) {\r\n return null;\r\n }\r\n\r\n var refills = firstInstruction.Refills || 0;\r\n\r\n return refills;\r\n }\r\n\r\n function substitutionText(prescription) {\r\n if(!prescription) {\r\n return null;\r\n }\r\n\r\n var text = prescription.DispenseAsWritten ?\r\n 'DAW (Substitution Not Allowed)' :\r\n 'Substitution Allowed';\r\n return text;\r\n }\r\n\r\n function strengthText(prescription) {\r\n if(!prescription) {\r\n return null;\r\n }\r\n\r\n var text = prescription.DrugStrength;\r\n if(prescription.DrugStrengthUnits) {\r\n text += ' ' + prescription.DrugStrengthUnits;\r\n }\r\n return text;\r\n }\r\n\r\n function productCodeText(prescription) {\r\n if(!prescription) {\r\n return null;\r\n }\r\n\r\n var text = prescription.DrugNdc + ' (NDC)';\r\n return text;\r\n }\r\n\r\n function drugDbCodeText(prescription) {\r\n if(!prescription) {\r\n return null;\r\n }\r\n\r\n var text = prescription.DrugRxNormCode;\r\n var qualifier = rxNormQualifer[prescription.DrugRxNormQualifier];\r\n if(qualifier) {\r\n text += ' (' + qualifier + ')';\r\n }\r\n return text;\r\n }\r\n\r\n function drugFormText(prescription) {\r\n if(!prescription) {\r\n return null;\r\n }\r\n\r\n var text = prescription.UnitOfMeasureName;\r\n if(prescription.UnitOfMeasureCode) {\r\n text += ' (' + prescription.UnitOfMeasureCode + ')';\r\n }\r\n return text;\r\n }\r\n\r\n function hasDetails() {\r\n return vm.requestedMed &&\r\n (vm.requestedMed.WrittenDate ||\r\n vm.requestedMed.LastFillDate ||\r\n vm.requestedMed.ExpirationDate ||\r\n vm.requestedMed.EffectiveDate ||\r\n vm.requestedMed.PeriodEnd ||\r\n vm.requestedMed.DateValidated ||\r\n vm.requestedMed.SoldDate ||\r\n vm.requestedMed.PriorAuthorizationDescription ||\r\n vm.requestedMed.PriorAuthorizationStatusTerm);\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-core-ui').component('apErxRequestPatient', {\r\n templateUrl: '/core-ui/component-views/ap-erx-request-patient.html',\r\n bindings: {\r\n requestedPatient: '<',\r\n currentPatient: '<?',\r\n },\r\n controllerAs: 'vm',\r\n controller: [\r\n ApErxRequestPatient,\r\n ],\r\n });\r\n\r\n function ApErxRequestPatient(\r\n ) {\r\n var vm = this;\r\n vm.isOpen = false;\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular){\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').component('apErxRequestProvider', {\r\n templateUrl: '/core-ui/component-views/ap-erx-request-provider.html',\r\n bindings: {\r\n label: '<',\r\n requestedProvider: '<',\r\n },\r\n controllerAs: 'vm',\r\n controller: [\r\n ApErxRequestProvider,\r\n ],\r\n });\r\n\r\n function ApErxRequestProvider(\r\n ) {\r\n var vm = this;\r\n vm.isOpen = false;\r\n vm.identification = identification;\r\n\r\n function identification(provider) {\r\n if(!provider) {\r\n return null;\r\n }\r\n\r\n var description = '';\r\n if(provider.PhysicianReferenceType) {\r\n description += provider.PhysicianReferenceType + ': ';\r\n }\r\n if(provider.PhysicianReferenceNumber) {\r\n description += provider.PhysicianReferenceNumber;\r\n }\r\n return description;\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-core-ui').component('apMultiSelectListItem', {\r\n templateUrl: '/core-ui/component-views/ap-multi-select-fa-button.html',\r\n bindings: {\r\n collection: '<',\r\n ngDisabled: '&',\r\n },\r\n require: {\r\n ngModelCtrl: 'ngModel',\r\n },\r\n controller: [\r\n '$element',\r\n 'ApMultiSelectButton',\r\n 'MultiSelectListItemModal',\r\n MultiSelectGenericComponent,\r\n ],\r\n controllerAs: 'vm',\r\n });\r\n\r\n function MultiSelectGenericComponent(\r\n $element,\r\n ApMultiSelectButton,\r\n MultiSelectListItemModal\r\n ) {\r\n var vm = this;\r\n\r\n ApMultiSelectButton.init(vm, openModal, formatter, null, $element.find('button'));\r\n\r\n function openModal(selectedItems) {\r\n return MultiSelectListItemModal.openModal(vm.collection, selectedItems, formatter, null);\r\n }\r\n\r\n function formatter(listItem) {\r\n return listItem.Description || listItem.Name;\r\n }\r\n }\r\n\r\n})(window.angular);","(function(angular) {\r\n 'use strict';\r\n angular.module('aprima-core-ui').component('tinymce', {\r\n bindings: {\r\n removeFormatting : '<',\r\n hideToolbar : '<',\r\n useAdvancedToolbar : '<',\r\n value: '=',\r\n height: '<',\r\n valueChanged: '&',\r\n },\r\n templateUrl: '/core-ui/component-views/tinymce.html',\r\n controller: [\r\n Tinymce,\r\n ],\r\n });\r\n\r\n function Tinymce() {\r\n var vm = this;\r\n var simpleToolbar = 'cut | copy | paste | undo | redo | removeformat | help | fullscreen | insertdatetime';\r\n var advancedToolbar = ' cut copy undo redo | alignleft aligncenter alignright | fontselect styleselect fontsizeselect | bold italic underline strikethrough | bullist numlist | removeformat | help | fullscreen | insertdatetime';\r\n var toolbarSelected;\r\n\r\n if (vm.hideToolbar){\r\n toolbarSelected = false;\r\n } else if(vm.useAdvancedToolbar){\r\n toolbarSelected = advancedToolbar;\r\n } else {\r\n toolbarSelected = simpleToolbar;\r\n }\r\n\r\n vm.tinymceModelOptions = {\r\n debounce: 300,\r\n };\r\n vm.tinymceOptions = {\r\n branding: false,\r\n toolbar: toolbarSelected,\r\n plugins: 'fullscreen',\r\n menubar: false,\r\n statusbar: false,\r\n resize : false,\r\n height : vm.height,\r\n format : (vm.removeFormatting) ? 'text' : 'raw',\r\n /* jshint camelcase:false */\r\n browser_spellcheck: true,\r\n remove_linebreaks : true\r\n /* jshint camelcase:true */\r\n };\r\n\r\n vm.onChange = onChange;\r\n\r\n function onChange() {\r\n vm.valueChanged({\r\n updatedValue: vm.value,\r\n });\r\n }\r\n }\r\n})(window.angular);","// TODO: migrate this hammer configuration stuff to typescript when installing hammerjs npm package\r\n// It wasn't done previously for these reasons:\r\n// This logic can't easily be converted to options or overrides in CustomHammerConfig.ts,\r\n// since this logic is changing defaults on the prototypes, which is not what the HammerGestureConfig is for.\r\n// Also, the configuration options that come from HammerGestureConfig (the parent of CustomHammerConfig) only apply for Hammer instances created\r\n// through the HammerGesturesPlugin, so it wouldn't affect the manual creation of instances that we are currently doing\r\n// in our angularjs code, and via the angular-hammer package.\r\n// This would be a problem because currently, we want this configuration below to apply in angularjs and Angular.\r\n// (It is fine right now because it is applying to both angularjs and Angular, since they are both referencing the same 'Hammer' object off of the window)\r\nangular.module('aprima-core-ui').config(function() {\r\n 'use strict';\r\n\r\n //This makes the recognizer work better on samsung galaxy devices.\r\n //Before this change, tap events would only fire ~10% of the time.\r\n //https://github.com/hammerjs/hammer.js/issues/804\r\n //https://github.com/hammerjs/hammer.js/issues/683\r\n window.Hammer.Tap.prototype.defaults.threshold = 9;\r\n window.Hammer.Tap.prototype.defaults.time = 499;\r\n\r\n // make hammer respect disabled attribute\r\n // by re-defining the handler prototype on each type of Input\r\n var inputHandlerKey = 'handler';\r\n var wrappedKey = '_';\r\n _(window.Hammer)\r\n .pickBy('prototype.' + inputHandlerKey)\r\n .forOwn(function(inputType) {\r\n var inputHandler = inputType.prototype[wrappedKey + inputHandlerKey] = inputType.prototype[inputHandlerKey];\r\n inputType.prototype[inputHandlerKey] = function() {\r\n if(this && this.element && this.element.disabled) {\r\n return;\r\n }\r\n return inputHandler.apply(this, arguments);\r\n };\r\n });\r\n});","angular.module('aprima-core-ui').config(function() {\r\n 'use strict';\r\n\r\n $.fn.extend({\r\n firstOrNull: function() {\r\n return this && this.length ? this.first() : null;\r\n }\r\n });\r\n});","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').run(['CustomModuleRunService', customRun]);\r\n\r\n function customRun(CustomModuleRunService) {\r\n CustomModuleRunService.add([\r\n '$transitions',\r\n 'PersistentWarningService',\r\n SetupPersistentWarningService,\r\n ]);\r\n }\r\n\r\n function SetupPersistentWarningService(\r\n $transitions,\r\n PersistentWarningService\r\n ) {\r\n $transitions.onSuccess({}, function clearPersistentWarnings() {\r\n // clear persistent warnings that have no timeout, so they don't stay there forever\r\n PersistentWarningService.clear();\r\n });\r\n }\r\n\r\n})(window.angular);\r\n","// allow multiple triggers to dropdown within uib-dropdown\r\n(function(angular) {\r\n 'use strict';\r\n\r\n // this is the property that uibDropdownToggle directive sets for the element triggering the toggle\r\n var toggleElementProp = 'toggleElement';\r\n\r\n angular.module('aprima-core-ui').decorator('uibDropdownDirective', [\r\n '$delegate',\r\n '$document',\r\n uibDropDownDecorator\r\n ]);\r\n\r\n function uibDropDownDecorator(\r\n $delegate,\r\n $document\r\n ) {\r\n\r\n var directive = $delegate[0];\r\n var compile = directive.compile;\r\n var uibDropdownToggleSelector = '[uib-dropdown-toggle],.uib-dropdown-toggle,.dropdown-toggle';\r\n\r\n directive.compile = function() {\r\n var link = compile.apply(this, arguments);\r\n\r\n return function(scope, element, attrs, dropdownCtrl) {\r\n if(dropdownCtrl) {\r\n $document.on('click', uibDropdownToggleSelector, setToggleElement);\r\n\r\n scope.$on('$destroy', function() {\r\n $document.off('click', uibDropdownToggleSelector, setToggleElement);\r\n });\r\n }\r\n\r\n function setToggleElement(ev){\r\n dropdownCtrl[toggleElementProp] = angular.element(ev.currentTarget);\r\n }\r\n\r\n link.apply(this, arguments);\r\n };\r\n };\r\n\r\n return $delegate;\r\n }\r\n\r\n})(window.angular);\r\n","// add attribute to allow button text to be empty\r\n(function(angular) {\r\n 'use strict';\r\n\r\n // attribute to tell paging to not return the normal text for buttons\r\n var emptyButtonText = 'apEmptyButtonText';\r\n\r\n angular.module('aprima-core-ui').decorator('uibPaging', [\r\n '$delegate', \r\n uibPagingDecorator\r\n ]);\r\n\r\n function uibPagingDecorator(\r\n $delegate\r\n ) {\r\n\r\n var create = $delegate.create;\r\n if(!create) {\r\n return $delegate;\r\n }\r\n\r\n $delegate.create = function(ctrl, $scope, $attrs) {\r\n var result = create.apply(this, arguments);\r\n\r\n if($scope.$eval($attrs[emptyButtonText])) {\r\n $scope.getText = angular.noop;\r\n }\r\n return result;\r\n };\r\n\r\n return $delegate;\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n \r\n // the new attribute I'm defining to have more control over whether a specific item\r\n // gets selected or not, even when an event occurs that would normally select the item\r\n var typeaheadSelectInterceptor = 'ap-typeahead-select-interceptor';\r\n\r\n // scope event I'm defining to allow for a search to be triggered\r\n // outside of just typing in search box\r\n var typeaheadSearchEvent = 'ap-typeahead-search';\r\n\r\n // property for other match that is not in the list of matches, used below\r\n var otherMatchProp = 'apOtherMatch';\r\n\r\n // This attribute will add a header element above the results in the popup element for typeahead\r\n // the popup element is normally a <ul> that has all of the results inside of it\r\n // if this attribute isn't used, then it will never add a header\r\n var typeaheadHeader = 'ap-typeahead-default-header';\r\n\r\n // This attribute will allow the user to select 'None' note: you will also need to add 'ap-typeahead-none-action'\r\n var typeaheadDisplayNone = 'ap-typeahead-display-none';\r\n\r\n // Default will result in an empty selection ex. ap-typeahead-none-action=\"vm.callNoneAction()\"\r\n var typeaheadNoneAction = 'ap-typeahead-none-action';\r\n\r\n // name of new directive to trigger the typeahead on click\r\n var apTypeaheadSearchOnClick = 'apTypeaheadSearchOnClick';\r\n\r\n // property to store original event 'target' value\r\n var originalTargetProp = 'apTypeaheadOriginalTarget';\r\n\r\n // attribute to specify that if you change the model to a string with code, then it will trigger a search for that\r\n var apTypeaheadSearchOnModelUpdate = 'apTypeaheadSearchOnModelUpdate';\r\n\r\n angular.module('aprima-core-ui').decorator('uibTypeaheadPopupDirective', [\r\n '_',\r\n '$delegate',\r\n '$parse',\r\n 'enableTypeaheadTrackBy',\r\n 'findTypeahead', \r\n 'positionTypeaheadPopup',\r\n 'setTypeaheadPopupHeight',\r\n 'typeaheadPopupClass',\r\n uibTypeaheadPopupDecorator,\r\n ]);\r\n\r\n angular.module('aprima-core-ui').decorator('uibTypeaheadDirective', [\r\n '$delegate',\r\n '$document',\r\n uibTypeaheadDecorator,\r\n ]);\r\n\r\n angular.module('aprima-core-ui').directive(apTypeaheadSearchOnClick, [\r\n 'ClickListenerService',\r\n apTypeaheadSearchOnClickDirective,\r\n ]);\r\n\r\n function uibTypeaheadPopupDecorator(\r\n _,\r\n $delegate,\r\n $parse,\r\n enableTypeaheadTrackBy,\r\n findTypeahead, \r\n positionTypeaheadPopup,\r\n setTypeaheadPopupHeight,\r\n typeaheadPopupClass\r\n ) {\r\n\r\n var directive = $delegate[0];\r\n var compile = directive.compile;\r\n\r\n directive.compile = function(tElement) {\r\n var link = compile.apply(this, arguments);\r\n\r\n //the element that has typeahead on it\r\n var typeaheadElement = findTypeahead(tElement);\r\n enableTypeaheadTrackBy(tElement, typeaheadElement);\r\n typeaheadPopupClass.init(tElement, typeaheadElement);\r\n var header = typeaheadElement.attr(typeaheadHeader);\r\n if(header) {\r\n var headerElement = angular.element('<div class=\"dropdown-header li-aligned\" ng-show=\"defaultHeader()\">{{defaultHeader()}}</div>');\r\n tElement.prepend(headerElement);\r\n }\r\n\r\n var displayNone = typeaheadElement.attr(typeaheadDisplayNone);\r\n var noneAction = typeaheadElement.attr(typeaheadNoneAction);\r\n if(displayNone) {\r\n var noneElement = angular.element('<div class=\"li-item\" ng-show=\"displayNone()\" ng-click=\"noneAction()\">None</div>');\r\n tElement.prepend(noneElement);\r\n }\r\n\r\n return function(scope, element) {\r\n // Fixes issue where you can click in the list of matches on a header or something\r\n // without trying to select a match\r\n // and the matches will still get reset\r\n element.on('click', stopPropagation);\r\n scope.$on('$destroy', function () {\r\n element.off('click', stopPropagation);\r\n });\r\n \r\n if(header) {\r\n scope.defaultHeader = function() {\r\n // The default header should only be shown if we're displaying the default results.\r\n var hasDefaultMatches = scope.matches && scope.matches[0] && scope.matches[0].model && scope.matches[0].model.isDefault;\r\n if(hasDefaultMatches) {\r\n // evaluate on outer parent scope because that is what typeahead would evaluate this attribute on\r\n return scope.$parent.$parent.$eval(header);\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n if(displayNone) {\r\n scope.displayNone = function() {\r\n // evaluate on outer parent scope because that is what typeahead would evaluate this attribute on\r\n return scope.$parent.$parent.$eval(displayNone);\r\n };\r\n }\r\n\r\n if(noneAction) {\r\n scope.noneAction = function() {\r\n // evaluate on outer parent scope because that is what typeahead would evaluate this attribute on\r\n return scope.$parent.$parent.$eval(noneAction);\r\n };\r\n }\r\n\r\n var typeaheadNgModel = typeaheadElement.controller('ngModel');\r\n var triggerSearch = _.partial(typeaheadTriggerSearch, typeaheadNgModel);\r\n scope.triggerSearch = triggerSearch;\r\n\r\n var interceptor = typeaheadElement.attr(typeaheadSelectInterceptor);\r\n\r\n var selectInterceptor = function() { return true; };\r\n if(interceptor) {\r\n var parsedInterceptor = $parse(interceptor);\r\n selectInterceptor = function(item, evt) {\r\n var interceptorArgs = {\r\n $item: item,\r\n $event: evt,\r\n $triggerSearch: triggerSearch,\r\n };\r\n // evaluate on outer scope because that is what typeahead would evaluate this attribute on\r\n return parsedInterceptor(scope.$parent.$parent, interceptorArgs);\r\n };\r\n }\r\n\r\n scope.shouldSelect = selectInterceptor;\r\n\r\n // override the select function to use the interceptor provided by the typeaheadSelectInterceptor attr\r\n var parentSelect = scope.$parent.select;\r\n scope.$parent.select = function(activeIdx, evt) {\r\n var match = scope.$parent.matches[activeIdx];\r\n var item = match.model;\r\n\r\n if(match.override || selectInterceptor(item, evt)) {\r\n return parentSelect.apply(this, arguments);\r\n }\r\n else if(evt && evt.stopPropagation) {\r\n evt.stopPropagation();\r\n }\r\n };\r\n\r\n scope.selectOther = function(obj, evt, override) {\r\n scope.$parent.matches[otherMatchProp] = {\r\n id: otherMatchProp,\r\n label: '',\r\n model: obj,\r\n override: !!override,\r\n };\r\n scope.selectMatch(otherMatchProp, evt);\r\n delete scope.$parent.matches[otherMatchProp];\r\n };\r\n\r\n link.apply(this, arguments);\r\n\r\n setTypeaheadPopupHeight(scope, element, typeaheadElement);\r\n positionTypeaheadPopup(scope, element, typeaheadElement);\r\n };\r\n };\r\n\r\n return $delegate;\r\n }\r\n\r\n function uibTypeaheadDecorator(\r\n $delegate\r\n ) {\r\n\r\n var directive = $delegate[0];\r\n\r\n var directiveController = directive.controller;\r\n directive.controller = [\r\n '$attrs',\r\n '$controller',\r\n '$document',\r\n '$element',\r\n '$scope',\r\n '$transclude',\r\n uibTypeaheadController,\r\n ];\r\n\r\n var compile = directive.compile;\r\n directive.compile = function() {\r\n var link = compile.apply(this, arguments);\r\n\r\n return function(scope, element, attrs, ctrls) {\r\n var ngModel = ctrls[0];\r\n var triggerSearch = _.partial(typeaheadTriggerSearch, ngModel);\r\n\r\n link.apply(this, arguments);\r\n\r\n // Setup an event handler to allow a search to be triggered manually\r\n scope.$on(typeaheadSearchEvent, function (e, selector, value) {\r\n if (element.is(selector)) {\r\n triggerSearch(value);\r\n element.focus();\r\n }\r\n });\r\n\r\n // if this attribute evaluates to truthy, then add a formatter that will trigger the search\r\n // if the modelValue is a string\r\n if(scope.$eval(attrs[apTypeaheadSearchOnModelUpdate])) {\r\n var typeaheadFormatter = ngModel.$formatters.pop();\r\n ngModel.$formatters.push(createSearchFormatter(typeaheadFormatter));\r\n }\r\n\r\n function createSearchFormatter(originalFormatterFn) {\r\n return searchFormatter;\r\n\r\n function searchFormatter(modelValue) {\r\n if(modelValue && angular.isString(modelValue)) {\r\n triggerSearch(modelValue);\r\n return modelValue;\r\n }\r\n return originalFormatterFn(modelValue);\r\n }\r\n }\r\n };\r\n };\r\n\r\n return $delegate;\r\n\r\n\r\n function uibTypeaheadController(\r\n $attrs,\r\n $controller,\r\n $document,\r\n $element,\r\n $scope,\r\n $transclude\r\n ) {\r\n var domElement = $element[0];\r\n var documentElement = $document[0].documentElement;\r\n\r\n // Register these listeners in this order, because the directiveController\r\n // registers a 'click' listener on the document as well.\r\n // Surrounding that listener with these 2 will allow us to control how the directive controller\r\n // handles the event, and then cleanup anything extra afterwards.\r\n $document.on('click', documentClickHandlerStart);\r\n var controller = $controller(directiveController, {\r\n $attrs: $attrs,\r\n $element: $element,\r\n $scope: $scope,\r\n $transclude: $transclude,\r\n });\r\n $document.on('click', documentClickHandlerEnd);\r\n \r\n\r\n $scope.$on('$destroy', function () {\r\n $document.off('click', documentClickHandlerStart);\r\n $document.off('click', documentClickHandlerEnd);\r\n });\r\n\r\n return controller;\r\n\r\n\r\n // This function is setup to not allow clicks in a separate modal to close out of typeahead matches,\r\n // since the modal is supposed to be sort of separate from the current page.\r\n function documentClickHandlerStart(event) {\r\n var target = event && event.target;\r\n if (!target) {\r\n return;\r\n }\r\n\r\n if (target === documentElement) {\r\n // If the click is on the documentElement, then it is most likely because\r\n // the mouse was dragged outside the screen.\r\n // Set the target to be the current typeahead element, so the matches won't get closed.\r\n event[originalTargetProp] = event.target;\r\n event.target = domElement;\r\n return;\r\n }\r\n\r\n\r\n // If the click is inside a modal, and the modal doesn't contain this typeahead,\r\n // then set the target to be the current typeahead element, so the matches won't get closed.\r\n var targetModalContainer = $(target).parents('.modal')[0];\r\n if (targetModalContainer && !$.contains(targetModalContainer, domElement)) {\r\n event[originalTargetProp] = event.target;\r\n event.target = domElement;\r\n return;\r\n }\r\n }\r\n\r\n function documentClickHandlerEnd(event) {\r\n var originalTarget = event && event[originalTargetProp];\r\n if(originalTarget) {\r\n // if the target was changed by the handler above, then reset it back to its original value,\r\n // and cleanup the originalTargetProp to avoid side effects\r\n event.target = originalTarget;\r\n delete event[originalTargetProp];\r\n }\r\n }\r\n }\r\n }\r\n\r\n function apTypeaheadSearchOnClickDirective(\r\n ClickListenerService\r\n ) {\r\n\r\n var directive = {\r\n restrict: 'A',\r\n link: link,\r\n };\r\n\r\n return directive;\r\n\r\n function link(\r\n scope,\r\n elem,\r\n attrs\r\n ) {\r\n var dereg = ClickListenerService.register(elem, clickHandler);\r\n\r\n // prevent default of mousedown event on this element so it doesn't get focused, and the\r\n // typeahead input box can be focused instead\r\n elem.on('mousedown', preventDefault);\r\n\r\n scope.$on('$destroy', function () {\r\n elem.off('mousedown', preventDefault);\r\n dereg();\r\n });\r\n\r\n function clickHandler() {\r\n var selector = scope.$eval(attrs[apTypeaheadSearchOnClick]);\r\n var value = scope.$eval(attrs[apTypeaheadSearchOnClick + 'Value']);\r\n\r\n scope.$broadcast(typeaheadSearchEvent, selector, value);\r\n }\r\n\r\n function preventDefault(event) {\r\n if(event && event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function typeaheadTriggerSearch(ngModel, value) {\r\n ngModel.$$lastCommittedViewValue = null;\r\n ngModel.$setViewValue(value || ngModel.$viewValue);\r\n ngModel.$render();\r\n }\r\n\r\n function stopPropagation(event) {\r\n if(event && event.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n }\r\n \r\n})(window.angular);\r\n","angular.module('aprima-core-ui').directive('affix', function () {\r\n 'use strict';\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n //element is already a jquery or jqlite object\r\n element.affix({\r\n offset: {\r\n top: 95\r\n }\r\n });\r\n }\r\n };\r\n});\r\n","angular.module('aprima-core-ui').directive('apAddress',\r\n ['Bridge',\r\n function (Bridge) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n address: '='\r\n },\r\n templateUrl: '/core-ui/views/directives/apAddress.html',\r\n link: function($scope) {\r\n $scope.openMap = function () {\r\n Bridge.fireEvent('openExternalMapsApp', {\r\n Address1: $scope.address.Address1,\r\n Address2: $scope.address.Address2,\r\n City: $scope.address.City,\r\n State: $scope.address.State,\r\n Zip: $scope.address.Zip,\r\n Country: $scope.address.Country\r\n });\r\n //fire event or whatever is needed to open the external map app with the address\r\n };\r\n }\r\n };\r\n }]);","angular.module('aprima-core-ui')\r\n .directive('apAndroidHeightFix', ['$interval', function($interval) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element){\r\n var cancelUpdate = false;\r\n\r\n element.css('min-height', '101%');\r\n\r\n function updateVisibility(){\r\n var totalHeight = 0;\r\n var parentHeight = $('body').height();\r\n\r\n element.children().each(function(){\r\n totalHeight = totalHeight + $(this).outerHeight();\r\n });\r\n\r\n if(totalHeight > parentHeight){\r\n $('body').css('overflow', 'visible');\r\n }\r\n else{\r\n $('body').css('overflow', 'hidden');\r\n }\r\n }\r\n\r\n var widthWatch = $interval(function(){\r\n // Even after calling $interval.cancel()\r\n // on the promise that $interval returns,\r\n // this method can still get called at least once.\r\n // That would cause it to get set to \"overflow: visible\" in the $destroy,\r\n // and then get reset to \"overflow:hidden\" after because of this method call.\r\n // To handle this race condition, check \"cancelUpdate\" to see whether\r\n // to proceed further in this method.\r\n if(cancelUpdate) {\r\n return;\r\n }\r\n\r\n updateVisibility();\r\n }, 50);\r\n\r\n scope.$on('$destroy', function(){\r\n cancelUpdate = true;\r\n $interval.cancel(widthWatch);\r\n $('body').css('overflow', 'visible');\r\n });\r\n }\r\n };\r\n}]);","angular.module('aprima-core-ui')\r\n .directive('apAppointmentContextMenu', ['$rootScope', 'SecurityRepository', 'Permissions',\r\n function ($rootScope, SecurityRepository, Permissions) {\r\n 'use strict';\r\n\r\n $rootScope.setOptsForApptContextMenu = function setOptsForApptContextMenu(opts) {\r\n $rootScope.$emit('open-appt-context-menu', opts);\r\n };\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n templateUrl: '/core-ui/views/directives/apAppointmentContextMenu.html',\r\n link: function($scope) {\r\n $scope.getChargeCaptureTransition = function getChargeCaptureTransition() {\r\n return {\r\n appRoute: 'chargeCapture',\r\n opts: {\r\n patientId: getPatientId(),\r\n serviceSiteId: $scope.appointment.ServiceSiteId\r\n }\r\n };\r\n };\r\n \r\n var deregister = $rootScope.$on('open-appt-context-menu', function(evt, obj) {\r\n $scope.appointment = obj && obj.appointment;\r\n SecurityRepository.getPermissions(Permissions.Schedule)\r\n .then(function(permission) {\r\n $scope.schedulePermissionAllowed = permission && permission.IsAllowed;\r\n })\r\n .catch(function() {\r\n $scope.schedulePermissionAllowed = false;\r\n });\r\n });\r\n\r\n $scope.$on('$destroy', function() {\r\n deregister();\r\n });\r\n\r\n function getPatientId()\r\n {\r\n if ($scope.appointment)\r\n {\r\n if ($scope.appointment.PatientId)\r\n {\r\n return $scope.appointment.PatientId;\r\n }\r\n\r\n if ($scope.appointment.Patient)\r\n {\r\n return $scope.appointment.Patient.Id;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }]);\r\n","angular.module('aprima-core-ui').directive('apAuthorization', [ 'AuthorizationService', function (AuthorizationService) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n providerRequired: '@'\r\n },\r\n link: function (scope, element) {\r\n if(scope.providerRequired){\r\n if(!AuthorizationService.isUserProvider()){\r\n // only calling $destroy here because this is using an isolate scope for this directive\r\n // that can be safely destroyed when this element is removed\r\n // don't do this if it's sharing an outer scope with some other element, or there will likely be issues\r\n scope.$destroy();\r\n element.remove();\r\n }\r\n }\r\n }\r\n };\r\n}]);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').directive('apAutofocus', ['$timeout', function($timeout) {\r\n return {\r\n scope: { \r\n autoFocus: '=apAutofocus' \r\n },\r\n link: function(scope, element) {\r\n if(scope.autoFocus) { \r\n $timeout(function() {\r\n element[0].focus();\r\n });\r\n }\r\n }\r\n };\r\n }]);\r\n\r\n})(window.angular);\r\n","angular.module('aprima-core-ui').directive('apBirthdate', ['DateUtilities', function (DateUtilities) {\r\n 'use strict';\r\n\r\n\r\n return{\r\n restrict: 'E',\r\n scope: {\r\n birthdate: '@',\r\n deathdate: '@',\r\n display: '@'\r\n },\r\n compile: function () {\r\n var _link = function (scope, elem) {\r\n\r\n elem.html(DateUtilities.displayAge(DateUtilities.getPersonAge(scope.birthdate, scope.deathdate), {display: scope.display}));\r\n\r\n var watchRemover = scope.$watchCollection('[birthdate, deathdate, display]', function (newval, oldval) {\r\n var person;\r\n if (newval !== oldval) {\r\n person = DateUtilities.getPersonAge(newval[0], newval[1]);\r\n elem.html(DateUtilities.displayAge(person, {display: newval[2]}));\r\n }\r\n });\r\n\r\n scope.$on('$destroy', function(){\r\n watchRemover();\r\n });\r\n };\r\n\r\n return _link;\r\n }\r\n };\r\n}]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n var baseAttrName = 'apCheckbox';\r\n\r\n // interpolated string attribute to generate visible label text automatically\r\n var labelAttribute = baseAttrName + 'Label';\r\n\r\n // interpolated string attribute to be used in case the checkbox isn't supposed to have visible label text\r\n // but the text should show up for screenreaders\r\n var hiddenLabelAttribute = baseAttrName + 'HiddenLabel';\r\n\r\n var currentId = 0;\r\n\r\n // override this behavior for all input[type=checkbox]\r\n angular.module('aprima-core-ui').directive('input', [\r\n '$compile',\r\n '$log',\r\n apCheckBox,\r\n ]);\r\n\r\n function apCheckBox(\r\n $compile,\r\n $log\r\n ) {\r\n\r\n var directive = {\r\n restrict: 'E',\r\n compile: compile,\r\n };\r\n\r\n return directive;\r\n\r\n\r\n function compile(\r\n tElement,\r\n tAttrs\r\n ) {\r\n if(tAttrs.type !== 'checkbox' || tElement.hasClass('native')) {\r\n return;\r\n }\r\n\r\n var returnValue = {\r\n post: postLink,\r\n };\r\n\r\n // add the class to wrap this, so it all looks right\r\n tElement.parent().addClass('ap-checkbox-wrapper');\r\n\r\n // set the tabindex to 0 if it's not set, so this checkbox can be focusable in the document's source order\r\n // this attribute isn't interpolated, so it's ok that it doesn't get $compiled\r\n if(!tAttrs.tabindex) {\r\n tAttrs.$set('tabindex', 0);\r\n }\r\n\r\n return returnValue;\r\n }\r\n\r\n function postLink(\r\n scope,\r\n element,\r\n attrs\r\n ) {\r\n var errors = [];\r\n\r\n var labelText;\r\n var checkboxLabel;\r\n\r\n var checkBoxId = attrs.id;\r\n if(!checkBoxId) {\r\n checkBoxId = newId();\r\n attrs.$set('id', checkBoxId);\r\n\r\n errors.push('This checkbox doesn\\'t have the id attribute filled in. An id should be added. A temp id \"' + checkBoxId + '\" was created as a fallback,' +\r\n ' and if a NEW label is generated for this checkbox, the label will be associated to it.');\r\n }\r\n\r\n if(attrs[hiddenLabelAttribute]) {\r\n labelText = attrs[hiddenLabelAttribute];\r\n checkboxLabel = angular.element('<label class=\"ap-checkbox-hidden-text\"></label>');\r\n }\r\n else if(attrs[labelAttribute]) {\r\n labelText = attrs[labelAttribute];\r\n checkboxLabel = angular.element('<label></label>');\r\n }\r\n else {\r\n var nextNode = element.next()[0];\r\n var nextNodeName = nextNode && nextNode.nodeName && nextNode.nodeName.toLowerCase();\r\n\r\n // without a label next to it, the checkbox, won't show up, so add one, even if no text was passed in\r\n if(nextNodeName !== 'label') {\r\n labelText = checkBoxId;\r\n checkboxLabel = angular.element('<label class=\"ap-checkbox-hidden-text\"></label>');\r\n\r\n errors.push('This checkbox doesn\\'t have a label after it and the ' +\r\n labelAttribute + ' attribute and ' +\r\n hiddenLabelAttribute + ' attribute are not filled in. One of these options needs to be used for correct behavior.' +\r\n ' A label with the id as the text was created as a fallback.');\r\n }\r\n else {\r\n printErrors();\r\n return;\r\n }\r\n }\r\n\r\n checkboxLabel.attr('for', checkBoxId);\r\n checkboxLabel.text(labelText);\r\n element.after(checkboxLabel);\r\n $compile(checkboxLabel)(scope);\r\n\r\n printErrors();\r\n return;\r\n\r\n\r\n function printErrors() {\r\n if(errors.length) {\r\n // print out errors that have the actual dom element, instead of just the template element,\r\n // so they can be more easily traced to the dom\r\n errors.forEach(function(error) {\r\n $log.warn(error, element[0]);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n function newId() {\r\n var id = 'ap-checkbox-' + currentId++;\r\n return id;\r\n }\r\n\r\n})(window.angular);\r\n","/*\r\nAdapted from https://github.com/ianwalter/ng-context-menu with an MIT license.\r\n*/\r\n(function () {\r\n 'use strict';\r\n angular.module('aprima-core-ui').directive('apContextMenu', [\r\n '$window',\r\n '$document',\r\n 'AprimaAnalytics',\r\n '$log',\r\n 'ClickListenerService',\r\n 'PressListenerService',\r\n '$rootScope',\r\n '$parse',\r\n 'Bridge',\r\n '$timeout',\r\n '$transitions',\r\n function apContextMenu(\r\n $window,\r\n $document,\r\n AprimaAnalytics,\r\n $log,\r\n ClickListenerService,\r\n PressListenerService,\r\n $rootScope,\r\n $parse,\r\n Bridge,\r\n $timeout,\r\n $transitions\r\n ) {\r\n var menuTracker = {\r\n element: null,\r\n menuElement: null\r\n };\r\n\r\n Bridge.on('navigate', $rootScope, broadcastCloseContextMenu);\r\n $transitions.onSuccess({}, function closeContextMenu() {\r\n //must do it in a timeout because it interferes with the current $digest cycle\r\n $timeout(broadcastCloseContextMenu, 0);\r\n });\r\n\r\n return {\r\n restrict: 'A',\r\n scope: false,\r\n link: link,\r\n };\r\n\r\n function broadcastCloseContextMenu() {\r\n $rootScope.$broadcast('close-context-menu');\r\n }\r\n\r\n function getBackdrop() {\r\n var element;\r\n var parent = $document.find('#context-menu-container');\r\n var backdrops = parent.find('.context-menu-backdrop');\r\n var deregisterFn = angular.noop;\r\n\r\n //add the backdrop if it isnt already on the page\r\n if (!backdrops.length) {\r\n element = angular.element('<div class=\"context-menu-backdrop\"></div>')[0];\r\n parent.append(element);\r\n } else {\r\n element = backdrops[0];\r\n }\r\n\r\n element = angular.element(element);\r\n\r\n return {\r\n addBackdrop: addBackdrop,\r\n removeBackdrop: removeBackdrop,\r\n };\r\n\r\n function addBackdrop(backdropClickHandler) {\r\n element.addClass('on');\r\n deregisterFn = ClickListenerService.register(element, backdropClickHandler);\r\n }\r\n\r\n function removeBackdrop() {\r\n element.removeClass('on');\r\n deregisterFn();\r\n }\r\n }\r\n\r\n function link(scope, element, attrs) {\r\n var opened = false;\r\n var backdrop = getBackdrop();\r\n var handleClick = attrs.apContextMenuOnClick ? !!JSON.parse(String(attrs.apContextMenuOnClick).toLowerCase()) : false;\r\n var openFn = attrs.apContextMenuOpen ? $parse(attrs.apContextMenuOpen) : angular.noop;\r\n var closeFn = attrs.apContextMenuClose ? $parse(attrs.apContextMenuClose) : angular.noop;\r\n var setPosition = _.isUndefined(attrs.apContextMenuSetPosition) ? true : !!$parse(attrs.apContextMenuSetPosition)();\r\n var lastEvent = null;\r\n var observer = new MutationObserver(function () {\r\n if (lastEvent) {\r\n resizeMenu(lastEvent, menuTracker.menuElement);\r\n }\r\n });\r\n var deregisterClose = $rootScope.$on('close-context-menu', tryCloseContextMenu);\r\n var deregisterListener;\r\n\r\n //browser default right click menu event\r\n element.bind('contextmenu', handleOpenContextMenuEvent);\r\n\r\n if (handleClick) {\r\n deregisterListener = ClickListenerService.register(element, handleOpenContextMenuEvent);\r\n } else {\r\n deregisterListener = PressListenerService.register(element, handleOpenContextMenuEvent);\r\n }\r\n\r\n scope.$on('$destroy', cleanup);\r\n\r\n function openContextMenu(event) {\r\n AprimaAnalytics.sendEvent('gestures', 'open-context-menu', attrs.apContextMenuType || '', 0);\r\n\r\n var menuElement = menuTracker.menuElement;\r\n //show and THEN calculate positional properties\r\n menuElement.addClass('open');\r\n\r\n lastEvent = event;\r\n resizeMenu(event, menuElement);\r\n\r\n //Track changes to the DOM tree so that if it changes, the menu will resize.\r\n observer.observe(menuElement[0], {childList: true, subtree: true});\r\n\r\n opened = true;\r\n\r\n backdrop.addBackdrop(backdropClickHandler);\r\n }\r\n\r\n function resizeMenu(event, menuElement) {\r\n if (!menuElement) {\r\n return;\r\n }\r\n\r\n if (!event.pageX && event.pageX !== 0) {\r\n AprimaAnalytics.sendEvent('gestures', 'open-context-menu', 'X,Y coords could not be found', 0);\r\n $log.warn('Could not determine X,Y coordinates for ');\r\n }\r\n\r\n var doc = $document[0].documentElement,\r\n docLeft = ($window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),\r\n docTop = ($window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0),\r\n elementHeight = menuElement[0].scrollHeight,\r\n elementWidth = menuElement[0].scrollWidth,\r\n docHeight = doc.clientHeight + docTop,\r\n totalHeight = event.pageY - elementHeight,\r\n docWidth = doc.clientWidth + docLeft,\r\n totalWidth = elementWidth + event.pageX,\r\n top = Math.max(event.pageY - elementHeight - docTop, 0),\r\n left = Math.max(event.pageX - docLeft, 0);\r\n\r\n if (totalHeight > docHeight) {\r\n top = top - (totalHeight - docHeight);\r\n }\r\n\r\n if (totalWidth > docWidth) {\r\n left = left - (totalWidth - docWidth);\r\n }\r\n\r\n if (setPosition) {\r\n menuElement.css('top', top + 'px');\r\n menuElement.css('left', left + 'px');\r\n }\r\n\r\n opened = true;\r\n\r\n backdrop.addBackdrop(backdropClickHandler);\r\n }\r\n\r\n function tryCloseContextMenu() {\r\n var menuElement = menuTracker.menuElement;\r\n if (menuElement) {\r\n menuElement.removeClass('open');\r\n\r\n opened = false;\r\n\r\n menuTracker.element = null;\r\n menuTracker.menuElement = null;\r\n\r\n backdrop.removeBackdrop();\r\n\r\n closeFn(scope);\r\n }\r\n }\r\n\r\n function handleOpenContextMenuEvent(event) {\r\n scope.$apply(function() {\r\n //manipulates hammerjs events to have needed properties in the same place as regular click events\r\n var srcEvent = event.srcEvent;\r\n var startEvent = event.startEvent;\r\n\r\n if (event.center && event.center.x) {\r\n event.pageX = event.center.x;\r\n event.pageY = event.center.y;\r\n } else if (srcEvent && srcEvent.pageX) {\r\n event.pageX = srcEvent.pageX;\r\n event.pageY = srcEvent.pageY;\r\n } else if (startEvent) {\r\n if (startEvent.x) {\r\n event.pageX = startEvent.x;\r\n event.pageY = startEvent.y;\r\n } else if (startEvent.touches && startEvent.touches.length) {\r\n var touch = startEvent.touches[0];\r\n event.pageX = touch.pageX;\r\n event.pageY = touch.pageY;\r\n }\r\n }\r\n\r\n tryCloseContextMenu();\r\n\r\n menuTracker.menuElement = angular.element(document.getElementById(attrs.apContextMenuTarget));\r\n menuTracker.element = event.target;\r\n\r\n openFn(scope);\r\n\r\n event.preventDefault();\r\n\r\n openContextMenu(event);\r\n });\r\n }\r\n\r\n function backdropClickHandler() {\r\n scope.$apply(tryCloseContextMenu);\r\n }\r\n\r\n function cleanup() {\r\n element.unbind('contextmenu', handleOpenContextMenuEvent);\r\n\r\n deregisterListener();\r\n deregisterClose();\r\n\r\n if (opened) {\r\n tryCloseContextMenu();\r\n }\r\n }\r\n }\r\n }\r\n ]);\r\n})();","angular.module('aprima-core-ui')\r\n .directive('apDashboardTileHeader', ['$window', '_', function ($window, _) {\r\n 'use strict';\r\n\r\n var requestAnimationFrame = window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n function (callback) {\r\n $window.setTimeout(callback, 1000/60);\r\n };\r\n\r\n //taken from headroom.js. utilizes requestAnimationFrame and prevents multiple scroll events from executing on top of each other.\r\n //initialize with a a callback function, and attach handleEvent to event listeners to debounce the listener\r\n function Debouncer(callback) {\r\n this.callback = callback;\r\n this.ticking = false;\r\n this.requestedDuringTick = false;\r\n }\r\n\r\n Debouncer.prototype = {\r\n constructor: Debouncer,\r\n\r\n update: function () {\r\n if (this.callback) {\r\n this.callback();\r\n }\r\n\r\n this.ticking = false;\r\n\r\n //execute at trailing edge of debounce\r\n if(this.requestedDuringTick){\r\n this.requestedDuringTick = false;\r\n this.requestTick();\r\n }\r\n },\r\n requestTick: function () {\r\n if (!this.ticking) {\r\n requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));\r\n this.ticking = true;\r\n }\r\n else{\r\n this.requestedDuringTick = true;\r\n }\r\n },\r\n handleEvent: function () {\r\n this.requestTick();\r\n }\r\n };\r\n\r\n\r\n function DashboardHeader(elem, watchElementSelector, options) {\r\n options = _.defaults(options, DashboardHeader.defaultOptions);\r\n\r\n this.lastY = 0;\r\n this.element = elem;\r\n this.watchElementSelector = watchElementSelector;\r\n\r\n this.scroller = options.scroller;\r\n this.topOffset = options.topOffset;\r\n this.bottomOffset = options.bottomOffset;\r\n this.scrollUpClass = options.scrollUpClass;\r\n this.scrollDownClass = options.scrollDownClass;\r\n this.affixedClassName = options.affixedClassName;\r\n\r\n var debouncer = new Debouncer(this.update.bind(this));\r\n this.debouncedUpdate = debouncer.handleEvent.bind(debouncer);\r\n }\r\n\r\n DashboardHeader.defaultOptions = {\r\n topOffset: 0,\r\n bottomOffset: 0,\r\n scroller : $window,\r\n scrollUpClass: 'scrolled-up',\r\n scrollDownClass: 'scrolled-down',\r\n affixedClassName: 'dashboard-heading-affix'\r\n };\r\n\r\n DashboardHeader.prototype = {\r\n constructor: DashboardHeader,\r\n getWatchElement: function() {\r\n if(!this.__watchElement) {\r\n var watchElement = angular.element(this.watchElementSelector);\r\n\r\n //keep trying to find it if we there werent any results\r\n if(watchElement.length) {\r\n this.__watchElement = watchElement[0];\r\n }\r\n }\r\n return this.__watchElement;\r\n },\r\n isElementInViewport: function () {\r\n var watchElement = this.getWatchElement();\r\n\r\n if(!watchElement) {\r\n return false;\r\n }\r\n\r\n var rect = watchElement.getBoundingClientRect();\r\n\r\n //apply class when top of the element is above the viewport and when the bottom of the element is below the top of the viewport (can be outside of viewport)\r\n return rect.top < (0 + this.topOffset) && rect.bottom >= (0 + this.bottomOffset);\r\n },\r\n toggleIsVisibleClass: function () {\r\n this.element.toggleClass(this.affixedClassName, this.isElementInViewport());\r\n },\r\n getScrollY : function() {\r\n return (this.scroller.pageYOffset !== undefined) ? this.scroller.pageYOffset : (this.scroller.scrollTop !== undefined) ? this.scroller.scrollTop : (document.documentElement || document.body.parentNode || document.body).scrollTop;\r\n },\r\n //TAKEN FROM headroom.js\r\n getViewportHeight : function () {\r\n return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;\r\n },\r\n /** TAKEN FROM headroom.js\r\n * Gets the height of the document\r\n * @see http://james.padolsey.com/javascript/get-document-height-cross-browser/\r\n * @return {int} the height of the document in pixels\r\n */\r\n getDocumentHeight : function () {\r\n var body = document.body,\r\n documentElement = document.documentElement;\r\n\r\n return Math.max(\r\n body.scrollHeight, documentElement.scrollHeight,\r\n body.offsetHeight, documentElement.offsetHeight,\r\n body.clientHeight, documentElement.clientHeight\r\n );\r\n },\r\n\r\n /** TAKEN FROM headroom.js\r\n * Gets the height of the DOM element\r\n * @param {Object} elm the element to calculate the height of which\r\n * @return {int} the height of the element in pixels\r\n */\r\n getElementHeight : function (elm) {\r\n return Math.max(elm.scrollHeight, elm.offsetHeight, elm.clientHeight);\r\n },\r\n\r\n /** TAKEN FROM headroom.js\r\n * Gets the height of the scroller element\r\n * @return {int} the height of the scroller element in pixels\r\n */\r\n getScrollerHeight : function () {\r\n return (this.scroller === window || this.scroller === document.body) ? this.getDocumentHeight() : this.getElementHeight(this.scroller);\r\n },\r\n\r\n /** TAKEN FROM headroom.js\r\n * determines if the scroll position is outside of document boundaries\r\n * @param {int} currentScrollY the current y scroll position\r\n * @return {bool} true if out of bounds, false otherwise\r\n */\r\n isOutOfBounds : function (currentScrollY) {\r\n var pastTop = currentScrollY < 0,\r\n pastBottom = currentScrollY + this.getViewportHeight() > this.getScrollerHeight();\r\n\r\n return pastTop || pastBottom;\r\n },\r\n updateScrollPosition: function () {\r\n var currentScrollY = this.getScrollY();\r\n\r\n if(this.isOutOfBounds(currentScrollY)) { // Ignore bouncy scrolling in OSX\r\n return;\r\n }\r\n //100 is the tolerance.up from the patientHeaderTile.html (must be negative in if statement), 0 is the tolerance.down\r\n if(currentScrollY-this.lastY<=-100 || currentScrollY-this.lastY>0) {\r\n var scrolledDown = currentScrollY >= this.lastY;\r\n\r\n if (scrolledDown) {\r\n this.element.addClass(this.scrollDownClass);\r\n this.element.removeClass(this.scrollUpClass);\r\n }\r\n else {\r\n this.element.removeClass(this.scrollDownClass);\r\n this.element.addClass(this.scrollUpClass);\r\n }\r\n }\r\n\r\n this.lastY = currentScrollY;\r\n },\r\n update: function () {\r\n this.toggleIsVisibleClass();\r\n this.updateScrollPosition();\r\n }\r\n };\r\n\r\n var link = function ($scope, element, attrs) {\r\n var elm = element.children('.panel-header-sticky'),\r\n scroller = document.getElementById($scope.apScroller) || window,\r\n watchElementSelector = attrs.apIsVisibleForElement,\r\n options = {\r\n scroller: scroller,\r\n topOffset: parseInt(attrs.apIsVisibleTopOffset) || 0,\r\n bottomOffset: parseInt(attrs.apIsVisibleBottomOffset) || 0,\r\n scrollUpClass: attrs.apOnScrollUpClass,\r\n scrollDownClass: attrs.apOnScrollDownClass,\r\n affixedClassName: attrs.apIsVisibleClass\r\n };\r\n\r\n var header = new DashboardHeader(elm, watchElementSelector, options);\r\n header.update();\r\n\r\n // when scrolled or collapse or expand a tile, then update the 'scrolled-up' or 'scrolled-down'\r\n // class and then add or remove class that will fix the tile header to the top\r\n scroller.addEventListener('scroll', header.debouncedUpdate);\r\n $scope.toggle = function toggle() {\r\n header.debouncedUpdate();\r\n $scope.toggleTile();\r\n };\r\n\r\n $scope.$on('$destroy', function () {\r\n scroller.removeEventListener('scroll', header.debouncedUpdate);\r\n elm = header = null;\r\n });\r\n };\r\n\r\n return {\r\n restrict: 'E',\r\n templateUrl: '/core-ui/views/directives/apDashboardTileHeader.html',\r\n transclude: true,\r\n scope: {\r\n apScroller: '=',\r\n toggleTile: '&',\r\n },\r\n link: link\r\n };\r\n }]);\r\n","angular.module('aprima-core-ui').directive('apDataGroup', function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n label: '@',\r\n value: '@',\r\n normal: '@'\r\n },\r\n templateUrl: '/core-ui/views/directives/apDataGroup.html'\r\n };\r\n});","angular.module('aprima-core-ui').directive('apDateFormatter', ['LanguageFactory', '$log', '_',\r\n function(LanguageFactory, $log, _){\r\n 'use strict';\r\n\r\n var lang = LanguageFactory.getLang();\r\n\r\n var formatter = function(date, format){\r\n var formatted,\r\n dateArray;\r\n var langCode = (!lang || lang.code === '' ) ? 'en_us' : lang.code.toLowerCase();\r\n var isEnglish = (langCode === 'en_us');\r\n\r\n if(date === undefined){\r\n return '';\r\n }\r\n\r\n //when using input[type=\"date\"], dates can have quotes added like: '\"01/01/2000\"'. This strips those quotes out since quotes shouldnt be in a date anyway.\r\n if(_.isString(date)) {\r\n date = date.replace(/\"/igm, '');\r\n }\r\n\r\n moment.locale(langCode);\r\n var thisMoment;\r\n if(moment(date, 'MM/DD/YYYY').isValid()) {\r\n thisMoment = moment(new Date(date));\r\n }\r\n else {\r\n thisMoment = moment(date);\r\n }\r\n\r\n switch (format) {\r\n\r\n case 'date-time':\r\n formatted = thisMoment.format('L LT');\r\n break;\r\n case 'short-date':\r\n if (isEnglish) {\r\n formatted = thisMoment.format('M/D/YY');\r\n }\r\n else {\r\n formatted = thisMoment.format('D/M/YY');\r\n }\r\n break;\r\n case 'date':\r\n formatted = thisMoment.format('L');\r\n break;\r\n case 'time':\r\n formatted = thisMoment.format('LT');\r\n break;\r\n case 'short-time':\r\n if (isEnglish) {\r\n formatted = thisMoment.format('h:mm');\r\n } else {\r\n formatted = thisMoment.format('H:mm');\r\n }\r\n break;\r\n case 'long-date':\r\n formatted = thisMoment.format('LL');\r\n break;\r\n case 'long-abb-date':\r\n formatted = thisMoment.format('ll');\r\n break;\r\n case 'short-day':\r\n if (isEnglish) {\r\n dateArray = thisMoment.format('llll').split(',');\r\n formatted = dateArray[0];\r\n } else {\r\n dateArray = thisMoment.format('LLLL').split(',');\r\n formatted = dateArray[0];\r\n }\r\n break;\r\n case 'long-day':\r\n dateArray = thisMoment.format('LLLL').split(',');\r\n formatted = dateArray[0];\r\n break;\r\n case 'monthname-dayofmonth' :\r\n if (isEnglish) {\r\n dateArray = thisMoment.format('lll').split(',');\r\n formatted = dateArray[0];\r\n } else {\r\n dateArray = thisMoment.format('LLL').split(',');\r\n formatted = dateArray[0];\r\n }\r\n break;\r\n case 'full-date':\r\n formatted = thisMoment.format('dddd, MMMM DD, YYYY');\r\n break;\r\n case 'abb-full-date':\r\n formatted = thisMoment.format('ddd MMM DD, YYYY');\r\n break;\r\n default:\r\n formatted = thisMoment.format('L LT');\r\n break;\r\n }\r\n\r\n return formatted;\r\n };\r\n\r\n return {\r\n restrict: 'AEC',\r\n scope: {\r\n date: '@',\r\n jsdate: '=',\r\n format: '@'\r\n },\r\n link: function (scope, element) {\r\n var removeWatch = scope.$watchCollection('[date, format, default, jsdate]', function (newval, oldval) {\r\n var output;\r\n if (newval !== oldval || output === undefined) {\r\n var date = newval[3] || newval[0];\r\n var format = newval[1];\r\n\r\n if (date !== '') {\r\n output = formatter(date, format);\r\n if (output === 'Invalid date') {\r\n $log.info('apDateFormatter: error converting ' + date);\r\n return;\r\n }\r\n element.html(output);\r\n }\r\n }\r\n });\r\n\r\n scope.$on('$destroy', function(){\r\n removeWatch();\r\n });\r\n }\r\n };\r\n\r\n }]);\r\n","angular.module('aprima-core-ui').directive('apDateRangeFormatter',\r\n [function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'AEC',\r\n scope: {\r\n startDate: '=',\r\n endDate: '=',\r\n format: '@',\r\n multiline: '='\r\n },\r\n templateUrl: '/core-ui/views/directives/apDateRangeFormatter.html'\r\n };\r\n }]);\r\n","angular.module('aprima-core-ui').directive('apDocumentViewer', [\r\n 'BrowserService',\r\n 'ViewportInfo',\r\n '$sce',\r\n function (\r\n BrowserService,\r\n ViewportInfo,\r\n $sce\r\n ) {\r\n 'use strict';\r\n\r\n var imageFormats = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'rtf', 'doc', 'docx', 'tif', 'tiff'];\r\n var htmlFormats = ['html', 'htm'];\r\n var textFormats = ['txt'];\r\n var pdfFormats = ['pdf'];\r\n\r\n\r\n // We need to request a resolution for any pdfs to be rendered at, so we want to leverage the devices native resolution so that devices that are higher res\r\n // have less of a chance seeming pixelated at zoom factors. Happy side effect is that lower res devices tend to be less powerful, and this will give us smaller\r\n // images for those devices.\r\n var pageWidth = ViewportInfo.getWidth();\r\n var pageHeight = ViewportInfo.getHeight();\r\n\r\n return {\r\n restrict: 'E',\r\n templateUrl: '/core-ui/views/directives/apDocumentViewer.html',\r\n replace: true,\r\n scope: {\r\n disableFullscreen: '<?',\r\n disableInlinePdf: '<?',\r\n documentId: '=',\r\n loadDocument: '&loadFunction',\r\n },\r\n link: function ($scope) {\r\n\r\n //ap-image-viewer is 1-based instead of 0-based. First page has an index of 1.\r\n\r\n $scope.pageDetails = {\r\n page: $scope.page || 1,\r\n currentPage: $scope.currentPage || 1\r\n };\r\n\r\n $scope.loadPage = loadPage;\r\n\r\n $scope.$watch('documentId', function (newValue, oldValue) {\r\n tryLoadAttachment(1, oldValue);\r\n });\r\n\r\n function loadPage(page) {\r\n tryLoadAttachment(page, $scope.documentId);\r\n }\r\n\r\n function tryLoadAttachment(page, previousDocumentId) {\r\n if (_.isNumber(page)) {\r\n $scope.pageDetails.currentPage = $scope.page = page;\r\n }\r\n loadAttachment($scope, $scope.documentId, previousDocumentId, $scope.page);\r\n }\r\n }\r\n };\r\n\r\n\r\n function loadAttachment($scope, documentId, previousDocumentId, page) {\r\n if(documentId !== previousDocumentId) {\r\n $scope.loadError = null;\r\n $scope.attachment = null;\r\n $scope.isImage = false;\r\n $scope.isHtml = false;\r\n $scope.isText = false;\r\n $scope.isPdf = false;\r\n }\r\n\r\n if(!documentId) {\r\n return;\r\n }\r\n\r\n $scope.loadingAttachment = true;\r\n\r\n var request = {\r\n page: page,\r\n // Request double the device's resolution so we have a little give in the zooming department.\r\n height: pageHeight * 2,\r\n width: pageWidth * 2\r\n };\r\n\r\n $scope.loadDocument({documentId: documentId, requestSettings: request})\r\n .then(function (attachment) {\r\n $scope.attachment = attachment;\r\n $scope.attachment.attachmentData = attachment.Data;\r\n\r\n $scope.isImage = _.includes(imageFormats, attachment.Extension);\r\n $scope.isHtml = _.includes(htmlFormats, attachment.Extension);\r\n $scope.isText = _.includes(textFormats, attachment.Extension);\r\n $scope.isPdf = _.includes(pdfFormats, attachment.Extension);\r\n\r\n if ($scope.isImage) {\r\n //make apImageViewer happy\r\n $scope.attachment.imageData = 'data:image/' + attachment.Extension + ';base64,' + attachment.Data;\r\n }\r\n else if ($scope.isHtml) {\r\n $scope.attachment.htmlData = $sce.trustAsResourceUrl('data:text/html;charset=utf-8; base64,' + attachment.Data);\r\n }\r\n else if ($scope.isText) {\r\n $scope.attachment.textData = atob(attachment.Data);\r\n }\r\n else if ($scope.isPdf) {\r\n var blob = BrowserService.base64ToBlob(attachment.Data, 'application/pdf');\r\n var fileURL = window.URL.createObjectURL(blob);\r\n $scope.attachment.pdfData = $sce.trustAsResourceUrl(fileURL);\r\n }\r\n })\r\n .catch(function (response) {\r\n $scope.loadError = response;\r\n })\r\n .finally(function () {\r\n $scope.loadingAttachment = false;\r\n });\r\n }\r\n }]);\r\n","angular.module('aprima-core-ui').directive('apDynamicFrame',\r\n [\r\n function () {\r\n 'use strict';\r\n\r\n function link($scope) {\r\n function _resize(id){\r\n var newHeight;\r\n\r\n if(document.getElementById){\r\n newHeight = document.getElementById(id).contentWindow.document.body.scrollHeight;\r\n newHeight = newHeight + 30; //added to ensure no scroll bar\r\n }\r\n document.getElementById(id).height = (newHeight) + 'px';\r\n }\r\n function _reload(id){\r\n var iframeDocument = document.getElementById(id).contentWindow.document;\r\n var content = $scope.html;\r\n iframeDocument.write(content);\r\n\r\n _resize(id);\r\n }\r\n\r\n $scope.resize = _resize;\r\n $scope.reload = _reload;\r\n }\r\n\r\n return {\r\n restrict: 'EA',\r\n templateUrl: '/app/views/directives/apDynamicFrame.html',\r\n scope: {\r\n html: '=html',\r\n loadingUrl: '=loadingUrl'\r\n },\r\n link: link\r\n\r\n };\r\n }]);","angular.module('aprima-core-ui').directive('apFeatureCheck', [ 'ServerInfoRepository', function (ServerInfoRepository) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n requiredFeatures: '@'\r\n },\r\n link: function (scope, element) {\r\n if(scope.requiredFeatures){\r\n var splitRequiredFeatures = scope.requiredFeatures.split(',');\r\n var isSupported = ServerInfoRepository.isFeatureSupported(splitRequiredFeatures);\r\n\r\n if(!isSupported){\r\n // only calling $destroy here because this is using an isolate scope for this directive\r\n // that can be safely destroyed when this element is removed\r\n // don't do this if it's sharing an outer scope with some other element, or there will likely be issues\r\n scope.$destroy();\r\n element.remove();\r\n }\r\n }\r\n }\r\n };\r\n}]);","angular.module('aprima-core-ui').directive('apFormContainer', ['_', function (_) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n compile: function (element, attrs) {\r\n\t\t\tvar containerDisabledExpression = attrs.apFormContainerDisabledExpression;\r\n \r\n if(containerDisabledExpression){\r\n _.forEach(element.find('button,input,select,textarea'), function(input){\r\n input = $(input);\r\n \r\n if(!input.attr('ap-form-ignore-disabled')){\r\n var elementExpression = input.attr('ng-disabled');\r\n \r\n if(elementExpression){\r\n elementExpression += ' || (' + containerDisabledExpression + ')';\r\n } \r\n else{\r\n elementExpression = containerDisabledExpression;\r\n }\r\n \r\n input.attr('ng-disabled', elementExpression);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n}]);","angular.module('aprima-core-ui').directive('apFormFocus', function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function (scope, elem) {\r\n var handler = function () {\r\n elem.find('.ng-invalid:first').focus();\r\n };\r\n\r\n // set up event handler on the form element\r\n elem.on('submit', handler);\r\n\r\n scope.$on('$destroy', function(){\r\n elem.off('submit', handler);\r\n });\r\n }\r\n };\r\n});\r\n","angular.module('aprima-core-ui').directive('apFullModal', function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function (scope, elem, attrs) {\r\n\t\t\tvar header;\r\n\t\t\tvar footer;\r\n\t\t\tvar body;\r\n\t\t\tvar modalDialog;\r\n\t\t\tvar windowSelector = $(window);\r\n\t\t\t\r\n\t\t\tfunction updateMaxHeight(){\r\n\t\t\t\tvar reservedSpace = 62;\r\n\r\n\t\t\t\tif (!body || body.length < 1) {\r\n\t\t\t\t\theader = elem.find('.modal-header');\r\n\t\t\t\t\tfooter = elem.find('.modal-footer');\r\n\t\t\t\t\tbody = elem.find('.modal-body');\r\n\t\t\t\t\tmodalDialog = elem.closest('.modal-dialog');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (modalDialog && modalDialog.length > 0) {\r\n\t\t\t\t\tvar paddingTopStr = modalDialog.css('padding-top');\r\n\t\t\t\t\tvar paddingBottomStr = modalDialog.css('padding-bottom');\r\n\t\t\t\t\tvar paddingTop = parseInt(paddingTopStr);\r\n\t\t\t\t\tvar paddingBottom = parseInt(paddingBottomStr);\r\n\t\t\t\t\tif (paddingTop && paddingBottom) {\r\n\t\t\t\t\t\treservedSpace = 2 + paddingTop + paddingBottom;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif(header && header.length > 0){\r\n\t\t\t\t\treservedSpace += header.outerHeight();\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif(footer && footer.length > 0){\r\n\t\t\t\t\treservedSpace += footer.outerHeight();\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tvar target = windowSelector.height() - reservedSpace;\r\n\t\t\t\t\r\n\t\t\t\tbody.css('max-height', target + 'px');\r\n\t\t\t\t\r\n\t\t\t\tif(attrs.apFullModalAlways !== undefined){\r\n\t\t\t\t\tbody.css('height', target + 'px');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tupdateMaxHeight();\r\n\t\t\t\r\n\t\t\twindowSelector.on('resize', updateMaxHeight);\r\n\t\t\tvar observer = new MutationObserver(updateMaxHeight);\r\n\t\t\t\r\n\t\t\tobserver.observe(document.getElementsByClassName('modal')[0], {attributes: true, subtree: true, attributeFilter: ['class']});\r\n\t\t\t\r\n\t\t\tscope.$on('$destroy', function(){\r\n\t\t\t\twindowSelector.off('resize', updateMaxHeight);\r\n\t\t\t\tobserver.disconnect();\r\n\t\t\t});\r\n }\r\n };\r\n});\r\n","angular.module('aprima-core-ui').directive('apHideDevice', ['DeviceSettings', function (DeviceSettings) {\r\n 'use strict';\r\n //Will hide the element if running on a device\r\n\r\n return function(scope, element) {\r\n if(DeviceSettings.isDevice || DeviceSettings.isPhoneOrOverride || DeviceSettings.isTabletOrOverride){\r\n element.addClass('ng-hide');\r\n }\r\n };\r\n}]);\r\n","angular.module('aprima-core-ui').directive('apHighlight', function () {\r\n\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n highlight: '@',\r\n target: '@'\r\n },\r\n link: function (scope, elem) {\r\n var repl = '<b>' + scope.highlight + '</b>';\r\n var result = scope.target.replace(scope.highlight, repl);\r\n elem.replaceWith(result);\r\n }\r\n };\r\n\r\n});","angular.module('aprima-core-ui').controller('apIcdCodeModalCtrl', ['$scope', '$uibModalInstance', 'DiagnosisRepository', '$q', '_', 'searchParams',\r\n function ($scope, $uibModalInstance, DiagnosisRepository, $q, _, searchParams) {\r\n 'use strict';\r\n\r\n $scope.loading = true;\r\n $scope.modifierIndex = 0;\r\n\r\n var modifierPromise = DiagnosisRepository.getModifiers();\r\n var codePromise;\r\n\r\n function searchForCode(searchCode) {\r\n $scope.loading = true;\r\n searchCode = _.trim(searchCode);\r\n\r\n if ($scope.codeType === 'ICD10') {\r\n $scope.code = searchCode.substring(0, searchCode.length - 1);\r\n $scope.displayCode = $scope.code + 'X';\r\n }\r\n else {\r\n $scope.code = $scope.displayCode = searchCode;\r\n }\r\n\r\n $scope.topLevel = _.endsWith($scope.code, '.');\r\n\r\n if ($scope.topLevel) {\r\n codePromise = DiagnosisRepository.getDiagnoses($scope.code.substring(0, $scope.code.length - 1), 500);\r\n }\r\n else {\r\n codePromise = DiagnosisRepository.getDiagnoses($scope.code, 500, $scope.codeType);\r\n }\r\n\r\n performSearch();\r\n }\r\n\r\n function performSearch() {\r\n $q.all([modifierPromise, codePromise]).then(function (results) {\r\n var allModifiers = results[0].plain();\r\n var allCodes = results[1].plain();\r\n\r\n if (allCodes.length === 1) {\r\n $scope.diagnosisSelected(allCodes[0]);\r\n return;\r\n }\r\n\r\n $scope.allCodes = allCodes;\r\n $scope.filteredCodes = $scope.allCodes;\r\n\r\n var codeModifiers = _.chain(allCodes)\r\n .map('Modifiers')\r\n .flatten()\r\n .uniq()\r\n .value();\r\n\r\n var matchedCategories = _.filter(allModifiers, function (category) {\r\n var matched = _.chain(category.Modifiers)\r\n .map('Code')\r\n .intersection(codeModifiers)\r\n .some()\r\n .value();\r\n\r\n return matched;\r\n });\r\n\r\n $scope.modifierCategories = _.cloneDeep(_.sortBy(matchedCategories, 'Description'));\r\n $scope.selectedModifiers = [];\r\n updateCategories();\r\n\r\n $scope.loading = false;\r\n }).catch(function (response) {\r\n $scope.addHttpError(response);\r\n });\r\n }\r\n\r\n $scope.codeType = searchParams.codeType;\r\n searchForCode(searchParams.code);\r\n\r\n $scope.searchLevelUp = function searchLevelUp() {\r\n if (!$scope.topLevel) {\r\n searchForCode($scope.code);\r\n }\r\n };\r\n\r\n function updateCategories() {\r\n var remainingModifiers = _.chain($scope.filteredCodes)\r\n .map('Modifiers')\r\n .flatten()\r\n .uniq()\r\n .value();\r\n\r\n _.chain($scope.modifierCategories)\r\n .map('Modifiers')\r\n .flatten()\r\n .forEach(function (modifier) {\r\n modifier.disabled = !_(remainingModifiers).includes(modifier.Code);\r\n });\r\n }\r\n\r\n $scope.modifierSelected = function (modifier) {\r\n if (!modifier.disabled) {\r\n if (_($scope.selectedModifiers).includes(modifier.Code)) {\r\n _.pull($scope.selectedModifiers, modifier.Code);\r\n modifier.isSelected = false;\r\n }\r\n else {\r\n $scope.selectedModifiers.push(modifier.Code);\r\n modifier.isSelected = true;\r\n }\r\n\r\n filterCodes();\r\n updateCategories();\r\n }\r\n };\r\n\r\n function filterCodes() {\r\n $scope.filteredCodes = _.filter($scope.allCodes, function (code) {\r\n return !_.chain($scope.selectedModifiers)\r\n .difference(code.Modifiers)\r\n .some()\r\n .value();\r\n });\r\n }\r\n\r\n $scope.diagnosisSelected = function (diagnosis) {\r\n $uibModalInstance.close(diagnosis);\r\n };\r\n\r\n $scope.close = function () {\r\n $uibModalInstance.dismiss('cancel');\r\n };\r\n }]);","angular.module('aprima-core-ui')\r\n .directive('apImageViewer', [function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n templateUrl: '/core-ui/views/directives/apImageViewer.html',\r\n replace: true,\r\n scope: {\r\n imageData: '=',\r\n currentPage: '=',\r\n pageCount: '=',\r\n loadPage: '&',\r\n disableFullscreen: '<?'\r\n },\r\n link: function (scope, element) {\r\n scope.isFullScreenMode = false;\r\n \r\n // We'll be updating the image element frequently, so let's cache it here.\r\n var imageElement = {\r\n element: element.find('.image-display'),\r\n // The initial x and y coordinates will hold the offset for the image before any drag or zoom events occur. Once a touch event is released,\r\n // these values will get updated with the new position, but during a drag, they won't be updated.\r\n initialXCoordinate: 0,\r\n initialYCoordinate: 0,\r\n minOffsetX: 0,\r\n maxOffsetX: 0,\r\n\t minOffsetY: 0,\r\n maxOffsetY: 0,\r\n initScale: 1,\r\n transform: {}\r\n };\r\n\r\n var fullscreenImageElement = {\r\n element: element.find('.fullscreen-image-display'),\r\n // The initial x and y coordinates will hold the offset for the image before any drag or zoom events occur. Once a touch event is released,\r\n // these values will get updated with the new position, but during a drag, they won't be updated.\r\n initialXCoordinate: 0,\r\n initialYCoordinate: 0,\r\n minOffsetX: 0,\r\n maxOffsetX: 0,\r\n\t minOffsetY: 0,\r\n maxOffsetY: 0,\r\n initScale: 1,\r\n transform: {}\r\n };\r\n\r\n scope.loadingImage = true;\r\n\r\n var imageDataWatch = scope.$watch('imageData', function () {\r\n if (scope.imageData) {\r\n scope.loadingImage = false;\r\n\r\n if (scope.pageCount > 1) {\r\n var footerHeight = element.find('.image-footer').height();\r\n\r\n element.find('.image-container').css('padding-bottom', footerHeight);\r\n element.find('.image-container').css('margin-bottom', -1 * footerHeight);\r\n }\r\n\r\n resetElement(imageElement);\r\n resetElement(fullscreenImageElement);\r\n }\r\n });\r\n\r\n function resetElement(element) {\r\n element.element.className = 'animate';\r\n element.initScale = 1;\r\n element.initialXCoordinate = 0;\r\n element.initialYCoordinate = 0;\r\n element.transform = {\r\n translate: { x: element.initialXCoordinate, y: element.initialYCoordinate },\r\n scale: 1,\r\n };\r\n requestElementUpdate(element);\r\n }\r\n\r\n function updateElementTransform(element) {\r\n var value = [\r\n // Even though we're only translating in 2 dimensions, we want to continue using the translate3D function. The browsers in\r\n // Android and iOS use GPU acceleration for the 3D transforms but not for 2D ones, so translate3D ends up being more performant\r\n // than just calling translate. Run http://jsperf.com/translate3d-vs-xy/28 to verify.\r\n 'translate3d(' + element.transform.translate.x + 'px, ' + element.transform.translate.y + 'px, 0)',\r\n 'scale(' + element.transform.scale + ', ' + element.transform.scale + ')'\r\n ];\r\n\r\n value = value.join(' ');\r\n element.element.css('webkit-transform', value);\r\n element.element.css('transform', value);\r\n element.element.css('moz-transform', value);\r\n }\r\n\r\n function requestElementUpdate(element) {\r\n updateElementTransform(element);\r\n }\r\n\r\n scope.onPinch = function (ev) {\r\n pinch(imageElement, ev);\r\n };\r\n\r\n scope.onFsPinch = function (ev) {\r\n pinch(fullscreenImageElement, ev);\r\n };\r\n\r\n function pinch(element, ev) {\r\n element.element.className = '';\r\n\r\n element.transform.scale = Math.max(element.initScale * ev.scale, 1);\r\n\r\n requestElementUpdate(element);\r\n }\r\n\r\n scope.onRelease = function (ev) {\r\n if (ev) {\r\n release(imageElement);\r\n }\r\n };\r\n \r\n scope.onFsRelease = function(ev){\r\n if(ev){\r\n release(fullscreenImageElement);\r\n }\r\n };\r\n \r\n function release(element){\r\n element.initScale = element.transform.scale;\r\n element.initialXCoordinate = element.transform.translate.x;\r\n element.initialYCoordinate = element.transform.translate.y;\r\n\r\n element.minOffsetX = -1 * (element.element.width() * ((element.transform.scale - 1) / 2));\r\n element.maxOffsetX = element.minOffsetX + (element.element.width() * (element.transform.scale - 1));\r\n element.minOffsetY = -1 * (element.element.height() * ((element.transform.scale - 1) / 2));\r\n element.maxOffsetY = element.minOffsetY + (element.element.height() * (element.transform.scale - 1));\r\n\r\n snapToContainer(element);\r\n }\r\n\r\n function snapToContainer(element) {\r\n element.transform.translate.x = element.initialXCoordinate = Math.min(Math.max(element.transform.translate.x, element.minOffsetX), element.maxOffsetX);\r\n element.transform.translate.y = element.initialYCoordinate = Math.min(Math.max(element.transform.translate.y, element.minOffsetY), element.maxOffsetY);\r\n\r\n requestElementUpdate(element);\r\n }\r\n\r\n scope.onTap = function () {\r\n resetElement(imageElement);\r\n };\r\n \r\n scope.onFsTap = function(){\r\n resetElement(fullscreenImageElement);\r\n };\r\n\r\n scope.moveToPage = function () {\r\n scope.loadingImage = true;\r\n\r\n scope.loadPage({ page: scope.currentPage });\r\n };\r\n\r\n function touchHandlerDummy(e) {\r\n e.preventDefault();\r\n return false;\r\n }\r\n\r\n imageElement.element.get(0).addEventListener('touchstart', touchHandlerDummy, false);\r\n imageElement.element.get(0).addEventListener('touchmove', touchHandlerDummy);\r\n imageElement.element.get(0).addEventListener('touchend', touchHandlerDummy);\r\n \r\n fullscreenImageElement.element.get(0).addEventListener('touchstart', touchHandlerDummy, false);\r\n fullscreenImageElement.element.get(0).addEventListener('touchmove', touchHandlerDummy);\r\n fullscreenImageElement.element.get(0).addEventListener('touchend', touchHandlerDummy);\r\n\r\n scope.onDrag = function (ev) {\r\n drag(imageElement, ev);\r\n };\r\n \r\n scope.onFsDrag = function (ev){\r\n drag(fullscreenImageElement, ev);\r\n };\r\n \r\n function drag(element, ev){\r\n element.element.className = '';\r\n\r\n var targetX = element.initialXCoordinate + ev.deltaX;\r\n var targetY = element.initialYCoordinate + ev.deltaY;\r\n\r\n element.transform.translate.x = targetX;\r\n element.transform.translate.y = targetY;\r\n\r\n requestElementUpdate(element);\r\n }\r\n \r\n scope.onSwipe = function(ev){\r\n swipe(ev);\r\n };\r\n \r\n scope.onFsSwipe = function(ev){\r\n swipe(ev);\r\n };\r\n \r\n function swipe(evt){\r\n if(Math.abs(evt.deltaX) > Math.abs(evt.deltaY)){\r\n if(evt.deltaX > 0 && scope.currentPage > 1){\r\n scope.currentPage--;\r\n scope.moveToPage();\r\n }\r\n else if(evt.deltaX < 0 && scope.currentPage < scope.pageCount){\r\n scope.currentPage++;\r\n scope.moveToPage();\r\n }\r\n }\r\n }\r\n\r\n scope.$on('$destroy', function () {\r\n imageDataWatch();\r\n });\r\n }\r\n };\r\n }]);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').directive('apIncludeReplace', [\r\n apIncludeReplace,\r\n ]);\r\n\r\n function apIncludeReplace(\r\n ) {\r\n //ng-include places the included content inside of a div. Sometimes this affects styling.\r\n //This directive simply replaces the div with the contents of the div, effectively making ng-include\r\n //render the content inline instead of inside of a new div.\r\n\r\n var directive = {\r\n require: 'ngInclude',\r\n restrict: 'A',\r\n link: link,\r\n };\r\n\r\n return directive;\r\n\r\n function link(\r\n scope,\r\n el\r\n ) {\r\n // This used to be el.children(), but i changed it to el.contents()\r\n // because that is what ngInclude is $compile()-ing.\r\n // The difference is that contents() also includes text and comment nodes, and children() does not.\r\n el.replaceWith(el.contents());\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-core-ui').directive('apKeyboardSpace',\r\n ['Bridge', 'DeviceSettings',\r\n function (Bridge, DeviceSettings) {\r\n 'use strict';\r\n\r\n var keyboardHeight=0;\r\n\r\n return {\r\n restrict: 'EA',\r\n link: function ($scope) {\r\n Bridge.on('keyboard-open', $scope, function (data) {\r\n //Native is focused\r\n if (document.activeElement.tagName.toUpperCase()==='BODY') {\r\n if (DeviceSettings.isPhone) {\r\n //the height of the menu on the bottom is 48px on phones\r\n keyboardHeight = data.KeyboardHeight - 48;\r\n }\r\n else {\r\n keyboardHeight = data.KeyboardHeight;\r\n }\r\n document.getElementById('keyboardspace').style.height = keyboardHeight + 'px';\r\n $scope.$broadcast('keyboard-opened', {\r\n keyboardHeight: keyboardHeight\r\n });\r\n }\r\n else { //webview is focused\r\n if (DeviceSettings.isIos) {\r\n $scope.$broadcast('keyboard-focus');\r\n }\r\n }\r\n });\r\n\r\n Bridge.on('keyboard-close', $scope, function () {\r\n document.getElementById('keyboardspace').style.height = '0px';\r\n $scope.$broadcast('keyboard-closed');\r\n });\r\n },\r\n template: '<div id=\"keyboardspace\"></div>'\r\n };\r\n }]);","angular.module('aprima-core-ui').directive('apMediaPicker', ['_', 'MediaService', function (_, MediaService) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n templateUrl: '/core-ui/views/directives/apMediaPicker.html',\r\n scope: {\r\n image: '=ngModel',\r\n onPicked: '&',\r\n pickerDescription: '@'\r\n },\r\n link: function (scope) {\r\n scope.pickImage = function () {\r\n MediaService.getMedia(scope, scope.pickerDescription, function (media, fileName, extension) {\r\n scope.image = media;\r\n scope.onPicked(media, fileName, extension);\r\n });\r\n };\r\n }\r\n };\r\n}]);\r\n","angular.module('aprima-core-ui')\r\n .directive('apMessageIcon', [function () {\r\n 'use strict';\r\n\r\n function getMessageTypeIconName(messageTypeId, messageSubTypeId) {\r\n var messageType = 'message';\r\n\r\n messageTypeId = messageTypeId || '';\r\n messageSubTypeId = messageSubTypeId || '';\r\n\r\n switch (messageTypeId.toUpperCase()) {\r\n\r\n //phone\r\n case '10101010-0000-0000-0000-000000000003':\r\n messageType = 'phone';\r\n break;\r\n\r\n //Electronic Rx Errors\r\n case '10101010-0000-0000-0000-000000000004':\r\n //Electronic Rx Benefits Errors\r\n case '10101010-0000-0000-0000-000000000014':\r\n //Electronic Rx Refill Request\r\n case 'D7716F70-61D6-4EC0-8BA6-01AFC95E99F2':\r\n //Rx Refill\r\n case 'A2B88BC2-E7C8-4990-92F6-AE28B5C0DC77':\r\n messageType = 'rx';\r\n break;\r\n\r\n //Patient Lab Order\r\n case '77882A75-7C9D-430B-9DA6-F8ED12058DDB':\r\n //Service Order Approval\r\n case '10101010-0000-0000-0000-000000000008':\r\n messageType = 'lab';\r\n break;\r\n }\r\n\r\n switch (messageSubTypeId.toUpperCase()) {\r\n //Task - Lab Alert\r\n case 'CEC2B936-B5BB-49F7-B4D0-39553FEF64D1':\r\n messageType = 'lab';\r\n break;\r\n\r\n //Patient Input - Patient Rx Refill Request\r\n case 'B1B7D286-1FB2-43D0-A883-7946B1CD8751':\r\n messageType = 'rx';\r\n break;\r\n }\r\n\r\n return messageType;\r\n }\r\n\r\n function getMessageTypeId(message) {\r\n return message.TypeId || message.MessageTypeId ||\r\n (message.MessageType != null ? message.MessageType.Id : null);\r\n }\r\n\r\n function getMessageSubTypeId(message) {\r\n return message.SubTypeId || message.MessageSubTypeId ||\r\n (message.MessageSubType != null ? message.MessageSubType.Id : null);\r\n }\r\n\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n message: '='\r\n },\r\n templateUrl: '/core-ui/views/directives/apMessageIcon.html',\r\n link: function (scope) {\r\n var typeId = getMessageTypeId(scope.message),\r\n subTypeId = getMessageSubTypeId(scope.message),\r\n messageType = getMessageTypeIconName(typeId, subTypeId),\r\n state = 'incomplete';\r\n\r\n if (scope.message.Urgency && scope.message.Urgency.toLowerCase() === 'urgent') {\r\n state = 'urgent';\r\n } else if (scope.message.Status && scope.message.Status.toLowerCase() === 'complete') {\r\n state = 'complete';\r\n }\r\n else {\r\n state = 'incomplete';\r\n }\r\n\r\n scope.iconName = messageType + '-' + state;\r\n }\r\n };\r\n }]);\r\n","(function() {\r\n 'use strict';\r\n angular.module('aprima-core-ui').directive('apMessageNewNote', [\r\n function() {\r\n return {\r\n restrict: 'E',\r\n bindToController: true,\r\n controller: [\r\n 'ListService',\r\n apMessageNewNote\r\n ],\r\n controllerAs: 'vm',\r\n scope: {\r\n generalNoteTypeId: '=?',\r\n message: '=',\r\n newNote: '=',\r\n },\r\n templateUrl: '/core-ui/views/directives/apMessageNewNote.html',\r\n };\r\n\r\n function apMessageNewNote(ListService) {\r\n /*jshint validthis: true */\r\n var vm = this;\r\n\r\n vm.generalNotes = [];\r\n vm.selectedNote = {};\r\n\r\n vm.addHttpError = angular.noop;\r\n vm.removeHttpError = angular.noop;\r\n vm.selectedNoteChanged = selectedNoteChanged;\r\n\r\n activate();\r\n\r\n function activate() {\r\n if (vm.generalNoteTypeId) {\r\n var listsToLoad = {\r\n generalNotes: 'generalnotes/' + vm.generalNoteTypeId,\r\n };\r\n ListService.getLists(listsToLoad, vm);\r\n }\r\n }\r\n\r\n function selectedNoteChanged() {\r\n vm.newNote = vm.selectedNote;\r\n }\r\n }\r\n }\r\n ]);\r\n})();","angular.module('aprima-core-ui').directive('apMessageNotes', ['$sce', '_', function ($sce, _) {\r\n 'use strict';\r\n\r\n return {\r\n scope: {\r\n message: '=',\r\n messageNotes: '=',\r\n },\r\n templateUrl: '/core-ui/views/directives/apMessageNotes.html',\r\n link: link,\r\n };\r\n\r\n function link(scope) {\r\n if (scope.messageNotes) {\r\n watchMessageNotes(scope);\r\n }\r\n }\r\n\r\n function watchMessageNotes(scope) {\r\n var dereg = scope.$watchCollection('messageNotes', function(newNotes) {\r\n _.forEach(newNotes, function (val) {\r\n // PRM shows the CreatedDate, but older servers only provided LastModificationDate.\r\n val.DisplayDate = val.CreatedDate ? val.CreatedDate : cal.LastModificationDate;\r\n val.NoteAsHtml = $sce.trustAsHtml(val.Note);\r\n });\r\n });\r\n\r\n scope.$on('$destroy', dereg);\r\n }\r\n}]);","angular.module('aprima-core-ui').directive('apMessageStatus', [function () {\r\n 'use strict';\r\n\r\n return {\r\n scope: {\r\n message: '='\r\n },\r\n templateUrl: '/core-ui/views/directives/apMessageStatus.html',\r\n link: function () {\r\n\r\n }\r\n };\r\n\r\n}]);","angular.module('aprima-core-ui')\r\n .directive('apPatientContextMenu', ['$rootScope', function ($rootScope) {\r\n 'use strict';\r\n\r\n $rootScope.setOptsForPatientContextMenu = function setOptsForPatientContextMenu(opts) {\r\n $rootScope.$emit('select-patient', opts);\r\n };\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n templateUrl: '/core-ui/views/directives/apPatientContextMenu.html',\r\n controller: 'apPatientContextMenuCtrl'\r\n };\r\n }]);\r\n\r\nangular.module('aprima-core-ui')\r\n .controller('apPatientContextMenuCtrl',\r\n ['$scope', '$rootScope', 'apConfirm', 'aprgettext', 'ChargeCaptureRepository','TransitionManager',\r\n 'toaster', 'ExternalPatientsRepository', 'LocalStorageRepository', 'SecurityRepository', 'Permissions', 'ClientInfoRepository',\r\n function ($scope, $rootScope, apConfirm, gettext, ChargeCaptureRepository, TransitionManager,\r\n toaster, ExternalPatientsRepository, LocalStorageRepository, SecurityRepository, Permissions, ClientInfoRepository) {\r\n 'use strict';\r\n\r\n function setup() {\r\n if(!$scope.patient) {\r\n return;\r\n }\r\n\r\n $scope.isFndEnabled = ClientInfoRepository.isFndEnabled();\r\n\r\n SecurityRepository.getPermissions(Permissions.Schedule)\r\n .then(function(permission) {\r\n $scope.schedulePermissionAllowed = permission && permission.IsAllowed;\r\n })\r\n .catch(function() {\r\n $scope.schedulePermissionAllowed = false;\r\n });\r\n\r\n $scope.defaultServiceSiteId = LocalStorageRepository.getDefaultServiceSiteId();\r\n\r\n $scope.erxEnabled = LocalStorageRepository.getIsERxEnabled();\r\n\r\n var settings = LocalStorageRepository.getDashboardTileSettings();\r\n\r\n $scope.tiles = settings && settings.Tiles ? settings.Tiles : [];\r\n\r\n $scope.chargeCaptureOptions = {\r\n patientId: $scope.patientId || ($scope.patient && $scope.patient.Id)\r\n };\r\n\r\n if ($scope.serviceSiteId) {\r\n $scope.chargeCaptureOptions.serviceSiteId = $scope.serviceSiteId;\r\n }\r\n\r\n if ($scope.chargeCaptureId) {\r\n $scope.chargeCaptureOptions.chargeCaptureId = $scope.chargeCaptureId;\r\n }\r\n }\r\n\r\n var deregister = $rootScope.$on('select-patient', function(evt, obj) {\r\n $scope.patient = obj && obj.patient;\r\n $scope.patientDashboardConfigurations = obj && obj.patientDashboardConfigurations;\r\n $scope.serviceSiteId = obj && obj.serviceSiteId;\r\n $scope.chargeCaptureId = obj && obj.chargeCaptureId;\r\n $scope.hospitalRoundId = obj && obj.hospitalRoundId;\r\n $scope.dischargeExternalPatient = obj && obj.dischargeExternalPatient;\r\n $scope.dashboardConfigurations = LocalStorageRepository.getPatientDashboardConfigurations('all');\r\n setup();\r\n });\r\n\r\n $scope.$on('$destroy', function() {\r\n deregister();\r\n });\r\n\r\n $scope.dischargePatient = function dischargePatient() {\r\n if (!$scope.dischargeExternalPatient) {\r\n return;\r\n }\r\n\r\n $scope.dischargingPatient = true;\r\n\r\n ExternalPatientsRepository.dischargePatient($scope.hospitalRoundId)\r\n .then(function (externalPatient) {\r\n $rootScope.$broadcast('ext-patient-discharged', externalPatient);\r\n }, function (err) {\r\n $rootScope.tryToastModelStateError(err);\r\n })\r\n .finally(function () {\r\n $rootScope.$broadcast('close-context-menu');\r\n $scope.dischargingPatient = false;\r\n });\r\n };\r\n\r\n $scope.removeChargeCapture = function removeChargeCapture() {\r\n $scope.removingChargeCapture = true;\r\n\r\n apConfirm('Are you sure you want to remove the eMDs Round for ' + ($scope.patient.name || 'this patient') + '?', 'Yes', 'No')\r\n .then(function(result) {\r\n if (result) {\r\n ChargeCaptureRepository.removeChargeCapture($scope.chargeCaptureOptions.chargeCaptureId)\r\n .then(function (result) {\r\n if (result.IsSuccess) {\r\n toaster.pop('success', '', gettext('eMDs Round removed successfully.'));\r\n $rootScope.$broadcast('charge-capture-tile-remove', $scope.chargeCaptureOptions);\r\n } else {\r\n toaster.pop('error', '', gettext('Failed to remove eMDs Round.'));\r\n }\r\n })\r\n .catch(function () {\r\n toaster.pop('error', '', gettext('An exception occurred while attempting to remove eMDs Round.'));\r\n });\r\n }\r\n })\r\n .finally(function () {\r\n $rootScope.$broadcast('close-context-menu');\r\n $scope.removingChargeCapture = false;\r\n });\r\n };\r\n\r\n $scope.navigateToDashboard = function(data){\r\n TransitionManager.transition({\r\n appRoute: 'patientDashboard',\r\n opts: {id: $scope.patient.Id, configId: data},\r\n });\r\n };\r\n }]);","angular.module('aprima-core-ui').directive('apPdf', [\r\n function apPdf() {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n link: function(scope, element, attrs) {\r\n var data = scope.$eval(attrs.src);\r\n element.replaceWith('<object type=\"application/pdf\" data=\"' + data + '\" width=\"100%\" height=\"800\"></object>');\r\n }\r\n };\r\n }]);","angular.module('aprima-core-ui').directive('apPharmacyAddress',\r\n ['DeviceSettings','$window',\r\n function (DeviceSettings, $window) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E', \r\n scope: {\r\n address: '='\r\n },\r\n templateUrl: '/core-ui/views/directives/apPharmacyAddress.html',\r\n link: function($scope) {\r\n\r\n $scope.openGMap = function () {\r\n if(DeviceSettings.isPrm)\r\n { \r\n $window.open('https://maps.google.com/maps?q='+$scope.address.Address1+' '+$scope.address.City+', '+$scope.address.State+' '+$scope.address.Zip, '_blank'); \r\n } \r\n }; \r\n \r\n },\r\n \r\n };\r\n }]);","angular.module('aprima-core-ui').directive('apSaveToFile',\r\n ['BrowserService', '_',\r\n function (BrowserService, _) {\r\n 'use strict';\r\n\r\n function link($scope, element) {\r\n\r\n var imageFormats = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pdf', 'rtf', 'doc', 'docx', 'tif', 'tiff'];\r\n var htmlFormats = ['html', 'htm', 'xml'];\r\n var textFormats = ['txt'];\r\n var pdfFormat = ['pdf'];\r\n\r\n function _saveAsFile(fileNameToSaveAs, base64String, contentType) {\r\n BrowserService.downloadDocumentToFile(fileNameToSaveAs, base64String, contentType, document);\r\n }\r\n\r\n function _onClick() {\r\n $scope.loadText()\r\n .then(function (attachment) {\r\n if (attachment) {\r\n\r\n $scope.attachment = attachment;\r\n $scope.attachment.attachmentData = attachment.Data;\r\n\r\n $scope.isPdf = _.includes(pdfFormat, attachment.Extension);\r\n $scope.isImage = _.includes(imageFormats, attachment.Extension);\r\n $scope.isHtml = _.includes(htmlFormats, attachment.Extension);\r\n $scope.isText = _.includes(textFormats, attachment.Extension);\r\n\r\n var fileName = $scope.fileName || attachment.FileName;\r\n\r\n if($scope.isPdf){\r\n _saveAsFile(fileName + '.pdf', $scope.attachment.attachmentData, 'application/pdf');\r\n }\r\n else if($scope.isImage) {\r\n _saveAsFile(fileName + '.' + attachment.Extension, $scope.attachment.attachmentData, 'image/' + attachment.Extension);\r\n }\r\n else if($scope.isHtml) {\r\n _saveAsFile(fileName + '.html', $scope.attachment.attachmentData, 'text/html; charset=utf-8');\r\n }\r\n else if($scope.isText) {\r\n _saveAsFile(fileName + '.txt', $scope.attachment.attachmentData, 'text/html; charset=utf-8');\r\n }\r\n }\r\n });\r\n }\r\n\r\n element.on('click', _onClick);\r\n $scope.$on('$destroy', function () {\r\n element.off('click');\r\n });\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n loadText: '&apSaveToFile',\r\n fileName: '@'\r\n },\r\n link: link\r\n };\r\n }]);","angular.module('aprima-core-ui').directive('apScrollableList', ['$timeout', function ($timeout) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function (scope, $elem, attrs) {\r\n var elem = $elem[0];\r\n $elem.addClass('ap-scrollable');\r\n\r\n $timeout(function() {\r\n var listItemHeight = $elem.children(':last').outerHeight(true) || 40;\r\n var listItemWindowSize = scope.$eval(attrs.apScrollableList) || 5;\r\n $elem.css('max-height', listItemHeight * listItemWindowSize + 'px');\r\n });\r\n\r\n if(scope.$eval(attrs.scrollTopOnChange) && MutationObserver) {\r\n var observer = new MutationObserver(function() {\r\n //if scrollTop is not 0, then scroll to the top of list\r\n if(elem.scrollTop) {\r\n $elem.scrollTop(0);\r\n }\r\n });\r\n observer.observe(elem, { childList: true });\r\n\r\n scope.$on('$destroy', function () {\r\n observer.disconnect();\r\n });\r\n }\r\n }\r\n };\r\n}]);","// this will scroll the input element to the top of the page when you type in, so you can see more of the results\r\n// that would most likely be under it for a typeahead\r\nangular.module('aprima-core-ui').directive('apScrollOnInput', [function () {\r\n 'use strict';\r\n \r\n return {\r\n restrict: 'A',\r\n link: function($scope, element, attr){\r\n var topOffset = 0;\r\n \r\n function scroll(){\r\n var offset = element.parent().offset();\r\n window.scrollTo(offset.left, offset.top - topOffset);\r\n }\r\n \r\n if(attr.scrollTopOffset){\r\n topOffset = parseInt(attr.scrollTopOffset);\r\n }\r\n \r\n element.on('input', scroll);\r\n \r\n $scope.$on('$destroy', function(){\r\n element.off('input', scroll); \r\n });\r\n } \r\n };\r\n }]);\r\n","//I tried lots of things. ideally, we would just extend the <select /> element and not require any changes to the markup,\r\n//but was unable to get to this. Instead, any <select /> needs to be wrapped in an <ap-select> element.\r\n\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').directive('apSelect', [\r\n ApSelect,\r\n ]);\r\n\r\n function ApSelect(\r\n ) {\r\n var directive = {\r\n restrict: 'E',\r\n transclude: true,\r\n templateUrl: '/core-ui/views/directives/apSelect.html',\r\n link: ApSelectLink,\r\n };\r\n\r\n return directive;\r\n\r\n function ApSelectLink(\r\n scope,\r\n element\r\n ) {\r\n // this logic is necessary to handle the fact that the chevron isn't an 'input-group-addon' anymore,\r\n // so in the cases where there is no other 'input-group-addon' or 'input-group-btn', we don't want to add the\r\n // 'input-group' class, or things will look weird\r\n // Because of this, I took the 'input-group' class off of the template for this directive\r\n var isInputGroup = element.find('.input-group-btn,.input-group-addon').length;\r\n if(isInputGroup) {\r\n var child = element.children();\r\n if(child) {\r\n child.addClass('input-group');\r\n }\r\n }\r\n\r\n var $select = element.find('select');\r\n\r\n\r\n if (!$select.hasClass('native')) {\r\n addCustomDropdownChevron();\r\n }\r\n\r\n function addCustomDropdownChevron() {\r\n $select.parent().addClass('has-feedback');\r\n var icon = angular.element('<span class=\"form-control-feedback\"><span class=\"ap-chevron-down-gray\"></span></span>');\r\n\r\n $select.before(icon);\r\n }\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-core-ui')\r\n .directive('apSpinner', function () {\r\n return {\r\n restrict: 'E',\r\n controller: '$ionicSpinner',\r\n link: function ($scope, $element, $attrs, ctrl) {\r\n var spinnerName = ctrl.init();\r\n var size = $attrs.size || '1';\r\n $element.addClass('spinner spinner-' + spinnerName + ' spinner-' + size + 'x');\r\n }\r\n };\r\n });\r\n\r\n angular.module('aprima-core-ui')\r\n .controller('$ionicSpinner', [\r\n '$element',\r\n '$attrs',\r\n 'SpinnerService',\r\n function ($element, $attrs, SpinnerService) {\r\n var spinnerName, spinnerHtml;\r\n\r\n this.init = function () {\r\n var spinnerConfiguration = SpinnerService.getSpinner($attrs.icon);\r\n spinnerName = spinnerConfiguration.name;\r\n spinnerHtml = spinnerConfiguration.html;\r\n\r\n // Specifically for animations to work,\r\n // Android 4.3 and below requires the element to be\r\n // added as an html string, rather than dynmically\r\n // building up the svg element and appending it.\r\n $element.html(spinnerHtml);\r\n\r\n this.start();\r\n\r\n return spinnerName;\r\n };\r\n\r\n this.start = function () {\r\n SpinnerService.startSpinner($element[0], spinnerName);\r\n };\r\n\r\n }]);\r\n})(window.angular);","angular.module('aprima-core-ui').directive('apSsnField', ['apSsnFilterFilter', function (apSsnFilter) {\r\n 'use strict';\r\n return {\r\n require: 'ngModel',\r\n link: function (scope, element, attr, ctrl) {\r\n ctrl.$parsers.push(function (inputValue) {\r\n var transformedInput = apSsnFilter(inputValue);\r\n if (transformedInput !== inputValue) {\r\n ctrl.$setViewValue(transformedInput);\r\n ctrl.$render();\r\n }\r\n return transformedInput;\r\n });\r\n }};\r\n}]);\r\n","angular.module('aprima-core-ui').directive('apSwipeable', ['$window', '$timeout', 'Bridge', '_', 'ScrollerService', 'NgZoneService',\r\n function ($window, $timeout, Bridge, _, ScrollerService, NgZoneService) {\r\n 'use strict';\r\n var Hammer = $window.Hammer;\r\n var MutationObserver = $window.MutationObserver || $window.WebKitMutationObserver || $window.MozMutationObserver;\r\n\r\n return {\r\n restrict: 'E',//could change to allow attribute as well\r\n scope: {\r\n currentPane: '=?',\r\n paneChanged: '&',\r\n //lastHeader true is for controls that have headers that are just on the right side or full screen\r\n useLastHeader: '&',\r\n scrollerId: '@',\r\n autoResize: '@',\r\n scrollDiv: '@'\r\n },\r\n transclude: true,\r\n template: '<div><div ap-swipeable-container ng-transclude></div></div>',\r\n link: link,\r\n };\r\n\r\n // This is wrapped to run outside of the Angular zone, because of all of the Hammer and MutationObserver\r\n // stuff it's doing, that doesn't need to happen inside of the Angular zone.\r\n // It should have a noticeable performance difference when inside of an UpgradeComponent.\r\n function link(scope, elem) {\r\n var result = NgZoneService.contextRun(function (zoneAwareObject) {\r\n return zoneAwareLink(scope, elem, zoneAwareObject);\r\n });\r\n return result;\r\n }\r\n\r\n // This zoneAwareObject always needs to be the last parameter to this function.\r\n function zoneAwareLink(scope, elem, zoneAwareObject) {\r\n scope.currentPane = scope.currentPane || 0;\r\n var $wrapper = elem.children().first(),\r\n wrapper = $wrapper.get(0),\r\n container = $wrapper.children().first(),\r\n paneCount,\r\n hammer = new Hammer(container.get(0)),\r\n initialSetup = true,\r\n scroller = $window,\r\n scrollDiv = $(scope.scrollDiv);\r\n\r\n //MutationObserver not supported until IE 11 and later, but Android and iOS are okay\r\n var observer = new MutationObserver(function(mutations) {\r\n var panesChanged = _.some(mutations, function(mutation) {\r\n return mutation.type === 'childList' && (mutation.addedNodes.length || mutation.removedNodes.length);\r\n });\r\n if(panesChanged) {\r\n updatePanes();\r\n }\r\n });\r\n\r\n //Add listeners for when Panes are added or Widths need to be resized\r\n observer.observe(container.get(0), { childList: true });\r\n\r\n scope.$evalAsync(function () {\r\n //the easyScroller won't be accessible in the dom until this point\r\n scroller = ScrollerService.getScroller(scope.scrollerId) || $window;\r\n });\r\n\r\n //Update the size of the container and\r\n //potentially show a different pane as well when the number of panes changes\r\n function updatePanes () {\r\n var panes = getPanes();\r\n if(panes && panes.length) {\r\n var newPane = scope.currentPane >= panes.length ? panes.length - 1 : scope.currentPane;\r\n setup(panes, newPane);\r\n }\r\n }\r\n\r\n var eventsEnabled;\r\n var enableEventsOnce = _.once(function () {\r\n hammer.on('panend panleft panright swipeleft swiperight', handleHammer);\r\n\r\n if(scrollDiv && scrollDiv.length === 1){\r\n hammer.on('panup pandown', handleHammer);\r\n }\r\n\r\n eventsEnabled = true;\r\n });\r\n\r\n function setup(panes, index) {\r\n paneCount = panes.length;\r\n if(paneCount) {\r\n panes.width((1/paneCount)*100 + '%');\r\n container.width(100 * paneCount + '%');\r\n }\r\n\r\n showPane(index);\r\n\r\n enableEventsOnce();\r\n initialSetup = false;\r\n }\r\n\r\n function getPanes() {\r\n return container.children();\r\n }\r\n\r\n function showPane(index, animate) {\r\n var changingPane = index !== scope.currentPane;\r\n\r\n // these hammer events are outside of angular so we need to $apply() scope changes\r\n // update the currentPane first with $apply\r\n zoneAwareObject.runInZoneIfNecessary(function() {\r\n scope.$apply(function () {\r\n scope.currentPane = index;\r\n });\r\n });\r\n\r\n var offset = -((100/paneCount)*scope.currentPane);\r\n updateContainer(offset, animate);\r\n\r\n if(scope.autoResize){\r\n var panes = getPanes();\r\n\r\n // TODO make sure current pane in panes\r\n if(panes && panes.length > 0){\r\n var currentPane = panes[scope.currentPane];\r\n var targetHeight = $(currentPane).height();\r\n\r\n $wrapper.height(targetHeight);\r\n }\r\n }\r\n\r\n if(changingPane || initialSetup) {\r\n //if easyScroller is already scrolling,\r\n //then using true for animate in scrollTo, will cause easyScroller to not scroll at all\r\n if(!scope.scrollDiv){\r\n scroller.scrollTo(0, 0, false);\r\n }\r\n Bridge.updatePageIndicator(paneCount, scope.currentPane, scope.useLastHeader());\r\n\r\n // these hammer events are outside of angular so we need to $apply() scope changes\r\n // then $apply the change function for currentPane after currentPane\r\n // was $apply-ed so that it is already updated in parent scope\r\n zoneAwareObject.runInZoneIfNecessary(function() {\r\n scope.$apply(function () {\r\n scope.paneChanged({\r\n pane: scope.currentPane,\r\n adjacentPanes: getAdjacentPanes(scope.currentPane)\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n function updateContainer(percent, animate) {\r\n container.removeClass('animate');\r\n\r\n if (animate) {\r\n container.addClass('animate');\r\n }\r\n container.css('webkit-transform', 'translate3d(' + percent + '%,0,0)');\r\n container.css('transform', 'translate3d(' + percent + '%,0,0)');\r\n container.css('moz-transform', 'translate3d(' + percent + '%,0,0)');\r\n }\r\n\r\n function getAdjacentPanes(index) {\r\n var adjacentPanes = [];\r\n var next = index + 1,\r\n prev = index - 1;\r\n if(prev >= 0) {\r\n adjacentPanes.push(prev);\r\n }\r\n if(next <= paneCount - 1) {\r\n adjacentPanes.push(next);\r\n }\r\n return adjacentPanes;\r\n }\r\n\r\n function next() {\r\n var newPane = scope.currentPane + 1;\r\n return showPane(newPane < paneCount ? newPane : paneCount-1, true);\r\n }\r\n\r\n function prev() {\r\n var newPane = scope.currentPane - 1;\r\n return showPane(newPane >= 0 ? newPane : 0, true);\r\n }\r\n\r\n var scrollStart = 0;\r\n function handleHammer(ev) {\r\n // disable browser scrolling\r\n ev.preventDefault();\r\n\r\n switch (ev.type) {\r\n case 'panright':\r\n case 'panleft':\r\n // keep the offset attached to the pan location\r\n var paneOffset = -(100/paneCount)*scope.currentPane;\r\n var dragOffset = ((100/wrapper.clientWidth)*ev.deltaX) / paneCount;\r\n\r\n // slow down at the first and last pane\r\n if((scope.currentPane === 0 && ev.direction === Hammer.DIRECTION_RIGHT) ||\r\n (scope.currentPane === paneCount-1 && ev.direction === Hammer.DIRECTION_LEFT)) {\r\n dragOffset *= 0.4;\r\n }\r\n\r\n updateContainer(dragOffset + paneOffset);\r\n\r\n if(scope.autoResize){\r\n var panes = getPanes();\r\n //default to the current height;\r\n var targetHeight = $(panes[scope.currentPane]).height();\r\n var nextPaneHeight;\r\n\r\n if(scope.currentPane !== 0 && ev.direction === Hammer.DIRECTION_RIGHT){\r\n nextPaneHeight = $(panes[scope.currentPane - 1]).height();\r\n }\r\n else if(scope.currentPane !== paneCount -1 && ev.direction === Hammer.DIRECTION_LEFT){\r\n nextPaneHeight = $(panes[scope.currentPane + 1]).height();\r\n }\r\n\r\n if(nextPaneHeight){\r\n var heightDifference = nextPaneHeight - targetHeight;\r\n targetHeight = targetHeight + (heightDifference * Math.abs(ev.deltaX)/wrapper.clientWidth);\r\n }\r\n\r\n $wrapper.height(targetHeight);\r\n }\r\n\r\n break;\r\n case 'panup':\r\n case 'pandown':\r\n if(scrollDiv && scrollDiv.length === 1 && ev.deltaY){\r\n if(!scrollStart){\r\n scrollStart = scrollDiv[0].scrollTop;\r\n }\r\n\r\n scrollDiv[0].scrollTop = Math.max(0, scrollStart - ev.deltaY);\r\n }\r\n\r\n break;\r\n case 'swipeleft':\r\n next();\r\n\r\n // stop hammer recognizer so that way it won't trigger a panend as well\r\n // which would change the pane again\r\n // causing it to potentially jump 2 panes at a time\r\n // ('swipeleft' and 'panend' could cause .next() to\r\n // be called twice in the same session)\r\n hammer.stop(true);\r\n break;\r\n case 'swiperight':\r\n prev();\r\n\r\n // stop hammer recognizer so that way it won't trigger a panend as well\r\n // which would change the pane again\r\n // causing it to potentially jump 2 panes at a time\r\n // ('swiperight' and 'panend' could cause .prev() to\r\n // be called twice in the same session)\r\n hammer.stop(true);\r\n break;\r\n case 'panend':\r\n // more than half the pane panned over, then navigate\r\n if (Math.abs(ev.deltaX) > wrapper.clientWidth / 2) {\r\n // if deltaX is >= 0 then the pan was to the right\r\n if(ev.deltaX >= 0) {\r\n prev();\r\n }\r\n else {\r\n next();\r\n }\r\n }\r\n else {\r\n showPane(scope.currentPane, true);\r\n }\r\n scrollStart = null;\r\n break;\r\n }\r\n }\r\n\r\n scope.$on('$destroy', function () {\r\n console.log('swipeable destroy');\r\n if(eventsEnabled){\r\n hammer.off('panend panleft panright swipeleft swiperight', handleHammer);\r\n }\r\n\r\n // Destroy hammer instance as well to prevent a memory leak from it holding onto a detached node.\r\n // Angular had this issue previously, and was updated to call .destroy() on the instance.\r\n // ref: https://github.com/angular/angular/issues/22155\r\n hammer.destroy();\r\n\r\n console.log('hammer dispose done');\r\n observer.disconnect();\r\n });\r\n }\r\n}]);","angular.module('aprima-core-ui')\r\n .directive('apTile', ['_', '$parse', function (_, $parse) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'EA',\r\n require: '^apTileManager',\r\n link: function(scope, element, attrs, tileManager) {\r\n var tileId = scope.$eval(attrs.tileId);\r\n var defaultValue;\r\n \r\n if(_.isNil(tileId)) {\r\n throw new Error('apTile has to have a tile-id to work properly.');\r\n }\r\n\r\n if(!tileManager) {\r\n throw new Error('apTile has to have apTileManager as a parent to work properly.');\r\n }\r\n\r\n if(attrs.isCollapsed) {\r\n var parsedIsCollapsed = $parse(attrs.isCollapsed);\r\n if(!parsedIsCollapsed.assign) {\r\n throw new Error('apTile attribute is-collapsed must be an assignable value.');\r\n }\r\n\r\n defaultValue = !!parsedIsCollapsed(scope);\r\n \r\n var isCollapsedWatch = scope.$watch(\r\n function(currentScope) {\r\n return parsedIsCollapsed(currentScope);\r\n }, \r\n function(newVal, oldVal) {\r\n if(newVal !== oldVal) {\r\n toggleTile();\r\n }\r\n }\r\n );\r\n scope.toggle = function toggle() {\r\n parsedIsCollapsed.assign(scope, !parsedIsCollapsed(scope));\r\n };\r\n scope.tileState = tileManager.tileGroup.setupTile(tileId, defaultValue, true);\r\n }\r\n else {\r\n defaultValue = !!scope.$eval(attrs.defaultCollapsed);\r\n scope.toggle = toggleTile;\r\n scope.tileState = tileManager.tileGroup.setupTile(tileId, defaultValue);\r\n }\r\n scope.scroller = attrs.scroller;\r\n\r\n function toggleTile() {\r\n tileManager.tileGroup.toggle(tileId);\r\n }\r\n\r\n scope.$on('$destroy', function() {\r\n if(isCollapsedWatch) {\r\n isCollapsedWatch();\r\n }\r\n });\r\n }\r\n };\r\n }]);\r\n","angular.module('aprima-core-ui')\r\n .directive('apTileManager', [function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'EA',\r\n controller: ['$scope', '$attrs', 'TileGroup', 'Bridge', function($scope, $attrs, TileGroup, Bridge) {\r\n var self = this;\r\n self.tileGroup = new TileGroup(\r\n $scope.$eval($attrs.groupName),\r\n $scope.$eval($attrs.tileConfiguration),\r\n $scope.$eval($attrs.storageMode),\r\n !!$scope.$eval($attrs.disablePersistence));\r\n\r\n var configurationWatch = $scope.$watch($attrs.tileConfiguration, function(newVal, oldVal) {\r\n if(newVal !== oldVal) {\r\n self.tileGroup.changeConfiguration(newVal);\r\n }\r\n });\r\n\r\n var persistenceWatch = $scope.$watch($attrs.disablePersistence, function(newVal, oldVal) {\r\n if(newVal !== oldVal) {\r\n self.tileGroup.setPersistence(!newVal);\r\n }\r\n });\r\n\r\n Bridge.on('change-tile-state', $scope, function () {\r\n self.tileGroup.nextState();\r\n });\r\n\r\n $scope.$on('$destroy', function() {\r\n configurationWatch();\r\n persistenceWatch();\r\n });\r\n }],\r\n };\r\n }]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').directive('apVerticalSeparator', [\r\n apVerticalSeparator\r\n ]);\r\n\r\n function apVerticalSeparator() {\r\n return {\r\n restrict: 'A',\r\n link: link,\r\n };\r\n\r\n function link(scope, elem, attrs) {\r\n var element = elem;\r\n var parent = elem.parent()[0];\r\n var target = document.getElementById(attrs.apVerticalSeparator);\r\n if (target) {\r\n parent = target;\r\n }\r\n\r\n function updateMaxHeight() {\r\n var reservedSpace = 0;\r\n\r\n if (element && element.length > 0) {\r\n var paddingTopStr = element.css('padding-top');\r\n var paddingBottomStr = element.css('padding-bottom');\r\n var paddingTop = parseInt(paddingTopStr);\r\n var paddingBottom = parseInt(paddingBottomStr);\r\n if (paddingTop && paddingBottom) {\r\n reservedSpace = paddingTop + paddingBottom;\r\n }\r\n }\r\n\r\n var target = $(parent).height() - reservedSpace;\r\n\r\n element.css('max-height', target + 'px');\r\n element.css('height', target + 'px');\r\n }\r\n\r\n updateMaxHeight();\r\n\r\n var windowSelector = $(window);\r\n windowSelector.on('resize', updateMaxHeight);\r\n var observer = new MutationObserver(updateMaxHeight);\r\n\r\n observer.observe(parent, {attributes: true, subtree: true, attributeFilter: ['class']});\r\n\r\n scope.$on('$destroy', function(){\r\n windowSelector.off('resize', updateMaxHeight);\r\n observer.disconnect();\r\n });\r\n }\r\n }\r\n})(angular);","(function () {\r\n 'use strict';\r\n\r\n var directiveName = 'hmClick';\r\n angular.module('aprima-core-ui').directive(directiveName, [\r\n 'ClickListenerService',\r\n hmClick\r\n ]);\r\n\r\n function hmClick(\r\n ClickListenerService\r\n ) {\r\n return {\r\n restrict: 'A',\r\n link: link,\r\n };\r\n\r\n function link(scope, element, attrs) {\r\n ClickListenerService.registerFromDirective(scope, element, attrs, directiveName);\r\n }\r\n }\r\n})();\r\n","// Usage: stop click events from propagating out of an element, without having to use a click attribute (like ng-click or hm-click)\r\n// this directive won't do anything if ng-click or hm-click is already defined, because it will already get handled properly\r\n// by those directives\r\n(function (angular) {\r\n 'use strict';\r\n\r\n // click attributes\r\n var hmClick = 'hmClick';\r\n var ngClick = 'ngClick';\r\n\r\n angular.module('aprima-core-ui').directive('hmStopPropagation', [\r\n 'ClickListenerService',\r\n hmStopPropagation,\r\n ]);\r\n\r\n\r\n function hmStopPropagation(\r\n ClickListenerService\r\n ) {\r\n var directive = {\r\n restrict: 'A',\r\n link: link,\r\n };\r\n\r\n return directive;\r\n\r\n function link(\r\n scope,\r\n element,\r\n attrs\r\n ) {\r\n if(!attrs.hasOwnProperty(ngClick) && !attrs.hasOwnProperty(hmClick)) {\r\n // don't need this attribute to actually be compiled, just have to set it here,\r\n // so the ClickListenerService picks it up\r\n attrs[ngClick] = '';\r\n ClickListenerService.registerFromDirective(scope, element, attrs, ngClick);\r\n }\r\n }\r\n }\r\n\r\n})(window.angular);","(function () {\r\n 'use strict';\r\n angular.module('aprima-core-ui').config(['$provide', function ($provide) {\r\n $provide.decorator('ngClickDirective', [\r\n '$delegate',\r\n 'ClickListenerService',\r\n ngClickDecorator\r\n ]);\r\n\r\n function ngClickDecorator(\r\n $delegate,\r\n ClickListenerService\r\n ) {\r\n // Completely replace all implementations of the ngClick directive.\r\n // We need to make sure ngClick hasn't changed when upgrading angular.\r\n $delegate.forEach(updateDirective);\r\n return $delegate;\r\n\r\n function updateDirective(directive) {\r\n // angular somehow knows that ngClick has a compile function and not a link function,\r\n // so we have to override compile instead of deleting it and using link directly.\r\n directive.compile = compile;\r\n }\r\n\r\n function compile() {\r\n return link;\r\n }\r\n\r\n function link(scope, element, attrs) {\r\n ClickListenerService.registerFromDirective(scope, element, attrs, 'ngClick');\r\n }\r\n }\r\n }]);\r\n})();","angular.module('aprima-core-ui').directive('dialHref', ['DeviceSettings', 'ClickListenerService', '$window', function (DeviceSettings, ClickListenerService, $window) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n dialHref : '=',\r\n dialHrefProtocol: '@'\r\n },\r\n link: function (scope, elem) {\r\n if (DeviceSettings.isPrm) {\r\n return;\r\n }\r\n\r\n elem.addClass('clickable');\r\n var deregister = ClickListenerService.register(elem, clickHandler, {\r\n hmStopPropagation: true,\r\n });\r\n scope.$on('$destroy', deregister);\r\n\r\n function clickHandler() {\r\n var protocol = scope.dialHrefProtocol || 'tel';\r\n $window.location.href = protocol + ':' + scope.dialHref;\r\n }\r\n }\r\n };\r\n}]);\r\n","(function(angular) {\r\n 'use strict';\r\n \r\n var directiveName = 'apFindPharmacy';\r\n\r\n angular.module('aprima-core-ui').directive(directiveName, [\r\n '$q',\r\n 'ApReadonlyFindControl',\r\n 'AprimaCache',\r\n 'PatientRepository',\r\n 'PharmacyRepository',\r\n 'ServerInfoRepository',\r\n ApFindPharmacy,\r\n ]);\r\n\r\n function ApFindPharmacy(\r\n $q,\r\n ApReadonlyFindControl,\r\n AprimaCache,\r\n PatientRepository,\r\n PharmacyRepository,\r\n ServerInfoRepository\r\n ) {\r\n var vm = null;\r\n var validationKey = 'pharmacyMatch';\r\n var idProperty = 'Id';\r\n var templateUrl = '/core-ui/views/directives/find/apFindPharmacy.html';\r\n var patientPharmaciesCache = AprimaCache.getOrCreate('PatientDefaultPharmacies', {\r\n maxAge: 5 * 60 * 1000, // 5 minutes\r\n deleteOnExpire: 'passive',\r\n capacity: 20,\r\n });\r\n var defaultHeader = 'Patient\\'s Pharmacies';\r\n \r\n var directiveDefinition = ApReadonlyFindControl.init(\r\n directiveName,\r\n PharmacyRepository.getPharmacy,\r\n PharmacyRepository.searchPharmacies, // searchPharmaciesIncludeAllMailOrders,\r\n validationKey,\r\n templateUrl,\r\n idProperty,\r\n validator,\r\n true,\r\n onInitCtrl,\r\n getDefaultList,\r\n defaultHeader\r\n );\r\n directiveDefinition.bindToController.patientId = '<?';\r\n directiveDefinition.bindToController.autoFocus = '<?';\r\n \r\n return directiveDefinition;\r\n\r\n function getDefaultList(ctrl) {\r\n var patientId = ctrl.patientId;\r\n\r\n if(!patientId) {\r\n return $q.when([]);\r\n }\r\n\r\n var cachedPharmacies = patientPharmaciesCache.get(patientId);\r\n if(cachedPharmacies) {\r\n return $q.when(cachedPharmacies);\r\n }\r\n\r\n var promise = PatientRepository.getPharmacies(patientId).then(function(data) {\r\n var pharmacies = data && (data.plain ? data.plain() : data);\r\n\r\n if (!pharmacies || pharmacies.length < 1) {\r\n pharmacies = [{\r\n Name: '(No pharmacies listed for this patient.)',\r\n PharmacyId: '00000000-0000-0000-0000-000000000000',\r\n }];\r\n }\r\n\r\n if(pharmacies) {\r\n patientPharmaciesCache.put(patientId, pharmacies);\r\n }\r\n return pharmacies;\r\n });\r\n return promise;\r\n }\r\n\r\n function onInitCtrl(ctrl) {\r\n vm = ctrl;\r\n vm.placeholderText = 'Search pharmacies';\r\n if(ServerInfoRepository.isFeatureSupported('EnhancedPharmacySearch')) {\r\n vm.placeholderText += ' (+ zip code)';\r\n }\r\n\r\n vm.getSearchTextFromPharmacy = getSearchTextFromPharmacy;\r\n }\r\n\r\n function validator(pharmacy) {\r\n var isValid = !pharmacy ||\r\n (pharmacy[idProperty] &&\r\n (pharmacy.hasOwnProperty('Name') || pharmacy.hasOwnProperty('Address')));\r\n return isValid;\r\n }\r\n\r\n function getSearchTextFromPharmacy(pharmacy) {\r\n if(pharmacy && pharmacy.Name && pharmacy.Address) {\r\n return pharmacy.Name + ' - ' + pharmacy.Address.Address1;\r\n }\r\n else if(pharmacy && pharmacy.Name) {\r\n return pharmacy.Name;\r\n }\r\n return '';\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n var directiveName = 'apFindPrmUser';\r\n\r\n angular.module('aprima-core-ui').directive(directiveName, [\r\n 'ApReadonlyFindControl',\r\n 'PrmUserRepository',\r\n ApFindPrmUser,\r\n ]);\r\n\r\n function ApFindPrmUser(\r\n ApReadonlyFindControl, \r\n PrmUserRepository\r\n ) {\r\n var validationKey = 'prmUserMatch';\r\n var idProperty = 'Id';\r\n var templateUrl = '/core-ui/views/directives/find/apFindPrmUser.html';\r\n\r\n var directiveDefinition = ApReadonlyFindControl.init(\r\n directiveName,\r\n PrmUserRepository.getUser,\r\n PrmUserRepository.searchUsers,\r\n validationKey,\r\n templateUrl,\r\n idProperty,\r\n validator,\r\n true,\r\n onInitCtrl\r\n );\r\n\r\n return directiveDefinition;\r\n\r\n function onInitCtrl(ctrl) {\r\n ctrl.placeholderText = 'Search users';\r\n ctrl.getSearchTextFromFindPrmUser = getSearchTextFromFindPrmUser;\r\n }\r\n\r\n function validator(prmUser) {\r\n var isValid = !prmUser ||\r\n (prmUser[idProperty] &&\r\n (prmUser.hasOwnProperty('FormattedInternalName') || (prmUser.hasOwnProperty('LastName') && prmUser.hasOwnProperty('FirstName'))));\r\n return isValid;\r\n }\r\n\r\n function getSearchTextFromFindPrmUser(prmUser) {\r\n if (prmUser && prmUser.FormattedInternalName) {\r\n return prmUser.FormattedInternalName;\r\n } else if (prmUser && prmUser.LastName && prmUser.FirstName) {\r\n return prmUser.LastName + ', ' + prmUser.FirstName;\r\n }\r\n return '';\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n var directiveName = 'apPatientSearch';\r\n\r\n angular.module('aprima-core-ui').directive(directiveName, [\r\n 'ApReadonlyFindControl',\r\n 'PatientRepository',\r\n 'QuicksearchFactory',\r\n ApPatientSearch,\r\n ]);\r\n\r\n function ApPatientSearch(\r\n ApReadonlyFindControl,\r\n PatientRepository,\r\n QuicksearchFactory\r\n ) {\r\n var validationKey = 'patientMatch';\r\n var idProperty = 'Id';\r\n var templateUrl = '/core-ui/views/directives/find/apPatientSearch.html';\r\n \r\n var directiveDefinition = ApReadonlyFindControl.init(\r\n directiveName,\r\n PatientRepository.getPatient,\r\n QuicksearchFactory.updateList,\r\n validationKey,\r\n templateUrl,\r\n idProperty,\r\n validator,\r\n true,\r\n onInitCtrl\r\n );\r\n\r\n return directiveDefinition;\r\n \r\n function onInitCtrl(ctrl) {\r\n ctrl.placeholderText = 'Search patients';\r\n ctrl.getSearchTextFromPatient = getSearchTextFromPatient;\r\n }\r\n\r\n function validator(patient) {\r\n var isValid = !patient ||\r\n (patient[idProperty] &&\r\n (patient.hasOwnProperty('Name') || (patient.hasOwnProperty('LastName') && patient.hasOwnProperty('FirstName'))));\r\n return isValid;\r\n }\r\n\r\n function getSearchTextFromPatient(patient) {\r\n if(patient && patient.Name){\r\n return patient.Name;\r\n }\r\n else if (patient && patient.LastName && patient.FirstName) {\r\n return patient.LastName + ', ' + patient.FirstName;\r\n }\r\n return '';\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-core-ui').component('apPharmacyItem', {\r\n bindings: {\r\n pharmacy: '<'\r\n },\r\n templateUrl: '/core-ui/views/directives/find/apFindPharmacyTemplate.html',\r\n controllerAs: 'match',\r\n controller: ['_', function(_) {\r\n 'use strict';\r\n\r\n this.$onChanges = function changes(changeObj) {\r\n if(changeObj.pharmacy && changeObj.pharmacy.currentValue) {\r\n this.model = _.assign({}, changeObj.pharmacy.currentValue);\r\n // Handle the case where pharmacy IS a MasterPharmacy, so it doesn't have a MasterPharmacy property\r\n // so use itself as the MasterPharmacy\r\n if(!this.model.MasterPharmacy) {\r\n this.model.MasterPharmacy = _.assign({}, changeObj.pharmacy.currentValue);\r\n }\r\n }\r\n };\r\n }]\r\n});","(function(angular) {\r\n 'use strict';\r\n\r\n // Important: this is not a completely generic utility,\r\n // there is some ui-bootstrap typeahead specific logic\r\n\r\n angular.module('aprima-core-ui').factory('ApReadonlyFindControl', [\r\n '$q',\r\n ApReadonlyFindControl,\r\n ]);\r\n \r\n function ApReadonlyFindControl(\r\n $q\r\n ) {\r\n var service = {\r\n init: init,\r\n };\r\n\r\n return service;\r\n\r\n function init(\r\n name,\r\n getItemByIdFn,\r\n searchFn,\r\n validationKey,\r\n templateUrl,\r\n idProperty,\r\n itemValidatorFn,\r\n removeDuplicateDefaults,\r\n onInitCtrlFn,\r\n getDefaultsFn,\r\n defaultHeader\r\n ) {\r\n\r\n if(!getItemByIdFn || !searchFn || !validationKey || !templateUrl) {\r\n throw new Error('Cannot init ApReadonlyFindControl from ' + name + ' without filling in required arguments');\r\n }\r\n\r\n var initCtrlCallback = onInitCtrlFn || angular.noop;\r\n var validator = itemValidatorFn ?\r\n itemValidatorFn :\r\n (idProperty ? defaultObjectValidator : defaultPrimitiveValidator);\r\n var getDefaultsCallback = getDefaultsFn || function() {\r\n return $q.when([]);\r\n };\r\n defaultHeader = defaultHeader || null;\r\n\r\n var directiveDefinition = {\r\n restrict: 'E',\r\n templateUrl: templateUrl,\r\n require: {\r\n ngModel: 'ngModel',\r\n },\r\n scope: {},\r\n controllerAs: 'vm',\r\n bindToController: {\r\n // expression to determine whether the control should be disabled or not\r\n selectDisabled: '&',\r\n\r\n // possible values:\r\n // default-list=\"\" == default-list=\"false\"\r\n // default-list=\"true\" => use the directive's default (aka the default defined in apFindPharmacy)\r\n // default-list=\"[1, 2, 3]\"\r\n // default-list=\"some expression returning a promise that resolves to an []\"\r\n\r\n // default list of items to show up (i.e. a patient's default list of pharmacies)\r\n defaultList: '&?',\r\n \r\n // header that will show up above the defaultList\r\n defaultHeader: '&?',\r\n\r\n displayNone: '<?',\r\n\r\n // if this expression evaluates to true, then it means the ngModel should represent the Id\r\n // of the object rather than the whole thing\r\n useId: '&',\r\n\r\n // use this instead of ng-change with locals $id and $object\r\n valueChanged: '&',\r\n\r\n parentContainerId: '<?',\r\n },\r\n compile: ApReadonlyFindControlCompile,\r\n controller: [\r\n '_',\r\n '$element',\r\n '$q',\r\n '$qHelpers',\r\n '$scope',\r\n '$timeout',\r\n '$window',\r\n 'DeviceSettings',\r\n 'uxConstants',\r\n ApReadonlyFindControlCtrl,\r\n ],\r\n };\r\n\r\n return directiveDefinition;\r\n\r\n function ApReadonlyFindControlCompile(\r\n tElement\r\n ) {\r\n // set typeahead-focus-on-select to false so it doesn't focus the\r\n // input box again after selecting\r\n tElement.find('input').attr('typeahead-focus-on-select', false);\r\n }\r\n\r\n function ApReadonlyFindControlCtrl(\r\n _,\r\n $element,\r\n $q,\r\n $qHelpers,\r\n $scope,\r\n $timeout,\r\n $window,\r\n DeviceSettings,\r\n uxConstants\r\n ) {\r\n var vm = this;\r\n\r\n var tempViewValue = null;\r\n var noMatchingItem = false;\r\n var resetNgModelTimeout = null;\r\n\r\n vm.selectedItem = null;\r\n vm.placeHolderItem = null;\r\n vm.outstandingCalls = 0;\r\n\r\n vm.$onInit = onInit;\r\n vm.$onDestroy = onDestroy;\r\n vm.getDefaultHeader = getDefaultHeader;\r\n vm.callNoneAction = callNoneAction;\r\n\r\n\r\n function onInit() {\r\n if(!idProperty) {\r\n // ng-model represents whatever primitive item is picked\r\n // $modelValue = 'someString'\r\n // $viewValue = 'someString'\r\n // or\r\n // $modelValue = someNumber\r\n // $viewValue = someNumber\r\n // or it could work with object too, that for some reason doesn't have an id property\r\n // $modelValue = { value: 'someValue' }\r\n // $viewValue = { value: 'someValue' }\r\n\r\n vm.ngModel.$formatters.push(formatOrParsePrimitive);\r\n vm.ngModel.$parsers.push(formatOrParsePrimitive);\r\n vm.ngModel.$viewChangeListeners.push(valueChangedPrimitive);\r\n }\r\n else if(vm.useId()) {\r\n // ng-model represents the id of whatever item is picked\r\n // $modelValue = 'objectId'\r\n // $viewValue = {idProperty: 'objectId'}\r\n\r\n if(_.isObject(vm.ngModel.$modelValue)) {\r\n throw new Error('Cannot use an object as ng-model when using use-id=\"true\" for ' + name);\r\n }\r\n\r\n vm.ngModel.$formatters.push(formatFromIdToObject);\r\n vm.ngModel.$parsers.push(parseFromObjectToId);\r\n vm.ngModel.$viewChangeListeners.push(valueChangedId);\r\n }\r\n else {\r\n // ng-model represents the full object of whatever item is picked\r\n // $modelValue = {idProperty: 'objectId'}\r\n // $viewValue = {idProperty: 'objectId'}\r\n\r\n vm.ngModel.$formatters.push(formatObject);\r\n vm.ngModel.$parsers.push(parseObject);\r\n vm.ngModel.$viewChangeListeners.push(valueChangedObject);\r\n }\r\n\r\n vm.ngModel.$render = render;\r\n\r\n\r\n // have to listen for the event here rather than using ng-focus in the view because it gets fired earlier and i need\r\n // to change the ngmodel before typeahead checks it in its own focus event\r\n // and that is also why this needs to be $apply-ed instead of $evalAsync\r\n $element.on('focus', 'input', inputFocus);\r\n\r\n $element.on('blur', 'input', inputBlur);\r\n\r\n vm.itemSelected = itemSelected;\r\n vm.searchItems = searchItems;\r\n vm.clear = clear;\r\n\r\n initCtrlCallback(vm);\r\n }\r\n\r\n function onDestroy() {\r\n $element.off('focus', 'input', inputFocus);\r\n $element.off('blur', 'input', inputBlur);\r\n }\r\n\r\n // instead of actually changing anything in the ui in $render, pass the value along to the\r\n // inner input element\r\n function render() {\r\n vm.selectedItem = vm.ngModel.$viewValue;\r\n vm.placeHolderItem = vm.selectedItem;\r\n }\r\n\r\n function clear() {\r\n // clear out everything: $viewValue, $modelValue, and call $render to set the selectedItem\r\n vm.ngModel.$setViewValue(null);\r\n vm.ngModel.$render();\r\n }\r\n\r\n function inputFocus() {\r\n // empty the model that determines what the input shows, when focusing it\r\n $scope.$apply(function() {\r\n vm.placeHolderItem = vm.selectedItem;\r\n vm.selectedItem = null;\r\n });\r\n }\r\n\r\n function inputBlur() {\r\n // reset the input on blur if there wasn't an item selected\r\n $scope.$evalAsync(function() {\r\n resetNgModelTimeout = $timeout(function() {\r\n vm.ngModel.$rollbackViewValue();\r\n }, uxConstants.blurDebounceTime);\r\n });\r\n }\r\n\r\n function itemSelected($item) {\r\n if(resetNgModelTimeout) {\r\n // since an item was selected, cancel the timeout that would reset the model\r\n // to its previous value\r\n $timeout.cancel(resetNgModelTimeout);\r\n }\r\n vm.ngModel.$setViewValue($item);\r\n }\r\n\r\n function searchItems(text) {\r\n if(DeviceSettings.isPhoneOrOverride) {\r\n scrollToFit();\r\n }\r\n\r\n if(!text) {\r\n // for now, if no text, then return the default list\r\n var defaultListPromise = getDefaultList();\r\n return defaultListPromise;\r\n }\r\n\r\n vm.outstandingCalls++;\r\n var searchPromise = searchFn(text).finally(function() {\r\n vm.outstandingCalls--;\r\n });\r\n return searchPromise;\r\n }\r\n \r\n function getItemById(id) {\r\n vm.outstandingCalls++;\r\n var promise = getItemByIdFn(id).finally(function() {\r\n vm.outstandingCalls--;\r\n });\r\n return promise;\r\n }\r\n \r\n function getDefaultHeader() {\r\n var header = (vm.defaultHeader && vm.defaultHeader()) || defaultHeader;\r\n return header;\r\n }\r\n\r\n function callNoneAction() {\r\n return itemSelected({});\r\n }\r\n\r\n function getDefaultList() {\r\n var defaultList = vm.defaultList && vm.defaultList();\r\n if(!defaultList) {\r\n return $q.when([]);\r\n }\r\n\r\n var defaultsPromise = $q.when([]);\r\n if(defaultList === true) {\r\n defaultsPromise = getDefaultsCallback(vm);\r\n }\r\n else if(_.isArray(defaultList)) {\r\n defaultsPromise = $q.when(defaultList);\r\n }\r\n else if($qHelpers.isPromise(defaultList)) {\r\n defaultsPromise = defaultList;\r\n }\r\n\r\n vm.outstandingCalls++;\r\n\r\n var resultPromise = defaultsPromise\r\n .then(function(list) {\r\n var defaultItemList = _.compact(list);\r\n\r\n if(idProperty) {\r\n // remove duplicates from defaultList if a track-by is used\r\n // so angular won't throw an error\r\n if(removeDuplicateDefaults) {\r\n defaultItemList = _.uniqBy(defaultItemList, idProperty);\r\n }\r\n }\r\n\r\n defaultItemList.forEach(function(item) {\r\n if(_.isObject(item)) {\r\n item.isDefault = true;\r\n }\r\n });\r\n\r\n return defaultItemList;\r\n })\r\n .finally(function() {\r\n vm.outstandingCalls--;\r\n });\r\n\r\n return resultPromise;\r\n }\r\n\r\n function parseFromObjectToId(value) {\r\n if(!validator(value)) {\r\n vm.ngModel.$setValidity(validationKey, false);\r\n return null;\r\n }\r\n\r\n vm.ngModel.$setValidity(validationKey, true);\r\n\r\n // return null instead of undefined, so it's not considered a parse error\r\n // since we are already marking it as an error for a specific validationKey\r\n return value ? value[idProperty] : null;\r\n }\r\n\r\n function formatFromIdToObject(value) {\r\n // if there is no item matching this id then set a validation error\r\n if(noMatchingItem) {\r\n vm.ngModel.$setValidity(validationKey, false);\r\n noMatchingItem = false;\r\n return null;\r\n }\r\n\r\n vm.ngModel.$setValidity(validationKey, true);\r\n\r\n if(!value) {\r\n return null;\r\n }\r\n\r\n if(tempViewValue && tempViewValue[idProperty] === value) {\r\n // a temp value was set before and now it can be returned to be passed on to the view\r\n return tempViewValue;\r\n }\r\n\r\n // try to get the item associated with this id\r\n getItemById(value).then(\r\n function(result) {\r\n if(!result || result[idProperty] !== value) {\r\n // this is the same case as a request error (no matching item):\r\n // because the result is null,\r\n // or the id of the result for some reason doesn't match the id that was passed in\r\n noMatchingItem = true;\r\n result = null;\r\n }\r\n\r\n // if successful, then store it in a temp value\r\n // and set the $modelValue to null to trigger the $formatter pipeline again\r\n // from the internal ngModelWatch in NgModelController\r\n // where it can then use this temp value as the actual object representing this id\r\n vm.ngModel.$modelValue = null;\r\n tempViewValue = result;\r\n },\r\n function() {\r\n // if not successful, then set the temp value to null,\r\n // set noMatchingItem to true,\r\n // and set the $modelValue to null to trigger the $formatter pipeline again\r\n // from the internal ngModelWatch in NgModelController\r\n // where it can then set a validation error\r\n noMatchingItem = true;\r\n vm.ngModel.$modelValue = null;\r\n tempViewValue = null;\r\n }\r\n );\r\n\r\n // return the current $viewValue here so that there will be no view update since it\r\n // needs to wait on a request to get the item matching the id in the $modelValue\r\n // (the value passed into this method)\r\n return vm.ngModel.$viewValue;\r\n }\r\n\r\n function valueChangedId() {\r\n vm.valueChanged({\r\n $id: vm.ngModel.$modelValue,\r\n $object: vm.ngModel.$viewValue,\r\n });\r\n }\r\n\r\n function formatObject(value) {\r\n var isValid = validator(value);\r\n\r\n if(!isValid) {\r\n // ngModel object has idProperty, but the rest of the object isn't filled in\r\n // so lookup the whole valid object\r\n var objectId = value && value[idProperty];\r\n if(objectId) {\r\n return formatFromIdToObject(objectId);\r\n }\r\n // the ngModel object doesn't have valid idProperty, so it is completely invalid\r\n // and cannot be filled in with a lookup\r\n else {\r\n vm.ngModel.$setValidity(validationKey, false);\r\n return null;\r\n }\r\n }\r\n\r\n vm.ngModel.$setValidity(validationKey, true);\r\n\r\n return value || null;\r\n }\r\n\r\n function parseObject(value) {\r\n if(!validator(value)) {\r\n vm.ngModel.$setValidity(validationKey, false);\r\n return null;\r\n }\r\n\r\n vm.ngModel.$setValidity(validationKey, true);\r\n\r\n // return null instead of undefined, so it's not considered a parse error\r\n // since we are already marking it as an error for a specific validationKey\r\n return value || null;\r\n }\r\n\r\n function valueChangedObject() {\r\n vm.valueChanged({\r\n $id: vm.ngModel.$modelValue && vm.ngModel.$modelValue[idProperty],\r\n $object: vm.ngModel.$modelValue,\r\n });\r\n }\r\n\r\n function formatOrParsePrimitive(value) {\r\n if(!validator(value)) {\r\n vm.ngModel.$setValidity(validationKey, false);\r\n return null;\r\n }\r\n\r\n vm.ngModel.$setValidity(validationKey, true);\r\n\r\n // return null instead of undefined, so it's not considered a parse error\r\n // since we are already marking it as an error for a specific validationKey\r\n return value || null;\r\n }\r\n\r\n function valueChangedPrimitive() {\r\n vm.valueChanged({\r\n $id: vm.ngModel.$modelValue,\r\n $object: vm.ngModel.$modelValue,\r\n });\r\n }\r\n\r\n function scrollToFit() {\r\n // try to better fit this input and results on the screen\r\n $element.parent()[0].scrollIntoView();\r\n }\r\n }\r\n\r\n function defaultObjectValidator(value) {\r\n var isValid = !value || value[idProperty];\r\n return isValid;\r\n }\r\n\r\n function defaultPrimitiveValidator(value) {\r\n var isValid = !_.isNaN(value) && value !== '';\r\n return isValid;\r\n }\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n var scopeFocusEvent = 'focusOn';\r\n\r\n angular.module('aprima-core-ui').directive('focusOn', [\r\n focusOn,\r\n ]);\r\n\r\n angular.module('aprima-core-ui').factory('focus', [\r\n '$rootScope',\r\n '$timeout',\r\n focusFactory,\r\n ]);\r\n\r\n function focusOn(\r\n ) {\r\n var directive = {\r\n restrict: 'A',\r\n link: function(scope, elem, attr) {\r\n scope.$on(scopeFocusEvent, function(e, name) {\r\n if (name === attr.focusOn) {\r\n elem[0].focus();\r\n }\r\n });\r\n },\r\n };\r\n\r\n return directive;\r\n }\r\n\r\n function focusFactory(\r\n $rootScope,\r\n $timeout\r\n ) {\r\n return focus;\r\n\r\n function focus(name) {\r\n $timeout(function() {\r\n $rootScope.$broadcast(scopeFocusEvent, name);\r\n });\r\n }\r\n }\r\n})(window.angular);\r\n","angular.module('aprima-core-ui').directive('iframeOnload', [function(){\r\n 'use strict';\r\n return {\r\n scope: {\r\n callBack: '&iframeOnload'\r\n },\r\n link: function(scope, element){\r\n element.on('load', function(){\r\n return scope.callBack();\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n element.off('load');\r\n });\r\n }\r\n };\r\n }]);","angular.module('aprima-core-ui')\r\n .directive('apAutoGrow', ['$interval', 'DeviceSettings', function($interval, DeviceSettings) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function(scope, element, attr){\r\n\r\n var minHeight = 34;\r\n\r\n var $shadow = angular.element('<div></div>').css({\r\n position: 'absolute',\r\n top: -10000,\r\n left: -10000,\r\n font: element.css('font'),\r\n resize: 'none',\r\n wordWrap: 'break-word',\r\n whiteSpace: 'pre-wrap',\r\n 'box-shadow': element.css('box-shadow')\r\n });\r\n angular.element(document.body).append($shadow);\r\n\r\n element.css('overflow', 'hidden');\r\n element.css('resize', 'none');\r\n\r\n // In the event that the canvas get's resized, we want to adjust the size, so we're creating an interval to monitor for changes.\r\n var widthWatch = $interval(updateShadowDiv, 100);\r\n\r\n var lastWidth = -1;\r\n function updateShadowDiv() {\r\n // This method was sometimes causing Protractor to timeout,\r\n // not accessing the padding properties or calling update unless something changed fixed this. \r\n var newWidth = element.innerWidth();\r\n if (lastWidth === newWidth) {\r\n return;\r\n }\r\n\r\n lastWidth = newWidth;\r\n if (DeviceSettings.isIos) {\r\n newWidth = element.innerWidth() - parseInt(element.css('padding-right') || 0) - parseInt(element.css('padding-left') || 0) - 6;\r\n }\r\n else {\r\n newWidth = element.innerWidth() - parseInt(element.css('padding-right') || 0) - parseInt(element.css('padding-left') || 0);\r\n }\r\n \r\n $shadow.css('width', newWidth);\r\n update();\r\n }\r\n\r\n function update() {\r\n var val = element.val()\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/&/g, '&')\r\n .replace(/\\n ?$/, '<br/> ')\r\n .replace(/\\n/g, '<br/>');\r\n\r\n $shadow.html(val);\r\n\r\n var newHeight = Math.max($shadow[0].offsetHeight + 14, minHeight) + 'px';\r\n element.css('height', newHeight);\r\n }\r\n\r\n var modelWatch = scope.$watch(attr.ngModel, update);\r\n\r\n scope.$on('$destroy', function() {\r\n $interval.cancel(widthWatch);\r\n modelWatch();\r\n $shadow.remove();\r\n });\r\n }\r\n };\r\n}]);","(function() {\r\n 'use strict';\r\n\r\n var directiveName = 'apFocusStr';\r\n \r\n angular.module('aprima-core-ui').directive(directiveName, ['$parse', 'inputSelection', function ($parse, inputSelection) {\r\n var defaultString = '_';\r\n\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function(scope, element, attrs, ngModel) {\r\n var _element = inputSelection.getChildElement(element);\r\n\r\n var parsedString = $parse(attrs[directiveName]);\r\n var searchString = defaultString;\r\n if(parsedString.constant) {\r\n searchString = parsedString(scope) || defaultString;\r\n }\r\n\r\n element.on('focus', handleFocus);\r\n\r\n scope.$on('$destroy', function(){\r\n element.off('focus', handleFocus);\r\n });\r\n\r\n function handleFocus() {\r\n updateSearchString();\r\n inputSelection.trySelectStr(_element, ngModel, searchString, 0);\r\n }\r\n\r\n function updateSearchString() {\r\n if(!parsedString.constant) {\r\n searchString = parsedString(scope) || defaultString;\r\n }\r\n }\r\n }\r\n };\r\n }]);\r\n})();","(function() {\r\n 'use strict';\r\n\r\n var directiveName = 'apTabToStr';\r\n \r\n angular.module('aprima-core-ui').directive(directiveName, ['_', '$parse', 'inputSelection', function (_, $parse, inputSelection) {\r\n var defaultKeyCode = 9; // tab key\r\n var defaultString = '_';\r\n\r\n // input:\r\n // string\r\n // '_'\r\n // OR\r\n // int code\r\n // 9\r\n // OR\r\n // [int code, string]\r\n // [9, '_']\r\n return {\r\n restrict: 'A',\r\n require: 'ngModel',\r\n link: function(scope, element, attrs, ngModel) {\r\n var _element = inputSelection.getChildElement(element);\r\n \r\n if(!_.hasIn(_element, 'selectionStart')) {\r\n throw new Error('Can\\'t use ' + directiveName + ' with ' + _element + ' because it doesn\\'t' +\r\n ' support \\'selectionStart\\'');\r\n }\r\n\r\n var keyCode = defaultKeyCode;\r\n var searchString = defaultString;\r\n\r\n var parsedConfig = $parse(attrs[directiveName]);\r\n\r\n if(parsedConfig.constant) {\r\n processConfig(parsedConfig(scope));\r\n }\r\n else {\r\n var configWatch = scope.$watch(parsedConfig, processConfig, parsedConfig.literal);\r\n }\r\n\r\n element.on('keydown', handleKey);\r\n\r\n scope.$on('$destroy', function(){\r\n element.off('keydown', handleKey);\r\n if(configWatch) {\r\n configWatch();\r\n }\r\n });\r\n\r\n function handleKey(e) {\r\n var key = e.which || e.keyCode || 0;\r\n if(key === keyCode) {\r\n if(inputSelection.trySelectStr(_element, ngModel, searchString, _element.selectionEnd)) {\r\n // if we can tab to the next string, then prevent the default action of tabbing to the\r\n // next element\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n function processConfig(config) {\r\n if(config) {\r\n if(_.isInteger(config)) {\r\n keyCode = config;\r\n }\r\n else if(_.isInteger(config[0])) {\r\n keyCode = config[0];\r\n searchString = config[1];\r\n }\r\n else {\r\n searchString = config;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }]);\r\n})();\r\n","//this makes contenteditable and ngModel play nicely together\r\nangular.module('aprima-core-ui').directive('contenteditable', [function() {\r\n 'use strict';\r\n var brRegex = /<\\s*br\\s*\\/?>/gm;\r\n\r\n function containsBreaks(str) {\r\n return brRegex.test(String(str));\r\n }\r\n\r\n function removeBreaks(str) {\r\n str = String(str).replace(brRegex, ' ');\r\n return str;\r\n }\r\n\r\n function replaceNbsp(str) {\r\n // instructions currently written in <div> for easy resizing\r\n // multiple spaces ' ', results in throwing off char count\r\n if (!str) return str;\r\n // var re = new RegExp(String.fromCharCode(160), 'g');\r\n // return str.replace(re, ' ');\r\n return str.replace(/ /g, ' ');\r\n }\r\n\r\n /*\r\n function replaceSpace(str) {\r\n // multiple spaces ' ' without does not display in <div> correctly\r\n if (!str) return str;\r\n return str.replace(/ /g, ' ');\r\n }\r\n */\r\n\r\n return {\r\n restrict: 'A', // only activate on element attribute\r\n require: '?ngModel', // get a hold of NgModelController\r\n link: function(scope, element, attrs, ngModel) {\r\n if (!ngModel) {\r\n return; // do nothing if no ng-model\r\n }\r\n\r\n // Specify how UI should be updated\r\n ngModel.$render = function() {\r\n // Bug #24922 - Removed call to (removeBreaks(replaceSpace(ngModel.$viewValue).\r\n // This fixed respective sig directions element not wrapping when rendered.\r\n // Was able to print and prescribe successfully without any garbage characters.\r\n //\r\n // element.html(removeBreaks(replaceSpace(ngModel.$viewValue) || ''));\r\n element.html(ngModel.$viewValue || '');\r\n };\r\n\r\n // this logic is based on the angular directive for input[type=text]\r\n // since it should work basically the same\r\n element.on('input change', listener);\r\n\r\n ngModel.$formatters.push(function(value) {\r\n return ngModel.$isEmpty(value) ? value : value.toString();\r\n });\r\n\r\n function listener(ev) {\r\n // Bug #25385 - entering '>', displays > as part of the SIG, when returning from the SIG Writer.\r\n // element.html() returns the innerHTML which includes >, if '>' was entered.\r\n // This resulted in > to be saved with the SigWriterDto.\r\n //\r\n // Using element.text() returns innerText, which includes '>' and not >\r\n\r\n var value = element.text();\r\n var event = ev && ev.type;\r\n\r\n if(containsBreaks(value)) {\r\n value = removeBreaks(value);\r\n }\r\n\r\n value = replaceNbsp(value);\r\n\r\n // If a control is suffering from bad input (due to native validators), browsers discard its\r\n // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the\r\n // control's value is the same empty value twice in a row.\r\n if (ngModel.$viewValue !== value || (value === '' && ngModel.$$hasNativeValidators)) {\r\n ngModel.$setViewValue(value, event);\r\n }\r\n }\r\n }\r\n };\r\n}]);\r\n","angular.module('aprima-core-ui').directive('lazySrc',\r\n ['$window', '_', 'uxConstants', '$timeout', '$rootScope', 'AprimaRestangular',\r\n function ($window, _, uxConstants, $timeout, $rootScope, Restangular) {\r\n\r\n 'use strict';\r\n\r\n // Load Image source.\r\n var loadImg = function (elm, attrs, ignoreCache) {\r\n ignoreCache = ignoreCache || false;\r\n if(attrs.lazySrc) {\r\n Restangular.get(attrs.endpointBase, {ignoreCache: ignoreCache}).one(attrs.lazySrc).get().then(function(img){\r\n elm.src = 'data:image/png;base64,' + img.Image;\r\n elm.className += ' fade-in one';\r\n });\r\n }\r\n };\r\n\r\n // Checks if top edge of element is at bottom edge of window\r\n var isBecomingVisible = function (elmOffset) {\r\n return elmOffset < $window.pageYOffset + $window.innerHeight + 700;\r\n };\r\n\r\n var link = function (scope, element, attrs) {\r\n var elm = element[0],\r\n loaded,\r\n unbindLazySrc;\r\n\r\n var scroller = element.closest('.scroller')[0] || $window;\r\n\r\n var scrollListener = _.throttle(function shouldLoad(){\r\n if (loaded) {\r\n return;\r\n }\r\n\r\n if(!elm){\r\n //could get fired after $scope.$destroy due to throttling\r\n return;\r\n }\r\n\r\n var offset = elm.getBoundingClientRect().top;\r\n\r\n if (isBecomingVisible(offset)) {\r\n loadImg(elm, attrs);\r\n loaded = true;\r\n\r\n //if this img is already visible then observe the lazySrc to update the img if it changes\r\n unbindLazySrc = attrs.$observe('lazySrc', function(){\r\n loadImg(elm, attrs);\r\n });\r\n removeEventListeners();\r\n }\r\n }, uxConstants.lazySrcThrottle);\r\n\r\n function removeEventListeners() {\r\n scroller.removeEventListener('touchmove', scrollListener);\r\n scroller.removeEventListener('mousemove', scrollListener);\r\n scroller.removeEventListener('mousewheel', scrollListener);\r\n }\r\n\r\n scroller.addEventListener('touchmove', scrollListener);\r\n scroller.addEventListener('mousemove', scrollListener);\r\n scroller.addEventListener('mousewheel', scrollListener);\r\n\r\n var unbindUpdateSrc = scope.$on('updateSrc', function(e, args){\r\n if(_.includes(attrs.lazySrc, args)) {\r\n loadImg(elm, attrs, true);\r\n }\r\n });\r\n\r\n //Check if image should be loaded immediately.\r\n //Do it in a timeout so that it doesnt block rendering the elements.\r\n //getBoundingClientRect was really slow inside an ng-repeat with ~150 items.\r\n //getBoundingClientRect took approximately 20% of the total time to render the ng-repeat\r\n $timeout(scrollListener, 0);\r\n\r\n scope.$on('$destroy', function(){\r\n removeEventListeners();\r\n unbindUpdateSrc();\r\n if(unbindLazySrc) {\r\n unbindLazySrc();\r\n }\r\n scrollListener = elm = element = null;\r\n });\r\n };\r\n\r\n return {\r\n restrict: 'A',\r\n link: link\r\n };\r\n }]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n var configs = [\r\n {\r\n controllerName: 'ApFieldInvalidCtrl',\r\n directiveName: 'apFieldInvalid',\r\n invalidClassName: 'ap-field-invalid',\r\n validClassName: 'ap-field-valid',\r\n },\r\n {\r\n controllerName: 'ApFieldsetInvalidCtrl',\r\n directiveName: 'apFieldsetInvalid',\r\n invalidClassName: 'ap-fieldset-invalid',\r\n validClassName: 'ap-fieldset-valid',\r\n },\r\n ];\r\n configs.forEach(function(config) {\r\n setup(config.controllerName, config.directiveName, config.invalidClassName, config.validClassName);\r\n });\r\n\r\n function setup(controllerName, directiveName, invalidClassName, validClassName) {\r\n angular.module('aprima-core-ui').directive(directiveName, [\r\n apCustomInvalid,\r\n ]);\r\n\r\n angular.module('aprima-core-ui').controller(controllerName, [\r\n ApCustomInvalidCtrl,\r\n ]);\r\n\r\n function apCustomInvalid() {\r\n var require = {\r\n form: '?^^form',\r\n };\r\n require[directiveName] = directiveName;\r\n\r\n return {\r\n restrict: 'A',\r\n controller: controllerName,\r\n link: link,\r\n require: require,\r\n };\r\n\r\n function link(scope, elm, attrs, ctrl) {\r\n var directiveCtrl = ctrl[directiveName];\r\n directiveCtrl.init.apply(directiveCtrl, arguments);\r\n }\r\n }\r\n\r\n function ApCustomInvalidCtrl() {\r\n var vm = this;\r\n\r\n var cleanupFns = [];\r\n var field;\r\n var formCtrl;\r\n var previousVal;\r\n\r\n vm.init = init;\r\n\r\n function init(scope, elm, attrs, ctrl) {\r\n field = elm;\r\n formCtrl = ctrl.form;\r\n cleanupFns.push(scope.$watch(attrs[directiveName], onValueChanged));\r\n scope.$on('$destroy', onDestroy);\r\n }\r\n\r\n function onDestroy() {\r\n cleanupFns.forEach(function(cleanupFn) {\r\n cleanupFn();\r\n });\r\n }\r\n\r\n function onValueChanged(newVal) {\r\n if(previousVal !== newVal) {\r\n previousVal = newVal;\r\n validate();\r\n }\r\n }\r\n\r\n function validate() {\r\n var isValid = !previousVal;\r\n field.toggleClass(validClassName, isValid);\r\n field.toggleClass(invalidClassName, !isValid);\r\n\r\n if(formCtrl) {\r\n formCtrl.$setValidity(directiveName, isValid, vm);\r\n }\r\n }\r\n }\r\n }\r\n})(angular);","angular.module('aprima-core-ui').directive('apFormGroup', [ function () {\r\n 'use strict';\r\n\r\n return {\r\n require: 'apFormGroup',\r\n restrict: 'A',\r\n controller: 'ApFormGroupCtrl',\r\n link: {\r\n pre: function(scope, element, attrs, ctrl) {\r\n ctrl.init(attrs.apFormGroup);\r\n }\r\n }\r\n };\r\n}]);\r\n\r\n\r\nangular.module('aprima-core-ui').controller('ApFormGroupCtrl', [ '$scope', '$element', 'ApFormGroup',\r\n function ($scope, $element, ApFormGroup) {\r\n 'use strict';\r\n\r\n var self = this;\r\n\r\n self.init = function init(name) {\r\n self.formGroup = new ApFormGroup(name, $scope, $element);\r\n return self.formGroup;\r\n };\r\n }\r\n]);\r\n\r\n\r\nangular.module('aprima-core-ui').factory('ApFormGroup', ['_', '$document',\r\n function (_, $document) {\r\n 'use strict';\r\n\r\n function ApFormGroup(name, scope, $formGroup) {\r\n if(!scope) {\r\n this.addField = angular.noop;\r\n this.removeField = angular.noop;\r\n this.setFieldRequired = angular.noop;\r\n return;\r\n }\r\n\r\n var fields = {};\r\n var parentFormSubmitted = false;\r\n this.addField = addField;\r\n this.removeField = removeField;\r\n this.setFieldRequired = setFieldRequired;\r\n\r\n var $formGroupLabel = getLabel(name, $formGroup);\r\n\r\n scope.$on('ap:form:submitted', function() {\r\n parentFormSubmitted = true;\r\n updateValid();\r\n });\r\n\r\n function addField(id, ngModelCtrl, fieldElement) {\r\n var thisField = fields[id] = {\r\n valid: true,\r\n pristine: true,\r\n required: false,\r\n ngModel: ngModelCtrl,\r\n element: fieldElement && (fieldElement.parent('.input-group').firstOrNull() || fieldElement)\r\n };\r\n\r\n // instead of adding watches on $pristine and $valid for each field,\r\n // hook into the places where they are being updated and then check to\r\n // see if each field and the formGroup is still valid after each change\r\n if(ngModelCtrl) {\r\n ngModelCtrl._$setDirty = ngModelCtrl.$setDirty;\r\n ngModelCtrl.$setDirty = function formGroupSetDirty() {\r\n ngModelCtrl._$setDirty.apply(ngModelCtrl, arguments);\r\n thisField.pristine = ngModelCtrl.$pristine;\r\n updateValid();\r\n };\r\n\r\n ngModelCtrl._$setPristine = ngModelCtrl.$setPristine;\r\n ngModelCtrl.$setPristine = function formGroupSetPristine() {\r\n ngModelCtrl._$setPristine.apply(ngModelCtrl, arguments);\r\n thisField.pristine = ngModelCtrl.$pristine;\r\n updateValid();\r\n };\r\n\r\n ngModelCtrl._$setValidity = ngModelCtrl.$setValidity;\r\n ngModelCtrl.$setValidity = function formGroupSetValidity() {\r\n ngModelCtrl._$setValidity.apply(ngModelCtrl, arguments);\r\n thisField.valid = ngModelCtrl.$valid;\r\n updateValid();\r\n };\r\n }\r\n }\r\n\r\n function removeField(id) {\r\n var field = fields[id];\r\n if(field && field.ngModel) {\r\n // Remove the hooks that were added to ngModel when the field is removed\r\n // from this formGroup\r\n field.ngModel.$setDirty = field.ngModel._$setDirty;\r\n field.ngModel.$setPristine = field.ngModel._$setPristine;\r\n field.ngModel.$setValidity = field.ngModel._$setValidity;\r\n }\r\n delete fields[id];\r\n }\r\n\r\n function setFieldRequired(id, required) {\r\n if(fields[id]) {\r\n fields[id].required = required;\r\n updateRequired();\r\n }\r\n }\r\n\r\n function updateRequired() {\r\n var isRequired = _.some(fields, function(field) {\r\n return field.required;\r\n });\r\n setFormGroupRequired(isRequired);\r\n }\r\n\r\n function updateValid () {\r\n var isValid = _.reduce(fields, function(result, field) {\r\n var isFieldValid = field.valid || (field.pristine && !parentFormSubmitted);\r\n setFieldValidity(field.element, isFieldValid);\r\n\r\n return result && isFieldValid;\r\n }, true);\r\n setFormGroupValidity(isValid);\r\n }\r\n\r\n //these should be idempotent\r\n function setFormGroupValidity(isValid) {\r\n if($formGroup) {\r\n $formGroup.toggleClass('ap-form-group-valid', isValid);\r\n $formGroup.toggleClass('ap-form-group-invalid', !isValid);\r\n }\r\n }\r\n\r\n function setFieldValidity($field, isValid) {\r\n if($field) {\r\n $field.toggleClass('ap-field-valid', isValid);\r\n $field.toggleClass('ap-field-invalid', !isValid);\r\n }\r\n }\r\n\r\n function setFormGroupRequired(isRequired) {\r\n if($formGroupLabel) {\r\n $formGroupLabel.toggleClass('ap-form-group-required', isRequired);\r\n }\r\n }\r\n }\r\n\r\n function getLabel (name, formGroup) {\r\n return name && $document.find('[ap-required-label-for=\"' + name + '\"]').firstOrNull() ||\r\n name && $document.find('label[for=\"' + name + '\"]').firstOrNull() ||\r\n formGroup && formGroup.find('label.control-label').firstOrNull();\r\n }\r\n\r\n return ApFormGroup;\r\n }\r\n]);\r\n","angular.module('aprima-core-ui').directive('apMetadata', ['$compile', 'MetadataService', function ($compile, MetadataService) {\r\n 'use strict';\r\n\r\n var ngMinMaxLengthUnsupportedType = {\r\n time: true,\r\n date: true,\r\n 'datetime-local': true,\r\n week: true,\r\n month: true,\r\n radio: true,\r\n checkbox: true\r\n };\r\n\r\n var ngMinMaxLengthUnsupportedElement = {\r\n select: true,\r\n 'ap-patient-search': true,\r\n 'ap-find-pharmacy': true\r\n };\r\n\r\n var ngMinMaxUnsupportedType = {\r\n checkbox: true,\r\n email: true,\r\n radio: true,\r\n text: true,\r\n url: true\r\n };\r\n\r\n var ngMinMaxUnsupportedElement = {\r\n select: true,\r\n 'ap-patient-search': true,\r\n 'ap-find-pharmacy': true\r\n };\r\n\r\n //Dynamically applies minimum/maximum validation logic based on values in $scope.metadata.\r\n return {\r\n priority: 1001,\r\n terminal: true,\r\n replace: false,\r\n restrict: 'A',\r\n compile: compile\r\n };\r\n\r\n function compile(element, attrs) {\r\n //apMetadata does not need value. If it does not have a value, metadata directives should use the value in ngModel directive\r\n var metadata = attrs.apMetadata || '';\r\n\r\n //apRequired uses the ngModel to determine which property to map to a property on scope.metadata\r\n //so don't pass in ngModel here, otherwise ap-required will be using extra watchers\r\n applyApRequired(element, metadata);\r\n\r\n if(!metadata && attrs.ngModel) {\r\n metadata = MetadataService.convertNgModelExprToMetadataExpr(attrs.ngModel);\r\n }\r\n\r\n if(isMinMaxCompatible(element, attrs)) {\r\n applyNgMinMax(element, metadata);\r\n }\r\n\r\n if(isMinMaxLengthCompatible(element, attrs)) {\r\n applyNgMinMaxLength(element, metadata);\r\n }\r\n\r\n element.removeAttr('ap-metadata');\r\n\r\n return {\r\n post: function postLink(scope, element) {\r\n $compile(element)(scope);\r\n }\r\n };\r\n }\r\n\r\n function applyApRequired(element, metadata) {\r\n element.attr('ap-required', metadata ? metadata + '.IsRequired' : '');\r\n }\r\n\r\n function applyNgMinMax(element, metadata) {\r\n //only set these attributes if they weren't set manually\r\n if(!element.attr('ng-min')) {\r\n element.attr('ng-min', metadata ? metadata + '.Minimum' : '');\r\n }\r\n\r\n if(!element.attr('ng-max')) {\r\n element.attr('ng-max', metadata ? metadata + '.Maximum' : '');\r\n }\r\n }\r\n\r\n function applyNgMinMaxLength(element, metadata) {\r\n //only set these attributes if they weren't set manually\r\n if(!element.attr('ng-minlength')) {\r\n element.attr('ng-minlength', metadata ? metadata + '.MinLength' : '');\r\n }\r\n\r\n if(!element.attr('ng-maxlength')) {\r\n element.attr('ng-maxlength', metadata ? metadata + '.MaxLength' : '');\r\n }\r\n }\r\n\r\n // ng-min, ng-max can work if element is not <select> or one of our custom directives where it doesn't make sense\r\n // and if the input actually supports these attributes (according to angular)\r\n function isMinMaxCompatible(element, attrs) {\r\n return !ngMinMaxUnsupportedElement[element[0].nodeName.toLowerCase()] && !ngMinMaxUnsupportedType[attrs.type];\r\n }\r\n\r\n // ng-minlength, ng-maxlength can work if element is not <select> or one of our custom directives where it doesn't make sense\r\n // and if the input actually supports these attributes (according to angular)\r\n function isMinMaxLengthCompatible(element, attrs) {\r\n return !ngMinMaxLengthUnsupportedElement[element[0].nodeName.toLowerCase()] && !ngMinMaxLengthUnsupportedType[attrs.type];\r\n }\r\n}]);","angular.module('aprima-core-ui').directive('apRequired', ['MetadataService', '_', '$controller', function (MetadataService, _, $controller) {\r\n 'use strict';\r\n //Dynamically applies required validation logic based on values in $scope.metadata.\r\n //adapted from the ngRequired directive.\r\n\r\n function link(scope, elm, attrs, ctrl) {\r\n if (!ctrl || !ctrl.ngModel) return;\r\n var modelCtrl = ctrl.ngModel;\r\n\r\n var fieldId = attrs.name;\r\n var formGroup = ctrl.apFormGroup ?\r\n ctrl.apFormGroup.formGroup :\r\n $controller('ApFormGroupCtrl', {\r\n $scope: scope,\r\n $element: getFormGroup(elm)\r\n }).init(fieldId);\r\n formGroup.addField(fieldId, modelCtrl, elm);\r\n\r\n var apRequiredExpr = false;\r\n\r\n var elementWatches = [];\r\n var metadataWatches = [];\r\n\r\n function validator(modelValue, viewValue) {\r\n var metadata = scope.metadata;\r\n var value = modelValue || viewValue;\r\n\r\n var isRequired = apRequiredExpr;\r\n //if nothing was passed into this ap-required, then look at the metadata\r\n if (metadata && _.isUndefined(isRequired)) {\r\n isRequired = getIsRequired(metadata, scope);\r\n }\r\n formGroup.setFieldRequired(fieldId, isRequired);\r\n\r\n var invalid = isRequired && modelCtrl.$isEmpty(value);\r\n\r\n return !invalid;\r\n }\r\n\r\n modelCtrl.$validators.required = validator;\r\n\r\n var baseModel = attrs.ngModel.split('.');\r\n baseModel.pop();\r\n baseModel = baseModel.join('.');\r\n\r\n //This will trigger when apRequired attribute value changes\r\n //newVal will have the value of the attribute evaluated with the scope\r\n //this is the kind of watch that ng-required does\r\n //the only difference is that ng-required actually watches the value of 'ng-required',\r\n //then uses it to update 'required', and then another\r\n //directive $observe's the value in 'required' and validates when that gets updated\r\n elementWatches.push(scope.$watch(attrs.apRequired, function (newVal) {\r\n if(apRequiredExpr !== newVal) {\r\n //nothing is passed into ap-required, so watch the metadata to see when to update validation\r\n if(_.isUndefined(newVal)) {\r\n addMetadataWatches();\r\n }\r\n //an expression is passed into ap-required, so don't watch the metadata and clear out any current watchers\r\n else {\r\n clearMetadataWatches();\r\n }\r\n }\r\n apRequiredExpr = newVal;\r\n modelCtrl.$validate();\r\n }));\r\n\r\n scope.$on('$destroy', function () {\r\n elementWatches.forEach(function(watchRemover) {\r\n watchRemover();\r\n });\r\n clearMetadataWatches();\r\n formGroup.removeField(fieldId);\r\n });\r\n\r\n function addMetadataWatches() {\r\n //only triggers when metadata reference changes\r\n //but will add watches for the validation group fields too\r\n metadataWatches.push(scope.$watch('metadata', function (newValue) {\r\n modelCtrl.$validate();\r\n\r\n if(newValue){\r\n var metadataObj = newValue.Fields;\r\n var modelField = attrs.ngModel.split('.');\r\n modelField = modelField[modelField.length - 1];\r\n\r\n var fieldMetaData = metadataObj[modelField];\r\n\r\n if(fieldMetaData && fieldMetaData.IsGroupRequired){\r\n for(var i in metadataObj){\r\n if(newValue.Fields[i].ValidationGroup === fieldMetaData.ValidationGroup){\r\n metadataWatches.push(scope.$watch(baseModel + '.' + newValue.Fields[i].FieldName, modelCtrl.$validate));\r\n }\r\n }\r\n }\r\n }\r\n }));\r\n }\r\n\r\n function clearMetadataWatches() {\r\n if(!_.isEmpty(metadataWatches)) {\r\n metadataWatches.forEach(function(watchRemover) {\r\n watchRemover();\r\n });\r\n metadataWatches.length = 0;\r\n }\r\n }\r\n\r\n function getIsRequired(metadata, scope) {\r\n var obj = MetadataService.getObjectFromMetadata(metadata, attrs);\r\n if (obj) {\r\n if(obj.IsGroupRequired){\r\n for(var i in metadata.Fields){\r\n if(metadata.Fields[i].IsGroupRequired && metadata.Fields[i].ValidationGroup === obj.ValidationGroup){\r\n var propertyValue = scope.$eval(baseModel + '.' + metadata.Fields[i].FieldName);\r\n\r\n if(propertyValue){\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return obj.IsRequired;\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n function getFormGroup (elem) {\r\n return elem.parents('.form-group').firstOrNull();\r\n }\r\n\r\n return {\r\n require: {\r\n ngModel: 'ngModel',\r\n apFormGroup: '?^^apFormGroup'\r\n },\r\n restrict: 'A',\r\n link: link\r\n };\r\n}]);","// Adds functionality to current form directives to broadcast event when form submitted state changes\r\n\r\n(function (angular) {\r\n 'use strict';\r\n\r\n formDirective('form', 'E');\r\n formDirective('ngForm', 'EAC');\r\n\r\n function formDirective(name, restrict) {\r\n angular.module('aprima-core-ui').directive(name, [\r\n function() {\r\n return {\r\n restrict: restrict,\r\n require: 'form',\r\n link: {\r\n pre: function preLink(scope, element, attrs, formCtrl) {\r\n\r\n // when $submitted is set then broadcast an event down the scope\r\n var setSubmitted = formCtrl.$setSubmitted;\r\n formCtrl.$setSubmitted = function formSetSubmitted() {\r\n setSubmitted.apply(formCtrl, arguments);\r\n scope.$broadcast('ap:form:submitted');\r\n };\r\n }\r\n }\r\n };\r\n }\r\n ]);\r\n }\r\n})(angular);\r\n","\r\nangular.module('aprima-core-ui').directive('multiCheckbox', function() {\r\n 'use strict';\r\n return {\r\n\r\n restrict: 'EA',\r\n\r\n templateUrl: '/core-ui/views/directives/multiSelectCheckBox.html',\r\n\r\n replace: true,\r\n\r\n transclude: false,\r\n\r\n scope: {\r\n\r\n selectedlist: '=',\r\n\r\n sourcelist: '=',\r\n\r\n all: '=',\r\n\r\n sortBy: '='\r\n\r\n },\r\n\r\n link: function ($scope) {\r\n\r\n $scope.checkbox = {};\r\n\r\n $scope.selectAll = false; //set 'All' checkbox to false\r\n\r\n $scope.showAll = $scope.all === true ? true : false;//to show/hide 'All' checkbox\r\n\r\n $scope.list = $scope.sourcelist;\r\n\r\n //add selected property\r\n $scope.list = _.forEach($scope.list, function(item){\r\n _.assign(item,{selected : false, formattedDate : item.Date.format('YYYY-MM-DD')});\r\n });\r\n\r\n $scope.list = _.orderBy($scope.list, $scope.sortBy, 'desc');\r\n\r\n $scope.selection = [];\r\n\r\n $scope.$watch('selectAll', function (newVal,oldVal) {\r\n if(newVal !== oldVal){\r\n $scope.list = _.forEach($scope.list, function(item){\r\n item.selected = $scope.selectAll;\r\n });\r\n }\r\n }, true);\r\n\r\n $scope.$watchCollection('list|filter:{selected:true}', function (newVal,oldVal) {\r\n if(newVal !== oldVal){\r\n $scope.selectedlist = newVal;\r\n }\r\n });\r\n\r\n }\r\n\r\n };\r\n});\r\n","(function () {\r\n 'use strict';\r\n var directiveParams = [\r\n 'TransitionToHelper',\r\n transitionTo\r\n ];\r\n\r\n angular.module('aprima-core-ui').directive('transitionTo', directiveParams);\r\n angular.module('aprima-core-ui').directive('prmTransitionTo', directiveParams);\r\n\r\n function transitionTo(\r\n TransitionToHelper\r\n ) {\r\n return {\r\n restrict: 'A',\r\n link: link\r\n };\r\n \r\n function link(scope, element, attrs) {\r\n TransitionToHelper.registerTransitionTo(scope, element, attrs, getTransition);\r\n\r\n function getTransition() {\r\n var transition = scope.$eval(attrs.transitionTo || attrs.prmTransitionTo);\r\n\r\n if (angular.isFunction(transition)) {\r\n transition = transition();\r\n }\r\n\r\n return transition;\r\n }\r\n }\r\n }\r\n})();","angular.module('aprima-core-ui').directive('apTransitionToAppointment',\r\n ['TransitionToHelper', 'AppointmentTransitionToHelper',\r\n function (TransitionToHelper, AppointmentTransitionToHelper) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attrs) {\r\n function getTransitionFromElement() {\r\n return AppointmentTransitionToHelper.getTransition(attrs.apptScheduleType, attrs.patientId, attrs.calendarId, attrs.apptEdit, attrs.apptId);\r\n }\r\n\r\n TransitionToHelper.registerTransitionTo(scope, element, attrs, getTransitionFromElement);\r\n }\r\n };\r\n }]);\r\n","angular.module('aprima-core-ui').directive('apTransitionToMessage',\r\n ['TransitionToHelper', 'MessageTransitionToHelper',\r\n function (TransitionToHelper, MessageTransitionToHelper) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attrs) {\r\n function getTransitionFromElement() {\r\n return MessageTransitionToHelper.getTransitionForMessage(attrs.messageTypeId, attrs.messageId, attrs.messageSubTypeId, attrs.createNew);\r\n }\r\n\r\n TransitionToHelper.registerTransitionTo(scope, element, attrs, getTransitionFromElement);\r\n }\r\n };\r\n }]);\r\n","(function () {\r\n 'use strict';\r\n angular.module('aprima-core-ui').factory('TransitionToHelper', [\r\n 'ClickListenerService',\r\n 'TransitionManager',\r\n '$window',\r\n '$rootScope',\r\n TransitionToHelper\r\n ]);\r\n\r\n function TransitionToHelper(\r\n ClickListenerService,\r\n TransitionManager,\r\n $window,\r\n $rootScope\r\n ) {\r\n function registerTransitionTo(scope, element, attrs, fnGetTransition) {\r\n element.addClass('clickable');\r\n\r\n var registerOpts = ClickListenerService.parseOptionsFromLink(scope, element, attrs);\r\n var deregister = ClickListenerService.register(element, handleClick, registerOpts);\r\n scope.$on('$destroy', deregister);\r\n\r\n function handleClick(event) {\r\n event.preventDefault();\r\n if (event.gesture && event.gesture.preventTransitions) {\r\n return;\r\n }\r\n\r\n var transition = fnGetTransition();\r\n var transitioned = TransitionManager.transition(transition);\r\n\r\n if (transitioned) {\r\n $rootScope.$broadcast('close-context-menu');\r\n //allow click event to bubble up, but do NOT handle any other transition-to directives\r\n //use the deepest occurrence to transition-to.\r\n\r\n event.gesture = event.gesture || {};\r\n event.gesture.preventTransitions = true;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n registerTransitionTo: registerTransitionTo,\r\n };\r\n }\r\n})();\r\n","// Put inside of ng-repeat before col-* element\r\n// For reference: getbootstrap.com/css/#responsive-utilities\r\n// getbootstrap.com/css/#grid-responsive-resets\r\nangular.module('aprima-core-ui').directive('ngRepeatColumnReset', [\r\n function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n xs: '<?',\r\n sm: '<?',\r\n md: '<?',\r\n lg: '<?',\r\n index: '<',\r\n display: '@'\r\n //display can be block, inline-block, or inline\r\n },\r\n templateUrl: '/core-ui/views/directives/ngRepeatColumnReset.html'\r\n };\r\n }\r\n]);","angular.module('aprima-core-ui').component('apAppointmentBrief', {\r\n bindings: {\r\n appointment: '<',\r\n showDuration: '<?'\r\n },\r\n templateUrl: '/core-ui/views/directives/partials/apAppointmentBrief.html',\r\n controller: ['DateUtilities', function(DateUtilities) {\r\n 'use strict';\r\n\r\n // this logic is in $onInit instead of $onChanges because it's currently used with one-time bindings\r\n this.$onInit = function init() {\r\n if(this.appointment && this.appointment.AppointmentType && !this.appointment.AppointmentType.Name) {\r\n this.appointment.AppointmentType.Name = this.appointment.AppointmentType.Description;\r\n }\r\n this.getDuration = DateUtilities.getDurationString;\r\n };\r\n }]\r\n});","angular.module('aprima-core-ui')\r\n .directive('apAppointmentListItem', ['SettingService', '$rootScope', 'AppointmentTransitionToHelper', 'DateUtilities', 'AppointmentScheduleTypes',\r\n function (SettingService, $rootScope, AppointmentTransitionToHelper, DateUtilities, AppointmentScheduleTypes) {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n appt: '=',\r\n transitionType: '@',\r\n displayDateType: '@'\r\n },\r\n link: function(scope) {\r\n var settings = SettingService.getAppointmentsListSettings(),\r\n displayEndTime = settings != null ? settings.displayEndTime : false, displayStartTime, displayDate;\r\n\r\n if(scope.displayDateType === 'Date'){\r\n displayStartTime = false;\r\n displayEndTime = false;\r\n displayDate = true;\r\n }\r\n else{\r\n displayStartTime = !displayEndTime;\r\n displayDate = false;\r\n }\r\n\r\n var scheduleType = AppointmentScheduleTypes[scope.appt.ScheduleType];\r\n scope.isPatientVisit = scheduleType === AppointmentScheduleTypes.PatientVisit;\r\n scope.scheduleTypeDescription = scheduleType && scheduleType.name;\r\n\r\n if(scope.isPatientVisit) {\r\n scope.appt.Age = DateUtilities.getPersonAgeAbbr(scope.appt.BirthDate);\r\n }\r\n\r\n scope.openAppointmentContextMenu = function openAppointmentContextMenu() {\r\n $rootScope.setOptsForApptContextMenu({appointment: scope.appt});\r\n };\r\n\r\n scope.closeAppointmentContextMenu = function closeAppointmentContextMenu() {\r\n $rootScope.setOptsForApptContextMenu(null);\r\n };\r\n\r\n scope.getTransition = function getTransition() {\r\n return scope.appt.PatientId && scope.transitionType !== 'AppointmentDetails' ?\r\n {appRoute: 'apptlistPatientDashboard', opts: {id: scope.appt.PatientId}} :\r\n AppointmentTransitionToHelper.getTransition(scope.appt.ScheduleType, scope.appt.PatientId, null, false, scope.appt.Id);\r\n };\r\n\r\n scope.displayEndTime = displayEndTime;\r\n scope.displayStartTime = displayStartTime;\r\n scope.displayDate = displayDate;\r\n },\r\n template: '<ng-include src=\"getTemplateUrl()\"/>',\r\n controller: function($scope){\r\n $scope.getTemplateUrl = function() {\r\n return $scope.appt.dataType === 'template' ? \r\n '/core-ui/views/directives/partials/apAppointmentListTemplateSlot.html' :\r\n '/core-ui/views/directives/partials/apAppointmentListItem.html';\r\n };\r\n }\r\n };\r\n }]);\r\n","angular.module('aprima-core-ui')\r\n.directive('apDragDrop', [function () {\r\n 'use strict';\r\n\r\n return {\r\n scope: {\r\n index: '=',\r\n startIndex: '&',\r\n dropIndex: '&', \r\n }, \r\n link: function (scope,element) {\r\n \r\n var sIndex = -1;\r\n var dindex = -1;\r\n var i = element.find('[id*=\"ph\"]');\r\n \r\n\r\n i[0].draggable = true;\r\n\r\n i[0].addEventListener('dragstart', function ondragstart() {\r\n sIndex = scope.index;\r\n scope.startIndex({ssIndex:sIndex}); \r\n });\r\n \r\n i[0].addEventListener('drop', function ondrop(evt) {\r\n evt.preventDefault();\r\n dindex = scope.index; \r\n scope.dropIndex({ddIndex:dindex}); \r\n });\r\n\r\n i[0].addEventListener('dragover', function ondrgaover(evt) { \r\n evt.preventDefault(); }); \r\n }\r\n };\r\n\r\n}]);","angular.module('aprima-core-ui').directive('apMessageAssignTo', [function () {\r\n 'use strict';\r\n\r\n return {\r\n scope: {\r\n message: '=',\r\n userList: '=',\r\n users: '=',\r\n clickHandler: '=',\r\n reassignHandler: '='\r\n },\r\n templateUrl: '/core-ui/views/directives/apMessageAssignTo.html',\r\n link: function (scope) {\r\n\r\n if (!scope.message) {\r\n throw new Error('apMessageAssignTo: message is undefined');\r\n }\r\n if (!scope.userList) {\r\n throw new Error('apMessageAssignTo: userList is undefined');\r\n }\r\n if (!scope.clickHandler) {\r\n throw new Error('apMessageAssignTo: clickHandler is undefined');\r\n }\r\n if (!scope.reassignHandler) {\r\n throw new Error('apMessageAssignTo: reassignHandler is undefined');\r\n }\r\n if (!scope.users) {\r\n throw new Error('apMessageAssignTo: users is undefined');\r\n }\r\n\r\n }\r\n };\r\n\r\n}]);","angular.module('aprima-core-ui').component('apMessageListItem', {\r\n bindings: {\r\n message: '<',\r\n narrow: '<?'\r\n },\r\n templateUrl: '/core-ui/views/directives/partials/apMessageListItem.html',\r\n controller: ['CurrentUser', function(CurrentUser) {\r\n 'use strict';\r\n\r\n // this logic is in $onInit instead of $onChanges because it's meant to be used with one time bindings,\r\n // not with a changing object\r\n this.$onInit = function init() {\r\n var currentUserId = CurrentUser.get().userId;\r\n\r\n this.isRead = function isRead() {\r\n return this.message && (currentUserId === this.message.LastReadByUid);\r\n };\r\n };\r\n }]\r\n});\r\n\r\n","angular.module('aprima-core-ui').component('apVisitBrief', {\r\n bindings: {\r\n visit: '<',\r\n showDuration: '<?'\r\n },\r\n transclude: true,\r\n templateUrl: '/core-ui/views/directives/partials/apVisitBrief.html',\r\n controller:['DateUtilities' , function(DateUtilities) {\r\n 'use strict';\r\n\r\n this.$onInit = function init() {\r\n this.getDuration = DateUtilities.getDurationString;\r\n };\r\n }]\r\n});","angular.module('aprima-core-ui').directive('scrollTo', ['$parse', 'ScrollerService', '$window', function ($parse, ScrollerService, $window) {\r\n 'use strict';\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attr) {\r\n var parsedAttr = $parse(attr.scrollTo);\r\n scope.$evalAsync(function(){\r\n if(parsedAttr(scope)){\r\n var scroller = ScrollerService.getScroller(attr.scrollerId) || $window;\r\n scroller.scrollTo(0, element[0].offsetTop);\r\n }\r\n });\r\n }\r\n };\r\n}]);","angular.module('aprima-core-ui').directive('select', [function () {\r\n 'use strict';\r\n\r\n return {\r\n restrict: 'E',\r\n compile : function(element){\r\n //fix iOS off by one error for all select\r\n element.prepend($('<option value=\"\"></option>'));\r\n }\r\n };\r\n}]);\r\n","angular.module('aprima-core-ui')\r\n .directive('stRatio', ['$parse', function($parse) {\r\n 'use strict';\r\n\r\n return {\r\n link: function (scope, element, attr) {\r\n var ratio = $parse(attr.stRatio)(scope);\r\n\r\n element.css('width', ratio + '%');\r\n }\r\n };\r\n }]);","angular.module('aprima-core-ui').filter('apFilterFeature', ['ServerInfoRepository', '_', function (ServerInfoRepository, _) {\r\n 'use strict';\r\n return function (inputCollection, featureParam) {\r\n var fn = _.isArray(inputCollection) ? _.filter : _.pickBy;\r\n\r\n return fn(inputCollection, function(item) {\r\n if(item[featureParam]) {\r\n\r\n var splitRequiredFeatures = item[featureParam].split(',');\r\n var isFeatureSupported = ServerInfoRepository.isFeatureSupported(splitRequiredFeatures);\r\n\r\n if(isFeatureSupported){\r\n return true;\r\n }\r\n }\r\n else{\r\n return true;\r\n }\r\n });\r\n };\r\n}]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').filter('apHasFeature', [\r\n '_',\r\n 'ServerInfoRepository',\r\n apHasFeature,\r\n ]);\r\n\r\n function apHasFeature(\r\n _,\r\n ServerInfoRepository\r\n ) {\r\n return hasFeature;\r\n\r\n function hasFeature(features) {\r\n if(!features) {\r\n return false;\r\n }\r\n\r\n var featureList;\r\n if(_.isArray(features)) {\r\n featureList = features;\r\n }\r\n else if(_.isString(features)) {\r\n featureList = features.split(',');\r\n }\r\n else {\r\n return false;\r\n }\r\n\r\n var featureResult = ServerInfoRepository.isFeatureSupported(featureList);\r\n\r\n return featureResult;\r\n }\r\n }\r\n\r\n})(window.angular);","angular.module('aprima-core-ui').filter('apSsnFilter', function () {\r\n 'use strict';\r\n return function (value) {\r\n\r\n if (value) {\r\n var val = value.toString().replace(/\\D/g, '');\r\n\r\n var len = val.length;\r\n if (len < 4) {\r\n return val;\r\n }\r\n else if (3 < len && len < 6) {\r\n\r\n return val.substr(0, 3) + '-' + val.substr(3);\r\n }\r\n else if (len > 5) {\r\n\r\n return val.substr(0, 3) + '-' + val.substr(3, 2) + '-' + val.substr(5, 4);\r\n }\r\n }\r\n return value;\r\n };\r\n }\r\n);\r\n","(function() {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('GeneralNotesModal', [\r\n '$uibModal',\r\n GeneralNotesModal\r\n ]);\r\n\r\n angular.module('aprima-core-ui').controller('GeneralNotesModalCtrl', [\r\n '_',\r\n '$q',\r\n '$uibModalInstance',\r\n '$window',\r\n 'currentNote',\r\n 'debounce',\r\n 'DeviceSettings',\r\n 'disableFormatting',\r\n 'GeneralNotesRepository',\r\n 'generalNoteTypeId',\r\n 'generalNoteTypeKey',\r\n 'gettext',\r\n 'ListService',\r\n 'maxCharacters',\r\n 'ServerInfoRepository',\r\n 'title',\r\n 'toaster',\r\n 'uxConstants',\r\n GeneralNotesModalCtrl,\r\n ]);\r\n\r\n function GeneralNotesModal(\r\n $modal\r\n ) {\r\n return {\r\n openModal: openModal,\r\n openModalOnly: openModalOnly,\r\n };\r\n\r\n function openModal(title, currentNote, disableFormatting, maxCharacters, generalNoteTypeKey, generalNoteTypeId) {\r\n return openModalOnly(title, currentNote, disableFormatting, maxCharacters, generalNoteTypeKey, generalNoteTypeId).result;\r\n }\r\n\r\n function openModalOnly(title, currentNote, disableFormatting, maxCharacters, generalNoteTypeKey, generalNoteTypeId) {\r\n var modalInstance = $modal.open({\r\n templateUrl: '/core-ui/modal-views/generalNotesModal.html',\r\n windowClass: 'modal-full',\r\n controller: 'GeneralNotesModalCtrl',\r\n controllerAs: 'vm',\r\n resolve: {\r\n currentNote: function() { return currentNote; },\r\n generalNoteTypeKey: function() {return generalNoteTypeKey;},\r\n generalNoteTypeId: function() {return generalNoteTypeId;},\r\n disableFormatting: function() {return disableFormatting;},\r\n maxCharacters: function() {return maxCharacters;},\r\n title: function() {return title;},\r\n },\r\n });\r\n\r\n return modalInstance;\r\n }\r\n }\r\n\r\n function GeneralNotesModalCtrl(\r\n _,\r\n $q,\r\n $modalInstance,\r\n $window,\r\n currentNote,\r\n debounce,\r\n DeviceSettings,\r\n disableFormatting,\r\n GeneralNotesRepository,\r\n generalNoteTypeId,\r\n generalNoteTypeKey,\r\n gettext,\r\n ListService,\r\n maxCharacters,\r\n ServerInfoRepository,\r\n title,\r\n toaster,\r\n uxConstants\r\n ) {\r\n var vm = this;\r\n\r\n vm.generalNotesSupported = ServerInfoRepository.isFeatureSupported('GeneralNotes');\r\n vm.currentNote = currentNote || '';\r\n vm.disableFormatting = !!disableFormatting;\r\n vm.title = title || 'General Notes';\r\n vm.maxCharacters = maxCharacters;\r\n vm.searchText = '';\r\n vm.tinymceHeight = $window.innerHeight-240; //modal padding, header footer height, right section padding\r\n vm.includeInactive = false;\r\n vm.searchGeneralNoteType = null;\r\n var originalGeneralNoteType = null;\r\n vm.generalNoteTypeList = [];\r\n vm.loadingSearch = false;\r\n vm.initialLoading = false;\r\n\r\n vm.cancel = cancel;\r\n vm.ok = ok;\r\n vm.getRemainingCharacters = getRemainingCharacters;\r\n vm.shouldSwapButtons = shouldSwapButtons;\r\n\r\n if(!vm.generalNotesSupported) {\r\n return;\r\n }\r\n\r\n // use result.finally in case the modal gets closed from outside of this controller\r\n $modalInstance.result.finally(function() {\r\n if(generalNoteTypeKey && vm.searchGeneralNoteType && (!originalGeneralNoteType || originalGeneralNoteType.Id !== vm.searchGeneralNoteType.Id)) {\r\n var savePromise = GeneralNotesRepository.saveGeneralNoteTypeSetting(generalNoteTypeKey, vm.searchGeneralNoteType);\r\n return savePromise;\r\n }\r\n });\r\n\r\n vm.changeSearchCriteria = debounce(uxConstants.searchDebounceTime, searchGeneralNotes);\r\n vm.appendNote = appendNote;\r\n\r\n onLoad();\r\n \r\n function onLoad(){\r\n vm.initialLoading = true;\r\n var promises = [];\r\n if(generalNoteTypeKey && !generalNoteTypeId) {\r\n promises.push(GeneralNotesRepository.getGeneralNoteType(generalNoteTypeKey).then(function(data) {\r\n vm.searchGeneralNoteType = data && data.plain ? data.plain() : data;\r\n if (vm.searchGeneralNoteType){\r\n originalGeneralNoteType = vm.searchGeneralNoteType;\r\n searchGeneralNotes();\r\n }\r\n }));\r\n }\r\n\r\n promises.push(ListService.getList('generalnotetypes').then(function(result) {\r\n vm.generalNoteTypeList = result;\r\n\r\n if(!vm.searchGeneralNoteType && generalNoteTypeId) {\r\n vm.searchGeneralNoteType = _.find(vm.generalNoteTypeList, {Id: generalNoteTypeId});\r\n if (vm.searchGeneralNoteType){\r\n originalGeneralNoteType = vm.searchGeneralNoteType;\r\n searchGeneralNotes();\r\n }\r\n }\r\n }));\r\n \r\n $q.all(promises).finally(function() {\r\n vm.initialLoading = false;\r\n });\r\n }\r\n\r\n function appendNote(entry) {\r\n if (!!vm.maxCharacters && (vm.maxCharacters < (vm.currentNote.length + entry.Notes.length))) {\r\n toaster.pop({\r\n type: 'error',\r\n title: gettext('Cannot Insert'),\r\n body: gettext('The note you are inserting would exceed the maximum number of characters allowed.')\r\n });\r\n return;\r\n }\r\n\r\n vm.currentNote = vm.currentNote + entry.Notes;\r\n }\r\n\r\n function searchGeneralNotes() {\r\n vm.loadingSearch = true;\r\n var generalNoteTypeId = vm.searchGeneralNoteType && vm.searchGeneralNoteType.Id;\r\n GeneralNotesRepository.search(vm.searchText, generalNoteTypeId, vm.includeInactive)\r\n .then(function(data){\r\n vm.generalNoteList = data && data.plain();\r\n })\r\n .finally(function(){\r\n vm.loadingSearch = false;\r\n });\r\n }\r\n\r\n function getRemainingCharacters() {\r\n var maxLength = vm.maxCharacters;\r\n\r\n if (vm.currentNote) {\r\n maxLength -= vm.currentNote.length;\r\n }\r\n\r\n return maxLength;\r\n }\r\n\r\n function cancel() {\r\n $modalInstance.dismiss();\r\n }\r\n \r\n function ok() {\r\n $modalInstance.close(vm.currentNote);\r\n }\r\n\r\n function shouldSwapButtons() {\r\n return DeviceSettings.isPrm;\r\n }\r\n }\r\n})();","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('MultiSelectListItemModal', [\r\n '$uibModal',\r\n MultiSelectListItemModal,\r\n ]);\r\n\r\n angular.module('aprima-core-ui').controller('MultiSelectListItemModalCtrl', [\r\n '_',\r\n '$uibModalInstance',\r\n 'collection',\r\n 'debounce',\r\n 'formatter',\r\n 'orderFn',\r\n 'selectedItems',\r\n MultiSelectListItemModalCtrl,\r\n ]);\r\n\r\n function MultiSelectListItemModal(\r\n $modal\r\n ) {\r\n var service = {\r\n openModal: openModal,\r\n };\r\n\r\n return service;\r\n\r\n function openModal(collection, selectedItems, formatter, orderFn) {\r\n var modal = $modal.open({\r\n backdrop: 'static',\r\n templateUrl: '/core-ui/modal-views/multi-select-list-item-modal.html',\r\n controller: 'MultiSelectListItemModalCtrl',\r\n controllerAs: 'vm',\r\n resolve: {\r\n collection: function() {\r\n return collection;\r\n },\r\n selectedItems: function() {\r\n return selectedItems;\r\n },\r\n formatter: function() {\r\n return formatter;\r\n },\r\n orderFn: function() {\r\n return orderFn;\r\n },\r\n },\r\n });\r\n\r\n return modal.result;\r\n }\r\n }\r\n\r\n function MultiSelectListItemModalCtrl(\r\n _,\r\n $modalInstance,\r\n collection,\r\n debounce,\r\n formatter,\r\n orderFn,\r\n selectedItems\r\n ) {\r\n var vm = this;\r\n\r\n vm.cancel = cancel;\r\n vm.done = done;\r\n vm.clear = debounce(100, clear);\r\n vm.load = debounce(200, loadData);\r\n vm.getItemOrder = getItemOrder;\r\n vm.countSelected = countSelected;\r\n vm.items = [];\r\n vm.formatter = formatter;\r\n\r\n activate();\r\n\r\n function activate() {\r\n loadData();\r\n orderFn = orderFn || _.identity;\r\n }\r\n\r\n function loadData() {\r\n vm.items = _.compact(collection);\r\n\r\n if(selectedItems) {\r\n _.intersectionBy(vm.items, selectedItems, 'Id').forEach(function(item) {\r\n item.previouslySelected = true;\r\n item.selected = true;\r\n });\r\n }\r\n }\r\n\r\n function cancel() {\r\n $modalInstance.dismiss();\r\n }\r\n\r\n function clear() {\r\n if(!vm.items) {\r\n return;\r\n }\r\n\r\n _.forEach(vm.items, function(item) {\r\n if(item) {\r\n item.selected = false;\r\n }\r\n });\r\n }\r\n\r\n function done() {\r\n var selected = _.filter(vm.items, 'selected');\r\n $modalInstance.close(selected);\r\n }\r\n\r\n function countSelected() {\r\n if(!vm.items) {\r\n return 0;\r\n }\r\n\r\n var count = _.sumBy(vm.items, function(val) {\r\n var num = val && val.selected ? 1 : 0;\r\n return num;\r\n });\r\n\r\n return count;\r\n }\r\n\r\n function getItemOrder(item) {\r\n if(!item) {\r\n return '2';\r\n }\r\n\r\n var order = '' + (item.previouslySelected ? 0 : 1) + orderFn(item);\r\n\r\n return order;\r\n }\r\n }\r\n\r\n})(window.angular);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('apConfirm', [\r\n '$uibModal',\r\n apConfirm\r\n ]);\r\n\r\n function apConfirm(\r\n $modal\r\n ) {\r\n\r\n return open;\r\n\r\n function open(message, okText, cancelText, size) {\r\n var confirmModal = $modal.open({\r\n controller: [\r\n '$uibModalInstance',\r\n 'message',\r\n 'okText',\r\n 'cancelText',\r\n ApConfirmCtrl\r\n ],\r\n controllerAs: 'vm',\r\n backdrop: 'static',\r\n templateUrl: '/core-ui/views/confirm.html',\r\n size: size || 'sm', // xs, sm, md, lg\r\n resolve: {\r\n message: function() {\r\n return message;\r\n },\r\n okText: function() {\r\n return okText;\r\n },\r\n cancelText: function() {\r\n return cancelText;\r\n },\r\n },\r\n });\r\n\r\n return confirmModal.result;\r\n }\r\n }\r\n\r\n function ApConfirmCtrl(\r\n $modalInstance,\r\n message,\r\n okText,\r\n cancelText\r\n ) {\r\n var vm = this;\r\n\r\n vm.message = message;\r\n vm.okText = okText || 'OK';\r\n vm.cancelText = cancelText || 'Cancel';\r\n vm.cancel = cancel;\r\n vm.close = close;\r\n\r\n function cancel() {\r\n $modalInstance.dismiss();\r\n }\r\n\r\n function close(value) {\r\n $modalInstance.close(value);\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-core-ui').factory('apConfirmService', [\r\n 'apConfirm',\r\n apConfirmService\r\n ]);\r\n\r\n function apConfirmService(\r\n apConfirm\r\n ) {\r\n\r\n return {\r\n confirm: confirm,\r\n };\r\n\r\n function confirm(message, okText, cancelText, size) {\r\n return apConfirm(message, okText, cancelText, size);\r\n }\r\n }\r\n})(window.angular);\r\n","angular.module('aprima-core-ui').factory('BarcodeScanningService',\r\n ['Bridge',\r\n function (Bridge) {\r\n 'use strict';\r\n var id = 0;\r\n\r\n function scanBarcode (scope, scanResultCallback) {\r\n var barcodeId = id++;\r\n Bridge.scanBarcode(barcodeId);\r\n\r\n var unregister = Bridge.on('scannedBarcodeResult', scope, function (value) {\r\n unregister();\r\n\r\n if (parseInt(value.Id) === barcodeId) {\r\n scanResultCallback(value.StatusMessage, value.ScannedResultText);\r\n }\r\n });\r\n }\r\n\r\n return {\r\n scanBarcode: scanBarcode\r\n };\r\n }\r\n ]\r\n);","(function () {\r\n 'use strict';\r\n angular.module('aprima-core-ui').factory('ClickListenerService', [\r\n '$parse',\r\n '$window',\r\n 'DeviceSettings',\r\n 'NgZoneService',\r\n ClickListenerService\r\n ]);\r\n\r\n function ClickListenerService(\r\n $parse,\r\n $window,\r\n DeviceSettings,\r\n NgZoneService\r\n ) {\r\n // These changes to wrap the functions using NgZoneService.contextRun() (to runOutsideAngular) are based off of hammer_gestures.ts in Angular\r\n // where the creation of the Hammer instance, and .on() are wrapped in a similar way.\r\n // This can also be done carefully in other services, components, etc that get referenced by UpgradeComponents,\r\n // to fix issues where the the page is really slow because of too much stuff happening inside of the Angular zone,\r\n // which is then triggering the change detection.\r\n // This is more important for the hammer events than the click events, so if it's causing issues with the click events, then\r\n // this service could be changed to just wrap the hammer functions below, like registerHmClick, instead of all 3 of these\r\n // top-level functions that are returned.\r\n\r\n return {\r\n parseOptionsFromLink: parseOptionsFromLink,\r\n register: register,\r\n registerFromDirective: registerFromDirective,\r\n };\r\n\r\n function parseOptionsFromLink(scope, element, attrs) {\r\n return {\r\n hmOptions: $parse(attrs.hmOptions)(scope, {}),\r\n hmPropagation: $parse(attrs.hmPropagation)(scope, {}),\r\n hmStopPropagation: $parse(attrs.hmStopPropagation)(scope, {}),\r\n hmTapOnly: $parse(attrs.hmTapOnly)(scope, {}),\r\n };\r\n }\r\n\r\n function shouldUseHammer() {\r\n // Hammer doesn't work on some Windows 7/Server 2008 R2 machines,\r\n // so always fallback to ngClick when in PRM.\r\n return !DeviceSettings.isPrm &&\r\n Hammer !== 'undefined' &&\r\n $window.addEventListener;\r\n }\r\n\r\n function register(element, handlerFn, handlerOpts) {\r\n var result = NgZoneService.contextRun(function (zoneAwareObject) {\r\n return zoneAwareRegister(element, handlerFn, handlerOpts, zoneAwareObject);\r\n });\r\n return result;\r\n }\r\n\r\n // This zoneAwareObject always needs to be the last parameter to this function.\r\n function zoneAwareRegister(element, handlerFn, handlerOpts, zoneAwareObject) {\r\n var opts = {\r\n // Enable propagation functionality for this element.\r\n // Propagation needs to be enabled for the child element\r\n // to be able to receive the Hammer event\r\n // when both parent and child have been registered for Hammer events.\r\n hmPropagation: false,\r\n // Always call $event.stopPropagation().\r\n // Automatically turns on Hammer propagation.\r\n hmStopPropagation: false,\r\n // If false, treat the tap and press events identically.\r\n // If true, only listen for tap events using default timings.\r\n hmTapOnly: false,\r\n };\r\n\r\n angular.extend(opts, handlerOpts);\r\n\r\n var zoneAwareHandlerFn = zoneAwareObject.wrapToRunInZoneIfNecessary(handlerFn);\r\n\r\n if (shouldUseHammer()) {\r\n return registerHmClick(element, hmHandler, opts);\r\n } else {\r\n return registerNgClick(element, ngHandler);\r\n }\r\n\r\n function ngHandler(event) {\r\n zoneAwareHandlerFn(event);\r\n\r\n if (opts.hmStopPropagation) {\r\n event.stopPropagation();\r\n }\r\n }\r\n\r\n function hmHandler(event) {\r\n var stopPropagation = event.stopPropagation;\r\n if(stopPropagation && (opts.hmPropagation || opts.hmStopPropagation)) {\r\n event.stopPropagation = function() {\r\n stopSrcPropagation(event);\r\n stopPropagation.apply(event, arguments);\r\n };\r\n }\r\n\r\n if (!event.isDefaultPrevented) {\r\n event.isDefaultPrevented = function clsIsDefaultPrevented() {\r\n return event.srcEvent && event.srcEvent.defaultPrevented;\r\n };\r\n }\r\n\r\n ngHandler(event);\r\n }\r\n }\r\n\r\n function stopSrcPropagation(hammerEv) {\r\n var srcEvent = hammerEv && hammerEv.srcEvent;\r\n if(!(srcEvent instanceof Event)) {\r\n return;\r\n }\r\n\r\n // propagating-hammerjs redefines stopPropagation, so make sure we are calling the prototype one\r\n Event.prototype.stopPropagation.call(srcEvent);\r\n }\r\n\r\n function registerFromDirective(scope, element, attrs, attributeName) {\r\n var result = NgZoneService.contextRun(function (zoneAwareObject) {\r\n return zoneAwareRegisterFromDirective(scope, element, attrs, attributeName, zoneAwareObject);\r\n });\r\n return result;\r\n }\r\n\r\n // This zoneAwareObject always needs to be the last parameter to this function.\r\n function zoneAwareRegisterFromDirective(scope, element, attrs, attributeName, zoneAwareObject) {\r\n var registerOpts = parseOptionsFromLink(scope, element, attrs);\r\n // calling $parse with 3 arguments, rather than just the expression comes from ngclick in 1.5.x\r\n var parsedFn = $parse(attrs[attributeName], null, true);\r\n\r\n var deregister = zoneAwareRegister(element, clickHandler, registerOpts, zoneAwareObject);\r\n\r\n scope.$on('$destroy', deregister);\r\n\r\n function clickHandler(event) {\r\n // Previously (look at comment below), this was not wrapped in NgZoneService.run because it didn't need to manually trigger a run of Angular change detection,\r\n // but the reason I'm realizing that it needs to now is that this callback could be calling back into Angular code (which means it needs to be in the Ng Zone).\r\n // And I would rather handle fixing that here, than having to know in specific places if we need to run certain Angular code inside of the Ng Zone.\r\n // This situation would happen either directly or indirectly from an UpgradeComponent or upgraded injectable.\r\n // This handler gets wrapped to run inside of the Ng Zone above, when it is passed into register().\r\n // =================================================================================================================\r\n // Previous logic:\r\n // We currently don't need to run this inside of NgZone in hybrid mode,\r\n // because it will detect changes from this digest cycle started by scope.$apply.\r\n // The reason is because of the ForceLoadAngularComponent, which is downgraded with propagateDigest = true,\r\n // which causes the Angular change detection to run on every $digest.\r\n // If that changes, then code that is doing scope.$apply outside of Angular, like this line will need to be wrapped in NgZoneService.run().\r\n // For reference: https://angular.io/api/upgrade/static/downgradeComponent#downgradecomponent\r\n // =================================================================================================================\r\n scope.$apply(callback);\r\n\r\n function callback() {\r\n parsedFn(scope, { $event: event });\r\n } \r\n }\r\n }\r\n\r\n /* Adapted from:\r\n * angular-hammer v1.2.4\r\n * (c) 2013 Monospaced http://monospaced.com\r\n * License: MIT\r\n */\r\n /* This fixes an issue with hm-tap where longer taps do not register as taps but as presses.\r\n Hammerjs requires a maximum tap time of 250ms which seemed to be too short when actually using devices.\r\n\r\n This change makes hm-click fire for taps AND presses.\r\n\r\n hm-click should NOT be used in cases where a press and tap are expected to be handled differently\r\n */\r\n function registerHmClick(element, handlerFn, opts) {\r\n // don't create multiple Hammer instances per element\r\n var hammer = element.data('hammer');\r\n var shouldDestroy = false;\r\n if (!hammer) {\r\n hammer = new Hammer.Manager(element[0], opts.hmOptions);\r\n\r\n // we are creating a new instance in this function,\r\n // so it needs to be cleaned up in here as well, below in the returned dereg function\r\n shouldDestroy = true;\r\n\r\n if (opts.hmPropagation || opts.hmStopPropagation) {\r\n hammer = propagating(hammer);\r\n }\r\n\r\n element.data('hammer', hammer);\r\n }\r\n\r\n // Make sure that a click event is ignored when it was already handled as a tap or press.\r\n $window.PreventGhostClick(element[0]);\r\n\r\n // bind Hammer touch event\r\n if (opts.hmTapOnly) {\r\n hammer.add(new Hammer.Tap());\r\n\r\n hammer.on('tap', handlerFn);\r\n } else {\r\n hammer.add(new Hammer.Tap({ time: 499 }));\r\n hammer.add(new Hammer.Press({ time: 500 }));\r\n\r\n hammer.on('tap', handlerFn);\r\n hammer.on('pressup', handlerFn);\r\n }\r\n\r\n return function hmCleanup() {\r\n // unbind Hammer touch event\r\n hammer.off('tap', handlerFn);\r\n\r\n if (!opts.hmTapOnly) {\r\n hammer.off('pressup', handlerFn);\r\n }\r\n\r\n if (shouldDestroy) {\r\n hammer.destroy();\r\n }\r\n };\r\n }\r\n\r\n function registerNgClick(element, handlerFn) {\r\n element.on('click', handlerFn);\r\n\r\n return function ngCleanup() {\r\n element.off('click', handlerFn);\r\n };\r\n }\r\n }\r\n})();","angular.module('aprima-core-ui').factory('IcdCodeModal', ['$uibModal', '$rootScope', '$q', function ($modal, $rootScope, $q) {\r\n 'use strict';\r\n\r\n function openModal(code, codeType) {\r\n var deferred = $q.defer();\r\n \r\n var modalInstance = $modal.open({\r\n animation: false,\r\n templateUrl: '/core-ui/views/directives/apIcdCodeModal.html',\r\n controller: 'apIcdCodeModalCtrl',\r\n resolve: {\r\n searchParams: function () {\r\n return {\r\n code: code,\r\n codeType: codeType\r\n };\r\n }\r\n },\r\n backdrop: 'static',\r\n windowClass: 'modal-full'\r\n });\r\n \r\n modalInstance.result.then(function(result){\r\n deferred.resolve(result);\r\n }).catch(function(err){\r\n deferred.reject(err);\r\n modalInstance.dismiss();\r\n });\r\n \r\n return deferred.promise;\r\n }\r\n \r\n return {\r\n openModal: openModal\r\n };\r\n}]);","(function(angular){\r\n 'use strict';\r\n\r\n var validationKey = 'apMultiSelectButton';\r\n\r\n angular.module('aprima-core-ui').factory('ApMultiSelectButton', [\r\n '_',\r\n ApMultiSelectButton,\r\n ]);\r\n\r\n function ApMultiSelectButton(\r\n _\r\n ) {\r\n var service = {\r\n init: init,\r\n };\r\n\r\n return service;\r\n \r\n\r\n function init(ctrl, onOpen, itemFormatter, orderFn, element) {\r\n itemFormatter = itemFormatter || _.identity;\r\n orderFn = orderFn || _.identity;\r\n\r\n ctrl.innerValue = undefined;\r\n ctrl.onClick = onClick;\r\n ctrl.$onInit = onInit;\r\n\r\n\r\n function onInit() {\r\n ctrl.ngModelCtrl.$isEmpty = isEmpty;\r\n ctrl.ngModelCtrl.$render = render;\r\n ctrl.ngModelCtrl.$formatters.push(defaultFormatterParser);\r\n ctrl.ngModelCtrl.$parsers.push(defaultFormatterParser);\r\n }\r\n\r\n function render() {\r\n var value = ctrl.ngModelCtrl.$viewValue;\r\n\r\n if(_.isArray(value)) {\r\n var resultValue = _(value)\r\n .sortBy(orderFn)\r\n .map(itemFormatter)\r\n .join(', ');\r\n\r\n ctrl.innerValue = resultValue;\r\n\r\n return;\r\n }\r\n\r\n ctrl.innerValue = undefined;\r\n }\r\n\r\n function isEmpty(value) {\r\n return !value || !value.length;\r\n }\r\n\r\n function onClick() {\r\n if(!ctrl.ngModelCtrl) {\r\n return;\r\n }\r\n\r\n onOpen(ctrl.ngModelCtrl.$viewValue)\r\n .then(function(result) {\r\n ctrl.ngModelCtrl.$setViewValue(result || []);\r\n ctrl.ngModelCtrl.$render();\r\n })\r\n .finally(function() {\r\n // after closing, don't keep button focused\r\n if(element) {\r\n element.blur();\r\n }\r\n });\r\n }\r\n\r\n function defaultFormatterParser(value) {\r\n if(_.isNil(value)) {\r\n ctrl.ngModelCtrl.$setValidity(validationKey, true);\r\n return null;\r\n }\r\n\r\n if(!_.isArray(value)) {\r\n ctrl.ngModelCtrl.$setValidity(validationKey, false);\r\n return null;\r\n }\r\n\r\n // cloneDeep so that mutating an object in either array won't have side effects on the other one\r\n var newArray = _(value)\r\n .filter(itemFormatter)\r\n .cloneDeep();\r\n\r\n // if the filtered array is the same length, then there are no invalid items\r\n if(newArray.length === value.length) {\r\n ctrl.ngModelCtrl.$setValidity(validationKey, true);\r\n }\r\n else {\r\n ctrl.ngModelCtrl.$setValidity(validationKey, false);\r\n }\r\n\r\n return newArray;\r\n }\r\n }\r\n }\r\n\r\n})(window.angular);","angular.module('aprima-core-ui').factory('inputSelection', [ \r\n function() {\r\n 'use strict';\r\n \r\n return {\r\n getChildElement: getChildElement,\r\n trySelectStr: trySelectStr,\r\n };\r\n \r\n function getChildElement(element) {\r\n var childElement = element[0];\r\n if(!childElement.setSelectionRange) {\r\n throw new Error('inputSelection won\\'t work with ' + childElement + ' because it doesn\\'t' +\r\n ' support \\'setSelectionRange\\'');\r\n }\r\n return childElement;\r\n }\r\n \r\n function trySelectStr(element, ngModelCtrl, str, startIndex) {\r\n if(!element || !ngModelCtrl) {\r\n return false;\r\n }\r\n startIndex = startIndex || 0;\r\n \r\n var viewValue = ngModelCtrl.$viewValue && ngModelCtrl.$viewValue.toString();\r\n if(viewValue) {\r\n var index = viewValue.indexOf(str, startIndex);\r\n if(index !== -1) {\r\n element.setSelectionRange(index, index + str.length);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n }\r\n]);","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('IntersectionObserverService', [\r\n '$log',\r\n IntersectionObserverService,\r\n ]);\r\n\r\n function IntersectionObserverService(\r\n $log\r\n ) {\r\n return {\r\n observeWithSelector: observeWithSelector,\r\n };\r\n\r\n function observeWithSelector(selector, observerCallback) {\r\n if('IntersectionObserver' in window) {\r\n var trackerElement = document.querySelector(selector);\r\n var intersectionObserver = new IntersectionObserver(observerCallback);\r\n intersectionObserver.observe(trackerElement);\r\n return intersectionObserver.disconnect.bind(intersectionObserver);\r\n }\r\n\r\n $log.debug('Browser doesn\\'t support \"IntersectionObserver\".');\r\n return angular.noop;\r\n }\r\n }\r\n})(window.angular);","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('IosDocumentHelper', [\r\n 'Bridge',\r\n IosDocumentHelper\r\n ]);\r\n\r\n function IosDocumentHelper(\r\n Bridge\r\n ) {\r\n return {\r\n openDocumentInSeparateTab: openDocumentInSeparateTab \r\n };\r\n\r\n function openDocumentInSeparateTab(documentGetStaticUrlPromise) {\r\n documentGetStaticUrlPromise.then(function(url) {\r\n Bridge.fireEvent('OpenLinkInBrowser', {url: url});\r\n });\r\n }\r\n } \r\n})(angular);\r\n","angular.module('aprima-core-ui').factory('MediaService', ['Bridge', function (Bridge) {\r\n 'use strict';\r\n var id = 0;\r\n\r\n function getMedia (scope, pickerDescription, mediaCallback) {\r\n var mediaId = id++;\r\n Bridge.pickMedia(mediaId, pickerDescription);\r\n\r\n Bridge.on('mediaPicked', scope, function (value) {\r\n if(parseInt(value.Id) === mediaId) {\r\n mediaCallback(value.Media, value.FileName, value.Extension);\r\n }\r\n });\r\n }\r\n\r\n return {\r\n getMedia: getMedia\r\n };\r\n}]);\r\n","angular.module('aprima-core-ui').factory('PanelConfigurationService', ['LocalStorageRepository', '$log', 'widgetViews',\r\n function (LocalStorageRepository, $log, widgetViews) {\r\n\r\n 'use strict';\r\n\r\n var configurations;\r\n configurations = configurations || LocalStorageRepository.getPatientDashboardConfigurations('all');\r\n\r\n function getWidgetsForLayout() {\r\n var selectableWidgets = [];\r\n var widgets = LocalStorageRepository.getPatientDashboardWidgets();\r\n var view;\r\n\r\n _.forEach(widgets, function (widget) {\r\n view = _.cloneDeep(_.find(widgetViews, {'id': widget.Id}));\r\n if (view && view.userPlaceable) {\r\n view.Heading = view.displayName;\r\n view.Name = view.name;\r\n view.TileDescriptorId = view.id;\r\n view.Id = view.name + '.template';\r\n view.isTemplate = true;\r\n view.IsCollapsed = false;\r\n selectableWidgets.push(view);\r\n }\r\n });\r\n\r\n return selectableWidgets;\r\n }\r\n\r\n function reloadConfigurations() {\r\n configurations = LocalStorageRepository.getPatientDashboardConfigurations('all');\r\n }\r\n\r\n function saveLayout(configName, widgetSetName, widgets){\r\n var config = _getConfiguration(configName);\r\n\r\n _.forEach(widgets, function(widget){\r\n if(widget.name && !widget.Name){\r\n widget.Name = widget.name;\r\n }\r\n });\r\n\r\n config[widgetSetName] = widgets;\r\n\r\n LocalStorageRepository.removePatientDashboardConfigurations('all');\r\n LocalStorageRepository.setPatientDashboardConfigurations(configurations, 'all');\r\n }\r\n\r\n function _getConfiguration(configName, dashboards) {\r\n if(!dashboards){\r\n dashboards = configurations;\r\n }\r\n \r\n var settings = _.find(dashboards, {Id: configName});\r\n\r\n if (!settings) {\r\n $log.warn('patient dashboard configuration not found');\r\n }\r\n\r\n return settings;\r\n }\r\n\r\n function _getLayout(settings, widgetSetName) {\r\n\r\n var widgets, view, pageViews;\r\n widgets = settings[widgetSetName];\r\n pageViews = [];\r\n\r\n _.forEach(widgets, function (widget) {\r\n view = _.find(widgetViews, {'id': widget.TileDescriptorId});\r\n if (view && view.userPlaceable) {\r\n var clonedWidget = _.cloneDeep(widget);\r\n clonedWidget.view = view.view;\r\n clonedWidget.configurationView = view.configurationView;\r\n clonedWidget.displayName = view.displayName;\r\n pageViews.push(clonedWidget);\r\n }\r\n });\r\n\r\n return pageViews;\r\n }\r\n\r\n function _getLayoutWithConfig(config, widgetSetName, dashboards) {\r\n var settings = _getConfiguration(config, dashboards);\r\n return _getLayout(settings, widgetSetName);\r\n }\r\n\r\n return {\r\n getConfiguration: _getConfiguration,\r\n getLayout: _getLayout,\r\n getLayoutWithConfig: _getLayoutWithConfig,\r\n getWidgetsForLayout: getWidgetsForLayout,\r\n saveLayout: saveLayout,\r\n reloadConfigurations: reloadConfigurations,\r\n };\r\n\r\n }]);","// This is an abstraction around how we can handle warnings that should be displayed indefinitely\r\n// Currently it uses 'toaster' to display these warnings,\r\n// but this could be modified to display them differently, if needed\r\n\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('PersistentWarningService', [\r\n '_',\r\n 'StrConvert',\r\n 'toaster',\r\n PersistentWarningService,\r\n ]);\r\n\r\n function PersistentWarningService(\r\n _,\r\n StrConvert,\r\n toaster\r\n ) {\r\n\r\n var warnings = {\r\n list: []\r\n };\r\n\r\n var service = {\r\n add: add,\r\n addOrReplace: addOrReplace,\r\n clear: clear,\r\n getAll: getAll,\r\n remove: remove,\r\n };\r\n\r\n return service;\r\n\r\n function clear() {\r\n _.forEach(warnings.list, function(warning) {\r\n toaster.clear(warning);\r\n });\r\n _.forEach(warnings, function(property){\r\n if (property.length){\r\n return;\r\n }\r\n toaster.clear(property);\r\n if (property && property.message){\r\n property.message = null;\r\n }\r\n });\r\n }\r\n\r\n function remove(warning, key) {\r\n if(!_.isNil(warning)) {\r\n if(_.isInteger(warning)) {\r\n if(warning >= warnings.length) {\r\n return;\r\n }\r\n warning = warnings.list[warning];\r\n }\r\n if (warning){\r\n toaster.clear(warning);\r\n }\r\n }\r\n if (key) {\r\n warning = warnings[key];\r\n if (warning){\r\n toaster.clear(warning);\r\n warning.message = null;\r\n }\r\n }\r\n }\r\n\r\n function add(message, key) {\r\n message = StrConvert.replaceNewLine(message);\r\n var toast = toaster.pop({\r\n type: 'warning',\r\n body: message,\r\n title: '',\r\n timeout: 0,\r\n bodyOutputType: 'trustedHtml',\r\n onHideCallback: function() {\r\n _.pull(warnings, toast);\r\n },\r\n });\r\n toast.message = message;\r\n if (key){\r\n warnings[key] = toast;\r\n } else {\r\n warnings.list.push(toast);\r\n }\r\n return toast;\r\n }\r\n\r\n function addOrReplace(message, key){\r\n var exist;\r\n message = StrConvert.replaceNewLine(message);\r\n\r\n if (key) {\r\n exist = warnings[key];\r\n if (exist && exist.message !== message){\r\n remove(exist);\r\n exist = null;\r\n }\r\n } \r\n if (!exist){\r\n return add(message, key);\r\n }\r\n return exist;\r\n }\r\n\r\n function getAll(){\r\n return warnings;\r\n }\r\n }\r\n})(window.angular);\r\n","(function () {\r\n 'use strict';\r\n angular.module('aprima-core-ui').factory('PressListenerService', [\r\n 'NgZoneService',\r\n PressListenerService,\r\n ]);\r\n\r\n function PressListenerService(\r\n NgZoneService\r\n ) {\r\n return {\r\n register: register,\r\n };\r\n\r\n function register(element, handlerFn) {\r\n var result = NgZoneService.contextRun(function (zoneAwareObject) {\r\n return zoneAwareRegister(element, handlerFn, zoneAwareObject);\r\n });\r\n return result;\r\n }\r\n\r\n // This zoneAwareObject always needs to be the last parameter to this function.\r\n function zoneAwareRegister(element, handlerFn, zoneAwareObject) {\r\n // see comments in ClickListenerService for why this is necessary\r\n var zoneAwareHandlerFn = zoneAwareObject.wrapToRunInZoneIfNecessary(handlerFn);\r\n\r\n // don't create multiple Hammer instances per element\r\n var hammer = element.data('hammer');\r\n var shouldDestroy = false;\r\n if (!hammer) {\r\n hammer = new Hammer.Manager(element[0]);\r\n\r\n // we are creating a new instance in this function,\r\n // so it needs to be cleaned up in here as well, below in the dereg function\r\n shouldDestroy = true;\r\n\r\n element.data('hammer', hammer);\r\n }\r\n hammer.add(new Hammer.Press());\r\n hammer.on('press', zoneAwareHandlerFn);\r\n\r\n return function hmPressCleanup() {\r\n hammer.off('press', zoneAwareHandlerFn);\r\n\r\n if (shouldDestroy) {\r\n hammer.destroy();\r\n }\r\n };\r\n }\r\n }\r\n})();","angular.module('aprima-core-ui').factory('ScrollerService', ['_', function (_) {\r\n 'use strict';\r\n\r\n var scroller = {};\r\n\r\n return {\r\n getScroller: function (id) {\r\n return scroller[id];\r\n },\r\n addScroller: function (id, easyScroller, updatePageFn) {\r\n scroller[id] = _.cloneDeep(easyScroller);\r\n if(updatePageFn) {\r\n scroller[id].scrollTo = function(left, top, animate) {\r\n updatePageFn();\r\n easyScroller.scrollTo(left, top, animate);\r\n };\r\n }\r\n },\r\n removeScroller: function (id) {\r\n scroller[id] = undefined;\r\n }\r\n };\r\n}]);\r\n","//This service will change\r\n//ng-repeat=\"match in matches track by $index\"\r\n//to\r\n//ng-repeat=\"match in matches track by match.model.<some_property_or_function>\"\r\n//in the typeahead popup template (typeahead-popup.html)\r\n\r\n//This allows us to use one time bindings in a typeahead template without running into issues\r\n//where some bindings don't change even when the list changes\r\n\r\n//it uses the 'ap-typeahead-track-by' attribute that I defined\r\n//if this attribute isn't used, then it will just use the default of track by $index\r\n\r\n//Example Usage:\r\n//uib-typeahead=\"item for item in getItem($viewValue)\"\r\n//ap-typeahead-track-by=\"Id\"\r\n//===============================\r\n//this means 'track by item.Id'\r\n\r\n//uib-typeahead=\"item for item in getItem($viewValue)\"\r\n//ap-typeahead-track-by=\"name\"\r\n//================================\r\n//this means 'track by item.name'\r\n\r\n// This is hacky but there is no other way right now to do it\r\n\r\nangular.module('aprima-core-ui').factory('enableTypeaheadTrackBy', ['findTypeahead', function (findTypeahead) {\r\n 'use strict';\r\n\r\n // the new attribute I'm defining to allow a different track by clause in the inner ng-repeat\r\n var typeaheadTrackBy = 'ap-typeahead-track-by';\r\n\r\n return enableTypeaheadTrackBy;\r\n\r\n function enableTypeaheadTrackBy(popupElement, typeaheadElement) {\r\n if(!popupElement) {\r\n return;\r\n }\r\n\r\n typeaheadElement = typeaheadElement || findTypeahead(popupElement);\r\n if(!typeaheadElement) {\r\n return;\r\n }\r\n \r\n var trackByAttr = typeaheadElement.attr(typeaheadTrackBy);\r\n if(trackByAttr) {\r\n popupElement.children('[ng-repeat*=\"matches\"]').first().attr('ng-repeat', function(index, value) {\r\n if(value) {\r\n var nameOfIterator = value.substring(0, value.indexOf(' '));\r\n //Will need to update this if the structure of the match changes\r\n //(It currently looks something like this { id: 'someid', model: {}, label: {}}\r\n return value.replace('$index', nameOfIterator + '.model.' + trackByAttr);\r\n }\r\n });\r\n }\r\n }\r\n}]);\r\n","// This is a way to find the typeahead input element that corresponds to the popup element\r\n// that is passed in\r\nangular.module('aprima-core-ui').factory('findTypeahead', ['$document', function($document) {\r\n 'use strict';\r\n\r\n return findTypeaheadElementFromPopup;\r\n \r\n function findTypeaheadElementFromPopup(popupElement) {\r\n if(!popupElement || !popupElement[0]) {\r\n return;\r\n }\r\n\r\n return $document.find('[aria-owns=\"' + popupElement[0].id + '\"]');\r\n }\r\n}]);","// this resizes the width of the uibTypeaheadPopup template to be the same width as the input box for typeahead (it won't automatically do this)\r\n// and places it directly below the input box\r\n// typeahead does the positioning (but not the width) automatically when it gets matches back for the query,\r\n// but during the time we are showing the loading spinner instead of results, it won't be positioned correctly\r\n// without this directive\r\n\r\n// It will not mess with the width if you use the class ap-form-control-menu on the popup element,\r\n// because this means that the width is already set to a percent that will be responsive\r\nangular.module('aprima-core-ui').factory('positionTypeaheadPopup', ['$uibPosition', 'findTypeahead', '_', function ($uibPosition, findTypeahead, _) {\r\n 'use strict';\r\n\r\n var ngHideClassRegex = /(\\s|^)ng-hide(\\s|$)/;\r\n\r\n return positionTypeaheadPopup;\r\n\r\n function positionTypeaheadPopup(popupScope, popupElement, typeaheadElement) {\r\n if(!popupScope || !popupElement) {\r\n return;\r\n }\r\n\r\n typeaheadElement = typeaheadElement || findTypeahead(popupElement);\r\n\r\n if(!typeaheadElement) {\r\n return;\r\n }\r\n\r\n var observer,\r\n watch,\r\n updatePosition;\r\n\r\n if(popupElement.hasClass('ap-form-control-menu')) {\r\n updatePosition = recalculatePosition;\r\n }\r\n else {\r\n updatePosition = updatePositionAndWidth;\r\n }\r\n\r\n if(MutationObserver){\r\n observer = new MutationObserver(function(mutations){\r\n var popupBecomingVisible = _.some(mutations, function(mutation) {\r\n return ngHideClassRegex.test(mutation.oldValue) && !mutation.target.classList.contains('ng-hide');\r\n });\r\n\r\n if(popupBecomingVisible) {\r\n updatePosition();\r\n }\r\n });\r\n\r\n observer.observe(popupElement[0], { attributes: true, attributeFilter: ['class'], attributeOldValue: true });\r\n }\r\n else{\r\n watch = popupScope.$watch(function(){\r\n return !popupElement.hasClass('ng-hide');\r\n }, function(newVal){\r\n if(newVal){\r\n updatePosition();\r\n }\r\n });\r\n }\r\n\r\n popupScope.$on('$destroy', function(){\r\n if(watch){\r\n watch();\r\n }\r\n\r\n if(observer){\r\n observer.disconnect();\r\n }\r\n });\r\n\r\n function updatePositionAndWidth(){\r\n recalculatePosition();\r\n\r\n popupElement.outerWidth(typeaheadElement.outerWidth());\r\n }\r\n\r\n // This is basically the same recalculatePosition function\r\n // that typeahead internally uses to position the results list correctly.\r\n // I modified it to set the style for left and top manually rather than\r\n // setting a scope variable, but the logic is the same\r\n function recalculatePosition() {\r\n var position = appendedToBody() ? $uibPosition.offset(typeaheadElement) : $uibPosition.position(typeaheadElement);\r\n position.top += typeaheadElement.prop('offsetHeight');\r\n\r\n popupElement.css('left', position.left);\r\n popupElement.css('top', position.top);\r\n }\r\n\r\n function appendedToBody() {\r\n return popupElement.parent().is('body');\r\n }\r\n }\r\n}]);","// typeahead is not easily scrolled through with arrow keys unless if the list allows scrolling\r\n// otherwise, when you arrow through the items and go off the page, then you can't see what is selected\r\n// and the page doesn't scroll properly\r\n// this all comes from how angular-ui-bootstrap handles the keydown events:\r\n// (it expects the parent node to be in a scrollable element, like the body)\r\n// target = popUpEl.find('li')[scope.activeIdx];\r\n// target.parentNode.scrollTop = target.offsetTop;\r\n\r\nangular.module('aprima-core-ui').factory('setTypeaheadPopupHeight', ['findTypeahead', 'debounce', '$parse', '$window', function (findTypeahead, debounce, $parse, $window) {\r\n 'use strict';\r\n\r\n // this is the debounce time that angular-ui-bootstrap uses\r\n var heightDebounceTime = 200;\r\n\r\n // the new attribute I'm defining to allow you to give a max height to search results\r\n // search results will be scrollable themselves (not just the window scrolling)\r\n // default height is 5px less than the height of the screen\r\n var typeaheadPopupMaxHeight = 'ap-typeahead-popup-max-height';\r\n\r\n // to use this attribute you must also add 'ap-typeahead-popup-max-height'\r\n // this attribute will allow you to specify the id of the containing element\r\n // the dropdown will not exceed that container\r\n var typeaheadParent = 'ap-typeahead-popup-parent';\r\n\r\n return setTypeaheadPopupHeight;\r\n\r\n function setTypeaheadPopupHeight(popupScope, popupElement, typeaheadElement) {\r\n if(!popupScope || !popupElement) {\r\n return;\r\n }\r\n \r\n typeaheadElement = typeaheadElement || findTypeahead(popupElement);\r\n if(!typeaheadElement || !typeaheadElement[0] || !typeaheadElement[0].hasAttribute(typeaheadPopupMaxHeight)) {\r\n return;\r\n }\r\n\r\n // evaluate on outer scope\r\n var maxHeight = parseFloat(popupScope.$parent.$parent.$eval(typeaheadElement.attr(typeaheadPopupMaxHeight)));\r\n \r\n popupElement.css('overflow-y', 'auto');\r\n if(maxHeight > 1) {\r\n popupElement.css('max-height', maxHeight + 'px');\r\n return;\r\n }\r\n\r\n var windowSelector = $($window);\r\n var parentContainerElem;\r\n var parentElemId = typeaheadElement.attr(typeaheadParent);\r\n if(parentElemId) {\r\n var id = $parse(parentElemId)(popupScope.$parent);\r\n parentContainerElem = $(document).find('#' + id);\r\n }\r\n updateHeight();\r\n var debouncedUpdateHeight = debounce(heightDebounceTime, updateHeight);\r\n windowSelector.on('resize', debouncedUpdateHeight);\r\n\r\n var parentElement = popupElement.parent()[0];\r\n var observer = new MutationObserver(updateHeight);\r\n observer.observe(parentElement, {attributes: false, childList: true, subtree: true});\r\n\r\n popupScope.$on('$destroy', function(){\r\n windowSelector.off('resize', debouncedUpdateHeight);\r\n observer.disconnect();\r\n });\r\n\r\n function updateHeight() {\r\n var availableHeight;\r\n var top = popupElement.offset().top;\r\n if (parentContainerElem && parentContainerElem.length) {\r\n availableHeight = parentContainerElem.height();\r\n top = top - parentContainerElem.offset().top;\r\n } else {\r\n availableHeight = windowSelector.height();\r\n }\r\n //minus 5 to make sure scroll bars are gone\r\n var updatedHeight = availableHeight - top - 5;\r\n popupElement.css('max-height', updatedHeight + 'px');\r\n }\r\n }\r\n}]);\r\n","// This service will add classes to the popup element for typeahead\r\n// this is normally a <ul> that has all of the results inside of it\r\n\r\n// it uses the 'ap-typeahead-popup-classes' attribute that I defined\r\n// if this attribute isn't used, then it won't add/change an classes\r\n\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('typeaheadPopupClass', [\r\n 'findTypeahead',\r\n typeaheadPopupClass,\r\n ]);\r\n\r\n function typeaheadPopupClass(\r\n findTypeahead\r\n ) {\r\n var typeaheadClasses = 'ap-typeahead-popup-classes';\r\n \r\n var service = {\r\n init: init,\r\n };\r\n\r\n return service;\r\n\r\n function init(popupElement, typeaheadElement) {\r\n if(!popupElement) {\r\n return;\r\n }\r\n\r\n typeaheadElement = typeaheadElement || findTypeahead(popupElement);\r\n if(!typeaheadElement) {\r\n return;\r\n }\r\n \r\n var popupClassesValue = typeaheadElement.attr(typeaheadClasses);\r\n if(popupClassesValue) {\r\n popupElement.addClass(popupClassesValue);\r\n }\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","angular.module('aprima-core-ui').constant('uxConstants', {\r\n blurDebounceTime: 200,\r\n //use the same value as in hammer.js, they've mostly likely done the research on the appropriate value.\r\n doubleClickTime: 300,\r\n incrementalSaveTime: 1000,\r\n lazySrcThrottle: 300,\r\n searchDebounceTime: 300,\r\n});\r\n","angular.module('aprima-core-ui').factory('ViewportInfo', ['$document',\r\n function($document){\r\n 'use strict';\r\n\r\n var doc = $document[0];\r\n\r\n function getWidth(){\r\n var pageWidth = Math.max(\r\n Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth),\r\n Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth),\r\n Math.max(doc.body.clientWidth, doc.documentElement.clientWidth));\r\n\r\n return pageWidth;\r\n }\r\n\r\n function getHeight(){\r\n var pageHeight = Math.max(\r\n Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight),\r\n Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight),\r\n Math.max(doc.body.clientHeight, doc.documentElement.clientHeight));\r\n\r\n return pageHeight;\r\n }\r\n\r\n return{\r\n getWidth: getWidth,\r\n getHeight: getHeight,\r\n getWindowWidth: function() {\r\n return window.innerWidth;\r\n },\r\n getWindowHeight: function() {\r\n return window.innerHeight;\r\n }\r\n };\r\n }]);\r\n","(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('aprima-core-ui').factory('WebDocumentHelper', [\r\n '$window',\r\n WebDocumentHelper\r\n ]);\r\n\r\n function WebDocumentHelper(\r\n $window\r\n ) {\r\n return {\r\n openDocumentInSeparateTab: openDocumentInSeparateTab \r\n };\r\n\r\n function openDocumentInSeparateTab(documentGetStaticUrlPromise) {\r\n //Need to open the window directly from click handler to avoid popup blockers.\r\n //Go ahead and open tab in IE even though it probably won't load,\r\n //because other browsers might behave the same way in certain configurations.\r\n\r\n var newWindow = $window.open('');\r\n newWindow.document.write('loading...');\r\n newWindow.document.close();\r\n \r\n documentGetStaticUrlPromise.then(function(url) {\r\n // IE will leave the window/tab open, so clear the loading message.\r\n newWindow.document.write('');\r\n newWindow.document.close();\r\n newWindow.location.href = url;\r\n }).catch(function() {\r\n newWindow.close();\r\n });\r\n }\r\n } \r\n})(angular);\r\n"]}