{"version":3,"file":"main.a7c10cd32b173997.js","mappings":"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A,iCACJA,QAEAA,4BACIA,iBACIA,kBACIA,kBACIA,iCACJA,QACAA,kBACIA,iCACJA,QACJA,QACAA,mBACIA,mBACIA,iBAAMA,kCAA+JA,QACzKA,QACJA,QACJA,QACAA,kBACIA,mBACIA,mBACIA,kCACJA,QACAA,mBACIA,kCACJA,QACJA,QACAA,mBACIA,mBACIA,iBAAMA,kCAA+JA,QACzKA,QACJA,QACJA,QACAA,kBACIA,mBACIA,mBACIA,kCACJA,QACAA,mBACIA,kCACJA,QACJA,QACAA,mBACIA,mBACIA,iBAAMA,kCAA+JA,QACzKA,QACJA,QACJA,QACJA,QACJA,eAlD6BA,oCAOYA,oCAGAA,oCAKMA,oCAONA,oCAGAA,oCAKMA,oCAONA,oCAGAA,oCAKMA,6EAavCA,kBAAgGA,2DAASi1D,EAATtf,OAASsf,oBACrGj1D,kBACIA,kBACIA,8BACJA,QACAA,kBACIA,yBACJA,QACJA,QACAA,kBACIA,kBACIA,iBAAMA,UAA2CA,QACjDA,wBACJA,QACJA,QACJA,+CAZYA,+DAGAA,qEAKMA,qFAjB1BA,oBACIA,iBACIA,8BACJA,QAEAA,4BACIA,yBAgBJA,QACJA,8BArBQA,qFAI8CA,qCAAa,2DAoBnEA,oBACIA,iBACIA,8BACJA,QAEAA,4BACIA,kBACIA,8BACJA,QACJA,QACJA,8BARQA,qFAKIA,sFCnET,IAAM23E,GAAb,MAAM,QAKJj6E,YAC8BkM,EACpBC,EACAiE,EACA4oE,EACA/4E,EACAE,GACAigC,EACA5D,GACAy8C,GACkBtyD,IATEpmB,cACpBA,mBACAA,yBACAA,uBACAA,mBACAA,eACAA,iBACAA,2BACAA,qBACkBA,iBAdpBA,mBAAgB,IAAIyU,KAE5BzU,cAAmB,EAgBnB+S,WACE/S,KAAKomB,SAASpW,KAAKkd,UAAUC,IAAI,sBACjCntB,KAAKm+C,SAAU,EAEfn+C,KAAKy4E,gBAAgB78C,kBACpBt7B,MAAK01C,OAAUh2C,KAAKi2C,gBACpB9wC,UAAUw0E,IACT35E,KAAK25E,SAAWA,EAEhB35E,KAAKm+C,SAAU,GAEjB/xC,I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ACIA,2BAAkEA,6CAAqBoR,2BACnFpR,4BAqDJA,QACJA,QACJA,QACJA,QACJA,eAjEoBA,sDAAqC,sBAMZA,4DACSA,uCACJA,sCAAc,s3WCAnD0uG,GAAb,GAiLM,gCC/LF1uG,oDAaIA,kBACIA,gBAAMA,6BAAuCA,QACjDA,8BADUA,kGAINA,gBAA2BA,yCAAS8vD,EAATna,OAASma,0BAAyB9vD,8BAAyEA,iCAAzEA,gHAFjEA,kBACIA,gBAAMA,6BAA0CA,QAChDA,uBACJA,8BAFUA,2DACFA,oEAERA,kBACIA,uCACJA,8BADUA,4GAKNA,kBACIA,8BACJA,8BADIA,kKAUIA,eACIA,gCACJA,6CADuBA,4BAAoB,oEAF/CA,SACIA,yBAGJA,8BAH8BA,qDAA6B,yDAM/DA,+BAA0CA,+CAE1CA,kBACIA,kBACAA,mBAA0BA,8BAA0EA,QACpGA,mBAAgCA,8BAA0EA,QAC9GA,8BAF8BA,uFACMA,+GAGpCA,kBACIA,kBACAA,kBACIA,uBACIA,4BACIA,kBACIA,kBACAA,kBACIA,kBACAA,kBACJA,QACJA,QACAA,mBACIA,mBACJA,QACAA,mBACIA,mBACAA,mBACAA,mBACIA,mBACAA,mBACJA,QACAA,mBACJA,QACJA,QACJA,QACAA,wBACIA,6BACIA,mBACIA,mBACAA,mBACIA,mBACAA,mBACJA,QACJA,QACAA,mBACIA,mBACJA,QACAA,mBACIA,mBACAA,mBACAA,mBACIA,mBACAA,mBACJA,QACAA,mBACJA,QACJA,QACJA,QACAA,wBACIA,6BACIA,mBACIA,mBACAA,mBACIA,mBACAA,mBACJA,QACJA,QACAA,mBACIA,mBACJA,QACAA,mBACIA,mBACAA,mBACAA,mBACIA,mBACAA,mBACJA,QACAA,mBACJA,QACJA,QACJA,QACAA,wBACIA,6BACIA,mBACIA,mBACAA,mBACIA,mBACAA,mBACJA,QACJA,QACAA,mBACIA,mBACJA,QACAA,mBACIA,mBACAA,mBACAA,mBACIA,mBACAA,mBACJA,QACAA,mBACJA,QACJA,QACJA,QACJA,QACJA,aCtHCkwG,GAAsB,MAuCjC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A,eACA,WACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,cACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,cACA,iBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,cACA,iBACA,eACA,kBACA,cACA,iBACA,eACA,kBACA,eACA,kBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,kBACA,eACA,kBACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,qBACA,kBACA,qBACA,YACA,eACA,YACA,eACA,WACA,cACA,WACA,cACA,YACA,eACA,eACA,kBACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,UACA,aACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,eACA,kBACA,cACA,YACA,eACA,eACA,kBACA,cACA,iBACA,YACA,eACA,YACA,eACA,kBACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,iBACA,oBACA,eACA,YACA,eACA,WACA,cACA,YACA,eACA,YACA,eACA,YACA,eACA,aACA,gBACA,YACA,eACA,YACA,eACA,YACA,eACA,eACA,kBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,YACA,kBACA,qBACA,eACA,cACA,iBACA,YACA,eACA,YACA,eACA,YACA,iBACA,oBACA,eACA,YACA,eACA,kBACA,qBACA,YACA,eACA,eACA,kBACA,eACA,kBACA,eACA,kBACA,eACA,mBAIA,cACA,WACA,YAEA,cACA,cACA,8CACA,gCACAzuF,EAEA,YAEAhB,kBACA,uBAEAA,YACA0vF,aACA1vF,2BCnSA,OACA,iCACA,KACA,+BAEA,uBACA,KACA,qBAEA,uBACA,KACA,qBAEA,2BACA,KACA,yBAEA,6BACA,KACA,2BAEA,4BACA,KACA,0BAEA,oCACA,KACA,kCAEA,gCACA,KACA,8BAEA,2BACA,KACA,yBAEA,+BACA,KACA,6BAEA,uCACA,IACA,qCAEA,4BACA,KACA,0BAEA,iCACA,KACA,+BAEA,mBACA,KACA,iBAEA,kCACA,KACA,gCAEA,0BACA,KACA,yBAGA,cACA,aACA,mCACA,8CACA,gCACArgD,IAIA,kBACA,0BACA8gF,MAGAzgC,0BACAA,UACA0vF","names":["CoreModule","CookieService","imports","CommonModule","HttpClientModule","MenuGuard","constructor","baseService","layoutService","router","appStorageService","appInitializationService","platformId","this","canActivate","route","state","isPlatformBrowser","isInitialized","pipe","filter","initialized","take","switchMap","getMenuLinks","links","of","canGo","url","catchError","err","navigate","path","replace","split","linkSelected","find","link","getBasePath","identificadorUrl","decodeURIComponent","sublinkSelected","forEach","subMenu","i0","PLATFORM_ID","factory","AppInitializationService","BehaviorSubject","setInitialized","initializedSubject","next","asObservable","STORAGE","VERSION","TOKEN","DIRECTORY","MENU","LOCALE","REFERRER","PROFILE_SEACH_SEED","USER","AUTH_IFRAME","ACTIVE_VIRTUAL_ATTENTION","MENU_LANGUAGE","POLICIES","CLINIWEB_DIRECTORY","WORKFLOW_TYPE","ONLINE_APPOINTMENT_CLINIWEB_STATE","ONLINE_APPOINTMENT_CLINIWEB_BOOTSTRAP_STATE","WELCOME_CLINIWEB_STATE","ONLINE_PAYMENT_WORKFLOW_STATE","MEDICAL_ORDER_WORKFLOW_STATE","GROWTH_CURVES_WORKFLOW_STATE","ONLINE_PAYMENT_WORKFLOW_BOOTSTRAP_STATE","SIGNUP_CAPTCHA_REQUIRED","SIGNUP_WORKFLOW_VERIFICATION_TYPE","AUTHENTICATION_SERVICE_PROVIDER","APPOINTMENTS","LICENSE","COUNTRY","NEXT_APPOINTMENT_LAST_TIME_SHOWN","SIGNUP_CHECKIN_STATE","SELECT_COUNTRY","REFERRAL_MEDICAL","AppStorageService","cookieService","swUpdate","clearAll","window","localStorage","clear","sessionStorage","deleteAll","undefined","available","subscribe","activateUpdate","then","console","log","clearLogout","removeSessionItem","removeItem","setItem","key","data","encrypt","encryptObj","JSON","stringify","setItemSession","getItem","desencrypt","parse","decryptObj","getItemSession","getSerializedToken","token","get","setSerializedToken","tokenObject","parseObjectDeep","set","getToken","setToken","removeToken","delete","obj","_key","CryptoJS","environment","_iv","keySize","iv","mode","padding","toString","text","decryptedText","json","result","keys","Object","i","length","charAt","toLowerCase","slice","AppointmentService","http","getAppointmentById","etapaSolicitudId","language","getLatestDoctors","maxAmount","getAppointmentsWithCache","map","appointments","latestDoctors","doctores","getNextAppointment","citasFuturas","a","idEstado","getAppointmentLastTimeShown","appointmentId","setAppointmentLastTimeShown","Date","getTime","isAppointmentsCacheEmpty","getAppointments","getFromCache","addToCache","clearAppointmentsCache","getFutureAppointments","getPastAppointments","citasPasadas","getIncompletedAppointments","cancelAppointment","idSolicitud","idEtapaSolicitud","reason","put","getAppointmentsSchedule","idEmpresa","idResponsableServicio","fechaInicio","fechaFin","idLocalidad","getAppointmentsScheduleNextItem","getOnlineAppointmentRequest","idVerificacion","createOnlineAppointmentRequest","onlineAppointmentRequest","post","updateOnlineAppointmentRequest","confirmOnlineAppointmentRequest","getStatus","AuthOidcService","locale","translation","initManager","clientOidc","getDirectoryClientOidc","manager","UserManager","getUser","user","error","handleServiceError","redirectToAuthOidc","authority","B","_a","includes","existsManager","isLoggedIn","expired","startAuthentication","username","args","extraQueryParams","login_hint","getManager","signinRedirect","catch","completeAuthentication","requestTokenFromUser","signinRedirectCallback","startAuthenticationPopup","signinPopup","completeAuthenticationPopup","signinPopupCallback","promiseUser","from","getDirectoryDomain","domain","_manager","urlUserInfo","settings","metadata","userinfo_endpoint","tokenState","parseTokenState","email","profile","dummyToken","Token","isInvalid","invalidMessage","translate","access_token","clientAuthority","proveedorServicioAutenticacion","authenticationServiceProvider","message","TokenState","returnUrl","L10N_LOCALE","httpOptions","headers","HttpHeaders","AuthService","userService","territorialDivisionService","messageBusService","login","password","body","HttpParams","response","LoginResponse","success","getTransferToken","getTokenByTransferToken","transferToken","loginByTransferToken","tokenString","getUserPersonLoggedIn","loginCompleted","LoginCompletedMessage","isLoggedInFull","getAuthenticationToken","isTokenExpired","redirectToLogin","getValidAuthenticationToken","logout","getCountryByIp","country","msg","TerritorialDivionCountryMessage","territorialDivision","sendTerritorialDivisionCountry","LogoutMessage","isPathEnabled","menuLinks","_path","_linkSelected","getLinkSelected","resutRouteConfig","config","p","nombreComponenteAnonimo","accesoPublico","hasPermissions","_pathEnabled","queryParams","parent","postMessage","eventName","subLinkSelected","sublink","AuthenticationServiceProvider","LearnMoreDialogComponent","mdDialogRef","ngOnInit","close","MAT_DIALOG_DATA","selectors","ctx","PortalPHRService","getByUrl","serverUrl","LicenseService","idTipo","getLicensePhr","LICENSE_TYPE","PHR","license","BaseService","l10nConfig","portalPhrService","directoryService","licenseService","dialog","request","sanitizer","titleService","meta","logService","localeChangedSource","Subject","localeChanged$","setConfigTranslation","isBrowser","onChange","onError","checkVersion","version","getAppConfig","encodeURIComponent","location","origin","pathname","protocol","directory","logVerbose","nombre","setDefaultLanguage","localizacionDefecto","showSignupLoginHeaderMenu","versionPhr","PHRVersion","GoogleAnalyticsService","analyticsKey","pathSegments","perfilIndex","findIndex","segment","nickname","ue","accountName","_e","nombreEmpresaDestinoDirectorio","_b","setTitle","browserTitle","titulo","updateTag","name","content","browserDescription","logError","companyId","getLanguage","getCompanyId","_menuLinks","getMenuLinkByAreaId","areaId","l","idAreaSistema","getDirectory","getAuthenticationProviders","clientesOidc","getCompanyByLicense","company","CompanyModel","id","getCliniwebDomain","getCompanyName","isLicensedCompany","getCliniwebDirectoryCompanyId","idEmpresaDestinoDirectorio","getCliniwebDirectoryCompanyName","getCliniwebDirectoryLocationCompanyIds","idsEmpresasLocalidades","getMenuComponentName","nombreMenu","getBackUrlCompany","getUrlCompany","urlCorporativo","getDisclaimer","k","descargoResponsabilidad","trim","getPrivacyPolicy","politicasPrivacidad","getTermsAndConditions","terminosCondiciones","getPublicProfileVersion","versionPerfilPublico","isCliniwebCompany","languageString","setLocale","schema","LocaleChangeMessage","localeChange","getHeaderName","nombreEncabezado","getPoliciesControlName","nombrePoliticas","getDirectoryClass","nombreClaseEstilo","getDirectoryTitle","getDirectoryUrlFavicon","urlFavicon","getRouteLinkByArea","menu","te","clienteOidc","c","oidcClient","oe","nombreCuentaPaciente","getCliniwebDirectory","getByType","DirectoryType","isMenuLinksVisible","menuVisible","parseObject","assign","convertObjectToQS","str","hasOwnProperty","push","join","goToRoute","pathQueryParams","params","pair","paramsObject","getSearchSeed","seed","Math","trunc","random","getLocationFromIdentifier","territorialDivisionIdentifier","parts","city","getInitialsString","arrayText","normalize","lastnamePosition","toUpperCase","getHashCodeByString","hash","charCodeAt","getColorByInitials","initials","colors","index","getAvatarInitialObject","color","errorMessage","displayMessage","BaseHttpServiceUnauthorizeException","serviceError","ServiceErrorMessage","innerError","getBasicDateFormat","date","includeYear","yearSeparator","momentDate","moment","dateDay","format","dateMonth","dateYear","yearStr","getMonthName","month","uppercaseFirstLetter","monthName","sendComponentFinishLoadingMessage","formaData","idFormulario","idControlPadre","event","ComponentFinishLoadingMessage","idControl","componentFinishLoading","enc","Utf8","AES","ECB","pad","Pkcs7","decrypt","openLegalAgreementsDialog","type","LegalAgreementsDialogData","open","LegalAgreementsDialogComponent","panelClass","openLearnMoreDialog","isIOS","test","navigator","platform","maxTouchPoints","isMacDesktop","getDetailedAgeByDate","birthDate","now","years","getFullYear","months","getMonth","days","getDate","getDetailedAge","yearSingularText","yearPluralText","monthSingularText","monthPluralText","daySingularText","dayPluralText","isSerializedHtml","htmlRegex","createSafeUrl","objectUrl","URL","createObjectURL","safeUrl","bypassSecurityTrustUrl","sanitize","SecurityContext","L10N_CONFIG","REQUEST","ChatService","getByEtapaSolicitudId","getChatMessages","pageSize","sendMessage","chatId","sendCancellationMessage","ClinicHistoryService","utilsService","getClinicHistory","idPaciente","getAttentionsByGroup","attentionHistoryArray","idAgrupador","attentionsFiltered","attentionHistory","_atenciones","atenciones","agrupadores","indexOf","_attentionHistory","AttentionHistory","contactoClinico","getClinicHistoryItemsByGroup","items","groups","containsAnyNumber","getClinicHistoryItemsByExcludedGroup","getAttentionsByConceptType","concepType","idTipoConcepto","getClassPreviewFile","extension","_className","getPreviewFileUrl","_imagePreviewUrl","getClinicHistoryPdf","model","responseType","getClinicHistoryByHash","DirectoryService","getSearchTitle","publicProfileType","searchText","conceptTypeId","conceptId","contryCityIdentifier","filters","DoctorService","searchDoctors","companyname","profileType","postMessageToDoctor","IdPersona","getLicense","DocumentService","getDocumentUrl","documentId","getDocumens","documentIds","onLoginCompleted","setUserData","gaScript","document","createElement","setAttribute","gaScript1","innerText","v","documentElement","firstChild","appendChild","b","u","_c","_d","logPageView","gtag","page_location","sendEventInitVirtualConsultation","sendEventOpenClinicHistory","sendEventDownloadClinicHistory","sendEventGoToInsuranceCard","sex","sexo","TOKEN_HEADER_KEY","AUTH_API","HttpBaseService","options","useAuthentication","setAuthenticationHeader","header","EMPTY","throwError","sessionExpired","SessionExpiredMessage","helper","JwtHelperService","refreshSubject","refreshAuthenticationToken","tap","t","X","onAuthenticationRequired","shareReplay","refreshToken","refresh_token","Error","super","IframeMessageService","addEventListener","e","match","height","width","IframeMessage","IFRAME_RESIZE_EVENT_NAME","IframeResizeMessage","handleIframeEvent","iframeResizeSubject","MODAL_OPEN_EVENT_NAME","modalOpenSubject","MODAL_CLOSE_EVENT_NAME","modalCloseSubject","REQUEST_USER_ID_EVENT_NAME","requestUserIdSubject","SCROLL_TOP_EVENT_NAME","scrollTopSubject","MANAGE_APPOINTMENTS_EVENT_NAME","manageAppointmentsSubject","PUBLIC_PROFILE_LOADED_EVENT_NAME","publicProfileFinishLoadingSubject","REFRESH_USER","refreshUserSubject","onIframeResize","onModalOpen","modalClose","onModalClose","onRequestUserId","parentPostMessage","onScrollTop","onManageAppointments","onPublicProfileLoaded","onRefreshUser","LayoutService","themes","hideComponentSource","postNavigateSource","scrollingBodySource","getForm","getTextByLanguage","objectSerialized","textLanguage","lenguaje","texto","hideComponent","postNavigate","onScrollingBody","dir","loadLicenseTheme","classNameContainer","directoryClassname","theme","containerElement","getElementsByClassName","properties","style","setProperty","isMobile","target","innerWidth","mobileDelimiter","overflowBodyDisabled","classList","add","overflowBodyEnabled","remove","addComponentInitClass","componentClass","removeComponentInitClass","isHeaderVisible","offsetParent","addClassToBody","className","removeClassToBody","THEMES","DOCUMENT","LogLevel","LogService","postLog","logWarning","Warning","logInfo","Info","Verbose","level","isPlatformServer","toLocaleString","MedicalOrderService","getById","getList","tipos","buildRequestNumber","requestTypeId","requestNumber","MEDICAL_REQUEST_TYPE","padStart","generateByIdHashed","idHashed","MessageBusService","profileSearch","profileSearchSubject","onProfileSearch","profileSearchFilter","profileSearchFilterSubject","onProfileSearchFilter","sendUserId","userId","sendUserIdSubject","onSendUserId","authIframe","authIframeSubject","onAuthIframe","appointmentCancelled","appointmentCancelledSubject","onAppointmentCancelled","loadChat","loadChatSubject","onLoadChat","openChat","openChatSubject","onOpenChat","chatCancelled","chatCancelledSubject","onChatCancelled","chatLoaded","chatLoadedSubject","onChatLoaded","setFormConfiguration","formConfigurationSubject","onFormConfiguration","componentFinishLoadingSubject","onComponentFinishLoading","loginCompletedSubject","logoutSubject","onLogout","sessionExpiredSubject","onSessionExpired","serviceErrorSubject","onServiceError","sendClinicHistory","sendClinicHistorySubject","onSendClinicHistory","providerSearch","providerSearchSubject","onProviderSearch","goToPastVirtualRequests","pastVirtualRequestsSubject","onGoToPastVirtualRequests","virtualRequestFinished","virtualRequestFinishedSubject","onOnVirtualRequestFinished","appointmentChangeReceived","appointmentsByPatient","appointmentChangeReceivedSubject","onAppointmentChangeReceived","pageScroll","pageSrollSubject","onPageScroll","scrollTopBody","scrollTopBodySubject","onScrollTopBody","closeCheckAutocomplete","originComponentId","closeCheckAutocompleteSubject","onCloseCheckAutocomplete","localeChangeSubject","onLocaleChange","formFinishLoading","formFinishLoadingSubject","onFormFinishLoading","sendPublicProfile","sendPublicProfileSubject","onSendPublicProfile","sendWorkflowData","sendWorkflowDataSubject","onSendWorkflowData","sendFlowStepCompleted","sendFlowStepCompletedSubject","onSendFlowStepCompleted","onComponentDataSetMessage","componentDataSetSubject","onSendComponentDataSetMessage","onWorkflowStateUpdateMessage","workflowStateUpdateSubject","onSendWorkflowStateUpdateMessage","openSnackBar","openSnackBarSubject","onOpenSnackBar","hideHeader","hideHeaderSubject","onHideHeader","showHeader","showHeaderSubject","onShowHeader","navigateBack","navigationBackSubject","onNavigateBack","closeRouteDialog","closeRouteDialogSubject","onCloseRouteDialog","closeSearchProviderDialog","closeSearchProviderDialogSubject","onCloseSearchProviderDialog","sendFloatingComponents","sendFloatingComponentsSubject","onSendFloatingComponents","clearProviderFilters","clearProviderFiltersSubject","onClearProviderFilters","openProviderFilters","openProviderFiltersSubject","onOpenProviderFilters","providerFiltersCount","count","providerFiltersCountSubject","onProviderFiltersCount","closeWorkFlowRequest","ruta","closeWorkFlowRequestSubject","onCloseWorkFlowRequest","hideAnonymousMenu","hideAnonymousMenuSubject","onHideAnonymousMenu","showAnonymousMenu","showAnonymousMenuSubject","onShowAnonymousMenu","controlComponentClassname","controlComponentClassnameSubject","onControlComponentClassname","arg","showSignupLoginHeaderMenuSubject","onShowSignupLoginHeaderMenu","showWelcomeImage","showWelcomeImageSubject","onShowWelcomeImage","refreshProfileMenu","refreshProfileMenuSubject","onRefreshProfileMenu","openRouteDialog","openRouteDialogSubject","onOpenRouteDialog","allRouteDialogClosed","allRouteDialogClosedSubject","onAllRouteDialogClosed","publicProfilePage","publicProfilePageSubject","onPublicProfilePage","dialogOpen","dialogOpenSubject","onDialogOpen","dialogClose","dialogCloseSubject","onDialogClose","territorialDivisionCountrySubject","onSendTerritorialDivisionCountry","sendPublicProfileHeaderVisibilityChange","publicProfileHeaderVisibilityChangeSubject","onPublicProfileHeaderVisibilityChange","sendPublicProfileAction","publicProfileActionSubject","onPublicProfileAction","sendReloadFormComponent","reloadFormComponentSubject","onReloadFormComponent","sendToggleBottomSheetSubject","toggleBottomSheetSubject","onToggleBottomSheetSubject","clinicHistory","hasAgentMessage","direction","offset","containerTopPosition","routeDialogScroll","dialogId","SnackBarType","dialogName","DialogName","headerVisible","publicProfileAvatarComponentModel","fromRouteDialog","paymentClick","appointmentClick","PatientService","getPartial","baseUrl","getIdentifierPatient","idPacientePortal","idEmpresaPhr","getRelations","postSupport","PaymentService","getOnlinePaymentRequest","createOnlinePaymentRequest","onlinePaymentRequest","updateOnlinePaymentRequest","confirmOnlinePaymentRequest","getUserPayments","getUserPayment","transaccionId","getUserPaymentPdf","PublicProfileService","routeDialogService","searchProfileByText","page","accountId","locationCompaniesIds","types","useElasticsearchForProfiles","searchProfileByConcept","conceptNav","conceptClassId","getPublicProfile","getProfileDetails","profileId","profileDetailType","getPublicProfileFilters","tipoConcepto","concepto","pais","provincia","ciudad","idTipoConceptoClinico","idTipoPerfilPublico","getProfileDetailsDocuments","getProfileDetailsDocument","getPublicProfileUrl","nickName","publicProfileVersion","PublicProfileVersion","openPublicProfile","navigateByUrl","routeDialogModel","PublicProfileRouteDialogModel","openDialog","getPublicProfileById","personId","getPublicProfileByIds","personIds","Set","groupProfileFilters","filteredConcepts","groupsDef","g","group","ProfileFilterSearchResultGroup","idsConceptosClinicos","results","tituloGrupo","tooltip","defaultGroup","concept","cc","RequestsToVerifyService","confirmation","validate","fechaNacimiento","getSummaryData","update","RouteDialogService","currentRoute","search","dialogRef","RouteDialogComponent","animationIn","backgroundClassName","disableClose","beforeClosed","x","componentInstance","onCloseClick","afterClosed","dialogs","closeDialog","d","isOpen","getDialogById","closeDialogsAndNavigate","CloseRouteDialogMessage","setTimeout","reload","anyOpen","checkRouteConfig","r","outlet","resetConfig","duplicateRoutes","routes","duplicatedRoute","children","removeRouteDialogClassnameToBody","ChatSignalRService","SignalrService","hubName","registerOnServerEvents","proxy","on","virtualAttentionChangedSubject","newChatMessageSubject","userActiveSubject","onNewMessageReceived","onVirtualAttentionChanged","onUserActive","userActive","groupId","action","eventUnixDate","invoke","init","createConnection","connect","connection","$","hubConnection","createHubProxy","disconnected","handleConnectionLost","getAuthorizationToken","qs","authorization","start","pingInterval","done","connectionLostRetryTimeInSeconds","connectionEstablishedSubject","waitingConnectionLostRetry","connectionLostSubject","joinGroup","onConnectionStablished","onConnectionLost","TerritorialDivisionsService","httpClient","getByLevels","levels","countryId","getBySwiftCode","swift","getByIp","ip","getByCountryId","getIp","countryObject","CountryModel","setCountryApp","getCountryApp","countryApp","getAvailableCountries","idPais","countries","panama","TerritorialDivision","nombreI18n","nombreCanonico","nivel","identificador","paisISO","ecuador","costaRica","honduras","republicaDominicana","otros","ipObject","ThemeColorService","rendererFactory","renderer","createRenderer","_directoryClass","directoryClass","setThemeColor","save","metaThemeColor","querySelector","_color","UserService","authOidcService","other","son","daughter","father","mother","man","women","relative","husband","wife","brother","sister","grandfather","grandmother","manWarded","womanWarded","dependentRelationshipTranslations","getUserPerson","getUserIdentification","identificationType","getUserIdentificationNumber","getPolicies","policyType","policies","identifications","identification","policy","getUserDependents","getUserIdLoggedIn","_userPerson","getUserPersonLoggedInFromService","userPerson","getUsernameLoggedIn","updateUserLoggedIn","processRequestUserId","postUserActive","idEmpresaDestino","postUserRegister","Username","Password","IdEmpresa","requestUserRegistration","registerUser","postConfirmation","postResetPassword","nombreEmpresa","dominio","postConfirmationResetPassword","postExistsUser","DominioEmpresa","updateUser","createOrUpdateDependent","dependent","idPersona","deleteDependent","updatePassword","getDependentRelationshipName","relationship","tipoRelacion","DependentRelationshipType","updateProfilePicture","y","uploadProfilePicture","file","pUploadResponse","reader","FileReader","readAsDataURL","onloadend","fileReaderOnLoadEnd","ultimoPunto","lastIndexOf","R","contentType","complete","deleteUploadedImage","updateUserResidenceCountry","IdPais","getUserCountry","availableCountries","countryUser","idPaisResidencia","getUserUnverifiedRequest","requestGuid","registerUnverifiedUser","wasUserCreated","userCreated","UtilsService","scrollTo","containerEl","position","scrollTop","scrollToWithAnimation","animateScroll","scrollToElementWithAnimation","element","elOffset","getOffset","containerOffset","top","scrollBottom","scrollHeight","scrollBottomWithAnimation","groupBy","list","keyGetter","Map","item","collection","containsValue","arrayString","separator","value","array","elem","containsAnyValue","valueArray","parseInt","arrayNumber","getPersonInitialsString","personName","getPersonInitialsColor","getPersonInitials","getPersonDefaultAvatarUrl","age","getPersonAge","Number","isFinite","ageRange","getAgeRange","getPhotoByAgeRangeAndSex","range","getPhotoBySex","m","to","duration","change","currentTime","val","easeInOutQuad","increment","el","rect","getBoundingClientRect","scrollY","left","scrollX","VirtualAttentionService","getActive","idEmpresaDestinoConsultaVirtual","virtualAttention","getActiveWithCache","getPastAttentions","removeActiveFromCache","startVirtualAttention","idAreaSistemaDestino","symptoms","nombreEmisor","urlImagenEmisor","IdEmpresaDestino","ConceptosClinicos","Emisor","NombreEmisor","UrlImagenEmisor","Email","cancelVirtualAttention","idSolicitudPorVerificar","razon","WorkflowService","idTipoFlujoTrabajo","setWorkflowTypeActive","encryptSessionData","getWorkflowTypeActive","getWorkflowDataState","workflowType","workflowState","OnlineAppointmentCliniwebState","OnlinePaymentWorkflowState","MedicalOrderWorkflowState","GrowthCurvesWorkflowState","setWorkflowDataState","workflowDataState","removeWorkflowData","getTokenStateFromWorkflow","appointmentState","publicProfileIdentifier","locationId","targetDate","getAppointmentInfo","appointmentDate","paymentState","initPaymentWorkflow","publicProfile","companyName","dto","OnlinePaymentModel","nombreResponsableServicio","nombrePersona","urlAvatarResponsableServicio","ubicacionFoto","especialidadResponsableServicio","especialidad","emailResponsableServicio","emailRemitenteNotificacion","idEmpresaResponsableServicio","perfilPublico","initAppointmentWorkflow","dateTimestamp","AppointmentCheckout","endDate","localidad","nombreLocalidad","direccionLocalidad","direccion1","coordenadasLocalidad","coordenadas","telefonoLocalidad","tel","tel2","teleconsulta","BottomSheetMenuComponent","resolver","openCloseBottomSheet","bind","ngOnDestroy","currentComponent","loadComponent","component","container","nativeElement","contains","_close","onEsc","resolveComponentFactory","containerRef","createComponent","backdrop","eventoClickAsignado","ElementRef","ViewContainerRef","HomeComponent","menuComponentName","takeUntil","ngUnsubscribe","loggedInUser","_","onScroll","$event","abs","Direction","fadeAnimation","trigger","transition","query","right","optional","animateChild","animate","backgroundColor","inOutAnimation","transform","CustomDatePipe","timezone","formattedDate","datePipe","DatePipe","pure","ctx_r5","oxw","ctx_r9","ctx_r13","AppointmentInfoCheckoutComponent","publicProfileService","dateLanguage","ngOnChanges","changes","avatarModel","PublicProfileAvatarComponentModel","avatarUrl","fullName","tipoPerfil","isDesktop","setAttentionPlaceLabel","isVirtualAppointment","appointmentType","AppointmentType","attentionPlaceLabel","getAppointmentTypeText","getAppointmentTypeClasname","showRelationship","patientRelationshipType","SenderPatientRelationship","getRelationshipText","patientGender","_textRef","openMap","MapDialogData","title","attentionPlaceName","attentionPlaceLatLng","animationOut","showCloseTextButton","showWazeButton","MapDialogComponent","goToPublicProfile","enablePublicProfileLinks","RouteDialogType","onResize","_r0","MAs","AvatarUploadComponent","cd","EventEmitter","onFileSelected","files","uploading","uploadProfilePictureNext","uploadProfilePictureError","deletePicture","onFileUploaded","emit","edit","uploadData","ubicacionLogo","E","webUrl","updateProfilePictureNext","showToast","detectChanges","messageText","snackBarType","OpenSnackBarMessage","ctx_r8","ctx_r10","ctx_r30","ctx_r31","ctx_r32","ctx_r34","ctx_r35","ChatComponent","signalRService","chatService","virtualAttentionService","toastr","virtualConsultationCompanyId","chatInitialized","hasAgentMessages","chatWrapper","ChatLoadedMessage","show","minimize","clearUserActiveInterval","clearAgentActiveInterval","supportId","day","hour","min","and","logged","loggedUser","va","ChatWrapper","lastAgentActiveDate","fechaUnixUltimaVezActivoResponsableServicio","updateAgentActive","loadChatMessages","initSignalR","initUserActiveInterval","initAgentActiveInterval","upDirection","messagesPageSize","messages","addMessages","loading","currentMessage","chatMessage","buildChatMessage","idChat","cancelationReason","ChatCancellationMessage","mensaje","razonCancelacion","idEmpresaTemplate","ChatConversacionMessage","idPacienteEmpresaOrigen","tipo","ChatConversacionMessageType","valor","idEmisor","apellido","fechaEnviado","fechaCreacion","onChatBtnClick","toggleMinimize","minimized","_this","onMinimizeClick","onScrollUp","onCancelVirtualAttention","dialogData","DialogData","CancelVirtualAttentionDialogComponent","autoFocus","connectionLost","warning","disableTimeOut","toastClass","positionClass","subscribeToSignalREvents","IdEtapaSolicitud","Tipo","IdEmisor","IdEstado","IdResponsableServicio","NombreResponsableServicio","fechaUltimaActualizacionEstado","FechaUltimaActualizacionEstado","FechaFin","vAttention","finishChat","UserId","LastActiveUnixDate","userActiveIntervalId","setInterval","compId","agentActiveIntervalId","diff","isAgentActive","tolerance","clearInterval","getChatDate","getSymptoms","sintomasPaciente","last","pop","decls","avoidUnreadCountUpdate","reverse","unreadMessagesCount","we","unshift","ChatMessageWrapper","getDoctorName","getChatTime","startTime","timeDiffInMin","floor","isUserBlockMessage","currentMessageIndex","previous","current","showDateStamp","isUserMessage","isAgentBlockMessage","isAgentMessage","showMessageTime","isWaitingForAttention","isWaitingForTriage","requestIsFinished","getFirstMessage","isVirtualAttentionFinished","ctx_r14","ctx_r16","ctx_r18","ctx_r20","ctx_r22","ctx_r24","ctx_r26","ctx_r28","CliniwebAppointmentsComponent","breakpointObserver","me","completedStateName","notCompletedStateName","cancelledStateName","unconfirmedStateName","confirmedStateName","app","appointment","sexoResponsableServicio","PublicProfileType","defaultBorderColor","setAppointmentExtraData","translations","patientFirstName","getName","locationDescription","getLocationDescription","patientRelationship","getPatientRelationship","doctorAvatarUrl","getAvatarUrl","appointmentExpired","isAppointmentExpired","appointmentFormattedDate","getAppointmentDateStr","fechaRequerido","description","teleconsultation","isTeleconsultation","teleconsultationUrl","buildTeleconsultationLink","appointmentStateDisplayName","getAppointmentStateName","appointmentStateClassName","getAppointmentStateClassName","appointmentStateIconClassName","getAppointmentStateIconClassName","getPatientFirstName","nombrePaciente","idPacienteOrigen","dependents","se","appDate","getAppointmentRemainingTime","timeDiff","diffStr","inProgressState","ve","dayDiff","ceil","hrDiff","toLocaleUpperCase","stateName","nombreEstado","stateClassName","re","stateIconClass","teleconsultaId","onNewAppointmentClick","onAppointmentViewMoreClick","AppointmentSummaryRouteDialogModel","isMatched","headerName","openVideConsultationLink","onNavigateWithWaze","coordinates","onCancelAppointment","AppointmentCancelationRouteDialogModel","onUnconfirmedAppointmentClick","confirmText","showHeaderIcon","headerIconClass","showCancelButton","cancelText","ConfirmDialogComponent","accepted","onReScheduleAppointment","closePopupView","onClose","identificadorPerfilPublico","rs","ComponentLookup","CompanyLogoComponent","mapfre","isCliniwebPhr","isLicensed","companyLogo","getCompanyLogoValueByPartialKey","partialKey","companyLogos","CountryFormComponent","formBuilder","errorObs","I","countryIdSelected","countryForm","Validators","onSubmit","submitted","invalid","countrySelected","controls","DatepickerFlatFieldComponent","fb","Array","year","mapMonth","formulario","valueChanges","onSelectChanges","errors","isTouched","touched","thisControl","markAllAsTouched","setErrors","fecha","registerOnChange","fn","registerOnTouched","onTouched","setDisabledState","isDisabled","disable","enable","writeValue","dateResult","updateForm","isChanged","setErrorsToThisControl","changesThisControl","maxDate","valid","markAsTouched","emitEvent","setValue","onlySelf","control","fecha1","startOf","fecha2","isAfter","minDate","isBefore","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","NG_VALIDATORS","MAT_SELECT_CONFIG","useValue","overlayPanelClass","ctx_r7","EditDependentComponent","avatarUploadOptions","AvatarUploadComponentOptions","requiredFileType","selectFileLabel","changeFileLabel","showFileOnceUpload","currentYear","dependentIdQs","snapshot","paramMap","dependentId","formGroup","nameControl","lastNameControl","birthDateControl","sexControl","relationshipType","changePictureLabel","deleteFileLabel","ViewDependentModelDto","setUpDependentExtraData","loadDependentFormData","onNavigateBackNext","dirty","beforeCloseAlert","loadLicense","relationshipName","toLocaleLowerCase","sexName","sexIconClass","setControlValue","getControl","controlName","isControlInvalid","formSubmitted","controlHasError","errorName","hasError","getControlValue","onSaveClick","saving","DependentRequest","idRelacionDependiente","createOrUpdateDependentSuccess","scrollToInvalidField","getBirthdateControl","onSuccess","showErrorToast","showSuccessToast","onAvatarUploaded","K","invalidControl","ctx_r3","ViewDependentComponent","feNacimiento","CommonTypesHelper","onEditDependentClick","S","onDeleteClick","showDeleteSuccessToast","Dependent","ctx_r11","selectionControl","FormControl","CancelOption","cancel","isSaveEnabled","getSelectedReason","showTextarea","option","o","reasonId","reasonText","confirm","codigoSolicitudPorVerificar","ChatCancelledMessage","completed","showErrorDialog","previousState","stateText","licenseLoading","DoctorMessageDialogComponent","doctorService","captchaSiteKey","messageForm","CustomEmailValidator","f","captchaSuccess","resolved","captchaResponse","DoctorMessage","NombreDoctor","Localizacion","L","NombreCompleto","N","Mensaje","FileViewerDialogComponent","viewerData","lat","lng","ngAfterViewInit","divTitle","clientWidth","medicionTitulo","display","span","visibility","whiteSpace","textContent","offsetWidth","removeChild","buildWazeLink","RouteDialogHeaderModel","headerModel","closeFn","dialogModel","events","NavigationEnd","preventDialogClose","elOffsetTop","offsetTop","PageScrollMessage","RouteDialogModel","APPOINTMENT","PAYMENT","PUBLIC_PROFILE","CONFIGURATION_PAGE","APPOINTMENT_SUMMARY","MY_ORDER_SUMMARY","CANCEL_APPOINTMENT","LEGALAGREEMENTS","CHANGE_PASSWORD","DynamicComponent","componentName","factoryClass","ComponentLookupRegistry","viewContainerRef","dynamicHost","componentRef","instance","componentData","DynamicHostDirective","LoginSingupErrorBannerComponent","ctx_r6","ctx_r15","ctx_r17","FileViewerComponent","documentService","googleFileViewerBaseUrl","viewerDto","useExternalDocumentProvider","documentProvider","fileId","selectedFileId","selectedFile","selectedFileIndex","onSelectedFileChange","openOnNewTab","getFileUrl","C","focus","isNextVisible","isPreviousVisible","clearViewCustomizations","selectedImgZooms","selectedImageEl","dragPosition","showZoomIn","showZoomOut","zoomIn","resizeSelectedImg","zoomOut","onFileClick","scale","resetZoom","selectedFileHasPreview","fileExtension","useGoogleViewer","selectedFileUrl","useExtensionImage","useLoading","fileUrl","imageUrl","hasExtensionImage","host","amazonBucketName","loadingFileUrl","getFileDocumentUrl","getSelectedFileViewerUrl","getDocument","doc","FormComponent","activatedRoute","changeDetector","FormComponentType","form","Form","controles","hideComponentSource$","changeVisibilityComponent","_idAreaSistema","loadForm","loadFromIdAreaCliente","formConfiguration","controlComponent","componentes","conponentName","classname","loadingForm","anonymousComponentName","getDataByMenu","ngAfterContentChecked","parseFormData","configuracion","FormConfiguration","waitForComponentsToFinish","waitForComponents","sendFormFinishLoadingMessage","components","concat","cp","contenedor","FloatingComponentsMessage","componentsData","getComponentData","componentsConfirmedFinishLoading","componentsFinishLoading","isFormVisible","isAnonymousComponentVisible","cleanUrl","completePath","findLink","arg0","arg1","resultado","getFlexStyle","numeroControlesPorFila","leakedComponents","FormComponentData","nombreComponente","nombreFormulario","formConfigurationData","configurationData","visible","LearnMoreComponent","LegalAgreementsComponent","LegalAgreementType","legalAgreements","O","T","PrintsService","getPdf","FormatoHojaReporte","SummaryOrderSignComponent","signPdf","_signPdf","currentValue","procesarIdoneidad","informacionResponsableServicio","licencia","licenciasProfesional","idIdentificacionPersona","idIdentificacionIdoneidadProfesionalDefault","jsonIdentificacion","Nombre","nombreEspecialidad","Especialidad","registro","Registro","Codigo","Folio","esProfesionalVerificado","profesionalVerificado","sign","documentosFirma","idDocumento","idDocumentoImagenFirma","direccionUbicacionWeb","nombreBucketAmazonS3","direccionUbicacionFisica","imgError","preventDefault","imgLoad","SummaryOrderConceptValueComponent","posologia","valorConcepto","jsonHistoriaClinicaActual","jsonOrdenMedicaDetalle","procesarJson","Be","Comentarios","be","ke","observaciones","NavigationService","history","urlAfterRedirects","back","getNavigator","canShare","share","nav","Promise","reject","isNavigatorAvailable","SummaryOrderDownloadButtonComponent","navigationService","buttonText","onClick","compartirArchivo","fallbackDownload","blobUrl","href","download","click","ctx_r4","SummaryOrderFooterComponent","observe","Breakpoints","mobileNext","nombreTipoSolicitud","buttonPrimaryText","matches","buttonSecondaryText","verOrdenes","idTipoSolicitud","irInicio","SummaryMedicalOrderComponent","medicalOrderSevice","requestsToVerifyService","medicalOrderService","printsService","patientService","nombreConcepto","PatientVerificationDataModel","solicitud","idPersonaEmisora","historialAtencion","ubicacionFotoLogoTitulo","empresaPortal","denominacion","numeroTelParticular","numeroTelCelular","direccionLaboral","Ut","inWorflow","confirmModel","processAttentionsHistory","mapMedicalOrderIntoHistory","showNumbers","M","ce","order","detalles","mapMedicalOrderDetails","idPacientePhr","idEmpresaPortal","idResponsableDoctor","idEmpresaCorporativa","numeroSolicitud","cantidad","Cantidad","initializeHistory","parseControlData","setRequestTypeAndFilters","processComments","diagnosticos","getDiagnosis","loadDoctorAndpatientData","setDate","requestType","filterAtenciones","mapAtenciones","atencion","setItems","comentarios","idConcepto","CONCEPTOS_ID","showHtmlComment","htmlComment","bypassSecurityTrustHtml","contactoClinico$","publicProfile$","forkJoin","patient","getPublicProfileByIdNext","getFile","initialLoading","primeraAtencion","valorLocalizacion","idAreaSistemaImpresion","MY_MEDICAL_ORDER_PRINT_SYSTEM_AREA","pt","_f","idResponsableImpresion","ot","Ct","_g","_h","urlLogoEmpresa","htmlReporte","formatoHoja","Wt","yt","_j","_k","wt","Qt","_l","_m","idContactoClinico","xt","_o","_p","idHistoriaClinicaActualQR","dn","pn","ut","idHistoriaClinicaActualInicial","_q","_r","mn","_s","fechaOrdenMedica","comentario","hn","_t","_u","summaryOrderSignComponent","licenciaProfesionalInfo","urlFirma","numeroOrden","categorias","obtenerCategoriasPorTiposolicitud","Vt","_v","buildFile","byteCharacters","atob","pdfBase64","byteNumbers","byteArray","Uint8Array","blob","Blob","File","fileName","conceptos","mapearConceptos","currentRequestTypeName","TITLE_MAPPING","requestTypeName","dateString","configData","idConceptoObjeto","TIPO_CONCEPTOS_ID","diagnosis","valorCodigoTerminoReferenciaConceptoClinico","truncate","lastItem","diagnosticosLabel","maxLength","substring","ComponentName","ctx_r12","ProfileMenuComponent","authService","loadData","setLoggedInUser","sort","d1","d2","J","loggedInUserInitials","ee","onEditUserClick","ConfigurationPageDialogModel","onAddDependentClick","onPaymentsClick","onLocaleEditClick","onChangePasswordClick","ChangePasswordRouteDialogModel","closeSession","removeFloatingComponentToHeader","homeUrl","dummyComponentData","ContainerType","NotFoundComponent","goHome","AvatarInitialsComponent","avatarInitialsObject","iniciales","PublicProfileAvatarComponent","_model","profileInitialsColor","profileInitials","profileTypeIconClassName","getProfileTypeIconClassName","legacyAvatar","getProfileTypeIconClassNameForPanamaAsistencia","ctx_r21","ctx_r38","ctx_r58","SearchDoctorsComponent","territorialDivisionsService","cityControl","searchDoctorsForm","FormGroup","headquartersCompIds","idEmpresasSedes","resultWrapper","DoctorSearchResultUIWrapper","placeholderTexts","cityText","countryText","configuracionBusquedaLocalidad","locationConfiguration","loadAllCities","filtered","_filterCities","filteredLocationsGroups","goupCities","localidadesPorDefecto","locationGroups","setDirectorySearchProfileTypes","initializeFromQs","outerWidth","qsParams","disableSearch","tp","ds","onlyDoctorsProvider","clinicalConcept","DoctorSearchResult","claseId","idTc","idC","fireSearchEvent","filtros","filtersObj","provider","providers","profileSearchTypes","searchProviderTypes","onOptionSelected","selectedCity","navigateToSearchResult","useSearchEvents","onSearchClick","autoCompleteDisplayWith","onAutocompleteOpened","onAutocompleteClosed","clearSelectedName","clearSelectedLocation","openPanel","filterValue","locations","values","TerritorialDivisionGroup","getLocationDisplayNameFromLevel","niveles","idP","clickout","elResults","elSearchBox","hide","onSearchInputClick","onSearch","searchTimeout","clearTimeout","disabledSearch","doSearch","isAutoCompleteEnabled","searchValue","addItem","wrappersTrackBy","classId","resultsTrackBy","territorialDivisionsTrackBy","setSelectedClinicalConcept","time","SearchResultsQsParameters","idDt","rUrl","ProfileSearchMessage","doctorSearch","conceptClaseId","territorialDivisionIdentification","onDoctorClick","getPlaceholderText","getDisplayColumns","areDoctorsResults","parentData","showOnlyDoctors","ex","hidden","isEmpty","isHidden","relatedComp","empresasRelacionadas","searchDone","Ce","wrapper","w","DoctorSearchResultUIWrapperGroup","clase","getClassItems","isClassGroup","getDirectoryItems","isDirectoryGroup","getDoctorItems","isDoctorGroup","displayName","SpinnerComponent","StatesRequestVerifyComponent","gotoHome","buttonSecondaryActionFn","TeleconsultaService","getByIdEstado","ctx_r23","ctx_r25","ctx_r27","ctx_r29","SummaryAppointmentCheckoutComponent","appointmentService","teleconsultaService","AppointmentSummaryDataModel","appointmentInfo","AppointmentInfoDataModel","isAndroid","userAgent","enablePublicProfileLink","loadDataModel","loadFromAppointment","getTeleconsultaInfoIfVirtual","U","ge","W","licensedCompany","idEtapa","getAppointmentId","utcDate","toDate","endDateUtc","fechaFinalizacion","observables","appointmentStateName","getDependents","loadModelFromAppointment","idTeleconsulta","appointmentInfoDataModel","cancellationDate","doctorName","doctorSpecialty","attentionPlaceAddress","medicalConsultationType","medicalConsultationAmount","patientName","getPatientGender","PublicProfile","parseFloat","specialty","pendingApproval","locationLat","locationLng","phoneNumber","telefonoLocalidad1","telefonoLocalidad2","gender","showMyAppointments","getCallNumber","getWazeUrl","locationZoom","getVirtualConsultation","openDialogContact","onCancelAppointmentClick","onReScheduleAppointmentClick","pp","isVirtual","UserPaymentComponent","paymentsService","currencyPipe","payment","gotoPayments","getFormatedAmount","amount","toFixed","onPaymentClick","loadingPayment","onDownloadTransactionPdfClick","loadingPdf","downloadURL","nombrePacientePhr","fechaTransaccion","toDateString","transactionTranslation","CustomCurrencyPipe","UserPaymentsListComponent","payments","paymentTrackBy","idPagoElectronico","idTransaccionFacturaProveedor","formatPaymentAmount","onNewPaymentClick","EditUserComponent","loadAvailableCountries","countryControl","loadUserData","anotherCountry","onUserSaveClick","UpdateUser","updated","idEstadoValidacionIdentidadPersona","qe","StateType","ViewUserComponent","ae","residenceCountryName","onUserEditClick","cls","Debounce","delay","propertyKey","descriptor","timeout","original","apply","WorkflowLookupRegistry","WorkflowLookup","CapitalizeDirective","onInput","input","capitalize","CenterInputDirective","elementRef","behavior","block","onFocus","setElementRef","onlyMobile","thisElementRef","scrollIntoView","scrollIntoViewOptions","MatSelectCustomDirective","matSelect","disableOptionCentering","openedChange","matSelectOpenedChange","agregarClaseParaManipularUbicacionDeOptiones","isArray","opened","matSelectPanel","panel","procesarPanelPadreAbiertoYqueContieneLaClase","cdkOverlayPanel","parentElement","moficarLaPosicionDelPanel","bottom","isNaN","onTouchMove","activeElement","blur","TouchMoveListenerDirective","__decorate","MEDICAL_REQUEST_STATE","MY_MEDICAL_ORDERS_TITLE","LABORATORY_ORDER","MEDICAL_PRESCRIPTION","RADIOLOGY_ORDER","MEDICAL_ORDERS_LANDING_TITLE","MEDICAL_ORDER","MY_MEDICAL_ORDERS_CARD_TEXT","MY_MEDICAL_ORDERS_BUTTON_TEXT","MY_MEDICAL_ORDER_EMPTY_STATE_TITLE","MY_MEDICAL_ORDER_EMPTY_STATE_TEXT","MY_MEDICAL_ORDER_DETAIL_COUNT_TEXT","SystemAreas","NotificacionType","OnlineAppointmentStatus","SignupWorkflowVerificationType","static","dateToValidate","stringToValidate","MaterialModule","MatFormFieldModule","MatInputModule","MatSliderModule","MatButtonModule","MatCheckboxModule","MatToolbarModule","MatAutocompleteModule","MatIconModule","MatSidenavModule","MatDividerModule","MatListModule","MatSelectModule","MatCardModule","MatProgressSpinnerModule","MatMenuModule","MatTableModule","MatPaginatorModule","MatChipsModule","MatProgressBarModule","MatDialogModule","MatTabsModule","MatExpansionModule","MatTooltipModule","MatMomentDateModule","MatDatepickerModule","MatRadioModule","MatSlideToggleModule","DragDropModule","MatSnackBarModule","MatButtonToggleModule","PortalModule","Person","componente","FormControlComponent","isVisible","CARD","descripcion","formId","showFormTitle","showFormSubtitle","showControlTitle","PublicProfileDetailType","BaseRequestModel","DirectoryFiltersItemType","OAuthFlowType","None","OAuthSourceType","BaseWorkflowState","requestModel","WorkflowInitialData","getIdVerificacion","getDoctorAvatarUrl","urlAvatarResponsableServicioDestino","getUserId","usuarioSolicitante","getIdTipoSolicitud","getPosition","workflowPosition","emailPersonaEmisora","emailParticular","RequestingUser","urlAvatar","setEmmiterPersonId","setPosition","setPublicProfile","getPatientName","setPatientName","getPatientEmail","emailPaciente","setPatientEmail","getPatientValid","isValid","setPatientValid","relacionEmisorPaciente","getPatientIdRelationship","setDependents","setPatientRelationship","setPatientIdRelationship","patientId","relations","setRelations","getPatientId","getUserPhrId","idUsuario","OnlineAppointmentRequest","numeroCelularContacto","nombreResponsableServicioDestino","especialidadResponsableServicioDestino","nombreProcedimiento","pacienteSolicitante","etapasSolicitud","getRelationship","setRelationship","setPatientId","RequestingPatient","setDependentsFlow","flujoDependientes","getUsername","getRequestingUser","getRequestingPatient","isDependentsFlow","setPatientDataInitiallyIncomplete","incomplete","patientDataInitiallyIncomplete","getPatientDataInitiallyIncomplete","setPatient","firstname","lastname","numeroCelularParticular","cellPhone","identityPersonValidationStateId","getPatientFormData","patientForm","PatientFormAppointmentDataModel","isUserPatient","birthdate","setPatientFormData","getUserPhone","setUserPhone","userPhone","getPatientPhone","setPatientPhone","patientPhone","patientEmail","getContactType","tipoContacto","setContactType","contactType","getAppointmentSummary","summary","getCountryId","setCountry","OnlinePaymentRequest","getTargetUrlAvatar","getTargetUsername","getTargetSpecialty","getUserName","getAmount","pagoDetalle","monto","setAmount","PayModel","setCreditCardType","creditCardType","tipoTarjeta","getCreditCardNumber","numeroTarjeta","setCreditCardNumber","cardNumber","getCreditCardExpirationMonth","mesExpiracionTarjeta","setCreditCardExpirationMonth","expMonth","getCreditCardExpirationYear","anioExpiracionTarjeta","setCreditCardExpirationYear","expYear","getCreditCardCvc","cVVTarjeta","setCreditCardCvc","cvc","getCreditCardFullName","setCreditCardFullName","firstName","rest","lastName","getPhoneNumber","numeroTelefono","setPhoneNumber","AgeFromBirthdayPipe","ahora","minute","second","millisecond","nacimiento","edad","currencyCode","digitsInfo","RegExp","number","displayStr","getCurrencySymbol","formatCurrency","HighlightPipe","tagName","filteredSearch","I18nTextPipe","SafeHtmlPipe","html","SafeUrlPipe","bypassSecurityTrustResourceUrl","CancelAppointmentDialogComponent","solicitudPaciente","AppointmentCancelledMessage","FutureAppointmentsComponent","resultsCount","setPageResults","onPageChange","startIndex","pageIndex","endIndex","pageAppointments","appointmentTrackBy","desc","A","openCancelAppointmentDialog","onReprogramAppointment","skeletonItems","repeat","MatPaginator","group_r8","TimelineListComponent","TimelineWrapperItemType","_items","onItemsChange","newItems","populateItems","addToGroup","getGroup","getGroupKey","addNewGroup","groupKey","TimelineWrapperGroup","getDateAsStr","collapsed","PastAppointmentsComponent","TimelineWrapperSkeletonItem","TimelinePatientAppointment","getStateName","getStateClass","isIncomplete","navigateToPublicProfile","navigateToAppointmentPage","getItemType","showTime","showDate","ctx_r19","CancelledAppointmentsComponent","canceledStateName","missedStateName","appointmentsArray","MatTableDataSource","paginator","OnPageChange","appointmentsPage","AppointmentsTabsComponent","MenuMobileComponent","postNavigateSource$","ProfileMenuDialogComponent","pushState","LoggedInMenuButtonComponent","setProfilePhoto","onMenuClick","DialogOpenMessage","AnonymousLanguageMenuComponent","AnonymousLoginSignupMenuComponent","onCliniwebForDoctorsClick","cliniwebUrl","onCliniwebForPatientsClick","onLoginClick","onSignupClick","goToPortal","portalUrl","goToPortalPublicProfilePage","onViewAppointmentsClick","AnonymousMenuComponent","loadProfile","concatMap","showLoggedInMenu","onLoggedInUser","HeaderComponent","isPublicProfilePage","isSearchProfilePage","floatingComponents","routeDialogOpened","publicProfileMenuModel","HeaderComponentPublicProfileMenuModel","useAvatarPadding","openMenuMobile","onLogoClick","gotoPayment","PublicProfileActionMessage","onAppointmentBtnClick","PolicyMenuContentComponent","googleAnalyticsService","tipoIdentificacionPoliza","cedula","policyTrackBy","numeroPoliza","goToPolicy","policyNumber","PolicyMenuComponent","ctx_r2","HeaderSuraComponent","scrollingBodySource$","showSmall","showHeaderSmall","lastHeaderChangeTime","urlCompany","userLoggedIn","goToHome","VirtualConsultationLinkboxComponent","MedicalAppointmentsLinkboxComponent","ResultsLinkboxComponent","HistoriaClinicaLinkboxComponent","UnreadClinicalExamComponent","ClinicalConceptService","getFrequentSymptoms","getInsuraceConcepts","SelectSymptomsComponent","clinicalConceptService","ENTER","COMMA","filteredSymptoms$","symptomCtrl","debounceTime","filteredSymptoms","symptomSelectedIds","s","existsResults","frequentSymptoms","checkActiveVirtualAttention","configureForm","virtualAttentionFinished","goToPastVirtualAttentions","LoadChatMessage","OpenChatMessage","loaded","showItems","FormConfigurationMessage","addSymptom","currentSymptom","newSymptom","ClinicConcept","nombreTipoConcepto","idFuenteReferencia","idTerminoReferencia","addSymptomClick","symptomInput","removeSymptom","symptom","splice","selected","symptomName","autocompleteOpened","matAutocomplete","parentPanelContainer","parentNode","dropdownAbovePosition","autoCompleteOpen","autocompleteClosed","isSelectedFrequentSymptom","frequentSymptom","selectedFrequentSymptoms","toggleFrequentSymptom","onClickStartConsultation","openEmptySymptomsDialog","openPoliciesDialog","acceptedPolicies","startClinicalContact","colorConfirmButton","allSelectedSymptoms","sy","idAreaSistemaDestinoConsultaVirtual","OrderByPipe","field","MenuLinkComponent","mediaObserver","isMobile$","some","mqAlias","onToggleBottomSheetSubjectNext","ID_AREA_SISTEMA_MI_SALUD","expanded","hasOptions","menuItem","ID_AREA_SISTEMA_MIS_CITAS","showNotification","cantidadCitasFuturas","notificationValue","onLinkSelected","isMiSalud","linkUrl","startsWith","isLinkActive","substr","isSublinkActive","getTooltip","getIconName","iconName","nombreIcono","pipes","MenuComponent","menuLanguage","populateLinks","urlBack","user$","hideUrlBack","onBackClick","MyHealthComponent","onAddFamily","stopPropagation","setTabSelected","relativeTo","queryParamsHandling","_getUserLoggedIn$","_getUserDependents$","zip","queryParamMap","loadDepedentsData","configTabIndexByParam","indexDependent","selectedTabIndex","CliniwebMenuComponent","mediaMatcher","cargando","miSaludMenuOpen","profileMenuOpen","resto","ID_AREA_SISTEMAS_MI_SALUD","profileFloatingMenuTrigger","menuOpened","menuClosed","openProfile","matchMedia","openMenu","closeProfileMenu","closeMenu","MatMenuTrigger","ChatHistoryDialogComponent","ChatHistoryWrapper","chatDate","timeElapsed","ChatHistoryMessageWrapper","PastVirtualConsultationComponent","consultations","TimelineVirtualAttention","consultation","urlAvatarPaciente","openChatHistory","navigateToVirtualConsultationPage","VirtualConsultationTabsComponent","componentesArray","ClinicHistoryTabsComponent","clinicHistoryService","onSelectTab","ClinicHistoryMessage","tabs","TabClinicHistoryConfiguration","GroupConcept","item_r8","ctx_r57","ctx_r62","AttentionHistoryComponent","createTimelineAttentions","dtos","conclusionGroup","historialAtenciones","attention","AttentionHistoryViewDTO","fechaContacto","avatarResponsableServicio","colorIniciales","claveSubtitulo","conclusionItems","basicItems","conceptosConclusiones","AttentionHistoryItemViewDTO","conceptosBasicos","existenConclusiones","timelineAttentions","TimelineAttentionHistory","extensionDocumento","ubicacionWebDocumento","FileViewerDto","getConsultationDocumentAsViewerItems","documentos","fileDto","FileViewerItemDto","nombreBucketAmazon","createdAt","fechaRegistro","nombreDocumento","onClickLinkViewMore","viewMore","tieneConceptosBasicos","tieneDocumentos","MedicinesComponent","createViewDto","MedicinesViewDTO","asunto","responsable","conceptosMedicamentos","MedicinesItemViewDTO","tieneConceptos","MedicalHistoryComponent","antecedentes","MedicalHistoryViewDTO","icono","getIconNameByGroup","groupArray","iconname","n","AutocompleteMultipleSelectionComponent","_selectedOptions","selectedOptions","searchInputCtrl","onFilter","removeOption","onSelectionChanged","MatAutocompleteTrigger","ctx_r36","ShareDialogComponent","HcShareView","FilterItems","arr","shareDialogData","areas","check","currentView","SelectItems","AttentionFilters","loadDoctordata","contact","DoctorData","initDoctorData","optionHasFilters","onFilterClick","confirmFilters","shareButtonEnabled","someAreaSelected","allAreasSelected","filterDoctors","getDoctorDisplayName","doctor","onDoctorSelectionChanged","selectedDoctors","setSelectedDoctors","getSummary","startDate","selectedDocs","getSelectedDoctors","selectedSections","Secciones","areEmpty","FechaIncio","IdsResponsablesServicios","IdPaciente","getDownloadFileName","getIdentifier","getDisplayName","doctors","filteredDoctors","addAllDoctorsSelection","removeAllDoctorsSelection","selectedIds","ClinicHistoryShareComponent","onClickShareButton","StudiesLaboratoriesComponent","StudiesLaboratoriesViewDTO","conceptosLaboratorios","StudiesLaboratoriesItemViewDTO","HeaderMapfrePanamaComponent","initRouteClassName","routeClassName","ClassConcept","ctx_r39","ctx_r40","ctx_r41","ctx_r42","ctx_r43","ctx_r45","ctx_r46","ctx_r47","ctx_r48","ctx_r49","ctx_r50","SearchProvidersComponent","initFromParams","configSearchProviders","configSearchLocations","cityDefaultText","stateDefaultText","sendControlComponentClassname","_paramMap","SearchQsParamMapModel","param1","param2","param3","param4","param5","_qsParams","SearchQsParametersModel","populateDropdownByParams","getPlaceholderProvider","placeholderProvider","getPlaceholderLocation","placeholderLocation","ControlComponentClassnameMessage","SearchProvidersComponentConfiguration","_locationObjectSelected","LocationSearchResultItem","searchProviderCtrl","providerSelected","locationDefault","conceptIds","conceptSelected","seccion3","locationObjectSelected","searchLocationCtrl","filteredResults$","loadingSearchProvider","startWith","filterProviders","highlightValue","filteredResultsCount","groupProviderResults","hideLocationAutocomplete","locationLevels","filteredLocationResults$","loadingSearchLocation","comboLocation","filterDefaultLocations","filteredLocationResultsCount","filterLocations","optionsGrouped","getLocationSearchGroupByDefault","textValue","og","autocompleteOpen","profilesDefault","getProfilesDefault","_profileSearchTypes","profileTypes","locationAutocompleteOpen","getLocationsByLevels","removeSearchProviderSelected","removingSelection","reset","searchInput","autocompleteProviderTrigger","_onChange","updatePosition","removeSearchLocationSelected","searchLocationInput","autocompleteLocationTrigger","_resultGroup","_resultsGrouped","sd","resultGroupItem","DoctorSearchResultGroup","getOptgroupLabelProvider","optgroupFocusAreaText","profileSelected","removeClassnameSearchOpenedToBody","_optionSelected","_clase","isExtremeMobile","locationSelected","closeAutocompleteLocationpanel","autoCompleteProviderDisplayWith","autoCompleteLocationDisplayWith","onKeydownInputSearch","onKeydownInputLocationSearch","addClassnameSearchOpenedToBody","onFocusInputSearch","onFocusInputLocationSearch","matAutocompleteLocation","onBlurInputSearch","onBlurInputLocationSearch","showingCancelSearchProvider","onCancelSearchProvider","closePanel","disabled","showingCancelSearchLocation","onCancelSearchLocation","autocompleteProfileOpened","autocompleteLocationOpened","autocompleteLocationClosed","showIconDropdownOption","getIconClassNameDropdownOption","iconClassName","showAvatarDropdownOption","showDescriptionDropdownOption","isDoctor","tipoPerfilPublico","onClickSearchButton","doctorSearchResult","urlImagen","_searchText","_providerSearchMessage","ProviderSearchMessage","_section1Grouped","seccion1","LocationSearchResultGroup","getLocationDisplayNameFromLevelDefault","td","seccion2","_territorialDivisionGrouped","getAvatarModel","showCloseIcon","SearchResultTitleComponent","aseguradora","lugar","perfilBusqueda","preposicion","textoPrep","windowResize","windowResizeEvent","texto1","truncar","texto1Tamanios","texto2","texto2Tamanios","texto3","texto3Tamanios","arg2","listKeys","maxWidth","ellipsis","ProviderFiltersDialogComponent","clearFilters","ProviderFiltersContentComponent","publicProfileTypes","getDirectoryFilters","onChanges","onChangesInputs","filterModel","preloadSelectedFilters","dataDialog","ProviderFiltersDialogComponentData","providerSearchMessage","isDialogOpened","getSelectedFilters","selectedConcepts","getSelectedConceptsObject","removeFilter","ProviderFilterModel","directoryFilters","loadFromModel","loadFiltersArray$","isDropdown","loadFilters","active","clinicConceptId","prefilters","conceptType","filtersString","getFiltersIds","locationCompanyIds","clinicConceptType","resultItem","loadOption","filterByParams","filterSelected","getSelectedConcepts","filterIds","insuranceFilter","favoriteFilter","ProviderFilterModelItem","controlId","favoriteFilterId","idClaseConceptoClinico","idConceptoClinico","selectedList","getSelectedConceptIds","concepts","sc","n_cc","singleSelection","num","displayValue","nombreClaseConceptoClinico","showInputSearch","mostrarInputSearch","hideOnDesktop","ocultarEnDesktop","seleccionSimple","grupos","viewConfig","configuracionVista","isFavoriteFilter","needToLoadOptions","needToFireSearchOnClick","optionsSubj","selectedConcept","op","pf","getIconClass","iconClass","getOptionsObserver","selectOption","ProviderCardComponent","profileService","goToProfile","rutaNavegacion","locationTrackBy","getLocationTabTitle","textTitle","isDoctorProfile","isClinicProfile","getWebsiteUrl","sitioWeb","loadSocialNetworks","socialNetworksLoading","socialNetworksLoaded","socialNetworksList","sn","SocialNetworkDto","networkType","idObjetoDetalle","objetoDetalle","getSocialNetworkIconClassName","getOptionTextSocialNetwork","setLocationSelected","tabEvent","SearchResultsComponent","showDivider","resetSearch","updateRoute","searchProviders","setSearchCountryByCountryApp","initRouteConfig","setSearchCountry","getElementsByTagName","fireSearchByParams","_id","conceptNavArray","tdArray","go","getTitleText","loadingInitialResults","doSearchProfilesSubscribe","unsubscribe","doSearchProfiles","providersResult","pageNumber","disableScroll","onScrollDown","loadMoreProfiles","handleScroll","windowHeight","innerHeight","pageYOffset","cantidadTotalResulados","perfiles","loadingResults","localidades","exists","showResults","showEmptyState","providerTrackBy","profileTypesArray","getLocationsByProvider","onShowFullDescription","showFullDescription","searchCountry","searchResultTitleComponent","getAllProfileTypes","subtitle","subtitulo","fullDescription","descripcionDetallada","getFiltersString","_results$","countryIdentification","AnonymousLanguageMenuTitle","themeColorService","themeColor","titleItem","background","AnonymousLanguageMenuItemComponent","_elementRef","MatIcon","UnlicensedMenuComponent","withLatestFrom","showLogout","onCliniwebLogoutClick","menuTrigger","onMenuClosed","onMenuOpened","ANDROID","IOS","HeaderTownCenterComponent","hasLicenses","HeaderHospitalPaitillaComponent","navigateToCompany","gotoBack","HeaderHospitalNacionalPhrComponent","HeaderCmpaitillaPhrComponent","HeaderHchiriquiPhrComponent","HeaderCmcaribePhrComponent","HeaderThepanamaclinicPhrComponent","HeaderChsfPhrComponent","HeaderChpanamericanoPhrComponent","HeaderHsantafePhrComponent","HeaderPacificaSaludPhrComponent","endWorkflow","WorkflowProgressBarComponent","backFn","WorkflowStepName","BaseStep","onBeforeFormLoad","buildComponentConfigurationData","attachToComponentEvents","attached","messageForThisStep","handleComponentSetDataMessage","sendFlowStepCompletedMessage","FlowStepCompletedMessage","stateData","AuthenticationStep","workflowService","showProgressBar","showButtonClose","withoutFooter","setState","isCompleted","completeUserDateState","WorkflowStateUpdateMessage","showStepInActionBack","showStep","getAuthenticationDataModel","dataModel","AuthenticationDataModel","stepItemData","SelectCountryStep","getCountryDataModel","condition","SelectPatientAppointmentCheckoutStep","showButtonBack","relationshipSelected","_dataModel","patientSelected","PersonDataModel","getSelectPatientDataModel","SelectPatientDataModel","requestingUser","avatar","requestingPatient","PatientFormAppointmentCheckoutStep","patientFormDataCompleted","patientData","containsGender","isBirthdateValid","SelectPatientRelationshipAppointmentCheckoutStep","getSelectPatientRelationshipDataModel","SelectPatientRelationshipDataModel","PatientContactFormAppointmentCheckoutStep","updateUserPhoneNumberLoggedIn","getPatientContactFormDataModel","PatientContactFormDataModel","SummaryAppointmentCheckoutStep","PaymentAmountComponent","PaymentAmountComponentDataModel","amountInputEl","onAmountInputClick","selectionStart","selectionEnd","onAmountInputKeyup","keyCode","newChar","multiplier","pow","countDecimals","round","paymentAmount","validateInputNumber","onNextClick","invalidInput","ComponentDataSetMessage","PaymentAmountStep","getPaymentAmountComponentData","targetUserName","targetUserAvatarUrl","userName","IntlTelInputPlaceholderPipe","placeHolder","dialCode","PaymentComponent","paymentForm","creditCardControl","CreditCardValidators","expirationDateControl","cvcControl","fullNameControl","phoneNumberControl","creditCardNumberEl","profileName","profileSpecialty","especialidades","creditCardNumber","cardExp","creditCardExpMonth","creditCardExpYear","ControlNames","CardNumber","CardExpirationDate","CardCvc","creditCardCvc","creditCardFullName","FullName","PhoneNumber","onCreditCardNumberFocus","creditCardNumberFocus","creditCardTypeSubscribe","resolvedScheme$","onCreditCardNumberBlur","onCreditCardNumberKeyup","isCursorAtEnd","creditCardLastFourDigits","creditCardExpirationEl","isCreditCardExpirationValid","forceValidation","dateStr","expParts","expDate","onCreditCardExpirationKeyup","expValue","creditCardCvcEl","onCvcFocus","cvcFocus","onCvcBlur","onCreditCardSecretKeyup","onMobileLastFourDigitsClick","onPayClick","creditCardExpiration","expirationParts","PaymentComponentData","openDialogLegalAgreements","LegalAgreementsRouteDialogModel","PaymentFormStep","getPaymenComponentData","isNullOrEmpty","PatientVerificationStep","getDataModel","containsRelations","SummaryMedicalOrderStep","SelectPatientRelationshipStep","containsDependents","patientIdRelationship","getSelectPatientRelationshipModel","SelectPatientRelationshipModel","CreatePatientRelationshipStep","isUser","patientRelationshipSelected","getCreatePatientRelationshipModel","CreatePatientRelationshipDataModel","WorkflowStepService","authenticationStep","selectCountryStep","selectPatientAppointmentCheckoutStep","patientFormAppointmentCheckoutStep","selectPatientRelationshipAppointmentCheckoutStep","patientContactFormAppointmentCheckoutStep","summaryAppointmentCheckoutStep","paymentAmountStep","paymentFormStep","patientVerificationStep","summaryMedicalOrderStep","selectPatientRelationshipStep","createPatientRelationshipStep","createSteps","steps","nombreClaseItem","BaseWorkflowComponent","workflowStepService","WorkflowProgressBarComponentData","flowStepCompleted","closeWorkflow","loadStep","closeWorkflowIfQueryParamExists","urlWithoutQueryParams","currentUrl","replaceState","nicknameResponsableServicioDestino","currentStep","stepIndex","_loadStep","backToFlowStep","validationStepCompletedDisabled","buildProgressBarModel","configFooter","onBackFlowStep","doFlowStepCompleted","checkingStep","loadNextStep","updateState","WorkflowItemData","completeWorkflowStateData","updateWorkflowStateData","showWorkflowContent","getIdAreaSistema","progressBarModel","percentComplete","calculateProgressBarProgress","workflowStepsCount","currentStepIndex","setPercentComplete","percentage","LogoutBarComponent","appStoreService","profileImg","OnlineAppointmentCliniwebComponent","logoutFn","checkOnlineAppointmentStatus","startWorkflow","getStatusNext","status","onlineAppointmentStatus","showState","activatingAccount","userConfirmation","userConfirmationNext","isLoggedInFullNext","configStatusView","routerState","statesRequestVerifyDataModel","StatesRequestVerifyDataModel","companyLogoUrl","mainImageUrl","showActionButton","showHomeButton","buttonActionFn","continueWithAppointment","buttonTextRefI18n","textRefI18n","gotoAppointments","gotoSignup","textDescriptionRefI18n","getState","getStateByAppointmentCheckout","bootstrapState","appointmentCheckout","_state","_onlineAppointmentRequest","idResponsableServicioDestino","checkoutUrl","localizacion","idEmpresaOrigen","nombreEmpresaOrigen","onCloseWorkflow","usr","toCompleteStatus","completedStatus","expiredStatus","LoadingDialogComponent","OnlinePaymentWorkflowComponent","paymentService","sourceModel","continueWithPayment","getStateFromRequest","buildStateFromModel","requestId","_closeWorkflow","workflowCleanup","sendLoadingMessage","confirmRequest","createInitilRequest","tipoNotificacion","codigoVerificacion","sendCompletedMessage","sendErrorMessage","clearCreditCardData","showConfirmButton","savingDialogRef","ColaGobloDialogoComponent","AuthenticationComponent","isCliniweb","unlicensed","titleTextRefence","getTitleTextReference","redirectToSignup","signupWorkflowVerificationType","closeUrl","loginByGoogle","oidcModel","loadingGoogle","flowType","sourceType","stringState","openTermsDialog","openPrivacyDialog","onAppointmentKnowMoreClick","alreadyLoggedIn","workflowTypeActive","condicion","textReference","selectTitleTextByWorkFlowTyope","onGetUserPersonLoggedIn","AppointmentInfoDialogComponent","SelectPatientAppointmentCheckoutComponent","xe","showInitialView","showAppointmentInfo","_relationshipStringValue","patientRelationshipTypeForm","showForm","onClickContinue","_valueSelected","continueFlow","_dependentSelected","buttonDisabled","getUserAvatar","getDependentAvatar","openAppointmentInfoDialog","allowSpaces","regex","validacion","whitespace","PatientFormAppointmentCheckoutComponent","ValidatePersonName","ValidateGender","H","j","updateModel","SelectPatientRelationshipAppointmentCheckoutComponent","patientRelationshipForm","KeyboardService","zone","Observable","initKeyboardDetection","runOutsideAngular","visualViewportSizeChangedSubject","visualViewport","fromEvent","isKeyboardOpen","distinctUntilChanged","focus$","blur$","isKeyboardClosed","keyboardOpenSubject","merge","getVisualViewportSizeChangedObservable","getKeyboardOpenObservable","PatientContactFormAppointmentCheckoutComponent","keyboardService","userPatientMode","onChangeHeightContainer","setStyle","patientContactForm","contactRadio","requiredIfValidator","updateValueAndValidity","onClickFinish","predicate","formControl","PublicProfileHeaderComponent","urlPublicProfile","DefaultHeaderComponent","DefaultBackHeaderComponent","NavigationBackMessage","dialogType","DefaultBackWithLinkHeaderComponent","onOpenInNewWindow","CliniwebMedicalAppointmentsLinkboxComponent","onLinkClick","SearchProvidersService","openSearch","systemArea","getControlConfig","searchControl","searchComponent","searchProviderComponentName","CliniwebBookAppointmentLinkboxComponent","searchProvidersService","LatestDoctorsComponent","_latestDoctors","currentMaxDoctorsToShow","maxDoctorsToShow","finishedLoading","getMissingDoctorCount","onOtherClick","onNavigateToAppointmentClick","MostCommonSpecialtiesComponent","onDentistClick","onNutritionClick","onGynecologyClick","onPediatricsClick","HealthAlliesComponent","logo","subTitle","navigateToSearch","clinicalConceptId","PreventiveControlTipsComponent","onGeneralMedicineClick","onDermatologyClick","onOphthalmologyClick","CliniwebHomeLayoutComponent","loggedIn","person","CliniwebFutureAppointmentsComponent","sortByAppointmentState","appointmentsToShow","showAll","intervalId","checkFutureAppointmentTime","refreshAppointments","apps","onShowAll","a1","a2","CliniwebPastAppointmentsComponent","CliniwebTimelinePatientAppointment","getAppointmentsToShow","CliniwebAppointmentTabsComponent","SearchProvidersType","DEFAULT","searchType","searchParamMap","titleMobile","placeholderMobile","profilesPlaceholderClosed","profilesPlaceholderOpened","profilesLabel","showLocationsAutocomplete","locationsPlaceholderClosed","locationsPlaceholderOpened","locationsLabel","locationsDefault","locationsLikeCombo","showInsurersAutocomplete","insurersPlaceholderClosed","insurersPlaceholderOpened","insurersLabel","insurersDefault","insurersLikeCombo","ctx_r33","ctx_r44","ctx_r51","ctx_r69","ctx_r76","ctx_r78","ctx_r79","ctx_r80","ctx_r81","ctx_r82","ctx_r83","ctx_r84","ctx_r91","ctx_r103","ctx_r105","ctx_r106","ctx_r107","ctx_r108","ctx_r109","ctx_r110","ctx_r111","SearchProvidersV2Component","cdref","clinicalConceptsService","SearchProvidersConfiguration","configSearchByCountryApp","configSearchInsurers","initBySearchType","setDefaultsText","isAnonymous","configSearchByCountry","setLocationDefaultByCountry","lastestDoctors","toggleAutocompleteInsurance","getParamMaps","processUrl","queryString","segments","urlParams","URLSearchParams","initLikePopup","initEmptyProviderSearchMessage","initLikeWidget","searchOpened","collectParams","root","isSearchDefault","removeSearchInsuranceSelected","searchInsuranceCtrl","searchInsuranceInput","insuranceObjectSelected","insuranceUnfilteredResults","insuranceAutocompleteOpen","autocompleteInsuranceTrigger","optgroupDoctorText","triggerOpenPublicProfileByType","fullsize","closeSearch","gotoProfile","searchInputBlur","insuranceSelected","loadingSearchInsurance","autoCompleteInsuranceDisplayWith","onKeydownInputInsuranceSearch","scroll","onBlurInputInsuranceSearch","onCancelMobile","onClickSearchTextMobile","inputWrapperProvider","sendMessageIframeResizeOpen","sendMessageIframeResizeClose","inputWrapperLocation","autocompleteInsuranceOpened","matAutocompleteInsurance","inputWrapperInsurance","autocompleteInsuranceClosed","optionalText","showPreviewProviderPlaceholder","showPreviewProviderValue","getPreviewProviderValue","showPreviewLocationPlaceholder","showPreviewLocationValue","showButtonRemoveProvider","showButtonRemoveLocation","showHeaderMobile","getPreviewLocationValue","onFocusProvider","clearProviderSelected","onFocusLocation","clearLocationSelected","onFocusInsurance","clearInsuranceSelected","clearSearchSelected","isPopup","isWidget","onClickMobilePreview","closeDropdownProvider","closeDropdownLocation","closeDropdownInsurance","showSearchPlaceholderMobile","getSelectionTextMobile","getPlaceholderInsurance","getAvatarModelByLastestDoctor","prevLastestDoctors","lastestDoctorsIndex","maxLastestDoctorsToShow","nextLastestDoctors","showLastestDoctors","loadingLastestDoctors","showSearchTextOption","getSearchTextOption","setInsuranceBaseOnQueryParams","triggerSearchByType","redirectToSearchPage","goToSearhPage","publicProfileUrl","goToPublicPage","searchProviderUrl","getRelativeSearchPath","SearchProvidersUrl","serializeUrl","createUrlTree","countryDefaultText","dontApplyInsuranceText","childSnapshots","shift","selectedInsurers","filteredInsuranceResults$","filterDefaultInsurers","filteredInsuranceResultsCount","getInsuranceSearchGroupByDefault","onFocusInputInsuranceSearch","DefaultLogoHeaderComponent","DropdownTriggerForDirective","overlay","Subscription","toggleDropdown","isDropdownOpen","destroyDropdown","openDropdown","overlayConfig","OverlayConfig","hasBackdrop","backdropClass","dropdownPanel","overlayTransparent","fullscreen","scrollStrategy","scrollStrategies","positionStrategy","flexibleConnectedTo","withPositions","originX","originY","overlayX","overlayY","offsetY","overlayRef","create","templatePortal","TemplatePortal","templateRef","attach","dropdownClosingActionsSub","dropdownClosingActions","backdropClick$","backdropClick","detachment$","detachments","closed","dropdownClosed","detach","dispose","DropdownComponent","TemplateRef","CheckAutocompleteComponent","clasnameComponent","componentId","checkAutocompleteForm","optionsObs","ops","filteredOptions","filteredGroups","groupConcepts","filterItems","toggleAutocomplete","getClassNameButton","getButtonText","selectedOptionDisplayNameFtn","placeholder","onClickAutocomplete","onAutocompleteClick","optionClicked","toggleSelection","optionDeleted","isOptionSelected","onAutocompleteOptionsChanged","idAttributeName","onClearFilter","closeDropdown","dropdown","onFocusInputSearchDropdown","addPanelClass","setOverlayRef","optionFilterFtn","ProviderFiltersBodyComponent","fireFilterEvent","filterTrackBy","onFilterItemClick","filterSelectedCount","conceptsDeleted","_item","getNameI18n","getIdAttributeName","getOwnPropertyNames","ProfileFilterSearchResultConcept","onOptionChanged","optionsDeleted","conceptDeleted","getFilterMobileClassName","getFilterMobileText","filterText","PublicProfilePageHeaderComponent","setHeaderLogo","directoryName","headerLogo","CountryFormCheckoutComponent","errorObservable","errorSubject","loadCountry","onCountrySelected","MedicalOrderWorkflowComponent","requestToVerifyService","checkMedicalOrderStatus","medicalOrderRequest","RequestToVerifyUpdateModel","tipoRelacionPacienteUsuario","esUsuarioNuevo","updatedUserLoggedIn","PatientVerificationComponent","configBirthday","patientBirthdate","PublicProfileToPublicProfileAvatarComponentModelConverter","enviar","sending","validateNext","MyMedicalOrdersEmptyStateComponent","tipoSolicitud","MyMedicalOrdersComponent","routeParamsNext","configByParams","getMedicalOrders","idsTipoContenidos","getTypeByLink","nombreTipo","nombreTipoCardText","nombreTipoButtonText","nombreConteoDetalle","medicalOrders","medicalOrder","publicProfileAvatar","idDoctor","avatarDoctor","nombreDoctor","viewMoreClick","uidOrdenMedica","MyOrderSummaryRouteDialogModel","ChartType","GrowthMeasurementUnitType","GrowthMeasurementsService","getByPatientId","getPercentiles","idEstandarMedicion","idTipoMedicion","rangoInicial","rangoFinal","idUnidadMedidaRango","getMeasurementTypes","getHcaFieldByType","chartType","getIntervaleByRangeAndType","rangeId","typeId","Gender","GrowthChartsTabDataTypeComponent","omsDataColor","genderClassMap","omsDataText","genderTextMap","GrowthChartsTabComponent","growthMeasurementsService","ranges","selectedRange","updateTab","fillAxisYText","renderCharts","measurements","chartContainer","getElementById","innerHTML","emptyStateDiv","codigoEstandar","codigoUnidadMedida","percentiles","selectedRangeObj","mediciones","getPatientGrowthMeasurementsByRange","groupedData","reduce","acc","legendText","dataPercentile","CanvasDataModel","markerSize","indexLabelFontSize","indexLabelFontFamily","indexLabelFontColor","showInLegend","dataPoints","dataPatient","lineColor","markerColor","animationEnabled","animationDuration","axisY","axisYText","titleFontSize","titleFontFamily","titleFontColor","includeZero","interval","intervaloY","axisX","toolTip","contentFormatter","entries","dataSeries","dataPoint","xReference","yReference","references","fontColor","fontSize","AxisXCanvasDataModel","nombreUnidadMedida","intervaloX","minimum","maximun","viewportMinimum","viewportMaximun","chart","CanvasJS","Chart","render","hca","PesoTalla","Percentiles","Unidad","valorTallaCm","valorPesoKg","prev","curr","Valor","minimumFractionDigits","maximumFractionDigits","measurementsForRange","edadTotal","getDecimalAge","edadAnios","edadMeses","edadDias","getAxisYTextByType","getAxisYByType","yearAge","monthsAge","daysAge","unitType","valorIMC","valorCircunferenciaCefalicaCm","img","src","alt","selectedRangeText","tipoMedicion","tabText","textDiv","rangeTextSpan","rangeSelect","additionalTextDiv","GrowthChartsComponent","GrowthChartsModel","initAvatarUploadOptions","measurementTypes","initGrowthChartTabs","tabChangeSubject","_onTabChange","updateDoctor","selectedDoctorId","getGrowthMeasurementsPatient","patientAvatar","patientObject","patientDependentRelationId","patientLastName","patientBirthDate","patientRelationType","onTabChange","trueIndex","initializedTabs","setSelectedTabIndex","showDoctorSelect","loadGrowthData","growthMeasurements","idResponsableMedicion","doctorId","tabLoading","responsablesAsociados","growthTabsModel","fill","GrowthCurvesWorkflowComponent","growthCurvesRequest","confirmacionResponse","SelectPatientRelationshipComponent","CreatePatientRelationshipComponent","configTitle","createPatientRelationshipForm","relationTypes","viewValue","relationTypeIds","relationTypeId","ProviderCardContactsComponent","mapObjetoToArray","icon","objetoDetalle1","objetoDetalle2","objetoDetalle4","ProviderCardLocationComponent","setLocationIconClass","setLocationAddress","setLocationAvailability","setLocationTitle","diLocalidad2","diLocalidad1","endsWith","locationAddress","locationIconClass","availability","citaEnLineaHab","locationAvailability","goToProfileEvent","onClickHowToGetButton","locationTitle","objetoDetalle3","empresaObjetoPerfilPublico","empresaPerfilPublico","ProviderCardProfileComponent","ProfileResultModel","setAvatarModel","setIsPharmacyProfile","setFeatureConcepts","setShowAvatarInitials","setProfileTypeIconClassName","foto","showAvatarInitials","isPharmacyProfile","featuresConceptsObject","conceptosDestacados","featureConceptIconClassName","featuresConceptsText","profileTypeIconMap","SharedModule","bootstrap","FormsModule","ReactiveFormsModule","FlexLayoutModule","L10nTranslationModule","L10nIntlModule","RouterModule","NgxSkeletonLoaderModule","InfiniteScrollModule","ToastrModule","RecaptchaModule","RecaptchaFormsModule","CreditCardDirectivesModule","NgxMatIntlTelInputModule","GoogleMapsModule","i3","i6","production","apiUrl","cloudHubUrl","logLevel","searchProfilesPageSize","googleApiKey","cKey","googleFileViewerUrl","googleCaptchaSiteKey","encryptLocalStorage","idEmpresaCliniwebPHR","nombreEmpresaCliniwebPHR","cliniwebPhrUrl","gatewayUrl","AuthGuard","LocationLanguageComponent","ShowNonProdGuard","AuthPrivateRoutesGuard","isRouteValid","isRestrictedRoute","AppInitializationGuard","loadChildren","WelcomeModule","resolve","l10n","L10nResolver","l10nProviders","asset","LoginModule","SignupModule","SearchResultsModule","animation","PublicProfilesModule","AppointmentsModule","PaymentsModule","MedicalOrdersModule","GrowthCurvesModule","SupportModule","PrivacyPoliciesModule","TemplatePanelModule","WidgetModule","ChartsModule","HomeModule","AppRoutingModule","BrowserModule","BrowserAnimationsModule","relativeLinkResolution","initialNavigation","EmptyDialogComponent","CustomSnackBarComponent","snackBarRef","dismiss","getIconClassname","getTypeClassname","MAT_SNACK_BAR_DATA","AppointmentsSignalRService","appointmentEvent","appointmentChangedSubject","onAppointmentChangedReceived","NextAppointmentDialogComponent","SelectCountryDialogComponent","ErrorDialogComponent","ThemeLoaderService","head","insertedElement","themeName","default","insertToDom","GoogleMapsLoaderService","load","promise","script","async","defer","onload","onerror","overlayContainer","iframeMessageService","matIconRegistry","themeLoaderService","dateAdapter","contexts","snackBar","appointmentSignalRService","googleMapsLoaderService","registerFontClassAlias","messageBusSubscriptions","googleAnalyticsConfig","workarroundForRouteDialog","openFromComponent","horizontalPosition","onUrlChange","snapshotUrl","isntExceptedUrl","containsLanguage","lastUrl","NavigationStart","navigationTrigger","pathName","Q","P","reloadPage","checkNextAppointmentAlert","selectCountryDialogOpened","setHeaderComponentName","toggleHeaderView","loadDirectoryTheme","setOverlayMaterial","setFavicon","setManifestUrl","setIframeModalActions","manageVirtualAttentionActions","manageSessionExpiredAction","manageServiceErrorAction","setDateAdapter","startNewAppointmentsListener","setCountryByUser","setZIndexInitialValue","isDesktopMac","googleMapsLoader","configByReferralMedical","interconsulta","referralMedical","ReferralMedical","routeQueryParamsSubscribe","getDirectoryClassName","setThemeProperties","initAppointmentSignalR","hasJointGroup","IdUsuario","getRouteAnimationData","getContext","he","ie","fe","getActiveVirtualAttention","overlayContainerClasses","getContainerElement","themeClassesToRemove","htmlElement","appleHtmlElement","currentTheme","manifestUrl","dummyDialog","iframeZIndex","isIframeModalOpen","sessionExpiredPopupOpen","serviceErrorPopupOpen","ID_AREA_SISTEMA_INICIO","ID_AREA_SISTEMA_DOCTORES","hasNextAppointmentAlert","lastTimeShown","creationDate","showNextAppointmentAlert","AppComponent","ErrorInterceptor","intercept","handle","statusText","sendLogs","fallback","cache","keySeparator","defaultLocale","currency","defaultRouting","AppStorage","read","write","HttpTranslationLoader","LocaleValidation","parseNumber","decimalSeparator","parseDigits","digits","minimumIntegerDigits","parseDate","routeLoader","activeProcesses","manageProcesses","country$","finish","handleInitializationResults","handleInitializationError","LoadingService","_loading","loadingStatus","startLoading","stopLoading","LoadingInterceptor","loadingService","activeRequests","finalize","suraTheme","MatPaginatorI18nService","MatPaginatorIntl","max","ofStr","itemsPerPageLabel","nextPageLabel","previousPageLabel","firstPageLabel","lastPageLabel","mapfrePanamaTheme","mapfreGuatemalaTheme","mapfrePanamaAsistenciaTheme","RouteLoaderService","activedRoute","buildMenuRoutes","createRoute","subLink","isSublink","existingRoute","addChildrenRoute","addNewRoute","childrenRoutes","buildChildrenRoutebyLink","nombreAnimacion","parentPath","childrenRoute","childrenRouteArray","paramsArray","parametrosUrl","ifHaveParamsArray","paramRoutes","getPathByNumber","originPath","townCenterTheme","hospitalPaitillaTheme","OidcWorkflowInterceptor","request2","clone","procesarMedicalOrderWorklow","idVerificacionSolicitudPorVerificar","pacificaSaludPhrTheme","hsantafePhrTheme","GlobalErrorHandler","handleError","chpanamericanoPhrTheme","chsfPhrTheme","thepanamaclinicPhrTheme","cmcaribePhrTheme","hchiriquiPhrTheme","cmpaitillaPhrTheme","hospitalNacionalPhrTheme","registerLocaleData","localeEsES","localeEnUS","AppModule","HTTP_INTERCEPTORS","useClass","APP_INITIALIZER","useFactory","appInitializer","deps","Router","cliniwebTheme","MAT_DATE_LOCALE","LOCALE_ID","DateAdapter","MomentDateAdapter","MAT_DATE_FORMATS","MAT_MOMENT_DATE_FORMATS","ErrorHandler","appId","storage","translationLoader","L10nValidationModule","validation","L10nRoutingModule","ServiceWorkerModule","enabled","__NgCli_bootstrap_1","bootstrapModule","enableProdMode","readyState","ensureUrlIsString","urlsSpinner","mainSpinner","q","InjectionToken","de"],"sourceRoot":"webpack:///","sources":["./src/app/core/core.module.ts","./src/app/core/guards/menu.guard.ts","./src/app/core/services/app-initializer.service.ts","./src/app/core/services/app-storage.service.ts","./src/app/core/services/appointment.service.ts","./src/app/core/services/auth-oidc.service.ts","./src/app/core/services/auth.service.ts","./src/app/shared/models/systems/company.model.ts","./src/app/shared/enums/authentication-service-provider.ts","./src/app/shared/components/dialogs/learn-more-dialog/learn-more-dialog.component.ts","./src/app/shared/components/dialogs/learn-more-dialog/learn-more-dialog.component.html","./src/app/core/services/portal-phr.service.ts","./src/app/core/services/license.service.ts","./src/app/core/services/base.service.ts","./src/app/core/services/chat-service.ts","./src/app/shared/models/clinic-history/attention-history.model.ts","./src/app/core/services/clinic-history.service.ts","./src/app/core/services/directory.service.ts","./src/app/core/services/doctors.service.ts","./src/app/core/services/document.service.ts","./src/app/core/services/google-analytics.service.ts","./src/app/core/services/http-base-service.ts","./src/app/core/services/iframe-message.service.ts","./src/app/core/services/layout.service.ts","./src/app/core/services/log.service.ts","./src/app/core/services/medical-order.service.ts","./src/app/core/services/message-bus.service.ts","./src/app/core/services/patient.service.ts","./src/app/core/services/payment-service.ts","./src/app/core/services/public-profile.service.ts","./src/app/core/services/requests-to-verify.service.ts","./src/app/core/services/route-dialog.service.ts","./src/app/core/services/signalR/chat-signalr.service.ts","./src/app/core/services/signalR/signalr.service.ts","./src/app/core/services/territorial-divisions.service.ts","./src/app/core/services/theme-color.service.ts","./src/app/core/services/user.service.ts","./src/app/core/services/utils.service.ts","./src/app/core/services/virtual-attention.service.ts","./src/app/core/services/workflow.service.ts","./src/app/shared/components/dialogs/bottom-sheet-menu/bottom-sheet-menu.component.ts","./src/app/shared/components/dialogs/bottom-sheet-menu/bottom-sheet-menu.component.html","./src/app/modules/home/pages/home/home.component.ts","./src/app/modules/home/pages/home/home.component.html","./src/app/shared/animations.ts","./src/app/shared/pipes/custom-date.pipe.ts","./src/app/shared/components/appointment-info-checkout/appointment-info-checkout.component.html","./src/app/shared/components/appointment-info-checkout/appointment-info-checkout.component.ts","./src/app/shared/components/avatar-upload/avatar-upload.component.html","./src/app/shared/components/avatar-upload/avatar-upload.component.ts","./src/app/shared/components/chat/chat.component.html","./src/app/shared/components/chat/chat.component.ts","./src/app/shared/components/cliniweb-appointments/cliniweb-appointment/cliniweb-appointment.component.html","./src/app/shared/components/cliniweb-appointments/cliniweb-appointment/cliniweb-appointment.component.ts","./src/app/shared/components/company-logo/company-logo.component.html","./src/app/shared/components/company-logo/company-logo.component.ts","./src/app/shared/components/country-form/country-form.component.html","./src/app/shared/components/country-form/country-form.component.ts","./src/app/shared/components/datepicker-flat-field/datepicker-flat-field.component.html","./src/app/shared/components/datepicker-flat-field/datepicker-flat-field.component.ts","./src/app/shared/validators/max-min-date.validator.ts","./src/app/shared/components/dependent/edit-dependent/edit-dependent.component.html","./src/app/shared/components/dependent/edit-dependent/edit-dependent.component.ts","./src/app/shared/components/dependent/view-dependent/view-dependent.component.html","./src/app/shared/components/dependent/view-dependent/view-dependent.component.ts","./src/app/shared/components/dialogs/cancel-virtual-attention/cancel-virtual-attention-dialog.component.html","./src/app/shared/components/dialogs/cancel-virtual-attention/cancel-virtual-attention-dialog.component.ts","./src/app/shared/components/dialogs/confirm-dialog/confirm-dialog.component.html","./src/app/shared/components/dialogs/confirm-dialog/confirm-dialog.component.ts","./src/app/shared/models/people/doctor-message.model.ts","./src/app/shared/components/dialogs/doctor-message-dialog/doctor-message-dialog.component.html","./src/app/shared/components/dialogs/doctor-message-dialog/doctor-message-dialog.component.ts","./src/app/shared/components/dialogs/file-viewer-dialog/file-viewer-dialog.component.ts","./src/app/shared/components/dialogs/file-viewer-dialog/file-viewer-dialog.component.html","./src/app/shared/components/dialogs/legal-agreements-dialog/legal-agreements-dialog.component.ts","./src/app/shared/components/dialogs/legal-agreements-dialog/legal-agreements-dialog.component.html","./src/app/shared/components/dialogs/map-dialog/map-dialog.component.html","./src/app/shared/components/dialogs/map-dialog/map-dialog.component.ts","./src/app/shared/components/dialogs/route-dialog/route-dialog.component.ts","./src/app/shared/components/dialogs/route-dialog/route-dialog.component.html","./src/app/shared/components/dynamic/dynamic.component.ts","./src/app/shared/components/dynamic/dynamic.component.html","./src/app/shared/components/error-banner/login-singup-error-banner/login-singup-error-banner.component.html","./src/app/shared/components/error-banner/login-singup-error-banner/login-singup-error-banner.component.ts","./src/app/shared/components/file-viewer/file-viewer.component.html","./src/app/shared/components/file-viewer/file-viewer.component.ts","./src/app/shared/components/form/form.component.html","./src/app/shared/components/form/form.component.ts","./src/app/shared/components/learn-more/learn-more.component.ts","./src/app/shared/components/learn-more/learn-more.component.html","./src/app/shared/components/legal-agreements/legal-agreements.component.ts","./src/app/shared/components/legal-agreements/legal-agreements.component.html","./src/app/core/services/prints.service.ts","./src/app/shared/components/medical-order/summary-medical-order/summary-order-sign/summary-order-sign.component.html","./src/app/shared/components/medical-order/summary-medical-order/summary-order-sign/summary-order-sign.component.ts","./src/app/shared/components/medical-order/summary-medical-order/summary-order-concept-value/summary-order-concept-value.component.html","./src/app/shared/components/medical-order/summary-medical-order/summary-order-concept-value/summary-order-concept-value.component.ts","./src/app/core/services/navigation.service.ts","./src/app/shared/components/medical-order/summary-medical-order/summary-order-download-button/summary-order-download-button.component.html","./src/app/shared/components/medical-order/summary-medical-order/summary-order-download-button/summary-order-download-button.component.ts","./src/app/shared/components/medical-order/summary-medical-order/summary-order-footer/summary-order-footer.component.html","./src/app/shared/components/medical-order/summary-medical-order/summary-order-footer/summary-order-footer.component.ts","./src/app/shared/components/medical-order/summary-medical-order/summary-medical-order.component.html","./src/app/shared/components/medical-order/summary-medical-order/summary-medical-order.component.ts","./src/app/shared/components/menu/profile/profile-menu.component.html","./src/app/shared/components/menu/profile/profile-menu.component.ts","./src/app/shared/components/not-found/not-found.component.ts","./src/app/shared/components/not-found/not-found.component.html","./src/app/shared/components/avatar-initials/avatar-initials.component.html","./src/app/shared/components/avatar-initials/avatar-initials.component.ts","./src/app/shared/components/public-profile-avatar/public-profile-avatar.component.html","./src/app/shared/components/public-profile-avatar/public-profile-avatar.component.ts","./src/app/shared/components/search/search-doctors.component.html","./src/app/shared/components/search/search-doctors.component.ts","./src/app/shared/components/spinner/spinner.component.ts","./src/app/shared/components/spinner/spinner.component.html","./src/app/shared/components/states-request-verify/states-request-verify.component.html","./src/app/shared/components/states-request-verify/states-request-verify.component.ts","./src/app/core/services/teleconsulta.service.ts","./src/app/shared/components/summary-appointment-checkout/summary-appointment-checkout.component.html","./src/app/shared/components/summary-appointment-checkout/summary-appointment-checkout.component.ts","./src/app/shared/components/user-payments/user-payment/user-payment.component.html","./src/app/shared/components/user-payments/user-payment/user-payment.component.ts","./src/app/shared/components/user-payments/user-payments-list/user-payments-list.component.html","./src/app/shared/components/user-payments/user-payments-list/user-payments-list.component.ts","./src/app/shared/components/user/edit-user/edit-user.component.html","./src/app/shared/components/user/edit-user/edit-user.component.ts","./src/app/shared/components/user/view-user/view-user.component.html","./src/app/shared/components/user/view-user/view-user.component.ts","./src/app/shared/decorators/component-lookup.decorator.ts","./src/app/shared/decorators/debounce.decorator.ts","./src/app/shared/decorators/workflow-lookup.decorator.ts","./src/app/shared/directives/capitalize.directive.ts","./src/app/shared/directives/center-input.directive.ts","./src/app/shared/directives/dynamic-host.directive.ts","./src/app/shared/directives/mat-select-custom.directive.ts","./src/app/shared/directives/touch-move-listener.directive.ts","./src/app/shared/enums/component-name.enum.ts","./src/app/shared/enums/container-type.enum.ts","./src/app/shared/enums/direction.enum.ts","./src/app/shared/enums/legal-agreements-type.enum.ts","./src/app/shared/enums/medical-request-type.enum.ts","./src/app/shared/enums/notification-type.enum.ts","./src/app/shared/enums/online-appointment-status.enum.ts","./src/app/shared/enums/signup-workflow-verification.enum.ts","./src/app/shared/enums/state-type.enum.ts","./src/app/shared/enums/system-areas.enum.ts","./src/app/shared/helpers/common-types-helper.ts","./src/app/shared/material.module.ts","./src/app/shared/models/cdr/doctor-search-result.model.ts","./src/app/shared/models/dialog-data.model.ts","./src/app/shared/models/login-response.model.ts","./src/app/shared/models/people/chat-conversation.model.ts","./src/app/shared/models/people/dependent.model.ts","./src/app/shared/models/people/form-control.model.ts","./src/app/shared/models/people/form.model.ts","./src/app/shared/models/people/person.model.ts","./src/app/shared/models/people/profile-detail.model.ts","./src/app/shared/models/people/profile-filter-search-result.model.ts","./src/app/shared/models/people/profile-search-results.model.ts","./src/app/shared/models/people/public-profile.model.ts","./src/app/shared/models/people/user-person.model.ts","./src/app/shared/models/process/base-request.model.ts","./src/app/shared/models/process/online-appointment-request.model.ts","./src/app/shared/models/process/online-payment-request.model.ts","./src/app/shared/models/process/workflow-initial-data.model.ts","./src/app/shared/models/systems/directory.model.ts","./src/app/shared/models/systems/portal-phr.model.ts","./src/app/shared/models/systems/territorial-division.model.ts","./src/app/shared/models/token.model.ts","./src/app/shared/models/workflow/models/appointment-checkout.model.ts","./src/app/shared/models/workflow/models/appointment-info-data.model.ts","./src/app/shared/models/workflow/models/appointment-summary-data.model.ts","./src/app/shared/models/workflow/models/online-payment.model.ts","./src/app/shared/models/workflow/models/patient-form-appointment-data.model.ts","./src/app/shared/models/workflow/models/patient-verification-data.model.ts","./src/app/shared/models/workflow/states/base-workflow-state.model.ts","./src/app/shared/models/workflow/states/growth-curves-workflow-state.model.ts","./src/app/shared/models/workflow/states/medical-order-workflow-state.model.ts","./src/app/shared/models/workflow/states/online-appointment-cliniweb-state.model.ts","./src/app/shared/models/workflow/states/online-payment-workflow-state.model.ts","./src/app/shared/pipes/age-from-birthday.pipe.ts","./src/app/shared/pipes/custom-currency.pipe.ts","./src/app/shared/pipes/highlight.pipe.ts","./src/app/shared/pipes/i18n-text.pipe.ts","./src/app/shared/pipes/safe-html.pipe.ts","./src/app/shared/pipes/safe-url.pipe.ts","./src/app/shared/components/dialogs/cancel-appointment/cancel-appointment-dialog.component.html","./src/app/shared/components/dialogs/cancel-appointment/cancel-appointment-dialog.component.ts","./src/app/shared/components/appointments/future-appointments/future-appointments.component.html","./src/app/shared/components/appointments/future-appointments/future-appointments.component.ts","./src/app/shared/components/timeline-list/timeline-list.component.html","./src/app/shared/components/timeline-list/timeline-list.component.ts","./src/app/shared/components/appointments/past-appointments/past-appointments.component.html","./src/app/shared/components/appointments/past-appointments/past-appointments.component.ts","./src/app/shared/components/appointments/cancelled-appointments/cancelled-appointments.component.html","./src/app/shared/components/appointments/cancelled-appointments/cancelled-appointments.component.ts","./src/app/shared/components/appointments/appointment-tabs/appointment-tabs.component.html","./src/app/shared/components/appointments/appointment-tabs/appointment-tabs.component.ts","./src/app/shared/components/dialogs/menu-mobile/menu-mobile.component.ts","./src/app/shared/components/dialogs/menu-mobile/menu-mobile.component.html","./src/app/shared/components/dialogs/profile-menu-dialog/profile-menu-dialog.component.ts","./src/app/shared/components/dialogs/profile-menu-dialog/profile-menu-dialog.component.html","./src/app/shared/components/menu/logged-in-menu-button/logged-in-menu-button.component.ts","./src/app/shared/components/menu/logged-in-menu-button/logged-in-menu-button.component.html","./src/app/shared/components/menu/anonymous-language-menu/anonymous-language-menu.component.html","./src/app/shared/components/menu/anonymous-language-menu/anonymous-language-menu.component.ts","./src/app/shared/components/menu/anonymous-login-signup-menu/anonymous-login-signup-menu.component.ts","./src/app/shared/components/menu/anonymous-login-signup-menu/anonymous-login-signup-menu.component.html","./src/app/shared/components/menu/anonymous-menu/anonymous-menu.component.html","./src/app/shared/components/menu/anonymous-menu/anonymous-menu.component.ts","./src/app/shared/components/headers/header/header.component.html","./src/app/shared/components/headers/header/header.component.ts","./src/app/shared/components/menu/policy/policy-menu-content.component.html","./src/app/shared/components/menu/policy/policy-menu-content.component.ts","./src/app/shared/components/menu/policy/policy-menu.component.html","./src/app/shared/components/menu/policy/policy-menu.component.ts","./src/app/shared/components/headers/header-sura/header-sura.component.html","./src/app/shared/components/headers/header-sura/header-sura.component.ts","./src/app/shared/components/linkboxs/virtual-consultation-linkbox/virtual-consultation-linkbox.component.ts","./src/app/shared/components/linkboxs/virtual-consultation-linkbox/virtual-consultation-linkbox.component.html","./src/app/shared/components/linkboxs/medical-appointments-linkbox/medical-appointments-linkbox.component.ts","./src/app/shared/components/linkboxs/medical-appointments-linkbox/medical-appointments-linkbox.component.html","./src/app/shared/components/linkboxs/results-linkbox/results-linkbox.component.ts","./src/app/shared/components/linkboxs/results-linkbox/results-linkbox.component.html","./src/app/shared/components/linkboxs/historia-clinica-linkbox/historia-clinica-linkbox.component.ts","./src/app/shared/components/linkboxs/historia-clinica-linkbox/historia-clinica-linkbox.component.html","./src/app/shared/components/unread-clinical-exam/unread-clinical-exam.component.ts","./src/app/shared/components/unread-clinical-exam/unread-clinical-exam.component.html","./src/app/shared/models/cdr/clinic-concept.model.ts","./src/app/core/services/clinical-concept.service.ts","./src/app/shared/components/select-symptoms/select-symptoms.component.html","./src/app/shared/components/select-symptoms/select-symptoms.component.ts","./src/app/shared/pipes/order-by.pipe.ts","./src/app/shared/components/menu-link/menu-link.component.html","./src/app/shared/components/menu-link/menu-link.component.ts","./src/app/shared/components/menu/menu.component.html","./src/app/shared/components/menu/menu.component.ts","./src/app/shared/components/my-health/my-health.component.html","./src/app/shared/components/my-health/my-health.component.ts","./src/app/shared/components/menu/cliniweb-menu/cliniweb-menu.component.html","./src/app/shared/components/menu/cliniweb-menu/cliniweb-menu.component.ts","./src/app/shared/components/dialogs/chat-history-dialog/chat-history-dialog.component.html","./src/app/shared/components/dialogs/chat-history-dialog/chat-history-dialog.component.ts","./src/app/shared/components/virtual-consultation/past-virtual-consultation/past-virtual-consultation.component.html","./src/app/shared/components/virtual-consultation/past-virtual-consultation/past-virtual-consultation.component.ts","./src/app/shared/components/virtual-consultation/virtual-consultation-tabs/virtual-consultation-tabs.component.html","./src/app/shared/components/virtual-consultation/virtual-consultation-tabs/virtual-consultation-tabs.component.ts","./src/app/shared/models/people/clinic-history-configuration.model.ts","./src/app/shared/components/clinic-history/clinic-history-tabs/clinic-history-tabs.component.html","./src/app/shared/components/clinic-history/clinic-history-tabs/clinic-history-tabs.component.ts","./src/app/shared/enums/group-concept.enum.ts","./src/app/shared/components/clinic-history/attention-history/attention-history.component.html","./src/app/shared/components/clinic-history/attention-history/attention-history.component.ts","./src/app/shared/components/clinic-history/medicines/medicines.component.html","./src/app/shared/components/clinic-history/medicines/medicines.component.ts","./src/app/shared/components/clinic-history/medical-history/medical-history.component.html","./src/app/shared/components/clinic-history/medical-history/medical-history.component.ts","./src/app/shared/components/autocomplete-multiple-selection/autocomplete-multiple-selection.component.html","./src/app/shared/components/autocomplete-multiple-selection/autocomplete-multiple-selection.component.ts","./src/app/shared/components/clinic-history/share-dialog/share-dialog.component.html","./src/app/shared/components/clinic-history/share-dialog/share-dialog.component.ts","./src/app/shared/components/clinic-history/clinic-history-share/clinic-history-share.component.ts","./src/app/shared/components/clinic-history/studies-laboratories/studies-laboratories.component.html","./src/app/shared/components/clinic-history/clinic-history-share/clinic-history-share.component.html","./src/app/shared/components/clinic-history/studies-laboratories/studies-laboratories.component.ts","./src/app/shared/components/headers/header-mapfre-panama/header-mapfre-panama.component.ts","./src/app/shared/components/headers/header-mapfre-panama/header-mapfre-panama.component.html","./src/app/shared/enums/class-concept.enum.ts","./src/app/shared/models/search-results/search-parameters.model.ts","./src/app/shared/components/search-results/search-providers/search-providers.component.html","./src/app/shared/components/search-results/search-providers/search-providers.component.ts","./src/app/shared/components/search-results/search-result-title/search-result-title.component.ts","./src/app/shared/components/search-results/search-result-title/search-result-title.component.html","./src/app/shared/components/search-results/provider-filters/provider-filters-dialog/provider-filters-dialog.component.ts","./src/app/shared/components/search-results/provider-filters/provider-filters-dialog/provider-filters-dialog.component.html","./src/app/shared/components/search-results/provider-filters/provider-filters-content/provider-filters-content.component.html","./src/app/shared/components/search-results/provider-filters/provider-filters-content/provider-filters-content.component.ts","./src/app/shared/components/search-results/provider-card/provider-card.component.html","./src/app/shared/components/search-results/provider-card/provider-card.component.ts","./src/app/shared/components/search-results/search-results/search-results.component.html","./src/app/shared/components/search-results/search-results/search-results.component.ts","./src/app/shared/components/menu/anonymous-language-menu-title/anonymous-language-menu-title.component.ts","./src/app/shared/components/menu/anonymous-language-menu-title/anonymous-language-menu-title.component.html","./src/app/shared/components/menu/anonymous-language-menu-item/anonymous-language-menu-item.component.html","./src/app/shared/components/menu/anonymous-language-menu-item/anonymous-language-menu-item.component.ts","./src/app/shared/components/menu/unlicensed-menu/unlicensed-menu.component.html","./src/app/shared/components/menu/unlicensed-menu/unlicensed-menu.component.ts","./src/app/shared/components/headers/header-town-center/header-town-center.component.html","./src/app/shared/components/headers/header-town-center/header-town-center.component.ts","./src/app/shared/components/headers/header-hospital-paitilla/header-hospital-paitilla.component.html","./src/app/shared/components/headers/header-hospital-paitilla/header-hospital-paitilla.component.ts","./src/app/shared/components/headers/header-hospital-nacional-phr/header-hospital-nacional-phr.component.html","./src/app/shared/components/headers/header-hospital-nacional-phr/header-hospital-nacional-phr.component.ts","./src/app/shared/components/headers/header-cmpaitilla-phr/header-cmpaitilla-phr.component.html","./src/app/shared/components/headers/header-cmpaitilla-phr/header-cmpaitilla-phr.component.ts","./src/app/shared/components/headers/header-hchiriqui-phr/header-hchiriqui-phr.component.html","./src/app/shared/components/headers/header-hchiriqui-phr/header-hchiriqui-phr.component.ts","./src/app/shared/components/headers/header-cmcaribe-phr/header-cmcaribe-phr.component.html","./src/app/shared/components/headers/header-cmcaribe-phr/header-cmcaribe-phr.component.ts","./src/app/shared/components/headers/header-thepanamaclinic-phr/header-thepanamaclinic-phr.component.html","./src/app/shared/components/headers/header-thepanamaclinic-phr/header-thepanamaclinic-phr.component.ts","./src/app/shared/components/headers/header-chsf-phr/header-chsf-phr.component.html","./src/app/shared/components/headers/header-chsf-phr/header-chsf-phr.component.ts","./src/app/shared/components/headers/header-chpanamericano-phr/header-chpanamericano-phr.component.html","./src/app/shared/components/headers/header-chpanamericano-phr/header-chpanamericano-phr.component.ts","./src/app/shared/components/headers/header-hsantafe-phr/header-hsantafe-phr.component.html","./src/app/shared/components/headers/header-hsantafe-phr/header-hsantafe-phr.component.ts","./src/app/shared/components/headers/header-pacifica-salud-phr/header-pacifica-salud-phr.component.html","./src/app/shared/components/headers/header-pacifica-salud-phr/header-pacifica-salud-phr.component.ts","./src/app/shared/models/systems/workflow.model.ts","./src/app/shared/components/workflows/workflow-progress-bar/workflow-progress-bar.component.html","./src/app/shared/components/workflows/workflow-progress-bar/workflow-progress-bar.component.ts","./src/app/shared/enums/workflow-step-name.enum.ts","./src/app/shared/models/workflow/steps/base-step.model.ts","./src/app/shared/models/workflow/models/authentication-data.model.ts","./src/app/shared/models/workflow/steps/authentication-step.model.ts","./src/app/shared/models/workflow/steps/select-country-step.model.ts","./src/app/shared/models/workflow/models/select-patient-data.model.ts","./src/app/shared/models/workflow/steps/select-patient-appointment-checkout-step.model.ts","./src/app/shared/models/workflow/steps/patient-form-appointment-checkout-step.model.ts","./src/app/shared/models/workflow/models/select-patient-relationship-data.model.ts","./src/app/shared/models/workflow/steps/select-patient-relationship-appointment-checkout-step.model.ts","./src/app/shared/models/workflow/models/patient-contact-form-data.model.ts","./src/app/shared/models/workflow/steps/patient-contact-form-appointment-checkout-step.model.ts","./src/app/shared/models/workflow/steps/summary-appointment-checkout-step.model.ts","./src/app/shared/components/payment-amount/payment-amount.component.html","./src/app/shared/components/payment-amount/payment-amount.component.ts","./src/app/shared/models/workflow/steps/payment/payment-amount-step.model.ts","./src/app/shared/pipes/intl-tel-input-placeholder.pipe.ts","./src/app/shared/components/payment/payment.component.html","./src/app/shared/components/payment/payment.component.ts","./src/app/shared/models/workflow/steps/payment/payment-form-step.model.ts","./src/app/shared/models/workflow/steps/patient-verification-step.model.ts","./src/app/shared/models/workflow/steps/medical-orders/summary-medical-order-step.model.ts","./src/app/shared/models/workflow/models/select-patient-relationship.model.ts","./src/app/shared/models/workflow/steps/select-patient-relationship-step.model.ts","./src/app/shared/models/workflow/models/create-patient-relationship-data.model.ts","./src/app/shared/models/workflow/steps/create-patient-relationship-step.model.ts","./src/app/core/services/workflow-step.service.ts","./src/app/shared/components/workflows/base-workflow/base-workflow.component.ts","./src/app/shared/components/logout-bar/logout-bar.component.html","./src/app/shared/components/logout-bar/logout-bar.component.ts","./src/app/shared/components/workflows/online-appointment-cliniweb/online-appointment-cliniweb.component.html","./src/app/shared/components/workflows/online-appointment-cliniweb/online-appointment-cliniweb.component.ts","./src/app/shared/components/dialogs/loading-dialog/loading-dialog.component.html","./src/app/shared/components/dialogs/loading-dialog/loading-dialog.component.ts","./src/app/shared/components/workflows/online-payment/online-payment-workflow.component.html","./src/app/shared/components/workflows/online-payment/online-payment-workflow.component.ts","./src/app/shared/components/cola-goblo-dialogo/cola-goblo-dialogo.component.ts","./src/app/shared/components/cola-goblo-dialogo/cola-goblo-dialogo.component.html","./src/app/shared/components/authentication/authentication.component.html","./src/app/shared/components/authentication/authentication.component.ts","./src/app/shared/components/dialogs/appointment-info-dialog/appointment-info-dialog.component.ts","./src/app/shared/components/dialogs/appointment-info-dialog/appointment-info-dialog.component.html","./src/app/shared/components/select-patient-appointment-checkout/select-patient-appointment-checkout.component.html","./src/app/shared/components/select-patient-appointment-checkout/select-patient-appointment-checkout.component.ts","./src/app/shared/validators/person-name.validator.ts","./src/app/shared/validators/gender.validator.ts","./src/app/shared/components/patient-form-appointment-checkout/patient-form-appointment-checkout.component.html","./src/app/shared/components/patient-form-appointment-checkout/patient-form-appointment-checkout.component.ts","./src/app/shared/components/select-patient-relationship-appointment-checkout/select-patient-relationship-appointment-checkout.component.html","./src/app/shared/components/select-patient-relationship-appointment-checkout/select-patient-relationship-appointment-checkout.component.ts","./src/app/core/services/keyboard.service.ts","./src/app/shared/components/patient-contact-form-appointment-checkout/patient-contact-form-appointment-checkout.component.html","./src/app/shared/components/patient-contact-form-appointment-checkout/patient-contact-form-appointment-checkout.component.ts","./src/app/shared/components/headers/route-dialog-headers/public-profile-header/public-profile-header.component.html","./src/app/shared/components/headers/route-dialog-headers/public-profile-header/public-profile-header.component.ts","./src/app/shared/components/headers/route-dialog-headers/default-header/default-header.component.ts","./src/app/shared/components/headers/route-dialog-headers/default-header/default-header.component.html","./src/app/shared/components/headers/route-dialog-headers/default-back-header/default-back-header.component.ts","./src/app/shared/components/headers/route-dialog-headers/default-back-header/default-back-header.component.html","./src/app/shared/components/headers/route-dialog-headers/default-back-with-link-header/default-back-with-link-header.component.ts","./src/app/shared/components/headers/route-dialog-headers/default-back-with-link-header/default-back-with-link-header.component.html","./src/app/shared/components/linkboxs/cliniweb-medical-appointments-linkbox/cliniweb-medical-appointments-linkbox.component.ts","./src/app/shared/components/linkboxs/cliniweb-medical-appointments-linkbox/cliniweb-medical-appointments-linkbox.component.html","./src/app/core/services/search-providers.service.ts","./src/app/shared/components/linkboxs/cliniweb-book-appointment-linkbox/cliniweb-book-appointment-linkbox.component.ts","./src/app/shared/components/latest-doctors/latest-doctors.component.html","./src/app/shared/components/linkboxs/cliniweb-book-appointment-linkbox/cliniweb-book-appointment-linkbox.component.html","./src/app/shared/components/latest-doctors/latest-doctors.component.ts","./src/app/shared/components/most-common-specialties/most-common-specialties.component.ts","./src/app/shared/components/health-allies/health-allies.component.html","./src/app/shared/components/most-common-specialties/most-common-specialties.component.html","./src/app/shared/components/health-allies/health-allies.component.ts","./src/app/shared/components/preventive-control-tips/preventive-control-tips.component.ts","./src/app/shared/components/home-layouts/cliniweb-home-layout/cliniweb-home-layout.component.html","./src/app/shared/components/preventive-control-tips/preventive-control-tips.component.html","./src/app/shared/components/home-layouts/cliniweb-home-layout/cliniweb-home-layout.component.ts","./src/app/shared/components/cliniweb-appointments/cliniweb-future-appointments/cliniweb-future-appointments.component.html","./src/app/shared/components/cliniweb-appointments/cliniweb-future-appointments/cliniweb-future-appointments.component.ts","./src/app/shared/components/cliniweb-appointments/cliniweb-past-appointments/cliniweb-past-appointments.component.html","./src/app/shared/components/cliniweb-appointments/cliniweb-past-appointments/cliniweb-past-appointments.component.ts","./src/app/shared/components/cliniweb-appointments/cliniweb-appointment-tabs/cliniweb-appointment-tabs.component.html","./src/app/shared/components/cliniweb-appointments/cliniweb-appointment-tabs/cliniweb-appointment-tabs.component.ts","./src/app/shared/models/search-results/search-providers-configuration.model.ts","./src/app/shared/components/search-results/search-providers-v2/search-providers-v2.component.html","./src/app/shared/components/search-results/search-providers-v2/search-providers-v2.component.ts","./src/app/shared/components/headers/route-dialog-headers/default-logo-header/default-logo-header.component.ts","./src/app/shared/components/headers/route-dialog-headers/default-logo-header/default-logo-header.component.html","./src/app/shared/components/dropdown/dropdown-trigger-for.directive.ts","./src/app/shared/components/dropdown/dropdown.component.html","./src/app/shared/components/dropdown/dropdown.component.ts","./src/app/shared/components/check-autocomplete/check-autocomplete.component.html","./src/app/shared/components/check-autocomplete/check-autocomplete.component.ts","./src/app/shared/components/search-results/provider-filters/provider-filters-body/provider-filters-body.component.html","./src/app/shared/components/search-results/provider-filters/provider-filters-body/provider-filters-body.component.ts","./src/app/shared/components/headers/public-profile-header/public-profile-header.component.html","./src/app/shared/components/headers/public-profile-header/public-profile-header.component.ts","./src/app/shared/components/country-form-checkout/country-form-checkout.component.ts","./src/app/shared/components/country-form-checkout/country-form-checkout.component.html","./src/app/shared/models/systems/resquest-to-verify-update.model.ts","./src/app/shared/components/workflows/medical-order-workflow/medical-order-workflow.component.html","./src/app/shared/components/workflows/medical-order-workflow/medical-order-workflow.component.ts","./src/app/shared/components/medical-order/patient-verification/patient-verification.component.html","./src/app/shared/components/medical-order/patient-verification/patient-verification.component.ts","./src/app/shared/components/my-medical-orders/my-medical-orders-empty-state/my-medical-orders-empty-state.component.ts","./src/app/shared/components/my-medical-orders/my-medical-orders-empty-state/my-medical-orders-empty-state.component.html","./src/app/shared/components/my-medical-orders/my-medical-orders.component.html","./src/app/shared/components/my-medical-orders/my-medical-orders.component.ts","./src/app/shared/models/clinic-history/growth-measurement-type.model.ts","./src/app/core/services/growth-measurements.service.ts","./src/app/shared/enums/person-gender.enum.ts","./src/app/shared/components/growth-charts/growth-charts-tab-data-type/growth-charts-tab-data-type.component.ts","./src/app/shared/components/growth-charts/growth-charts-tab-data-type/growth-charts-tab-data-type.component.html","./src/app/shared/components/growth-charts/growth-charts-tab/growth-charts-tab.component.html","./src/app/shared/components/growth-charts/growth-charts-tab/growth-charts-tab.component.ts","./src/app/shared/components/growth-charts/growth-charts.component.html","./src/app/shared/components/growth-charts/growth-charts.component.ts","./src/app/shared/components/workflows/growth-curves-workflow/growth-curves-workflow.component.html","./src/app/shared/components/workflows/growth-curves-workflow/growth-curves-workflow.component.ts","./src/app/shared/components/select-patient-relationship/select-patient-relationship.component.html","./src/app/shared/components/select-patient-relationship/select-patient-relationship.component.ts","./src/app/shared/components/create-patient-relationship/create-patient-relationship.component.html","./src/app/shared/components/create-patient-relationship/create-patient-relationship.component.ts","./src/app/shared/components/search-results/provider-card/provider-card-contacts/provider-card-contacts.component.html","./src/app/shared/components/search-results/provider-card/provider-card-contacts/provider-card-contacts.component.ts","./src/app/shared/components/search-results/provider-card/provider-card-location/provider-card-location.component.html","./src/app/shared/components/search-results/provider-card/provider-card-location/provider-card-location.component.ts","./src/app/shared/components/search-results/provider-card/provider-card-profile/provider-card-profile.component.html","./src/app/shared/components/search-results/provider-card/provider-card-profile/provider-card-profile.component.ts","./src/app/shared/shared.module.ts","./src/app/shared/validators/custom-email.validator.ts","./src/environments/environment.prod.ts","./src/app/core/guards/auth.guard.ts","./src/app/shared/components/location-language/location-language.component.html","./src/app/shared/components/location-language/location-language.component.ts","./src/app/core/guards/show-non-prod.guard.ts","./src/app/core/guards/auth-private-routes.guard.ts","./src/app/core/guards/app-initialization.guard.ts","./src/app/app-routing.module.ts","./src/app/shared/components/dialogs/empty-dialog.component.ts","./src/app/shared/components/custom-snack-bar/custom-snack-bar.component.ts","./src/app/shared/components/custom-snack-bar/custom-snack-bar.component.html","./src/app/core/services/signalR/appointments-signalr.service.ts","./src/app/shared/components/dialogs/next-appointment-dialog/next-appointment-dialog.component.ts","./src/app/shared/components/dialogs/next-appointment-dialog/next-appointment-dialog.component.html","./src/app/shared/components/dialogs/select-country-dialog/select-country-dialog.component.ts","./src/app/shared/components/dialogs/select-country-dialog/select-country-dialog.component.html","./src/app/shared/components/dialogs/error-dialog/error-dialog.component.ts","./src/app/shared/components/dialogs/error-dialog/error-dialog.component.html","./src/app/shared/models/systems/referral-medical.model.ts","./src/app/core/services/theme-loader.service.ts","./src/app/core/services/google-maps-loader.service.ts","./src/app/app.component.html","./src/app/app.component.ts","./src/app/core/interceptors/error.interceptor.ts","./src/app/core/l10n-config.ts","./src/app/core/helpers/app.initializer.ts","./src/app/core/services/loading.service.ts","./src/app/core/interceptors/loading.interceptor.ts","./src/themes/sura/sura.ts","./src/app/core/services/mat-paginator-i18n.service.ts","./src/themes/mapfre-panama/mapfre-panama.ts","./src/themes/mapfre-guatemala/mapfre-guatemala.ts","./src/themes/mapfre-panama-asistencia/mapfre-panama-asistencia.ts","./src/app/core/services/route-loader.service.ts","./src/themes/town-center/town-center.ts","./src/themes/hospital-paitilla/hospital-paitilla.ts","./src/app/core/interceptors/oidc-workflow.interceptor.ts","./src/themes/pacifica-salud-phr/pacifica-salud-phr.ts","./src/themes/hsantafe-phr/hsantafe-phr.ts","./src/app/core/handlers/global-error.handler.ts","./src/themes/chpanamericano-phr/chpanamericano-phr.ts","./src/themes/chsf-phr/chsf-phr.ts","./src/themes/thepanamaclinic-phr/thepanamaclinic-phr.ts","./src/themes/cmcaribe-phr/cmcaribe-phr.ts","./src/themes/hchiriqui-phr/hchiriqui-phr.ts","./src/themes/cmpaitilla-phr/cmpaitilla-phr.ts","./src/themes/hospital-nacional-phr/hospital-nacional-phr.ts","./src/app/app.module.ts","./src/main.ts","./src/themes/cliniweb/cliniweb.ts","./src/themes/theme.ts","./node_modules/moment/locale/ sync ^\\.\\/.*$","./src/themes/ lazy ^\\.\\/.*\\/theme\\.js$ chunkName: [request] namespace object"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { CookieService } from 'ngx-cookie-service';\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n HttpClientModule\n ],\n providers: [ \n CookieService\n ]\n})\nexport class CoreModule { }\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { catchError, filter, map, switchMap, take } from 'rxjs/operators';\nimport { Link } from 'src/app/shared/models/people/link.model';\nimport { AppStorageService, STORAGE } from '../services/app-storage.service';\nimport { BaseService } from '../services/base.service';\nimport { LayoutService } from '../services/layout.service';\nimport { AppInitializationService } from '../services/app-initializer.service';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MenuGuard implements CanActivate {\n\n constructor(\n private baseService: BaseService,\n private layoutService: LayoutService,\n private router: Router,\n private appStorageService: AppStorageService,\n private appInitializationService: AppInitializationService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { }\n\n canActivate(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree {\n\n // Verifica si es el cliente (navegador) antes de proceder\n if (!isPlatformBrowser(this.platformId)) {\n return true; // Si no es navegador, permitir la navegaciĆ³n (en SSR no bloquea)\n }\n\n\n // Esperar a que la aplicaciĆ³n estĆ© completamente inicializada\n return this.appInitializationService.isInitialized().pipe(\n filter(initialized => initialized), // Esperar hasta que sea `true`\n take(1), // Tomar solo el primer valor `true`\n switchMap(() => {\n return this.baseService.getMenuLinks().pipe(\n switchMap((links)=>{\n return of(this.canGo(links, state.url));\n }),\n catchError((err) => {\n this.router.navigate(['/not-found']);\n return of(false);\n })\n );\n })\n );\n }\n \n canGo(links: Link[], path: string): boolean {\n path = path.replace(\"/\", \"\").split(\"/\")[0].split('?')[0];\n if(path == ''){\n return true;\n }\n else {\n let linkSelected = links.find(link => this.baseService.getBasePath(link.identificadorUrl) == decodeURIComponent(path));\n\n let sublinkSelected = false;\n\n links.forEach(link => {\n\n let sublink = link.subMenu \n ? link.subMenu.find(link => this.baseService.getBasePath(link.identificadorUrl) == decodeURIComponent(path))\n : null;\n\n if(sublink)\n sublinkSelected = true;\n });\n\n if(linkSelected || sublinkSelected || path == \"empty\") {\n return true;\n } else{\n this.router.navigate(['/not-found']);\n return false;\n }\n }\n }\n}\n","import { Injectable } from \"@angular/core\";\r\nimport { BehaviorSubject } from \"rxjs\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AppInitializationService {\r\n private initializedSubject = new BehaviorSubject(false); // Inicialmente no estĆ” listo\r\n\r\n setInitialized() {\r\n this.initializedSubject.next(true); // Cambiar estado cuando la inicializaciĆ³n estĆ© completa\r\n }\r\n \r\n isInitialized() {\r\n return this.initializedSubject.asObservable(); // Devuelve un observable para que los guards se suscriban\r\n }\r\n}","import { Injectable } from '@angular/core';\nimport { SwUpdate } from '@angular/service-worker';\nimport * as CryptoJS from 'crypto-js';\nimport { CookieService } from 'ngx-cookie-service';\nimport { Token } from 'src/app/shared/models/token.model';\nimport { environment } from 'src/environments/environment';\n\nexport const STORAGE: any = {\n VERSION: 'v',\n TOKEN: 'auth-token',\n DIRECTORY: 'directory',\n MENU: 'menu',\n LOCALE: 'locale',\n REFERRER: 'referrer',\n PROFILE_SEACH_SEED: 'profile-search-seed',\n USER: 'user',\n AUTH_IFRAME: 'auth_iframe',\n ACTIVE_VIRTUAL_ATTENTION: 'active_virtual_attention',\n MENU_LANGUAGE: 'menu_language',\n POLICIES: \"policies\",\n CLINIWEB_DIRECTORY: 'cliniweb_directory_',\n WORKFLOW_TYPE: 'workflow_type',\n ONLINE_APPOINTMENT_CLINIWEB_STATE: 'online_appointment_cliniweb_state',\n ONLINE_APPOINTMENT_CLINIWEB_BOOTSTRAP_STATE: 'online_appointment_cliniweb_bootstrap_state',\n WELCOME_CLINIWEB_STATE: 'welcome_cliniweb_state',\n ONLINE_PAYMENT_WORKFLOW_STATE: 'online_payment_workflow_state',\n MEDICAL_ORDER_WORKFLOW_STATE: 'medical_order_workflow_state',\n GROWTH_CURVES_WORKFLOW_STATE: 'growth_curves_workflow_state',\n ONLINE_PAYMENT_WORKFLOW_BOOTSTRAP_STATE: 'online_payment_workflow_bootstrap_state',\n SIGNUP_CAPTCHA_REQUIRED: 'signup_catpcha_required',\n SIGNUP_WORKFLOW_VERIFICATION_TYPE: 'signup_workflow_verification_type',\n AUTHENTICATION_SERVICE_PROVIDER: 'authentication_service_provider',\n APPOINTMENTS: 'appointments',\n LICENSE: 'license',\n COUNTRY: 'country',\n NEXT_APPOINTMENT_LAST_TIME_SHOWN: \"next_appointment_last_time_shown\",\n SIGNUP_CHECKIN_STATE: \"signup_checkin_state\",\n SELECT_COUNTRY: \"select_country\",\n REFERRAL_MEDICAL: \"referral_medical\"\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AppStorageService {\n\n constructor(\n private cookieService: CookieService,\n private swUpdate: SwUpdate\n ) { } \n\n clearAll() {\n window.localStorage.clear();\n window.sessionStorage.clear();\n this.cookieService.deleteAll(\"/\", undefined);\n\n this.swUpdate.available.subscribe(() => {\n this.swUpdate.activateUpdate().then(() => {\n console.log('CachĆ© limpiada y Service Worker actualizado.');\n // window.location.reload();\n });\n });\n }\n\n clearLogout(){\n this.removeSessionItem(STORAGE.USER);\n this.removeSessionItem(STORAGE.SIGNUP_CAPTCHA_REQUIRED);\n this.removeSessionItem(STORAGE.TOKEN);\n this.removeSessionItem(STORAGE.AUTHENTICATION_SERVICE_PROVIDER);\n this.removeSessionItem(STORAGE.APPOINTMENTS);\n this.removeSessionItem(STORAGE.SIGNUP_CHECKIN_STATE);\n this.removeSessionItem(STORAGE.SELECT_COUNTRY);\n this.removeSessionItem(STORAGE.REFERRAL_MEDICAL);\n window.localStorage.removeItem(STORAGE.COUNTRY);\n\n this.cookieService.deleteAll(\"/\", undefined);\n }\n \n public setItem(key: string, data: any, encrypt?: boolean){\n window.localStorage.removeItem(key);\n window.localStorage.setItem(\n key, \n encrypt\n ? this.encryptObj(JSON.stringify(data))\n : JSON.stringify(data));\n }\n\n public setItemSession(key: string, data: any, encrypt?: boolean){\n window.sessionStorage.removeItem(key);\n window.sessionStorage.setItem(\n key,\n encrypt\n ? this.encryptObj(JSON.stringify(data))\n : JSON.stringify(data));\n }\n\n public removeSessionItem(key: string) {\n window.sessionStorage.removeItem(key);\n }\n\n public getItem(key: string, desencrypt?:boolean){\n const data = window.localStorage.getItem(key);\n\n return data \n ? JSON.parse(desencrypt\n ? this.decryptObj(data)\n : data)\n : null;\n }\n\n public getItemSession(key: string, desencrypt?:boolean){\n const data = window.sessionStorage.getItem(key);\n\n return data \n ? JSON.parse(desencrypt\n ? this.decryptObj(data)\n : data)\n : null;\n }\n\n public getSerializedToken():string{\n const token = this.cookieService.get(STORAGE.TOKEN);\n return JSON.stringify(this.decryptObj(token));\n }\n\n public setSerializedToken(token:string){\n\n const tokenObject:Token = this.parseObjectDeep(JSON.parse(token));\n\n this.cookieService.set(STORAGE.TOKEN, this.encryptObj(tokenObject), 2, '/', undefined, false, \"None\");\n this.setItemSession(STORAGE.TOKEN, '_');\n }\n\n public getToken(): Token {\n const token = this.cookieService.get(STORAGE.TOKEN);\n return token ? this.decryptObj(token) : null;\n }\n\n public setToken(token: Token) {\n this.cookieService.set(STORAGE.TOKEN, this.encryptObj(token), 2, '/', undefined, false, \"None\");\n this.setItemSession(STORAGE.TOKEN, '_');\n }\n\n public removeToken(){\n this.cookieService.delete(STORAGE.TOKEN, '/', undefined, false, \"None\");\n this.removeSessionItem(STORAGE.TOKEN);\n }\n\n private encryptObj(obj: any): string {\n const _key = CryptoJS.enc.Utf8.parse(environment.cKey);\n const _iv = CryptoJS.enc.Utf8.parse(environment.cKey);\n\n return CryptoJS.AES.encrypt(\n JSON.stringify(obj),\n _key,\n {\n keySize: 16,\n iv: _iv,\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7\n }).toString();\n }\n\n private decryptObj(text: string): any {\n const _key = CryptoJS.enc.Utf8.parse(environment.cKey);\n const _iv = CryptoJS.enc.Utf8.parse(environment.cKey);\n const decryptedText = CryptoJS.AES.decrypt(\n text,\n _key,\n {\n keySize: 16,\n iv: _iv,\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7\n }).toString(CryptoJS.enc.Utf8);\n\n return JSON.parse(decryptedText);\n }\n\n\n // private getCookieDomain(){\n // return window.location.href.includes('.cliniweb.com') ? '.cliniweb.com' : undefined;\n // }\n\n private parseObjectDeep(json : any) : T {\n let result = {} as any;\n var keys = Object.keys(json);\n\n for(let i=0; i < keys.length; i++) {\n let camelCasePropName = keys[i].charAt(0).toLowerCase() + keys[i].slice(1);\n result[camelCasePropName] = json[keys[i]];\n } \n\n return result as T;\n }\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { AppointmentsByPatient, PatientAppointment, PatientAppointmentInformation } from 'src/app/shared/models/process/appointment.model';\r\nimport { OnlineAppointmentRequest } from 'src/app/shared/models/process/online-appointment-request.model';\r\nimport { ScheduleByLocation } from 'src/app/shared/models/process/schedule-by-location.model';\r\nimport { BaseService } from './base.service';\r\nimport { HttpBaseService } from './http-base-service';\r\nimport { OnlineAppointmentStatus } from 'src/app/shared/enums/online-appointment-status.enum';\r\nimport { AppointmentDoctor } from 'src/app/shared/models/people/appointment-doctor';\r\nimport { AppStorageService, STORAGE } from './app-storage.service';\r\nimport { catchError, map, timeout } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppointmentService {\r\n\r\n constructor(private http: HttpBaseService, private baseService:BaseService, private appStorageService: AppStorageService) { }\r\n \r\n getAppointmentById(etapaSolicitudId: number, language: string):Observable {\r\n return this.http.get(`api/citas/${etapaSolicitudId}/informacion?lenguaje=${language}`);\r\n }\r\n\r\n getLatestDoctors(language: string, maxAmount: number) : Observable {\r\n return this.getAppointmentsWithCache(language).pipe(map((appointments: AppointmentsByPatient) => {\r\n let latestDoctors : AppointmentDoctor[];\r\n\r\n if (appointments.doctores && appointments.doctores.length > maxAmount) {\r\n latestDoctors = appointments.doctores.slice(0, maxAmount);\r\n } else {\r\n latestDoctors = appointments.doctores;\r\n }\r\n\r\n return latestDoctors;\r\n })); \r\n }\r\n\r\n getNextAppointment(language: string) : Observable {\r\n return this.getAppointmentsWithCache(language).pipe(map((appointments: AppointmentsByPatient) => {\r\n let nextAppointment = appointments.citasFuturas.find(a => a.idEstado != 7);\r\n \r\n return nextAppointment;\r\n }));\r\n }\r\n\r\n getAppointmentLastTimeShown(appointmentId: number): number {\r\n let dateNumber = this.appStorageService.getItem(STORAGE.NEXT_APPOINTMENT_LAST_TIME_SHOWN + \"_\" + appointmentId);\r\n\r\n return dateNumber? dateNumber : 0;\r\n }\r\n\r\n setAppointmentLastTimeShown(appointmentId: number) {\r\n this.appStorageService.setItem(STORAGE.NEXT_APPOINTMENT_LAST_TIME_SHOWN + \"_\" + appointmentId, new Date().getTime());\r\n }\r\n\r\n getAppointmentsWithCache(language: string):Observable {\r\n if (!this.isAppointmentsCacheEmpty()) {\r\n return of(this.getFromCache());\r\n }\r\n\r\n return this.getAppointments(language);\r\n }\r\n\r\n getAppointments(language: string):Observable {\r\n let url = \"api/citas?language=\" + language;\r\n\r\n return this.http.get(url).pipe(\r\n map((appointments: AppointmentsByPatient) => {\r\n this.addToCache(appointments);\r\n return appointments;\r\n }),\r\n catchError(err => {\r\n console.log(\"error getting appointments from server: \" + err);\r\n throw err;\r\n }));\r\n }\r\n\r\n clearAppointmentsCache() {\r\n this.appStorageService.setItemSession(STORAGE.APPOINTMENTS, null);\r\n }\r\n\r\n getFutureAppointments(language: string):Observable {\r\n return this.getAppointmentsWithCache(language).pipe(map((appointments: AppointmentsByPatient) => {\r\n return appointments.citasFuturas;\r\n })); \r\n }\r\n\r\n getPastAppointments(language: string):Observable {\r\n return this.getAppointmentsWithCache(language).pipe(map((appointments: AppointmentsByPatient) => {\r\n return appointments.citasPasadas;\r\n })); \r\n }\r\n\r\n getIncompletedAppointments():Observable {\r\n return this.http.get(\"api/citas/incompletas\");\r\n }\r\n\r\n cancelAppointment(idSolicitud: number, idEtapaSolicitud: number, reason: string):Observable {\r\n return this.http.put(\"api/citas/\" + idSolicitud + \"/cancelar/\" + idEtapaSolicitud + \"?razon=\" + reason, {});\r\n }\r\n\r\n getAppointmentsSchedule(\r\n idEmpresa: number,\r\n idResponsableServicio: number, \r\n fechaInicio: string, \r\n fechaFin: string, \r\n idLocalidad: number\r\n ): Observable{\r\n\r\n let url = \"api/citas/horarios/disponibles\";\r\n url+=`?idEmpresa=${idEmpresa}`;\r\n url+=`&idResponsableServicio=${idResponsableServicio}`;\r\n url+=`&fechaInicio=${fechaInicio}`;\r\n url+=`&fechaFin=${fechaFin}`;\r\n url+=`&idLocalidad=${idLocalidad}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getAppointmentsScheduleNextItem(\r\n idEmpresa: number,\r\n idResponsableServicio: number, \r\n fechaInicio: string, \r\n idLocalidad: number\r\n ): Observable{\r\n let url = \"api/citas/horarios/disponibles/proximo\";\r\n url+=`?idEmpresa=${idEmpresa}`;\r\n url+=`&idResponsableServicio=${idResponsableServicio}`;\r\n url+=`&fechaInicio=${fechaInicio}`;\r\n url+=`&idLocalidad=${idLocalidad}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getOnlineAppointmentRequest(idVerificacion: string): Observable{\r\n return this.http.get(\"api/citas/por-verificar/\" + idVerificacion, null, false);\r\n }\r\n\r\n createOnlineAppointmentRequest(onlineAppointmentRequest: OnlineAppointmentRequest): Observable{\r\n return this.http.post(\"api/citas/por-verificar\", onlineAppointmentRequest, null, false);\r\n }\r\n\r\n updateOnlineAppointmentRequest(idVerificacion: string, onlineAppointmentRequest: OnlineAppointmentRequest): Observable{\r\n let url = `api/citas/por-verificar/${idVerificacion}`;\r\n return this.http.put(url, onlineAppointmentRequest);\r\n }\r\n\r\n confirmOnlineAppointmentRequest(idVerificacion:string, onlineAppointmentRequest: OnlineAppointmentRequest): Observable{\r\n let url = `api/citas/por-verificar/${idVerificacion}/confirmacion`;\r\n return this.http.put(url, onlineAppointmentRequest);\r\n }\r\n\r\n getStatus(idVerificacion:string): Observable {\r\n let url = `api/citas/por-verificar/${idVerificacion}/estado`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n isAppointmentsCacheEmpty(): boolean {\r\n return !this.appStorageService.getItemSession(STORAGE.APPOINTMENTS);\r\n }\r\n\r\n addToCache(appointments: AppointmentsByPatient) {\r\n this.appStorageService.setItemSession(STORAGE.APPOINTMENTS, appointments);\r\n }\r\n\r\n getFromCache(): AppointmentsByPatient {\r\n return this.appStorageService.getItemSession(STORAGE.APPOINTMENTS);\r\n }\r\n\r\n}","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { User, UserManager } from 'oidc-client';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { Token, TokenState } from 'src/app/shared/models/token.model';\nimport { BaseService } from './base.service';\nimport { HttpBaseService } from './http-base-service';\nimport { OidcUserManagerSettings } from 'src/app/shared/models/systems/portal-phr.model';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthOidcService {\n\n private clientOidc: OidcUserManagerSettings | null = null;\n private manager: UserManager;\n private user: User | null = null;\n \n constructor(\n private http: HttpBaseService,\n private baseService: BaseService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private translation: L10nTranslationService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n }\n\n initManager(){\n console.log(\"auth-oidc.service initManager\");\n this.clientOidc = this.baseService.getDirectoryClientOidc();\n console.log(\"auth-oidc.service clientOidc\" + this.clientOidc);\n\n if(this.clientOidc){\n this.manager = new UserManager(this.clientOidc);\n\n this.manager.getUser().then(user => {\n this.user = user;\n }, \n error => {\n this.baseService.handleServiceError(error, \"Error getting user info\"); \n });\n }\n }\n\n redirectToAuthOidc(): boolean{\n if(isPlatformBrowser(this.platformId)){\n if(!this.clientOidc)\n this.initManager();\n \n return this.clientOidc != null && this.clientOidc.authority != null && !this.clientOidc.authority?.includes('google');\n }\n else{\n return false;\n }\n }\n\n existsManager(): boolean {\n return this.manager != null;\n }\n\n isLoggedIn(): boolean {\n return this.user != null && !this.user.expired;\n }\n\n startAuthentication(state:string, username: string = ''): Promise {\n const args = {\n data: state,\n extraQueryParams: username ? { login_hint: username } : undefined\n };\n\n return this.getManager().signinRedirect(args).catch(error => {\n this.baseService.handleServiceError(error, \"Error redirecting to login page\"); \n });\n }\n\n completeAuthentication():Observable {\n return this.requestTokenFromUser(this.getManager().signinRedirectCallback());\n }\n\n startAuthenticationPopup():Observable{\n return this.requestTokenFromUser(this.getManager().signinPopup());\n }\n\n completeAuthenticationPopup():Observable {\n return this.requestTokenFromUser(this.getManager().signinPopupCallback());\n }\n\n private requestTokenFromUser(promiseUser: Promise): Observable{\n return from(promiseUser)\n .pipe(\n switchMap((user:User|undefined) => {\n\n if(user){\n this.user = user;\n\n const clientOidc = this.baseService.getDirectoryClientOidc();\n\n if(clientOidc){\n return this.baseService.getDirectoryDomain()\n .pipe(switchMap((domain:string)=>{\n\n const _manager = this.getManager();\n\n var urlUserInfo = _manager.settings.metadata \n ? _manager.settings.metadata.userinfo_endpoint\n : clientOidc.authority;\n\n var tokenState = this.parseTokenState(user.state);\n\n var email = tokenState && tokenState.email ? tokenState.email : '';\n\n if(email && user.profile && user.profile.email && email != user.profile.email){\n console.log(\"el email ingresado es diferente al email del OIDC\");\n const dummyToken = new Token();\n dummyToken.isInvalid = true;\n dummyToken.invalidMessage = this.translation.translate(\"invalidEmailOidc\", this.locale.language);\n dummyToken.state = user.state;\n return of(dummyToken);\n } \n\n const model = {\n email: email,\n token: user.access_token,\n clientAuthority: urlUserInfo,\n domain: domain,\n proveedorServicioAutenticacion: clientOidc.authenticationServiceProvider\n }\n \n return this.http.post(\"api/authentication/oidc\", model, null, false)\n .pipe(map((token:Token) => {\n token.state = user.state;\n return token;\n }),\n catchError(err => {\n console.log(\"error complete authentication: \" + err);\n\n if(email && user.profile && user.profile.email && email != user.profile.email){\n console.log(\"el email ingresado es diferente al email del OIDC\");\n const dummyToken = new Token();\n dummyToken.isInvalid = true;\n dummyToken.invalidMessage = this.translation.translate(\"invalidEmailOidc\", this.locale.language);\n dummyToken.state = user.state;\n return of(dummyToken);\n }\n else{\n throw err;\n }\n }));\n }));\n }\n else{\n console.log(\"cliente oidc inexistente\");\n const dummyToken = new Token();\n dummyToken.isInvalid = true;\n return of(dummyToken);\n }\n }\n else {\n console.log(\"usuario inexistente\");\n const dummyToken = new Token();\n dummyToken.isInvalid = true;\n return of(dummyToken);\n }\n }),\n catchError(err => {\n console.log(\"error complete authentication: \" + err);\n const dummyToken = new Token();\n dummyToken.isInvalid = true; \n dummyToken.invalidMessage = err.message;\n this.baseService.handleServiceError(err, \"OIDC Error\");\n\n return of(dummyToken);\n })\n );\n }\n\n private getManager(): UserManager{\n if(this.manager == null){\n this.initManager();\n }\n\n return this.manager;\n }\n\n private parseTokenState(state: string): TokenState {\n let tokenState: TokenState;\n \n try {\n tokenState = JSON.parse(state) as TokenState;\n } \n catch (error) {\n tokenState = new TokenState();\n tokenState.returnUrl = state;\n }\n\n return tokenState;\n }\n}","import { HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { Token } from 'src/app/shared/models/token.model';\nimport { AppStorageService, STORAGE } from './app-storage.service';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { LoginResponse } from 'src/app/shared/models/login-response.model';\nimport { BaseService } from './base.service';\nimport { LoginCompletedMessage, LogoutMessage, MessageBusService, TerritorialDivionCountryMessage } from './message-bus.service';\nimport { Link } from 'src/app/shared/models/people/link.model';\nimport { Router } from '@angular/router';\nimport { HttpBaseService } from './http-base-service';\nimport { L10nTranslationService } from 'angular-l10n';\nimport { UserService } from './user.service';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport { TerritorialDivisionsService } from './territorial-divisions.service';\nimport { isPlatformBrowser } from '@angular/common';\n\nconst AUTH_API = 'oauth/token';\n\nconst httpOptions = {\n headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' })\n};\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class AuthService {\n constructor(\n private http: HttpBaseService,\n private baseService: BaseService,\n private userService: UserService,\n private territorialDivisionService: TerritorialDivisionsService,\n private messageBusService: MessageBusService,\n private appStorageService: AppStorageService,\n private translation: L10nTranslationService,\n private router: Router,\n @Inject(PLATFORM_ID) private platformId: Object\n ){}\n\n login(username: string, password: string): Observable {\n return this.baseService.getDirectoryDomain()\n .pipe(switchMap((domain:string)=>{\n let body = new HttpParams()\n .set('username', username)\n .set('password', password)\n .set('domain', domain)\n .set('grant_type', 'password');\n\n return this.http.post(AUTH_API, body.toString(), httpOptions, false)\n .pipe(\n map((token) => {\n token.username = username;\n this.appStorageService.setToken(token);\n\n this.appStorageService.removeSessionItem(STORAGE.USER);\n\n let response = new LoginResponse();\n response.success = true;\n return response;\n }),\n catchError((err) => {\n let response = new LoginResponse();\n response.success = false;\n response.message = this.translation.translate(\"invalidCredentials\");\n\n return of(response);\n }));\n }));\n }\n\n getTransferToken():Observable{\n let token = this.getToken();\n\n return this.http.post(\"api/authentication/transfer-token/generate\", token);\n }\n\n getTokenByTransferToken(transferToken:string):Observable{\n let transferTokenObject = { token: transferToken };\n\n return this.http.post(\"api/authentication/transfer-token/process\", transferTokenObject, null, false);\n }\n\n loginByTransferToken(transferToken:string):Observable{\n\n return this.getTokenByTransferToken(transferToken)\n .pipe(switchMap((tokenString:string)=>{\n\n this.appStorageService.setSerializedToken(tokenString);\n\n return this.userService.getUserPersonLoggedIn()\n .pipe(switchMap((user:UserPerson | null) => {\n if (user)\n this.messageBusService.loginCompleted(new LoginCompletedMessage(user));\n return of(true);\n }));\n }));\n }\n\n /*getByKey(key: string): Observable{\n let url = environment.apiUrl + \"api/authentication?key=\" + key;\n\n return this.http.get(url);\n }*/\n\n isLoggedInFull(): Observable{\n let token = this.appStorageService.getToken();\n\n if(token){\n return this.getAuthenticationToken(false)\n .pipe(\n switchMap(token => {\n return of(token != null);\n }));\n }\n else{\n return of(false);\n }\n }\n\n isLoggedIn(): boolean {\n let token = this.appStorageService.getToken();\n\n return !!token && !this.http.isTokenExpired(token);\n }\n\n getToken(){\n return this.appStorageService.getToken();\n }\n\n getSerializedToken(){\n return this.appStorageService.getSerializedToken();\n }\n\n getAuthenticationToken(redirectToLogin:boolean = true): Observable {\n return this.http.getValidAuthenticationToken(redirectToLogin);\n }\n\n logout() {\n // Clear all object and cookies\n this.appStorageService.clearLogout();\n\n this.territorialDivisionService.getCountryByIp()\n .subscribe(country=>{\n\n let msg = new TerritorialDivionCountryMessage();\n msg.country = country.territorialDivision;\n\n this.messageBusService.sendTerritorialDivisionCountry(msg);\n });\n\n // Get directory again\n // this.baseService.getAppConfig().subscribe((any) => {});\n\n // Send logout message\n this.messageBusService.logout(new LogoutMessage());\n } \n\n isPathEnabled(path: string, menuLinks: Link[]):boolean {\n let _path = path.replace(\"/\", \"\").split(\"/\")[0].split(\"?\")[0];\n\n let _linkSelected = menuLinks\n ? _path == ''\n ? menuLinks[0].identificadorUrl\n ? menuLinks[0]\n : menuLinks[0].subMenu.length > 0\n ? menuLinks[0].subMenu[0]\n : menuLinks[1]\n : this.getLinkSelected(_path, menuLinks)\n : null;\n\n // let result:boolean = (_linkSelected != null && (_linkSelected.nombreComponenteAnonimo != null || _linkSelected.accesoPublico == 'S'));\n\n let result:boolean;\n\n if(_linkSelected == null) {\n let resutRouteConfig = this.router.config.filter(p => p.path == _path);\n\n result = resutRouteConfig.length > 0;\n }\n else{\n result = (_linkSelected.nombreComponenteAnonimo != null || _linkSelected.accesoPublico == 'S');\n }\n\n return result;\n }\n\n hasPermissions(path: string):Observable{\n return this.baseService.getMenuLinks()\n .pipe(map((links: Link[])=>{\n let _pathEnabled = this.isPathEnabled(path, links);\n let _tokenObject = this.appStorageService.getToken();\n \n if(_tokenObject) {\n return true;\n }\n else {\n if(_pathEnabled && path == '/empty'){\n this.router.navigate(['/login'], { queryParams: { returnUrl: \"empty\" } });\n \n if(isPlatformBrowser(this.platformId)){\n window.parent.postMessage({ eventName: 'pre_login' }, '*');\n }\n \n return false;\n }\n else {\n return true;\n }\n }\n }));\n }\n\n private getLinkSelected(path: string, links: Link[]){\n var linkSelected = links.find(link => this.baseService.getBasePath(link.identificadorUrl) == path);\n\n if(!linkSelected){\n links.filter(link => link.subMenu && link.subMenu.length > 0).forEach(link => {\n\n let subLinkSelected = link.subMenu.find(sublink => this.baseService.getBasePath(sublink.identificadorUrl) == path);\n\n if(subLinkSelected)\n linkSelected = subLinkSelected;\n });\n }\n\n return linkSelected;\n }\n}","export class CompanyModel{\r\n id:number;\r\n name: string;\r\n}","export enum AuthenticationServiceProvider {\n Assa = 12,\n Sura = 13,\n Google = 14,\n Cliniweb = 33\n}\n","\nimport { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\n@Component({\n selector: 'app-learn-more-dialog',\n templateUrl: './learn-more-dialog.component.html',\n styleUrls: ['./learn-more-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class LearnMoreDialogComponent implements OnInit {\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public data: any,\n private mdDialogRef: MatDialogRef, \n ) { }\n\n ngOnInit(): void {\n }\n\n close(){\n this.mdDialogRef.close();\n }\n}\n","
\n
\n \n
\n
\n \n
\n
","import { Injectable } from '@angular/core';\r\nimport { PortalPhr } from 'src/app/shared/models/systems/portal-phr.model';\r\nimport { HttpBaseService } from './http-base-service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PortalPHRService {\r\n\r\n constructor(private http: HttpBaseService) { } \r\n\r\n getByUrl(serverUrl: string) {\r\n let url = \"api/portalphr?url=\" + serverUrl;\r\n\r\n return this.http.get(url, null, false)\r\n } \r\n \r\n}","import { Injectable } from '@angular/core';\nimport { Licence } from 'src/app/shared/models/systems/license.model';\nimport { HttpBaseService } from './http-base-service';\nimport { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AppStorageService, STORAGE } from './app-storage.service';\nimport { environment } from 'src/environments/environment';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LicenseService {\n\n constructor(\n private http: HttpBaseService,\n private appStorageService: AppStorageService\n ) { }\n\n get(idEmpresa:number, idTipo:number, idResponsableServicio:number):Observable{\n const url = `api/licencias?idTipo=${idTipo}&idEmpresa=${idEmpresa}&idResponsableServicio=${idResponsableServicio}`;\n \n return this.http.get(url, null, false);\n }\n\n getLicensePhr(idEmpresa: number, idResponsableServicio?: number):Observable{\n\n idResponsableServicio = idResponsableServicio ?? -1;\n\n const url = `api/licencias?idTipo=${LICENSE_TYPE.PHR}&idEmpresa=${idEmpresa}&idResponsableServicio=${idResponsableServicio}`;\n\n if(idResponsableServicio < 0){\n const license = this.appStorageService.getItemSession(STORAGE.LICENSE, environment.encryptLocalStorage);\n\n if(!license || license === undefined){\n return this.http.get(url, null, false).pipe(map((license:Licence)=>{\n\n this.appStorageService.setItemSession(STORAGE.LICENSE, license, environment.encryptLocalStorage);\n\n return license;\n }));\n }\n else{\n return of(license);\n }\n }\n else{\n return this.http.get(url, null, false);\n } \n }\n}\n\nexport enum LICENSE_TYPE{\n PHR = 6\n}\n","import { Inject, Injectable, Optional, PLATFORM_ID, SecurityContext } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { L10nConfig, L10nLocale, L10nTranslationService, L10N_CONFIG, L10N_LOCALE } from 'angular-l10n';\nimport { Observable, of, Subject } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { Link } from 'src/app/shared/models/people/link.model';\nimport { ConfiguracionServicioAutenticacionPHR, OidcUserManagerSettings, PHRVersion, PortalPhr } from 'src/app/shared/models/systems/portal-phr.model';\nimport { environment } from 'src/environments/environment';\nimport { AppStorageService, STORAGE } from './app-storage.service';\nimport { BaseHttpServiceUnauthorizeException, HttpBaseService } from './http-base-service';\nimport { PortalPHRService } from './portal-phr.service';\nimport { ComponentFinishLoadingMessage, LocaleChangeMessage, MessageBusService, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\nimport * as moment from 'moment';\nimport { Directory, DirectoryType } from 'src/app/shared/models/systems/directory.model';\nimport { DirectoryService } from './directory.service';\nimport { GoogleAnalyticsService } from './google-analytics.service';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { LegalAgreements } from 'src/app/shared/interfaces/legal-agreements';\nimport { LicenseService } from './license.service';\nimport { Licence } from 'src/app/shared/models/systems/license.model';\nimport { CompanyModel } from 'src/app/shared/models/systems/company.model';\nimport { AuthenticationServiceProvider } from 'src/app/shared/enums/authentication-service-provider';\nimport { LegalAgreementType } from 'src/app/shared/enums/legal-agreements-type.enum';\nimport { LegalAgreementsDialogComponent, LegalAgreementsDialogData } from 'src/app/shared/components/dialogs/legal-agreements-dialog/legal-agreements-dialog.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { LearnMoreDialogComponent } from 'src/app/shared/components/dialogs/learn-more-dialog/learn-more-dialog.component';\nimport { REQUEST } from '@nguniversal/express-engine/tokens';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Request } from 'express';\nimport { DomSanitizer, Meta, Title } from '@angular/platform-browser';\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\nimport { LogService } from './log.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BaseService {\n\n private localeChangedSource:Subject; \n localeChanged$:Observable;\n isBrowser: boolean;\n\n constructor(\n private http: HttpBaseService,\n private messageBusService: MessageBusService,\n private router: Router,\n private appStorageService: AppStorageService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(L10N_CONFIG) private l10nConfig: L10nConfig,\n private translation: L10nTranslationService,\n private portalPhrService: PortalPHRService,\n private directoryService : DirectoryService,\n private licenseService: LicenseService,\n private dialog: MatDialog,\n @Inject(PLATFORM_ID) private platformId: Object,\n @Optional() @Inject(REQUEST) private request: Request,\n private sanitizer: DomSanitizer,\n private titleService: Title,\n private meta: Meta,\n private logService: LogService\n ) {\n this.localeChangedSource = new Subject();\n this.localeChanged$ = this.localeChangedSource.asObservable();\n this.setConfigTranslation();\n\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n setConfigTranslation(){\n this.translation.onChange().subscribe({\n next: (locale: L10nLocale) => {\n this.localeChangedSource.next(locale);\n }\n });\n this.translation.onError().subscribe({\n next: (error: any) => {\n if (error) console.log(error);\n }\n });\n }\n\n checkVersion(): void{\n const version = this.appStorageService.getItem(STORAGE.VERSION);\n\n if(version){\n if(version !== environment.version){\n this.appStorageService.clearAll();\n this.appStorageService.setItem(STORAGE.VERSION, environment.version);\n }\n }\n else{\n this.appStorageService.setItem(STORAGE.VERSION, environment.version);\n }\n }\n\n getAppConfig():Observable {\n let url: string = '';\n let path: string = '';\n\n // Si estĆ” en el navegador, usa window.location\n if (this.isBrowser) {\n url = encodeURIComponent(window.location.origin);\n path = window.location.pathname;\n } \n else if (this.request) {\n // Si estĆ” en el servidor (SSR), usa la URL de la request\n url = encodeURIComponent(`${this.request.protocol}://${this.request.get('host')}`);\n path = this.request.url;\n }\n\n return this.portalPhrService.getByUrl(url)\n .pipe(switchMap((directory: PortalPhr) =>{\n this.logService.logVerbose(\"registro de portal encontrado: \" + directory.nombre);\n\n this.setDefaultLanguage(directory.localizacionDefecto);\n\n this.messageBusService.showSignupLoginHeaderMenu(directory.versionPhr >= PHRVersion.V2);\n\n if (this.isBrowser) {\n this.appStorageService.setItemSession(STORAGE.DIRECTORY, directory);\n\n if(environment.production){\n GoogleAnalyticsService.loadGoogleAnalytics(directory.analyticsKey);\n }\n }\n\n // set title page\n const pathSegments = path.split('/');\n const perfilIndex = pathSegments.findIndex(segment => segment === 'perfil');\n if (perfilIndex !== -1 && perfilIndex < pathSegments.length - 1) {\n\n const nickname = pathSegments[perfilIndex + 1];\n\n if(nickname){\n let language = directory.localizacionDefecto ?? 'es';\n let accountName = directory.nombreEmpresaDestinoDirectorio ?? '';\n let publicProfileUrl = `api/perfiles-publicos/${nickname}?lenguaje=${language}&nombreCuenta=${accountName}`;\n return this.http.get(publicProfileUrl, null, false)\n .pipe(switchMap(profile => {\n const title = profile.browserTitle + ' - ' + directory.titulo;\n this.titleService.setTitle(title);\n this.meta.updateTag({ name: 'description', content: profile.browserDescription });\n return of(directory);\n }));\n }\n else{\n this.titleService.setTitle(directory.titulo);\n return of(directory);\n }\n }\n else{\n this.titleService.setTitle(directory.titulo);\n return of(directory);\n }\n }),\n catchError(err => {\n this.logService.logError('Error al obtener configuraciĆ³n PortalPHR');\n throw err;\n })\n );\n }\n\n getMenuLinks(language: string = '', companyId?: number): Observable{\n language = language ? language : this.getLanguage();\n\n if(!companyId){\n companyId = this.getCompanyId();\n }\n\n let _menuLinks: Link[] = this.isBrowser ? this.appStorageService.getItemSession(STORAGE.MENU, true) : [];\n\n if(_menuLinks && _menuLinks.length > 0){\n return of(_menuLinks);\n }\n else {\n return this.http.get(\"api/layout/menu/\" + language + \"?idEmpresa=\" + companyId, null, false)\n .pipe(map((links: Link[])=>{\n\n if (this.isBrowser){\n this.appStorageService.setItemSession(STORAGE.MENU, links, true);\n }\n \n return links;\n }));\n }\n }\n\n getMenuLinkByAreaId(language: string, areaId: number) : Observable {\n return this.getMenuLinks(language)\n .pipe(map((links: Link[]) => {\n return links? links.find(l => l.idAreaSistema == areaId) : undefined;\n })\n );\n }\n\n getDirectory():PortalPhr {\n let directory = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory;\n }\n\n getAuthenticationProviders():ConfiguracionServicioAutenticacionPHR[]{\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory.clientesOidc;\n } \n\n getCompanyId():number {\n let directory = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory && directory.idEmpresa ? directory.idEmpresa : 0;\n }\n\n getCompanyByLicense():Observable{\n return this.licenseService.getLicensePhr(this.getCompanyId())\n .pipe(map(license=>{\n\n let company: CompanyModel = new CompanyModel();\n\n if(license == null){\n company.id = environment.idEmpresaCliniwebPHR ;\n company.name = this.getCliniwebDomain();\n }\n else{\n company.id = this.getCompanyId();\n company.name = this.getCompanyName();\n }\n\n return company;\n }));\n }\n\n isLicensedCompany(idResponsableServicio?:number):Observable{\n return this.licenseService.getLicensePhr(this.getCompanyId(), idResponsableServicio)\n .pipe(map((license:Licence)=>{\n return license != null;\n }));\n }\n\n getCliniwebDirectoryCompanyId():number {\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n return directory && directory.idEmpresaDestinoDirectorio ? directory.idEmpresaDestinoDirectorio : 0;\n }\n\n getCliniwebDirectoryCompanyName():string {\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory && directory.nombreEmpresaDestinoDirectorio? directory.nombreEmpresaDestinoDirectorio : \"\";\n }\n\n getCliniwebDirectoryLocationCompanyIds():string {\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory && directory.idsEmpresasLocalidades? directory.idsEmpresasLocalidades : \"\";\n }\n\n getCompanyName():string {\n let directory = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory && directory.nombre ? directory.nombre : \"\";\n }\n\n getMenuComponentName():string {\n let directory = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory && directory.nombreMenu ? directory.nombreMenu : \"\";\n }\n\n getBackUrlCompany():string{\n let url = this.appStorageService.getItem(STORAGE.REFERRER);\n return url;\n }\n\n getUrlCompany():string{\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n return directory && directory.urlCorporativo ? directory.urlCorporativo : '';\n }\n\n getDisclaimer(): LegalAgreements | null {\n const directory: PortalPhr = this.getDirectory();\n return directory.descargoResponsabilidad?.trim().length ? JSON.parse(directory.descargoResponsabilidad) : null;\n }\n\n getPrivacyPolicy(): LegalAgreements | null {\n const directory: PortalPhr = this.getDirectory();\n return directory.politicasPrivacidad?.trim().length ? JSON.parse(directory.politicasPrivacidad) : null;\n }\n\n getTermsAndConditions(): LegalAgreements | null {\n const directory: PortalPhr = this.getDirectory();\n return directory.terminosCondiciones?.trim().length ? JSON.parse(directory.terminosCondiciones) : null;\n }\n\n getPublicProfileVersion():string {\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory && directory.versionPerfilPublico ? directory.versionPerfilPublico : \"\";\n }\n\n getLanguage():string {\n if(isPlatformBrowser(this.platformId)){\n let language = this.appStorageService.getItem(STORAGE.LOCALE);\n\n if(language){\n return language.language;\n }\n else{\n return \"es\";\n }\n }\n else{\n return \"es\";\n }\n }\n\n getCliniwebDomain(){\n return environment.nombreEmpresaCliniwebPHR;\n }\n\n isCliniwebCompany() : boolean {\n let directory = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory && directory.nombre ? directory.nombre == this.getCliniwebDomain() : false;\n }\n\n setDefaultLanguage(language:string){\n\n let languageString: any | null = null;\n\n if (this.isBrowser) {\n languageString = this.appStorageService.getItem(STORAGE.LOCALE);\n }\n\n if(languageString){\n this.setLocale(languageString);\n }\n else {\n let schema = this.l10nConfig.schema.find(l => l.locale.language == language);\n\n if(!schema)\n schema = this.l10nConfig.schema[0];\n\n this.setLocale(schema.locale);\n\n if (this.isBrowser) {\n this.appStorageService.setItem(STORAGE.LOCALE, JSON.stringify(schema.locale));\n }\n }\n }\n\n setLocale(locale: L10nLocale): void {\n this.translation.setLocale(locale);\n let message = new LocaleChangeMessage();\n\n message.language = locale.language;\n\n this.messageBusService.localeChange(message);\n }\n\n getHeaderName():string{\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory? directory.nombreEncabezado : \"\";\n }\n\n getPoliciesControlName():string{\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory? directory.nombrePoliticas : \"\";\n }\n\n getDirectoryClass():string {\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory ? directory.nombreClaseEstilo : \"cliniweb\";\n }\n\n getDirectoryTitle(): string{\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory? directory.titulo : \"\";\n }\n\n getDirectoryUrlFavicon(): string{\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory? directory.urlFavicon : \"\";\n }\n \n getRouteLinkByArea(idAreaSistema:number):string {\n try{\n let menu:Link[] = this.appStorageService.getItemSession(STORAGE.MENU, true);\n\n let link = menu.find(link => link.idAreaSistema == idAreaSistema);\n\n return link ? link.identificadorUrl : '';\n }\n catch{\n return '';\n }\n }\n\n getDirectoryClientOidc() : OidcUserManagerSettings | null {\n try { \n let directory : PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n //TODO allow more than one\n var clienteOidc = directory.clientesOidc.find(c => c.proveedorServicioAutenticacion == AuthenticationServiceProvider.Google \n || c.proveedorServicioAutenticacion == AuthenticationServiceProvider.Sura);\n\n if (clienteOidc && clienteOidc.clienteOidc) {\n var oidcClient : OidcUserManagerSettings = JSON.parse(clienteOidc.clienteOidc);\n oidcClient.authenticationServiceProvider = clienteOidc.proveedorServicioAutenticacion;\n\n return oidcClient;\n }\n }\n catch {\n console.log(\"No se pudo parsear el cliente oidc\");\n }\n\n return null;\n }\n\n getDirectoryDomain(): Observable{\n return this.licenseService.getLicensePhr(this.getCompanyId())\n .pipe(map((license:Licence)=>{\n if(license == null){\n return this.getCliniwebDomain();\n }\n else{\n const directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory? directory.nombreCuentaPaciente : \"\";\n }\n }));\n }\n\n getCliniwebDirectory(companyId: number): Observable{\n let key = STORAGE.CLINIWEB_DIRECTORY + companyId;\n let directory:Directory = this.appStorageService.getItem(key);\n\n if (!directory) {\n return this.directoryService.getByType(companyId, DirectoryType.Cliniweb)\n .pipe(map((directory: Directory) =>{\n this.appStorageService.setItem(key, directory);\n\n return directory;\n }));\n }\n else {\n return of(directory);\n }\n }\n\n isMenuLinksVisible(): boolean{\n let directory:PortalPhr = this.appStorageService.getItemSession(STORAGE.DIRECTORY);\n\n return directory? directory.menuVisible == 'S' : true;\n }\n\n parseObject(json : any) : T {\n let result = {};\n\n // Asign all values\n Object.assign(result, json);\n\n return result as T;\n }\n\n parseObjectDeep(json : any) : T {\n let result = {} as any;\n var keys = Object.keys(json);\n\n for(let i=0; i < keys.length; i++) {\n let camelCasePropName = keys[i].charAt(0).toLowerCase() + keys[i].slice(1);\n result[camelCasePropName] = json[keys[i]];\n } \n\n return result as T;\n }\n\n convertObjectToQS(obj : any) : string {\n let str = [];\n \n for (var p in obj)\n if (obj.hasOwnProperty(p)) {\n str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(obj[p]));\n }\n \n return str.join(\"&\");\n }\n\n goToRoute(path:string) {\n let pathQueryParams = path.split('?');\n let queryParams = pathQueryParams[1];\n\n if(pathQueryParams[1]){\n let params = queryParams.split('&');\n let pair = null;\n let paramsObject:any = {};\n \n params.forEach(p => {\n pair = p.split('=');\n paramsObject[pair[0]] = pair[1];\n });\n \n this.router.navigate([ \"/\" + pathQueryParams[0]], { queryParams: paramsObject });\n }\n else{\n this.router.navigate([ \"/\" + pathQueryParams[0]]);\n }\n }\n\n getSearchSeed() {\n let seed = this.appStorageService.getItem(STORAGE.PROFILE_SEACH_SEED);\n\n if (!seed) {\n // Generate a 6 digits code\n seed = Math.trunc(Math.random() * 1000000);\n\n // Store on local storage\n this.appStorageService.setItem(STORAGE.PROFILE_SEACH_SEED, seed);\n }\n\n return seed;\n }\n\n getLocationFromIdentifier(territorialDivisionIdentifier: string) {\n let parts = territorialDivisionIdentifier? territorialDivisionIdentifier.split(\"/\") : [\"\"];;\n let country = \"\", state = \"\", city = \"\";\n\n // If we search by city or state we will alway get the country. \n // Example \"Panama/bocas-del-toro/chiriqui-grande\" pais=panama&provincia=bocas-del-toro&ciudad=chiriqui-grande\n if (parts.length > 0)\n country = parts[0];\n\n // Second we will alway have the state\n if (parts.length > 1)\n state = parts[1];\n\n // Thrid we will alway have the city\n if (parts.length > 2)\n city = parts[2];\n\n return {\n country: country,\n state: state,\n city: city\n };\n }\n\n // AvatarInitials\n getInitialsString(text:string):string {\n let arrayText = text.trim().replace(/-/g, '').normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").replace(/\\s\\s+/g, ' ').split(\" \");\n\n let result;\n \n if (arrayText.length > 1) {\n\n var lastnamePosition = arrayText.length - 1;\n\n if (lastnamePosition == 0 || (arrayText[lastnamePosition].length >= 2 && arrayText[lastnamePosition].includes('.'))) {\n result = arrayText[0][0] + arrayText[1][0];\n }\n else if (arrayText.length == 4) {\n result = arrayText[0][0] + arrayText[2][0];\n }\n else {\n result = arrayText[0][0] + arrayText[lastnamePosition][0];\n }\n }\n else {\n result = arrayText[0][0];\n }\n \n return result.toUpperCase();\n }\n\n getHashCodeByString(id:number, text:string):number {\n var hash = 0;\n for (var i = 0; i < text.length; i++) {\n hash = text.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hash + id;\n }\n\n getColorByInitials(id:number, initials:string):string {\n var hashCode = this.getHashCodeByString(id, initials);\n\n var colors = [\n \"#0ACBAC\",\n \"#17C65D\",\n \"#C801F2\",\n \"#FD3A58\",\n \"#F06C00\",\n \"#FFC000\",\n \"#296EFA\",\n \"#6B9DFF\",\n \"#7A1FA2\",\n \"#7C59BE\"\n ];\n\n var index = hashCode % colors.length;\n\n return colors[index];\n }\n\n getAvatarInitialObject(id:number, text:string): any{\n \n var initials = this.getInitialsString(text);\n\n var color = this.getColorByInitials(id, initials);\n\n return { initials , color };\n }\n\n public handleServiceError(error: any, errorMessage: string, displayMessage? : string) {\n if (!error || !(error instanceof BaseHttpServiceUnauthorizeException)) {\n let serviceError = new ServiceErrorMessage(errorMessage, displayMessage);\n serviceError.innerError = error;\n this.messageBusService.serviceError(serviceError);\n }\n }\n\n public getBasicDateFormat(date : Date, includeYear: boolean = true, yearSeparator: string = ', ') : string { \n let momentDate = moment(date).locale(this.locale.language);\n let dateDay = momentDate.format('DD');\n let dateMonth = momentDate.format('MMM').toLowerCase().replace(\".\", \"\");\n let dateYear = momentDate.format('YYYY');\n \n dateMonth = dateMonth.charAt(0).toUpperCase() + dateMonth.slice(1);\n\n let yearStr = includeYear? (yearSeparator + dateYear) : \"\";\n\n let resultDateStr = this.locale.language == \"es\"?\n (dateDay + \" \" + dateMonth + yearStr) :\n (dateMonth + \" \" + dateDay + yearStr);\n\n return resultDateStr;\n }\n\n public getMonthName(month: number, uppercaseFirstLetter: boolean = false) : string {\n var monthName = moment(month.toString(), 'M').locale(this.locale.language).format('MMM');\n \n monthName = monthName.toLowerCase().replace(\".\", \"\");\n\n return uppercaseFirstLetter\n ? monthName.charAt(0).toUpperCase() + monthName.slice(1)\n : monthName;\n }\n\n public getBasePath(path: string){\n return path ? path.split(\"/\")[0].split(\"?\")[0] : '';\n }\n\n sendComponentFinishLoadingMessage(formaData: FormComponentData){\n if (!formaData)\n throw \"FormComponentData cannot be null\";\n if (!formaData.idFormulario || !formaData.idControlPadre)\n throw \"FormComponentData cannot be null\";\n\n let event = new ComponentFinishLoadingMessage();\n \n event.idFormulario = formaData.idFormulario;\n event.idControl = formaData.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n encryptObj(obj: any): string {\n const _key = CryptoJS.enc.Utf8.parse(environment.cKey);\n const _iv = CryptoJS.enc.Utf8.parse(environment.cKey);\n\n return CryptoJS.AES.encrypt(\n JSON.stringify(obj),\n _key,\n {\n keySize: 16,\n iv: _iv,\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7\n }).toString();\n }\n\n decryptObj(text: string): any {\n const _key = CryptoJS.enc.Utf8.parse(environment.cKey);\n const _iv = CryptoJS.enc.Utf8.parse(environment.cKey);\n const decryptedText = CryptoJS.AES.decrypt(\n text,\n _key,\n {\n keySize: 16,\n iv: _iv,\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7\n }).toString(CryptoJS.enc.Utf8);\n\n return JSON.parse(decryptedText);\n }\n\n openLegalAgreementsDialog(type:LegalAgreementType){\n let data = new LegalAgreementsDialogData();\n\n data.type = type;\n\n this.dialog.open(LegalAgreementsDialogComponent, { data: data, panelClass: ['legal-agreements-dialog'] });\n }\n\n openLearnMoreDialog(){\n this.dialog.open(LearnMoreDialogComponent, { panelClass: ['learn-more-dialog'] });\n }\n\n isIOS() : boolean {\n if (/iPad|iPhone|iPod/.test(navigator.platform)) {\n return true;\n } \n else {\n return typeof(navigator.maxTouchPoints) != 'undefined' \n && navigator.maxTouchPoints > 2 \n && /MacIntel/.test(navigator.platform);\n }\n } \n\n isMacDesktop() : boolean {\n return typeof(navigator.maxTouchPoints) != 'undefined' \n && navigator.maxTouchPoints == 0 \n && /MacIntel/.test(navigator.platform);\n }\n\n getDetailedAgeByDate(birthDate:Date): string{\n const now = new Date();\n let years = now.getFullYear() - birthDate.getFullYear();\n let months = now.getMonth() - birthDate.getMonth();\n let days = now.getDate() - birthDate.getDate();\n\n if (days < 0) {\n months--;\n days += new Date(now.getFullYear(), now.getMonth(), 0).getDate();\n }\n\n if (months < 0) {\n years--;\n months += 12;\n }\n\n return this.getDetailedAge(years, months, days);\n }\n\n getDetailedAge(years: number, months: number, days: number):string{\n const yearSingularText = this.translation.translate('year');\n const yearPluralText = this.translation.translate('years');\n const monthSingularText = this.translation.translate('month');\n const monthPluralText = this.translation.translate('months');\n const daySingularText = this.translation.translate('day');\n const dayPluralText = this.translation.translate('days');\n\n const parts: string[] = [];\n\n if (years > 0) {\n parts.push(`${years} ${years > 1 ? yearPluralText : yearSingularText}`);\n }\n\n if (months > 0) {\n parts.push(`${months} ${months > 1 ? monthPluralText : monthSingularText}`);\n }\n\n if (days > 0) {\n parts.push(`${days} ${days > 1 ? dayPluralText : daySingularText}`);\n }\n\n return parts.join(', ');\n }\n\n isSerializedHtml(text: string): boolean{\n const htmlRegex = /<\\/?[a-z][\\s\\S]*>/i;\n return htmlRegex.test(text);\n }\n\n createSafeUrl(data: Blob): string {\n const objectUrl = URL.createObjectURL(data);\n const safeUrl = this.sanitizer.bypassSecurityTrustUrl(objectUrl);\n \n // Convierte SafeUrl a string seguro\n return this.sanitizer.sanitize(SecurityContext.URL, safeUrl) || '';\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { ChatCancellationMessage, ChatConversacion, ChatConversacionMessage } from \"src/app/shared/models/people/chat-conversation.model\";\r\nimport { Observable } from \"rxjs\";\r\nimport { HttpBaseService } from './http-base-service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ChatService {\r\n\r\n constructor(private http: HttpBaseService) {}\r\n\r\n getByEtapaSolicitudId(etapaSolicitudId: number) : Observable {\r\n return this.http.get(\"api/chats?etapaSolicitudId=\" + etapaSolicitudId);\r\n }\r\n\r\n getChatMessages(idSolicitud: number, from: number, pageSize: number): Observable {\r\n return this.http.get(\"api/chats/mensajes?idSolicitud=\" + idSolicitud + \"&from=\" + from + \"&pageSize=\" + pageSize);\r\n }\r\n\r\n sendMessage(chatId: number, message: ChatConversacionMessage){\r\n return this.http.post(\"api/chats/\" + chatId + \"/mensaje\", message);\r\n }\r\n\r\n sendCancellationMessage(chatId: number, message: ChatCancellationMessage) {\r\n return this.http.post(\"api/chats/\" + chatId + \"/mensaje/cancelacion\", message);\r\n }\r\n}","export class AttentionHistory {\n contactoClinico: ClinicalContact;\n atenciones: AttentionGroupItem[]; \n}\n\nexport class ClinicalContact {\n id: number;\n idSolicitud: number;\n idTipoSolicitud: number;\n fechaContacto: Date;\n idResponsableServicio: number;\n nombreResponsableServicio: string;\n avatarResponsableServicio: string;\n asunto: string;\n edadPaciente: string;\n idEstatus: number;\n}\n\nexport class AttentionGroupItem {\n idTipoConcepto: number;\n nombreTipoConcepto: string;\n agrupadores: number[];\n\n items: ClinicHistoryItem[];\n}\n\nexport class ClinicHistoryItem {\n id: number;\n idTipoConcepto: number;\n idConcepto: number;\n nombreConcepto: string;\n nombreTipoConcepto: string;\n valorConcepto: string;\n valorHtmlConcepto: string;\n fecha: Date;\n descripcion: string;\n fechaRegistro: Date;\n idPaciente: number;\n nombrePaciente: string;\n idResponsableAtencion: number;\n nombreResponsableAtencion: string;\n idContactoClinico: number;\n nombreEmisorAtencion: string;\n idFormulario: number;\n idControlFormulario: number;\n idAgrupador: string;\n idDocumento: number;\n nombreDocumento: string;\n idTipoDocumento: number;\n extensionDocumento: string;\n ubicacionWebDocumento: string;\n nombreBucketAmazon: string;\n}","import { HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AttentionGroupItem, AttentionHistory } from 'src/app/shared/models/clinic-history/attention-history.model';\nimport { ClinicHistory } from 'src/app/shared/models/clinic-history/clinic-history.model';\nimport { environment } from 'src/environments/environment';\nimport { HttpBaseService } from './http-base-service';\nimport { UtilsService } from './utils.service';\nimport { ClinicHistoryHashed } from 'src/app/shared/models/clinic-history/clinic-history-hashed.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ClinicHistoryService {\n\n constructor(\n private http: HttpBaseService,\n private utilsService: UtilsService\n ) { }\n\n getClinicHistory(idPaciente:number = -1, idResponsableServicio: number = -1):Observable{\n\n let url = \"api/historias-clinicas\";\n\n url += \"?idPaciente=\" + idPaciente;\n url += \"&idResponsableServicio=\" + idResponsableServicio;\n\n return this.http.get(url);\n }\n\n getAttentionsByGroup(attentionHistoryArray: AttentionHistory[], idAgrupador: number): AttentionHistory[] {\n let attentionsFiltered: AttentionHistory[] = [];\n\n attentionHistoryArray.forEach(attentionHistory => {\n let _atenciones = attentionHistory.atenciones.filter(a => a.agrupadores.indexOf(idAgrupador) >= 0);\n\n if(_atenciones.length > 0){\n\n let _attentionHistory = new AttentionHistory();\n\n _attentionHistory.contactoClinico = attentionHistory.contactoClinico;\n _attentionHistory.atenciones = _atenciones;\n\n attentionsFiltered.push(_attentionHistory);\n }\n });\n\n return attentionsFiltered;\n }\n\n getClinicHistoryItemsByGroup(items:AttentionGroupItem[], groups: number[]) { \n return items.filter(i => this.utilsService.containsAnyNumber(i.agrupadores, groups)); \n }\n \n getClinicHistoryItemsByExcludedGroup(items:AttentionGroupItem[], groups: number[]) {\n return items.filter(i => !this.utilsService.containsAnyNumber(i.agrupadores, groups));\n }\n\n getAttentionsByConceptType(items:AttentionGroupItem[], concepType: number) {\n return items.filter(a => a.idTipoConcepto == concepType);\n }\n\n getClassPreviewFile(extension: string): string {\n let _className = '';\n switch(extension){\n case 'jpg':\n case 'jpeg':\n case 'bmp':\n case 'gif':\n case 'png':\n _className = \"image\";\n break;\n default:\n break;\n }\n return _className;\n }\n\n getPreviewFileUrl(extension: string, url: string): string {\n let _imagePreviewUrl = '';\n switch(extension){\n case 'jpg':\n case 'jpeg':\n case 'bmp':\n case 'gif':\n case 'png':\n _imagePreviewUrl = url ? url.replace(/\\\\/g, '/') : '';\n break;\n case 'pdf':\n _imagePreviewUrl = '/assets/images/HC/img_preview_pdf.png';\n break;\n case 'xls':\n case 'xlsx':\n case 'xlt':\n _imagePreviewUrl = '/assets/images/HC/img_preview_xls.png';\n break;\n case 'doc':\n case 'docx':\n _imagePreviewUrl = '/assets/images/HC/img_preview_doc.png';\n break;\n case 'mp3':\n _imagePreviewUrl = '/assets/images/HC/img_preview_mp3.png';\n break;\n case 'mp4':\n _imagePreviewUrl = '/assets/images/HC/img_preview_mp4.png';\n break;\n default:\n _imagePreviewUrl = '/assets/images/HC/img_preview_default.png';\n break;\n }\n\n return _imagePreviewUrl;\n }\n\n getClinicHistoryPdf(model: any): Observable {\n let url = \"api/historias-clinicas/pdf\"; \n let headers = new HttpHeaders();\n \n headers = headers.set('Accept', 'application/pdf');\n\n return this.http.post(url, model, { headers: headers, responseType: 'blob' as 'json' });\n }\n\n getClinicHistoryByHash(id: string): Observable {\n const url = `api/historias-clinicas/hashed`;\n const params = new HttpParams().set('hashedId', id);\n\n return this.http.get(url, { params }, false);\n }\n\n}\n","import { Injectable } from '@angular/core';\r\nimport { Directory, DirectoryType } from 'src/app/shared/models/systems/directory.model';\r\nimport { HttpBaseService } from './http-base-service';\r\nimport { Observable } from 'rxjs';\r\nimport { DirectorySearchTitle } from 'src/app/shared/interfaces/directory-search-title';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DirectoryService {\r\n\r\n constructor(\r\n private http: HttpBaseService\r\n ) { } \r\n\r\n getByType(companyId: number, type: DirectoryType) {\r\n let url = \"api/directorios/\" + companyId + \"?tipo=\" + type;\r\n\r\n return this.http.get(url, null, false);\r\n } \r\n\r\n getByUrl(serverUrl: string) {\r\n let url = \"api/directorios?url=\" + serverUrl;\r\n\r\n return this.http.get(url, null, false)\r\n }\r\n\r\n getSearchTitle(\r\n language:string,\r\n publicProfileType:number, \r\n searchText:string, \r\n conceptTypeId: number, \r\n conceptId:number, \r\n contryCityIdentifier:string, \r\n filters:string):Observable{\r\n\r\n let url = 'api/directorios/titulo-busqueda';\r\n url += `?localizacion=${language}`;\r\n\r\n if(publicProfileType)\r\n url += `&tipoPerfilPublico=${publicProfileType}`;\r\n\r\n if(searchText)\r\n url += '&textoBusqueda=' + encodeURIComponent(searchText);\r\n\r\n if(conceptTypeId)\r\n url += `&idTipoConcepto=${conceptTypeId}`;\r\n\r\n if(conceptId)\r\n url += `&idConcepto=${conceptId}`;\r\n\r\n if(contryCityIdentifier)\r\n url += `&identificadorPaisCiudad=${contryCityIdentifier}`;\r\n\r\n if(filters)\r\n url += `&filtros=${filters}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { DoctorSearchResult } from 'src/app/shared/models/cdr/doctor-search-result.model';\r\nimport { DoctorMessage } from 'src/app/shared/models/people/doctor-message.model';\r\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\r\nimport { HttpBaseService } from './http-base-service';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { LicenseDoctor } from 'src/app/shared/models/clinic-history/license-doctor.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DoctorService {\r\n\r\n constructor(private http: HttpBaseService) { }\r\n\r\n searchDoctors(language: string, searchText: string, companyname: string, profileType: PublicProfileType[]):Observable {\r\n\r\n if(!searchText)\r\n return of([]);\r\n\r\n let url = \"api/doctores?localizacion=\" + language + \"&textoBusqueda=\" + encodeURIComponent(searchText) + \"&tipoPerfil=\" + profileType.join(\",\");\r\n\r\n if (companyname)\r\n url += \"&dominioEmpresa=\" + companyname;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n \r\n postMessageToDoctor(model: DoctorMessage) {\r\n let url = \"api/doctores/\" + model.IdPersona + \"/mensaje\";\r\n\r\n return this.http.post(url, model, null, false);\r\n }\r\n \r\n getLicense(idResponsableServicio: number): Observable {\r\n const url = `api/doctores/${idResponsableServicio}/idoneidad`;\r\n const params = new HttpParams();\r\n\r\n return this.http.get(url, { params }, false); \r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { SystemDocument } from 'src/app/shared/models/process/document.model';\r\nimport { HttpBaseService } from './http-base-service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DocumentService {\r\n\r\n constructor(private http: HttpBaseService) { }\r\n\r\n getDocumentUrl(documentId: number) : Observable {\r\n let url = \"api/documentos/\" + documentId + \"/url\";\r\n \r\n return this.http.get(url);\r\n } \r\n\r\n getDocumens(documentIds: string) : Observable {\r\n let url = \"api/documentos/batch?idsDocumento=\" + documentIds;\r\n \r\n return this.http.get(url);\r\n } \r\n}","import { Injectable } from '@angular/core';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport { MessageBusService } from './message-bus.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GoogleAnalyticsService {\n\n constructor(\n private messageBusService: MessageBusService,\n ) {\n\n this.messageBusService.onLoginCompleted().subscribe(msg => {\n if (msg.user) {\n this.setUserData(msg.user);\n } \n });\n\n }\n\n static loadGoogleAnalytics(key: string){\n const gaScript = document.createElement('script');\n gaScript.setAttribute('async', 'true');\n gaScript.setAttribute('src', `https://www.googletagmanager.com/gtag/js?id=${ key }`);\n\n const gaScript1 = document.createElement('script');\n gaScript1.innerText = `window.dataLayer = window.dataLayer || [];`;\n gaScript1.innerText += `window.gtag=window.gtag||function(){dataLayer.push(arguments);};`;\n gaScript1.innerText += `window.gtag(\\'js\\', new Date());`;\n // gaScript1.innerText += `window.gtag(\\'config\\', \\'${ key }\\', { 'debug_mode':true });`;\n gaScript1.innerText += `window.gtag(\\'config\\', \\'${ key }\\');`;\n\n document.documentElement?.firstChild?.appendChild(gaScript);\n document.documentElement?.firstChild?.appendChild(gaScript1);\n }\n\n logPageView(url: string){\n if((window as any).gtag){\n (window as any).gtag('event', 'page_view', { page_location: url});\n }\n }\n\n sendEventInitVirtualConsultation(){\n if((window as any).gtag){\n (window as any).gtag('event', 'init_virtual_consultation');\n }\n }\n\n sendEventOpenClinicHistory(){\n if((window as any).gtag){\n (window as any).gtag('event', 'open_clinic_history');\n }\n }\n\n sendEventDownloadClinicHistory(){\n if((window as any).gtag){\n (window as any).gtag('event', 'download_clinic_history');\n }\n }\n\n sendEventGoToInsuranceCard(){\n if((window as any).gtag){\n (window as any).gtag('event', 'go_to_insurance_card');\n }\n }\n\n setUserData(user: UserPerson){\n if((window as any).gtag){\n (window as any).gtag('set', 'user_id', user.id);\n (window as any).gtag('set', 'user_properties', {\n 'sex': user.sexo\n });\n }\n }\n}\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, EMPTY, Observable, of, throwError } from 'rxjs';\r\nimport { AppStorageService } from '../services/app-storage.service';\r\nimport { catchError, shareReplay, switchMap, tap, timeout } from 'rxjs/operators';\r\nimport { Router } from '@angular/router';\r\nimport { environment } from 'src/environments/environment';\r\nimport { MessageBusService, SessionExpiredMessage } from 'src/app/core/services/message-bus.service';\r\nimport { Token } from 'src/app/shared/models/token.model';\r\nimport { JwtHelperService } from \"@auth0/angular-jwt\";\r\n\r\nconst TOKEN_HEADER_KEY = 'Authorization';\r\nconst AUTH_API = environment.apiUrl + 'oauth/token';\r\n\r\nconst httpOptions = {\r\n headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' })\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n })\r\n export class HttpBaseService {\r\n private refreshSubject = new BehaviorSubject(undefined);\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private router: Router,\r\n private appStorageService: AppStorageService,\r\n private messageBusService: MessageBusService) { }\r\n\r\n public get(url: string, options: any = null, useAuthentication: boolean = true) : Observable { \r\n if (!options) options = {};\r\n if (!options.headers) options.headers = new HttpHeaders();\r\n\r\n url = environment.apiUrl + url;\r\n \r\n if (!useAuthentication) {\r\n return this.http.get(url, options as object);\r\n }\r\n else {\r\n\r\n return this.setAuthenticationHeader(options.headers).pipe(\r\n switchMap(header => { \r\n options.headers = header;\r\n \r\n return this.http.get(url, options as object);\r\n }),\r\n catchError((err) => {\r\n if (err instanceof BaseHttpServiceUnauthorizeException) {\r\n return EMPTY;\r\n } else {\r\n return throwError(err);\r\n }\r\n })); \r\n } \r\n } \r\n\r\n public post(url: string, body: any = null, options: any = null, useAuthentication: boolean = true) : Observable {\r\n if (!options) options = {};\r\n if (!options.headers) options.headers = new HttpHeaders();\r\n\r\n url = environment.apiUrl + url;\r\n\r\n if (!useAuthentication) {\r\n return this.http.post(url, body, options as object);\r\n }\r\n else {\r\n return this.setAuthenticationHeader(options.headers).pipe(\r\n switchMap(header => {\r\n options.headers = header;\r\n \r\n return this.http.post(url, body, options as object)\r\n }),\r\n catchError((err) => {\r\n if (err instanceof BaseHttpServiceUnauthorizeException) {\r\n return EMPTY;\r\n } else {\r\n return throwError(err);\r\n }\r\n })); \r\n }\r\n }\r\n\r\n public put(url: string, body: any = null, options: any = null, useAuthentication: boolean = true) : Observable {\r\n if (!options) options = {};\r\n if (!options.headers) options.headers = new HttpHeaders();\r\n\r\n url = environment.apiUrl + url;\r\n \r\n if (!useAuthentication) {\r\n return this.http.put(url, body, options as object);\r\n }\r\n else {\r\n return this.setAuthenticationHeader(options.headers).pipe(\r\n switchMap(header => {\r\n options.headers = header;\r\n \r\n return this.http.put(url, body, options as object)\r\n }),\r\n catchError((err) => {\r\n if (err instanceof BaseHttpServiceUnauthorizeException) {\r\n return EMPTY;\r\n } else {\r\n return throwError(err);\r\n }\r\n })); \r\n }\r\n }\r\n\r\n public delete(url: string, options: any = null, useAuthentication: boolean = true) : Observable {\r\n if (!options) options = {};\r\n if (!options.headers) options.headers = new HttpHeaders();\r\n\r\n url = environment.apiUrl + url;\r\n \r\n if (!useAuthentication) {\r\n return this.http.delete(url, options as object);\r\n }\r\n else {\r\n return this.setAuthenticationHeader(options.headers).pipe(\r\n switchMap(header => {\r\n options.headers = header;\r\n \r\n return this.http.delete(url, options as object)\r\n }),\r\n catchError((err) => {\r\n if (err instanceof BaseHttpServiceUnauthorizeException) {\r\n return EMPTY;\r\n } else {\r\n return throwError(err);\r\n }\r\n })); \r\n }\r\n }\r\n\r\n public sessionExpired(returnUrl: string) {\r\n // This case is when the \"empty\" page is loaded from a doctor public profile, in this case we do not want to show the session expired popup\r\n if(this.router.url.indexOf(\"empty\") > -1) {\r\n this.router.navigate(['/login'], { queryParams: { returnUrl: \"empty\" } });\r\n }\r\n else\r\n // This if is just because when the user insert an invalid credential on login the server return a 401 (unauthorized)\r\n if(this.router.url.indexOf(\"login\") == -1 ){\r\n\r\n this.messageBusService.sessionExpired(new SessionExpiredMessage(returnUrl));\r\n }\r\n else{\r\n console.log(\"Session expired\");\r\n }\r\n }\r\n\r\n public isTokenExpired(token: Token): boolean {\r\n\r\n const helper = new JwtHelperService();\r\n \r\n return helper.isTokenExpired(token.access_token, 300);\r\n }\r\n\r\n public getValidAuthenticationToken(redirectToLogin:boolean = true) : Observable {\r\n let token = this.appStorageService.getToken();\r\n\r\n if (!!token && this.isTokenExpired(token)) {\r\n this.refreshSubject.next(); // Emitir un valor para refrescar el Observable\r\n\r\n return this.refreshSubject.pipe(\r\n switchMap(() => this.refreshAuthenticationToken(token)),\r\n tap((t) => {\r\n t.username = !!token ? token.username : '';\r\n // Set token on local storage\r\n this.appStorageService.setToken(t);\r\n }),\r\n catchError((err) => {\r\n if (redirectToLogin) {\r\n this.onAuthenticationRequired();\r\n return throwError(new BaseHttpServiceUnauthorizeException());\r\n } else {\r\n return of(null);\r\n }\r\n }),\r\n shareReplay(1) // Compartir el resultado con las suscripciones\r\n );\r\n }\r\n else {\r\n return of(token);\r\n }\r\n }\r\n\r\n private setAuthenticationHeader(headers: HttpHeaders) : Observable {\r\n let tokenObject = this.appStorageService.getToken();\r\n\r\n if (!tokenObject) {\r\n // If token is not present let just ask for one\r\n this.onAuthenticationRequired(); \r\n \r\n // Remove exception in order to avoid unnecessary errors in browser console.\r\n return throwError(new BaseHttpServiceUnauthorizeException());\r\n // Returnin NULL/Undefined will make the pipe to skip the result, so the service will never be called.\r\n }\r\n else {\r\n const tokenIsExpired = this.isTokenExpired(tokenObject);\r\n\r\n // If the token is expired lets try to get a new one using the refresh token\r\n if (tokenIsExpired) {\r\n return this.refreshAuthenticationToken(tokenObject).pipe( \r\n switchMap(t => {\r\n t.username = !!tokenObject ? tokenObject.username : '';\r\n // Set token on local storage\r\n this.appStorageService.setToken(t);\r\n\r\n // Set authentication header on request\r\n headers = headers.set(TOKEN_HEADER_KEY, 'Bearer ' + t.access_token); \r\n\r\n return of(headers);\r\n }),\r\n catchError(err => {\r\n this.onAuthenticationRequired();\r\n\r\n return throwError(new BaseHttpServiceUnauthorizeException());\r\n }));\r\n }\r\n else {\r\n // Set authentication header on request\r\n headers = headers.set(TOKEN_HEADER_KEY, 'Bearer ' + tokenObject.access_token);\r\n \r\n return of(headers);\r\n }\r\n } \r\n } \r\n\r\n private refreshAuthenticationToken(token: any) {\r\n return this.refreshToken(token.refresh_token); \r\n }\r\n\r\n private refreshToken(refreshToken: string): Observable {\r\n let body = new HttpParams()\r\n .set('refresh_token', refreshToken)\r\n .set('grant_type', 'refresh_token');\r\n \r\n return this.http.post(AUTH_API, body.toString(), httpOptions);\r\n }\r\n\r\n private onAuthenticationRequired() {\r\n this.sessionExpired(this.router.url);\r\n } \r\n \r\n }\r\n\r\n export class BaseHttpServiceUnauthorizeException extends Error{\r\n constructor(message: string = \"Unauthorized access\") {\r\n super(message);\r\n this.name = \"BaseHttpServiceUnauthorizeException\";\r\n }\r\n }","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { BaseService } from './base.service';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class IframeMessageService {\r\n\r\n private IFRAME_RESIZE_EVENT_NAME = \"iframe_resize\";\r\n private MODAL_OPEN_EVENT_NAME = \"modal_open\";\r\n private MODAL_CLOSE_EVENT_NAME = \"modal_close\";\r\n private REQUEST_USER_ID_EVENT_NAME = \"request_user_id\";\r\n private SCROLL_TOP_EVENT_NAME = \"scroll_top\";\r\n private MANAGE_APPOINTMENTS_EVENT_NAME = \"manage_appointments\";\r\n private PUBLIC_PROFILE_LOADED_EVENT_NAME = \"public_profile_finish_loading\";\r\n private REFRESH_USER = \"refresh_user_info\";\r\n\r\n private iframeResizeSubject = new Subject();\r\n private modalOpenSubject = new Subject();\r\n private modalCloseSubject = new Subject();\r\n private requestUserIdSubject = new Subject();\r\n private scrollTopSubject = new Subject();\r\n private manageAppointmentsSubject = new Subject();\r\n private publicProfileFinishLoadingSubject = new Subject();\r\n private refreshUserSubject = new Subject();\r\n\r\n constructor(private baseService:BaseService, @Inject(PLATFORM_ID) private platformId: any) { \r\n\r\n if(isPlatformBrowser(this.platformId)){\r\n // Listen to iframe events\r\n window.addEventListener(\"message\", (e : any) => {\r\n if (!e.data)\r\n return;\r\n\r\n if (typeof e.data == 'string') {\r\n // For iframe resize we use 'iframe-resizer' lib as we do not want to handle the logic to fire an event each time the \r\n // iframte content height change, like when someone expand a div, collapsable.\r\n // This library will send and event like the next one\r\n let match = e.data.match(/[iFrameSizer].*:(\\d+):(\\d+)/);\r\n if (match) {\r\n var height = match[1];\r\n var width = match[2];\r\n\r\n var model = new IframeMessage();\r\n model.eventName = this.IFRAME_RESIZE_EVENT_NAME;\r\n model.model = new IframeResizeMessage();\r\n\r\n model.model.height = height;\r\n model.model.width = width;\r\n\r\n this.handleIframeEvent(model);\r\n\r\n return;\r\n }\r\n } \r\n\r\n this.handleIframeEvent(e.data);\r\n }, false);\r\n }\r\n }\r\n\r\n handleIframeEvent(event: IframeMessage) {\r\n \r\n switch(event.eventName){\r\n case this.IFRAME_RESIZE_EVENT_NAME:\r\n this.iframeResizeSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n case this.MODAL_OPEN_EVENT_NAME:\r\n this.modalOpenSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n case this.MODAL_CLOSE_EVENT_NAME:\r\n this.modalCloseSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n case this.REQUEST_USER_ID_EVENT_NAME:\r\n this.requestUserIdSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n case this.SCROLL_TOP_EVENT_NAME:\r\n this.scrollTopSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n case this.MANAGE_APPOINTMENTS_EVENT_NAME:\r\n this.manageAppointmentsSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n case this.PUBLIC_PROFILE_LOADED_EVENT_NAME:\r\n this.publicProfileFinishLoadingSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n case this.REFRESH_USER:\r\n this.refreshUserSubject.next(this.baseService.parseObject(event.model));\r\n break;\r\n }\r\n }\r\n\r\n onIframeResize(): Observable {\r\n return this.iframeResizeSubject.asObservable();\r\n }\r\n\r\n onModalOpen(): Observable {\r\n return this.modalOpenSubject.asObservable();\r\n }\r\n\r\n modalClose(msg: ModalEventMessage) {\r\n this.modalCloseSubject.next(msg);\r\n }\r\n onModalClose(): Observable {\r\n return this.modalCloseSubject.asObservable();\r\n }\r\n \r\n onRequestUserId(): Observable{\r\n return this.requestUserIdSubject.asObservable();\r\n }\r\n\r\n postMessage(eventName: string, data: any) {\r\n\r\n if(isPlatformBrowser(this.platformId)){\r\n window.postMessage({ eventName: eventName, model: data }, '*');\r\n }\r\n }\r\n\r\n parentPostMessage(eventName: string, data: any) {\r\n if(isPlatformBrowser(this.platformId)){\r\n window.parent.postMessage({ eventName: eventName, model: data }, '*');\r\n }\r\n }\r\n\r\n onScrollTop(): Observable {\r\n return this.scrollTopSubject.asObservable();\r\n }\r\n\r\n onManageAppointments(): Observable {\r\n return this.manageAppointmentsSubject.asObservable();\r\n }\r\n\r\n onPublicProfileLoaded(): Observable {\r\n return this.publicProfileFinishLoadingSubject.asObservable();\r\n }\r\n\r\n onRefreshUser(): Observable {\r\n return this.refreshUserSubject.asObservable();\r\n }\r\n}\r\n\r\nexport class IframeMessage {\r\n eventName: string;\r\n model: T;\r\n}\r\n\r\nexport class IframeResizeMessage {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport class ModalEventMessage {\r\n}\r\n\r\nexport class RequestUserIdEventMessage {\r\n}\r\n\r\nexport class IframeScrollTopMessage {\r\n position: number;\r\n}\r\n\r\nexport class ManageAppointmentsMessage {\r\n}\r\n\r\nexport class PublicProfileFinishLoading {\r\n}\r\n\r\nexport class RefreshUserMessage {\r\n}","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { Direction } from 'src/app/shared/enums/direction.enum';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { Form } from 'src/app/shared/models/people/form.model';\nimport { Link } from 'src/app/shared/models/people/link.model';\nimport { TextLanguage } from 'src/app/shared/models/people/text-language.model';\nimport { BaseService } from './base.service';\nimport { HttpBaseService } from './http-base-service';\nimport { map } from 'rxjs/operators';\nimport { THEMES, Theme } from 'src/themes/theme';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LayoutService {\n\n private mobileDelimiter: number = 800;\n\n private hideComponentSource = new Subject();\n hideComponentSource$ = this.hideComponentSource.asObservable();\n\n private postNavigateSource = new Subject();\n postNavigateSource$ = this.postNavigateSource.asObservable();\n\n private scrollingBodySource = new Subject();\n scrollingBodySource$ = this.scrollingBodySource.asObservable();\n\n constructor(\n private http: HttpBaseService,\n private baseService:BaseService,\n @Inject(THEMES) private themes: Theme[],\n @Inject(DOCUMENT) private document: any,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { }\n\n getForm(idAreaSistema:number):Observable
{\n let companyId = this.baseService.getCompanyId(); \n let url = \"api/layout/formulario?idEmpresa=\" + companyId + \"&idAreaSistema=\" + idAreaSistema;\n\n return this.http.get(url, null, false);\n }\n\n getTextByLanguage(objectSerialized: any, language: string): string{\n try { \n let language = this.baseService.getLanguage();\n\n let textArray:TextLanguage[] = (typeof(objectSerialized) == 'object')\n ? objectSerialized\n : JSON.parse(objectSerialized);\n\n let textLanguage = textArray.find(t => t.lenguaje == language);\n\n return textLanguage ? textLanguage.texto : objectSerialized;\n }\n catch {\n return objectSerialized;\n }\n }\n\n hideComponent(data: FormComponentData){\n this.hideComponentSource.next(data);\n }\n\n postNavigate(){\n this.postNavigateSource.next();\n }\n\n onScrollingBody(dir:Direction){\n this.scrollingBodySource.next(dir);\n }\n\n loadLicenseTheme(classNameContainer:string, idResponsableServicio?: number){\n return this.baseService.isLicensedCompany()\n .pipe(\n map((result:boolean)=>{\n\n let directoryClassname: string = 'cliniweb'; \n\n if(result){\n directoryClassname = this.baseService.getDirectoryClass();\n }\n\n const theme = this.themes.find(t => t.name === directoryClassname);\n\n if(!theme) return;\n\n const containerElement = this.document.getElementsByClassName(classNameContainer)[0];\n\n for (const key in theme.properties) {\n containerElement.style.setProperty(key, theme.properties[key]);\n }\n })\n );\n }\n\n isMobile(event?: any):boolean{\n if(event && event.target && event.target.innerWidth){\n return event.target.innerWidth <= this.mobileDelimiter;\n }\n else if(isPlatformBrowser(this.platformId)){\n return window.innerWidth <= this.mobileDelimiter;\n }\n else{\n return false;\n }\n }\n\n overflowBodyDisabled(){\n this.document.documentElement.classList.add('overflow-disabled');\n }\n\n overflowBodyEnabled(){\n this.document.documentElement.classList.remove('overflow-disabled');\n }\n\n addComponentInitClass(componentClass: string){\n this.document.documentElement.classList.add(componentClass);\n }\n\n removeComponentInitClass(componentClass: string){\n this.document.documentElement.classList.remove(componentClass);\n }\n\n isHeaderVisible(){\n return this.document.getElementsByClassName(\"header-dynamic-container\")[0].offsetParent !== null;\n }\n\n addClassToBody(className:string){\n if(className)\n this.document.body.classList.add(className);\n }\n\n removeClassToBody(className:string){\n if(className)\n this.document.body.classList.remove(className);\n }\n}","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { environment } from 'src/environments/environment';\nimport { HttpClient } from '@angular/common/http';\nimport { isPlatformServer } from '@angular/common';\n\nexport enum LogLevel {\n Off = 0,\n Error = 1,\n Warning = 2,\n Info = 3,\n Verbose = 4\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LogService {\n\n constructor(\n private http: HttpClient,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { }\n\n logError(text:any){\n this.postLog(text, LogLevel.Error);\n }\n logWarning(text:any){\n this.postLog(text, LogLevel.Warning);\n }\n logInfo(text:any){\n this.postLog(text, LogLevel.Info);\n }\n logVerbose(text:any){\n this.postLog(text, LogLevel.Verbose);\n }\n\n private postLog(text:any, level:LogLevel){\n if(isPlatformServer(this.platformId) && environment.logLevel >= level){\n const timestamp = new Date().toLocaleString();\n let body = {\n text: `[${timestamp}] ${JSON.stringify(text)}`,\n level: level\n }\n this.http.post(environment.gatewayUrl + 'api/logs', body).subscribe({\n next: () => {\n console.log('Log enviado correctamente.');\n },\n error: (err) => {\n console.error('Error al enviar el log:', err);\n }\n });\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpBaseService } from './http-base-service';\nimport { Observable } from 'rxjs';\nimport { AttentionsHistory } from 'src/app/shared/interfaces/attentions-history';\nimport { MedicalOrder } from 'src/app/shared/interfaces/medical-order';\nimport { MedicalOrderViewModel } from 'src/app/shared/models/clinic-history/medical-order.model';\nimport { MEDICAL_REQUEST_TYPE } from 'src/app/shared/enums/medical-request-type.enum';\nimport { HttpParams } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MedicalOrderService {\n\n private url = 'api/ordenes-medicas';\n\n constructor(private http: HttpBaseService) { }\n\n get(id: string) {\n const url = `${this.url}/por-verificar/${id}/historial-atencion`;\n return this.http.get(url);\n }\n\n getById(id: string): Observable {\n const url = `${this.url}/${id}`;\n return this.http.get(url);\n }\n\n getList(idPaciente: number, tipos: string) {\n const url = `${this.url}?idPaciente=${idPaciente}&idTiposSolicitud=${tipos}`;\n return this.http.get(url);\n }\n\n buildRequestNumber(requestTypeId: number = -1, requestNumber: number = -1): string {\n return requestTypeId == MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION ? requestNumber.toString().padStart(6, '0') : '';\n }\n\n generateByIdHashed(idHashed: string): Observable {\n const url = `${this.url}/generacion`;\n const params = new HttpParams().set('hash', idHashed);\n\n return this.http.post(url, null, { params }, false);\n }\n\n}\n\nexport interface MedicalOrderSummary {\n idResponsableServicio: number;\n idTipoSolicitud: number;\n idVerificacion: string;\n nombrePaciente: string;\n nombreResponsableServicio: string;\n ubicacionFoto: string;\n\n idPaciente?:number;\n idUsuario: number;\n emailUsuario: string;\n idProveedorServicioAutenticacion: number;\n}\n\nexport interface MedicalOrderValidatedUser extends MedicalOrderSummary {\n emailPaciente: string;\n fechaNacimiento: string;\n isValid: boolean;\n tipoRelacionPacienteUsuario: number;\n}\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\r\nimport { FormConfiguration } from 'src/app/shared/models/people/form.model';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { ClinicHistory } from 'src/app/shared/models/clinic-history/clinic-history.model';\r\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\r\nimport { IWorkflowDataState } from 'src/app/shared/interfaces/workflow-data-state';\r\nimport { ComponentName } from 'src/app/shared/enums/component-name.enum';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { AppointmentsByPatient } from 'src/app/shared/models/process/appointment.model';\r\nimport { TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\r\nimport { Direction } from 'src/app/shared/enums/direction.enum';\r\nimport { Type } from '@angular/core';\r\n\r\n/*\r\n This service will be used for communication between components\r\n Each type of event will be a message (with a class that represent its properties)\r\n For each message we will have a method to fire a new message and a method to subscribe to new messages\r\n*/\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageBusService {\r\n \r\n private profileSearchSubject = new Subject();\r\n private profileSearchFilterSubject = new Subject();\r\n private sendUserIdSubject = new Subject();\r\n private authIframeSubject = new Subject();\r\n private pastVirtualRequestsSubject = new Subject();\r\n private virtualRequestFinishedSubject = new Subject();\r\n private appointmentCancelledSubject = new Subject();\r\n private loadChatSubject = new BehaviorSubject(null as any); // BehaviorSubject allway keeps the last value\r\n private openChatSubject = new BehaviorSubject(null as any); // BehaviorSubject allway keeps the last value\r\n private componentFinishLoadingSubject = new Subject();\r\n private formConfigurationSubject = new Subject();\r\n private chatCancelledSubject = new Subject();\r\n private chatLoadedSubject = new Subject();\r\n private loginCompletedSubject = new Subject();\r\n private logoutSubject = new Subject();\r\n private sessionExpiredSubject = new Subject();\r\n private serviceErrorSubject = new Subject();\r\n private sendClinicHistorySubject = new Subject();\r\n private providerSearchSubject = new Subject();\r\n private pageSrollSubject = new Subject();\r\n private scrollTopBodySubject = new Subject();\r\n private closeCheckAutocompleteSubject = new Subject();\r\n private localeChangeSubject = new Subject();\r\n private formFinishLoadingSubject = new Subject();\r\n private sendPublicProfileSubject = new Subject();\r\n private sendWorkflowDataSubject = new Subject();\r\n private sendFlowStepCompletedSubject = new Subject();\r\n private componentDataSetSubject = new Subject();\r\n private workflowStateUpdateSubject = new Subject();\r\n private openSnackBarSubject = new Subject();\r\n private hideHeaderSubject = new Subject();\r\n private showHeaderSubject = new Subject();\r\n private navigationBackSubject = new Subject();\r\n private closeRouteDialogSubject = new Subject();\r\n private appointmentChangeReceivedSubject = new Subject();\r\n private closeWorkFlowRequestSubject: Subject = new Subject();\r\n private hideAnonymousMenuSubject: Subject = new Subject();\r\n private showAnonymousMenuSubject: Subject = new Subject();\r\n private closeSearchProviderDialogSubject = new Subject();\r\n private showSignupLoginHeaderMenuSubject: BehaviorSubject = new BehaviorSubject(true);\r\n private showWelcomeImageSubject: BehaviorSubject = new BehaviorSubject(true);\r\n private sendFloatingComponentsSubject = new Subject();\r\n private refreshProfileMenuSubject = new Subject();\r\n private clearProviderFiltersSubject = new Subject();\r\n private openProviderFiltersSubject = new Subject();\r\n private providerFiltersCountSubject = new Subject();\r\n private controlComponentClassnameSubject = new Subject();\r\n private openRouteDialogSubject = new Subject();\r\n private allRouteDialogClosedSubject = new Subject();\r\n private publicProfilePageSubject = new Subject();\r\n private dialogOpenSubject = new Subject();\r\n private dialogCloseSubject = new Subject();\r\n private territorialDivisionCountrySubject = new Subject(); \r\n private publicProfileHeaderVisibilityChangeSubject = new Subject();\r\n private publicProfileActionSubject = new Subject();\r\n private reloadFormComponentSubject = new Subject();\r\n private toggleBottomSheetSubject = new Subject<{action: string, component?: Type}>();\r\n\r\n constructor() { } \r\n\r\n // This is events is fired by 'search-doctors.component' each time a user click on search\r\n profileSearch(message: ProfileSearchMessage) {\r\n this.profileSearchSubject.next(message);\r\n }\r\n onProfileSearch(): Observable {\r\n return this.profileSearchSubject.asObservable();\r\n }\r\n \r\n // This is events is fired by 'search-doctors-filters.component' each time a user click on filter\r\n profileSearchFilter(message: ProfileSearchFilterMessage) {\r\n this.profileSearchFilterSubject.next(message);\r\n }\r\n onProfileSearchFilter(): Observable {\r\n return this.profileSearchFilterSubject.asObservable();\r\n }\r\n \r\n sendUserId(userId: number){\r\n this.sendUserIdSubject.next(userId);\r\n }\r\n onSendUserId(): Observable{\r\n return this.sendUserIdSubject.asObservable();\r\n }\r\n\r\n authIframe(){\r\n this.authIframeSubject.next();\r\n }\r\n onAuthIframe(): Observable{\r\n return this.authIframeSubject.asObservable();\r\n }\r\n\r\n appointmentCancelled(message: AppointmentCancelledMessage) {\r\n this.appointmentCancelledSubject.next(message);\r\n }\r\n onAppointmentCancelled(): Observable {\r\n return this.appointmentCancelledSubject.asObservable();\r\n }\r\n\r\n loadChat(message: LoadChatMessage) {\r\n this.loadChatSubject.next(message);\r\n }\r\n onLoadChat(): Observable {\r\n return this.loadChatSubject.asObservable();\r\n }\r\n\r\n openChat(message: OpenChatMessage) {\r\n this.openChatSubject.next(message);\r\n }\r\n onOpenChat(): Observable {\r\n return this.openChatSubject.asObservable();\r\n }\r\n\r\n chatCancelled(message: ChatCancelledMessage) {\r\n this.chatCancelledSubject.next(message);\r\n }\r\n onChatCancelled(): Observable {\r\n return this.chatCancelledSubject.asObservable();\r\n }\r\n\r\n chatLoaded(message: ChatLoadedMessage) {\r\n this.chatLoadedSubject.next(message);\r\n }\r\n onChatLoaded(): Observable {\r\n return this.chatLoadedSubject.asObservable();\r\n }\r\n\r\n setFormConfiguration(message: FormConfigurationMessage) {\r\n this.formConfigurationSubject.next(message);\r\n }\r\n onFormConfiguration(): Observable {\r\n return this.formConfigurationSubject.asObservable();\r\n }\r\n\r\n componentFinishLoading(message: ComponentFinishLoadingMessage) {\r\n this.componentFinishLoadingSubject.next(message);\r\n }\r\n onComponentFinishLoading(): Observable {\r\n return this.componentFinishLoadingSubject.asObservable();\r\n }\r\n\r\n loginCompleted(message: LoginCompletedMessage) {\r\n this.loginCompletedSubject.next(message);\r\n }\r\n onLoginCompleted(): Observable {\r\n return this.loginCompletedSubject.asObservable();\r\n }\r\n\r\n logout(message: LogoutMessage) {\r\n this.logoutSubject.next(message);\r\n }\r\n onLogout(): Observable {\r\n return this.logoutSubject.asObservable();\r\n }\r\n\r\n sessionExpired(message: SessionExpiredMessage) {\r\n this.sessionExpiredSubject.next(message);\r\n }\r\n onSessionExpired(): Observable {\r\n return this.sessionExpiredSubject.asObservable();\r\n }\r\n\r\n serviceError(message: ServiceErrorMessage) {\r\n this.serviceErrorSubject.next(message);\r\n }\r\n onServiceError(): Observable {\r\n return this.serviceErrorSubject.asObservable();\r\n }\r\n\r\n sendClinicHistory(message: ClinicHistoryMessage) {\r\n this.sendClinicHistorySubject.next(message);\r\n }\r\n\r\n onSendClinicHistory(): Observable{\r\n return this.sendClinicHistorySubject.asObservable();\r\n }\r\n\r\n providerSearch(message: ProviderSearchMessage) {\r\n this.providerSearchSubject.next(message);\r\n }\r\n\r\n onProviderSearch(): Observable {\r\n return this.providerSearchSubject.asObservable();\r\n }\r\n\r\n goToPastVirtualRequests() {\r\n this.pastVirtualRequestsSubject.next();\r\n }\r\n \r\n onGoToPastVirtualRequests(): Observable {\r\n return this.pastVirtualRequestsSubject.asObservable();\r\n }\r\n \r\n virtualRequestFinished() {\r\n this.virtualRequestFinishedSubject.next();\r\n }\r\n \r\n onOnVirtualRequestFinished(): Observable {\r\n return this.virtualRequestFinishedSubject.asObservable();\r\n }\r\n\r\n appointmentChangeReceived(appointmentsByPatient: AppointmentsByPatient) {\r\n this.appointmentChangeReceivedSubject.next(appointmentsByPatient);\r\n }\r\n \r\n onAppointmentChangeReceived(): Observable {\r\n return this.appointmentChangeReceivedSubject.asObservable();\r\n }\r\n\r\n pageScroll(message: PageScrollMessage) {\r\n this.pageSrollSubject.next(message);\r\n }\r\n onPageScroll(): Observable {\r\n return this.pageSrollSubject.asObservable();\r\n }\r\n\r\n scrollTopBody(message: number) {\r\n this.scrollTopBodySubject.next(message);\r\n }\r\n onScrollTopBody(): Observable {\r\n return this.scrollTopBodySubject.asObservable();\r\n }\r\n closeCheckAutocomplete(originComponentId:number){\r\n this.closeCheckAutocompleteSubject.next(originComponentId);\r\n }\r\n onCloseCheckAutocomplete(): Observable{\r\n return this.closeCheckAutocompleteSubject.asObservable();\r\n }\r\n\r\n localeChange(message: LocaleChangeMessage) {\r\n this.localeChangeSubject.next(message);\r\n }\r\n onLocaleChange(): Observable {\r\n return this.localeChangeSubject.asObservable();\r\n }\r\n formFinishLoading(idAreaSistema: number) {\r\n this.formFinishLoadingSubject.next(idAreaSistema);\r\n }\r\n onFormFinishLoading(): Observable {\r\n return this.formFinishLoadingSubject.asObservable();\r\n }\r\n\r\n sendPublicProfile(message: PublicProfileMessage){\r\n this.sendPublicProfileSubject.next(message);\r\n }\r\n \r\n onSendPublicProfile(): Observable {\r\n return this.sendPublicProfileSubject.asObservable();\r\n }\r\n\r\n sendWorkflowData(message: WorkflowDataMessage){\r\n this.sendWorkflowDataSubject.next(message);\r\n }\r\n\r\n onSendWorkflowData(): Observable{\r\n return this.sendWorkflowDataSubject.asObservable();\r\n }\r\n\r\n sendFlowStepCompleted(message: FlowStepCompletedMessage){\r\n this.sendFlowStepCompletedSubject.next(message);\r\n }\r\n\r\n onSendFlowStepCompleted(): Observable{\r\n return this.sendFlowStepCompletedSubject.asObservable();\r\n }\r\n\r\n onComponentDataSetMessage(message: ComponentDataSetMessage) {\r\n this.componentDataSetSubject.next(message);\r\n }\r\n\r\n onSendComponentDataSetMessage(): Observable{\r\n return this.componentDataSetSubject.asObservable();\r\n }\r\n\r\n onWorkflowStateUpdateMessage(message: WorkflowStateUpdateMessage) {\r\n this.workflowStateUpdateSubject.next(message);\r\n }\r\n\r\n onSendWorkflowStateUpdateMessage(): Observable{\r\n return this.workflowStateUpdateSubject.asObservable();\r\n }\r\n\r\n openSnackBar(message: OpenSnackBarMessage){\r\n this.openSnackBarSubject.next(message);\r\n }\r\n\r\n onOpenSnackBar():Observable{\r\n return this.openSnackBarSubject.asObservable();\r\n }\r\n\r\n hideHeader(){\r\n this.hideHeaderSubject.next();\r\n }\r\n onHideHeader(): Observable{\r\n return this.hideHeaderSubject.asObservable();\r\n }\r\n\r\n showHeader(){\r\n this.showHeaderSubject.next();\r\n }\r\n onShowHeader(): Observable{\r\n return this.showHeaderSubject.asObservable();\r\n }\r\n\r\n navigateBack(message: NavigationBackMessage){\r\n this.navigationBackSubject.next(message);\r\n }\r\n onNavigateBack(): Observable{\r\n return this.navigationBackSubject.asObservable();\r\n }\r\n\r\n closeRouteDialog(message: CloseRouteDialogMessage){\r\n this.closeRouteDialogSubject.next(message);\r\n }\r\n onCloseRouteDialog(): Observable{\r\n return this.closeRouteDialogSubject.asObservable();\r\n }\r\n\r\n closeSearchProviderDialog(){\r\n this.closeSearchProviderDialogSubject.next();\r\n }\r\n onCloseSearchProviderDialog():Observable{\r\n return this.closeSearchProviderDialogSubject.asObservable();\r\n }\r\n\r\n sendFloatingComponents(message: FloatingComponentsMessage){\r\n this.sendFloatingComponentsSubject.next(message);\r\n }\r\n\r\n onSendFloatingComponents():Observable{\r\n return this.sendFloatingComponentsSubject.asObservable();\r\n }\r\n\r\n clearProviderFilters(){\r\n this.clearProviderFiltersSubject.next();\r\n }\r\n\r\n onClearProviderFilters():Observable{\r\n return this.clearProviderFiltersSubject.asObservable();\r\n }\r\n\r\n openProviderFilters(){\r\n this.openProviderFiltersSubject.next();\r\n }\r\n\r\n onOpenProviderFilters():Observable{\r\n return this.openProviderFiltersSubject.asObservable();\r\n }\r\n\r\n providerFiltersCount(count:number){\r\n this.providerFiltersCountSubject.next(count);\r\n }\r\n\r\n onProviderFiltersCount():Observable{\r\n return this.providerFiltersCountSubject.asObservable();\r\n }\r\n\r\n closeWorkFlowRequest(ruta?: string): void {\r\n this.closeWorkFlowRequestSubject.next(ruta);\r\n }\r\n\r\n onCloseWorkFlowRequest(): Observable{\r\n return this.closeWorkFlowRequestSubject.asObservable();\r\n }\r\n\r\n hideAnonymousMenu(): void {\r\n this.hideAnonymousMenuSubject.next();\r\n }\r\n\r\n onHideAnonymousMenu(): Observable{\r\n return this.hideAnonymousMenuSubject.asObservable();\r\n }\r\n\r\n showAnonymousMenu(): void {\r\n this.showAnonymousMenuSubject.next();\r\n }\r\n\r\n onShowAnonymousMenu(): Observable{\r\n return this.showAnonymousMenuSubject.asObservable();\r\n }\r\n\r\n controlComponentClassname(message: ControlComponentClassnameMessage){\r\n this.controlComponentClassnameSubject.next(message);\r\n }\r\n\r\n onControlComponentClassname():Observable{\r\n return this.controlComponentClassnameSubject.asObservable();\r\n }\r\n\r\n\tshowSignupLoginHeaderMenu(arg: boolean) {\r\n this.showSignupLoginHeaderMenuSubject.next(arg);\r\n }\r\n\r\n onShowSignupLoginHeaderMenu(): Observable {\r\n return this.showSignupLoginHeaderMenuSubject.asObservable();\r\n }\r\n\r\n\tshowWelcomeImage(arg: boolean) {\r\n this.showWelcomeImageSubject.next(arg);\r\n }\r\n\r\n onShowWelcomeImage(): Observable {\r\n return this.showWelcomeImageSubject.asObservable();\r\n }\r\n\r\n\trefreshProfileMenu() {\r\n this.refreshProfileMenuSubject.next();\r\n }\r\n\r\n onRefreshProfileMenu(): Observable {\r\n return this.refreshProfileMenuSubject.asObservable();\r\n }\r\n\r\n openRouteDialog(){\r\n this.openRouteDialogSubject.next(); \r\n }\r\n\r\n onOpenRouteDialog(){\r\n return this.openRouteDialogSubject.asObservable();\r\n }\r\n\r\n allRouteDialogClosed(){\r\n this.allRouteDialogClosedSubject.next();\r\n }\r\n\r\n onAllRouteDialogClosed(){\r\n return this.allRouteDialogClosedSubject.asObservable();\r\n }\r\n\r\n publicProfilePage(){\r\n this.publicProfilePageSubject.next();\r\n }\r\n \r\n onPublicProfilePage(){\r\n return this.publicProfilePageSubject.asObservable();\r\n }\r\n\r\n dialogOpen(message: DialogOpenMessage){\r\n this.dialogOpenSubject.next(message);\r\n } \r\n onDialogOpen() : Observable {\r\n return this.dialogOpenSubject.asObservable();\r\n }\r\n\r\n dialogClose(message: DialogCloseMessage){\r\n this.dialogCloseSubject.next(message);\r\n } \r\n onDialogClose() : Observable {\r\n return this.dialogCloseSubject.asObservable();\r\n }\r\n\r\n sendTerritorialDivisionCountry(message: TerritorialDivionCountryMessage){\r\n this.territorialDivisionCountrySubject.next(message);\r\n }\r\n\r\n onSendTerritorialDivisionCountry():Observable{\r\n return this.territorialDivisionCountrySubject.asObservable();\r\n }\r\n\r\n sendPublicProfileHeaderVisibilityChange(message: PublicProfileHeaderVisibilityChangeMessage){\r\n this.publicProfileHeaderVisibilityChangeSubject.next(message);\r\n }\r\n\r\n onPublicProfileHeaderVisibilityChange():Observable{\r\n return this.publicProfileHeaderVisibilityChangeSubject.asObservable();\r\n }\r\n\r\n sendPublicProfileAction(message: PublicProfileActionMessage){\r\n this.publicProfileActionSubject.next(message);\r\n }\r\n\r\n onPublicProfileAction():Observable{\r\n return this.publicProfileActionSubject.asObservable();\r\n }\r\n\r\n sendReloadFormComponent(idAreaSistema?: number): void {\r\n this.reloadFormComponentSubject.next(idAreaSistema);\r\n }\r\n\r\n onReloadFormComponent():Observable{\r\n return this.reloadFormComponentSubject.asObservable();\r\n }\r\n\r\n sendToggleBottomSheetSubject(args: {action: string, component?: Type}): void {\r\n this.toggleBottomSheetSubject.next(args);\r\n }\r\n\r\n onToggleBottomSheetSubject():Observable<{action: string, component?: Type}>{\r\n return this.toggleBottomSheetSubject.asObservable();\r\n }\r\n}\r\n\r\nexport class ClinicHistoryMessage {\r\n clinicHistory: ClinicHistory;\r\n\r\n constructor(clinicHistory : ClinicHistory) {\r\n this.clinicHistory = clinicHistory;\r\n }\r\n}\r\n\r\nexport class ProfileSearchMessage {\r\n profileType: PublicProfileType;\r\n searchText: string;\r\n conceptNav: string;\r\n territorialDivisionIdentification: string; \r\n doctorSearch: boolean; \r\n conceptId : number;\r\n conceptClaseId : number;\r\n}\r\n\r\nexport class ProfileSearchFilterMessage {\r\n conceptsIds: number[];\r\n}\r\n\r\nexport class AppointmentCancelledMessage {\r\n idEtapaSolicitud: number;\r\n}\r\n\r\nexport class LoadChatMessage {\r\n idEtapaSolicitud: number;\r\n}\r\n\r\nexport class OpenChatMessage { \r\n}\r\n\r\nexport class ChatCancelledMessage {\r\n reason: string;\r\n\r\n constructor(reason : string) {\r\n this.reason = reason;\r\n }\r\n}\r\n\r\nexport class ChatLoadedMessage {\r\n hasAgentMessage: boolean;\r\n\r\n constructor(hasAgentMessage : boolean) {\r\n this.hasAgentMessage = hasAgentMessage;\r\n }\r\n}\r\n\r\nexport class FormConfigurationMessage {\r\n config: FormConfiguration; \r\n}\r\n\r\nexport class ComponentFinishLoadingMessage {\r\n idFormulario: number;\r\n idControl: number;\r\n}\r\n\r\nexport class SessionExpiredMessage { \r\n returnUrl: string;\r\n\r\n constructor(returnUrl: string) {\r\n this.returnUrl = returnUrl;\r\n }\r\n}\r\n\r\nexport class LogoutMessage {\r\n}\r\n\r\nexport class LoginCompletedMessage {\r\n user: UserPerson;\r\n \r\n constructor(user: UserPerson) {\r\n this.user = user;\r\n }\r\n}\r\n\r\nexport class AppointmentMessage {\r\n appointment: AppointmentsByPatient;\r\n \r\n constructor(appointment: AppointmentsByPatient) {\r\n this.appointment = appointment;\r\n }\r\n}\r\n\r\nexport class ServiceErrorMessage {\r\n innerError: any;\r\n message: string;\r\n displayMessage: string;\r\n\r\n constructor(message : string, displayMessage : string = \"\") {\r\n this.message = message;\r\n this.displayMessage = displayMessage;\r\n }\r\n}\r\n\r\nexport class ProviderSearchMessage {\r\n searchText: string;\r\n conceptNav: string;\r\n territorialDivisionIdentification: string;\r\n filtros: string;\r\n conceptId : number;\r\n conceptClaseId : number;\r\n countryIdentification: string;\r\n}\r\n\r\nexport class PageScrollMessage {\r\n direction: Direction;\r\n offset: number;\r\n containerTopPosition: number;\r\n routeDialogScroll: boolean = false;\r\n\r\n constructor(direction: Direction, offset: number, containerTopPosition: number, routeDialogScroll: boolean) {\r\n this.direction = direction;\r\n this.offset = offset;\r\n this.containerTopPosition = containerTopPosition;\r\n this.routeDialogScroll = routeDialogScroll;\r\n }\r\n}\r\n\r\nexport class LocaleChangeMessage {\r\n language: string;\r\n}\r\n\r\nexport class PublicProfileMessage{\r\n publicProfile: PublicProfile;\r\n}\r\n\r\nexport class WorkflowDataMessage{\r\n data: any;\r\n}\r\n\r\nexport class FlowStepCompletedMessage{\r\n state: IWorkflowDataState;\r\n}\r\n\r\nexport class WorkflowStateUpdateMessage{\r\n state: IWorkflowDataState;\r\n}\r\n\r\nexport class ComponentDataSetMessage {\r\n componentName: ComponentName;\r\n data: any;\r\n}\r\n\r\nexport class OpenSnackBarMessage {\r\n text: string;\r\n action: string;\r\n onAction: any;\r\n type: SnackBarType;\r\n duration?: number;\r\n}\r\n\r\nexport class NavigationBackMessage {\r\n dialogId: number;\r\n \r\n constructor(dialogId: number) {\r\n this.dialogId = dialogId\r\n }\r\n}\r\n\r\nexport class CloseRouteDialogMessage { \r\n}\r\n\r\nexport class FloatingComponentsMessage{\r\n componentsData: FormComponentData[] = [];\r\n}\r\n\r\nexport enum SnackBarType{\r\n SUCCESS = 1,\r\n ERROR = 2,\r\n INFO = 3,\r\n ALERT = 4\r\n}\r\n\r\nexport class ControlComponentClassnameMessage{\r\n conponentName: string;\r\n classname: string;\r\n}\r\n\r\nexport class DialogOpenMessage { \r\n dialogName: DialogName;\r\n\r\n constructor(dialogName: DialogName) {\r\n this.dialogName = dialogName;\r\n }\r\n}\r\nexport class DialogCloseMessage { \r\n dialogName: DialogName;\r\n\r\n constructor(dialogName: DialogName) {\r\n this.dialogName = dialogName;\r\n } \r\n}\r\nexport enum DialogName {\r\n UserProfileMenu = 1,\r\n BottomSheetMenu = 'bottomSheetMenu'\r\n}\r\nexport class TerritorialDivionCountryMessage{\r\n country: TerritorialDivision;\r\n}\r\nexport class PublicProfileHeaderVisibilityChangeMessage {\r\n headerVisible: boolean;\r\n profile: PublicProfile;\r\n publicProfileAvatarComponentModel: any;\r\n fromRouteDialog: boolean;\r\n\r\n constructor(headerVisible: boolean, profile: PublicProfile, publicProfileAvatarComponentModel: any, fromRouteDialog: boolean) {\r\n this.headerVisible = headerVisible;\r\n this.profile = profile;\r\n this.publicProfileAvatarComponentModel = publicProfileAvatarComponentModel;\r\n this.fromRouteDialog = fromRouteDialog;\r\n }\r\n}\r\n\r\nexport class PublicProfileActionMessage {\r\n paymentClick: boolean = false;\r\n appointmentClick: boolean = false;\r\n\r\n constructor(paymentClick: boolean, appointmentClick: boolean) {\r\n this.paymentClick = paymentClick;\r\n this.appointmentClick = appointmentClick;\r\n }\r\n}","import { Injectable } from '@angular/core';\nimport { HttpBaseService } from './http-base-service';\nimport { PeopleSupportRequest } from 'src/app/shared/interfaces/people-support-request';\nimport { Observable } from 'rxjs';\nimport { PatientPartial } from 'src/app/shared/interfaces/patient-partial';\nimport { IdentifierPatient } from 'src/app/shared/models/people/identifier-patient.model';\nimport { Relation } from 'src/app/shared/models/people/relation.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PatientService {\n\n private baseUrl = 'api/pacientes';\n\n constructor(private http: HttpBaseService) { }\n\n getPartial(idPaciente: number): Observable {\n return this.http.get(`${this.baseUrl}/partial?idPaciente=${idPaciente}`);\n }\n\n getIdentifierPatient(idPacientePortal: number, idEmpresaPhr: number){\n return this.http.get(`${this.baseUrl}?idPacientePortal=${idPacientePortal}&idEmpresaPhr=${idEmpresaPhr}`, null, false);\n }\n\n getRelations(idPaciente: number){\n return this.http.get(`${this.baseUrl}/${idPaciente}/relaciones`);\n }\n\n postSupport(model: PeopleSupportRequest) {\n const url = `${this.baseUrl}/soporte`;\n return this.http.post(url, model, null, true); \n }\n\n}\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { OnlinePaymentRequest } from 'src/app/shared/models/process/online-payment-request.model';\r\nimport { HttpBaseService } from './http-base-service';\r\nimport { UserPaymentItem } from 'src/app/shared/models/finance/payments/user-payment-item.model';\r\nimport { UserPayment } from 'src/app/shared/models/finance/payments/user-payment.model';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { TempDocument } from 'src/app/shared/models/process/document.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PaymentService {\r\n\r\n constructor(private http: HttpBaseService) { } \r\n\r\n getOnlinePaymentRequest(idVerificacion: string): Observable{\r\n return this.http.get(\"api/pagos/por-verificar/\" + idVerificacion, null, false);\r\n }\r\n\r\n createOnlinePaymentRequest(onlinePaymentRequest: OnlinePaymentRequest): Observable{\r\n return this.http.post(\"api/pagos/por-verificar\", onlinePaymentRequest, null, false);\r\n }\r\n\r\n updateOnlinePaymentRequest(idVerificacion: string, onlinePaymentRequest: OnlinePaymentRequest): Observable{\r\n let url = `api/pagos/por-verificar/${idVerificacion}`;\r\n return this.http.put(url, onlinePaymentRequest);\r\n }\r\n\r\n confirmOnlinePaymentRequest(idVerificacion: string, onlinePaymentRequest: OnlinePaymentRequest): Observable{\r\n let url = `api/pagos/por-verificar/${idVerificacion}/confirmacion`;\r\n return this.http.post(url, onlinePaymentRequest);\r\n }\r\n\r\n getUserPayments(): Observable{\r\n return this.http.get(\"api/pagos/\", null, true);\r\n }\r\n\r\n getUserPayment(transaccionId: number): Observable{\r\n return this.http.get(\"api/pagos/\" + transaccionId, null, true);\r\n } \r\n\r\n getUserPaymentPdf(transaccionId: number): Observable {\r\n let url = \"api/pagos/\" + transaccionId + \"/pdf?language=es\"; \r\n\r\n let headers = new HttpHeaders(); \r\n headers = headers.set('Accept', 'application/pdf');\r\n\r\n return this.http.post(url, null, { headers: headers, responseType: 'blob' as 'json' });\r\n }\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { ProfileDetailModel, PublicProfileDetailType } from 'src/app/shared/models/people/profile-detail.model';\r\nimport { ProfileFilterSearchResult, ProfileFilterSearchResultConcept, ProfileFilterSearchResultGroup } from 'src/app/shared/models/people/profile-filter-search-result.model';\r\nimport { ProfileSearchResultsModel, PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\r\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\r\nimport { SystemDocument } from 'src/app/shared/models/process/document.model';\r\nimport { environment } from 'src/environments/environment';\r\nimport { HttpBaseService } from './http-base-service';\r\nimport { BaseService } from './base.service';\r\nimport { PublicProfileVersion } from 'src/app/shared/models/systems/portal-phr.model';\r\nimport { PublicProfileRouteDialogModel } from 'src/app/shared/components/dialogs/route-dialog/route-dialog.component';\r\nimport { RouteDialogService } from './route-dialog.service';\r\nimport { Router } from '@angular/router';\r\nimport { DirectoryFiltersGroupModel } from 'src/app/shared/components/search-results/provider-filters/provider-filters-content/provider-filters-content.component';\r\nimport { LayoutService } from './layout.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PublicProfileService {\r\n\r\n constructor(\r\n private http: HttpBaseService,\r\n private baseService: BaseService,\r\n private routeDialogService: RouteDialogService,\r\n private router: Router,\r\n private layoutService: LayoutService\r\n ) { } \r\n\r\n searchProfileByText(\r\n seed: string, language: string, searchText: string, filters: string, \r\n accountName: string, page: number, pageSize: number, \r\n country: string, state: string, city: string, profileType: PublicProfileType[], \r\n accountId: number, locationCompaniesIds: string) :Observable { \r\n let types = profileType.join(\",\"); \r\n let useElasticsearchForProfiles = environment.useElasticsearchForProfiles;\r\n let url = useElasticsearchForProfiles\r\n ? `api/perfiles-publicos/esprofiles?seed=${seed}&lenguaje=${language}&texto=${encodeURIComponent(searchText)}&page=${page}&pageSize=${pageSize}&tipoPerfil=${types}` \r\n : `api/perfiles-publicos?seed=${seed}&lenguaje=${language}&texto=${encodeURIComponent(searchText)}&page=${page}&pageSize=${pageSize}&tipoPerfil=${types}`; \r\n\r\n if (filters)\r\n url += `&filters=${filters}`;\r\n if (accountName)\r\n url += `&nombreCuenta=${accountName}`;\r\n if (accountId)\r\n url += `&idCuenta=${accountId}`;\r\n if (locationCompaniesIds)\r\n url += `&idEmpresasLocalidades=${locationCompaniesIds}`;\r\n if (country)\r\n url += `&pais=${country}`;\r\n if (state)\r\n url += `&provincia=${state}`;\r\n if (city)\r\n url += `&ciudad=${city}`;\r\n\r\n return this.http.get(url, null, false);\r\n } \r\n\r\n searchProfileByConcept(\r\n seed: string,\r\n language: string,\r\n conceptNav: string,\r\n filters: string, \r\n accountName: string,\r\n page: number,\r\n pageSize: number,\r\n country: string,\r\n state: string,\r\n city: string,\r\n profileType: PublicProfileType[],\r\n accountId: number, locationCompaniesIds: string, conceptId: number, conceptClassId: number\r\n ) :Observable {\r\n let types = profileType.join(\",\");\r\n let useElasticsearchForProfiles = environment.useElasticsearchForProfiles;\r\n let url = useElasticsearchForProfiles\r\n ? `api/perfiles-publicos/esprofiles${conceptNav}?seed=${seed}&lenguaje=${language}&page=${page}&pageSize=${pageSize}&tipoPerfil=${types}`\r\n : `api/perfiles-publicos${conceptNav}?seed=${seed}&lenguaje=${language}&page=${page}&pageSize=${pageSize}&tipoPerfil=${types}`;\r\n\r\n if (filters)\r\n url += `&filters=${filters}`;\r\n if (accountName)\r\n url += `&nombreCuenta=${accountName}`;\r\n if (country)\r\n url += `&pais=${country}`;\r\n if (state)\r\n url += `&provincia=${state}`;\r\n if (city)\r\n url += `&ciudad=${city}`;\r\n if (accountId)\r\n url += `&idCuenta=${accountId}`;\r\n if (locationCompaniesIds)\r\n url += `&idEmpresasLocalidades=${locationCompaniesIds}`;\r\n if (conceptId)\r\n url += `&idConcepto=${conceptId}`;\r\n if (conceptClassId)\r\n url += `&idClaseConcepto=${conceptClassId}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getPublicProfile(nickname:string, language: string, accountName: string): Observable{\r\n let url = `api/perfiles-publicos/${nickname}?lenguaje=${language}&nombreCuenta=${accountName}`;\r\n return this.http.get(url, null, false);\r\n }\r\n \r\n getProfileDetails(profileId: number, profileDetailType: PublicProfileDetailType) {\r\n let url = \"api/perfiles-publicos/\" + profileId + \"/detalles?tipoDetalle=\" + profileDetailType;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getPublicProfileFilters(language:string, \r\n tipoConcepto:string, \r\n searchText: string, \r\n concepto: string, \r\n filters: string, \r\n accountName:string, \r\n pais: string,\r\n provincia: string,\r\n ciudad:string, \r\n idTipoConceptoClinico: number, \r\n idTipoPerfilPublico: PublicProfileType[],\r\n accountId: number, locationCompaniesIds: string, conceptId: number, conceptClassId: number): Observable { \r\n let type = idTipoPerfilPublico? idTipoPerfilPublico.join(\",\") : \"\";\r\n let useElasticsearchForProfiles = environment.useElasticsearchForProfiles;\r\n let url = useElasticsearchForProfiles \r\n ? \"api/perfiles-publicos/esprofiles/filtros?language=\" + language\r\n : \"api/perfiles-publicos/filtros?language=\" + language;\r\n\r\n if (tipoConcepto)\r\n url += \"&tipoConcepto=\" + tipoConcepto;\r\n if (concepto)\r\n url += \"&concepto=\" + concepto;\r\n if (searchText)\r\n url += \"&searchText=\" + encodeURIComponent(searchText);\r\n if (filters)\r\n url += \"&filters=\" + filters;\r\n if (accountName)\r\n url += \"&accountName=\" + accountName;\r\n if (pais)\r\n url += \"&pais=\" + pais;\r\n if (provincia)\r\n url += \"&provincia=\" + provincia;\r\n if (ciudad)\r\n url += \"&ciudad=\" + ciudad;\r\n if (idTipoConceptoClinico)\r\n url += \"&idTipoConceptoClinico=\" + idTipoConceptoClinico;\r\n if (type)\r\n url += \"&idTipoPerfilPublico=\" + idTipoPerfilPublico;\r\n if (accountId)\r\n url += `&idCuenta=${accountId}`;\r\n if (locationCompaniesIds)\r\n url += `&idEmpresasLocalidades=${locationCompaniesIds}`;\r\n if (conceptId)\r\n url += `&idConcepto=${conceptId}`;\r\n if (conceptClassId)\r\n url += `&idClaseConcepto=${conceptClassId}`;\r\n if (idTipoConceptoClinico)\r\n url += \"&idClaseConceptoFiltro=\" + idTipoConceptoClinico; \r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getProfileDetailsDocuments(profileId: number, profileDetailType: PublicProfileDetailType) {\r\n let url = \"api/perfiles-publicos/\" + profileId + \"/detalles/documentos?tipoDetalle=\" + profileDetailType;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getProfileDetailsDocument(profileId: number, profileDetailType: PublicProfileDetailType, documentId: number) {\r\n let url = \"api/perfiles-publicos/\" + profileId + \"/detalles/documento/\" + documentId + \"?tipoDetalle=\" + profileDetailType;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getPublicProfileUrl(nickName: string) {\r\n let publicProfileVersion = this.baseService.getPublicProfileVersion();\r\n let url = publicProfileVersion != PublicProfileVersion.V1 ? \"perfil\" : \"perfil-v1\";\r\n\r\n if (nickName.indexOf(\"/\") >= 0)\r\n url += nickName;\r\n else\r\n url += (\"/\" + nickName);\r\n\r\n return url;\r\n }\r\n \r\n openPublicProfile(url: string){\r\n let publicProfileVersion = this.baseService.getPublicProfileVersion();\r\n\r\n if(publicProfileVersion == PublicProfileVersion.V1){\r\n this.router.navigateByUrl(url);\r\n }\r\n else{\r\n let routeDialogModel = new PublicProfileRouteDialogModel();\r\n\r\n routeDialogModel.route = url;\r\n \r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n }\r\n\r\n getPublicProfileById(personId: number, language: string, accountName: string) {\r\n let url = `api/perfiles-publicos?idPersona=${personId}&lenguaje=${language}&nombreCuenta=${accountName}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getPublicProfileByIds(personIds: number[]) {\r\n const arrayIds = [... new Set(personIds)];\r\n const url = `api/perfiles-publicos/${arrayIds}`;\r\n\r\n return this.http.get<(PublicProfile | null)[]>(url, null, false);\r\n }\r\n\r\n groupProfileFilters(filteredConcepts: ProfileFilterSearchResultConcept[], groupsDef: DirectoryFiltersGroupModel[], language: string) : ProfileFilterSearchResultGroup[] { \r\n let groups: ProfileFilterSearchResultGroup[] = [];\r\n\r\n if (groupsDef) {\r\n groups = groupsDef.map(g => {\r\n let group = new ProfileFilterSearchResultGroup();\r\n \r\n group.idsConceptosClinicos = g.idsConceptosClinicos;\r\n group.results = [];\r\n \r\n if (g.tituloGrupo)\r\n group.titulo = this.layoutService.getTextByLanguage(g.tituloGrupo, language);\r\n \r\n if (g.tooltip)\r\n group.tooltip = this.layoutService.getTextByLanguage(g.tooltip, language);\r\n \r\n return group;\r\n });\r\n }\r\n\r\n // If there is not group on the configuration, let just create the default one\r\n if (groups.length == 0) {\r\n let defaultGroup = new ProfileFilterSearchResultGroup();\r\n defaultGroup.idsConceptosClinicos = [-1];\r\n defaultGroup.results = filteredConcepts;\r\n\r\n groups.push(defaultGroup);\r\n }\r\n else {\r\n // Add the concept in the first matching group.\r\n // If no maching group is found add it to the default one\r\n filteredConcepts.forEach(concept => {\r\n for(let group of groups) {\r\n if (group.idsConceptosClinicos.indexOf(concept.cc) > -1) {\r\n group.results.push(concept);\r\n break;\r\n } \r\n else if (group.idsConceptosClinicos.length == 1 && group.idsConceptosClinicos[0] == -1) {\r\n group.results.push(concept);\r\n } \r\n }\r\n });\r\n }\r\n\r\n return groups;\r\n }\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\nimport { HttpBaseService } from './http-base-service';\nimport { Observable } from 'rxjs';\nimport { PatientVerificationResponse } from 'src/app/shared/interfaces/patient-verification-response';\nimport { BaseService } from './base.service';\nimport { RequestToVerifySummary } from 'src/app/shared/interfaces/request-to-verify-summary';\nimport { RequestToVerifyUpdateModel } from 'src/app/shared/models/systems/resquest-to-verify-update.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RequestsToVerifyService {\n\n private baseUrl = 'api/solicitudes-x-verificar';\n\n constructor(private http: HttpBaseService, private baseService: BaseService) { }\n\n confirmation(idVerificacion: string): Observable {\n const url = `${this.baseUrl}/${idVerificacion}/confirmacion`;\n return this.http.post(url, null, null, true);\n }\n\n validate(fechaNacimiento: string, idVerificacion: string): Observable {\n const url = `${this.baseUrl}/${idVerificacion}/validacion-paciente`;\n return this.http.post(url, { fechaNacimiento }, null, false);\n }\n\n getSummaryData(idVerificacion: string): Observable {\n const url = `${this.baseUrl}/id-verificacion/${idVerificacion}/resumen?idEmpresa=${this.baseService.getCompanyId()}`;\n return this.http.get(url, null, false);\n }\n\n update(idVerificacion: string, model: RequestToVerifyUpdateModel): Observable{\n const url = `${this.baseUrl}/${idVerificacion}/actualizacion-solicitud-consulta`;\n return this.http.put(url, model, null, true);\n }\n}\n\nexport interface RequestsToVerifyConfirmationResponse {\n idPaciente: number, idRelacionPaciente: number\n}\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { ActivatedRoute, NavigationExtras, Router, Routes } from '@angular/router';\nimport { RouteDialogComponent, RouteDialogModel, RouteDialogType } from 'src/app/shared/components/dialogs/route-dialog/route-dialog.component';\nimport { CloseRouteDialogMessage, MessageBusService } from './message-bus.service';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RouteDialogService {\n\n private dialogs:MatDialogRef[] = [];\n\n isBrowser: boolean;\n\n constructor(\n private router: Router,\n private messageBusService: MessageBusService,\n private dialog: MatDialog,\n @Inject(DOCUMENT) private document: Document,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n openDialog(model: RouteDialogModel){\n\n if(!this.isBrowser)\n return;\n\n // this.checkRouteConfig(model);\n\n this.document.body.classList.add('route-dialog-opened');\n\n let currentRoute = window.location.pathname + window.location.search;\n\n let dialogRef = this.dialog.open(RouteDialogComponent, {\n data:model,\n panelClass: ['route-dialog-modal', model.className, model.animationIn, model.backgroundClassName],\n id: model.id.toString(),\n disableClose: model.disableClose\n }); \n\n dialogRef.beforeClosed().subscribe(x=>{ \n dialogRef.componentInstance.onCloseClick(true); \n });\n\n dialogRef.afterClosed().subscribe(x=>{\n this.router.navigateByUrl(currentRoute); \n });\n\n this.dialogs.push(dialogRef);\n\n this.messageBusService.openRouteDialog();\n }\n\n closeDialog(type:RouteDialogType){\n\n let dialogRef = this.dialogs.find(d=> d.id == type.toString());\n\n if(dialogRef){\n let comp = dialogRef.componentInstance as RouteDialogComponent;\n\n comp.onCloseClick();\n\n this.dialogs = this.dialogs.filter(d => d.id != type.toString());\n }\n\n if(this.dialogs.length == 0){\n this.messageBusService.allRouteDialogClosed();\n }\n }\n\n isOpen(type:RouteDialogType){\n\n let dialogRef = this.dialog.getDialogById(type.toString());\n\n return dialogRef ? true : false;\n }\n\n closeDialogsAndNavigate(url: string, params: NavigationExtras | null = null){\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\n\n if (!params)\n this.router.navigate([url]);\n else \n this.router.navigate([url], params);\n\n if(this.isBrowser){\n setTimeout(()=>{\n window.location.reload();\n }, 200); \n } \n }\n\n anyOpen(): boolean{\n return this.dialogs.length > 0;\n }\n\n checkRouteConfig(model: RouteDialogModel){\n if(this.router.config.filter(r => r.outlet == model.id.toString()).length == 0){\n\n\n const route = this.router.config.find(r => r.path && model.route.includes(r.path));\n\n if(route)\n route.outlet = '3';\n\n // const routesForDialogType = this.duplicateRoutes(this.router.config, model.id.toString());\n\n // this.router.config.unshift(...routesForDialogType);\n\n this.router.resetConfig(this.router.config);\n }\n }\n\n duplicateRoutes(routes:Routes, outlet: string){\n\n return routes.map(route => {\n const duplicatedRoute = { ...route };\n if (route.children) {\n duplicatedRoute.children = this.duplicateRoutes(route.children, outlet);\n }\n duplicatedRoute.outlet = outlet;\n return duplicatedRoute;\n });\n }\n\n removeRouteDialogClassnameToBody(){\n this.document.body.classList.remove('route-dialog-opened');\n }\n}\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { ChatConversacionMessageEvent } from 'src/app/shared/models/signalr/chat-conversation-message-event.model';\r\nimport { UserActiveEvent } from 'src/app/shared/models/signalr/user-active-event.model';\r\nimport { VirtualAttentionEvent } from 'src/app/shared/models/signalr/virtual-attention-event.model';\r\nimport { AppStorageService } from '../app-storage.service';\r\nimport { BaseService } from '../base.service';\r\nimport { SignalrService } from './signalr.service';\r\n\r\n/*\r\nIt is important for this Service to NOT be a Singleton (avoid adding \"providedIn: 'root'\")\r\nin order to work properly. If not all the event related to connection and re-connection get mixed between all the clients that use the service\r\nIn order to use the service on an component add it to the providers of the component like: \"providers: [ChatSignalRService]\"\"\r\n*/\r\n@Injectable()\r\nexport class ChatSignalRService extends SignalrService {\r\n\r\n protected newChatMessageSubject = new Subject();\r\n protected virtualAttentionChangedSubject = new Subject();\r\n protected userActiveSubject = new Subject();\r\n\r\n constructor(protected baseService: BaseService, protected appStorageService: AppStorageService, @Inject(PLATFORM_ID) protected platformId: Object) { \r\n super(baseService, appStorageService, platformId);\r\n \r\n this.hubName = \"CliniwebHub\";\r\n } \r\n\r\n registerOnServerEvents(): void { \r\n\r\n // Virtual consultation state changed\r\n this.proxy.on('virtualRequestStateChanged', (data: VirtualAttentionEvent) => { \r\n \r\n console.log(\"ChatSignalRService -> VirtualAttention changed ->\");\r\n console.log(data); \r\n \r\n this.virtualAttentionChangedSubject.next(data);\r\n });\r\n\r\n // New Message received\r\n this.proxy.on('ChatMessageReceived', (data: ChatConversacionMessageEvent) => { \r\n \r\n console.log(\"ChatSignalRService -> New Message ->\");\r\n console.log(data); \r\n \r\n this.newChatMessageSubject.next(data);\r\n });\r\n \r\n // User Active\r\n this.proxy.on('UserActive', (data: UserActiveEvent) => { \r\n \r\n //console.log(\"ChatSignalRService -> User Active ->\");\r\n //console.log(data);\r\n\r\n //let obj = this.baseService.parseObjectDeep(JSON.parse(data));\r\n \r\n this.userActiveSubject.next(data);\r\n });\r\n }\r\n \r\n onNewMessageReceived() : Observable {\r\n return this.newChatMessageSubject.asObservable();\r\n }\r\n\r\n onVirtualAttentionChanged() : Observable {\r\n return this.virtualAttentionChangedSubject.asObservable();\r\n }\r\n\r\n onUserActive() : Observable {\r\n return this.userActiveSubject.asObservable();\r\n }\r\n\r\n public userActive(groupId: number, userId: number, etapaSolicitudId: number) {\r\n var model = {\r\n userId: userId,\r\n etapaSolicitudId: etapaSolicitudId,\r\n action: \"chat_user_active\",\r\n eventUnixDate: new Date().getTime()\r\n };\r\n\r\n this.proxy.invoke('UserActive', groupId, JSON.stringify(model)).catch((error: any) => {\r\n console.log('UserActive error -> ' + error); \r\n });\r\n }\r\n}\r\n\r\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { environment } from 'src/environments/environment';\nimport { AppStorageService } from '../app-storage.service';\nimport { BaseService } from '../base.service';\nimport { isPlatformBrowser } from '@angular/common';\ndeclare var $: any;\n\n/*\nIt is important for this Service to NOT be a Singleton (avoid adding \"providedIn: 'root'\")\nin order to work properly. If not all the event related to connection and re-connection get mixed between all the clients that use the service\n*/\n@Injectable() \nexport abstract class SignalrService { \n protected url: any = environment.cloudHubUrl;\n protected hubName : string;\n protected connection: any;\n protected proxy: any; \n protected connectionLostRetryTimeInSeconds : number = 2;\n protected waitingConnectionLostRetry = false; \n protected connectionEstablishedSubject = new Subject();\n protected connectionLostSubject = new Subject(); \n private isBrowser: boolean;\n \n constructor(\n protected baseService: BaseService,\n protected appStorageService: AppStorageService,\n @Inject(PLATFORM_ID) protected platformId: Object) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n } \n\n public init() {\n\n if (this.isBrowser) {\n \n // Create proxy\n this.createConnection();\n \n // Call proper registration methods (this will be implemented in each particular service)\n this.registerOnServerEvents();\n\n // Stablish connection\n this.connect();\n }\n }\n\n public createConnection(): void { \n this.connection = $.hubConnection(this.url);\n this.proxy = this.connection.createHubProxy(this.hubName);\n\n this.connection.disconnected(() => {\n this.handleConnectionLost();\n }); \n }\n\n protected getAuthorizationToken() {\n let token = this.appStorageService.getToken();\n\n return !!token ? token.access_token : '';\n }\n\n public connect(): void { \n let token = this.getAuthorizationToken();\n\n // Set authorization token\n this.connection.qs = { 'authorization': token };\n\n // Connection expired after 7 min, so lets send a ping every 5 min to keep connection active\n let pingTime = 5 * 60 * 1000;\n\n this.connection.start({ \n pingInterval: 5 * 60 * 1000 \n }).done((data: any) => {\n console.log('Connected to Processing Hub');\n this.connectionLostRetryTimeInSeconds = 2; \n this.connectionEstablishedSubject.next(); \n })\n .catch((error: any) => {\n console.log('Hub error -> ' + error);\n });\n }\n\n protected handleConnectionLost() {\n if (this.waitingConnectionLostRetry)\n return;\n\n // Skip the first re-connection intent\n if (this.connectionLostRetryTimeInSeconds > 2)\n this.connectionLostSubject.next();\n\n this.waitingConnectionLostRetry = true;\n\n console.log(\"SignalR Connection Lost. Waiting to reconnect: \" + this.connectionLostRetryTimeInSeconds + \" seconds\");\n\n setTimeout(() => {\n this.connectionLostRetryTimeInSeconds = this.connectionLostRetryTimeInSeconds * 2;\n this.waitingConnectionLostRetry = false;\n\n // Re-connect\n this.connect();\n }, this.connectionLostRetryTimeInSeconds * 1000);\n }\n\n public joinGroup(groupId: number): void {\n this.proxy.invoke('JoinGroup', groupId)\n .catch((error: any) => {\n console.log('JoinGroup error -> ' + error); \n });\n }\n\n abstract registerOnServerEvents(): void;\n\n onConnectionStablished() : Observable {\n return this.connectionEstablishedSubject.asObservable();\n }\n\n onConnectionLost() : Observable {\n return this.connectionLostSubject.asObservable();\n }\n}\n\n","import { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { CountryModel, TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\r\nimport { HttpBaseService } from './http-base-service';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, map, switchMap } from 'rxjs/operators';\r\nimport { AppStorageService, STORAGE } from './app-storage.service';\r\nimport { BaseService } from './base.service';\r\nimport { MessageBusService, TerritorialDivionCountryMessage } from './message-bus.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TerritorialDivisionsService {\r\n\r\n constructor(\r\n private httpClient: HttpClient,\r\n private http: HttpBaseService,\r\n private baseService: BaseService,\r\n private messageBusService: MessageBusService,\r\n private appStorageService: AppStorageService\r\n ) { } \r\n \r\n getByLevels(language: string, searchText: string, levels: string, countryId: number = -1):Observable {\r\n let url = `api/divisiones-territoriales?localizacion=${language}&texto=${encodeURIComponent(searchText)}&niveles=${levels}&codigoPais=${countryId}`;\r\n\r\n return this.http.get(url, null, false); \r\n }\r\n\r\n getBySwiftCode(language: string, swift:string):Observable{\r\n let url = `api/divisiones-territoriales/swift/${swift}?localizacion=${language}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getByIp(language: string, ip:string):Observable{\r\n let url = `api/divisiones-territoriales/ip/${ip}?localizacion=${language}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getByCountryId(language: string, countryId:number){\r\n let url = `api/divisiones-territoriales/pais/${countryId}?localizacion=${language}`;\r\n\r\n return this.http.get(url, null, false);\r\n }\r\n\r\n getCountryByIp(): Observable{\r\n return this.getIp().pipe(switchMap((ip:string)=>{ \r\n let countryObject = this.appStorageService.getItem(STORAGE.COUNTRY, true);\r\n\r\n if(countryObject && (countryObject.ip && countryObject.ip == ip || countryObject.territorialDivision)){\r\n return of(countryObject);\r\n }\r\n\r\n const language = this.baseService.getLanguage();\r\n\r\n return this.getByIp(language, ip)\r\n .pipe(map((t:TerritorialDivision)=>{\r\n countryObject = new CountryModel();\r\n countryObject.ip = ip;\r\n countryObject.territorialDivision = t;\r\n\r\n this.appStorageService.setItem(STORAGE.COUNTRY, countryObject, true);\r\n\r\n return countryObject; \r\n }),\r\n catchError(err => {\r\n console.log(\"get territorial division by ip error: \" + err);\r\n \r\n throw err;\r\n }));\r\n }));\r\n }\r\n\r\n setCountryApp(countryId: number){\r\n this.getCountryApp().subscribe(countryApp=>{\r\n\r\n let country = this.getAvailableCountries().find(c=>c.idPais == countryId);\r\n\r\n if(!country)\r\n return;\r\n \r\n countryApp.territorialDivision = country;\r\n \r\n this.appStorageService.setItem(STORAGE.COUNTRY, countryApp, true); \r\n \r\n let msg = new TerritorialDivionCountryMessage();\r\n msg.country = country;\r\n \r\n this.messageBusService.sendTerritorialDivisionCountry(msg);\r\n });\r\n }\r\n\r\n getCountryApp():Observable{\r\n let country = this.appStorageService.getItem(STORAGE.COUNTRY, true);\r\n\r\n if(country){\r\n return of(country);\r\n }\r\n else{\r\n return this.getCountryByIp();\r\n }\r\n }\r\n\r\n getAvailableCountries(): TerritorialDivision[]{\r\n\r\n let countries: TerritorialDivision[] = [];\r\n \r\n let panama = new TerritorialDivision();\r\n panama.id = 19;\r\n panama.nombre = \"PanamĆ”\";\r\n panama.nombreI18n = [{lenguaje: 'es', texto: 'PanamĆ”'}, {lenguaje: 'en', texto: 'PanamĆ”'}];\r\n panama.nombreCanonico = \"PanamĆ”\";\r\n panama.nivel = 1;\r\n panama.identificador = \"panama\";\r\n panama.paisISO = \"PA\";\r\n panama.idPais = 28;\r\n\r\n countries.push(panama);\r\n\r\n let ecuador = new TerritorialDivision();\r\n ecuador.id = 4;\r\n ecuador.nombre = \"Ecuador\";\r\n ecuador.nombreI18n = [{lenguaje: 'es', texto: 'Ecuador'}, {lenguaje: 'en', texto: 'Ecuador'}];\r\n ecuador.nombreCanonico = \"Ecuador\";\r\n ecuador.nivel = 1;\r\n ecuador.identificador = \"ecuador\";\r\n ecuador.paisISO = \"EC\";\r\n ecuador.idPais = 13;\r\n\r\n countries.push(ecuador);\r\n\r\n let costaRica = new TerritorialDivision();\r\n costaRica.id = 14;\r\n costaRica.nombre = \"Costa Rica\";\r\n costaRica.nombreI18n = [{lenguaje: 'es', texto: 'Costa Rica'}, {lenguaje: 'en', texto: 'Costa Rica'}];\r\n costaRica.nombreCanonico = \"Costa Rica\";\r\n costaRica.nivel = 1;\r\n costaRica.identificador = \"costa-rica\";\r\n costaRica.paisISO = \"CR\";\r\n costaRica.idPais = 23;\r\n\r\n countries.push(costaRica);\r\n\r\n let honduras = new TerritorialDivision();\r\n honduras.id = 16;\r\n honduras.nombre = \"Honduras\";\r\n honduras.nombreI18n = [{lenguaje: 'es', texto: 'Honduras'}, {lenguaje: 'en', texto: 'Honduras'}];\r\n honduras.nombreCanonico = \"Honduras\";\r\n honduras.nivel = 1;\r\n honduras.identificador = \"honduras\";\r\n honduras.paisISO = \"HN\";\r\n honduras.idPais = 25;\r\n\r\n countries.push(honduras);\r\n\r\n let republicaDominicana = new TerritorialDivision();\r\n republicaDominicana.id = 29;\r\n republicaDominicana.nombre = \"RepĆŗblica Dominicana\";\r\n republicaDominicana.nombreI18n = [{lenguaje: 'es', texto: 'RepĆŗblica Dominicana'}, {lenguaje: 'en', texto: 'Dominican Republic'}];\r\n republicaDominicana.nombreCanonico = \"RepĆŗblica Dominicana\";\r\n republicaDominicana.nivel = 1;\r\n republicaDominicana.identificador = \"republica-dominicana\";\r\n republicaDominicana.paisISO = \"DO\";\r\n republicaDominicana.idPais = 38;\r\n\r\n countries.push(republicaDominicana);\r\n\r\n let otros = new TerritorialDivision();\r\n otros.id = 6213;\r\n otros.nombre = \"Otros\";\r\n otros.nombreI18n = [{lenguaje: 'es', texto: 'Otros'}, {lenguaje: 'en', texto: 'Others'}];\r\n otros.nombreCanonico = \"Otros\";\r\n otros.nivel = 1;\r\n otros.identificador = \"otros\";\r\n otros.paisISO = \"1\";\r\n otros.idPais = 1;\r\n\r\n countries.push(otros);\r\n\r\n return countries;\r\n }\r\n\r\n private getIp():Observable{\r\n return this.httpClient.post(\"https://ip.aspsoluciones.com/ServiciosIP.asmx/IP\", {})\r\n .pipe(map((ipObject:any)=>{\r\n return ipObject.d;\r\n }),\r\n catchError(err => {\r\n console.log(\"getIp error: \" + err);\r\n\r\n throw err;\r\n }));\r\n }\r\n}","import { Inject, Injectable, Renderer2, RendererFactory2 } from \"@angular/core\";\r\nimport { Theme, THEMES } from \"src/themes/theme\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeColorService {\r\n private _directoryClass= 'cliniweb';\r\n private renderer: Renderer2;\r\n private _color = ''\r\n\r\n constructor(@Inject(THEMES) private themes: Theme[], private rendererFactory: RendererFactory2) {\r\n this.renderer = this.rendererFactory.createRenderer(null, null);\r\n }\r\n\r\n get theme() { return this.themes.find(t => t.name == this._directoryClass); }\r\n set directoryClass(args: string) { this._directoryClass = args; }\r\n\r\n setThemeColor(args: string = '', save = false): void {\r\n const metaThemeColor = document.querySelector(`meta[name=\"theme-color\"]`);\r\n const color = this._color || args || this.theme?.properties['--primary'];\r\n if (metaThemeColor) {\r\n this.renderer.setAttribute(metaThemeColor, 'content', color);\r\n }\r\n if (save) {\r\n this._color = color;\r\n }\r\n }\r\n}","import { Inject, Injectable } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { Observable, Subject, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { LoginResponse } from 'src/app/shared/models/login-response.model';\nimport { PersonIdentification } from 'src/app/shared/models/people/person-identification.model';\nimport { Policy } from 'src/app/shared/models/people/policy.model';\nimport { UpdateUser, UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport { User } from 'src/app/shared/models/people/user.model';\nimport { Token } from 'src/app/shared/models/token.model';\nimport { AppStorageService, STORAGE } from './app-storage.service';\nimport { AuthOidcService } from './auth-oidc.service';\nimport { BaseService } from './base.service';\nimport { HttpBaseService } from './http-base-service';\nimport { MessageBusService } from './message-bus.service';\nimport { ResetPasswordModel } from 'src/app/shared/models/people/reset-password.model';\nimport { Dependent, DependentRelationshipType, DependentRequest } from 'src/app/shared/models/people/dependent.model';\nimport { RegisterUnverifedUser, RegisterUser } from 'src/app/shared/models/people/register-user.model';\nimport { UpdatePasswordRequestModel } from 'src/app/shared/models/people/update-password-request.model';\nimport { FileUploadRequest } from 'src/app/shared/interfaces/file-upload-request';\nimport { AvatarUploadModel, AvatarUploadedFileModel } from 'src/app/shared/components/avatar-upload/avatar-upload.component';\nimport { UserExistsResponseModel } from 'src/app/shared/models/people/user-exists-response.model';\nimport { TerritorialDivisionsService } from './territorial-divisions.service';\nimport { CountryModel, TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\nimport { UnverifiedRequest } from 'src/app/shared/models/systems/unverified-request.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UserService {\n\n dependentRelationshipTranslations = {\n other: \"\",\n son: \"\",\n daughter: \"\",\n father: \"\",\n mother: \"\",\n language: \"\",\n man: \"\",\n women: \"\",\n relative: \"\", \n husband: \"\",\n wife: \"\", \n brother: \"\",\n sister: \"\",\n grandfather: \"\",\n grandmother: \"\",\n manWarded: \"\",\n womanWarded: \"\",\n };\n\n constructor(\n private http: HttpBaseService,\n private appStorageService: AppStorageService,\n private authOidcService: AuthOidcService,\n private baseService: BaseService,\n private messageBusService: MessageBusService,\n private translation: L10nTranslationService,\n private territorialDivisionService: TerritorialDivisionsService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n ) { \n this.setConfigTranslation();\n }\n\n private setConfigTranslation(){\n this.translation.onChange().subscribe({\n next: (locale: L10nLocale) => {\n this.dependentRelationshipTranslations.other = this.translation.translate('other');\n this.dependentRelationshipTranslations.son = this.translation.translate('son');\n this.dependentRelationshipTranslations.daughter = this.translation.translate('daughter');\n this.dependentRelationshipTranslations.father = this.translation.translate('father');\n this.dependentRelationshipTranslations.mother = this.translation.translate('mother');\n this.dependentRelationshipTranslations.man = this.translation.translate('man');\n this.dependentRelationshipTranslations.women = this.translation.translate('women');\n this.dependentRelationshipTranslations.relative = this.translation.translate('relative');\n this.dependentRelationshipTranslations.husband = this.translation.translate('husband');\n this.dependentRelationshipTranslations.wife = this.translation.translate('wife');\n this.dependentRelationshipTranslations.brother = this.translation.translate('brother');\n this.dependentRelationshipTranslations.sister = this.translation.translate('sister');\n this.dependentRelationshipTranslations.grandfather = this.translation.translate('grandfather');\n this.dependentRelationshipTranslations.grandmother = this.translation.translate('grandmother');\n this.dependentRelationshipTranslations.manWarded = this.translation.translate('manWarded');\n this.dependentRelationshipTranslations.womanWarded = this.translation.translate('womanWarded');\n }\n });\n this.translation.onError().subscribe({\n next: (error: any) => {\n if (error) console.log(error);\n }\n });\n }\n\n getUserPerson(username: string): Observable {\n let url = \"api/usuarios/persona/\" + username;\n\n return this.http.get(url);\n }\n\n getUserIdentification(identificationType: number): Observable {\n let url = \"api/usuarios/identificaciones?tipo=\" + identificationType;\n\n return this.http.get(url);\n }\n \n getUserIdentificationNumber() : Observable {\n return this.getUserIdentification(15); // Cedula\n }\n\n getPolicies(policyType: number) : Observable {\n let policies = this.appStorageService.getItem(STORAGE.POLICIES, true);\n\n if (policies)\n return of(policies);\n\n return this.getUserIdentification(policyType).pipe(map(identifications => {\n let policies = [];\n \n for (let index = 0; index < identifications.length; index++) {\n const identification = identifications[index];\n \n // Only return policies that are not cancelled\n if (identification.idEstado != 7) {\n let policy = this.baseService.parseObjectDeep(JSON.parse(identification.json))\n\n policies.push(policy);\n } \n }\n\n this.appStorageService.setItem(STORAGE.POLICIES, policies, true);\n\n if (policies.length == 0) {\n this.baseService.handleServiceError(null, \"Error getting user policies\", this.translation.translate(\"policyMenu.text7\")); \n }\n\n return policies;\n }));\n }\n\n getUserDependents(): Observable {\n let url = \"api/usuarios/dependientes/\";\n\n return this.http.get(url);\n }\n\n getUserIdLoggedIn(): Observable{\n let _userPerson = this.appStorageService.getItemSession(STORAGE.USER, true);\n\n if(_userPerson == null){\n return this.getUserPersonLoggedInFromService()\n .pipe(map((userPerson: UserPerson | null)=>{ \n return userPerson ? userPerson.id : 0;\n }));\n }\n else{\n return of(_userPerson.id);\n }\n }\n\n getUsernameLoggedIn(): string{\n let token = this.appStorageService.getToken();\n\n if(token && !this.http.isTokenExpired(token)){\n return token.username;\n }\n else{\n return \"\";\n }\n }\n\n getUserPersonLoggedIn(): Observable {\n let _userPerson = this.appStorageService.getItemSession(STORAGE.USER, true);\n\n if(_userPerson == null){\n return this.getUserPersonLoggedInFromService();\n }\n\n return of(_userPerson);\n }\n \n getUserPersonLoggedInFromService(): Observable {\n const token = this.appStorageService.getToken();\n\n if(token == null || this.http.isTokenExpired(token))\n return of(null);\n\n return this.getUserPerson(token.username).pipe(\n map((userPerson:UserPerson) =>{\n this.updateUserLoggedIn(userPerson);\n return userPerson;\n })\n );\n }\n\n updateUserLoggedIn(user: UserPerson) {\n this.appStorageService.setItemSession(STORAGE.USER, user, true);\n\n return;\n }\n\n processRequestUserId(){\n let token = this.appStorageService.getToken();\n\n if(token && !this.http.isTokenExpired(token)){\n let userPerson = this.appStorageService.getItemSession(STORAGE.USER, true);\n\n if(userPerson == null){\n this.getUserPerson(token.username).subscribe(userPerson => {\n this.appStorageService.setItemSession(STORAGE.USER, userPerson, true);\n\n this.sendUserId(userPerson.id);\n });\n }\n else{\n this.sendUserId(userPerson.id);\n }\n }\n else if(this.authOidcService.existsManager()){\n this.authOidcService.startAuthenticationPopup().subscribe(token => {\n if(!token.isInvalid) {\n this.appStorageService.setToken(token);\n\n this.getUserPerson(token.username).subscribe(userPerson =>{\n this.appStorageService.setItemSession(STORAGE.USER, userPerson, true);\n \n this.sendUserId(userPerson.id);\n });\n }\n });\n }\n else {\n\n }\n }\n\n public sendUserId(id:number){\n this.messageBusService.sendUserId(id);\n }\n\n public postUserActive(idEmpresaDestino:number, idEtapaSolicitud: number){\n let url = \"api/usuarios/activo?idEmpresaDestino=\" + idEmpresaDestino + \"&idEtapaSolicitud=\" + idEtapaSolicitud;\n\n return this.http.post(url, null);\n }\n\n public postUserRegister(username: string, password: string): Observable{\n return this.baseService.getDirectoryDomain()\n .pipe(switchMap((domain:string)=>{\n let url = \"api/usuarios/registro?domain=\" + domain;\n\n let model = {\n Username: username,\n Password: password,\n IdEmpresa: this.baseService.getCompanyId() \n };\n \n return this.http.post(url, model, null, false);\n }));\n }\n\n public requestUserRegistration(registerUser: RegisterUser): Observable{\n let url = \"api/solicitudes-x-verificar/users\";\n\n return this.http.post(url, registerUser, null, false);\n }\n\n public postConfirmation(idVerificacion:string):Observable{\n return this.baseService.getDirectoryDomain()\n .pipe(switchMap((domain:string)=>{\n let url = `api/usuarios/confirmacion/${idVerificacion}?domain=${domain}`;\n\n return this.http.post(url, null, null, false)\n .pipe(\n map((token) => {\n this.appStorageService.setToken(token);\n \n let response = new LoginResponse();\n response.success = true;\n return response;\n }),\n catchError((err) => {\n let response = new LoginResponse();\n response.success = false;\n response.message = \"Hubo un error al intentar confirmar el usuario\";\n \n return of(response);\n }));\n }));\n }\n\n public postResetPassword(model:ResetPasswordModel):Observable{\n return this.baseService.getDirectoryDomain().pipe(switchMap((domain:string)=>{\n let url = `api/usuarios/restablecer-contrasenia`;\n\n if(!model.idEmpresa){\n model.idEmpresa = this.baseService.getCompanyId();\n model.nombreEmpresa = this.baseService.getDirectoryTitle();\n }\n \n if(!model.language){\n model.language = this.baseService.getLanguage();\n }\n \n model.dominio = domain;\n \n return this.http.post(url, model, null, false);\n }));\n }\n\n public postConfirmationResetPassword(idVerificacion:string, password: string):Observable{\n let url = `api/usuarios/restablecer-contrasenia/confirmacion/${idVerificacion}`;\n\n let model = { Password: password };\n\n return this.http.post(url, model, null, false);\n }\n\n public postExistsUser(username: string): Observable{\n return this.baseService.getDirectoryDomain().pipe(switchMap((domain:string)=>{\n let model = {\n Username: username,\n DominioEmpresa: domain\n };\n \n return this.http.post(\"api/usuarios/existe\", model, null, false);\n }));\n }\n\n public updateUser(user: UpdateUser): Observable {\n let url = `api/usuarios/`;\n\n return this.http.put(url, user, null, true);\n }\n\n public createOrUpdateDependent(dependent: DependentRequest) {\n let url = `api/usuarios/dependientes/`;\n\n return dependent.idPersona > 0\n ? this.http.put(url, dependent, null, true)\n : this.http.post(url, dependent, null, true);\n }\n \n public deleteDependent(dependent: Dependent) {\n let url = `api/usuarios/dependientes/${dependent.id}?idPersona=${dependent.idPersona}`;\n\n return this.http.delete(url, null, true); \n }\n\n public updatePassword(model: UpdatePasswordRequestModel) {\n let url = `api/usuarios/contrasenia`;\n\n return this.http.put(url, model, null, true);\n }\n\n public getDependentRelationshipName(dependent: Dependent | undefined) {\n let relationship = this.dependentRelationshipTranslations.other;\n\n if (dependent) {\n switch(dependent.tipoRelacion) {\n case DependentRelationshipType.SonOrDaughter:\n relationship = (dependent.sexo == \"F\"? this.dependentRelationshipTranslations.daughter : this.dependentRelationshipTranslations.son);\n break;\n case DependentRelationshipType.FatherOrMother:\n relationship = (dependent.sexo == \"F\"? this.dependentRelationshipTranslations.mother : this.dependentRelationshipTranslations.father);\n break;\n case DependentRelationshipType.BrotherOrSister:\n relationship = (dependent.sexo == \"F\"? this.dependentRelationshipTranslations.sister : this.dependentRelationshipTranslations.brother);\n break;\n case DependentRelationshipType.HusbandOrWife:\n relationship = (dependent.sexo == \"F\"? this.dependentRelationshipTranslations.wife : this.dependentRelationshipTranslations.husband);\n break;\n case DependentRelationshipType.GrandfatherOrGrandmother:\n relationship = (dependent.sexo == \"F\"? this.dependentRelationshipTranslations.grandmother : this.dependentRelationshipTranslations.grandfather);\n break;\n case DependentRelationshipType.Warded:\n relationship = (dependent.sexo == \"F\"? this.dependentRelationshipTranslations.womanWarded : this.dependentRelationshipTranslations.manWarded);\n break;\n case DependentRelationshipType.Family:\n relationship = this.dependentRelationshipTranslations.relative;\n break;\n }\n } \n\n return relationship;\n }\n\n updateProfilePicture(args: AvatarUploadModel): Observable {\n const userType = !args.idPersona ? '' : '/dependientes';\n const url = `api/usuarios${userType}/foto-perfil`;\n return this.http.put(url, args, null, true);\n }\n\n uploadProfilePicture(file: File): Observable {\n const pUploadResponse = new Subject();\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onloadend = x => this.fileReaderOnLoadEnd(x, file, pUploadResponse);\n return pUploadResponse.asObservable();\n }\n\n private fileReaderOnLoadEnd(args: ProgressEvent, file: File, pUploadResponse: Subject): void {\n const ultimoPunto = file.name.lastIndexOf('.');\n const nombre: string = file.name.slice(0, ultimoPunto);\n const extension: string = file.name.slice(ultimoPunto + 1);\n const body: FileUploadRequest = {\n content: args.target?.result as string,\n contentType: file.type,\n extension,\n nombre\n };\n const url = `api/usuarios/imagenes`;\n this.http.post(url, body).subscribe({\n next: x => {pUploadResponse.next(x); pUploadResponse.complete();},\n error: error => {pUploadResponse.error(error); pUploadResponse.complete(); }\n });\n }\n\n deleteUploadedImage(id: number, idPersona: number) {\n const url = `api/usuarios/dependientes/imagen/${id}?idPersona=${idPersona}`;\n return this.http.delete(url, null, true);\n }\n\n public updateUserResidenceCountry(countryId: number): Observable{\n const model = { IdPais : countryId };\n return this.http.put('api/usuarios/pais-residencia', model, null, true);\n }\n\n public getUserCountry():Observable{\n return this.getUserPersonLoggedIn().pipe(switchMap((user: UserPerson | null)=>{\n if(user){\n\n return this.territorialDivisionService.getCountryApp()\n .pipe(switchMap((countryApp: CountryModel)=>{\n\n let availableCountries = this.territorialDivisionService.getAvailableCountries();\n let countryUser = availableCountries.find(c=> c.idPais == user.idPaisResidencia);\n \n if(user.idPaisResidencia > 0 && user.idPaisResidencia != 9 && countryUser){\n \n this.territorialDivisionService.setCountryApp(countryUser.idPais);\n \n return of(countryUser);\n }\n else if(user.idPaisResidencia == 9 && availableCountries.find(c=> c.id == countryApp.territorialDivision.id)){\n return this.updateUserResidenceCountry(countryApp.territorialDivision.idPais)\n .pipe(switchMap((result:void)=>{\n \n user.idPaisResidencia = countryApp.territorialDivision.idPais;\n \n this.updateUserLoggedIn(user);\n \n return of(countryApp.territorialDivision);\n }));\n }\n else{\n return of(null);\n }\n }));\n }\n else{\n return of(null);\n }\n }));\n }\n\n getUserUnverifiedRequest(requestGuid: string) : Observable {\n const url = \"api/usuarios/solicitudPorVerificar?solicitudPorVerificarCode=\" + requestGuid;\n \n return this.http.get(url, null, false);\n }\n\n registerUnverifiedUser(model: RegisterUnverifedUser): Observable {\n return this.http.post('api/usuarios/no-verificado', model, null, false);\n }\n\n wasUserCreated():boolean{\n const token = this.appStorageService.getToken();\n\n return !!token ? token.userCreated : false;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\r\nimport { Inject, Injectable, PLATFORM_ID } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UtilsService {\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: Object) { } \r\n\r\n scrollTo(containerEl: Element, position: number) {\r\n containerEl.scrollTop = position;\r\n }\r\n\r\n scrollToWithAnimation(containerEl: Element, position: number) {\r\n this.animateScroll(containerEl, position || 0, 500);\r\n }\r\n\r\n scrollToElementWithAnimation(containerEl: Element, element: Element) {\r\n if(isPlatformBrowser(this.platformId)){\r\n const elOffset = this.getOffset(element);\r\n const containerOffset = this.getOffset(containerEl);\r\n const containerScrollTop = containerEl.scrollTop || 0;\r\n \r\n const position = (elOffset.top - containerOffset.top) + containerScrollTop;\r\n this.animateScroll(containerEl, position || 0, 500);\r\n }\r\n }\r\n \r\n scrollBottom(containerEl: Element) {\r\n containerEl.scrollTop = containerEl.scrollHeight;\r\n }\r\n\r\n scrollBottomWithAnimation(containerEl: Element) {\r\n this.scrollToWithAnimation(containerEl, containerEl.scrollHeight); \r\n }\r\n\r\n groupBy(list: T[], keyGetter:(item: T) => K) {\r\n const map = new Map();\r\n list.forEach((item) => {\r\n const key = keyGetter(item);\r\n const collection = map.get(key);\r\n if (!collection) {\r\n map.set(key, [item]);\r\n } else {\r\n collection.push(item);\r\n }\r\n });\r\n return map;\r\n }\r\n\r\n containsValue(arrayString: string, separator: string, value: any) {\r\n\r\n if (!arrayString)\r\n return false;\r\n\r\n const array = arrayString.split(separator);\r\n\r\n return array.filter(elem => elem == value).length > 0;\r\n }\r\n\r\n containsAnyValue(arrayString: string, separator: string, valueArray: any[]) {\r\n\r\n if (!arrayString)\r\n return false;\r\n\r\n const array = arrayString.split(separator);\r\n\r\n return array.filter(elem => valueArray.includes(parseInt(elem))).length > 0;\r\n } \r\n\r\n containsAnyNumber(arrayNumber: number[], valueArray: number[]) {\r\n if (!arrayNumber)\r\n return false;\r\n\r\n return arrayNumber.filter(elem => valueArray.indexOf(elem) > -1).length > 0;\r\n }\r\n\r\n /* Person Initials Utils */\r\n\r\n private getPersonInitialsString(personName: string) {\r\n const arrayText = personName.trim().replace(/\\s\\s+/g, ' ').split(\" \");\r\n let result;\r\n\r\n if (arrayText.length > 1) {\r\n const lastnamePosition = arrayText.length - 1;\r\n\r\n if (lastnamePosition == 0 || (arrayText[lastnamePosition].length >= 2 && arrayText[lastnamePosition].includes('.'))) {\r\n result = arrayText[0][0] + arrayText[1][0];\r\n }\r\n else if (arrayText.length == 4) {\r\n result = arrayText[0][0] + arrayText[2][0];\r\n }\r\n else {\r\n result = arrayText[0][0] + arrayText[lastnamePosition][0];\r\n }\r\n }\r\n else {\r\n result = arrayText[0][0];\r\n }\r\n\r\n return result.toUpperCase();\r\n }\r\n\r\n private getHashCodeByString(personId: number, personName: string) {\r\n let hash = 0;\r\n\r\n for (let i = 0; i < personName.length; i++) {\r\n hash = personName.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n\r\n return hash + personId;\r\n }\r\n\r\n private getPersonInitialsColor(personId: number, initials: string) {\r\n const hashCode = this.getHashCodeByString(personId, initials);\r\n\r\n const colors = [\r\n \"#0ACBAC\",\r\n \"#17C65D\",\r\n \"#C801F2\",\r\n \"#FD3A58\",\r\n \"#F06C00\",\r\n \"#FFC000\",\r\n \"#296EFA\",\r\n \"#6B9DFF\",\r\n \"#7A1FA2\",\r\n \"#7C59BE\"\r\n ];\r\n\r\n const index = hashCode % colors.length;\r\n\r\n return colors[index];\r\n };\r\n\r\n getPersonInitials(personId: number, personName: string) {\r\n const initials = this.getPersonInitialsString(personName);\r\n const color = this.getPersonInitialsColor(personId, initials);\r\n\r\n return {\r\n initials: initials,\r\n color: color\r\n };\r\n }\r\n\r\n getPersonDefaultAvatarUrl(birthDate: Date | null, sex: string) {\r\n const age = this.getPersonAge(birthDate);\r\n const avatarBaseUrl = \"/assets/images/avatars/\";\r\n let url = \"Persona_anonima.svg\";\r\n\r\n sex = sex.toLowerCase();\r\n if ( !Number.isFinite(age) || !sex || sex == '9')\r\n return url;\r\n\r\n const ageRange = this.getAgeRange(age);\r\n url = this.getPhotoByAgeRangeAndSex(ageRange, sex);\r\n\r\n return avatarBaseUrl + url;\r\n }\r\n\r\n private getAgeRange(age: number): string {\r\n let range = \"76-99\";\r\n if (age >= 0 && age <= 17) {\r\n range = \"0-17\";\r\n } else if (age >= 18 && age <= 45) {\r\n range = \"18-45\";\r\n } else if (age >= 46 && age <= 75) {\r\n range = \"46-75\";\r\n }\r\n return range;\r\n }\r\n\r\n private getPhotoBySex (sex: string): string {\r\n const sexo = sex === 'm' ? 'male' : (sex === 'f' ? 'female' : 'no_gender');\r\n return `profile_${sexo}.svg`;\r\n }\r\n\r\n private getPhotoByAgeRangeAndSex(ageRange: string, sex: string): string {\r\n const sexo = sex === 'm' ? 'Hombre': 'Mujer';\r\n return `${sexo}_${ageRange}.svg`;\r\n }\r\n\r\n getPersonAge(birthDate: Date | null) { \r\n if (!birthDate)\r\n return -1;\r\n\r\n if(typeof birthDate === 'string')\r\n birthDate = new Date(birthDate); \r\n\r\n const now = new Date();\r\n let age = now.getFullYear() - birthDate.getFullYear();\r\n const m = now.getMonth() - birthDate.getMonth();\r\n \r\n if (m < 0 || (m === 0 && now.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n\r\n return age;\r\n }\r\n\r\n /* /Person Initials Utils */\r\n\r\n private animateScroll(element: Element, to: number, duration: number) {\r\n const start = element.scrollTop;\r\n const change = to - start;\r\n const increment = 20;\r\n let currentTime = 0;\r\n\r\n const animateScroll = () => {\r\n currentTime += increment;\r\n const val = this.easeInOutQuad(currentTime, start, change, duration);\r\n element.scrollTop = val;\r\n if (currentTime < duration) {\r\n setTimeout(animateScroll, increment);\r\n }\r\n };\r\n animateScroll();\r\n }\r\n\r\n private easeInOutQuad(t: number, b: number, c: number, d: number) {\r\n t /= d / 2;\r\n if (t < 1) return c / 2 * t * t + b;\r\n t--;\r\n return -c / 2 * (t * (t - 2) - 1) + b;\r\n }\r\n\r\n private getOffset(el: Element) {\r\n const rect = el.getBoundingClientRect();\r\n return {\r\n top: rect.top + window.scrollY,\r\n left: rect.left + window.scrollX\r\n };\r\n }\r\n}\r\n\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { ClinicConcept } from 'src/app/shared/models/cdr/clinic-concept.model';\r\nimport { HttpResponseModel } from 'src/app/shared/models/http-response-model';\r\nimport { VirtualAttention } from 'src/app/shared/models/process/virtual-attention.model';\r\nimport { environment } from 'src/environments/environment';\r\nimport { AppStorageService, STORAGE } from './app-storage.service';\r\nimport { BaseService } from './base.service';\r\nimport { HttpBaseService } from './http-base-service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VirtualAttentionService {\r\n\r\n constructor(\r\n private http: HttpBaseService,\r\n private baseService:BaseService,\r\n private appStorageService: AppStorageService\r\n ) { }\r\n\r\n getActive():Observable {\r\n let idEmpresaDestinoConsultaVirtual = this.baseService.getDirectory().idEmpresaDestinoConsultaVirtual;\r\n let idEmpresaDestino = idEmpresaDestinoConsultaVirtual ? idEmpresaDestinoConsultaVirtual : this.baseService.getCompanyId();\r\n\r\n let url = \"api/consultas-virtuales/activa?idEmpresaDestino=\" + idEmpresaDestino\r\n\r\n return this.http.get(url).pipe(map((virtualAttention: VirtualAttention) => {\r\n this.appStorageService.setItem(STORAGE.ACTIVE_VIRTUAL_ATTENTION, virtualAttention);\r\n\r\n return virtualAttention;\r\n })); \r\n }\r\n \r\n getActiveWithCache():Observable {\r\n let result = this.appStorageService.getItem(STORAGE.ACTIVE_VIRTUAL_ATTENTION)\r\n \r\n if (result)\r\n return of(result);\r\n\r\n return this.getActive();\r\n }\r\n\r\n getPastAttentions():Observable {\r\n let idEmpresaDestinoConsultaVirtual = this.baseService.getDirectory().idEmpresaDestinoConsultaVirtual;\r\n let idEmpresaDestino = idEmpresaDestinoConsultaVirtual ? idEmpresaDestinoConsultaVirtual : this.baseService.getCompanyId();\r\n\r\n let url = \"api/consultas-virtuales/pasadas?idEmpresaDestino=\" + idEmpresaDestino\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n removeActiveFromCache() {\r\n this.appStorageService.setItem(STORAGE.ACTIVE_VIRTUAL_ATTENTION, null)\r\n }\r\n\r\n startVirtualAttention(\r\n idEmpresaDestino: number,\r\n idAreaSistemaDestino: number,\r\n symptoms: ClinicConcept[],\r\n nombreEmisor: string,\r\n urlImagenEmisor: string,\r\n email: string) : Observable {\r\n let request = {\r\n IdEmpresaDestino: idEmpresaDestino,\r\n idAreaSistemaDestino: idAreaSistemaDestino,\r\n ConceptosClinicos: symptoms,\r\n Emisor: {\r\n NombreEmisor: nombreEmisor,\r\n UrlImagenEmisor: urlImagenEmisor,\r\n Email: email\r\n }\r\n };\r\n\r\n return this.http.post(\"api/consultas-virtuales/inicio/online\", request);\r\n }\r\n\r\n cancelVirtualAttention(idSolicitudPorVerificar: string, razon: string) {\r\n let url = \"api/consultas-virtuales/cancelar?idSolicitudPorVerificar=\" + idSolicitudPorVerificar;\r\n\r\n if (razon)\r\n url += \"&razon=\" + razon;\r\n\r\n return this.http.put>(url, {});\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\nimport { IWorkflowDataState } from 'src/app/shared/interfaces/workflow-data-state';\nimport { Workflow } from 'src/app/shared/models/systems/workflow.model';\nimport { OnlineAppointmentCliniwebState } from 'src/app/shared/models/workflow/states/online-appointment-cliniweb-state.model';\nimport { AppStorageService, STORAGE } from './app-storage.service';\nimport { HttpBaseService } from './http-base-service';\nimport { OnlinePaymentWorkflowState } from 'src/app/shared/models/workflow/states/online-payment-workflow-state.model';\nimport { environment } from 'src/environments/environment';\nimport { LocationPublicProfile, PublicProfile } from 'src/app/shared/models/people/public-profile.model';\nimport { OnlinePaymentModel } from 'src/app/shared/models/workflow/models/online-payment.model';\nimport { Router } from '@angular/router';\nimport { AppointmentCheckout } from 'src/app/shared/models/workflow/models/appointment-checkout.model';\nimport { TokenState } from 'src/app/shared/models/token.model';\nimport { MedicalOrderWorkflowState } from 'src/app/shared/models/workflow/states/medical-order-workflow-state.model';\nimport { GrowthCurvesWorkflowState } from 'src/app/shared/models/workflow/states/growth-curves-workflow-state.model';\nimport { IAuthenticationWorkflowState } from 'src/app/shared/models/workflow/steps/authentication-step.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WorkflowService {\n\n encryptSessionData = environment.encryptLocalStorage;\n\n constructor(\n private http: HttpBaseService,\n private appStorageService: AppStorageService,\n private router: Router\n ) { } \n\n get(idTipoFlujoTrabajo: number, idEmpresa?: number, idResponsableServicio?:number){ \n let url = `api/flujos-trabajo?idTipoFlujoTrabajo=${idTipoFlujoTrabajo}`;\n \n if(idEmpresa)\n url += `&idEmpresa=${idEmpresa}`;\n \n if(idResponsableServicio)\n url += `&idResponsableServicio=${idResponsableServicio}`;\n\n return this.http.get(url, null, false);\n } \n\n setWorkflowTypeActive(type:string){\n this.appStorageService.setItemSession(STORAGE.WORKFLOW_TYPE, type, this.encryptSessionData);\n }\n \n getWorkflowTypeActive():string{\n return this.appStorageService.getItemSession(STORAGE.WORKFLOW_TYPE, this.encryptSessionData);\n }\n\n getWorkflowDataState(type?:string):any{\n\n let workflowType = type ?? this.appStorageService.getItemSession(STORAGE.WORKFLOW_TYPE, this.encryptSessionData);\n\n let workflowState = this.appStorageService.getItemSession(workflowType, this.encryptSessionData);\n\n if(!workflowState)\n return null;\n\n switch(workflowType){\n case STORAGE.ONLINE_APPOINTMENT_CLINIWEB_STATE:\n workflowState = new OnlineAppointmentCliniwebState(workflowState);\n break;\n case STORAGE.ONLINE_PAYMENT_WORKFLOW_STATE:\n if (workflowState)\n workflowState = new OnlinePaymentWorkflowState(workflowState);\n break;\n case STORAGE.MEDICAL_ORDER_WORKFLOW_STATE:\n if (workflowState)\n workflowState = new MedicalOrderWorkflowState(workflowState);\n break;\n case STORAGE.GROWTH_CURVES_WORKFLOW_STATE:\n if (workflowState)\n workflowState = new GrowthCurvesWorkflowState(workflowState);\n break;\n default: \n break;\n }\n return workflowState;\n }\n\n setWorkflowDataState(workflowDataState: IWorkflowDataState | IAuthenticationWorkflowState, type?:string):void{\n \n let workflowType = type ?? this.appStorageService.getItemSession(STORAGE.WORKFLOW_TYPE, this.encryptSessionData);\n\n this.appStorageService.setItemSession(workflowType, workflowDataState, this.encryptSessionData);\n }\n\n removeWorkflowData(type?:string) {\n let workflowType = type ?? this.appStorageService.getItemSession(STORAGE.WORKFLOW_TYPE, this.encryptSessionData);\n\n this.appStorageService.removeSessionItem(workflowType);\n }\n\n getTokenStateFromWorkflow() : TokenState {\n let tokenState: TokenState = new TokenState();\n let workflowState = this.getWorkflowDataState(); \n\n if (workflowState instanceof OnlineAppointmentCliniwebState) { \n let appointmentState = workflowState as OnlineAppointmentCliniwebState;\n\n tokenState.workflowType = this.getWorkflowTypeActive();\n\n tokenState.publicProfileIdentifier = appointmentState.getPublicProfile().username; \n tokenState.locationId = appointmentState.onlineAppointmentRequest.idLocalidad;\n tokenState.targetDate = appointmentState.getAppointmentInfo().appointmentDate.getTime();\n }\n else if (workflowState instanceof OnlinePaymentWorkflowState) { \n let paymentState = workflowState as OnlinePaymentWorkflowState;\n\n tokenState.workflowType = this.getWorkflowTypeActive();\n tokenState.publicProfileIdentifier = paymentState.getPublicProfile().username;\n }\n\n return tokenState;\n }\n\n initPaymentWorkflow(publicProfile: PublicProfile, companyName: string) {\n let dto = new OnlinePaymentModel();\n \n dto.idResponsableServicio = publicProfile.id;\n dto.nombreResponsableServicio = publicProfile.nombrePersona;\n dto.urlAvatarResponsableServicio = publicProfile.ubicacionFoto;\n dto.nickname = publicProfile.username;\n dto.especialidadResponsableServicio = publicProfile.especialidad;\n dto.idEmpresa = publicProfile.idEmpresa; \n dto.nombreEmpresa = companyName;\n dto.emailResponsableServicio = publicProfile.emailRemitenteNotificacion; \n dto.idEmpresaResponsableServicio = publicProfile.idEmpresa;\n \n dto.perfilPublico = publicProfile;\n\n this.appStorageService.setItemSession(STORAGE.ONLINE_PAYMENT_WORKFLOW_BOOTSTRAP_STATE, dto); \n this.router.navigate([\"/pagos/checkout\"]);\n }\n\n initAppointmentWorkflow(publicProfile: PublicProfile, location: LocationPublicProfile, dateTimestamp: number) {\n let dto = new AppointmentCheckout();\n let date = new Date(dateTimestamp);\n let endDate = new Date(dateTimestamp + (30 * 60 * 1000));\n\n dto.fechaInicio = date;\n dto.fechaFin = endDate;\n dto.idLocalidad = location.localidad.id;\n dto.nombreLocalidad = location.localidad.nombre;\n dto.direccionLocalidad = location.localidad.direccion1;\n dto.coordenadasLocalidad = location.localidad.coordenadas;\n dto.telefonoLocalidad = location.localidad.tel \n ? location.localidad.tel \n : location.localidad.tel2;\n dto.idResponsableServicio = publicProfile.id;\n dto.nombreResponsableServicio = publicProfile.nombrePersona;\n dto.urlAvatarResponsableServicio = publicProfile.ubicacionFoto;\n dto.nickname = publicProfile.username;\n dto.especialidadResponsableServicio = publicProfile.especialidad;\n dto.idEmpresa = location.idEmpresa ?? publicProfile.idEmpresa;\n dto.teleconsulta = location.localidad.teleconsulta;\n \n dto.perfilPublico = publicProfile;\n\n this.appStorageService.setItemSession(STORAGE.ONLINE_APPOINTMENT_CLINIWEB_BOOTSTRAP_STATE, dto); \n this.router.navigate([\"/citas/checkout\"]);\n }\n}\n","import { Component, ComponentFactoryResolver, ElementRef, HostListener, OnDestroy, Type, ViewContainerRef, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\n\n@Component({\n selector: 'app-bottom-sheet-menu',\n templateUrl: './bottom-sheet-menu.component.html',\n styleUrls: ['./bottom-sheet-menu.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class BottomSheetMenuComponent implements OnDestroy\n{\n @ViewChild('bottomSheetBackdrop', {read: ElementRef}) private backdrop: ElementRef;\n @ViewChild('bottomSheetContainer', {read: ElementRef}) private container: ElementRef;\n @ViewChild('bottomSheetNgContainer', {read: ViewContainerRef}) private containerRef: ViewContainerRef;\n\n private currentComponent?: Type;\n private eventoClickAsignado = false;\n\n constructor(\n private messageBusService: MessageBusService,\n private resolver: ComponentFactoryResolver\n ) {\n this.messageBusService.onToggleBottomSheetSubject().subscribe({next: this.openCloseBottomSheet.bind(this)});\n }\n\n ngOnDestroy(): void {\n this.currentComponent = undefined;\n }\n\n private openCloseBottomSheet(args: {action: string, component?: Type}) {\n if (args.action === 'open') {\n this.loadComponent(args.component);\n if (!this.container.nativeElement.classList.contains('confirm-logout-animation-in')) {\n this.open();\n } else {\n this.close();\n }\n } else {\n this._close();\n }\n }\n\n @HostListener(\"keydown.esc\") \n public onEsc(e: Event): void {\n console.log(e)\n this.close();\n }\n\n private loadComponent(component: Type | undefined): void {\n if (!component || this.currentComponent == component) return;\n this.currentComponent = component;\n const factory = this.resolver.resolveComponentFactory(component);\n this.containerRef.clear();\n const componentRef = this.containerRef.createComponent(factory);\n }\n\n private open(): void {\n this.container.nativeElement.classList.remove('confirm-logout-animation-out');\n this.backdrop.nativeElement.classList.add('cdk-overlay-backdrop-showing');\n this.container.nativeElement.classList.add('confirm-logout-animation-in');\n if (!this.eventoClickAsignado)\n this.backdrop.nativeElement.addEventListener('click', () => this.close());\n }\n\n public close(): void {\n this.messageBusService.sendToggleBottomSheetSubject({action: 'close', component: this.currentComponent});\n }\n\n private _close(): void {\n setTimeout(() => {\n this.backdrop.nativeElement.classList.remove('cdk-overlay-backdrop-showing');\n this.container.nativeElement.classList.remove('confirm-logout-animation-in');\n }, 400);\n this.container.nativeElement.classList.add('confirm-logout-animation-out');\n }\n\n}\n","
\n
\n
\n \n
\n
","import { Component, HostListener, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { MessageBusService, SessionExpiredMessage } from 'src/app/core/services/message-bus.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { Direction } from 'src/app/shared/enums/direction.enum';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\n\n@Component({\n selector: 'app-home',\n templateUrl: './home.component.html',\n styleUrls: ['./home.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class HomeComponent implements OnInit, OnDestroy {\n private ngUnsubscribe = new Subject();\n private scrollTop: number = 0;\n public menuComponentName: string = \"\";\n loggedInUser?: UserPerson; \n\n isBrowser: boolean = false;\n\n constructor(\n private layoutService: LayoutService,\n private baseService: BaseService,\n private messageBusService: MessageBusService,\n private userService: UserService\n ) {\n }\n\n ngOnInit(): void {\n this.menuComponentName = this.baseService.getMenuComponentName(); \n\n this.userService.getUserPersonLoggedIn()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(p => {\n if (p)\n this.loggedInUser = p;\n });\n this.messageBusService.onSessionExpired()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((_: SessionExpiredMessage) => this.loggedInUser = undefined);\n this.messageBusService.onLoginCompleted()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n if (msg.user) {\n this.loggedInUser = msg.user;\n } \n }); \n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n @HostListener('window:scroll', ['$event'])\n onScroll($event:Event){\n const scrollTop = ($event.target as Element).scrollTop;\n\n const offset = this.scrollTop - scrollTop;\n\n if(Math.abs(offset) < 50) return; \n\n const direction = offset < 0\n ? Direction.Down\n : Direction.Up;\n\n this.scrollTop = scrollTop;\n \n setTimeout(()=>{\n this.layoutService.onScrollingBody(direction);\n }, 100);\n\n\n this.messageBusService.scrollTopBody(scrollTop);\n }\n}\n","\n \n \n \n \n \n \n
\n
\n \n
\n
\n
\n
","import { animate, animateChild, group, query, style, transition, trigger } from \"@angular/animations\";\r\n\r\nexport const fadeAnimation = \r\n trigger('routeAnimations', [\r\n transition('SearchResultsPage => PublicProfilePage', [\r\n style({ position: 'relative' }),\r\n query(':enter, :leave', [\r\n style({\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n width: '100%'\r\n })\r\n ],{ optional: true }),\r\n query(':enter', [\r\n style({ right: '-100%' })\r\n ],{ optional: true }),\r\n query(':leave', animateChild(), { optional: true }),\r\n group([\r\n query(':leave', [animate('400ms ease-out', style({ right: '100%' }))],{ optional: true }),\r\n query(':enter', [animate('400ms 300ms ease-out', style({ right: '0%' }))],{ optional: true }),\r\n query('@*', animateChild(), { optional: true })\r\n ]),\r\n ]),\r\n transition('PublicProfilePage => SearchResultsPage', [\r\n style({ position: 'relative' }),\r\n query(':enter, :leave', [\r\n style({\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%'\r\n })\r\n ],{ optional: true }),\r\n query(':enter', [\r\n style({ left: '-100%' })\r\n ],{ optional: true }),\r\n query(':leave', animateChild(), { optional: true }),\r\n group([\r\n query(':leave', [animate('400ms ease-out', style({ left: '100%' }))],{ optional: true }),\r\n query(':enter', [animate('400ms ease-out', style({ left: '0%' }))],{ optional: true }),\r\n query('@*', animateChild(), { optional: true })\r\n ]),\r\n ]),\r\n transition('PublicProfilePage => AppointmentsPage', [\r\n style({ position: 'relative' }),\r\n query(':enter, :leave', [\r\n style({\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n width: '100%'\r\n })\r\n ],{ optional: true }),\r\n query(':enter', [\r\n style({ right: '-100%' })\r\n ],{ optional: true }),\r\n query(':leave', animateChild(), { optional: true }),\r\n group([\r\n query(':leave', [animate('400ms ease-out', style({ right: '100%' }))],{ optional: true }),\r\n query(':enter', [animate('400ms ease-out', style({ right: '0%' }))],{ optional: true }),\r\n query('@*', animateChild(), { optional: true })\r\n ]),\r\n ]),\r\n transition('AppointmentsPage => PublicProfilePage', [\r\n style({ position: 'relative' }),\r\n query(':enter, :leave', [\r\n style({\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%'\r\n })\r\n ],{ optional: true }),\r\n query(':enter', [style({ left: '-100%' })],{ optional: true }),\r\n query(':leave', animateChild(), { optional: true }),\r\n group([\r\n query(':leave', [animate('400ms ease-out', style({ left: '100%' }))],{ optional: true }),\r\n query(':enter', [animate('400ms ease-out', style({ left: '0%' }))],{ optional: true }),\r\n query('@*', animateChild(), { optional: true })\r\n ]),\r\n ]),\r\n transition('MedicalOrderLandingPage => *', [\r\n style({ position: 'relative' }),\r\n query(':enter, :leave', [\r\n style({\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n height: '100%',\r\n width: '100%'\r\n })\r\n ], { optional: true }),\r\n query(':enter', [\r\n style({ right: '-100%', backgroundColor: 'white' }),\r\n animate('600ms ease-in', style({ right: '0%' }))\r\n ], { optional: true }),\r\n ]),\r\n transition('* => MedicalOrderLandingPage', [\r\n style({ position: 'relative' }),\r\n query(':enter, :leave', [\r\n style({\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n height: '100%',\r\n width: '100%'\r\n })\r\n ], { optional: true }),\r\n query(':enter', [\r\n style({ right: '-100%', backgroundColor: 'white' }),\r\n animate('600ms ease-in', style({ right: '0%' }))\r\n ], { optional: true }),\r\n ]),\r\n ]);\r\n\r\nexport const inOutAnimation = trigger(\r\n 'inOutAnimation', \r\n [\r\n transition(':enter', [\r\n style({ transform: 'translateY(100%)' }),\r\n animate('300ms', style({transform: 'translateY(0)'}))\r\n ]),\r\n transition(':leave', [\r\n style({transform: 'translateY(0)'}),\r\n animate('300ms', style({transform: 'translateY(100%)'}))\r\n ])\r\n ]\r\n);\r\n\r\n/*export const inOutAnimationWithDelay = trigger(\r\n 'inOutAnimationWithDelay', \r\n [\r\n transition('* => PublicProfilePage', [\r\n style({ transform: 'translateX(100%)' }),\r\n animate('300ms 300ms', style({transform: 'translateX(0)'})),\r\n ]),\r\n transition(':leave', [\r\n style({transform: 'translateX(0)'}),\r\n animate('300ms', style({transform: 'translateX(100%)'}))\r\n ])\r\n ]\r\n);*/","import { DatePipe } from \"@angular/common\";\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'customDate'\r\n })\r\n export class CustomDatePipe implements PipeTransform {\r\n transform(value: any, format: string = 'mediumDate', timezone: string = 'UTC', locale: string = 'es-AR'): string | null {\r\n const datePipe = new DatePipe(locale);\r\n let formattedDate = datePipe.transform(value, 'dd MMM y', timezone, locale);\r\n \r\n // Agrega el punto a los meses abreviados si falta\r\n if (formattedDate) {\r\n formattedDate = formattedDate.replace(/\\b(ene|feb|mar|abr|may|jun|jul|ago|sep|oct|nov|dic)\\b/g, '$&.');\r\n }\r\n \r\n return formattedDate;\r\n }\r\n}","
\n
\n
\n
\n \n {{getAppointmentTypeText()}}\n
\n
\n {{model.appointmentDate | date:'EEEE': 'UTC': language | titlecase }}, {{model.appointmentDate | customDate:'mediumDate': 'UTC': language }}\n {{model.appointmentDate | date:'h:mm a': 'UTC' | lowercase }}\n
\n
\n \n
\n\n
\n
\n \n
\n\n \n \n {{model.doctorName}}\n \n \n {{model.doctorSpecialty}}\n \n
\n
\n \n \n \n {{ model.attentionPlaceAddress }}.\n
\n
\n \n \n {{ model.medicalConsultationType }}\n {{ model.medicalConsultationAmount | currency:'USD' }}\n \n
\n
\n \n \n
\n {{ model.patientName }}\n {{ ' (' + getRelationshipText() + ')' }}\n
\n
\n
\n
\n
","import { Component, HostListener, Inject, Input, OnChanges, OnInit, PLATFORM_ID, SimpleChanges } from '@angular/core';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { inOutAnimation } from '../../animations';\nimport { AppointmentInfoDataModel, AppointmentType } from '../../models/workflow/models/appointment-info-data.model';\nimport { SenderPatientRelationship } from '../../models/process/base-request.model';\nimport { MapDialogData } from '../../models/dialog-data.model';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MapDialogComponent } from '../dialogs/map-dialog/map-dialog.component';\nimport { PublicProfileAvatarComponentModel } from '../public-profile-avatar/public-profile-avatar.component';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { PublicProfileRouteDialogModel, RouteDialogType } from '../dialogs/route-dialog/route-dialog.component';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'app-appointment-info-checkout',\n templateUrl: './appointment-info-checkout.component.html',\n styleUrls: ['./appointment-info-checkout.component.css'],\n animations: [ inOutAnimation ]\n})\nexport class AppointmentInfoCheckoutComponent implements OnChanges, OnInit {\n\n language: string;\n @Input() model:AppointmentInfoDataModel;\n @Input() show: boolean = true;\n @Input() showRelative: boolean = false;\n @Input() enablePublicProfileLinks: boolean = false;\n @Input() initialLoading = false;\n attentionPlaceLabel = 'shared.appointmentInfoCheckout.attentionPlaceLabel';\n isDesktop: boolean;\n avatarModel: PublicProfileAvatarComponentModel;\n isVirtualAppointment: boolean = false;\n isBrowser: boolean;\n\n constructor(\n private dialog: MatDialog,\n private translation: L10nTranslationService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private publicProfileService: PublicProfileService,\n private routeDialogService: RouteDialogService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.language = locale.dateLanguage ?? 'es-AR';\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.model && this.model.perfilPublico) {\n this.avatarModel = new PublicProfileAvatarComponentModel();\n this.avatarModel.personId = this.model.perfilPublico.id;\n this.avatarModel.avatarUrl = this.model.perfilPublico.ubicacionFoto;\n this.avatarModel.fullName = this.model.perfilPublico.nombrePersona;\n this.avatarModel.sex = this.model.perfilPublico.sexo;\n this.avatarModel.profileType = this.model.perfilPublico.tipoPerfil;\n }\n }\n\n ngOnInit(): void {\n this.isDesktop = this.isBrowser ? window.innerWidth > 799 : true;\n\n this.setAttentionPlaceLabel();\n\n this.isVirtualAppointment = (this.model.appointmentType == AppointmentType.VIRTUAL);\n }\n \n private setAttentionPlaceLabel(): void {\n if (this.model.appointmentType == AppointmentType.VIRTUAL)\n this.attentionPlaceLabel = 'shared.appointmentInfoCheckout.attentionPlaceLabel2';\n }\n\n getAppointmentTypeText():string{\n return this.model.appointmentType == AppointmentType.FACE_TO_FACE \n ? this.translation.translate(\"shared.appointmentInfoCheckout.faceToFaceAppointment\")\n : this.translation.translate(\"shared.appointmentInfoCheckout.virtualAppointment\");\n }\n\n getAppointmentTypeClasname():string{\n return this.model.appointmentType == AppointmentType.FACE_TO_FACE\n ? 'phr-iconset-home'\n : 'phr-iconset-PHR-video';\n }\n\n showRelationship(){\n\n return this.model.patientRelationshipType > 0 \n && this.model.patientRelationshipType != SenderPatientRelationship.USUARIO\n && this.model.patientRelationshipType != SenderPatientRelationship.DESCONOCIDO;\n\n }\n\n getRelationshipText(){\n\n this.model.patientGender = this.model.patientGender == '9' \n ? 'M' \n : this.model.patientGender;\n\n let _textRef = `shared.appointmentInfoCheckout.relationship_${this.model.patientRelationshipType}_${this.model.patientGender}`;\n \n return this.translation.translate(_textRef);\n }\n\n openMap(){\n let data = new MapDialogData();\n \n data.title = this.model.attentionPlaceName;\n data.message = this.model.attentionPlaceLatLng;\n data.animationIn = 'map-phr-animation-in';\n data.animationOut = 'map-phr-animation-out';\n data.showCloseTextButton = true;\n data.showWazeButton = false;\n\n this.dialog.open(MapDialogComponent, { \n panelClass: ['map-dialog','map-phr-dialog', 'map-phr-animation-in'],\n data: data\n });\n }\n\n goToPublicProfile() { \n if(!this.enablePublicProfileLinks)\n return;\n\n let url = this.publicProfileService.getPublicProfileUrl(this.model.perfilPublico.username);\n\n if (this.routeDialogService.isOpen(RouteDialogType.APPOINTMENT_SUMMARY))\n this.routeDialogService.closeDialog(RouteDialogType.APPOINTMENT_SUMMARY);\n \n // Final step from appointment creation\n if (this.routeDialogService.isOpen(RouteDialogType.PUBLIC_PROFILE)) {\n this.routeDialogService.closeDialogsAndNavigate(url);\n }\n else {\n setTimeout(() => {\n let routeDialogModel = new PublicProfileRouteDialogModel();\n routeDialogModel.route = url;\n \n this.routeDialogService.openDialog(routeDialogModel);\n }, 1000);\n }\n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.isDesktop = event.target.innerWidth > 799;\n }\n}","
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {{options.selectFileLabel}}\r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {{options.changeFileLabel}} \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
","import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\r\nimport { L10nTranslationService } from 'angular-l10n';\r\nimport { MessageBusService, OpenSnackBarMessage, SnackBarType } from 'src/app/core/services/message-bus.service';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\n\r\n@Component({\r\n selector: 'app-avatar-upload',\r\n templateUrl: './avatar-upload.component.html',\r\n styleUrls: ['./avatar-upload.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class AvatarUploadComponent {\r\n\r\n @Input() options : AvatarUploadComponentOptions;\r\n @Input() fileUrl = \"\";\r\n @Input() id: number;\r\n @Input() uploadData: AvatarUploadModel;\r\n\r\n @Output() onFileUploaded = new EventEmitter();\r\n\r\n uploading : boolean = false;\r\n\r\n constructor(\r\n private messageBusService: MessageBusService,\r\n private translation: L10nTranslationService,\r\n private userService: UserService,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n onFileSelected(event: any) {\r\n const file : File = event.target.files[0];\r\n if (file) {\r\n this.uploading = true;\r\n this.userService.uploadProfilePicture(file).subscribe({\r\n next: this.uploadProfilePictureNext.bind(this),\r\n error: this.uploadProfilePictureError.bind(this)\r\n });\r\n }\r\n }\r\n\r\n deletePicture() {\r\n this.uploading = true;\r\n this.uploadProfilePictureNext();\r\n }\r\n\r\n private uploadProfilePictureNext(args?: AvatarUploadedFileModel): void {\r\n this.onFileUploaded.emit(args);\r\n if (!this.options.edit) {\r\n const uploadData = this.uploadData ?? {ubicacionLogo: null};\r\n uploadData.ubicacionLogo = args?.webUrl;\r\n this.userService.updateProfilePicture(uploadData).subscribe({\r\n next: this.updateProfilePictureNext.bind(this),\r\n error: this.uploadProfilePictureError.bind(this)\r\n });\r\n } else {\r\n this.uploading = false;\r\n }\r\n }\r\n\r\n private updateProfilePictureNext(_: any): void {\r\n this.showToast(this.translation.translate('shared.editUser.text12'), SnackBarType.SUCCESS);\r\n this.uploading = false;\r\n }\r\n\r\n private uploadProfilePictureError(args: any): void {\r\n this.uploading = false;\r\n this.showToast(args, SnackBarType.ERROR);\r\n this.cd.detectChanges();\r\n }\r\n\r\n private showToast(messageText: string, snackBarType: SnackBarType) {\r\n const message = new OpenSnackBarMessage();\r\n message.text = messageText;\r\n message.type = snackBarType;\r\n message.duration = 3000;\r\n this.messageBusService.openSnackBar(message);\r\n }\r\n\r\n}\r\n\r\nexport class AvatarUploadComponentOptions {\r\n requiredFileType: string; // List of file types like 'image/png,image/jpeg' \r\n showFileOnceUpload: boolean = true;\r\n edit = false;\r\n // Labels\r\n selectFileLabel: string;\r\n changeFileLabel: string;\r\n changePictureLabel: string;\r\n deleteFileLabel: string;\r\n}\r\n\r\nexport class AvatarUploadedFileModel {\r\n webUrl: string;\r\n fileName: string;\r\n fileExtension: string;\r\n}\r\n\r\nexport class AvatarUploadModel {\r\n idPersona?: number;\r\n idRelacionDependiente?: number;\r\n ubicacionLogo?: string;\r\n}","\n
\n \n\n \n
\n
\n
{{ 'shared.chatWidget.text1' | translate:locale.language }}
\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n
{{ 'shared.chatWidget.text9' | translate:locale.language }}
\n {{ 'shared.chatWidget.text10' | translate:locale.language }}\n
\n
\n \n {{ 'shared.chatWidget.text11' | translate:locale.language }}\n \n
\n
\n
\n \n
\n
\n {{ 'shared.chatWidget.text5' | translate:locale.language }}
\n {{getSymptoms()}}\n
\n
\n \n
\n
\n
\n\n \n
\n\n \n
\n
{{chatWrapper.getDoctorName()}}
\n
\n \n {{ 'shared.chatWidget.text7' | translate:locale.language }}\n {{ 'shared.chatWidget.text8' | translate:locale.language }} |\n {{ 'time' | translate:locale.language }}: {{chatWrapper.getChatTime()}}\n
\n
\n \n
\n
\n \n
\n
\n\n \n
\n
\n \n
\n {{ getChatDate(messageWrapper.message.fechaCreacion) }}\n
\n\n \n
\n
\n \n
\n \n {{messageWrapper.message.fechaCreacion | date:'shortTime' }}\n \n
\n\n \n
\n \n \n {{chatWrapper.getDoctorName()}} \n
\n \n
\n {{messageWrapper.message.fechaCreacion | date:'shortTime' }}\n
\n
\n \n
\n
\n\n \n
\n \n \n \n \n
\n\n
\n\n \n\n \n
\n
\n \n \n 0\">\n {{chatWrapper.unreadMessagesCount}}\n \n
\n
\n\n
","import { Component, OnInit, Inject, ViewEncapsulation, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { ChatLoadedMessage, MessageBusService, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ChatService } from 'src/app/core/services/chat-service';\nimport { ChatCancellationMessage, ChatConversacionMessage, ChatConversacionMessageType } from '../../models/people/chat-conversation.model';\nimport { VirtualAttentionService } from 'src/app/core/services/virtual-attention.service';\nimport { VirtualAttention } from '../../models/process/virtual-attention.model';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { ChatSignalRService } from 'src/app/core/services/signalR/chat-signalr.service';\nimport { MatDialog } from '@angular/material/dialog';\nimport { CancelVirtualAttentionDialogComponent } from '../dialogs/cancel-virtual-attention/cancel-virtual-attention-dialog.component';\nimport { DialogData } from '../../models/dialog-data.model';\nimport { ToastrService } from 'ngx-toastr';\nimport { UserActiveEvent } from '../../models/signalr/user-active-event.model';\nimport { VirtualAttentionEvent } from '../../models/signalr/virtual-attention-event.model';\nimport { ChatConversacionMessageEvent } from '../../models/signalr/chat-conversation-message-event.model';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'app-chat',\n templateUrl: './chat.component.html',\n styleUrls: ['./chat.component.css'],\n encapsulation: ViewEncapsulation.None,\n providers: [ChatSignalRService]\n})\nexport class ChatComponent implements OnInit, OnDestroy {\n companyId: number;\n virtualConsultationCompanyId : number | undefined;\n currentMessage: string; \n etapaSolicitudId: number; \n loggedUser: UserPerson; \n virtualAttention: VirtualAttention; \n chatWrapper : ChatWrapper; \n\n messagesPageSize = 30;\n chatInitialized = false;\n userActiveIntervalId: any;\n agentActiveIntervalId: any;\n lastAgentActiveDate = 0;\n isAgentActive = false;\n\n day: string;\n hour: string;\n min: string;\n and: string;\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n constructor( \n @Inject(L10N_LOCALE) public locale: L10nLocale, \n private translation: L10nTranslationService, \n private signalRService: ChatSignalRService, \n private route: ActivatedRoute, \n private chatService: ChatService,\n private messageBusService: MessageBusService,\n private baseService: BaseService,\n private virtualAttentionService: VirtualAttentionService,\n private utilsService : UtilsService,\n public dialog: MatDialog,\n private userService: UserService,\n private toastr: ToastrService,\n @Inject(DOCUMENT) private document: Document,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { \n }\n\n ngOnInit(): void { \n this.companyId = this.baseService.getCompanyId();\n\n // For sura, this will be the account id of SURA-CAISS\n var dir = this.baseService.getDirectory();\n this.virtualConsultationCompanyId = dir ? dir.idEmpresaDestinoConsultaVirtual : 0;\n\n // Subscribe to Load Chat message\n this.messageBusService.onLoadChat()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n if (!msg || !msg.idEtapaSolicitud)\n return;\n \n if (this.etapaSolicitudId == msg.idEtapaSolicitud && this.chatInitialized) {\n let hasAgentMessages = this.chatWrapper.hasAgentMessages();\n this.messageBusService.chatLoaded(new ChatLoadedMessage(hasAgentMessages));\n \n return;\n }\n\n this.loadChat(msg.idEtapaSolicitud);\n });\n\n // Open chat event\n this.messageBusService.onOpenChat()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => { \n if (this.chatWrapper)\n this.chatWrapper.show();\n });\n\n // Chat cancelled event\n this.messageBusService.onChatCancelled()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n this.chatWrapper.minimize(); \n\n // Send message that indicate que chat was cancelled\n this.sendCancellationMessage(msg.reason);\n\n this.chatWrapper = null as any;\n this.virtualAttention = null as any;\n\n this.virtualAttentionService.removeActiveFromCache();\n\n this.clearUserActiveInterval();\n this.clearAgentActiveInterval(); \n });\n\n this.messageBusService.onLogout()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n this.virtualAttention = null as any;\n this.chatWrapper = null as any;\n\n this.clearUserActiveInterval();\n this.clearAgentActiveInterval();\n });\n\n // Subscribe to route to load widget by QS\n this.route.params\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(params => {\n let etapaSolicitudId = params['supportId']; \n\n if (etapaSolicitudId) {\n this.loadChat(etapaSolicitudId);\n } \n }); \n\n this.translation.onChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe({\n next: () => {\n this.day = this.translation.translate('days'); \n this.hour = this.translation.translate('hours'); \n this.min = this.translation.translate('minutes');\n this.and = this.translation.translate('and');\n }\n });\n\n }\n\n ngOnDestroy() {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n\n // Clear user action interval before destroy\n this.clearUserActiveInterval();\n this.clearAgentActiveInterval();\n }\n\n loadChat(idEtapaSolicitud: number) {\n \n // Check if the chat was already initialized\n if (this.etapaSolicitudId == idEtapaSolicitud && this.chatWrapper && this.chatWrapper.initialized)\n return; \n\n this.etapaSolicitudId = idEtapaSolicitud;\n this.chatInitialized = true;\n\n // Get current user\n this.userService.getUserPersonLoggedIn().subscribe(logged => {\n if (logged) {\n this.loggedUser = logged;\n\n // Load virtual attention\n this.virtualAttentionService.getActiveWithCache().subscribe(va => {\n this.virtualAttention = va;\n\n if (this.virtualAttention) {\n \n this.chatWrapper = new ChatWrapper(this.loggedUser, this.virtualAttention);\n this.chatWrapper.min = this.min;\n this.chatWrapper.hour = this.hour;\n this.chatWrapper.initialized = true;\n\n this.lastAgentActiveDate = this.virtualAttention.fechaUnixUltimaVezActivoResponsableServicio;\n this.updateAgentActive();\n\n // Load chat messages\n this.loadChatMessages(this.virtualAttention.idSolicitud, 0);\n }\n },\n error => {\n this.baseService.handleServiceError(error, \"Error getting past appointments\");\n });\n\n // Load chat\n /*this.chatService.getByEtapaSolicitudId(this.etapaSolicitudId).subscribe(chat => {\n this.chat = chat; \n });*/\n\n } \n }); \n\n // Init signalR\n this.initSignalR();\n\n // Init interval that will keep the user as active\n this.initUserActiveInterval();\n\n this.initAgentActiveInterval();\n }\n\n loadChatMessages(idSolicitud: number, from: number, upDirection = false) {\n \n this.chatService.getChatMessages(idSolicitud, from, this.messagesPageSize).subscribe(messages => {\n this.chatWrapper.addMessages(messages, true, upDirection);\n\n this.chatWrapper.loading = false;\n\n let hasAgentMessages = this.chatWrapper.hasAgentMessages();\n this.messageBusService.chatLoaded(new ChatLoadedMessage(hasAgentMessages));\n },\n error => { \n this.baseService.handleServiceError(error, \"Error getting chat messages\");\n });\n }\n\n sendMessage(): void { \n \n // If it is an empty msg\n if (!this.currentMessage) {\n return;\n }\n\n let chatMessage = this.buildChatMessage();\n\n if (!chatMessage)\n return; \n\n // Add msg to chat\n this.chatWrapper.addMessages([chatMessage]);\n\n // Scroll bottom\n this.scrollBottom();\n\n this.currentMessage = \"\";\n \n this.chatService.sendMessage(chatMessage.idChat, chatMessage).subscribe(result => {\n console.log(result);\n },\n error => {\n this.baseService.handleServiceError(error, \"Error posting chat messages\"); \n });\n }\n\n sendCancellationMessage(cancelationReason: string) {\n let chatMessage = this.buildChatMessage();\n let model = new ChatCancellationMessage();\n\n model.mensaje = chatMessage;\n model.lenguaje = this.locale.language;\n model.razonCancelacion = cancelationReason;\n model.idEmpresaTemplate = this.virtualConsultationCompanyId ? this.virtualConsultationCompanyId : this.companyId;\n\n this.chatService.sendCancellationMessage(chatMessage.idChat, model).subscribe(result => {\n // No reason to add the cancellation msg here as the chat is already finished\n },\n error => {\n this.baseService.handleServiceError(error, \"Error posting chat cancellation message\"); \n });\n }\n\n buildChatMessage() : ChatConversacionMessage {\n let chatMessage = new ChatConversacionMessage();\n var user = this.loggedUser;\n\n if (!user)\n return null as any;\n\n chatMessage.idChat = this.etapaSolicitudId;\n chatMessage.idEtapaSolicitud = this.etapaSolicitudId;\n chatMessage.idPacienteEmpresaOrigen = user.id;\n chatMessage.idEmpresa = this.virtualConsultationCompanyId ? this.virtualConsultationCompanyId : this.companyId;\n chatMessage.tipo = ChatConversacionMessageType.PersonMessaje;\n chatMessage.idEstado = 1; // pendiente\n chatMessage.valor = this.currentMessage;\n chatMessage.idEmisor = user.id;\n chatMessage.nombreEmisor = user.nombre + \" \" + user.apellido;\n chatMessage.urlImagenEmisor = user.ubicacionLogo;\n chatMessage.fechaEnviado = new Date();\n chatMessage.fechaCreacion = new Date(); // This will be override on server but it is needed on client when adding the message\n \n return chatMessage;\n }\n\n onChatBtnClick() {\n this.chatWrapper.toggleMinimize();\n\n if (!this.chatWrapper.minimized) {\n // Each time the user opens the chat lets scroll to the bottom of the message container\n this.scrollBottom();\n } \n }\n\n scrollBottom() {\n let _this = this;\n let el = this.document.getElementsByClassName(\"chat-msgs-container\")[0];\n\n if (el)\n setTimeout(function() {\n _this.utilsService.scrollBottomWithAnimation(el); \n }, 100); \n }\n\n onMinimizeClick() {\n this.chatWrapper.toggleMinimize();\n }\n \n onScrollUp() {\n // Get message count\n let messageCount = this.chatWrapper.messages.length;\n \n // Load more messages\n this.loadChatMessages(this.virtualAttention.idSolicitud, messageCount, true);\n\n this.chatWrapper.loading = true;\n }\n\n onCancelVirtualAttention() {\n let dialogData = new DialogData();\n dialogData.data = this.virtualAttention;\n\n const dialogRef = this.dialog.open(CancelVirtualAttentionDialogComponent, {\n data: dialogData,\n autoFocus: false //disable auto focus in dialog\n }); \n }\n\n initSignalR() {\n this.signalRService.onConnectionLost().subscribe(m => {\n \n if (!this.chatWrapper)\n return;\n\n // Only show the toast if the previous state was connected\n if (!this.chatWrapper.connectionLost) {\n this.toastr.warning(\n this.translation.translate(\"connectionLostToast.message\"), \n this.translation.translate(\"connectionLostToast.title\"), \n {\n disableTimeOut: true,\n toastClass: \"chat-connection-lost-toast\",\n positionClass: \"toast-top-left\" \n }\n );\n }\n \n this.chatWrapper.onConnectionLost(); \n });\n\n this.signalRService.onConnectionStablished().subscribe(m => {\n \n this.toastr.clear();\n\n if (!this.chatWrapper)\n return;\n\n this.chatWrapper.onConnectionStablished();\n\n // Join group that will receive chat events\n this.signalRService.joinGroup(this.etapaSolicitudId);\n\n // Join group that will receive virtual attention events (like state changes)\n this.signalRService.joinGroup(this.virtualConsultationCompanyId ? this.virtualConsultationCompanyId : this.companyId);\n });\n \n // Init signalR\n this.signalRService.init();\n \n // Subscribe to events\n this.subscribeToSignalREvents();\n }\n\n subscribeToSignalREvents(): void { \n \n // NEW MESSAGE\n this.signalRService.onNewMessageReceived().subscribe((message: ChatConversacionMessageEvent) => { \n // If the message is for this chat AND\n // Is not a user message (the last message the user send)\n if (message && message.IdEtapaSolicitud == this.etapaSolicitudId && (message.Tipo != ChatConversacionMessageType.PersonMessaje || message.IdEmisor != this.loggedUser.id)) {\n // Map entity to VirtualAttention (same properties but ignore upper and lower case)\n let msg = this.baseService.parseObjectDeep(message);\n \n this.chatWrapper.addMessages([msg]); \n \n let hasAgentMessages = this.chatWrapper.hasAgentMessages();\n this.messageBusService.chatLoaded(new ChatLoadedMessage(hasAgentMessages));\n\n // Scroll bottom\n this.scrollBottom();\n } \n }); \n \n // VIRTUAL ATTENTION STATE CHANGE\n this.signalRService.onVirtualAttentionChanged().subscribe((virtualAttention: VirtualAttentionEvent) => {\n if (virtualAttention) {\n this.virtualAttention.idEstado = virtualAttention.IdEstado;\n this.virtualAttention.idResponsableServicio = virtualAttention.IdResponsableServicio;\n this.virtualAttention.nombreResponsableServicio = virtualAttention.NombreResponsableServicio;\n this.virtualAttention.fechaUltimaActualizacionEstado = virtualAttention.FechaUltimaActualizacionEstado;\n this.virtualAttention.fechaFin = virtualAttention.FechaFin;\n \n // Map entity to VirtualAttention (same properties but ignore upper and lower case)\n let vAttention = this.baseService.parseObjectDeep(virtualAttention); \n\n // Update wrapper virtual attention\n this.chatWrapper.virtualAttention = vAttention;\n\n if (virtualAttention.IdEstado == 37) {\n // disable input chat since attention finished\n this.chatWrapper.finishChat();\n this.messageBusService.virtualRequestFinished();\n }\n }\n });\n\n // User Active\n this.signalRService.onUserActive().subscribe((userActive: UserActiveEvent) => {\n if (!this.virtualAttention)\n return;\n \n if (userActive.UserId == this.virtualAttention.idResponsableServicio)\n this.lastAgentActiveDate = userActive.LastActiveUnixDate;\n });\n }\n\n initUserActiveInterval() {\n if (this.userActiveIntervalId)\n return;\n\n if(isPlatformBrowser(this.platformId)) {\n // Run this every 30 seconds\n this.userActiveIntervalId = setInterval(() => {\n \n // If the chat finished we will just clear the interval\n if (!this.virtualAttention) {\n this.clearUserActiveInterval();\n return;\n }\n\n let compId = this.virtualConsultationCompanyId ? this.virtualConsultationCompanyId : this.companyId;\n\n console.log(\"Post user active!!!\");\n\n this.userService.postUserActive(compId, this.virtualAttention.idEtapaSolicitud).subscribe(() => {\n },\n error => {\n this.baseService.handleServiceError(error, \"Error posting user active\"); \n }); \n }, 30 * 1000);\n }\n }\n\n initAgentActiveInterval() {\n if (this.agentActiveIntervalId)\n return;\n\n if(isPlatformBrowser(this.platformId)) {\n // Run this every 30 seconds\n this.agentActiveIntervalId = setInterval(() => {\n this.updateAgentActive(); \n }, 30 * 1000);\n }\n }\n\n updateAgentActive() {\n let tolerance = 90 * 1000; // After 90 seconds without events we will considere the agent as inactive\n let now = new Date().getTime(); \n let diff = now - this.lastAgentActiveDate;\n\n this.isAgentActive = diff <= tolerance;\n }\n\n clearUserActiveInterval() {\n if (this.userActiveIntervalId)\n clearInterval(this.userActiveIntervalId);\n this.userActiveIntervalId = null;\n }\n\n clearAgentActiveInterval() {\n if (this.agentActiveIntervalId)\n clearInterval(this.agentActiveIntervalId);\n this.agentActiveIntervalId = null;\n }\n\n getChatDate(date: Date) {\n return this.baseService.getBasicDateFormat(date, false);\n }\n\n getSymptoms() {\n let symptoms = this.virtualAttention.data.sintomasPaciente.split(\",\");\n let last = symptoms.pop(); \n\n return symptoms.join(\",\") + \" \" + this.and + \" \" + last;\n }\n}\n\nexport class ChatWrapper {\n virtualAttention: VirtualAttention;\n messages: ChatMessageWrapper[] = []; \n user: UserPerson; \n hour: string;\n min: string;\n minimized: boolean = true;\n unreadMessagesCount: number = 0;\n loading = false;\n initialized = false;\n connectionLost = false;\n isVirtualAttentionFinished = false;\n\n constructor(user: UserPerson, va: VirtualAttention) {\n this.user = user;\n this.virtualAttention = va;\n this.messages = [];\n }\n\n addMessages(messages: ChatConversacionMessage[], avoidUnreadCountUpdate: boolean = false, upDirection: boolean = false) { \n \n if (!messages)\n return;\n\n // If we are scrolling up, the service will alway return first the oldest message\n // So in order to add it one by one (at the top) we need to revert the array\n if (upDirection)\n messages = messages.reverse();\n\n // Check if the msg was already added (when adding the msg the same one can came from signalR)\n for(let i = 0; i < messages.length; i++) {\n let msg = null;\n\n if (messages[i].id) {\n msg = this.messages.find(m => m.message.id == messages[i].id);\n }\n \n if (!msg) {\n\n // If the chat is minimized when adding the messages, then add this to the unread counter\n if (this.minimized && !avoidUnreadCountUpdate)\n this.unreadMessagesCount += 1;\n\n if (upDirection)\n this.messages.unshift(new ChatMessageWrapper(this.user, messages[i]));\n else\n this.messages.push(new ChatMessageWrapper(this.user, messages[i]));\n } \n }\n }\n\n getDoctorName() {\n return this.virtualAttention.nombreResponsableServicio? \n this.virtualAttention.nombreResponsableServicio.toLowerCase():\n \"\";\n }\n\n getChatTime() {\n let startTime = new Date(this.virtualAttention.fechaInicio).getTime();\n let now = new Date().getTime();\n let timeDiffInMin = (now - startTime) / (1000 * 60);\n\n if (timeDiffInMin < 60)\n return Math.floor(timeDiffInMin) + \" \" + this.min;\n else\n return Math.floor(timeDiffInMin / 60) + \" \" + this.hour;\n }\n\n isUserBlockMessage(currentMessageIndex: number) {\n if (currentMessageIndex == 0)\n return false;\n\n // Get current and previous msg\n let previous = this.messages[currentMessageIndex - 1];\n let current = this.messages[currentMessageIndex];\n\n // If we need to show the date stamp for this message then it is a new group\n if (this.showDateStamp(currentMessageIndex))\n return false;\n\n // We will only show user msg together if the previous msg was an user message and current is as well\n if (previous.isUserMessage() && current.isUserMessage())\n return true;\n\n return false;\n }\n\n isAgentBlockMessage(currentMessageIndex: number) {\n if (currentMessageIndex == 0)\n return false;\n\n // Get current and previous msg\n let previous = this.messages[currentMessageIndex - 1];\n let current = this.messages[currentMessageIndex];\n\n // If we need to show the date stamp for this message then it is a new group\n if (this.showDateStamp(currentMessageIndex))\n return false;\n\n // We will only show agent msg together if the previous msg was an agent message and current is as well\n if (previous.isAgentMessage() && current.isAgentMessage())\n return true;\n\n return false;\n }\n\n showDateStamp(currentMessageIndex: number) {\n if (currentMessageIndex == 0)\n return true;\n\n // Get current and previous msg\n let previous = new Date(this.messages[currentMessageIndex - 1].message.fechaCreacion);\n let current = new Date(this.messages[currentMessageIndex].message.fechaCreacion);\n \n // If the days are differents, then show the date time stampt\n if (previous.getDate() != current.getDate())\n return true;\n\n return false;\n }\n\n toggleMinimize() {\n this.minimized = !this.minimized;\n\n // If the user open the chat let mark all msg as readed\n if (!this.minimized)\n this.unreadMessagesCount = 0;\n }\n\n minimize() {\n this.minimized = true;\n }\n\n showMessageTime(currentMessageIndex: number) {\n // Only show the time for the last message\n return currentMessageIndex === (this.messages.length - 1);\n }\n\n isWaitingForAttention() {\n // It will be waiting for attention ONLY if it does not have any message sent from the agent.\n let isWaiting = (!this.messages.find(m => m.isAgentMessage()));\n\n return isWaiting;\n }\n\n isWaitingForTriage() {\n return this.virtualAttention.idEstado == 100;\n }\n\n requestIsFinished() : boolean {\n return this.virtualAttention.idEstado == 37;\n }\n\n getFirstMessage() : ChatConversacionMessage {\n return this.messages[0].message;\n }\n\n show() {\n if (this.initialized)\n this.minimized = false;\n }\n\n onConnectionStablished() {\n this.connectionLost = false;\n }\n\n onConnectionLost() {\n this.connectionLost = true;\n }\n\n hasAgentMessages() {\n return this.messages.find(m => m.isAgentMessage()) != null;\n }\n\n finishChat() {\n this.isVirtualAttentionFinished = true;\n }\n}\n\nexport class ChatMessageWrapper {\n message: ChatConversacionMessage;\n user: UserPerson; \n\n constructor(user: UserPerson, message: ChatConversacionMessage) {\n this.user = user;\n this.message = message;\n }\n\n isUserMessage() {\n return this.message.idEmisor == this.user.id && this.message.tipo == ChatConversacionMessageType.PersonMessaje\n }\n\n isAgentMessage() {\n return this.message.idEmisor != this.user.id && this.message.tipo == ChatConversacionMessageType.PersonMessaje;\n } \n}","
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{appointment.appointmentStateDisplayName}}\r\n \r\n\r\n \r\n \r\n \r\n {{appointment.appointmentStateDisplayName}}\r\n \r\n \r\n \r\n {{appointment.appointmentStateDisplayName}}\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{'shared.cliniwebAppointment.text21' | translate:locale.language}}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {{'shared.cliniwebAppointment.text3' | translate:locale.language}}\r\n \r\n \r\n \r\n\r\n \r\n \r\n
{{appointment.appointmentFormattedDate}}, {{appointment.fechaRequerido | date:'h:mm a' | lowercase}}
\r\n\r\n
\r\n \r\n \r\n \r\n {{appointment.nombreResponsableServicio}} \r\n \r\n \r\n \r\n {{appointment.locationDescription}} \r\n \r\n \r\n \r\n {{'shared.cliniwebAppointment.text11' | translate:locale.language}}\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{'shared.cliniwebAppointment.text4' | translate:locale.language}}\r\n \r\n \r\n \r\n
\r\n\r\n
","import { Component, Inject, OnInit, ViewEncapsulation, Input, OnDestroy, Output, EventEmitter, PLATFORM_ID } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { Directory } from 'src/app/shared/models/systems/directory.model';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { Dependent } from 'src/app/shared/models/people/dependent.model';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { AppointmentCancelationRouteDialogModel, AppointmentSummaryRouteDialogModel, PublicProfileRouteDialogModel, RescheduleAppointmentRouteDialogModel } from '../../dialogs/route-dialog/route-dialog.component';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { PublicProfileVersion } from 'src/app/shared/models/systems/portal-phr.model';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { PublicProfileAvatarComponentModel } from '../../public-profile-avatar/public-profile-avatar.component';\r\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-appointment',\r\n templateUrl: './cliniweb-appointment.component.html',\r\n styleUrls: ['./cliniweb-appointment.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('CliniwebAppointmentsComponent')\r\nexport class CliniwebAppointmentsComponent implements OnInit, OnDestroy, IControlComponent {\r\n data: FormComponentData;\r\n inProgressState: string;\r\n appointment : CliniwebAppointmentModel;\r\n\r\n //subscribes\r\n private ngUnsubscribe = new Subject();\r\n \r\n // Input / Output\r\n @Input() loading : boolean = false;\r\n @Input() directory : Directory;\r\n @Input() dependents : Dependent[];\r\n @Input() loggedInUser: UserPerson;\r\n @Input() popupView: boolean = false; \r\n @Input() set app(value: PatientAppointment) {\r\n if (!value)\r\n return;\r\n\r\n this.appointment = value as CliniwebAppointmentModel;\r\n\r\n this.avatarModel = new PublicProfileAvatarComponentModel();\r\n this.avatarModel.personId = this.appointment.idResponsableServicio;\r\n this.avatarModel.avatarUrl = this.appointment.urlAvatarResponsableServicio;\r\n this.avatarModel.fullName = this.appointment.nombreResponsableServicio;\r\n this.avatarModel.sex = this.appointment.sexoResponsableServicio;\r\n this.avatarModel.profileType = PublicProfileType.Doctor;\r\n this.avatarModel.defaultBorderColor = \"var(--grayscale11)\"; \r\n\r\n this.setAppointmentExtraData(this.appointment); \r\n };\r\n @Output() onClose: EventEmitter = new EventEmitter();\r\n\r\n translations = {\r\n day: \"\",\r\n hour: \"\",\r\n min: \"\",\r\n me: \"\",\r\n other: \"\",\r\n son: \"\",\r\n daughter: \"\",\r\n father: \"\",\r\n mother: \"\",\r\n completedStateName: \"\",\r\n notCompletedStateName: \"\",\r\n cancelledStateName: \"\",\r\n unconfirmedStateName: \"\",\r\n confirmedStateName: \"\"\r\n };\r\n avatarModel: PublicProfileAvatarComponentModel;\r\n \r\n isBrowser: boolean;\r\n\r\n constructor(\r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private publicProfileService: PublicProfileService,\r\n private routeDialogService: RouteDialogService,\r\n private userService: UserService,\r\n private breakpointObserver: BreakpointObserver,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.translations.day = this.translation.translate('days'); \r\n this.translations.hour = this.translation.translate('hours'); \r\n this.translations.min = this.translation.translate('minutes'); \r\n this.translations.me = this.translation.translate('me');\r\n this.translations.other = this.translation.translate('other');\r\n this.translations.son = this.translation.translate('son');\r\n this.translations.daughter = this.translation.translate('daughter');\r\n this.translations.father = this.translation.translate('father');\r\n this.translations.mother = this.translation.translate('mother');\r\n this.translations.completedStateName = this.translation.translate('shared.cliniwebAppointment.text8'); \r\n this.translations.notCompletedStateName = this.translation.translate('shared.cliniwebAppointment.text9');\r\n this.translations.cancelledStateName = this.translation.translate('shared.cliniwebAppointment.text10');\r\n this.translations.unconfirmedStateName = this.translation.translate('shared.cliniwebAppointment.text13'); \r\n this.translations.confirmedStateName = this.translation.translate('shared.cliniwebAppointment.text14'); \r\n }\r\n }); \r\n \r\n if (!this.loading)\r\n this.setAppointmentExtraData(this.appointment); \r\n } \r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n setAppointmentExtraData(app: CliniwebAppointmentModel) {\r\n app.patientFirstName = this.getName(app);\r\n app.locationDescription = this.getLocationDescription(app);\r\n app.patientRelationship = this.getPatientRelationship(app);\r\n app.doctorAvatarUrl = this.getAvatarUrl(app);\r\n\r\n app.appointmentExpired = this.isAppointmentExpired(app);\r\n app.appointmentFormattedDate = this.getAppointmentDateStr(app.fechaRequerido, !app.appointmentExpired);\r\n \r\n if (!app.appointmentExpired && (app.idEstado == 2 || app.idEstado == 22 || app.idEstado == 23)) {\r\n app.description = \r\n this.translation.translate('shared.cliniwebAppointment.text1', { \r\n especialidadResponsableServicio: app.especialidadResponsableServicio, \r\n nombreResponsableServicio: app.patientFirstName}); \r\n }\r\n else {\r\n app.description = \r\n this.translation.translate('shared.cliniwebAppointment.text18', { \r\n especialidadResponsableServicio: app.especialidadResponsableServicio, \r\n nombreResponsableServicio: app.patientFirstName});\r\n } \r\n \r\n app.teleconsultation = this.isTeleconsultation(app);\r\n\r\n if (app.teleconsultation)\r\n app.teleconsultationUrl = this.buildTeleconsultationLink(app);\r\n\r\n app.appointmentStateDisplayName = this.getAppointmentStateName(app);\r\n app.appointmentStateClassName = this.getAppointmentStateClassName(app);\r\n app.appointmentStateIconClassName = this.getAppointmentStateIconClassName(app);\r\n }\r\n\r\n getPatientFirstName(item: CliniwebAppointmentModel) {\r\n return item.nombrePaciente.split(\" \")[0];\r\n }\r\n\r\n getName(app: CliniwebAppointmentModel) {\r\n if (app.idPacienteOrigen == this.loggedInUser.id) {\r\n return this.loggedInUser.nombre;\r\n }\r\n\r\n let dependent = this.dependents.find(d => d.idPersona == app.idPacienteOrigen);\r\n if (dependent) {\r\n return dependent?.nombre;\r\n } \r\n\r\n return this.getPatientFirstName(app);\r\n }\r\n\r\n getPatientRelationship(app: CliniwebAppointmentModel) : string {\r\n let relationship = this.translations.other;\r\n\r\n if (app.idPacienteOrigen != this.loggedInUser.id) {\r\n // Search for dependent\r\n let dependent = this.dependents.find(d => d.idPersona == app.idPacienteOrigen);\r\n \r\n relationship = this.userService.getDependentRelationshipName(dependent); \r\n }\r\n else {\r\n relationship = this.translations.me;\r\n }\r\n\r\n return relationship;\r\n } \r\n\r\n getLocationDescription(item : CliniwebAppointmentModel) {\r\n /*let desc = item.direccionLocalidad;\r\n\r\n if (!desc)\r\n desc = item.nombreLocalidad; \r\n\r\n return desc;*/\r\n\r\n return item.nombreLocalidad;\r\n }\r\n\r\n getAvatarUrl(item : CliniwebAppointmentModel) {\r\n let avatarUrl = item.urlAvatarResponsableServicio;\r\n\r\n if (!avatarUrl)\r\n avatarUrl = \"/assets/images/avatar_male_doctor.svg\";\r\n\r\n return avatarUrl;\r\n }\r\n\r\n getAppointmentDateStr(date: Date, includeYear: boolean) {\r\n return this.baseService.getBasicDateFormat(date, includeYear, \" \");\r\n }\r\n\r\n isAppointmentExpired(item : CliniwebAppointmentModel) {\r\n let now = new Date().getTime();\r\n let appDate = new Date(item.fechaRequerido).getTime();\r\n\r\n return appDate <= now;\r\n }\r\n\r\n getAppointmentRemainingTime(item : CliniwebAppointmentModel) {\r\n const dayDiff = 60 * 60 * 24;\r\n const hrDiff = 60 * 60;\r\n let now = new Date();\r\n let appDate = new Date(item.fechaRequerido);\r\n let timeDiff = (appDate.getTime() - now.getTime()) / 1000;\r\n let diffStr = \"\";\r\n\r\n if (timeDiff <= 0) {\r\n diffStr = this.inProgressState;\r\n }\r\n else if (timeDiff > dayDiff) {\r\n diffStr = (Math.ceil(timeDiff / dayDiff)) + \" \" + this.translations.day;\r\n }\r\n else if (timeDiff > hrDiff) {\r\n diffStr = (Math.floor(timeDiff / hrDiff)) + \" \" + this.translations.hour;\r\n }\r\n else {\r\n diffStr = (Math.floor(timeDiff / 60)) + \" \" + this.translations.min;\r\n }\r\n\r\n return diffStr;\r\n }\r\n\r\n isTeleconsultation(item : CliniwebAppointmentModel) : boolean {\r\n return (item.teleconsulta != undefined && item.teleconsulta.toLocaleUpperCase() === \"S\");\r\n }\r\n\r\n getAppointmentStateName(app: CliniwebAppointmentModel) : string {\r\n let stateName = app.nombreEstado; \r\n \r\n if (this.isAppointmentExpired(app)) {\r\n // Cancelado = 7\r\n // No asistio = 28\r\n if (app.idEstado != 7 && app.idEstado != 28)\r\n stateName = this.translation.translate('shared.cliniwebAppointment.text19');\r\n }\r\n else {\r\n // Cobrado = 3\r\n // Sin Cobrar = 27\r\n if (app.idEstado == 3 || app.idEstado == 27)\r\n stateName = this.translation.translate('shared.cliniwebAppointment.text20');\r\n \r\n }\r\n \r\n return stateName;\r\n }\r\n\r\n getAppointmentStateClassName(app: CliniwebAppointmentModel) : string {\r\n let stateClassName = \"\";\r\n \r\n if (this.isAppointmentExpired(app)) {\r\n if (app.idEstado == 7)\r\n stateClassName = \"cancelled\";\r\n else if (app.idEstado == 28)\r\n stateClassName = \"not-completted\"; \r\n }\r\n else {\r\n if (app.idEstado == 23 || app.idEstado == 24 || app.idEstado == 30)\r\n stateClassName = \"confirmed\";\r\n else if (app.idEstado == 7)\r\n stateClassName = \"cancelled\";\r\n else if (app.idEstado == 28)\r\n stateClassName = \"not-completted\";\r\n else if (app.idEstado == 2)\r\n stateClassName = \"not-confirmed\";\r\n else if (app.idEstado == 22)\r\n stateClassName = \"pending\";\r\n }\r\n\r\n return stateClassName;\r\n }\r\n\r\n getAppointmentStateIconClassName(app: CliniwebAppointmentModel) : string {\r\n let stateIconClass = \"phr-iconset-PHR-date-2\";\r\n \r\n if (this.isAppointmentExpired(app)) {\r\n if (app.idEstado == 7 || app.idEstado == 28)\r\n stateIconClass = \"phr-iconset-close-circle\";\r\n }\r\n else {\r\n stateIconClass = \"phr-iconset-validacion\";\r\n\r\n if (app.idEstado == 7 || app.idEstado == 28)\r\n stateIconClass = \"phr-iconset-close-circle\";\r\n else if (app.idEstado == 22 || app.idEstado == 2)\r\n stateIconClass = \"phr-iconset-alert\";\r\n else if (app.idEstado == 3 || app.idEstado == 27)\r\n stateIconClass = \"phr-iconset-PHR-date-2\";\r\n } \r\n \r\n return stateIconClass;\r\n }\r\n\r\n buildTeleconsultationLink(item : CliniwebAppointmentModel) {\r\n return this.directory.url + \"/meet/\" + item.teleconsultaId;\r\n } \r\n \r\n onNewAppointmentClick() { \r\n this.router.navigate([\"/doctores\"]);\r\n }\r\n\r\n onAppointmentViewMoreClick(appointment: CliniwebAppointmentModel) {\r\n let routeDialogModel = new AppointmentSummaryRouteDialogModel();\r\n const isMobile: boolean = this.breakpointObserver.isMatched('(max-width: 800px)');\r\n if (isMobile) routeDialogModel.headerName = 'DefaultBackHeaderComponent';\r\n routeDialogModel.route = \"citas/\" + appointment.idEtapaSolicitud;\r\n //routeDialogModel.state = null;\r\n \r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n openVideConsultationLink(link: string) {\r\n if(this.isBrowser)\r\n window.open(link, \"_blank\");\r\n }\r\n\r\n onNavigateWithWaze(appointment: CliniwebAppointmentModel) {\r\n if(this.isBrowser){\r\n let coordinates = appointment.coordenadasLocalidad.replace(\";\", \",\");\r\n let url = \"https://www.waze.com/ul?ll=\" + coordinates + \"&navigate=yes&zoom=17\";\r\n \r\n window.open(url, \"_blank\");\r\n } \r\n }\r\n\r\n onCancelAppointment(appointment: CliniwebAppointmentModel) {\r\n let routeDialogModel = new AppointmentCancelationRouteDialogModel();\r\n routeDialogModel.route = \"citas/cancelar/\" + appointment.idEtapaSolicitud;\r\n routeDialogModel.state = null;\r\n\r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n onUnconfirmedAppointmentClick() {\r\n let dialogData = new DialogData();\r\n \r\n dialogData.title = \"\";\r\n dialogData.message = this.translation.translate(\"shared.cliniwebAppointment.text15\"); \r\n dialogData.confirmText = this.translation.translate(\"shared.cliniwebAppointment.text16\"); \r\n dialogData.showHeaderIcon = false;\r\n dialogData.headerIconClass = \"phr-iconset-info\"; \r\n dialogData.showCancelButton = false;\r\n dialogData.cancelText = \"\";\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: ['confirm-logout-dialog', 'confirm-logout-animation-in', \"unconfirmed-appointment-info-dialog\"]\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(accepted => {\r\n \r\n });\r\n }\r\n \r\n onReScheduleAppointment(item : CliniwebAppointmentModel) {\r\n this.goToPublicProfile(item); \r\n }\r\n\r\n closePopupView() {\r\n this.onClose.emit();\r\n }\r\n\r\n goToPublicProfile(item : CliniwebAppointmentModel) {\r\n // If the doctor does not have a public profile\r\n if (!item.identificadorPerfilPublico) {\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate(\"shared.pastAppointments.text4\");\r\n dialogData.message = this.translation.translate(\"shared.pastAppointments.text5\");\r\n dialogData.confirmText = this.translation.translate(\"shared.pastAppointments.text6\");\r\n dialogData.showCancelButton = false;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData\r\n });\r\n }\r\n else {\r\n let publicProfileVersion = this.baseService.getPublicProfileVersion();\r\n \r\n if (publicProfileVersion == PublicProfileVersion.V1) {\r\n let url = this.publicProfileService.getPublicProfileUrl(item.identificadorPerfilPublico); \r\n this.router.navigate([url], { queryParams: {rs: true} });\r\n }\r\n else {\r\n /*let routeDialogModel = new RescheduleAppointmentRouteDialogModel();\r\n routeDialogModel.route = \"perfil/reprogramar/\" + item.identificadorPerfilPublico;\r\n routeDialogModel.state = null;*/\r\n \r\n let url = this.publicProfileService.getPublicProfileUrl(item.identificadorPerfilPublico);\r\n let routeDialogModel = new PublicProfileRouteDialogModel();\r\n routeDialogModel.route = url;\r\n \r\n this.routeDialogService.openDialog(routeDialogModel);\r\n } \r\n } \r\n }\r\n\r\n}\r\n\r\nexport class CliniwebAppointmentModel extends PatientAppointment {\r\n appointmentExpired: boolean = false;\r\n teleconsultation: boolean = false;\r\n appointmentFormattedDate: string;\r\n description: string;\r\n patientFirstName: string;\r\n locationDescription: string;\r\n patientRelationship: string;\r\n doctorAvatarUrl: string;\r\n \r\n appointmentStateDisplayName: string;\r\n appointmentStateClassName: string;\r\n appointmentStateIconClassName: string;\r\n teleconsultationUrl: string;\r\n}\r\n\r\n\r\n","
\n
\n
\n
\n
\n \n
\n {{'shared.companyLogo.directoryName' | translate:locale.language:{ companyName: companyName } }}\n
\n
\n
\n
\n \n
\n \n {{'shared.companyLogo.allianceText' | translate:locale.language }}\n \n \n \n \n
\n
\n
","import { Component, ChangeDetectorRef, Inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\n\n@Component({\n selector: 'app-company-logo',\n templateUrl: './company-logo.component.html',\n styleUrls: ['./company-logo.component.css']\n})\nexport class CompanyLogoComponent implements OnInit, OnDestroy {\n private ngUnsubscribe = new Subject();\n isLicensed: boolean;\n showCliniwebLogo: boolean;\n companyName: string;\n companyLogo:string;\n loading:boolean = true;\n isCliniwebPhr:boolean = false;\n\n companyLogos:{ [key: string]: string } = {\n 'town-center':'assets/images/logos/townCenter.png',\n 'mapfre': 'assets/images/logos/mapfre.png',\n 'hospital-paitilla': 'assets/images/logos/paitilla-round.png',\n 'pacifica-salud-phr': 'assets/images/logos/PuntaPacifica.png',\n 'hsantafe-phr': 'assets/images/logos/HSantaFe.png'\n , 'chpanamericano-phr': 'assets/images/logos/chpanamericano-phr.png',\n\t'chsf-phr': 'assets/images/logos/chsf-phr.png',\n 'thepanamaclinic-phr': 'assets/images/logos/thepanamaclinic-phr.png',\n\t'cmcaribe-phr': 'assets/images/logos/cmcaribe-phr.png',\n\t'hchiriqui-phr': 'assets/images/logos/hchiriqui-phr.png',\n\t'cmpaitilla-phr': 'assets/images/logos/cmpaitilla-phr.png',\n\t'hospital-nacional-phr': 'assets/images/logos/hospital-nacional-phr.png'};\n \n @Input() showCompanyImage:boolean = false;\n\n constructor(\n private baseService: BaseService,\n private cd: ChangeDetectorRef,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n ) { }\n\n ngOnInit(): void {\n this.isCliniwebPhr = this.baseService.isCliniwebCompany();\n\n if(this.isCliniwebPhr){\n this.loading = false;\n this.isLicensed = true;\n }\n else{\n this.baseService.isLicensedCompany()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result=>{\n this.loading = false;\n this.isLicensed = result;\n this.companyName = this.baseService.getDirectoryTitle();\n this.companyLogo = this.getCompanyLogoValueByPartialKey(this.baseService.getDirectoryClass());\n setTimeout(() => this.cd.detectChanges(), 100);\n });\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n private getCompanyLogoValueByPartialKey(partialKey: string): string {\n for (const key in this.companyLogos) {\n if (key.includes(partialKey)) {\n return this.companyLogos[key];\n }\n }\n return '';\n }\n}\n","
\n {{ 'shared.countryForm.title' | translate:locale.language }}\n\n
\n \n \n \n {{ availableCountry.nombreI18n | i18nText:locale.language }}\n \n \n \n \n {{ 'shared.countryForm.countryRequired' | translate:locale.language }}\n \n \n \n
\n \n
\n
\n
","import { Component, EventEmitter, Inject, Input, OnInit, Output } from '@angular/core';\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\nimport { TerritorialDivision } from '../../models/systems/territorial-division.model';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'app-country-form',\n templateUrl: './country-form.component.html',\n styleUrls: ['./country-form.component.css']\n})\nexport class CountryFormComponent implements OnInit {\n\n availableCountries: TerritorialDivision[] = [];\n\n countryForm: FormGroup;\n loading:boolean = false;\n submitted: boolean = false;\n error: string;\n\n countryIdSelected:number;\n\n @Input() errorObs: Observable;\n @Input() country: TerritorialDivision | undefined; \n @Output() countrySelected: EventEmitter = new EventEmitter();\n\n constructor(\n private territorialDivisionService: TerritorialDivisionsService,\n private formBuilder: FormBuilder,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnInit(): void {\n if(this.errorObs){\n this.errorObs.subscribe(message=>{\n this.loading = false;\n \n this.error = message;\n });\n }\n\n this.availableCountries = this.territorialDivisionService.getAvailableCountries();\n\n // si el pais no esta en el listado de paises disponibles, se debe seleccionar la opcion \"Otros\"\n if(this.country && !this.availableCountries.find(c => c.id == this.country?.id)){\n this.country = this.availableCountries.find(c => c.id == 1);\n }\n\n if(this.country){\n this.countryIdSelected = this.country.id;\n }\n\n this.countryForm = this.formBuilder.group(\n {\n country: [this.countryIdSelected, [Validators.required]]\n }\n );\n }\n\n onSubmit(){\n this.submitted = true;\n\n if(this.countryForm.invalid)\n return;\n\n this.loading = true;\n\n let countrySelected = this.availableCountries.find(c => c.id == this.countryForm.controls.country.value);\n\n this.countrySelected.emit(countrySelected);\n }\n}\n","
\n

{{ label }}

\n
\n \n \n {{day}}\n \n \n {{ errors?.maxDate?.message | translate:locale.language }}\n {{ errors?.minDate?.message | translate:locale.language }}\n {{ errors?.required ? ('shared.datepicker.required' | translate:locale.language) : '' }}\n \n \n \n \n {{month.nombre}}\n \n \n \n \n {{year}}\n \n \n
\n
","import { Component, Inject, Input, OnDestroy, ViewEncapsulation, forwardRef } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormBuilder, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator, Validators } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { maxDate, minDate } from '../../validators/max-min-date.validator';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport * as moment from 'moment';\nimport { MAT_SELECT_CONFIG } from '@angular/material/select';\n\n@Component({\n selector: 'app-datepicker-flat-field',\n templateUrl: './datepicker-flat-field.component.html',\n styleUrls: ['./datepicker-flat-field.component.css'],\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatepickerFlatFieldComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => DatepickerFlatFieldComponent),\n multi: true\n },\n {\n provide: MAT_SELECT_CONFIG,\n useValue: { overlayPanelClass: 'datepicker-flat-field-select' }\n }\n ]\n})\nexport class DatepickerFlatFieldComponent implements ControlValueAccessor, OnDestroy, Validator {\n\n @Input() errorMessage: string | null = '';\n @Input() label: string | null = '';\n @Input() maxDate: Date = new Date();\n @Input() minDate: Date | null;\n\n days = Array.from({ length:31 }, (_, i) => i + 1);\n formulario = this.fb.group({\n day: [null, [Validators.required]],\n month: [null, [Validators.required]],\n year: [null, [Validators.required]],\n });\n months: {id: number, nombre: string}[] = [];\n years = Array.from({ length: 120 }, (_, i) => (-(new Date().getFullYear()) + i) * -1);\n\n private onChange: (value: any) => void = () => {};\n private onTouched: () => void = () => {};\n private ngUnsubscribe = new Subject();\n thisControl: AbstractControl;\n\n get errors(): ValidationErrors | null | undefined { return this.formulario.get('day')?.errors; }\n get isTouched(): boolean { \n if (!this.formulario.touched && this.thisControl.touched) {\n this.formulario.markAllAsTouched();\n if (this.thisControl.errors) this.setErrors(this.thisControl.errors);\n }\n return this.thisControl?.touched;\n }\n\n constructor(@Inject(L10N_LOCALE) public locale: L10nLocale, private fb: FormBuilder) {\n moment.locale(locale.language);\n this.months = Array.from({ length: 12 }, this.mapMonth);\n this.formulario.valueChanges.pipe(takeUntil(this.ngUnsubscribe)).subscribe({next: this.onSelectChanges.bind(this)});\n }\n\n private mapMonth(_: number, i: number): {id: number, nombre: string} {\n const fecha = moment(new Date(0, i)) ;\n const monthName = fecha.format('MMMM')\n return { id : i, nombre: monthName.charAt(0).toUpperCase() + monthName.slice(1) };\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n if (isDisabled) {\n this.formulario.disable();\n } else {\n this.formulario.enable();\n }\n }\n\n writeValue(value: Date | moment.Moment | string): void {\n let dateResult: Date | moment.Moment = typeof value == 'string' ? new Date(value) : value;\n this.updateForm(dateResult);\n }\n\n onSelectChanges(args: DatePickerFlatField): void {\n if (this.isChanged(args)) {\n let dateResult = new Date(args.year, args.month, args.day, 5);\n if (args.day != dateResult.getDate() && args.month != dateResult.getMonth()) {\n this.setErrorsToThisControl();\n } else {\n this.changesThisControl(dateResult)\n }\n }\n }\n\n private isChanged(args: DatePickerFlatField): boolean {\n return !!args.day && isFinite(args.month) && args.month >= 0 && !!args.year;\n }\n\n private setErrorsToThisControl(): void {\n this.setErrors({ maxDate: { valid: false, message: 'shared.datepicker.maxDate'} });\n this.thisControl?.setErrors({ maxDate: { valid: false, message: 'shared.datepicker.maxDate'} });\n this.thisControl?.markAsTouched();\n }\n\n private changesThisControl(dateResult: Date): void {\n this.onChange(dateResult);\n this.onTouched();\n }\n\n private updateForm(value: Date | moment.Moment, emitEvent = true): void {\n let day: number | null = null;\n let month: number | null = null;\n let year: number | null = null;\n\n if (value) {\n day = value instanceof Date ? value.getDate() : (value as moment.Moment).date();\n month = value instanceof Date ? value.getMonth() : (value as moment.Moment).month();\n year = value instanceof Date ? value.getFullYear() : (value as moment.Moment).year();\n }\n \n const formValue = {day, month, year };\n \n this.formulario.setValue(formValue, { onlySelf: !emitEvent});\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n this.thisControl = control;\n let val: ValidationErrors | null = null;\n val = maxDate(this.maxDate)(control);\n if (!val) val = minDate(this.minDate)(control);\n return this.setErrors(val);\n }\n\n private setErrors(errors: ValidationErrors | null, emitEvent = true) : ValidationErrors | null {\n this.formulario.controls.day.setErrors(errors, { emitEvent });\n this.formulario.controls.month.setErrors(errors, { emitEvent });\n this.formulario.controls.year.setErrors(errors, { emitEvent });\n if (errors) {\n this.formulario.controls.day.markAsTouched({ onlySelf: emitEvent });\n this.formulario.controls.month.markAsTouched({ onlySelf: emitEvent });\n this.formulario.controls.year.markAsTouched({ onlySelf: emitEvent });\n }\n return errors;\n }\n\n}\n\nexport interface DatePickerFlatField {\n day: number, month: number, year: number\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\r\nimport * as moment from \"moment\";\r\n\r\nexport function maxDate(maxDate: Date | null): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (control.value && maxDate ) {\r\n const fecha1 = moment(control.value).startOf('day');\r\n const fecha2 = moment(maxDate).startOf('day');\r\n if (fecha1.isAfter(fecha2)) {\r\n return {\r\n maxDate: { valid: false, message: 'shared.datepicker.maxDate'}\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n\r\nexport function minDate(minDate: Date | null): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (control.value && minDate ) {\r\n const fecha1 = moment(control.value).startOf('day');\r\n const fecha2 = moment(minDate).startOf('day');\r\n if (fecha1.isBefore(fecha2)) {\r\n return {\r\n minDate: { valid: false, message: 'shared.datepicker.minDate'}\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}","
\r\n \r\n\r\n
0\">\r\n {{'shared.editDependent.text1' | translate:locale.language}} \r\n
\r\n
\r\n {{'shared.editDependent.text16' | translate:locale.language}} \r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n {{'shared.editDependent.text3' | translate:locale.language}}\r\n \r\n {{'shared.editDependent.text4' | translate:locale.language}}\r\n \r\n
\r\n
\r\n \r\n {{'shared.editDependent.text5' | translate:locale.language}}\r\n \r\n {{'shared.editDependent.text6' | translate:locale.language}}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n {{'man' | translate:locale.language}}\r\n \r\n \r\n \r\n {{'women' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text10' | translate:locale.language}}\r\n
\r\n
\r\n
\r\n \r\n {{'shared.editDependent.text12' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text13' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text14' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text19' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text20' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text21' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text22' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editDependent.text18' | translate:locale.language}}\r\n \r\n\r\n \r\n {{'shared.editDependent.text15' | translate:locale.language}}\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n
","import { Component, ElementRef, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { ViewDependentModelDto } from '../view-dependent/view-dependent.component';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { DependentRequest } from 'src/app/shared/models/people/dependent.model';\r\nimport { Subject } from 'rxjs';\r\nimport { CloseRouteDialogMessage, MessageBusService, NavigationBackMessage, OpenSnackBarMessage, SnackBarType } from 'src/app/core/services/message-bus.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { AvatarUploadComponentOptions, AvatarUploadedFileModel } from '../../avatar-upload/avatar-upload.component';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { UtilsService } from 'src/app/core/services/utils.service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-dependent-user',\r\n templateUrl: './edit-dependent.component.html',\r\n styleUrls: ['./edit-dependent.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n\r\nexport class EditDependentComponent implements OnInit, OnDestroy {\r\n\r\n private ngUnsubscribe = new Subject();\r\n \r\n dependent: ViewDependentModelDto;\r\n formGroup: FormGroup;\r\n formSubmitted: boolean = false;\r\n saving: boolean = false;\r\n translations = {\r\n other: \"\",\r\n son: \"\",\r\n daughter: \"\",\r\n father: \"\",\r\n mother: \"\",\r\n language: \"\",\r\n man: \"\",\r\n women: \"\" \r\n };\r\n avatarUploadOptions : AvatarUploadComponentOptions;\r\n minDate: Date;\r\n maxDate: Date;\r\n \r\n constructor(\r\n private userService: UserService, \r\n private route: ActivatedRoute,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n private formBuilder: FormBuilder,\r\n private messageBusService: MessageBusService,\r\n private router: Router,\r\n @Inject(DOCUMENT) private document: Document,\r\n private el: ElementRef,\r\n private dialog: MatDialog,\r\n private utilsService: UtilsService\r\n ) {\r\n this.avatarUploadOptions = new AvatarUploadComponentOptions();\r\n this.avatarUploadOptions.requiredFileType = \"image/png,image/jpeg\";\r\n this.avatarUploadOptions.selectFileLabel = \"aƱadir foto\";\r\n this.avatarUploadOptions.changeFileLabel = \"Editar\";\r\n this.avatarUploadOptions.showFileOnceUpload = true;\r\n this.avatarUploadOptions.edit = true;\r\n\r\n const currentYear = new Date().getFullYear();\r\n this.minDate = new Date(currentYear - 120, 0, 1);\r\n this.maxDate = new Date();\r\n }\r\n\r\n ngOnInit(): void {\r\n const dependentIdQs = this.route.snapshot.paramMap.get('id');\r\n\r\n if(!dependentIdQs) {\r\n // TODO: redirect to home???\r\n return;\r\n }\r\n\r\n let dependentId = parseInt(dependentIdQs);\r\n\r\n this.formGroup = this.formBuilder.group({ \r\n nameControl: ['', [Validators.required, Validators.maxLength(200)]],\r\n lastNameControl: ['', [Validators.required, Validators.maxLength(200)]],\r\n birthDateControl: ['', Validators.required],\r\n sexControl: ['', Validators.required],\r\n relationshipType: ['', Validators.required] \r\n });\r\n\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.translations.other = this.translation.translate('shared.profileMenu.text8');\r\n this.translations.son = this.translation.translate('shared.profileMenu.text9');\r\n this.translations.daughter = this.translation.translate('shared.profileMenu.text10');\r\n this.translations.father = this.translation.translate('shared.profileMenu.text11');\r\n this.translations.mother = this.translation.translate('shared.profileMenu.text12');\r\n this.translations.man = this.translation.translate('man');\r\n this.translations.women = this.translation.translate('women');\r\n \r\n this.avatarUploadOptions.selectFileLabel = this.translation.translate('shared.viewUser.text8');\r\n this.avatarUploadOptions.changeFileLabel = this.translation.translate('shared.viewUser.text3');\r\n this.avatarUploadOptions.changePictureLabel = this.translation.translate('shared.viewUser.text9');\r\n this.avatarUploadOptions.deleteFileLabel = this.translation.translate('shared.viewUser.text10');\r\n }\r\n });\r\n\r\n this.userService.getUserDependents()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(d => {\r\n let dependents = d as ViewDependentModelDto[];\r\n\r\n // Lookup dependent by Id\r\n var dependent = dependents.find(d => d.id == dependentId); \r\n\r\n if (!dependent)\r\n this.dependent = new ViewDependentModelDto();\r\n else \r\n this.dependent = dependent as ViewDependentModelDto;\r\n\r\n this.setUpDependentExtraData();\r\n\r\n this.loadDependentFormData(this.dependent);\r\n });\r\n\r\n // On Header Back click\r\n this.messageBusService.onNavigateBack().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.onNavigateBackNext.bind(this));\r\n\r\n }\r\n\r\n private onNavigateBackNext(_: NavigationBackMessage): void {\r\n if (this.dependent.id > 0) {\r\n if (this.formGroup.dirty && this.formGroup.touched) {\r\n this.beforeCloseAlert();\r\n } else\r\n this.router.navigate(['configuracion/dependiente/' + this.dependent.id]);\r\n } else \r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n }\r\n\r\n private beforeCloseAlert(): void {\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate(\"shared.editDependent.cancelTitle\");\r\n dialogData.message = this.translation.translate(\"shared.editDependent.cancelMessage\");\r\n dialogData.confirmText = this.translation.translate(\"shared.editDependent.cancelConfirmText\"); \r\n dialogData.cancelText = this.translation.translate(\"shared.editDependent.cancelCancelText\");\r\n dialogData.headerIconClass = 'phr-iconset-alert';\r\n dialogData.showHeaderIcon = true;\r\n dialogData.showCancelButton = true;\r\n dialogData.loadLicense = true;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: 'cancel-edit-person-dialog'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(accepted => {\r\n\r\n if(accepted){\r\n this.router.navigate(['configuracion/dependiente/' + this.dependent.id]);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n this.messageBusService.refreshProfileMenu();\r\n }\r\n\r\n setUpDependentExtraData() {\r\n if (!this.dependent)\r\n return;\r\n\r\n this.dependent.fullName = this.dependent.nombre + \" \" + this.dependent.apellido; \r\n this.dependent.relationshipName = this.userService.getDependentRelationshipName(this.dependent);\r\n\r\n let feNacimiento = this.dependent.fechaNacimiento? new Date(this.dependent.fechaNacimiento) : null;\r\n\r\n /*if (!this.dependent.ubicacionLogo)\r\n this.dependent.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(feNacimiento, this.dependent.sexo);*/\r\n\r\n if (this.dependent.sexo && this.dependent.sexo != \"9\") {\r\n if (this.dependent.sexo.toLocaleLowerCase() == \"m\") {\r\n this.dependent.sexName = this.translations.man;\r\n this.dependent.sexIconClass = \"phr-iconset-hombre\";\r\n }\r\n else {\r\n this.dependent.sexName = this.translations.women;\r\n this.dependent.sexIconClass = \"phr-iconset-mujer\";\r\n } \r\n }\r\n } \r\n\r\n loadDependentFormData(dependent: ViewDependentModelDto) {\r\n if (dependent.nombre)\r\n this.setControlValue(\"nameControl\", dependent.nombre);\r\n\r\n if (dependent.apellido)\r\n this.setControlValue(\"lastNameControl\", dependent.apellido);\r\n\r\n if (dependent.fechaNacimiento)\r\n this.setControlValue(\"birthDateControl\", dependent.fechaNacimiento);\r\n\r\n if (dependent.sexo && dependent.sexo != \"9\")\r\n this.setControlValue(\"sexControl\", dependent.sexo);\r\n\r\n if (dependent.tipoRelacion)\r\n this.setControlValue(\"relationshipType\", dependent.tipoRelacion.toString());\r\n }\r\n\r\n getControl(controlName: string) {\r\n return this.formGroup.controls[controlName];\r\n }\r\n\r\n isControlInvalid(controlName: string) {\r\n let control = this.getControl(controlName);\r\n\r\n // First check if the form is submitted or control is dirty\r\n if (!this.formSubmitted && !control.touched)\r\n return false;\r\n\r\n return control.invalid;\r\n }\r\n\r\n controlHasError(controlName: string, errorName: string) {\r\n return this.getControl(controlName).hasError(errorName);\r\n }\r\n \r\n getControlValue(controlName: string) {\r\n return this.getControl(controlName).value;\r\n }\r\n\r\n setControlValue(controlName: string, value: any) {\r\n this.getControl(controlName).setValue(value);\r\n }\r\n\r\n onSaveClick() {\r\n this.formGroup.markAllAsTouched();\r\n this.formSubmitted = true;\r\n\r\n if (!this.formGroup.valid) {\r\n this.scrollToInvalidField();\r\n return;\r\n } \r\n\r\n this.saving = true;\r\n\r\n var model = new DependentRequest();\r\n\r\n model.idPersona = this.dependent.idPersona; \r\n model.idRelacionDependiente = this.dependent.id;\r\n model.nombre = this.getControlValue(\"nameControl\");\r\n model.apellido = this.getControlValue(\"lastNameControl\");\r\n model.fechaNacimiento = new Date(this.getControlValue(\"birthDateControl\"));\r\n model.sexo = this.getControlValue(\"sexControl\");\r\n model.tipoRelacion = parseInt(this.getControlValue(\"relationshipType\"));\r\n model.ubicacionLogo = this.dependent.ubicacionLogo;\r\n\r\n this.userService.createOrUpdateDependent(model).subscribe({\r\n next: this.createOrUpdateDependentSuccess.bind(this),\r\n error: _ => this.saving = false\r\n }); \r\n }\r\n\r\n getBirthdateControl():FormControl | null{\r\n return this.formGroup.get('birthDateControl') \r\n ? this.formGroup.get('birthDateControl') as FormControl \r\n : null;\r\n }\r\n\r\n private createOrUpdateDependentSuccess(_: unknown): void {\r\n if (!this.dependent.ubicacionLogo && this.dependent.id && this.dependent.id > 0) {\r\n this.userService.deleteUploadedImage(this.dependent.id, this.dependent.idPersona).subscribe({\r\n next: this.onSuccess.bind(this),\r\n error: error => this.showErrorToast(error)\r\n });\r\n } else {\r\n this.onSuccess();\r\n }\r\n }\r\n\r\n private onSuccess(_?: unknown): void {\r\n this.saving = false;\r\n this.showSuccessToast();\r\n if (this.dependent.id > 0)\r\n this.router.navigate(['configuracion/dependiente/' + this.dependent.id]);\r\n else \r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n }\r\n\r\n onAvatarUploaded(file: AvatarUploadedFileModel) {\r\n this.dependent.ubicacionLogo = file?.webUrl;\r\n }\r\n\r\n showSuccessToast() {\r\n this.showToast(this.translation.translate('shared.editDependent.text17'), SnackBarType.SUCCESS);\r\n }\r\n\r\n showErrorToast(message: string) {\r\n this.showToast(message, SnackBarType.ERROR);\r\n }\r\n\r\n private showToast(text: string, type: SnackBarType) {\r\n let message = new OpenSnackBarMessage();\r\n message.text = text;\r\n message.type = type;\r\n message.duration = 3000;\r\n \r\n this.messageBusService.openSnackBar(message);\r\n }\r\n\r\n private scrollToInvalidField() { \r\n let container = this.document.getElementsByClassName(\"edit-dependent-container\")[0]; \r\n\r\n for (const key of Object.keys(this.formGroup.controls)) {\r\n if (this.formGroup.controls[key].invalid) {\r\n const invalidControl = this.el.nativeElement.querySelector('[formcontrolname=\"' + key + '\"]') as Element; \r\n \r\n this.utilsService.scrollToElementWithAnimation(container, invalidControl); \r\n break;\r\n }\r\n }\r\n } \r\n}\r\n\r\n","
\r\n \r\n\r\n
\r\n {{'shared.viewDependent.text1' | translate:locale.language}} {{dependent.nombre}}\r\n ({{dependent.relationshipName}})\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n {{'shared.viewDependent.text4' | translate:locale.language}}\r\n
\r\n
\r\n {{dependent.fullName}}\r\n
\r\n
\r\n
\r\n
\r\n {{'shared.viewDependent.text5' | translate:locale.language}}\r\n
\r\n
\r\n {{ fechaNacimiento }} \r\n
\r\n
\r\n
\r\n
\r\n {{'shared.viewDependent.text6' | translate:locale.language}}\r\n
\r\n
\r\n \r\n {{dependent.sexName}}\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { Dependent } from 'src/app/shared/models/people/dependent.model';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { Subject } from 'rxjs';\r\nimport { CloseRouteDialogMessage, MessageBusService, OpenSnackBarMessage, SnackBarType } from 'src/app/core/services/message-bus.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { AvatarUploadComponentOptions, AvatarUploadedFileModel } from '../../avatar-upload/avatar-upload.component';\r\nimport CommonTypesHelper from 'src/app/shared/helpers/common-types-helper';\r\nimport * as moment from 'moment';\r\n\r\n@Component({\r\n selector: 'app-view-dependent',\r\n templateUrl: './view-dependent.component.html',\r\n styleUrls: ['./view-dependent.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n\r\nexport class ViewDependentComponent implements OnInit, OnDestroy {\r\n \r\n private ngUnsubscribe = new Subject();\r\n dependent: ViewDependentModelDto | undefined;\r\n fechaNacimiento: string | null;\r\n saving: boolean = false;\r\n translations = {\r\n other: \"\",\r\n son: \"\",\r\n daughter: \"\",\r\n father: \"\",\r\n mother: \"\",\r\n language: \"\",\r\n man: \"\",\r\n women: \"\" \r\n };\r\n avatarUploadOptions : AvatarUploadComponentOptions;\r\n \r\n constructor(\r\n private userService: UserService,\r\n private route: ActivatedRoute,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n private router: Router,\r\n private dialog: MatDialog,\r\n private messageBusService: MessageBusService,\r\n ) {\r\n moment.locale(this.locale.language);\r\n this.avatarUploadOptions = new AvatarUploadComponentOptions();\r\n this.avatarUploadOptions.requiredFileType = \"image/png,image/jpeg\";\r\n this.avatarUploadOptions.selectFileLabel = \"aƱadir foto\";\r\n this.avatarUploadOptions.changeFileLabel = \"Editar\";\r\n this.avatarUploadOptions.showFileOnceUpload = true;\r\n }\r\n\r\n ngOnInit(): void {\r\n const dependentIdQs = this.route.snapshot.paramMap.get('id');\r\n\r\n if(!dependentIdQs) {\r\n // TODO: redirect to home???\r\n return;\r\n }\r\n\r\n let dependentId = parseInt(dependentIdQs);\r\n\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.translations.other = this.translation.translate('shared.profileMenu.text8');\r\n this.translations.son = this.translation.translate('shared.profileMenu.text9');\r\n this.translations.daughter = this.translation.translate('shared.profileMenu.text10');\r\n this.translations.father = this.translation.translate('shared.profileMenu.text11');\r\n this.translations.mother = this.translation.translate('shared.profileMenu.text12');\r\n this.translations.man = this.translation.translate('man');\r\n this.translations.women = this.translation.translate('women'); \r\n \r\n this.avatarUploadOptions.selectFileLabel = this.translation.translate('shared.viewUser.text8');\r\n this.avatarUploadOptions.changeFileLabel = this.translation.translate('shared.viewUser.text3');\r\n this.avatarUploadOptions.changePictureLabel = this.translation.translate('shared.viewUser.text9');\r\n this.avatarUploadOptions.deleteFileLabel = this.translation.translate('shared.viewUser.text10');\r\n }\r\n });\r\n\r\n this.userService.getUserDependents()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(d => {\r\n let dependents = d as ViewDependentModelDto[];\r\n\r\n // Lookup dependent by Id\r\n this.dependent = dependents.find(d => d.id == dependentId);\r\n\r\n if (!this.dependent) {\r\n // TODO: redirect to home???\r\n return;\r\n }\r\n\r\n this.setUpDependentExtraData();\r\n });\r\n\r\n // On Header Back click\r\n this.messageBusService.onNavigateBack()\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(m => {\r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n }\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n this.messageBusService.refreshProfileMenu();\r\n }\r\n\r\n setUpDependentExtraData() {\r\n if (!this.dependent)\r\n return;\r\n\r\n this.dependent.fullName = this.dependent.nombre + \" \" + this.dependent.apellido; \r\n this.dependent.relationshipName = this.userService.getDependentRelationshipName(this.dependent);\r\n\r\n let feNacimiento = this.dependent.fechaNacimiento ? new Date(this.dependent.fechaNacimiento) : null;\r\n this.fechaNacimiento = CommonTypesHelper.dateHasValue(feNacimiento) ? moment(feNacimiento).format('D [de] MMMM[,] yyyy') : null;\r\n\r\n if (this.dependent.sexo && this.dependent.sexo != \"9\") {\r\n if (this.dependent.sexo.toLocaleLowerCase() == \"m\") {\r\n this.dependent.sexName = this.translations.man;\r\n this.dependent.sexIconClass = \"phr-iconset-hombre\";\r\n }\r\n else {\r\n this.dependent.sexName = this.translations.women;\r\n this.dependent.sexIconClass = \"phr-iconset-mujer\";\r\n } \r\n \r\n }\r\n } \r\n\r\n onEditDependentClick() {\r\n this.router.navigate(['configuracion/dependiente/edicion/' + this.dependent?.id]);\r\n } \r\n\r\n onDeleteClick() {\r\n //this.saving = true;\r\n\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate('shared.viewDependent.text9');\r\n dialogData.message = this.translation.translate('shared.viewDependent.text10');\r\n dialogData.confirmText = this.translation.translate('shared.viewDependent.text14'); \r\n dialogData.cancelText = this.translation.translate('shared.viewDependent.text12');\r\n dialogData.headerIconClass = 'phr-iconset-alert';\r\n dialogData.showHeaderIcon = true;\r\n dialogData.showCancelButton = true;\r\n dialogData.id = 'confirm-delete-user-dialog';\r\n dialogData.animationIn = 'confirm-logout-animation-in';\r\n dialogData.animationOut = 'confirm-logout-animation-out';\r\n \r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: ['confirm-delete-user-dialog', 'confirm-logout-animation-in']\r\n });\r\n \r\n dialogRef.afterClosed().subscribe(accepted => {\r\n if(accepted){\r\n this.saving = true;\r\n\r\n this.userService.deleteDependent(this.dependent as Dependent).subscribe(r => {\r\n this.saving = false;\r\n\r\n this.showDeleteSuccessToast();\r\n\r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n\r\n },\r\n error => {\r\n this.saving = false;\r\n });\r\n }\r\n });\r\n }\r\n\r\n showDeleteSuccessToast() {\r\n let message = new OpenSnackBarMessage();\r\n message.text = this.translation.translate('shared.viewDependent.text13');\r\n message.type = SnackBarType.SUCCESS;\r\n message.duration = 3000;\r\n \r\n this.messageBusService.openSnackBar(message);\r\n }\r\n\r\n onAvatarUploaded(file: AvatarUploadedFileModel) {\r\n if (this.dependent) this.dependent.ubicacionLogo = file?.webUrl;\r\n }\r\n\r\n}\r\n\r\nexport class ViewDependentModelDto extends Dependent { \r\n relationshipName: string;\r\n fullName: string;\r\n sexName: string;\r\n sexIconClass: string; \r\n}\r\n","
\r\n \r\n
\r\n
\r\n

\r\n {{ 'shared.cancelVirtualAppointmentDialog.text1' | translate:locale.language }}\r\n

\r\n
\r\n
\r\n \r\n \r\n \r\n {{option.text}}\r\n \r\n \r\n
\r\n \r\n {{ 'shared.cancelVirtualAppointmentDialog.text2' | translate:locale.language }} \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n

\r\n {{ 'shared.cancelVirtualAppointmentDialog.text5' | translate:locale.language }}\r\n

\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ChatCancelledMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { VirtualAttentionService } from 'src/app/core/services/virtual-attention.service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { VirtualAttention } from 'src/app/shared/models/process/virtual-attention.model';\r\nimport { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';\r\n\r\n\r\n@Component({\r\n selector: 'app-cancel-virtual-attention-dialog',\r\n templateUrl: './cancel-virtual-attention-dialog.component.html',\r\n styleUrls: ['./cancel-virtual-attention-dialog.component.css'] \r\n})\r\nexport class CancelVirtualAttentionDialogComponent implements OnInit { \r\n virtualAttention: VirtualAttention; \r\n reasonText: string;\r\n loading = false;\r\n completed = false; \r\n selectionControl: FormControl; \r\n options: CancelOption[];\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n private mdDialogRef: MatDialogRef, \r\n private baseService: BaseService, \r\n private virtualAttentionService: VirtualAttentionService, \r\n private messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private translation: L10nTranslationService,\r\n private dialog: MatDialog\r\n ) { \r\n this.selectionControl = new FormControl('auto');\r\n this.virtualAttention = this.baseService.parseObject(data.data);\r\n\r\n this.options = [\r\n new CancelOption(1, \"Llevo demasiado tiempo en espera\"),\r\n new CancelOption(2, \"No necesito la atenciĆ³n, estaba probando la plataforma\"),\r\n new CancelOption(3, \"Deseo tener atenciĆ³n presencial\"),\r\n new CancelOption(4, \"Lo resolvĆ­ de otra forma\"),\r\n new CancelOption(5, \"Ya me siento mucho mejor, no necesito la atenciĆ³n\"),\r\n new CancelOption(6, \"Otro motivo\", true),\r\n ];\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n public cancel() {\r\n this.close(false);\r\n }\r\n\r\n public close(value:any) {\r\n this.mdDialogRef.close(value);\r\n } \r\n\r\n isSaveEnabled() {\r\n let reason = this.getSelectedReason();\r\n\r\n return !this.loading && (reason && reason.trim());\r\n }\r\n\r\n showTextarea() : boolean {\r\n let option = this.options.find(o => o.id == this.selectionControl.value);\r\n\r\n return option != undefined && option.showTextarea;\r\n }\r\n\r\n getSelectedReason() : string {\r\n let reasonId = this.selectionControl.value;\r\n let option = this.options.find(o => o.id == reasonId);\r\n\r\n if (!option)\r\n return \"\";\r\n\r\n return reasonId == 6? this.reasonText : option.text;\r\n }\r\n\r\n confirm() {\r\n this.loading = true; \r\n\r\n let reason = this.getSelectedReason();\r\n \r\n this.virtualAttentionService.cancelVirtualAttention(this.virtualAttention.data.codigoSolicitudPorVerificar, reason).subscribe(r => { \r\n if (!r.success) {\r\n this.showErrorDialog(parseInt(r.errorMessage));\r\n\r\n this.loading = false; \r\n }\r\n else {\r\n // Send event indicating the chat finished\r\n this.messageBusService.chatCancelled(new ChatCancelledMessage(reason));\r\n\r\n this.loading = false; \r\n this.completed = true;\r\n } \r\n }); \r\n }\r\n\r\n showErrorDialog(previousState: number) {\r\n let dialogData = new DialogData();\r\n let stateText = \"\";\r\n\r\n switch(previousState) {\r\n case 100:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.waitingTriage\");\r\n break;\r\n case 79:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.onRevision\");\r\n break;\r\n case 99:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.onTriage\");\r\n break;\r\n case 101:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.waitingAlly\");\r\n break;\r\n case 24:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.waitingDoctor\");\r\n break;\r\n case 30:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.attention\");\r\n break;\r\n case 37:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.ended\");\r\n break;\r\n case 7:\r\n stateText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.states.canceled\");\r\n break;\r\n }\r\n \r\n if (previousState == 37 || previousState == 7) {\r\n dialogData.message = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.text11\");\r\n }\r\n else \r\n dialogData.message = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.text10\");\r\n\r\n dialogData.title = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.text7\");\r\n //dialogData.message = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.text8\") + stateText;\r\n dialogData.confirmText = this.translation.translate(\"shared.cancelVirtualAppointmentDialog.text9\"); \r\n dialogData.showHeaderIcon = true;\r\n dialogData.headerIconClass = \"phr-iconset-info\"; \r\n dialogData.showCancelButton = false;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(accepted => { \r\n location.reload();\r\n });\r\n } \r\n}\r\n\r\nexport class CancelOption {\r\n id: number;\r\n text: string;\r\n showTextarea: boolean;\r\n\r\n constructor(id: number, text: string, showTextarea: boolean = false) {\r\n this.id = id;\r\n this.text = text;\r\n this.showTextarea = showTextarea;\r\n }\r\n}\r\n","
\n
\n \n

{{ data.title }}

\n \n
\n
\n

\n
\n
\n \n \n
\n
\n","import { DOCUMENT } from '@angular/common';\nimport { Component, HostListener, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\n\n@Component({\n selector: 'app-confirm-dialog',\n templateUrl: './confirm-dialog.component.html',\n styleUrls: ['./confirm-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ConfirmDialogComponent implements OnInit, OnDestroy {\n protected ngUnsubscribe = new Subject();\n licenseLoading: boolean = true;\n \n constructor(\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\n @Inject(DOCUMENT) private document: Document,\n private layoutService: LayoutService,\n private mdDialogRef: MatDialogRef\n ) {\n }\n\n ngOnInit(): void {\n\n if(this.data.loadLicense){\n this.layoutService.loadLicenseTheme('confirm-dialog-wrapper')\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result=>{\n this.licenseLoading = false;\n });\n }\n else{\n this.licenseLoading = false;\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n public cancel() {\n this.close(false);\n }\n\n public close(value:any) {\n if(this.data.animationOut){\n this.document.getElementsByClassName(this.data.id)[0].classList.remove(this.data.animationIn);\n this.document.getElementsByClassName(this.data.id)[0].classList.add(this.data.animationOut);\n\n setTimeout(()=>{ \n this.mdDialogRef.close(value);\n }, 300);\n }\n else{\n this.mdDialogRef.close(value);\n }\n }\n\n public confirm() {\n this.close(true);\n }\n \n @HostListener(\"keydown.esc\") \n public onEsc() {\n this.close(false);\n }\n}","export class DoctorMessage { \r\n IdEmpresa: number;\r\n IdPersona: number;\r\n Localizacion: string;\r\n\r\n Email: string;\r\n NombreCompleto: string;\r\n Mensaje: string;\r\n NombreDoctor: string;\r\n}","
\r\n
\r\n
{{ 'shared.doctorMessageDialog.text1' | translate:locale.language }}
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n {{ 'shared.doctorMessageDialog.text2' | translate:locale.language }} \r\n \r\n {{ 'shared.doctorMessageDialog.text9' | translate:locale.language }}\r\n {{ 'shared.doctorMessageDialog.text10' | translate:locale.language }}\r\n \r\n \r\n \r\n {{ 'shared.doctorMessageDialog.text3' | translate:locale.language }} \r\n \r\n {{ 'shared.doctorMessageDialog.text11' | translate:locale.language }}\r\n \r\n \r\n \r\n {{ 'shared.doctorMessageDialog.text4' | translate:locale.language }} \r\n \r\n {{ 'shared.doctorMessageDialog.text12' | translate:locale.language }}\r\n \r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n\r\n
","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { DoctorService } from 'src/app/core/services/doctors.service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { DoctorMessage } from 'src/app/shared/models/people/doctor-message.model';\r\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\r\nimport { CustomEmailValidator } from 'src/app/shared/validators/custom-email.validator';\r\nimport { environment } from 'src/environments/environment';\r\n\r\n@Component({\r\n selector: 'doctor-message-dialog',\r\n templateUrl: './doctor-message-dialog.component.html',\r\n styleUrls: ['./doctor-message-dialog.component.css'],\r\n encapsulation: ViewEncapsulation.None \r\n})\r\nexport class DoctorMessageDialogComponent implements OnInit { \r\n\r\n loading: boolean = false;\r\n publicProfile: PublicProfile; \r\n messageForm: FormGroup;\r\n captchaSuccess: boolean = false;\r\n captchaSiteKey: string; \r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n private mdDialogRef: MatDialogRef,\r\n private formBuilder: FormBuilder,\r\n private baseService: BaseService,\r\n private doctorService: DoctorService,\r\n private toastr: ToastrService,\r\n private translation: L10nTranslationService, \r\n @Inject(L10N_LOCALE) public locale: L10nLocale) {\r\n \r\n this.publicProfile = this.baseService.parseObject(data.data);\r\n\r\n this.captchaSiteKey = environment.googleCaptchaSiteKey;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.messageForm = this.formBuilder.group({\r\n email: ['', [Validators.required, CustomEmailValidator]],\r\n fullName: ['', Validators.required],\r\n message: ['', Validators.required],\r\n }); \r\n }\r\n\r\n get f() { return this.messageForm.controls; }\r\n\r\n onCloseClick() {\r\n this.mdDialogRef.close();\r\n } \r\n\r\n isSaveEnabled() {\r\n return this.captchaSuccess && !this.messageForm.invalid;\r\n } \r\n\r\n resolved(captchaResponse: any) {\r\n this.captchaSuccess = true;\r\n }\r\n\r\n confirm() {\r\n if (!this.captchaSuccess)\r\n return;\r\n\r\n // stop here if form is invalid\r\n if (this.messageForm.invalid) {\r\n this.messageForm.markAllAsTouched();\r\n return;\r\n }\r\n\r\n let model = new DoctorMessage();\r\n\r\n model.IdEmpresa = this.publicProfile.idEmpresa;\r\n model.IdPersona = this.publicProfile.id;\r\n model.NombreDoctor = this.publicProfile.nombrePersona;\r\n\r\n model.Localizacion = this.locale.language;\r\n model.Email = this.messageForm.get(\"email\")?.value;\r\n model.NombreCompleto = this.messageForm.get(\"fullName\")?.value;\r\n model.Mensaje = this.messageForm.get(\"message\")?.value; \r\n\r\n this.loading = true;\r\n\r\n this.doctorService.postMessageToDoctor(model).subscribe(r => { \r\n this.loading = false;\r\n this.mdDialogRef.close();\r\n\r\n this.toastr.success(this.translation.translate(\"shared.doctorMessageDialog.text6\"), \"\");\r\n },\r\n (error: any) => {\r\n this.loading = false;\r\n\r\n this.toastr.error(this.translation.translate(\"shared.doctorMessageDialog.text8\"), this.translation.translate(\"shared.doctorMessageDialog.text7\"));\r\n });\r\n }\r\n \r\n}\r\n\r\n","import { Component, HostListener, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { FileViewerDto } from '../../file-viewer/file-viewer.component';\r\n\r\n@Component({\r\n selector: 'file-viewer-dialog',\r\n templateUrl: './file-viewer-dialog.component.html',\r\n styleUrls: ['./file-viewer-dialog.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class FileViewerDialogComponent implements OnInit {\r\n viewerData : FileViewerDto;\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n private mdDialogRef: MatDialogRef\r\n ) {\r\n this.viewerData = data.data;\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n } \r\n\r\n public close() {\r\n this.mdDialogRef.close();\r\n }\r\n \r\n @HostListener(\"keydown.esc\") \r\n public onEsc() {\r\n this.close();\r\n }\r\n}","
\r\n \r\n
","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { LegalAgreementType } from 'src/app/shared/enums/legal-agreements-type.enum';\n\n@Component({\n selector: 'app-legal-agreements-dialog',\n templateUrl: './legal-agreements-dialog.component.html',\n styleUrls: ['./legal-agreements-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class LegalAgreementsDialogComponent implements OnInit {\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public data: LegalAgreementsDialogData,\n private mdDialogRef: MatDialogRef,\n ) { }\n\n ngOnInit(): void {\n }\n\n close(){\n this.mdDialogRef.close();\n }\n}\nexport class LegalAgreementsDialogData{\n type: LegalAgreementType;\n}\n","
\n
\n \n
\n\n
\n \n
\n
","\r\n
\r\n \r\n\r\n
{{title}}
\r\n
{{description}}
\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {{ 'shared.mapDialog.text1' | translate:locale.language }}\r\n \r\n
\r\n\r\n","import { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, Inject, OnInit, ViewChild } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { MapDialogData } from 'src/app/shared/models/dialog-data.model';\r\n\r\n@Component({\r\n selector: 'map-dialog',\r\n templateUrl: './map-dialog.component.html',\r\n styleUrls: ['./map-dialog.component.css'] \r\n})\r\nexport class MapDialogComponent implements AfterViewInit {\r\n @ViewChild('titleTag') private divTitle: ElementRef;\r\n title: string;\r\n description: string;\r\n showWazeButton: boolean = false; \r\n lat = 8.537981;\r\n lng = -80.782127;\r\n zoom = 15;\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: MapDialogData,\r\n private mdDialogRef: MatDialogRef,\r\n private breakpointObserver: BreakpointObserver,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(DOCUMENT) private document: Document\r\n ) {\r\n \r\n this.title = data.title;\r\n this.description = data.description;\r\n this.showWazeButton = data.showWazeButton;\r\n var coordinates = data.message.split(\";\");\r\n\r\n this.lat = Number(coordinates[0]);\r\n this.lng = Number(coordinates[1]);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n console.log(this.breakpointObserver.isMatched('(max-width:800px)'))\r\n if (!this.breakpointObserver.isMatched('(max-width:800px)')) return;\r\n const width = this.divTitle.nativeElement.clientWidth;\r\n if (width >= this.medicionTitulo())\r\n this.divTitle.nativeElement.style.display = 'flex';\r\n }\r\n\r\n private medicionTitulo() {\r\n const span = this.document.createElement('span');\r\n span.style.visibility = 'hidden';\r\n span.style.whiteSpace = 'nowrap';\r\n span.textContent = this.title;\r\n this.document.body.appendChild(span);\r\n const width = span.offsetWidth\r\n this.document.body.removeChild(span);\r\n return width;\r\n }\r\n\r\n onCloseClick() {\r\n if(this.data.animationOut){\r\n this.document.getElementsByClassName('map-dialog')[0].classList.remove(this.data.animationIn);\r\n this.document.getElementsByClassName('map-dialog')[0].classList.add(this.data.animationOut);\r\n setTimeout(()=>{ \r\n this.mdDialogRef.close();\r\n }, 300);\r\n }\r\n else{\r\n this.mdDialogRef.close();\r\n }\r\n }\r\n\r\n buildWazeLink() {\r\n let coordinates = this.lat + \",\" + this.lng;\r\n\r\n return \"https://www.waze.com/ul?ll=\" + coordinates + \"&navigate=yes&zoom=17\";\r\n }\r\n \r\n}","import { DOCUMENT } from '@angular/common';\nimport { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { MessageBusService, PageScrollMessage } from 'src/app/core/services/message-bus.service';\nimport { Direction } from 'src/app/shared/enums/direction.enum';\n\n@Component({\n selector: 'app-route-dialog',\n templateUrl: './route-dialog.component.html',\n styleUrls: ['./route-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class RouteDialogComponent implements OnInit, OnDestroy {\n\n currentRoute: string;\n headerModel: RouteDialogHeaderModel = new RouteDialogHeaderModel();\n private ngUnsubscribe = new Subject();\n scrollTop: number = 0;\n\n loading:boolean = true;\n\n constructor( \n @Inject(MAT_DIALOG_DATA) public data: RouteDialogModel,\n private router: Router,\n private messageBusService: MessageBusService,\n private mdDialogRef: MatDialogRef,\n @Inject(DOCUMENT) private document: Document\n \n ) {\n this.headerModel.dialogRef = this.mdDialogRef;\n this.headerModel.closeFn = this.onCloseClick.bind(this);\n this.headerModel.dialogModel = data; \n }\n\n ngOnInit(): void {\n this.document.body.classList.add('route-dialog-opened');\n\n if(this.data.route.split('?').length > 1){\n this.router.navigateByUrl(this.data.route, {state: this.data.state });\n }\n else{\n this.router.navigate([this.data.route], {state: this.data.state, queryParams: this.data.queryParams});\n }\n\n this.messageBusService.onCloseRouteDialog()\n .pipe(takeUntil(this.ngUnsubscribe)) \n .subscribe(m => {\n this.onCloseClick();\n }\n );\n\n this.router.events\n .pipe(takeUntil(this.ngUnsubscribe)) \n .subscribe((val)=>{\n if(val instanceof NavigationEnd){\n this.loading = false;\n }\n });\n }\n\n ngOnDestroy() {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n onCloseClick(preventDialogClose = false){\n this.loading = true;\n\n if(this.data.animationOut){\n this.document.getElementsByClassName(this.data.className)[0].classList.remove(this.data.animationIn);\n this.document.getElementsByClassName(this.data.className)[0].classList.add(this.data.animationOut);\n }\n\n if (!preventDialogClose)\n setTimeout(()=>{ \n this.mdDialogRef.close();\n }, 300);\n\n setTimeout(()=>{\n if(this.document.getElementsByClassName(\"route-dialog-container\").length == 0){\n this.document.body.classList.remove('route-dialog-opened');\n }\n }, 600); \n }\n\n onScroll($event:Event){\n\n const scrollTop = ($event.target as Element).scrollTop;\n const offset = this.scrollTop - scrollTop;\n const elOffsetTop = ($event.target as HTMLElement).offsetTop\n\n if(Math.abs(offset) < 50) return; \n\n const direction = offset < 0\n ? Direction.Down\n : Direction.Up;\n\n this.scrollTop = scrollTop; \n\n this.messageBusService.pageScroll(new PageScrollMessage(direction, scrollTop, elOffsetTop, true));\n }\n}\n\nexport class RouteDialogModel{\n id: number;\n headerName: string;\n route: string;\n state: any;\n queryParams: any;\n className: string;\n backgroundClassName: string;\n animationIn: string;\n animationOut: string;\n disableClose: boolean = false;\n}\n\nexport class AppointmentRouteDialogModel extends RouteDialogModel{\n id = RouteDialogType.APPOINTMENT;\n route = 'citas/checkout';\n className = 'appointment-dialog';\n animationIn = 'appointment-animation-in';\n animationOut = 'appointment-animation-out';\n}\n\nexport class PaymentRouteDialogModel extends RouteDialogModel{\n id = RouteDialogType.PAYMENT;\n headerName = 'PaymentHeaderComponent';\n route = 'pagos/checkout';\n className = 'appointment-dialog';\n animationIn = 'appointment-animation-in';\n animationOut = 'appointment-animation-out';\n}\n\nexport class PublicProfileRouteDialogModel extends RouteDialogModel{\n id = RouteDialogType.PUBLIC_PROFILE;\n headerName = 'PublicProfileHeaderComponent';\n className = 'public-profile-dialog';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class ProfileMenuDialogModel extends RouteDialogModel {\n id = RouteDialogType.PROFILE_MENU;\n headerName = 'DefaultHeaderComponent';\n route = 'configuracion/menu';\n className = 'profile-menu-route-dialog-container';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class ConfigurationPageDialogModel extends RouteDialogModel {\n id = RouteDialogType.CONFIGURATION_PAGE;\n headerName = 'DefaultBackHeaderComponent';\n route = '';\n className = 'configuration-page-route-dialog-container';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class AppointmentSummaryRouteDialogModel extends RouteDialogModel{\n id = RouteDialogType.APPOINTMENT_SUMMARY;\n route = '';\n headerName = 'DefaultBackWithLinkHeaderComponent';\n className = 'appointment-dialog';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class MyOrderSummaryRouteDialogModel extends RouteDialogModel{\n id = RouteDialogType.MY_ORDER_SUMMARY;\n route = '';\n headerName = 'DefaultBackWithLinkHeaderComponent';\n className = 'my-order-summary-dialog';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class AppointmentCancelationRouteDialogModel extends RouteDialogModel{\n id = RouteDialogType.CANCEL_APPOINTMENT;\n route = '';\n headerName = 'DefaultBackHeaderComponent';\n className = 'cancel-appointment-route-dialog';\n backgroundClassName = 'directory-background';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class RescheduleAppointmentRouteDialogModel extends RouteDialogModel{\n id = RouteDialogType.RESCHEDULE_APPOINTMENT;\n route = '';\n headerName = 'DefaultBackWithLinkHeaderComponent'; \n backgroundClassName = 'directory-background';\n className = 'reschedule-appointment-route-dialog';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class LoginRouteDialogModel extends RouteDialogModel {\n id = RouteDialogType.LOGIN;\n route = ''; \n className = 'login-route-dialog';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class LegalAgreementsRouteDialogModel extends RouteDialogModel {\n id = RouteDialogType.LEGALAGREEMENTS;\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n className = 'legal-agreements-route-dialog';\n headerName = 'DefaultLogoHeaderComponent';\n}\n\nexport class LearnMoreRouteDialogModel extends RouteDialogModel {\n id = RouteDialogType.LEARN_MORE;\n route = 'conoce-mas'; \n headerName = 'DefaultLogoHeaderComponent'; \n className = 'login-route-dialog';\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n}\n\nexport class RouteDialogHeaderModel{\n dialogRef: any;\n closeFn: any;\n dialogModel: RouteDialogModel;\n}\n\nexport class ContactRouteDialogModel extends RouteDialogModel {\n id = RouteDialogType.CONTACT;\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n className = 'contact-route-dialog';\n headerName = 'DefaultBackHeaderComponent';\n}\n\nexport class ChangePasswordRouteDialogModel extends RouteDialogModel {\n id = RouteDialogType.CHANGE_PASSWORD;\n route: \"login/restablecer\";\n animationIn = 'public-profile-animation-in';\n animationOut = 'public-profile-animation-out';\n className = 'change-password-route-dialog';\n headerName = 'DefaultBackHeaderComponent';\n}\n\nexport enum RouteDialogType{\n APPOINTMENT = 1,\n PAYMENT = 2,\n PUBLIC_PROFILE = 3,\n PROFILE_MENU = 4,\n CONFIGURATION_PAGE = 5,\n APPOINTMENT_SUMMARY = 6,\n CANCEL_APPOINTMENT = 7,\n RESCHEDULE_APPOINTMENT = 8,\n LOGIN = 9,\n LEARN_MORE = 10,\n LEGALAGREEMENTS = 11,\n CONTACT = 12,\n CHANGE_PASSWORD = 13,\n MY_ORDER_SUMMARY = 14\n}\n","
\n \n
\n \n
\n
","import { Component, ComponentFactoryResolver, ComponentRef, Input, OnInit, ViewChild } from '@angular/core';\nimport { ComponentLookupRegistry } from '../../decorators/component-lookup.decorator';\nimport { DynamicHostDirective } from '../../directives/dynamic-host.directive';\nimport { IControlComponent } from '../../interfaces/control-component';\n\n@Component({\n selector: 'app-dynamic',\n templateUrl: './dynamic.component.html',\n styleUrls: ['./dynamic.component.css']\n})\nexport class DynamicComponent implements OnInit {\n\n @Input() componentName: string;\n @Input() componentData: any;\n @ViewChild(DynamicHostDirective, {static: true}) dynamicHost: DynamicHostDirective;\n\n componentRef: ComponentRef;\n\n constructor(private resolveComponentFactory: ComponentFactoryResolver){}\n\n ngOnInit(): void {\n this.loadComponent();\n }\n\n loadComponent(){\n\n if(!this.componentName) return;\n\n const factoryClass = ComponentLookupRegistry.get(this.componentName);\n\n if(!factoryClass) return;\n\n const factory = this.resolveComponentFactory.resolveComponentFactory(factoryClass);\n\n const viewContainerRef = this.dynamicHost.viewContainerRef;\n viewContainerRef.clear();\n\n this.componentRef = viewContainerRef.createComponent(factory);\n\n this.componentRef.instance.data = this.componentData;\n }\n}\n","","","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-login-singup-error-banner',\n templateUrl: './login-singup-error-banner.component.html',\n styleUrls: ['./login-singup-error-banner.component.css']\n})\nexport class LoginSingupErrorBannerComponent implements OnInit {\n\n @Input() error: string;\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","
0, 'non-preview-file': !selectedFileHasPreview()}\">\r\n
\r\n \r\n {{selectedFile.title}}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
","import { Component, ElementRef, EventEmitter, Inject, Input, OnInit, Output, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { Observable, of } from 'rxjs';\r\nimport { environment } from 'src/environments/environment';\r\nimport { map } from 'rxjs/operators';\r\nimport { DocumentService } from 'src/app/core/services/document.service';\r\nimport { SystemDocument } from '../../models/process/document.model';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'file-viewer',\r\n templateUrl: './file-viewer.component.html',\r\n styleUrls: ['./file-viewer.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('FileViewerComponent')\r\nexport class FileViewerComponent implements IControlComponent, OnInit {\r\n data: FormComponentData;\r\n\r\n // Input / Output\r\n @Input() viewerDto : FileViewerDto;\r\n @Output() onClose = new EventEmitter();\r\n\r\n // Model\r\n selectedFile: FileViewerItemDto;\r\n selectedFileIndex: number = 0;\r\n selectedFileUrl: string;\r\n loadingFileUrl = false;\r\n selectedImgZooms = 0;\r\n\r\n files : FileViewerItemDto[]; \r\n googleFileViewerBaseUrl = \"\";\r\n dragPosition = {x: 0, y: 0};\r\n \r\n @ViewChild('selectedImg') selectedImageEl: ElementRef;\r\n\r\n isBrowser: boolean;\r\n constructor(\r\n private documentService : DocumentService, \r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.googleFileViewerBaseUrl = environment.googleFileViewerUrl;\r\n\r\n if (this.viewerDto.useExternalDocumentProvider && !this.viewerDto.documentProvider) {\r\n throw \"Invalid file viewer configuration\";\r\n }\r\n\r\n this.files = this.viewerDto.files;\r\n for(let i=0; i < this.viewerDto.files.length; i++) {\r\n if (this.viewerDto.files[i].fileId == this.viewerDto.selectedFileId) {\r\n this.selectedFile = this.viewerDto.files[i];\r\n this.selectedFileIndex = i;\r\n\r\n break;\r\n }\r\n }\r\n\r\n this.onSelectedFileChange(this.selectedFileIndex);\r\n }\r\n\r\n onCloseClick() {\r\n this.onClose.emit(); \r\n }\r\n\r\n openOnNewTab() {\r\n this.getFileUrl(this.selectedFile, false, false).subscribe(url => {\r\n if(this.isBrowser){\r\n window.open(url, '_blank')?.focus();\r\n }\r\n }); \r\n }\r\n\r\n isNextVisible() {\r\n return this.selectedFileIndex < (this.files.length - 1);\r\n }\r\n\r\n next() { \r\n this.selectedFileIndex++;\r\n this.onSelectedFileChange(this.selectedFileIndex);\r\n }\r\n\r\n isPreviousVisible() {\r\n return this.selectedFileIndex > 0 && this.files.length > 1;\r\n }\r\n\r\n previous() { \r\n this.selectedFileIndex--;\r\n this.onSelectedFileChange(this.selectedFileIndex);\r\n }\r\n\r\n clearViewCustomizations() {\r\n this.selectedImgZooms = 0; \r\n\r\n // Re-center img\r\n if (this.selectedImageEl)\r\n this.selectedImageEl.nativeElement.style.transform = \"none\";\r\n\r\n this.dragPosition = {x: 0, y: 0};\r\n }\r\n\r\n showZoomIn() {\r\n return this.selectedImgZooms == 0;\r\n }\r\n\r\n showZoomOut() {\r\n return this.selectedImgZooms > 0;\r\n }\r\n\r\n zoomIn() {\r\n this.selectedImgZooms++;\r\n this.resizeSelectedImg(true);\r\n }\r\n\r\n zoomOut() {\r\n this.selectedImgZooms--;\r\n this.resizeSelectedImg(false);\r\n\r\n if (this.selectedImgZooms == 0)\r\n this.clearViewCustomizations();\r\n }\r\n\r\n onFileClick(file: FileViewerItemDto) {\r\n if (this.selectedImgZooms == 0)\r\n this.zoomIn(); \r\n }\r\n\r\n resizeSelectedImg(zoomIn : boolean) {\r\n let scale = (zoomIn) ? 150 / 100 : 100 / 150;\r\n let width = this.selectedImageEl.nativeElement.width;\r\n let height = this.selectedImageEl.nativeElement.height;\r\n\r\n // Set new dimensions\r\n this.selectedImageEl.nativeElement.width = width * scale;\r\n this.selectedImageEl.nativeElement.height = height * scale;\r\n }\r\n\r\n resetZoom() {\r\n this.clearViewCustomizations();\r\n }\r\n\r\n selectedFileHasPreview() {\r\n let file = this.selectedFile; \r\n\r\n if (!file)\r\n return false;\r\n\r\n return file.fileExtension == \"jpg\"\r\n || file.fileExtension == \"jpeg\"\r\n || file.fileExtension == \"bmp\"\r\n || file.fileExtension == \"gif\"\r\n || file.fileExtension == \"png\"; \r\n }\r\n\r\n useGoogleViewer(file: FileViewerItemDto) { \r\n\r\n if (!file)\r\n return false;\r\n\r\n return file.fileExtension == \"pdf\";\r\n }\r\n\r\n onSelectedFileChange(selectedFileIndex: number) {\r\n this.clearViewCustomizations(); \r\n this.selectedFile = this.files[selectedFileIndex];\r\n this.selectedFileUrl = null as any;\r\n \r\n this.getFileUrl(this.selectedFile).subscribe(url => {\r\n this.selectedFileUrl = url;\r\n });\r\n }\r\n\r\n getFileUrl(file: FileViewerItemDto, useExtensionImage = true, useLoading = true) : Observable {\r\n let url = file.fileUrl;\r\n let imageUrl = ''; \r\n let hasExtensionImage= true; \r\n\r\n // Check if it is a partial URL\r\n if (url.indexOf(\"http\") < 0) \r\n url = document.location.protocol + \"//\" + document.location.host + \"/\" + url; \r\n \r\n if (useExtensionImage) {\r\n switch (file.fileExtension) {\r\n case 'jpg':\r\n case 'jpeg':\r\n case 'bmp':\r\n case 'gif':\r\n case 'png':\r\n case 'pdf':\r\n imageUrl = url.replace('\\\\/gi', '/');\r\n hasExtensionImage = false;\r\n break;\r\n case 'xls':\r\n case 'xlsx':\r\n case 'xlt':\r\n imageUrl = '/assets/images/HC/img_preview_xls.png';\r\n break;\r\n case 'doc':\r\n case 'docx':\r\n imageUrl = '/assets/images/HC/img_preview_doc.png';\r\n break;\r\n case 'mp3':\r\n imageUrl = '/assets/images/HC/img_preview_mp3.png';\r\n break;\r\n case 'mp4':\r\n imageUrl = '/assets/images/HC/img_preview_mp4.png';\r\n break;\r\n default:\r\n imageUrl = '/assets/images/HC/img_preview_default.png';\r\n break;\r\n }\r\n }\r\n else {\r\n imageUrl = url.replace('\\\\/gi', '/');\r\n hasExtensionImage = false;\r\n } \r\n\r\n if (!hasExtensionImage) {\r\n \r\n // Check if the file has a bucket\r\n if (file.amazonBucketName) {\r\n\r\n if(useLoading)\r\n this.loadingFileUrl = true;\r\n\r\n /*return this.documentService.getDocumentUrl(file.fileId).pipe(map((url: string) => { \r\n this.loadingFileUrl = false;\r\n \r\n return url;\r\n }));*/\r\n\r\n return this.getFileDocumentUrl(file).pipe(map((url: string) => { \r\n this.loadingFileUrl = false;\r\n \r\n return url;\r\n }));\r\n }\r\n else \r\n return of(imageUrl);\r\n }\r\n // If we do not render this image just use the extension one\r\n else \r\n return of(imageUrl);\r\n } \r\n\r\n getSelectedFileViewerUrl() : string {\r\n let result = this.googleFileViewerBaseUrl + encodeURIComponent(this.selectedFileUrl);\r\n\r\n return result;\r\n }\r\n\r\n getFileDocumentUrl(file: FileViewerItemDto) : Observable {\r\n if (this.viewerDto.useExternalDocumentProvider) {\r\n return this.viewerDto.documentProvider.getDocument(file.fileId).pipe(map((doc: SystemDocument) => {\r\n return doc.url;\r\n }));\r\n }\r\n else {\r\n return this.documentService.getDocumentUrl(file.fileId);\r\n }\r\n }\r\n}\r\n\r\n/* External classes */\r\nexport class FileViewerDto {\r\n selectedFileId: number;\r\n files : FileViewerItemDto[];\r\n\r\n // In case of public profile images, we will use the public profile service to get images in order to avoid authentication\r\n useExternalDocumentProvider: boolean = false; \r\n documentProvider: IDocumentProvider;\r\n}\r\n\r\nexport class FileViewerItemDto {\r\n fileId: number;\r\n fileUrl: string;\r\n fileExtension: string;\r\n amazonBucketName: string;\r\n webUrl: string;\r\n\r\n title: string; \r\n description: string;\r\n createdAt: Date; \r\n\r\n creatorName: string;\r\n creatorImageUrl: string; \r\n}\r\n\r\nexport interface IDocumentProvider {\r\n getDocument(documentId: number) : Observable;\r\n}\r\n","
\n\n \n

{{form.nombre| i18nText:locale.language}}

\n\n \n

{{form.descripcion | i18nText:locale.language}}

\n\n \n \n
0\" [hidden]=\"!control.isVisible()\">\n \n \n
{{control.titulo | i18nText:locale.language}}
\n \n
\n \n
\n \n
\n
\n
\n
\n
\n\n \n\n\n","import { AfterContentChecked, ChangeDetectorRef, Component, Inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { ComponentFinishLoadingMessage, FloatingComponentsMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { FormControlComponent, FormComponentData, FormControl, FormComponentType } from '../../models/people/form-control.model';\nimport { Form, FormConfiguration } from '../../models/people/form.model';\nimport { Link } from '../../models/people/link.model';\n\n@Component({\n selector: 'app-form',\n templateUrl: './form.component.html',\n styleUrls: ['./form.component.css']\n})\nexport class FormComponent implements OnInit, OnDestroy, AfterContentChecked {\n private ngUnsubscribe = new Subject();\n\n private _idAreaSistema:number;\n\n @Input() set idAreaSistema(value:number){\n\n if(this._idAreaSistema == value)\n return;\n\n this._idAreaSistema = value;\n \n this.loadForm();\n }\n\n // Dictionary where key is componentName and value is object\n @Input() formConfigurationData : {[componentName: string] : any; };\n\n data: any; \n form: Form;\n controles: FormControl[];\n formConfiguration: FormConfiguration;\n tipoComponente = FormComponentType;\n loadingForm: boolean = false;\n \n // Logic to wait for all component to finish loading before showing the form\n waitForComponentsToFinish = false;\n componentsFinishLoading = false;\n componentsConfirmedFinishLoading = 0;\n\n anonymousComponentName:string;\n\n constructor(\n private baseService: BaseService,\n private layoutService: LayoutService,\n private activatedRoute: ActivatedRoute,\n private appStorageService: AppStorageService, \n private messageBusService: MessageBusService,\n private router: Router,\n private changeDetector: ChangeDetectorRef,\n @Inject(L10N_LOCALE) public locale: L10nLocale) \n {\n this.form = new Form();\n this.controles = [];\n\n this.layoutService.hideComponentSource$\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((data:FormComponentData)=>{\n this.changeVisibilityComponent(data);\n });\n }\n\n ngOnInit(): void {\n\n // Se comenta el subcribe para recargar el formulario ya que no falla en las pruebas (mi salud) y es innecesario.\n // this.messageBusService.onReloadFormComponent().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.loadFromIdAreaCliente.bind(this)); \n // this.messageBusService.sendReloadFormComponent(this._idAreaSistema);\n\n this.loadFromIdAreaCliente();\n\n // This will be use in case the form is configured to wait for all components to finish loading before showing the content\n this.messageBusService.onComponentFinishLoading()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message => {\n this.onComponentFinishLoading(message);\n });\n\n // Form configuration event\n this.messageBusService.onFormConfiguration()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message => {\n this.formConfiguration = message.config;\n });\n\n // Control compoenent configuration classname\n this.messageBusService.onControlComponentClassname()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message => {\n const controlComponent = this.controles.find(control=> control.componentes.filter(c => c.nombre === message.conponentName).length > 0);\n\n if(controlComponent)\n controlComponent.className = message.classname;\n });\n }\n\n private loadFromIdAreaCliente(): void {\n if(this._idAreaSistema > 0 && !this.loadingForm){\n this.loadForm();\n }\n else{\n this.activatedRoute.data\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(data => {\n \n let tokenObject = this.appStorageService.getToken();\n if(!tokenObject && data.nombreComponenteAnonimo){\n this.anonymousComponentName = data.nombreComponenteAnonimo;\n }else if(data.idAreaSistema){\n this._idAreaSistema = data.idAreaSistema;\n this.loadForm();\n }\n else{\n this.getDataByMenu();\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n ngAfterContentChecked(): void {\n this.changeDetector.detectChanges();\n }\n\n loadForm() {\n this.loadingForm = true;\n\n this.layoutService.getForm(this._idAreaSistema)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((form:Form)=>{\n this.loadingForm = false;\n\n if(!form) return;\n\n this.form = new Form(form);\n this.controles = form ? form.controles.map(c=> { return new FormControl(c) }) : [];\n\n this.parseFormData(form);\n \n this.sendFloatingComponents();\n });\n }\n\n parseFormData(form: Form) {\n if (form.valor) {\n try {\n this.form.configuracion = new FormConfiguration(JSON.parse(form.valor));\n\n if (this.form.configuracion){\n this.waitForComponentsToFinish = this.form.configuracion.waitForComponents;\n\n this.formConfiguration = this.form.configuracion;\n } \n \n if(!this.waitForComponentsToFinish){\n this.sendFormFinishLoadingMessage(this._idAreaSistema);\n }\n } \n catch (error) {}\n }\n }\n\n sendFloatingComponents(){\n\n let components: FormControlComponent[] = [];\n\n this.controles.forEach(c=>{\n components = components.concat(c.componentes.filter(cp=>cp.contenedor));\n });\n\n let message = new FloatingComponentsMessage();\n\n message.componentsData = components.map(c => this.getComponentData(c));\n\n\n this.messageBusService.sendFloatingComponents(message);\n \n }\n\n onComponentFinishLoading(message: ComponentFinishLoadingMessage) {\n \n // If this form is not configured to wait for components to load lets just ignore this event\n if (!this.waitForComponentsToFinish)\n return;\n\n if (message.idFormulario == this.form.id) {\n this.componentsConfirmedFinishLoading += 1;\n\n if (this.controles.length == this.componentsConfirmedFinishLoading){\n this.componentsFinishLoading = true;\n\n this.sendFormFinishLoadingMessage(this._idAreaSistema);\n }\n }\n }\n\n isFormVisible() {\n let result = (!this.waitForComponentsToFinish || this.componentsFinishLoading) && !this.anonymousComponentName;\n\n return result;\n }\n\n isAnonymousComponentVisible(){\n return this.anonymousComponentName != undefined;\n }\n\n getForm(){\n return this.layoutService.getForm(this._idAreaSistema);\n }\n\n getDataByMenu(){\n let links: Link[] = this.appStorageService.getItemSession(STORAGE.MENU, true);\n const cleanUrl = this.router.url.replace(\"/\", \"\");\n const completePath = cleanUrl.split(\"?\")[0];\n const path = completePath.split(\"/\")[0];\n\n if(path == '') {\n let firstLink = links[0].identificadorUrl\n ? links[0].identificadorUrl\n : links[0].subMenu.length > 0\n ? links[0].subMenu[0].identificadorUrl\n : links[1].identificadorUrl\n\n this.baseService.goToRoute(firstLink);\n }\n else{\n let link = this.findLink(links, cleanUrl) ?? this.findLink(links, path);\n\n if(link){\n let tokenObject = this.appStorageService.getToken();\n\n if(!tokenObject && link.nombreComponenteAnonimo){\n this.anonymousComponentName = link.nombreComponenteAnonimo;\n }else{\n this._idAreaSistema = link.idAreaSistema;\n this.loadForm();\n }\n }\n }\n }\n\n private findLink(arg0:Link[] | null, arg1: string): Link | undefined {\n let resultado: Link | undefined;\n for (let item of (arg0 ?? [])) {\n\n resultado = item.identificadorUrl \n && (item.identificadorUrl == arg1 \n || item.identificadorUrl.split(\"?\")[0] == arg1\n || item.identificadorUrl.split(\"?\")[0].split(\"/\")[0] == arg1)\n ? item \n : this.findLink(item.subMenu, arg1);\n\n if (resultado) break;\n }\n return resultado;\n }\n\n getFlexStyle(control: FormControl){\n if(!control) return 0;\n let porc = control.numeroControlesPorFila ? 100 / control.numeroControlesPorFila : 100;\n return `1 1 ${porc}%`;\n }\n\n leakedComponents(components:FormControlComponent[]){\n return components.filter(c=> !c.contenedor);\n }\n\n getComponentData(component:FormControlComponent){\n let componentData = new FormComponentData();\n componentData.nombreComponente = component.nombre;\n componentData.contenedor = component.contenedor;\n componentData.valor = component.valor;\n componentData.idControlPadre = component.idControl;\n componentData.idFormulario = this.form.id;\n componentData.nombreFormulario = this.form.nombre;\n\n if (this.formConfigurationData && this.formConfigurationData[componentData.nombreComponente] != undefined) {\n componentData.configurationData = this.formConfigurationData[componentData.nombreComponente];\n }\n\n return componentData; \n }\n\n changeVisibilityComponent(data:FormComponentData){\n let control = this.controles.find(c => c.id == data.idControlPadre);\n\n if(!control) return;\n\n let component = control.componentes.find(c => c.nombre == data.nombreComponente);\n \n if(!component) return;\n \n component.visible = false;\n }\n\n sendFormFinishLoadingMessage(idAreaSistema: number){\n\n this.messageBusService.formFinishLoading(idAreaSistema);\n }\n}\n","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\n\r\n@Component({\r\n selector: 'app-learn-more',\r\n templateUrl: './learn-more.component.html',\r\n styleUrls: ['./learn-more.component.css']\r\n})\r\n@ComponentLookup('LearnMoreComponent')\r\nexport class LearnMoreComponent implements OnInit, OnDestroy {\r\n data: FormComponentData;\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private messageBusService: MessageBusService,\r\n private routeDialogService: RouteDialogService\r\n ) { }\r\n\r\n ngOnInit(): void { \r\n // On Header Back click\r\n this.messageBusService.onNavigateBack()\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(m => {\r\n this.routeDialogService.closeDialogsAndNavigate(\"/citas/checkout\");\r\n });\r\n } \r\n \r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n}","
\r\n \r\n \r\n \r\n \r\n
\r\n {{ 'shared.learnMore.title' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.learnMore.subtitle1' | translate:locale.language }}\r\n
\r\n

\r\n {{ 'shared.learnMore.text1' | translate:locale.language }}\r\n

\r\n
\r\n {{ 'shared.learnMore.subtitle2' | translate:locale.language }}\r\n
\r\n

\r\n {{ 'shared.learnMore.text2' | translate:locale.language }}\r\n

\r\n
\r\n
\r\n
","import { Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { RouteDialogType } from '../dialogs/route-dialog/route-dialog.component';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LegalAgreements } from '../../interfaces/legal-agreements';\nimport { LegalAgreementType } from '../../enums/legal-agreements-type.enum';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'app-legal-agreements',\n templateUrl: './legal-agreements.component.html',\n styleUrls: ['./legal-agreements.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class LegalAgreementsComponent implements OnInit, OnDestroy {\n\n legalAgreements: LegalAgreements = {\n content: `

Contenido no disponible.

`,\n id: 'generico',\n language: 'es',\n title: 'No se encontrĆ³ el acuerdo legal'\n };\n @Input() type: string;\n\n private ngUnsubscribe = new Subject();\n\n constructor(\n private baseService: BaseService,\n private messageBusService: MessageBusService,\n private route: ActivatedRoute,\n private routeDialogService: RouteDialogService\n ) {\n\n this.messageBusService.onNavigateBack()\n .pipe(takeUntil(this.ngUnsubscribe)) \n .subscribe(x => this.routeDialogService.closeDialog(RouteDialogType.LEGALAGREEMENTS));\n\n this.route.data\n .pipe(takeUntil(this.ngUnsubscribe)) \n .subscribe(data => this.type = data['id']);\n }\n\n ngOnInit(): void {\n switch(this.type) {\n case LegalAgreementType.DISCLAIMER:\n this.legalAgreements = this.baseService.getDisclaimer() ?? this.legalAgreements;\n break;\n case LegalAgreementType.POLITICA_PRIVACIDAD:\n this.legalAgreements = this.baseService.getPrivacyPolicy() ?? this.legalAgreements;\n break;\n case LegalAgreementType.TERMINOS_CONDICIONES:\n this.legalAgreements = this.baseService.getTermsAndConditions() ?? this.legalAgreements;\n break;\n default:\n this.legalAgreements = this.legalAgreements;\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n}\n","
\n
\n

{{legalAgreements.title}}

\n
\n
\n
\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpBaseService } from './http-base-service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PrintsService {\r\n\r\n private url = 'api/impresiones';\r\n\r\n constructor(\r\n private http: HttpBaseService\r\n ) { }\r\n\r\n getPdf(args: MedicalOrderReport):Observable {\r\n return this.http.post(`${this.url}/pdf`, args);\r\n }\r\n\r\n}\r\n\r\nexport interface MedicalOrderFile {\r\n fileName: string;\r\n pdfBase64: string;\r\n}\r\n\r\nexport interface MedicalOrderReport {\r\n valorLocalizacion: string;\r\n idAreaSistema: number;\r\n idAreaSistemaImpresion: number;\r\n idEmpresa: number;\r\n idPersona: number;\r\n idResponsableImpresion: number;\r\n urlLogoEmpresa: string;\r\n htmlReporte: string;\r\n formatoHoja: FormatoHojaReporte;\r\n idPaciente: number;\r\n idResponsableServicio: number;\r\n idContactoClinico: number;\r\n idHistoriaClinicaActualQR: number;\r\n idEmpresaDestino: number;\r\n urlFirma: string;\r\n idLocalidad: number;\r\n fechaOrdenMedica: Date;\r\n comentario: string;\r\n diagnosticos: string;\r\n numeroOrden: string;\r\n esProfesionalVerificado: boolean;\r\n licenciaProfesionalInfo: LicenciaProfesional;\r\n categorias: ReporteCategoriaConceptoDTO[]; \r\n}\r\n\r\nexport class ReporteCategoriaConceptoDTO\r\n{\r\n nombre?: string;\r\n cantidad?: number;\r\n conceptos?: ReporteCategoriaConceptoDTO[];\r\n comentario?: string;;\r\n}\r\n\r\nexport class LicenciaProfesional {\r\n Codigo: string;\r\n Especialidad: string;\r\n Folio: string\r\n Nombre: string;\r\n Registro: string;\r\n}\r\n\r\nexport enum FormatoHojaReporte\r\n{\r\n CARTA,\r\n PERSONALIZADO\r\n}\r\n","
\n
\n \n
\n {{nombreResponsableServicio}}\n {{nombreEspecialidad}}\n {{registro}}\n
\n  PROFESIONAL VERIFICADO\n
\n
\n
\n
","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { DoctorService } from 'src/app/core/services/doctors.service';\nimport { LicenciaProfesional } from 'src/app/core/services/prints.service';\nimport { LicenseDoctor } from 'src/app/shared/models/clinic-history/license-doctor.model';\n\n@Component({\n selector: 'app-summary-order-sign',\n templateUrl: './summary-order-sign.component.html',\n styleUrls: ['./summary-order-sign.component.css']\n})\nexport class SummaryOrderSignComponent implements OnChanges {\n\n @Input() idResponsableServicio: number;\n sign: string;\n nombreResponsableServicio: string;\n nombreEspecialidad: string;\n registro: string;\n esProfesionalVerificado = false;\n json: LicenciaProfesional;\n private _signPdf = '';\n\n get signPdf() { return this._signPdf; }\n \n constructor(private doctorService: DoctorService) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.idResponsableServicio && changes.idResponsableServicio.currentValue > 0) {\n this.doctorService.getLicense(this.idResponsableServicio).subscribe(this.procesarIdoneidad.bind(this));\n }\n }\n\n private procesarIdoneidad(args: LicenseDoctor): void {\n const informacionResponsableServicio = args.informacionResponsableServicio;\n const licencia = args.licenciasProfesional\n .filter(x => x.idIdentificacionPersona == informacionResponsableServicio.idIdentificacionIdoneidadProfesionalDefault)[0];\n\n if (licencia) {\n this.json = JSON.parse(licencia.jsonIdentificacion);\n\n this.nombreResponsableServicio = this.json.Nombre;\n this.nombreEspecialidad = this.json.Especialidad;\n this.registro = `${this.json.Registro ? `Reg. ${this.json.Registro}` : ''} ${this.json.Codigo ? `Cod. ${this.json.Codigo}` : ''} ${this.json.Folio ? `Folio. ${this.json.Folio}` : ''}`\n }\n\n this.esProfesionalVerificado = informacionResponsableServicio.profesionalVerificado == 'S';\n this.sign = args.documentosFirma\n .filter(x => x.idDocumento == informacionResponsableServicio.idDocumentoImagenFirma)\n .map(x => x.direccionUbicacionWeb)[0];\n this._signPdf = args.documentosFirma\n .filter(x => x.idDocumento == informacionResponsableServicio.idDocumentoImagenFirma)\n .map(x => x.nombreBucketAmazonS3 ? x.direccionUbicacionWeb : x.direccionUbicacionFisica)[0];\n }\n\n imgError(event: Event) {\n const element = event.target as HTMLImageElement;\n element.style.visibility = \"hidden\";\n event.preventDefault();\n }\n\n imgLoad(event: Event) {\n const element = event.target as HTMLImageElement;\n element.style.visibility = \"visible\";\n event.preventDefault();\n }\n\n}\n","
\n {{posologia}}\n
\n Comentarios: {{observaciones}}\n
","import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ClinicalHistoryItem } from 'src/app/shared/interfaces/clinical-history-item';\n\n@Component({\n selector: 'app-summary-order-concept-value',\n templateUrl: './summary-order-concept-value.component.html',\n styleUrls: ['./summary-order-concept-value.component.css']\n})\nexport class SummaryOrderConceptValueComponent implements OnInit {\n\n @Input() item: ClinicalHistoryItem;\n observaciones: string;\n posologia?: string;\n \n constructor() { }\n\n ngOnInit(): void {\n this.posologia = this.item.valorConcepto;\n const json = this.item.jsonHistoriaClinicaActual || this.item.jsonOrdenMedicaDetalle\n if (json) {\n this.procesarJson(json);\n }\n }\n\n private procesarJson(json: string): void {\n const obj = JSON.parse(json);\n if (obj?.Comentarios) {\n this.posologia = this.posologia?.replace(obj.Comentarios, '').trim();\n this.posologia = (this.posologia || '').length <= 1 ? this.posologia?.replace('.',''): this.posologia;\n this.observaciones = obj.Comentarios;\n }\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Location } from \"@angular/common\";\nimport { NavigationEnd, Router } from '@angular/router';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NavigationService {\n private history: string[] = [];\n\n constructor(private router: Router, private location: Location) {\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationEnd) {\n this.history.push(event.urlAfterRedirects);\n }\n });\n }\n\n back(): void {\n this.history.pop();\n if (this.history.length > 0) {\n this.location.back();\n }\n else {\n this.router.navigateByUrl(\"/\");\n }\n }\n\n getNavigator(): Navigator {\n return window.navigator;\n }\n\n canShare(data: { files: File[] }): boolean {\n const navigator = this.getNavigator();\n return !!navigator.canShare ? navigator.canShare(data) : false;\n }\n\n share(data: ShareData): Promise {\n const nav = this.getNavigator();\n if (nav.share) {\n return nav.share(data);\n } else {\n return Promise.reject('Share API no soportada en este navegador.');\n }\n }\n\n isNavigatorAvailable(): boolean {\n return !!window.navigator && !!window.navigator.share;\n }\n}\n\ninterface ShareData {\n title?: string;\n text?: string;\n url?: string;\n files?: File[];\n}\n\ninterface Navigator {\n canShare?: (data?: ShareData) => boolean;\n share?: (data: ShareData) => Promise;\n}","","import { isPlatformBrowser } from '@angular/common';\nimport { Component, HostBinding, Inject, Input, OnInit, PLATFORM_ID } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { NavigationService } from 'src/app/core/services/navigation.service';\n\n@Component({\n selector: 'app-summary-order-download-button',\n templateUrl: './summary-order-download-button.component.html',\n styleUrls: ['./summary-order-download-button.component.css']\n})\nexport class SummaryOrderDownloadButtonComponent implements OnInit {\n\n @HostBinding('style.flex-grow') flexGrow = '1';\n @HostBinding('style.max-width') maxWidth = '464px';\n @Input() share = false;\n @Input() file: File;\n\n buttonText:string = '';\n loading: boolean = false;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private navigationService: NavigationService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { \n }\n\n ngOnInit(): void {\n this.buttonText = this.share \n ? 'shared.medicalOrder.summary.buttonShareOrder' \n : 'shared.medicalOrder.summary.buttonDownloadOrder';\n }\n\n onClick(): void{\n this.loading = true;\n if(this.share){\n this.compartirArchivo(this.file);\n }\n else{\n this.fallbackDownload(this.file);\n }\n this.loading = false;\n }\n\n private compartirArchivo(file: File): void {\n if (isPlatformBrowser(this.platformId) && this.navigationService.isNavigatorAvailable() && this.navigationService.canShare({ files: [file] })) {\n this.navigationService.share({\n title: 'Compartir reporte',\n text: 'Revisa este reporte mƩdico',\n files: [file],\n }).then(() => {\n console.log('Compartido exitosamente');\n }).catch((error) => {\n console.error('Error al compartir', error);\n // this.fallbackDownload(file);\n });\n } else {\n console.error('El navegador no soporta compartir archivos.');\n this.fallbackDownload(file);\n }\n }\n\n private fallbackDownload(file: File): void {\n const blobUrl = URL.createObjectURL(file);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = file.name;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n}\n","","import { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\nimport { Component, Inject, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { MEDICAL_REQUEST_TYPE } from 'src/app/shared/enums/medical-request-type.enum';\nimport { AttentionsHistory } from 'src/app/shared/interfaces/attentions-history';\nimport { ClinicalHistoryItem } from 'src/app/shared/interfaces/clinical-history-item';\n\n@Component({\n selector: 'app-summary-order-footer',\n templateUrl: './summary-order-footer.component.html',\n styleUrls: ['./summary-order-footer.component.css']\n})\nexport class SummaryOrderFooterComponent implements OnDestroy, OnChanges {\n\n @Input() idPaciente = -1;\n @Input() inWorflow: boolean = true;\n @Input() idTipoSolicitud: number;\n @Input() nombreTipoSolicitud: string;\n @Input() file: File;\n\n buttonSecondaryText = 'shared.medicalOrder.summary.buttonText2';\n buttonPrimaryText = 'shared.medicalOrder.summary.buttonTextPrescriptions';\n\n private ngUnsubscribe = new Subject();\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private breakpointObserver: BreakpointObserver,\n private messageBusService: MessageBusService,\n private userService: UserService\n ) {\n this.breakpointObserver.observe(Breakpoints.Handset).pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.mobileNext.bind(this));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.nombreTipoSolicitud) {\n this.buttonPrimaryText = `${this.nombreTipoSolicitud}Button`;\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n private mobileNext(x: BreakpointState): void {\n if (!x.matches) return;\n this.buttonSecondaryText = 'shared.medicalOrder.summary.buttonTextMobile2';\n }\n\n verOrdenes(): void {\n\n this.userService.getUserIdLoggedIn()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((userId: number) => {\n let pagina = MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION == this.idTipoSolicitud \n ? 'recetas' \n : 'laboratorio';\n \n let url = `mi-salud/${pagina}`;\n\n if (userId != this.idPaciente) {\n url += `?p=${this.idPaciente}`;\n }\n\n this.messageBusService.closeWorkFlowRequest(url);\n });\n }\n\n irInicio(): void {\n this.messageBusService.closeWorkFlowRequest('inicio');\n }\n\n}\n","
\n

\n {{ 'shared.medicalOrder.summary.text1' | translate:locale.language:{ tipoSolicitud: (title | translate:locale.language) } }}\n

\n

\n {{ 'shared.medicalOrder.summary.text2' | translate:locale.language:{patientName: patient?.nombre, tipoSolicitud: (title | translate:locale.language)} }}\n

\n
\n
\n
\n \n
\n \n
\n \n {{ requestTypeName | translate:locale.language:{requestNumber: requestNumber} }}\n \n \n Fecha: {{dateString}}\n \n
\n
\n
\n
\n
\n
\n \n {{ 'shared.medicalOrder.summary.patientTitle' | translate:locale.language }} \n
\n {{patient?.nombre}} {{patient?.apellido}}\n {{patient?.fechaNacimiento | ageFromBirthday}}\n {{patient?.cedula || 'No disponible'}}\n \n {{patient?.emailParticular || 'N/A'}}\n \n \n {{patient?.telefonoCelularParticular}}\n \n
\n
\n
\n \n {{ 'shared.medicalOrder.summary.healthcareProfesionalTitle' | translate:locale.language }} \n
\n
\n\t\t\t\t\t\t
{{publicProfile?.nombrePersona}}
\n\t\t\t\t\t\t\n\t\t\t\t\t
\n \n {{publicProfile?.especialidad || 'N/A'}}\n \n \n {{history?.empresaPortal?.denominacion || ''}}\n \n \n {{history?.empresaPortal?.direccionLaboral || ''}} {{history?.empresaPortal?.nombreCanonicoDivisionTerritorialLaboral || ''}}\n \n \n {{history?.empresaPortal?.numeroTelCelular || 'N/A'}}, {{history?.empresaPortal?.numeroTelParticular || ''}}\n \n \n {{history?.empresaPortal?.emailLaboral || history?.empresaPortal?.emailParticular || 'N/A'}}\n \n
\n \n
\n
\n \n {{'shared.medicalOrder.summary.' + diagnosticosLabel | translate:locale.language}}:\n {{diagnosticos}}\n \n
\n
    \n
  1. \n \n {{item.nombreConcepto || item.nombreConceptoClinico}}\n (Total: #{{item.cantidad}})\n
    \n \n
    \n
      \n
    • \n {{item2.nombreConcepto || item2.nombreConceptoClinico}}
      \n {{item2.valorConcepto}}\n
    • \n
    \n
  2. \n
\n
\n
{{'shared.medicalOrder.summary.comment' | translate:locale.language}}
\n
{{comentarios.valorConcepto}}
\n
\n
\n \n
\n\n \n
\n
","import { Component, Inject, Input, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { forkJoin, Observable, of, Subject } from 'rxjs';\nimport { map, takeUntil } from 'rxjs/operators';\nimport { MedicalOrderService } from 'src/app/core/services/medical-order.service';\nimport { CloseRouteDialogMessage, ComponentFinishLoadingMessage, MessageBusService, NavigationBackMessage } from 'src/app/core/services/message-bus.service';\nimport { PatientService } from 'src/app/core/services/patient.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { ComponentName } from 'src/app/shared/enums/component-name.enum';\nimport { CONCEPTOS_ID, MEDICAL_REQUEST_TYPE, MY_MEDICAL_ORDER_PRINT_SYSTEM_AREA, TIPO_CONCEPTOS_ID, TITLE_MAPPING } from 'src/app/shared/enums/medical-request-type.enum';\nimport { AttentionsHistory } from 'src/app/shared/interfaces/attentions-history';\nimport { ClinicalHistoryItem } from 'src/app/shared/interfaces/clinical-history-item';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\nimport { PatientVerificationComponentData, PatientVerificationDataModel } from 'src/app/shared/models/workflow/models/patient-verification-data.model';\nimport { RouteDialogType } from '../../dialogs/route-dialog/route-dialog.component';\nimport { MedicalOrder } from 'src/app/shared/interfaces/medical-order';\nimport { Location } from 'src/app/shared/models/people/location.model';\nimport { BreakpointObserver, BreakpointState, Breakpoints } from '@angular/cdk/layout';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { PatientPartial } from 'src/app/shared/interfaces/patient-partial';\nimport { ClinicContact } from 'src/app/shared/interfaces/clinic-contact';\nimport { RequestsToVerifyConfirmationResponse, RequestsToVerifyService } from 'src/app/core/services/requests-to-verify.service';\nimport { FormatoHojaReporte, MedicalOrderFile, MedicalOrderReport, PrintsService, ReporteCategoriaConceptoDTO } from 'src/app/core/services/prints.service';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DoctorService } from 'src/app/core/services/doctors.service';\nimport { SummaryOrderSignComponent } from './summary-order-sign/summary-order-sign.component';\n\n@Component({\n selector: 'app-summary-medical-order',\n templateUrl: './summary-medical-order.component.html',\n styleUrls: ['./summary-medical-order.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup(ComponentName.SUMMARY_MEDICAL_ORDER)\nexport class SummaryMedicalOrderComponent implements IControlComponent, OnInit {\n\n @Input() inWorflow: boolean = true;\n @ViewChild(SummaryOrderSignComponent) summaryOrderSignComponent: SummaryOrderSignComponent;\n atenciones: ClinicalHistoryItem[] = [\n { nombreConcepto: '', items: [ { nombreConcepto: '' }, { nombreConcepto: '' }, { nombreConcepto: '' }, { nombreConcepto: '' }, { nombreConcepto: '' } ] },\n { nombreConcepto: '', items: [ { nombreConcepto: '' }, { nombreConcepto: '' }, { nombreConcepto: '' } ] }\n ];\n componentData: PatientVerificationComponentData;\n comentarios?: ClinicalHistoryItem;\n diagnosticos = '';\n diagnosticosLabel = 'diagnosis';\n data: any;\n initialLoading = true;\n loading = false;\n model = new PatientVerificationDataModel();\n isAndroid = false;\n history: AttentionsHistory = {\n solicitud: { fechaInicio: '1990-04-02', idResponsableServicio: 0, idPersonaEmisora: 0, idTipoSolicitud: 29 },\n historialAtencion: { atenciones: []},\n ubicacionFotoLogoTitulo: '',\n empresaPortal: { denominacion: 'N/A', numeroTelParticular:'N/A', numeroTelCelular: 'N/A', direccionLaboral: 'N/A' }\n };\n dateString = 'N/A';\n language: string;\n localidad: Location;\n patient: PatientPartial;\n publicProfile?: PublicProfile | null;\n title = 'N/A';\n requestType = 0;\n requestTypeName = 'N/A';\n requestNumber = 'N/A';\n buttonSecondaryText = 'shared.medicalOrder.summary.buttonText2';\n buttonPrimaryText = 'shared.medicalOrder.summary.buttonTextPrescriptions';\n private ngUnsubscribe = new Subject();\n idPaciente: number;\n\n showHtmlComment: boolean = false;\n htmlComment: SafeHtml = '';\n\n file: File;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private baseService: BaseService,\n private doctorService: DoctorService,\n private messageBusService: MessageBusService,\n private medicalOrderSevice: MedicalOrderService,\n private requestsToVerifyService: RequestsToVerifyService,\n private publicProfileService: PublicProfileService,\n private medicalOrderService: MedicalOrderService,\n private printsService: PrintsService,\n private route: ActivatedRoute,\n private patientService: PatientService,\n private breakpointObserver: BreakpointObserver,\n private sanitizer: DomSanitizer\n ) {\n this.language = locale.dateLanguage ?? 'es-AR';\n this.messageBusService.onNavigateBack().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.onNavigateBackNext.bind(this));\n this.breakpointObserver.observe(Breakpoints.Handset).pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.mobileNext.bind(this));\n }\n\n ngOnInit(): void {\n const idVerificacion: string = this.route.snapshot.params.idVerificacion;\n if (this.inWorflow) {\n this.requestsToVerifyService.confirmation(idVerificacion).subscribe((confirmModel:RequestsToVerifyConfirmationResponse) => {\n\n this.idPaciente = confirmModel.idPaciente;\n\n this.medicalOrderSevice.get(idVerificacion).subscribe({ next: this.processAttentionsHistory.bind(this) });\n });\n } else {\n this.medicalOrderSevice.getById(idVerificacion)\n .pipe(map(this.mapMedicalOrderIntoHistory.bind(this)))\n .subscribe(this.processAttentionsHistory.bind(this));\n }\n }\n\n showNumbers(): boolean {\n return MEDICAL_REQUEST_TYPE.LABORATORY_ORDER == this.history?.solicitud?.idTipoSolicitud;\n }\n\n private onNavigateBackNext(x: NavigationBackMessage) {\n if (x.dialogId != RouteDialogType.MY_ORDER_SUMMARY) return;\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\n }\n\n private mobileNext(x: BreakpointState) {\n if (!x.matches) return;\n this.buttonSecondaryText = 'shared.medicalOrder.summary.buttonTextMobile2';\n }\n\n private mapMedicalOrderIntoHistory(order: MedicalOrder): AttentionsHistory {\n const result: AttentionsHistory = {\n empresaPortal: order.empresaPortal,\n historialAtencion: {\n atenciones: order.detalles.map(this.mapMedicalOrderDetails),\n contactoClinico: {idPaciente: order.idPacientePhr} as ClinicContact,\n },\n solicitud: {\n fechaInicio: order.fecha,\n idEmpresa: order.idEmpresaPortal,\n idPersonaEmisora: order.idPacientePhr,\n idResponsableServicio: order.idResponsableDoctor,\n idTipoSolicitud: order.idTipoSolicitud,\n idEmpresaCorporativa: order.idEmpresaPhr,\n numeroSolicitud: order.numeroSolicitud\n },\n ubicacionFotoLogoTitulo: order.ubicacionFotoLogoTitulo\n };\n return result;\n }\n\n private mapMedicalOrderDetails(item: ClinicalHistoryItem): ClinicalHistoryItem {\n const args = JSON.parse(item.jsonHistoriaClinicaActual || item.jsonOrdenMedicaDetalle || '{}');\n let cantidad = args?.Cantidad ?? 0;\n\n return { ...item, cantidad };\n }\n\n private processAttentionsHistory(args: AttentionsHistory): void {\n this.initializeHistory(args);\n this.parseControlData();\n this.setRequestTypeAndFilters(args);\n this.processComments(args);\n \n this.diagnosticos = this.getDiagnosis(args.historialAtencion.atenciones);\n\n this.loadDoctorAndpatientData(args);\n }\n private initializeHistory(args: AttentionsHistory): void {\n this.history = args;\n const solicitud = this.history?.solicitud;\n\n if (!solicitud) {\n throw new Error('Solicitud data no existe')\n }\n\n this.setTitle(solicitud.idTipoSolicitud, solicitud.numeroSolicitud);\n this.setDate(solicitud.fechaInicio);\n }\n private setRequestTypeAndFilters(args: AttentionsHistory): void {\n const solicitud = this.history?.solicitud;\n\n this.requestType = solicitud?.idTipoSolicitud ?? -1;\n this.atenciones = this.filterAtenciones(args.historialAtencion.atenciones).map(this.mapAtenciones.bind(this));\n\n this.atenciones.forEach(atencion => this.setItems(atencion, args));\n }\n private processComments(args: AttentionsHistory): void {\n this.comentarios = args.historialAtencion.atenciones.find(x => x.idConcepto == CONCEPTOS_ID.COMENTARIO);\n\n if(this.comentarios?.valorConcepto){\n this.showHtmlComment = this.baseService.isSerializedHtml(this.comentarios?.valorConcepto);\n this.htmlComment = this.sanitizer.bypassSecurityTrustHtml(this.comentarios?.valorConcepto);\n }\n }\n private loadDoctorAndpatientData(args: AttentionsHistory): void {\n const contactoClinico$ = args.historialAtencion.contactoClinico\n ? this.patientService.getPartial(args.historialAtencion.contactoClinico.idPaciente)\n : of(null);\n const publicProfile$ = this.publicProfileService.getPublicProfileByIds([this.history.solicitud.idResponsableServicio]);\n\n forkJoin([contactoClinico$, publicProfile$]).subscribe({\n next: ([patient, publicProfile]) => {\n if (patient) {\n this.patient = patient;\n }\n this.getPublicProfileByIdNext(publicProfile);\n\n this.getFile().subscribe(file => this.file = file, error => console.error(error), () => this.initialLoading = false);\n\n this.sendComponentFinishLoadingMessage();\n \n }\n });\n }\n private getFile(): Observable {\n const primeraAtencion = this.history.historialAtencion.atenciones[0];\n const body: MedicalOrderReport = {\n valorLocalizacion: 'es',\n idAreaSistema: this.history.solicitud.idAreaSistema ?? -1,\n idAreaSistemaImpresion: MY_MEDICAL_ORDER_PRINT_SYSTEM_AREA[this.history.solicitud.idTipoSolicitud ?? -1] ,\n idEmpresa: this.history.solicitud?.idEmpresa ?? -1,\n idPersona: this.history.solicitud?.idPersonaEmisora ?? -1,\n idResponsableImpresion: this.history.solicitud?.idResponsableServicio ?? -1,\n urlLogoEmpresa: this.history.ubicacionFotoLogoTitulo,\n htmlReporte: '',\n formatoHoja: FormatoHojaReporte.CARTA,\n idPaciente: this.history.historialAtencion.contactoClinico?.idPaciente ?? -1,\n idResponsableServicio: this.history.solicitud?.idResponsableServicio ?? -1,\n idContactoClinico: this.history.historialAtencion.contactoClinico?.id ?? -1,\n idHistoriaClinicaActualQR: primeraAtencion?.idHistoriaClinicaActualInicial ?? primeraAtencion?.id ?? -1,\n idEmpresaDestino: this.history.solicitud.idEmpresaCorporativa ?? this.baseService.getCompanyId(),\n idLocalidad: -1,\n fechaOrdenMedica: new Date(),\n comentario: this.comentarios?.valorConcepto ?? '',\n diagnosticos: this.diagnosticos,\n esProfesionalVerificado: this.summaryOrderSignComponent.esProfesionalVerificado,\n licenciaProfesionalInfo: this.summaryOrderSignComponent.json,\n urlFirma: this.summaryOrderSignComponent.signPdf,\n numeroOrden: this.medicalOrderService.buildRequestNumber(this.history.solicitud.idTipoSolicitud, this.history.solicitud.numeroSolicitud),\n categorias: this.obtenerCategoriasPorTiposolicitud(this.history.solicitud.idTipoSolicitud ?? -1, this.atenciones)\n };\n\n if (body.idHistoriaClinicaActualQR < 1) {\n throw new Error(\"No es posible obtener los datos necesarios para la generaciĆ³n del PDF\");\n }\n\n return this.printsService.getPdf(body).pipe(map((response)=>{\n return this.buildFile(response);\n }));\n }\n\n private buildFile(response: MedicalOrderFile): File {\n const byteCharacters = atob(response.pdfBase64);\n const byteNumbers = new Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n const blob = new Blob([byteArray], { type: 'application/pdf' });\n const file = new File([blob], response.fileName + '.pdf', { type: 'application/pdf' });\n\n return file; \n }\n\n private obtenerCategoriasPorTiposolicitud(idTipoSolicitud: number, conceptos: ClinicalHistoryItem[]): ReporteCategoriaConceptoDTO[] {\n if (idTipoSolicitud == MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION) {\n return [{nombre: \"Otros\", conceptos: this.obtenerCategoriasPorTiposolicitud(-1, conceptos)}]\n }\n return conceptos.map(this.mapearConceptos.bind(this));\n }\n\n private mapearConceptos(concepto: ClinicalHistoryItem): ReporteCategoriaConceptoDTO {\n const json = JSON.parse(concepto.jsonHistoriaClinicaActual || concepto.jsonOrdenMedicaDetalle || '{}');\n\n return {\n conceptos: concepto.items?.map(this.mapearConceptos.bind(this)),\n comentario: concepto.valorConcepto,\n nombre: concepto.nombreConcepto,\n cantidad: json.Cantidad\n }\n }\n \n private setTitle(idTipoSolicitud = 0, numeroSolicitud = 0): void {\n const currentRequestTypeName = TITLE_MAPPING[idTipoSolicitud] || '';\n\n this.requestNumber = this.medicalOrderSevice.buildRequestNumber(idTipoSolicitud, numeroSolicitud);\n this.requestTypeName = currentRequestTypeName;\n this.title = `${currentRequestTypeName}Short`;\n }\n\n private setDate(args?: string): void {\n if (!args) return;\n this.dateString = this.baseService.getBasicDateFormat(new Date(args), true);\n }\n\n private parseControlData(): void {\n this.loading = true;\n\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as PatientVerificationDataModel;\n\n if(this.model.idPaciente > 0){\n this.idPaciente = this.model.idPaciente;\n }\n\n this.componentData = this.model.configData;\n }\n\n this.loading = false;\n }\n\n private filterAtenciones(atenciones: ClinicalHistoryItem[]): ClinicalHistoryItem[] {\n return atenciones.filter(x => !x.idConceptoObjeto && x.idConcepto != CONCEPTOS_ID.COMENTARIO && x.idTipoConcepto != TIPO_CONCEPTOS_ID.DIAGNOSTICO);\n }\n private mapAtenciones(atencion: ClinicalHistoryItem) {\n const json = JSON.parse(atencion.jsonHistoriaClinicaActual || atencion.jsonOrdenMedicaDetalle || '{}');\n const cantidad = json?.Cantidad;\n\n return {...atencion, cantidad};\n }\n\n private getDiagnosis(atenciones: ClinicalHistoryItem[]): string {\n const diagnosis = atenciones\n .filter(x => x.idTipoConcepto == TIPO_CONCEPTOS_ID.DIAGNOSTICO)\n .map(x => x.valorCodigoTerminoReferenciaConceptoClinico || this.truncate(x.nombreConcepto));\n let result = diagnosis.join(', ');\n\n if (diagnosis.length > 1) {\n const lastItem = diagnosis.pop();\n result = `${diagnosis.join(', ')} y ${lastItem}`;\n this.diagnosticosLabel = 'diagnoses';\n }\n\n return result;\n }\n\n private truncate(text: string, maxLength = 28): string {\n let result = text;\n if (text.length > maxLength) {\n result = `${text.substring(0, maxLength)}...`\n }\n return result;\n }\n\n private setItems(x: ClinicalHistoryItem, args: AttentionsHistory): void {\n x.items = args.historialAtencion.atenciones.filter(y => y.idConceptoObjeto == x.idConcepto);\n }\n\n private sendComponentFinishLoadingMessage(): void {\n if (!this.data) return;\n\n const event = new ComponentFinishLoadingMessage();\n \n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n private getPublicProfileByIdNext(args: (PublicProfile | null)[]): void {\n this.publicProfile = args[0];\n }\n\n imgError(event: Event) {\n const element = event.target as HTMLImageElement;\n element.style.visibility = \"hidden\";\n event.preventDefault();\n }\n\n}","
\r\n\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n {{loggedInUser.nombre}}\r\n ({{'shared.profileMenu.text1' | translate:locale.language}})\r\n {{loggedInUser.username}}\r\n {{'shared.profileMenu.text16' | translate:locale.language}}\r\n \r\n
\r\n \r\n
\r\n \r\n
0\">\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {{dependent.nombre.toLowerCase()}}\r\n ({{dependent.relationshipName}})\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n \r\n {{'shared.profileMenu.text2' | translate:locale.language}}\r\n \r\n {{'shared.profileMenu.text3' | translate:locale.language}}\r\n \r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n {{'shared.profileMenu.text4' | translate:locale.language}}\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n \r\n \r\n {{'language' | translate:locale.language}}\r\n \r\n \r\n
\r\n\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n {{'shared.profileMenu.text6' | translate:locale.language}}\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n {{'shared.profileMenu.text7' | translate:locale.language}}\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n
","import { Component, Inject, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { AuthService } from 'src/app/core/services/auth.service';\r\nimport { FloatingComponentsMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { UtilsService } from 'src/app/core/services/utils.service';\r\nimport { Dependent } from 'src/app/shared/models/people/dependent.model';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { ChangePasswordRouteDialogModel, ConfigurationPageDialogModel } from '../../dialogs/route-dialog/route-dialog.component';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { Router } from '@angular/router';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { ContainerType } from 'src/app/shared/enums/container-type.enum';\r\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-profile-menu',\r\n templateUrl: './profile-menu.component.html',\r\n styleUrls: ['./profile-menu.component.css']\r\n})\r\n\r\nexport class ProfileMenuComponent implements OnDestroy, OnInit {\r\n\r\n loggedInUser: UserPerson;\r\n loggedInUserInitials: any;\r\n dependents: ProfileMenuDependentModel[]; \r\n\r\n translations = {\r\n other: \"\",\r\n son: \"\",\r\n daughter: \"\",\r\n father: \"\",\r\n mother: \"\",\r\n language: \"\", \r\n };\r\n private ngUnsubscribe = new Subject();\r\n @Input() dialog: MatDialogRef;\r\n\r\n constructor(\r\n private appStorageService: AppStorageService,\r\n private userService: UserService,\r\n private authService: AuthService,\r\n private utilsService: UtilsService, \r\n private routeDialogService: RouteDialogService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n private router: Router,\r\n private dialogRef: MatDialog,\r\n private messageBusService: MessageBusService\r\n ) {\r\n this.messageBusService.onRefreshProfileMenu().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.loadData.bind(this));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.translation.onChange().subscribe({\r\n next: () => {\r\n this.translations.other = this.translation.translate('shared.profileMenu.text8');\r\n this.translations.son = this.translation.translate('shared.profileMenu.text9');\r\n this.translations.daughter = this.translation.translate('shared.profileMenu.text10');\r\n this.translations.father = this.translation.translate('shared.profileMenu.text11');\r\n this.translations.mother = this.translation.translate('shared.profileMenu.text12');\r\n this.translations.language = this.translation.translate('language');\r\n }\r\n });\r\n\r\n this.loadData();\r\n }\r\n\r\n private loadData(): void {\r\n \r\n this.userService.getUserPersonLoggedIn().subscribe(this.setLoggedInUser.bind(this));\r\n\r\n this.userService.getUserDependents().subscribe(d => {\r\n this.dependents = d as ProfileMenuDependentModel[];\r\n\r\n // Order by age desc\r\n this.dependents = this.dependents.sort((d1: ProfileMenuDependentModel, d2: ProfileMenuDependentModel) => {\r\n let getTime = (date: Date) => {return date != null ? new Date(date).getTime() : 0;};\r\n \r\n return getTime(d1.fechaNacimiento) - getTime(d2.fechaNacimiento);\r\n });\r\n\r\n this.setUpDependentExtraData();\r\n });\r\n }\r\n\r\n private setLoggedInUser(p: UserPerson | null): void {\r\n if (p) {\r\n const token = this.appStorageService.getToken();\r\n\r\n this.loggedInUser = p;\r\n\r\n let fullName = this.loggedInUser.nombre + \" \" + (this.loggedInUser.apellido?? \"\");\r\n this.loggedInUserInitials = this.utilsService.getPersonInitials(this.loggedInUser.id, fullName);\r\n let birthDate = this.loggedInUser.fechaNacimiento? new Date(this.loggedInUser.fechaNacimiento) : null;\r\n\r\n this.loggedInUser.username = !!token ? token.username : '';\r\n\r\n if (!this.loggedInUser.ubicacionLogo)\r\n this.loggedInUser.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(birthDate, this.loggedInUser.sexo); \r\n }\r\n }\r\n\r\n setUpDependentExtraData() {\r\n this.dependents.forEach(dependent => {\r\n dependent.fullName = dependent.nombre + \" \" + dependent.apellido; \r\n dependent.relationshipName = this.userService.getDependentRelationshipName(dependent);\r\n\r\n let birthDate = dependent.fechaNacimiento? new Date(dependent.fechaNacimiento) : null;\r\n\r\n if (!dependent.ubicacionLogo)\r\n dependent.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(birthDate, dependent.sexo);\r\n });\r\n } \r\n\r\n onEditUserClick() {\r\n let routeDialogModel = new ConfigurationPageDialogModel();\r\n routeDialogModel.route = \"configuracion/usuario\";\r\n routeDialogModel.state = null;\r\n \r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n onEditDependentClick(dependent: ProfileMenuDependentModel) {\r\n let routeDialogModel = new ConfigurationPageDialogModel();\r\n routeDialogModel.route = \"configuracion/dependiente/\" + dependent.id;\r\n routeDialogModel.state = null;\r\n\r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n onAddDependentClick() {\r\n let routeDialogModel = new ConfigurationPageDialogModel();\r\n routeDialogModel.route = \"configuracion/dependiente/edicion/0\";\r\n routeDialogModel.state = null;\r\n\r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n onPaymentsClick() {\r\n let routeDialogModel = new ConfigurationPageDialogModel();\r\n routeDialogModel.route = \"configuracion/pagos\";\r\n routeDialogModel.state = null;\r\n\r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n onLocaleEditClick() {\r\n let routeDialogModel = new ConfigurationPageDialogModel();\r\n routeDialogModel.route = \"configuracion/locale\";\r\n routeDialogModel.state = null;\r\n\r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n \r\n onChangePasswordClick() {\r\n let routeDialogModel = new ChangePasswordRouteDialogModel(); \r\n routeDialogModel.route = \"login/restablecer\"; \r\n routeDialogModel.state = null;\r\n \r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n closeSession() {\r\n let dialogData = new DialogData();\r\n \r\n dialogData.title = this.translation.translate(\"shared.profileMenu.text13\"); \r\n dialogData.confirmText = this.translation.translate(\"shared.profileMenu.text14\"); \r\n dialogData.showHeaderIcon = false;\r\n //dialogData.headerIconClass = \"phr-iconset-info\"; \r\n dialogData.showCancelButton = true;\r\n dialogData.cancelText = this.translation.translate(\"shared.profileMenu.text15\");\r\n\r\n const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: ['cliniweb-theme-dialog', 'confirm-logout-dialog', 'confirm-logout-animation-in']\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(accepted => { \r\n if (accepted) {\r\n this.appStorageService.removeSessionItem(STORAGE.SIGNUP_WORKFLOW_VERIFICATION_TYPE);\r\n this.removeFloatingComponentToHeader();\r\n this.authService.logout();\r\n \r\n if (this.dialog)\r\n this.dialog.close();\r\n \r\n this.router.navigate(['/welcome/login'], {queryParams: { homeUrl: '/'}});\r\n }\r\n });\r\n }\r\n\r\n removeFloatingComponentToHeader(){\r\n let message = new FloatingComponentsMessage();\r\n let dummyComponentData = new FormComponentData();\r\n dummyComponentData.contenedor = ContainerType.HEADER;\r\n\r\n message.componentsData = [dummyComponentData];\r\n\r\n this.messageBusService.sendFloatingComponents(message);\r\n }\r\n \r\n}\r\n\r\nexport class ProfileMenuDependentModel extends Dependent { \r\n relationshipName: string;\r\n fullName: string; \r\n}","import { DOCUMENT } from '@angular/common';\nimport { Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\n\n@Component({\n selector: 'app-not-found',\n templateUrl: './not-found.component.html',\n styleUrls: ['./not-found.component.css']\n})\nexport class NotFoundComponent implements OnInit, OnDestroy {\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(DOCUMENT) private document: Document,\n private router: Router) { \n\n }\n\n ngOnInit(): void {\n this.document.body.classList.add('not-found');\n }\n\n ngOnDestroy():void{\n this.document.body.classList.remove('not-found');\n }\n\n goHome() {\n this.router.navigate(['/'], { });\n }\n\n}\n","
\n
\n \n

{{ 'notFound.text1' | translate:locale.language }}

\n
{{ 'notFound.text2' | translate:locale.language }}
\n \n
\n
\n","
\n
\n
{{iniciales}}
\n
","import { Component, Input, OnInit } from '@angular/core';\nimport { BaseService } from 'src/app/core/services/base.service';\n\n@Component({\n selector: 'app-avatar-initials',\n templateUrl: './avatar-initials.component.html',\n styleUrls: ['./avatar-initials.component.css']\n})\nexport class AvatarInitialsComponent implements OnInit {\n\n @Input() id:number;\n @Input() text:string;\n @Input() url:string;\n\n color:string;\n iniciales: string;\n\n constructor(private baseService: BaseService) { }\n\n ngOnInit(): void {\n if(!this.url){\n let avatarInitialsObject = this.baseService.getAvatarInitialObject(this.id, this.text);\n\n this.iniciales = avatarInitialsObject.initials;\n this.color = avatarInitialsObject.color;\n }\n }\n}\n","
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
","import { Component, Inject, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { PublicProfileType } from '../../models/people/profile-search-results.model';\r\nimport { UtilsService } from 'src/app/core/services/utils.service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { PublicProfile } from '../../models/people/public-profile.model';\r\n\r\n@Component({\r\n selector: 'app-public-profile-avatar',\r\n templateUrl: './public-profile-avatar.component.html',\r\n styleUrls: ['./public-profile-avatar.component.css'] \r\n})\r\nexport class PublicProfileAvatarComponent implements OnInit, OnDestroy {\r\n _model: PublicProfileAvatarComponentModel;\r\n @Input() \r\n get model(): PublicProfileAvatarComponentModel { return this._model; }\r\n set model(model: PublicProfileAvatarComponentModel) {\r\n this._model = model;\r\n this._model.sex = model.sex?.toLocaleLowerCase();\r\n\r\n if (!this._model.avatarUrl) {\r\n let initials = this.utilsService.getPersonInitials(model.personId, model.fullName);\r\n\r\n this.profileInitials = initials.initials;\r\n this.profileInitialsColor = initials.color;\r\n\r\n this.profileTypeIconClassName = this.getProfileTypeIconClassName(model.profileType);\r\n\r\n if (this._model.profileType != PublicProfileType.Doctor)\r\n this.profileInitialsColor = \"var(--grey3)\";\r\n\r\n //console.log(\"Doc without image\");\r\n //console.log(\"Doc name: '\" + model.fullName + \"'; DocId: \" + model.personId + \"; SelectedColor: \" + initials.color);\r\n }\r\n else \r\n this.profileInitialsColor = this.model.defaultBorderColor;\r\n }\r\n @Input() withoutBorder = false;\r\n \r\n profileType = PublicProfileType;\r\n profileInitials: string;\r\n profileInitialsColor: string;\r\n profileTypeIconClassName: string;\r\n legacyAvatar: boolean = false;\r\n\r\n constructor( \r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private utilsService: UtilsService,\r\n private baseService: BaseService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n let companyName = this.baseService.getCompanyName();\r\n\r\n if (companyName.toLocaleLowerCase() == \"mapfre-panama-asistencia-pacientes\"\r\n || companyName.toLocaleLowerCase() == \"mapfre-pacientes-pty\") {\r\n this.legacyAvatar = true;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n \r\n }\r\n \r\n private getProfileTypeIconClassName(profileType: PublicProfileType) { \r\n let className: string = 'phr-iconset-';\r\n let companyName = this.baseService.getCompanyName();\r\n\r\n if (companyName.toLocaleLowerCase() == \"mapfre-panama-asistencia-pacientes\")\r\n return this.getProfileTypeIconClassNameForPanamaAsistencia(profileType);\r\n\r\n switch(profileType){\r\n case PublicProfileType.Doctor:\r\n default:\r\n className += 'estetoscopio';\r\n break;\r\n case PublicProfileType.Farmacia:\r\n className += 'farmacia';\r\n break;\r\n case PublicProfileType.Clinica:\r\n className += 'hospital';\r\n break;\r\n case PublicProfileType.Fisioterapia:\r\n className += 'fisioterapia';\r\n break;\r\n case PublicProfileType.Laboratorio:\r\n className += 'laboratorios';\r\n break;\r\n case PublicProfileType.CentroDeImagenes:\r\n className += 'imagenologia';\r\n break; \r\n case PublicProfileType.ServiciosOdontologicos:\r\n className += 'odontologia';\r\n break;\r\n case PublicProfileType.Opticas:\r\n className += 'open-eye';\r\n break;\r\n case PublicProfileType.ClinicasDeAtencionPrimaria:\r\n className += 'clinic';\r\n break;\r\n }\r\n\r\n return className;\r\n }\r\n\r\n private getProfileTypeIconClassNameForPanamaAsistencia(profileType: PublicProfileType) {\r\n let className: string = 'phr-iconset-';\r\n\r\n switch(profileType){\r\n case PublicProfileType.Doctor:\r\n default:\r\n className += 'pa-doc';\r\n break;\r\n case PublicProfileType.Farmacia:\r\n className += 'farmacia';\r\n break;\r\n case PublicProfileType.Clinica:\r\n className += 'pa-hospital'; \r\n break;\r\n case PublicProfileType.Fisioterapia:\r\n className += 'fisioterapia';\r\n break;\r\n case PublicProfileType.Laboratorio:\r\n className += 'pa-lab';\r\n break;\r\n case PublicProfileType.CentroDeImagenes:\r\n className += 'imagenologia';\r\n break; \r\n case PublicProfileType.ServiciosOdontologicos:\r\n className += 'odontologia';\r\n break;\r\n case PublicProfileType.Opticas:\r\n className += 'open-eye';\r\n break;\r\n case PublicProfileType.ClinicasDeAtencionPrimaria:\r\n className += 'pa-clinica';\r\n break;\r\n }\r\n\r\n return className;\r\n }\r\n}\r\n\r\nexport class PublicProfileAvatarComponentModel {\r\n personId: number;\r\n avatarUrl: string;\r\n fullName: string;\r\n sex: string;\r\n profileType: PublicProfileType;\r\n\r\n useAvatarPadding: boolean = true;\r\n defaultBorderColor: string = \"var(--public-profile-avatar-border-color)\";\r\n}\r\n\r\nexport class PublicProfileToPublicProfileAvatarComponentModelConverter extends PublicProfileAvatarComponentModel {\r\n constructor(args: PublicProfile) {\r\n super();\r\n this.avatarUrl = args.ubicacionFoto;\r\n this.fullName = args.nombrePersona;\r\n }\r\n}","
\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n \r\n \r\n 0\" (click)=\"clearSelectedName()\"> \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{option.nombre}}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
{{wrapper.className}}
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n
{{ 'shared.searchDoctors.text4' | translate:locale.language }}
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{{ 'name' | translate:locale.language }} {{ 'specialty' | translate:locale.language }} {{result.descripcion}} {{ 'city' | translate:locale.language }} {{result.ciudades}}
\r\n
\r\n
\r\n
\r\n
{{result.descripcion}}
\r\n
{{result.ciudades}}
\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n
{{ 'shared.searchDoctors.text6' | translate:locale.language }}
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{{ 'name' | translate:locale.language }} {{ 'specialty' | translate:locale.language }} {{result.descripcion}} {{ 'city' | translate:locale.language }} {{result.ciudades}}
\r\n
\r\n
\r\n
\r\n
{{result.descripcion}}
\r\n
{{result.ciudades}}
\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n {{ 'shared.searchDoctors.text8' | translate:locale.language }}\r\n
\r\n
    \r\n
  • \r\n {{ 'shared.searchDoctors.text9' | translate:locale.language }}\r\n
  • \r\n
  • \r\n {{ 'shared.searchDoctors.text10' | translate:locale.language }}\r\n
  • \r\n
  • \r\n {{ 'shared.searchDoctors.text11' | translate:locale.language }}\r\n
  • \r\n
\r\n
\r\n\r\n
","import { Component, HostListener, Inject, Input, OnInit, PLATFORM_ID } from '@angular/core';\r\nimport { FormGroup, FormControl } from '@angular/forms';\r\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\r\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { DoctorService } from 'src/app/core/services/doctors.service';\r\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\r\nimport { DoctorSearchResult } from 'src/app/shared/models/cdr/doctor-search-result.model';\r\nimport { TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material/autocomplete';\r\nimport { PublicProfileType } from '../../models/people/profile-search-results.model';\r\nimport { MessageBusService, ProfileSearchMessage } from 'src/app/core/services/message-bus.service';\r\nimport { FormComponentData } from '../../models/people/form-control.model';\r\nimport { IControlComponent } from '../../interfaces/control-component';\r\nimport { UtilsService } from 'src/app/core/services/utils.service';\r\nimport { DirectoryFilters } from '../../models/systems/directory.model';\r\nimport { PortalPhrConfiguracionLocalidad } from '../../models/systems/portal-phr.model';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'search-doctors-container',\r\n templateUrl: './search-doctors.component.html',\r\n styleUrls: ['./search-doctors.component.css']\r\n})\r\n@ComponentLookup('SearchDoctorsComponent')\r\nexport class SearchDoctorsComponent implements OnInit, IControlComponent { \r\n data: FormComponentData;\r\n searchDoctorsForm: FormGroup;\r\n cityControl: FormControl;\r\n searchText : FormControl;\r\n searchValue = \"\";\r\n searchTimeout: number; \r\n locationGroups: TerritorialDivisionGroup[] = [];\r\n selectedCity: TerritorialDivision;\r\n filteredLocationsGroups: TerritorialDivisionGroup[]; \r\n resultWrapper: DoctorSearchResultUIWrapper; \r\n companyName: string = \"\";\r\n qsParams: SearchResultsQsParameters; \r\n placeholderTexts: [];\r\n onlyDoctorsProvider = false; \r\n clinicalConcept: DoctorSearchResult; \r\n disabledSearch = false; \r\n profileSearchTypes = [PublicProfileType.Doctor];\r\n locationConfiguration: PortalPhrConfiguracionLocalidad;\r\n cityText: string;\r\n stateText: string;\r\n countryText: string;\r\n headquartersCompIds: number[] = [];\r\n\r\n @Input() parentData: FormComponentData;\r\n\r\n @Input() useSearchEvents = false; \r\n @Input() profileType = PublicProfileType.Doctor;\r\n\r\n isBrowser: boolean;\r\n\r\n constructor(\r\n private doctorService: DoctorService, \r\n private territorialDivisionsService: TerritorialDivisionsService,\r\n private baseService: BaseService,\r\n private router: Router,\r\n private route : ActivatedRoute,\r\n private messageBusService: MessageBusService,\r\n private translation: L10nTranslationService,\r\n private utilsService: UtilsService,\r\n private publicProfileService: PublicProfileService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(DOCUMENT) private document: Document,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.parseControlData();\r\n\r\n this.cityControl = new FormControl('');\r\n this.searchText = new FormControl('');\r\n\r\n this.searchDoctorsForm = new FormGroup({\r\n searchText: this.searchText,\r\n city: this.cityControl\r\n }); \r\n\r\n let companyId = this.baseService.getCompanyId();\r\n this.companyName = this.baseService.getCliniwebDirectoryCompanyName();\r\n \r\n let dir = this.baseService.getDirectory();\r\n this.headquartersCompIds = dir.idEmpresasSedes? dir.idEmpresasSedes.split(\",\").map(id => parseInt(id)) : [];\r\n\r\n this.resultWrapper = new DoctorSearchResultUIWrapper(companyId, this.headquartersCompIds); \r\n\r\n this.translation.onChange().subscribe({\r\n next: () => {\r\n this.placeholderTexts = this.translation.translate(this.isMobile()? 'shared.searchDoctors.text13': 'shared.searchDoctors.text12'); \r\n this.cityText = this.translation.translate('city'); \r\n this.stateText = this.translation.translate('province'); \r\n this.countryText = this.translation.translate('country'); \r\n }\r\n }); \r\n \r\n if (dir && dir.configuracionBusquedaLocalidad)\r\n this.locationConfiguration = this.baseService.parseObject(JSON.parse(dir.configuracionBusquedaLocalidad)); \r\n\r\n this.loadAllCities();\r\n\r\n // Auto complete search function \r\n this.cityControl.valueChanges.subscribe(v => {\r\n // When an option is selected here we receive the complete object (TerritorialDivision), in those cases we want to filter by the object name\r\n if (v && v.id)\r\n v = v.nombre;\r\n\r\n if (!v)\r\n this.filteredLocationsGroups = this.locationConfiguration? this.goupCities(this.locationConfiguration.localidadesPorDefecto) : this.locationGroups;\r\n else {\r\n let filtered = this._filterCities(v);\r\n\r\n this.filteredLocationsGroups = filtered;\r\n } \r\n });\r\n\r\n this.setDirectorySearchProfileTypes();\r\n\r\n // On search results page we will initialize the control base con QS parameters\r\n this.initializeFromQs();\r\n } \r\n\r\n isMobile() {\r\n return this.isBrowser && window.outerWidth < 959;\r\n }\r\n\r\n initializeFromQs() {\r\n // Get search parameters\r\n this.route.queryParams.subscribe(params => {\r\n this.qsParams = this.baseService.parseObject(params);\r\n\r\n if (this.qsParams && this.qsParams.t) {\r\n // Disabled search for 1 second so it does not fire after we change the search input text\r\n this.disableSearch(1000);\r\n\r\n this.searchDoctorsForm.controls[\"searchText\"].setValue(this.qsParams.t);\r\n } \r\n\r\n if (this.qsParams && this.qsParams.tp)\r\n this.profileType = this.qsParams.tp;\r\n \r\n if (this.qsParams && this.qsParams.ds)\r\n this.onlyDoctorsProvider = true;\r\n\r\n if (this.qsParams && this.qsParams.nav)\r\n {\r\n this.clinicalConcept = new DoctorSearchResult();\r\n this.clinicalConcept.claseId = this.qsParams.idTc;\r\n this.clinicalConcept.id = this.qsParams.idC;\r\n this.clinicalConcept.url = this.qsParams.nav;\r\n this.clinicalConcept.nombre = this.qsParams.t;\r\n }\r\n\r\n this.setDirectorySearchProfileTypes();\r\n\r\n if (this.qsParams)\r\n setTimeout(() => {\r\n this.fireSearchEvent(this.qsParams); \r\n }, 50); \r\n }); \r\n }\r\n\r\n setDirectorySearchProfileTypes() { \r\n let directory = this.baseService.getDirectory();\r\n\r\n if (directory && directory.filtros) {\r\n let filtersObj = JSON.parse(directory.filtros);\r\n let filters = this.baseService.parseObject(filtersObj); \r\n\r\n // Find the filter for this provider\r\n let provider = filters.providers.find(p => p.type == this.profileType);\r\n\r\n // Check if the provider has special configuracion for search\r\n if (provider && provider.searchProviderTypes) {\r\n this.profileSearchTypes = provider.searchProviderTypes;\r\n }\r\n else \r\n this.profileSearchTypes = [this.profileType];\r\n } \r\n } \r\n\r\n onOptionSelected(event: MatAutocompleteSelectedEvent) {\r\n this.selectedCity = event.option.value \r\n\r\n // If the user selected previously a concept, let just fire the search\r\n if (this.clinicalConcept)\r\n this.navigateToSearchResult(this.clinicalConcept);\r\n else if (this.useSearchEvents)\r\n this.onSearchClick();\r\n }\r\n\r\n autoCompleteDisplayWith(item: TerritorialDivision) {\r\n return item? item.nombre : \"\";\r\n } \r\n\r\n onAutocompleteOpened() {\r\n \r\n // Each time the user open the autocomplete we want to show ALL options\r\n // After that the autocomplete will work as always\r\n //let filtered = this._filterCities(\"\");\r\n\r\n //this.filteredLocationsGroups = filtered;\r\n } \r\n \r\n onAutocompleteClosed() {\r\n // When autocomplete closed always set the name of the selected city/state\r\n if (this.selectedCity) {\r\n this.cityControl.setValue(this.selectedCity);\r\n }\r\n }\r\n\r\n clearSelectedName() {\r\n this.searchText.setValue(\"\");\r\n this.clinicalConcept = null as any;\r\n this.resultWrapper.clear();\r\n\r\n // Fire search\r\n if (this.useSearchEvents)\r\n this.onSearchClick();\r\n }\r\n\r\n clearSelectedLocation(trigger : MatAutocompleteTrigger) {\r\n this.selectedCity = null as any;\r\n this.cityControl.setValue(this.selectedCity);\r\n \r\n // Fire search\r\n if (this.useSearchEvents)\r\n this.onSearchClick();\r\n\r\n // Open combo to select a new option\r\n setTimeout(() => {\r\n trigger.openPanel();\r\n }, 100); \r\n } \r\n\r\n private _filterCities(value: string): TerritorialDivisionGroup[] {\r\n \r\n try {\r\n // We need to use a try catch, because when searching this is an string but when an option is selected this is an object\r\n const filterValue = value.toLowerCase(); \r\n \r\n let result: TerritorialDivisionGroup[] = [];\r\n\r\n for (let index = 0; index < this.locationGroups.length; index++) {\r\n const group = this.locationGroups[index];\r\n \r\n let locations = group.values.filter(l => l.nombre.toLowerCase().indexOf(filterValue) === 0);\r\n\r\n if (locations.length > 0)\r\n result.push(new TerritorialDivisionGroup(group.key, locations, this.getLocationDisplayNameFromLevel(group.key)))\r\n }\r\n\r\n //return this.cities.filter(c => c.nombre.toLowerCase().indexOf(filterValue) === 0); \r\n\r\n return result;\r\n } \r\n catch (error) { \r\n }\r\n\r\n return [];\r\n }\r\n\r\n loadAllCities(): void {\r\n let levels = \"3\"; // Cities\r\n\r\n if (this.locationConfiguration)\r\n levels = this.locationConfiguration.niveles;\r\n\r\n this.territorialDivisionsService.getByLevels(this.locale.language, \"Panama\", levels).subscribe(locations => {\r\n locations.forEach(c => c.nombre = c.nombre.toLowerCase());\r\n \r\n this.locationGroups = this.goupCities(locations); \r\n this.filteredLocationsGroups = this.goupCities(this.locationConfiguration? this.locationConfiguration.localidadesPorDefecto : locations); \r\n \r\n if (this.qsParams && this.qsParams.idP) {\r\n let city = locations.find(c => c.id == this.qsParams.idP);\r\n\r\n if (city) {\r\n this.cityControl.setValue(city);\r\n this.selectedCity = city;\r\n }\r\n }\r\n },\r\n error => {\r\n this.baseService.handleServiceError(error, \"Error getting cities\");\r\n });\r\n } \r\n\r\n goupCities(locations: TerritorialDivision[]) : TerritorialDivisionGroup[] {\r\n var groups: any = [];\r\n var result: TerritorialDivisionGroup[] = [];\r\n\r\n for (let index = 0; index < locations.length; index++) {\r\n const location = locations[index];\r\n \r\n if (!groups[location.nivel]) {\r\n groups[location.nivel] = new TerritorialDivisionGroup(location.nivel, [], this.getLocationDisplayNameFromLevel(location.nivel));\r\n }\r\n\r\n groups[location.nivel].values.push(location);\r\n }\r\n\r\n var keys = Object.keys(groups);\r\n\r\n for (let index = 0; index < keys.length; index++) {\r\n result.push(groups[keys[index]]); \r\n }\r\n\r\n return result;\r\n };\r\n\r\n getLocationDisplayNameFromLevel(level: number) {\r\n return level == 1? this.countryText : (level == 2? this.stateText : this.cityText);\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n clickout(event : any) {\r\n let elResults = document.getElementsByClassName(\"search-doctor-search-results\")[0]; \r\n let elSearchBox = document.getElementsByClassName(\"search-doctors-container\")[0]; \r\n\r\n if(elResults && !elResults.contains(event.target) && !elSearchBox.contains(event.target))\r\n this.resultWrapper.hide();\r\n }\r\n\r\n onSearchInputClick() {\r\n let containerClass = this.useSearchEvents? \"body-container\" : \"mat-sidenav-content\";\r\n\r\n let container = this.document.getElementsByClassName(containerClass)[0];\r\n let el = this.document.getElementsByClassName(\"left-box\")[0];\r\n\r\n this.utilsService.scrollToElementWithAnimation(container, el);\r\n\r\n this.resultWrapper.show();\r\n } \r\n\r\n onSearch(search : string) {\r\n if (this.searchTimeout)\r\n clearTimeout(this.searchTimeout as number);\r\n\r\n if (this.disabledSearch)\r\n return;\r\n\r\n this.searchTimeout = setTimeout(() => {\r\n this.doSearch(search);\r\n }, 300) as unknown as number;\r\n }\r\n \r\n doSearch(search : string) {\r\n if (!search || !search.trim())\r\n return;\r\n\r\n search = search.trim();\r\n\r\n // If the autocomplete is not enabled then does not search.\r\n // It will only search when user press the search btn, and the results will be shown on the search-results component\r\n if(!this.isAutoCompleteEnabled())\r\n return;\r\n\r\n this.searchValue = search;\r\n\r\n this.doctorService.searchDoctors(this.locale.language, search, this.companyName, this.profileSearchTypes).subscribe(results =>{ \r\n \r\n // Clear previous results\r\n this.resultWrapper.clear();\r\n\r\n this.clinicalConcept = null as any;\r\n \r\n // Add new items\r\n results.forEach(result => {\r\n this.resultWrapper.addItem(result);\r\n }); \r\n },\r\n error => {\r\n this.baseService.handleServiceError(error, \"Error getting profiles\"); \r\n });\r\n }\r\n\r\n wrappersTrackBy(index : number, item: DoctorSearchResultUIWrapperGroup){\r\n return item.classId; \r\n }\r\n\r\n resultsTrackBy(index : number, item: DoctorSearchResult){\r\n return item.id; \r\n }\r\n\r\n territorialDivisionsTrackBy(index : number, item: TerritorialDivision){\r\n return item.id; \r\n }\r\n\r\n setSelectedClinicalConcept(item: DoctorSearchResult, trigger : MatAutocompleteTrigger) { \r\n \r\n this.clinicalConcept = item; \r\n\r\n // Disabled search for 1 second so it does not fire after we change the search input text\r\n this.disableSearch(1000);\r\n\r\n // Set concept name to search input\r\n this.searchDoctorsForm.controls[\"searchText\"].setValue(item.nombre); \r\n\r\n this.resultWrapper.hide();\r\n\r\n if (!this.selectedCity)\r\n // Open city panel\r\n trigger.openPanel(); \r\n else \r\n this.navigateToSearchResult(item);\r\n }\r\n\r\n disableSearch(time: number) {\r\n this.disabledSearch = true;\r\n\r\n if (time)\r\n setTimeout(() => {\r\n this.disabledSearch = false;\r\n }, time); \r\n }\r\n\r\n // Concept search\r\n navigateToSearchResult(item: DoctorSearchResult) {\r\n \r\n let params = new SearchResultsQsParameters();\r\n\r\n params.idTc = item.claseId;\r\n params.idC = item.id;\r\n params.nav = item.url;\r\n params.idP = this.selectedCity? this.selectedCity.id : 0;\r\n params.idDt = this.selectedCity? this.selectedCity.identificador : \"\";\r\n params.t = item.nombre; \r\n params.tp = this.profileType; \r\n params.ds = this.onlyDoctorsProvider;\r\n params.rUrl = this.router.url;\r\n\r\n this.resultWrapper.hide();\r\n\r\n if (this.useSearchEvents)\r\n this.fireSearchEvent(params);\r\n else\r\n this.router.navigate(['/busqueda'], { queryParams: params });\r\n }\r\n \r\n // Text search\r\n onSearchClick() {\r\n let searchText = this.searchDoctorsForm.controls[\"searchText\"].value;\r\n \r\n if (searchText)\r\n searchText = searchText.trim();\r\n\r\n // If the user click search but before a clinical concept was selected let just do a concept search\r\n if (this.clinicalConcept) {\r\n this.navigateToSearchResult(this.clinicalConcept);\r\n return;\r\n } \r\n\r\n let params = new SearchResultsQsParameters();\r\n\r\n params.idTc = 0;\r\n params.idC = 0;\r\n params.nav = \"\";\r\n params.idP = this.selectedCity? this.selectedCity.id : 0;\r\n params.idDt = this.selectedCity? this.selectedCity.identificador : \"\";\r\n params.t = searchText; \r\n params.tp = this.profileType; \r\n params.ds = this.onlyDoctorsProvider;\r\n params.rUrl = this.router.url; \r\n\r\n this.resultWrapper.hide();\r\n\r\n if (this.useSearchEvents)\r\n this.fireSearchEvent(params);\r\n else\r\n this.router.navigate(['/busqueda'], { queryParams: params });\r\n }\r\n\r\n fireSearchEvent(params: SearchResultsQsParameters) {\r\n // Fire a new search event for all the suscribers\r\n var message = new ProfileSearchMessage();\r\n message.profileType = this.profileType;\r\n message.searchText = params.nav? \"\" : params.t;\r\n message.conceptNav = params.nav;\r\n message.doctorSearch = params.ds; \r\n message.conceptId = params.idC;\r\n message.conceptClaseId = params.idTc; \r\n\r\n if (params.idDt) { \r\n message.territorialDivisionIdentification = params.idDt; \r\n }\r\n\r\n this.messageBusService.profileSearch(message)\r\n }\r\n\r\n onDoctorClick(item: DoctorSearchResult) {\r\n let url = this.publicProfileService.getPublicProfileUrl(item.url);\r\n\r\n this.router.navigate([url]); \r\n }\r\n\r\n getPlaceholderText() {\r\n return this.placeholderTexts[this.profileType - 1];\r\n }\r\n\r\n getDisplayColumns() {\r\n if (this.profileType == PublicProfileType.Doctor)\r\n return ['name', 'specialty', 'city'];\r\n else \r\n return ['name', 'city'];\r\n }\r\n\r\n areDoctorsResults() {\r\n return this.profileType == PublicProfileType.Doctor;\r\n }\r\n\r\n isAutoCompleteEnabled() {\r\n return this.profileType == PublicProfileType.Doctor\r\n || this.profileType == PublicProfileType.CentroDeImagenes; \r\n }\r\n\r\n private parseControlData() {\r\n if (!this.data)\r\n this.data = this.parentData;\r\n\r\n if (this.data && this.data.valor) {\r\n try {\r\n this.data.valor = JSON.parse(this.data.valor); \r\n \r\n let data = this.data.valor;\r\n \r\n this.onlyDoctorsProvider = data.showOnlyDoctors;\r\n } catch (ex) {} \r\n } \r\n }\r\n}\r\n\r\nexport class DoctorSearchResultUIWrapper {\r\n companyId: number = 0;\r\n groups: DoctorSearchResultUIWrapperGroup[];\r\n hidden: boolean = false;\r\n searchDone: boolean = false;\r\n headquartersCompIds: number[] = [];\r\n \r\n constructor(companyId: number, headquartersCompIds: number[]) {\r\n this.groups = [];\r\n this.companyId = companyId;\r\n this.headquartersCompIds = headquartersCompIds;\r\n }\r\n\r\n clear() {\r\n this.groups = [];\r\n this.hidden = false; \r\n }\r\n\r\n isEmpty() {\r\n return this.groups.length == 0;\r\n }\r\n\r\n hide() {\r\n this.hidden = true;\r\n }\r\n\r\n show() {\r\n this.hidden = false;\r\n }\r\n\r\n isHidden() {\r\n return this.hidden;\r\n }\r\n\r\n addItem(item : DoctorSearchResult) {\r\n let relatedComp = item.empresasRelacionadas.split(\",\").map(id => parseInt(id))\r\n let classId = item.claseId; \r\n \r\n this.searchDone = true;\r\n\r\n // Current directory doctos\r\n //if (classId == 0 && this.companyId > 0 && item.idEmpresa == this.companyId) {\r\n if (classId == 0 && this.companyId > 0 && this.containsAnyNumber(relatedComp, this.headquartersCompIds)) {\r\n classId = -2;\r\n }\r\n else if (classId == 0) {\r\n classId = -1;\r\n }\r\n\r\n let wrapper = this.groups.find(w => w.classId == classId);\r\n\r\n if (wrapper == null) {\r\n wrapper = new DoctorSearchResultUIWrapperGroup();\r\n\r\n wrapper.classId = classId;\r\n wrapper.className = item.clase;\r\n wrapper.results = [];\r\n\r\n // Push new wrapper\r\n this.groups.push(wrapper);\r\n }\r\n\r\n // Push new wapper item\r\n wrapper.results.push(item);\r\n }\r\n\r\n getClassItems() {\r\n return this.groups.filter(g => g.isClassGroup());\r\n }\r\n\r\n getDirectoryItems() { \r\n return this.groups.filter(g => g.isDirectoryGroup());\r\n }\r\n\r\n getDoctorItems() {\r\n return this.groups.filter(g => g.isDoctorGroup());\r\n }\r\n\r\n containsAnyNumber(arrayNumber: number[], valueArray: number[]) {\r\n if (!arrayNumber)\r\n return false;\r\n \r\n return arrayNumber.filter(elem => valueArray.indexOf(elem) > -1).length > 0;\r\n }\r\n}\r\n\r\nexport class DoctorSearchResultUIWrapperGroup {\r\n classId: number;\r\n className: string;\r\n results: DoctorSearchResult[]\r\n\r\n isClassGroup() {\r\n return this.classId > 0;\r\n }\r\n\r\n isDoctorGroup() {\r\n return this.classId == -1;\r\n }\r\n\r\n isDirectoryGroup() {\r\n return this.classId == -2;\r\n }\r\n}\r\n\r\nexport class TerritorialDivisionGroup {\r\n key: number;\r\n values: TerritorialDivision[];\r\n displayName: string; \r\n\r\n constructor(key: number, values :TerritorialDivision[], displayName: string) {\r\n this.key = key;\r\n this.values = values;\r\n this.displayName = displayName;\r\n }\r\n}\r\n\r\nexport class SearchResultsQsParameters { \r\n idTc: number; // Id Tipo Concepto\r\n idC: number; // Id Concepto\r\n nav: string; // URL navegacion\r\n idP: number; // Id Pais\r\n idDt: string; // Id Division territorial\r\n t: string; // Texto busqueda\r\n tp: number; // Tipo Perfil Publico (Medico, Farmacia, Clinica, etc)\r\n ds: boolean; // Doctor Search (this will be false when navigating from the Home menu)\r\n hideHeader: string;\r\n rUrl: string; //Return url\r\n}\r\n\r\nexport interface SearchWidgetConfigurationDataModel {\r\n showOnlyDoctors: boolean;\r\n}","import { Component, Inject, Input, OnInit, ViewEncapsulation } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\n\n@Component({\n selector: 'app-spinner',\n templateUrl: './spinner.component.html',\n styleUrls: ['./spinner.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class SpinnerComponent implements OnInit {\n\n @Input() spinnerText = '';\n\n constructor(@Inject(L10N_LOCALE) public locale: L10nLocale) { }\n\n ngOnInit(): void {\n }\n\n}\n","
\n
\n \n {{ spinnerText | translate:locale.language }}\n
\n
","\n
\n \n
\n \n \n {{ model.textRefI18n | translate:locale.language }}\n \n \n {{ model.textDescriptionRefI18n | translate:locale.language }}\n \n
\n \n \n
\n
\n
","import { Component, Inject, Input, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\n\n@Component({\n selector: 'app-states-request-verify',\n templateUrl: './states-request-verify.component.html',\n styleUrls: ['./states-request-verify.component.css']\n})\nexport class StatesRequestVerifyComponent implements OnInit {\n\n @Input() model: StatesRequestVerifyDataModel;\n\n constructor(\n private router: Router,\n private messageBusService: MessageBusService,\n @Inject(L10N_LOCALE) public locale: L10nLocale) { }\n\n ngOnInit(): void {\n }\n\n gotoHome(){\n if (this.model.buttonSecondaryActionFn) {\n this.model.buttonSecondaryActionFn();\n }\n else {\n this.messageBusService.showHeader();\n this.router.navigate(['/']);\n } \n }\n}\n\nexport class StatesRequestVerifyDataModel {\n companyLogoUrl: string;\n mainImageUrl: string;\n textRefI18n: string;\n textDescriptionRefI18n: string;\n buttonActionFn: any;\n buttonSecondaryActionFn: any;\n buttonTextRefI18n: string;\n secondaryButtonTextRefI18n: string;\n showActionButton: boolean;\n showHomeButton: boolean;\n}","import { Injectable } from '@angular/core';\nimport { HttpBaseService } from './http-base-service';\nimport { TeleconsultaInfo } from 'src/app/shared/interfaces/teleconsulta-info';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TeleconsultaService {\n\n private url = 'api/teleconsultas';\n\n constructor(private http: HttpBaseService) { }\n\n getByIdEstado(id: number) {\n return this.http.get(`${this.url}?idEtapaSolicitud=${id}`);\n }\n\n}\n","
\n
\n
\n \n {{ 'shared.summaryAppointmentCheckout.title' | translate:locale.language: {specialty: model.specialty} }}\n \n \n \n
\n \n
\n
\n
\n \n {{ appointmentStateName }}\n
\n
\n \n {{ 'shared.summaryAppointmentCheckout.helpButton2' | translate:locale.language }}\n \n
\n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n {{ appointmentStateName }}\n
\n
\n \n {{ 'shared.summaryAppointmentCheckout.helpButton2' | translate:locale.language }}\n \n \n {{ 'shared.summaryAppointmentCheckout.reSchedule' | translate:locale.language }}\n \n
\n
\n
\n \n \n\n \n
\n {{ 'shared.summaryAppointmentCheckout.helpTitle' | translate:locale.language }}\n {{ 'shared.summaryAppointmentCheckout.helpDescription' | translate:locale.language }}\n
\n \n \n \n \n
\n
\n \n
\n
\n \n \n
\n
\n
","import { Component, Inject, Input, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\nimport { CloseRouteDialogMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { AppointmentSummaryDataModel } from '../../models/workflow/models/appointment-summary-data.model';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { PatientAppointmentInformation } from '../../models/process/appointment.model';\nimport { AppointmentInfoDataModel, AppointmentType } from '../../models/workflow/models/appointment-info-data.model';\nimport { Observable, Subject, forkJoin, of } from 'rxjs';\nimport { Dependent } from '../../models/people/dependent.model';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { catchError, takeUntil, tap } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { AppointmentCancelationRouteDialogModel, RouteDialogType } from '../dialogs/route-dialog/route-dialog.component';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { DialogData, MapDialogData } from '../../models/dialog-data.model';\nimport { DoctorMessageDialogComponent } from '../dialogs/doctor-message-dialog/doctor-message-dialog.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\nimport { PublicProfile } from '../../models/people/public-profile.model';\nimport * as moment from 'moment';\nimport { TeleconsultaService } from 'src/app/core/services/teleconsulta.service';\nimport { Directory } from '../../models/systems/directory.model';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { MapDialogComponent } from '../dialogs/map-dialog/map-dialog.component';\nimport { Router } from '@angular/router';\nimport { environment } from 'src/environments/environment';\n\n@Component({\n selector: 'app-summary-appointment-checkout',\n templateUrl: './summary-appointment-checkout.component.html',\n styleUrls: ['./summary-appointment-checkout.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('SummaryAppointmentCheckoutComponent')\nexport class SummaryAppointmentCheckoutComponent implements IControlComponent, OnInit {\n data: FormComponentData;\n model: AppointmentSummaryDataModel = new AppointmentSummaryDataModel();\n directory?: Directory;\n dependents: Dependent[]; \n loggedInUser: UserPerson;\n private ngUnsubscribe = new Subject();\n appointmentState = 22;\n appointmentStateName = \"\";\n appointmentExpired: boolean = false;\n appointmentStateClassName: string = \"\";\n appointmentStateIconClassName: string = \"\";\n idTeleconsulta?: string;\n licensedCompany: boolean = false;\n isCliniwebCompany: boolean = false;\n show:boolean = false;\n isAndroid = false;\n enablePublicProfileLink: boolean = true;\n initialLoading = true;\n\n @Input() appointment: PatientAppointmentInformation;\n @Input() inWorflow: boolean = true;\n\n constructor(\n private router: Router,\n private routeDialogService: RouteDialogService,\n private messageBusService: MessageBusService,\n private userService: UserService,\n private baseService: BaseService,\n private authService: AuthService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private dialog: MatDialog,\n private publicProfileService: PublicProfileService,\n private appointmentService: AppointmentService,\n private teleconsultaService: TeleconsultaService,\n @Inject(DOCUMENT) private document: Document,\n private translation: L10nTranslationService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.model.appointmentInfo = new AppointmentInfoDataModel();\n }\n\n ngOnInit(): void {\n this.isAndroid = navigator.userAgent.toLowerCase().includes('android');\n this.document.body.classList.add('summary-appointment');\n\n // If we are on a worklfow let just disabled the public profile link\n if (this.inWorflow)\n this.enablePublicProfileLink = false;\n\n this.loadDataModel();\n\n this.loadFromAppointment();\n this.getTeleconsultaInfoIfVirtual(this.model?.appointmentInfo.idEtapaSolicitud ?? this.appointment?.idEtapaSolicitud);\n \n // On Header Back click\n this.messageBusService.onNavigateBack()\n .pipe(takeUntil(this.ngUnsubscribe)) \n .subscribe(m => {\n if (m.dialogId != RouteDialogType.APPOINTMENT_SUMMARY)\n return; \n\n // Only apply when component was loadad with an appointment (just summary mode)\n if(this.appointment)\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\n }\n );\n\n this.baseService.isLicensedCompany()\n .pipe(takeUntil(this.ngUnsubscribe)) \n .subscribe((result:boolean)=>{\n this.licensedCompany = result;\n\n this.show = true;\n },\n error=>{\n this.baseService.handleServiceError(error, \"Error licenced company\");\n });\n\n // Appointment cancelled\n this.messageBusService.onAppointmentChangeReceived()\n .pipe(takeUntil(this.ngUnsubscribe)) \n .subscribe(message => {\n let idEtapa = this.getAppointmentId();\n\n this.appointmentService.getAppointmentById(idEtapa, this.locale.language).subscribe(app => {\n let utcDate = moment.utc(app.fechaRequerido).toDate();\n app.fechaRequerido = utcDate;\n \n let endDateUtc = moment.utc(app.fechaFinalizacion).toDate();\n app.fechaFinalizacion = endDateUtc;\n \n this.appointment = app;\n\n this.loadFromAppointment();\n }); \n }\n );\n\n this.isCliniwebCompany = this.baseService.isCliniwebCompany();\n }\n\n private loadFromAppointment() {\n if (this.appointment) {\n let observables: Observable[] = [];\n\n this.appointmentExpired = this.isAppointmentExpired(this.appointment.fechaInicio);\n this.appointmentState = this.appointment.idEstado;\n this.appointmentStateName = this.getAppointmentStateName(this.appointment.fechaInicio, this.appointment.nombreEstado, this.appointment.idEstado);\n this.appointmentStateClassName = this.getAppointmentStateClassName(this.appointment.fechaInicio, this.appointment.idEstado);\n this.appointmentStateIconClassName = this.getAppointmentStateIconClassName(this.appointment.fechaInicio, this.appointment.idEstado);\n\n observables.push(this.getUser());\n observables.push(this.getDependents());\n\n forkJoin(observables).subscribe(results => { \n \n this.loggedInUser = results[0] as UserPerson;\n this.dependents = results[1] as Dependent[]; \n\n this.loadModelFromAppointment(); \n\n this.sendComponentFinishLoadingMessage();\n });\n }\n else {\n this.sendComponentFinishLoadingMessage();\n }\n }\n\n private getTeleconsultaInfoIfVirtual(idEtapa: number): void {\n if (!!idEtapa && (this.model?.appointmentInfo.appointmentType === AppointmentType.VIRTUAL || this.appointment?.teleconsulta.toLocaleLowerCase() == \"s\")) {\n const companyId = this.baseService.getCliniwebDirectoryCompanyId();\n\n this.baseService.getCliniwebDirectory(companyId)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(x => this.directory = x, error => { this.baseService.handleServiceError(error, \"Error getting directory\"); });\n\n this.teleconsultaService.getByIdEstado(idEtapa)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(x => this.idTeleconsulta = x.idTeleconsulta, error => { this.baseService.handleServiceError(error, \"Error getting teleconsultation\"); });\n }\n }\n\n ngOnDestroy() {\n this.document.body.classList.remove('summary-appointment');\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n isAppointmentExpired(fechaInicio: Date) {\n let now = new Date().getTime();\n let appDate = new Date(fechaInicio).getTime();\n\n return appDate <= now;\n }\n\n getAppointmentStateName(fechaInicio: Date, nombreEstado: string, idEstado: number) : string {\n let stateName = nombreEstado; \n \n if (this.isAppointmentExpired(fechaInicio)) {\n if (idEstado != 7 && idEstado != 28)\n stateName = this.translation.translate('shared.cliniwebAppointment.text19');\n }\n else {\n // Cobrado = 3\n // Sin Cobrar = 3\n if (idEstado == 3 || idEstado == 27)\n stateName = this.translation.translate('shared.cliniwebAppointment.text20');; \n }\n \n return stateName;\n }\n\n getAppointmentStateClassName(fechaInicio: Date, idEstado: number) {\n let stateClassName = \"\";\n \n if (this.isAppointmentExpired(fechaInicio)) {\n if (idEstado == 7)\n stateClassName = \"cancelled\";\n else if (idEstado == 28)\n stateClassName = \"not-completted\"; \n }\n else {\n if (idEstado == 23 || idEstado == 24 || idEstado == 30)\n stateClassName = \"confirmed\";\n else if (idEstado == 7 || idEstado == 28)\n stateClassName = \"cancelled\";\n else if (idEstado == 2)\n stateClassName = \"not-confirmed\";\n else if (idEstado == 22)\n stateClassName = \"pending\";\n }\n\n return stateClassName;\n }\n\n getAppointmentStateIconClassName(fechaInicio: Date, idEstado: number) {\n let stateIconClass = \"phr-iconset-PHR-date-2\";\n \n if (this.isAppointmentExpired(fechaInicio)) {\n if (idEstado == 7 || idEstado == 28)\n stateIconClass = \"phr-iconset-close-circle\";\n }\n else {\n stateIconClass = \"phr-iconset-validacion\";\n\n if (idEstado == 7 || idEstado == 28)\n stateIconClass = \"phr-iconset-close-circle\";\n else if (idEstado == 22 || idEstado == 2)\n stateIconClass = \"phr-iconset-alert\"; \n else if (idEstado == 3 || idEstado == 27)\n stateIconClass = \"phr-iconset-PHR-date-2\"; \n } \n \n return stateIconClass;\n }\n\n getDependents() : Observable{\n return this.userService.getUserDependents().pipe(\n tap(() => {\n \n }),\n catchError((e => { \n this.baseService.handleServiceError(e, \"Error getting dependents\");\n return of([]);\n })));\n }\n\n getUser() : Observable {\n return this.userService.getUserPersonLoggedIn().pipe(\n tap(() => {\n \n }),\n catchError((e => { \n this.baseService.handleServiceError(e, \"Error getting user\"); \n \n return of(null);\n })));\n }\n\n loadModelFromAppointment() {\n let appointmentInfoDataModel = new AppointmentInfoDataModel(); \n \n appointmentInfoDataModel.appointmentType = (this.appointment.teleconsulta && this.appointment.teleconsulta.toLocaleLowerCase() == \"s\"\n ? AppointmentType.VIRTUAL\n : AppointmentType.FACE_TO_FACE); \n appointmentInfoDataModel.appointmentDate = this.appointment.fechaRequerido;\n appointmentInfoDataModel.cancellationDate = this.appointment.fechaFinalizacion;\n appointmentInfoDataModel.doctorAvatarUrl = this.appointment.urlAvatarResponsableServicio;\n appointmentInfoDataModel.doctorName = this.appointment.nombreResponsableServicio;\n appointmentInfoDataModel.doctorSpecialty = this.appointment.especialidadResponsableServicio;\n appointmentInfoDataModel.attentionPlaceName = this.appointment.nombreLocalidad;\n appointmentInfoDataModel.attentionPlaceAddress = this.appointment.direccionLocalidad;\n appointmentInfoDataModel.attentionPlaceLatLng = this.appointment.coordenadasLocalidad;\n appointmentInfoDataModel.medicalConsultationType = \"\";\n appointmentInfoDataModel.medicalConsultationAmount = 0;\n appointmentInfoDataModel.patientName = this.getName(this.appointment);\n appointmentInfoDataModel.patientGender = this.getPatientGender(this.appointment);\n appointmentInfoDataModel.patientRelationshipType = this.getPatientRelationship(this.appointment);\n\n appointmentInfoDataModel.idEmpresa = this.appointment.idEmpresa;\n appointmentInfoDataModel.idResponsableServicio = this.appointment.idResponsableServicio;\n appointmentInfoDataModel.idEtapaSolicitud = this.appointment.idEtapaSolicitud;\n\n appointmentInfoDataModel.perfilPublico = new PublicProfile();\n appointmentInfoDataModel.perfilPublico.id = this.appointment.idResponsableServicio;\n appointmentInfoDataModel.perfilPublico.nombrePersona = this.appointment.nombreResponsableServicio;\n appointmentInfoDataModel.perfilPublico.sexo = this.appointment.sexoResponsableServicio;\n appointmentInfoDataModel.perfilPublico.ubicacionFoto = this.appointment.urlAvatarResponsableServicio;\n appointmentInfoDataModel.perfilPublico.tipoPerfil = 1; \n appointmentInfoDataModel.perfilPublico.username = this.appointment.identificadorPerfilPublico; \n\n this.model = new AppointmentSummaryDataModel();\n var coordinates = this.appointment.coordenadasLocalidad\n ? this.appointment.coordenadasLocalidad.split(\";\").map(c => parseFloat(c))\n : [0, 0];\n\n this.model.appointmentInfo = appointmentInfoDataModel;\n this.model.specialty = this.appointment.especialidadResponsableServicio;\n this.model.pendingApproval = false;\n this.model.locationLat = coordinates[0];\n this.model.locationLng = coordinates[1];\n this.model.phoneNumber = this.appointment.telefonoLocalidad1? this.appointment.telefonoLocalidad1 : this.appointment.telefonoLocalidad2; \n\n //console.log(this.model);\n }\n\n getPatientRelationship(app: PatientAppointmentInformation) : number {\n let relationship = 0;\n\n if (app.idPacienteOrigen != this.loggedInUser.id) {\n // Search for dependent\n let dependent = this.dependents.find(d => d.idPersona == app.idPacienteOrigen);\n\n if (dependent) {\n relationship = dependent.tipoRelacion; \n }\n } \n\n return relationship;\n }\n\n getPatientGender(app: PatientAppointmentInformation) : string {\n let gender = this.loggedInUser.sexo;\n\n if (app.idPacienteOrigen != this.loggedInUser.id) {\n // Search for dependent\n let dependent = this.dependents.find(d => d.idPersona == app.idPacienteOrigen);\n\n if (dependent) {\n gender = dependent.sexo; \n }\n } \n\n return gender;\n }\n\n \n getName(app: PatientAppointmentInformation) {\n if (app.idPacienteOrigen == this.loggedInUser.id) {\n return this.loggedInUser.nombre;\n }\n\n let dependent = this.dependents.find(d => d.idPersona == app.idPacienteOrigen);\n if (dependent) {\n return dependent?.nombre;\n } \n\n return app.nombrePaciente;\n }\n \n sendComponentFinishLoadingMessage(){\n if (!this.data || !this.data.idFormulario)\n return;\n \n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n gotoHome(){\n this.messageBusService.showHeader();\n\n this.routeDialogService.removeRouteDialogClassnameToBody();\n\n if(isPlatformBrowser(this.platformId)){\n window.location.href = environment.cliniwebPhrUrl;\n }\n }\n\n showMyAppointments(){\n this.messageBusService.showHeader();\n \n if(this.licensedCompany || this.isCliniwebCompany){\n this.routeDialogService.removeRouteDialogClassnameToBody();\n this.router.navigate(['mis-citas']);\n\n if(isPlatformBrowser(this.platformId)){\n window.location.href = environment.cliniwebPhrUrl + 'mis-citas';\n }\n }\n else{\n this.authService.getTransferToken()\n .subscribe(token=>{\n this.routeDialogService.removeRouteDialogClassnameToBody();\n\n if(isPlatformBrowser(this.platformId)){\n window.location.href = environment.cliniwebPhrUrl + 'mis-citas?token=' + token;\n }\n },\n error=>{\n this.baseService.handleServiceError(error, \"Error getting token transfer\");\n });\n } \n }\n\n getCallNumber(){\n return `tel:${this.model.phoneNumber}`;\n }\n\n getWazeUrl(){\n return `https://waze.com/ul?navigate=yes&zoom=${this.model.locationZoom}&ll=${this.model.locationLat},${this.model.locationLng}`;\n }\n\n getVirtualConsultation(): string {\n return `${this.directory?.url}/meet/${this.idTeleconsulta}`;\n }\n\n openDialogContact() {\n /*let routeDialogModel = new ContactRouteDialogModel();\n routeDialogModel.route = 'support/contactus';\n routeDialogModel.queryParams = { returnUrl: this.router.url }\n this.routeDialogService.openDialog(routeDialogModel);*/\n\n let data = new DialogData();\n\n data.data = {\n idEmpresa: this.model.appointmentInfo.idEmpresa,\n id: this.model.appointmentInfo.idResponsableServicio,\n nombrePersona: this.model.appointmentInfo.doctorName\n };\n\n this.dialog.open(DoctorMessageDialogComponent, { \n panelClass: 'doc-message-dialog',\n data: data\n }); \n }\n\n private loadDataModel() {\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as AppointmentSummaryDataModel; \n \n if (this.model.appointmentInfo && this.model.appointmentInfo.idEstado) {\n this.appointmentState = this.model.appointmentInfo.idEstado;\n\n this.appointmentStateName = this.getAppointmentStateName(\n this.model.appointmentInfo.appointmentDate, \n this.model.appointmentInfo.nombreEstado, \n this.model.appointmentInfo.idEstado);\n\n this.appointmentStateClassName = this.getAppointmentStateClassName(this.model.appointmentInfo.appointmentDate ,this.model.appointmentInfo.idEstado);\n this.appointmentStateIconClassName = this.getAppointmentStateIconClassName(this.model.appointmentInfo.appointmentDate ,this.model.appointmentInfo.idEstado);\n \n } \n }\n setTimeout(() => this.initialLoading = false, 500);\n }\n\n private getAppointmentId() {\n var idEtapaSolicitud = 0;\n \n if (this.appointment)\n idEtapaSolicitud = this.appointment.idEtapaSolicitud;\n else \n idEtapaSolicitud = this.model.appointmentInfo.idEtapaSolicitud; \n\n return idEtapaSolicitud;\n } \n\n onCancelAppointmentClick() {\n var idEtapaSolicitud = this.getAppointmentId();\n\n let routeDialogModel = new AppointmentCancelationRouteDialogModel();\n routeDialogModel.route = \"citas/cancelar/\" + idEtapaSolicitud;\n //routeDialogModel.queryParams = { returnUrl: this.router.url };\n routeDialogModel.queryParams = { returnUrl: this.document.location.pathname };\n\n //routeDialogModel.state = null;\n\n this.routeDialogService.openDialog(routeDialogModel);\n }\n\n onReScheduleAppointmentClick() {\n let publicProfileId = this.model.appointmentInfo.idResponsableServicio;\n\n this.publicProfileService.getPublicProfileById(publicProfileId, this.locale.language, this.baseService.getCompanyName())\n .subscribe(pp => {\n if(pp) {\n //let route = \"perfil/reprogramar/\" + pp.username;\n\n // Close all popups \n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\n\n // Open re-schedule popup\n setTimeout(() => {\n /*let routeDialogModel = new RescheduleAppointmentRouteDialogModel();\n routeDialogModel.route = route;\n routeDialogModel.state = null; \n this.routeDialogService.openDialog(routeDialogModel);*/\n\n let url = this.publicProfileService.getPublicProfileUrl(pp.username);\n this.publicProfileService.openPublicProfile(url);\n }, 1500); \n }\n },\n error=>{\n this.baseService.handleServiceError(error, \"Error getting public profile\");\n }); \n }\n get isVirtual() { return this.model?.appointmentInfo?.appointmentType == AppointmentType.VIRTUAL; }\n\n openMap(){\n let data = new MapDialogData();\n\n data.title = this.model.appointmentInfo.attentionPlaceName; \n data.message = (this.model.locationLat + \";\" + this.model.locationLng);\n data.animationIn = 'map-phr-animation-in';\n data.animationOut = 'map-phr-animation-out';\n data.showCloseTextButton = true;\n data.showWazeButton = false;\n\n this.dialog.open(MapDialogComponent, { \n panelClass: ['map-dialog','map-phr-dialog', 'map-phr-animation-in'],\n data: data\n });\n }\n}\n","
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n {{'shared.userPayment.text1' | translate:locale.language}}\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {{payment.nombreResponsableServicio | lowercase }}\r\n
\r\n
\r\n ${{getFormatedAmount(payment.monto)}}\r\n
\r\n
\r\n {{payment.fechaPagoElectronico | date:'d MMM, y' }}\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n **** {{payment.numeroTarjeta}}\r\n
\r\n
\r\n \r\n
{{payment.nombrePacientePhr}}
\r\n
\r\n
\r\n \r\n
\r\n {{'shared.userPayment.text4' | translate:locale.language}}\r\n ${{getFormatedAmount(detail.montoDetalleTransaccion)}} \r\n
\r\n
\r\n {{'shared.userPayment.text5' | translate:locale.language}}:\r\n ${{getFormatedAmount(payment.monto)}}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { CloseRouteDialogMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { PaymentService } from 'src/app/core/services/payment-service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { UserPayment } from 'src/app/shared/models/finance/payments/user-payment.model';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { OnlinePaymentModel } from 'src/app/shared/models/workflow/models/online-payment.model';\r\nimport { PaymentRouteDialogModel } from '../../dialogs/route-dialog/route-dialog.component';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\r\nimport { CustomCurrencyPipe } from 'src/app/shared/pipes/custom-currency.pipe';\r\n\r\n@Component({\r\n selector: 'app-user-payment',\r\n templateUrl: './user-payment.component.html',\r\n styleUrls: ['./user-payment.component.css'],\r\n providers: [CustomCurrencyPipe],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class UserPaymentComponent implements OnInit, OnDestroy {\r\n private ngUnsubscribe = new Subject();\r\n payment: UserPayment;\r\n loading: boolean = false;\r\n loadingPayment: boolean = false;\r\n loadingPdf: boolean = false;\r\n \r\n constructor( \r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n private messageBusService: MessageBusService,\r\n private paymentsService: PaymentService,\r\n private baseService: BaseService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private publicProfileService: PublicProfileService,\r\n private routeDialogService: RouteDialogService,\r\n private appStorageService: AppStorageService,\r\n private currencyPipe : CustomCurrencyPipe\r\n ) { \r\n }\r\n\r\n ngOnInit(): void {\r\n const transaccionId = this.route.snapshot.paramMap.get('id');\r\n\r\n if (!transaccionId) {\r\n this.gotoPayments();\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.paymentsService.getUserPayment(parseInt(transaccionId))\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(payment => {\r\n if (!payment) {\r\n this.gotoPayments();\r\n return;\r\n }\r\n \r\n this.payment = payment; \r\n\r\n //console.log(payment);\r\n\r\n this.loading = false;\r\n },\r\n error => {\r\n this.baseService.handleServiceError(error, \"Error getting payment\");\r\n\r\n this.loading = false;\r\n });\r\n\r\n // On Header Back click\r\n this.messageBusService.onNavigateBack()\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(m => {\r\n this.gotoPayments();\r\n }\r\n );\r\n }\r\n\r\n gotoPayments() {\r\n this.router.navigate([\"/configuracion/pagos\"]);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n getFormatedAmount(amount: number) {\r\n return this.currencyPipe.transform(amount.toFixed(2), 'USD','','1.2-2','en-US');\r\n }\r\n\r\n onPaymentClick() {\r\n /*let url = this.publicProfileService.getPublicProfileUrl(this.payment.identificadorPerfilPublico);\r\n this.routeDialogService.closeDialogsAndNavigate(url, {payment: true});*/\r\n let companyName = this.baseService.getCliniwebDirectoryCompanyName();\r\n\r\n this.loadingPayment = true;\r\n\r\n this.publicProfileService.getPublicProfile(this.payment.identificadorPerfilPublico, this.locale.language, companyName)\r\n .subscribe(publicProfile => {\r\n let dto = new OnlinePaymentModel();\r\n \r\n dto.idResponsableServicio = publicProfile.id;\r\n dto.nombreResponsableServicio = publicProfile.nombrePersona;\r\n dto.urlAvatarResponsableServicio = publicProfile.ubicacionFoto;\r\n dto.nickname = publicProfile.username;\r\n dto.especialidadResponsableServicio = publicProfile.especialidad;\r\n dto.idEmpresa = publicProfile.idEmpresa; \r\n dto.nombreEmpresa = companyName;\r\n dto.emailResponsableServicio = publicProfile.emailRemitenteNotificacion; \r\n dto.idEmpresaResponsableServicio = publicProfile.idEmpresa;\r\n dto.perfilPublico = publicProfile;\r\n \r\n this.loadingPayment = false;\r\n \r\n this.appStorageService.setItemSession(STORAGE.ONLINE_PAYMENT_WORKFLOW_BOOTSTRAP_STATE, dto);\r\n this.routeDialogService.closeDialogsAndNavigate(\"/pagos/checkout\");\r\n\r\n /*let routeDialogModel = new PaymentRouteDialogModel();\r\n routeDialogModel.state = dto; \r\n this.routeDialogService.openDialog(routeDialogModel);*/\r\n },\r\n error => {\r\n this.baseService.handleServiceError(error, \"Public profile not found\");\r\n\r\n this.loadingPayment = false;\r\n });\r\n }\r\n \r\n onDownloadTransactionPdfClick() {\r\n this.loadingPdf = true; \r\n\r\n this.paymentsService.getUserPaymentPdf(this.payment.id).subscribe((doc) => {\r\n let downloadURL = window.URL.createObjectURL(doc);\r\n let companyName = this.baseService.getCliniwebDirectoryCompanyName();\r\n let patientName = this.payment.nombrePacientePhr;\r\n let dateTimestamp = new Date(this.payment.fechaTransaccion).toDateString();\r\n let transactionTranslation = this.translation.translate(\"shared.userPayment.text8\");\r\n\r\n let link = document.createElement('a');\r\n link.href = downloadURL;\r\n link.download = (`${transactionTranslation} ${patientName} - ${companyName} - ${dateTimestamp}`+ \".pdf\");\r\n\r\n link.click(); \r\n\r\n this.loadingPdf = false; \r\n },\r\n (error => {\r\n console.error(\"Error getting pdf\");\r\n\r\n this.loadingPdf = false; \r\n }));\r\n }\r\n}\r\n\r\n\r\n\r\n","
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n 0\">\r\n
\r\n {{'shared.userPaymentsList.text1' | translate:locale.language}}\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {{payment.nombreResponsableServicio | lowercase }}\r\n
\r\n
\r\n {{payment.fechaPagoElectronico | date:'d MMM, y' }}\r\n
\r\n
\r\n
\r\n
\r\n ${{formatPaymentAmount(payment.montoPago)}}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {{'shared.userPaymentsList.text1' | translate:locale.language}}\r\n
\r\n \r\n \r\n
\r\n {{'shared.userPaymentsList.text7' | translate:locale.language}}\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { CloseRouteDialogMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { PaymentService } from 'src/app/core/services/payment-service';\r\nimport { UserPaymentItem } from 'src/app/shared/models/finance/payments/user-payment-item.model';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { Router } from '@angular/router';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { CustomCurrencyPipe } from 'src/app/shared/pipes/custom-currency.pipe';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-user-payments-list',\r\n templateUrl: './user-payments-list.component.html',\r\n styleUrls: ['./user-payments-list.component.css'],\r\n providers: [CustomCurrencyPipe],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class UserPaymentsListComponent implements OnInit, OnDestroy {\r\n private ngUnsubscribe = new Subject();\r\n payments: UserPaymentItem[];\r\n loading: boolean = false;\r\n \r\n constructor( \r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n private messageBusService: MessageBusService,\r\n private paymentsService: PaymentService,\r\n private baseService: BaseService,\r\n private router: Router,\r\n private dialogRef: MatDialog,\r\n private routeDialogService: RouteDialogService,\r\n private currencyPipe : CustomCurrencyPipe,\r\n @Inject(DOCUMENT) private document: Document\r\n ) { \r\n }\r\n\r\n ngOnInit(): void {\r\n this.document.body.classList.add('user-payments-list');\r\n this.loading = true;\r\n\r\n this.paymentsService.getUserPayments()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(payments => { \r\n this.payments = payments; \r\n\r\n this.loading = false; \r\n },\r\n error => {\r\n this.baseService.handleServiceError(error, \"Error getting payments\");\r\n\r\n this.loading = false;\r\n });\r\n\r\n // On Header Back click\r\n this.messageBusService.onNavigateBack()\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(m => {\r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n }\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.document.body.classList.remove('user-payments-list');\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n paymentTrackBy(index : number, item: UserPaymentItem){\r\n return item.idPagoElectronico; \r\n }\r\n \r\n onPaymentClick(payment: UserPaymentItem) {\r\n this.router.navigate([\"/configuracion/pagos/\" + payment.idTransaccionFacturaProveedor]);\r\n }\r\n\r\n formatPaymentAmount(amount: number) {\r\n return this.currencyPipe.transform(amount.toFixed(2), 'USD','','1.2-2','en-US');\r\n }\r\n\r\n onNewPaymentClick() {\r\n let dialogData = new DialogData();\r\n \r\n dialogData.title = this.translation.translate(\"shared.userPaymentsList.text3\"); \r\n dialogData.message = this.translation.translate(\"shared.userPaymentsList.text4\"); \r\n dialogData.confirmText = this.translation.translate(\"shared.userPaymentsList.text5\"); \r\n dialogData.showHeaderIcon = false;\r\n dialogData.showHeader = true;\r\n //dialogData.headerIconClass = \"phr-iconset-info\"; \r\n dialogData.showCancelButton = true;\r\n dialogData.cancelText = this.translation.translate(\"shared.userPaymentsList.text6\");\r\n\r\n const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: ['confirm-logout-dialog', 'confirm-logout-animation-in', 'new-payment-info-dialog']\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(accepted => { \r\n if (accepted) { \r\n let cliniPayEnabledFilter = 61903;\r\n let qs = {filtros: cliniPayEnabledFilter};\r\n this.routeDialogService.closeDialogsAndNavigate(\"/doctores/todos\", {queryParams: qs});\r\n }\r\n }); \r\n } \r\n}\r\n\r\n\r\n\r\n","
\r\n \r\n\r\n
\r\n {{'shared.editUser.text1' | translate:locale.language}} \r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n {{'shared.editUser.text3' | translate:locale.language}}\r\n \r\n {{'shared.editUser.text4' | translate:locale.language}}\r\n \r\n
\r\n
\r\n \r\n {{'shared.editUser.text5' | translate:locale.language}}\r\n \r\n {{'shared.editUser.text6' | translate:locale.language}}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{'man' | translate:locale.language}}\r\n \r\n \r\n \r\n {{'women' | translate:locale.language}}\r\n \r\n \r\n {{'shared.editUser.text10' | translate:locale.language}}\r\n\r\n
\r\n
\r\n
\r\n \r\n {{'shared.editUser.text13' | translate:locale.language}}\r\n \r\n \r\n {{availableCountry.nombreI18n | i18nText:locale.language}}\r\n \r\n \r\n \r\n {{ 'shared.editUser.text14' | translate:locale.language }}\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n
","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { MessageBusService, NavigationBackMessage, OpenSnackBarMessage, SnackBarType } from 'src/app/core/services/message-bus.service';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { UpdateUser, UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { AvatarUploadComponentOptions, AvatarUploadedFileModel } from '../../avatar-upload/avatar-upload.component';\r\nimport { StateType } from 'src/app/shared/enums/state-type.enum';\r\nimport { TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\r\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-edit-user',\r\n templateUrl: './edit-user.component.html',\r\n styleUrls: ['./edit-user.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n\r\nexport class EditUserComponent implements OnInit, OnDestroy {\r\n \r\n private ngUnsubscribe = new Subject();\r\n loggedInUser: UserPerson = null as any; \r\n formGroup: FormGroup;\r\n formSubmitted: boolean = false;\r\n saving: boolean = false;\r\n translations = {\r\n man: \"\",\r\n women: \"\", \r\n };\r\n avatarUploadOptions : AvatarUploadComponentOptions;\r\n minDate: Date;\r\n maxDate: Date;\r\n\r\n availableCountries: TerritorialDivision[] = [];\r\n\r\n constructor(\r\n private userService: UserService, \r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n private formBuilder: FormBuilder,\r\n private messageBusService: MessageBusService,\r\n private router: Router,\r\n private dialog: MatDialog,\r\n private territorialDivisionService: TerritorialDivisionsService\r\n ) {\r\n this.avatarUploadOptions = new AvatarUploadComponentOptions();\r\n this.avatarUploadOptions.requiredFileType = \"image/png,image/jpeg\";\r\n this.avatarUploadOptions.selectFileLabel = \"aƱadir foto\";\r\n this.avatarUploadOptions.changeFileLabel = \"Editar\";\r\n this.avatarUploadOptions.showFileOnceUpload = true;\r\n\t this.avatarUploadOptions.edit = true;\r\n\r\n const currentYear = new Date().getFullYear();\r\n this.minDate = new Date(currentYear - 120, 0, 1);\r\n this.maxDate = new Date();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadAvailableCountries();\r\n\r\n this.formGroup = this.formBuilder.group({ \r\n nameControl: ['', [Validators.required, Validators.maxLength(200)]],\r\n lastNameControl: ['', [Validators.required, Validators.maxLength(200)]],\r\n birthDateControl: ['', Validators.required],\r\n sexControl: ['', Validators.required],\r\n countryControl: ['', Validators.required]\r\n });\r\n\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.translations.man = this.translation.translate('man');\r\n this.translations.women = this.translation.translate('women');\r\n\r\n this.avatarUploadOptions.selectFileLabel = this.translation.translate('shared.viewUser.text8');\r\n this.avatarUploadOptions.changeFileLabel = this.translation.translate('shared.viewUser.text3');\r\n this.avatarUploadOptions.changePictureLabel = this.translation.translate('shared.viewUser.text9');\r\n this.avatarUploadOptions.deleteFileLabel = this.translation.translate('shared.viewUser.text10');\r\n }\r\n });\r\n\r\n this.userService.getUserPersonLoggedIn()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(p => {\r\n if (p)\r\n this.loggedInUser = p;\r\n\r\n /*if (!this.loggedInUser.ubicacionLogo) {\r\n let feNacimiento = this.loggedInUser.fechaNacimiento? new Date(this.loggedInUser.fechaNacimiento) : null;\r\n this.loggedInUser.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(feNacimiento, this.loggedInUser.sexo);\r\n }*/\r\n \r\n //this.loggedInUser.fechaNacimiento = new Date();\r\n //this.loggedInUser.sexo = \"M\";\r\n\r\n this.loadUserData(this.loggedInUser);\r\n });\r\n\r\n // On Header Back click\r\n this.messageBusService.onNavigateBack().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.onNavigateBackNext.bind(this));\r\n }\r\n\r\n private onNavigateBackNext(_: NavigationBackMessage): void {\r\n if (this.formGroup.dirty && this.formGroup.touched) {\r\n this.beforeCloseAlert();\r\n } else\r\n this.router.navigate(['configuracion/usuario']);\r\n }\r\n\r\n private beforeCloseAlert(): void {\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate(\"shared.editDependent.cancelTitle\");\r\n dialogData.message = this.translation.translate(\"shared.editDependent.cancelMessage\");\r\n dialogData.confirmText = this.translation.translate(\"shared.editDependent.cancelConfirmText\"); \r\n dialogData.cancelText = this.translation.translate(\"shared.editDependent.cancelCancelText\");\r\n dialogData.headerIconClass = 'phr-iconset-alert';\r\n dialogData.showHeaderIcon = true;\r\n dialogData.showCancelButton = true;\r\n dialogData.loadLicense = true;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: 'cancel-edit-person-dialog'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(accepted => {\r\n if (accepted) {\r\n this.router.navigate(['configuracion/usuario']);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n this.messageBusService.refreshProfileMenu();\r\n }\r\n\r\n loadAvailableCountries(){\r\n this.availableCountries = this.territorialDivisionService.getAvailableCountries();\r\n }\r\n\r\n loadUserData(user: UserPerson) {\r\n if (user.idPaisResidencia > 0 && user.idPaisResidencia != 9){\r\n\r\n if(!this.availableCountries.find(c=> c.idPais == user.idPaisResidencia)){\r\n let anotherCountry = this.availableCountries.find(c => c.id == 1);\r\n\r\n this.setControlValue(\"countryControl\", anotherCountry?.idPais);\r\n }\r\n else{\r\n this.setControlValue(\"countryControl\", user.idPaisResidencia);\r\n }\r\n }\r\n\r\n if (user.fechaNacimiento && new Date(user.fechaNacimiento).getFullYear() === 1900) {\r\n this.setControlValue(\"nameControl\", undefined);\r\n this.setControlValue(\"lastNameControl\", undefined);\r\n this.setControlValue(\"birthDateControl\", undefined);\r\n this.setControlValue(\"sexControl\", undefined);\r\n\r\n return;\r\n } \r\n\r\n if (user.nombre)\r\n this.setControlValue(\"nameControl\", user.nombre);\r\n\r\n if (user.apellido)\r\n this.setControlValue(\"lastNameControl\", user.apellido);\r\n\r\n if (user.fechaNacimiento)\r\n this.setControlValue(\"birthDateControl\", user.fechaNacimiento);\r\n\r\n if (user.sexo && user.sexo != \"9\")\r\n this.setControlValue(\"sexControl\", user.sexo);\r\n }\r\n\r\n getControl(controlName: string) {\r\n return this.formGroup.controls[controlName];\r\n }\r\n\r\n isControlInvalid(controlName: string) {\r\n let control = this.getControl(controlName);\r\n\r\n // First check if the form is submitted or control is dirty\r\n if (!this.formSubmitted && !control.touched)\r\n return false;\r\n\r\n return control.invalid;\r\n }\r\n\r\n controlHasError(controlName: string, errorName: string) {\r\n return this.getControl(controlName).hasError(errorName);\r\n }\r\n \r\n getControlValue(controlName: string) {\r\n return this.getControl(controlName).value;\r\n }\r\n\r\n setControlValue(controlName: string, value: any) {\r\n this.getControl(controlName).setValue(value);\r\n }\r\n\r\n onUserSaveClick() {\r\n this.formGroup.markAllAsTouched();\r\n this.formSubmitted = true;\r\n\r\n if (!this.formGroup.valid)\r\n return;\r\n\r\n this.saving = true;\r\n\r\n let model: UpdateUser = new UpdateUser();\r\n\r\n model.nombre = this.getControlValue(\"nameControl\");\r\n model.apellido = this.getControlValue(\"lastNameControl\");\r\n model.fechaNacimiento = new Date(this.getControlValue(\"birthDateControl\"));\r\n model.sexo = this.getControlValue(\"sexControl\");\r\n model.idPais = this.getControlValue(\"countryControl\");\r\n model.ubicacionLogo = this.loggedInUser.ubicacionLogo ?? model.ubicacionLogo;\r\n\r\n //console.log(model);\r\n\r\n this.userService.updateUser(model).subscribe(updated => { \r\n this.loggedInUser.nombre = model.nombre;\r\n this.loggedInUser.apellido = model.apellido;\r\n this.loggedInUser.fechaNacimiento = model.fechaNacimiento;\r\n this.loggedInUser.sexo = model.sexo;\r\n this.loggedInUser.idPaisResidencia = model.idPais;\r\n this.loggedInUser.idEstadoValidacionIdentidadPersona = updated.idEstadoValidacionIdentidadPersona ?? StateType.SinValidar;\r\n\r\n this.userService.updateUserLoggedIn(this.loggedInUser);\r\n\r\n this.territorialDivisionService.setCountryApp(model.idPais);\r\n\r\n this.saving = false;\r\n\r\n this.showSuccessToast();\r\n\r\n this.router.navigate(['configuracion/usuario']);\r\n },\r\n error => {\r\n this.saving = false;\r\n });\r\n }\r\n \r\n showSuccessToast() {\r\n let message = new OpenSnackBarMessage();\r\n message.text = this.translation.translate('shared.editUser.text12');\r\n message.type = SnackBarType.SUCCESS;\r\n message.duration = 3000;\r\n \r\n this.messageBusService.openSnackBar(message);\r\n }\r\n\r\n onAvatarUploaded(file: AvatarUploadedFileModel) {\r\n this.loggedInUser.ubicacionLogo = file?.webUrl;\r\n }\r\n\r\n getBirthdateControl():FormControl | null{\r\n return this.formGroup.get('birthDateControl') \r\n ? this.formGroup.get('birthDateControl') as FormControl \r\n : null;\r\n }\r\n}\r\n\r\n","
\r\n \r\n\r\n
\r\n {{'shared.viewUser.text1' | translate:locale.language}} {{loggedInUser.nombre}}\r\n ({{'shared.viewUser.text2' | translate:locale.language}})\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n {{'shared.viewUser.text4' | translate:locale.language}}\r\n
\r\n
\r\n {{loggedInUser.fullName}}\r\n
\r\n
\r\n
\r\n
\r\n {{'shared.viewUser.text5' | translate:locale.language}}\r\n
\r\n
\r\n {{ fechaNacimiento }} \r\n
\r\n
\r\n
\r\n
\r\n {{'shared.viewUser.text6' | translate:locale.language}}\r\n
\r\n
\r\n \r\n {{loggedInUser.sexName}}\r\n
\r\n
\r\n
\r\n
\r\n {{ 'shared.viewUser.text11' | translate:locale.language }}\r\n
\r\n
\r\n {{loggedInUser.residenceCountryName | i18nText:locale.language}}\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n
","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { Router } from '@angular/router';\r\nimport { Subject } from 'rxjs';\r\nimport { CloseRouteDialogMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { AvatarUploadComponentOptions, AvatarUploadedFileModel } from '../../avatar-upload/avatar-upload.component';\r\nimport CommonTypesHelper from 'src/app/shared/helpers/common-types-helper';\r\nimport { StateType } from 'src/app/shared/enums/state-type.enum';\r\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\r\nimport { TextLanguage } from 'src/app/shared/models/people/text-language.model';\r\nimport * as moment from 'moment';\r\n\r\n@Component({\r\n selector: 'app-view-user',\r\n templateUrl: './view-user.component.html',\r\n styleUrls: ['./view-user.component.css']\r\n})\r\n\r\nexport class ViewUserComponent implements OnInit, OnDestroy {\r\n\r\n private ngUnsubscribe = new Subject();\r\n fechaNacimiento: string | null;\r\n loggedInUser: ViewUserComponentDto = null as any; \r\n translations = {\r\n man: \"\",\r\n women: \"\", \r\n };\r\n avatarUploadOptions : AvatarUploadComponentOptions;\r\n \r\n constructor(\r\n private userService: UserService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService, \r\n private router: Router,\r\n private messageBusService: MessageBusService,\r\n private territorialDivisionService: TerritorialDivisionsService\r\n ) {\r\n moment.locale(this.locale.language);\r\n this.avatarUploadOptions = new AvatarUploadComponentOptions();\r\n this.avatarUploadOptions.requiredFileType = \"image/png,image/jpeg\";\r\n this.avatarUploadOptions.selectFileLabel = \"aƱadir foto\";\r\n this.avatarUploadOptions.changeFileLabel = \"Editar\";\r\n this.avatarUploadOptions.showFileOnceUpload = true;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.translations.man = this.translation.translate('man');\r\n this.translations.women = this.translation.translate('women');\r\n\r\n this.avatarUploadOptions.selectFileLabel = this.translation.translate('shared.viewUser.text8');\r\n this.avatarUploadOptions.changeFileLabel = this.translation.translate('shared.viewUser.text3');\r\n this.avatarUploadOptions.changePictureLabel = this.translation.translate('shared.viewUser.text9');\r\n this.avatarUploadOptions.deleteFileLabel = this.translation.translate('shared.viewUser.text10');\r\n }\r\n });\r\n\r\n this.userService.getUserPersonLoggedIn()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(p => {\r\n if (p) \r\n this.loggedInUser = p as ViewUserComponentDto;\r\n\r\n if (p?.fechaNacimiento && new Date(p?.fechaNacimiento).getFullYear() === 1900) {\r\n this.loggedInUser.fullName = \"\";\r\n this.loggedInUser.sexName = \"\";\r\n this.loggedInUser.residenceCountryName = [];\r\n this.fechaNacimiento = null;\r\n } else {\r\n this.loggedInUser.fullName = `${this.loggedInUser.nombre} ${this.loggedInUser.apellido}`;\r\n let feNacimiento = this.loggedInUser.fechaNacimiento ? new Date(this.loggedInUser.fechaNacimiento) : null;\r\n this.fechaNacimiento = CommonTypesHelper.dateHasValue(feNacimiento) ? moment(feNacimiento).format('D [de] MMMM, yyyy') : null;\r\n \r\n if (CommonTypesHelper.stringHasValue(this.loggedInUser.sexo)) {\r\n if (this.loggedInUser.sexo.toLocaleLowerCase() == \"m\") {\r\n this.loggedInUser.sexName = this.translations.man;\r\n this.loggedInUser.sexIconClass = \"phr-iconset-hombre\"; \r\n } else {\r\n this.loggedInUser.sexName = this.translations.women;\r\n this.loggedInUser.sexIconClass = \"phr-iconset-mujer\";\r\n }\r\n }\r\n }\r\n var country = this.territorialDivisionService.getAvailableCountries().find(c => c.idPais == this.loggedInUser.idPaisResidencia);\r\n\r\n if(country){\r\n this.loggedInUser.residenceCountryName = country.nombreI18n;\r\n } \r\n });\r\n\r\n // On Header Back click\r\n this.messageBusService.onNavigateBack()\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(m => {\r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n }\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n this.messageBusService.refreshProfileMenu();\r\n }\r\n\r\n onUserEditClick() {\r\n this.router.navigate(['configuracion/usuario/edicion']); \r\n }\r\n\r\n onAvatarUploaded(file: AvatarUploadedFileModel) {\r\n this.loggedInUser.ubicacionLogo = file?.webUrl;\r\n this.userService.updateUserLoggedIn(this.loggedInUser);\r\n }\r\n \r\n}\r\n\r\nexport class ViewUserComponentDto extends UserPerson {\r\n fullName: string;\r\n sexName: string;\r\n sexIconClass: string;\r\n residenceCountryName: TextLanguage[];\r\n}\r\n\r\n","import { IControlComponent } from \"../interfaces/control-component\";\r\n\r\nexport type ControlComponentClass = { new (): IControlComponent };\r\n\r\nexport const ComponentLookupRegistry: Map = new Map();\r\n\r\nexport const ComponentLookup = (key: string): any => {\r\n return (cls: ControlComponentClass) => {\r\n ComponentLookupRegistry.set(key, cls);\r\n };\r\n};","export const Debounce = (delay: number = 300): any => {\r\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\r\n let timeout: number | null | undefined = null;\r\n \r\n const original = descriptor.value;\r\n \r\n descriptor.value = function (...args: any) {\r\n if(timeout)\r\n clearTimeout(timeout);\r\n timeout = window.setTimeout(() => original.apply(this, args), delay);\r\n };\r\n \r\n return descriptor;\r\n };\r\n}","import { IWorkflowComponent } from \"../interfaces/workflow-component\";\r\n\r\nexport type WorkflowComponentClass = { new (): IWorkflowComponent };\r\n\r\nexport const WorkflowLookupRegistry: Map = new Map();\r\n\r\nexport const WorkflowLookup = (key: string): any => {\r\n return (cls: WorkflowComponentClass) => {\r\n WorkflowLookupRegistry.set(key, cls);\r\n };\r\n};","import { Directive, ElementRef, HostListener } from '@angular/core';\n\n@Directive({\n selector: '[appCapitalize]'\n})\nexport class CapitalizeDirective {\n\n constructor(private el: ElementRef) { }\n\n @HostListener('input', ['$event']) onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n input.value = this.capitalize(input.value);\n }\n\n private capitalize(value: string): string {\n if (!value) {\n return value;\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1);\n }\n}\n","import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { Directive, ElementRef, HostListener, Input } from '@angular/core';\n\n@Directive({\n selector: '[appCenterInput]'\n})\nexport class CenterInputDirective {\n\n @Input() onlyMobile = true;\n private isMobile: boolean = this.breakpointObserver.isMatched([Breakpoints.Handset, Breakpoints.Tablet]);\n private scrollIntoViewOptions: ScrollIntoViewOptions = {behavior: 'smooth', block: 'center'};\n private thisElementRef: HTMLInputElement;\n\n constructor(private breakpointObserver: BreakpointObserver, private elementRef: ElementRef) { }\n\n @HostListener('focus', ['$event'])\n onFocus(event: FocusEvent): void {\n this.setElementRef();\n \n if (!this.isMobile && !this.onlyMobile) \n return;\n\n // Need to wait for Android to open the keyboard before running the scroll\n setTimeout(() => {\n this.thisElementRef.scrollIntoView(this.scrollIntoViewOptions);\n }, 300);\n }\n\n private setElementRef(): void {\n if (!this.thisElementRef) {\n this.thisElementRef = this.elementRef.nativeElement;\n }\n }\n\n}\n","import { Directive, ViewContainerRef } from '@angular/core';\n\n@Directive({\n selector: '[dynamicHost]'\n})\nexport class DynamicHostDirective {\n\n constructor(public viewContainerRef: ViewContainerRef) { }\n}\n","import { ChangeDetectorRef, Directive, OnInit } from '@angular/core';\nimport { MatSelect } from '@angular/material/select';\n\n@Directive({\n selector: 'mat-select'\n})\nexport class MatSelectCustomDirective implements OnInit {\n\n private alturaQuitada = 43;\n private animacion = '0.2s ease-out';\n private clase = 'panel-no-sobre-select';\n\n constructor(private cd: ChangeDetectorRef, private matSelect: MatSelect) {\n this.matSelect.disableOptionCentering = true;\n this.matSelect.openedChange.subscribe(this.matSelectOpenedChange.bind(this));\n }\n\n ngOnInit(): void {\n if (!this.matSelect.panelClass) this.matSelect.panelClass = [];\n this.agregarClaseParaManipularUbicacionDeOptiones();\n this.cd.detectChanges();\n }\n\n private agregarClaseParaManipularUbicacionDeOptiones() {\n if (this.matSelect.panelClass instanceof Set) {\n this.matSelect.panelClass.add(this.clase);\n } else if (typeof this.matSelect.panelClass === 'object' && !Array.isArray(this.matSelect.panelClass)) {\n this.matSelect.panelClass[this.clase] = true;\n } else if (Array.isArray(this.matSelect.panelClass)) {\n this.matSelect.panelClass.push(this.clase)\n } else {\n this.matSelect.panelClass += ` ${this.clase}`;\n }\n }\n\n private matSelectOpenedChange(opened: boolean): void {\n const matSelectPanel: HTMLElement = this.matSelect.panel?.nativeElement;\n if (opened && matSelectPanel.classList.contains(this.clase)) this.procesarPanelPadreAbiertoYqueContieneLaClase(matSelectPanel);\n }\n\n private procesarPanelPadreAbiertoYqueContieneLaClase(matSelectPanel: HTMLElement): void {\n const cdkOverlayPanel: HTMLElement | null | undefined = matSelectPanel.parentElement?.parentElement;\n if (cdkOverlayPanel) this.moficarLaPosicionDelPanel(cdkOverlayPanel);\n }\n\n private moficarLaPosicionDelPanel(cdkOverlayPanel: HTMLElement): void {\n const bottom = parseInt(cdkOverlayPanel.style.bottom);\n const top = parseInt(cdkOverlayPanel.style.top);\n if (!isNaN(bottom)) {\n //cdkOverlayPanel.style.transition = `bottom ${this.animacion}`;\n //cdkOverlayPanel.style.bottom = `${bottom + this.alturaQuitada}px`;\n }\n if (!isNaN(top)) {\n //cdkOverlayPanel.style.transition = `top ${this.animacion}`;\n //cdkOverlayPanel.style.top = `${top + this.alturaQuitada}px`;\n }\n }\n\n}\n","import { Directive, HostListener, Inject } from '@angular/core';\nimport { Debounce } from '../decorators/debounce.decorator';\nimport { DOCUMENT } from '@angular/common';\n\n@Directive({\n selector: '[appTouchMoveListener]'\n})\nexport class TouchMoveListenerDirective {\n\n constructor(@Inject(DOCUMENT) private document: Document) { }\n\n @HostListener('touchmove', ['$event'])\n @Debounce(200)\n onTouchMove($event: Event) {\n const activeElement = this.document.activeElement;\n if (activeElement && (activeElement as HTMLElement).blur) {\n (activeElement as HTMLElement).blur();\n }\n }\n}\n","export enum ComponentName {\r\n PAYMENT_AMOUNT = \"PaymentAmountComponent\",\r\n PAYMENT_FORM = \"PaymentComponent\",\r\n AUTHENTICATION = \"AuthenticationComponent\",\r\n SELECT_PATIENT = \"SelectPatientAppointmentCheckoutComponent\",\r\n SELECT_PATIENT_RELATIONSHIP_APPOINTMENT = \"SelectPatientRelationshipAppointmentCheckoutComponent\",\r\n PATIENT_FORM_APPOINTMENT = \"PatientFormAppointmentCheckoutComponent\",\r\n PATIENT_CONTACT_FORM = \"PatientContactFormAppointmentCheckoutComponent\",\r\n PATIENT_VERIFICATION = \"PatientVerificationComponent\",\r\n SUMMARY_APPOINTMENT = \"SummaryAppointmentCheckoutComponent\",\r\n SUMMARY_MEDICAL_ORDER = \"SummaryMedicalOrderComponent\",\r\n SELECT_COUNTRY = \"CountryFormCheckoutComponent\",\r\n SELECT_PATIENT_RELATIONSHIP = \"SelectPatientRelationshipComponent\",\r\n CREATE_PATIENT_RELATIONSHIP = \"CreatePatientRelationshipComponent\"\r\n}","export enum ContainerType{\r\n MAIN = 'main',\r\n HEADER = 'header'\r\n}","export enum Direction {\r\n None = 'None',\r\n Up = 'Up',\r\n Down = 'Down'\r\n}","export enum LegalAgreementType {\r\n DISCLAIMER = \"descargoResponsabilidad\",\r\n POLITICA_PRIVACIDAD = \"politicaPrivacidad\",\r\n TERMINOS_CONDICIONES = \"terminosCondiciones\",\r\n}","import { SystemAreas } from \"./system-areas.enum\";\r\n\r\nexport enum MEDICAL_REQUEST_TYPE {\r\n GROWTH_CURVE = 57,\r\n LABORATORY_ORDER = 29,\r\n MEDICAL_ORDER = 26,\r\n MEDICAL_PRESCRIPTION = 46,\r\n RADIOLOGY_ORDER = 32\r\n}\r\n\r\nexport enum MEDICAL_REQUEST_STATE{\r\n COMPLETED = 1\r\n}\r\n\r\nexport enum CONCEPTOS_ID {\r\n COMENTARIO = 25027\r\n}\r\n\r\nexport enum TIPO_CONCEPTOS_ID {\r\n DIAGNOSTICO = 5\r\n}\r\n\r\nexport interface TitleMapping {\r\n [key: number]: string;\r\n}\r\n\r\nexport interface TitleMapping2 {\r\n [key: number]: number;\r\n}\r\n\r\nexport const MY_MEDICAL_ORDERS_TITLE: TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.myMedicalOrders.titleLaboratory',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.myMedicalOrders.titlePrescription',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.myMedicalOrders.titleRadiology',\r\n}\r\nexport const MEDICAL_ORDERS_LANDING_TITLE: TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.medicalOrderLanding.title1',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_ORDER]: 'shared.medicalOrderLanding.title1',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.medicalOrderLanding.title',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.medicalOrderLanding.title2',\r\n}\r\n\r\nexport const MY_MEDICAL_ORDERS_CARD_TEXT: TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.myMedicalOrders.cardTextLaboratory',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.myMedicalOrders.cardTextPrescription',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.myMedicalOrders.cardTextRadiology',\r\n}\r\n\r\nexport const MY_MEDICAL_ORDERS_BUTTON_TEXT: TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.myMedicalOrders.buttonTextLaboratory',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.myMedicalOrders.buttonTextPrescription',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.myMedicalOrders.buttonTextRadiology',\r\n}\r\n\r\nexport const TITLE_MAPPING:TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.medicalOrder.summary.laboratoryOrder',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_ORDER]: 'shared.medicalOrder.summary.medicalOrder',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.medicalOrder.summary.medicalPrescription',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.medicalOrder.summary.radiologyOrder',\r\n} as const;\r\n\r\nexport const MY_MEDICAL_ORDER_EMPTY_STATE_TITLE: TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.medicalOrder.empty.laboratoryOrderTitle',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_ORDER]: 'shared.medicalOrder.empty.medicalOrderTitle',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.medicalOrder.empty.medicalPrescriptionTitle',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.medicalOrder.empty.radiologyOrderTitle',\r\n} as const;\r\n\r\nexport const MY_MEDICAL_ORDER_EMPTY_STATE_TEXT: TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.medicalOrder.empty.laboratoryOrder',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_ORDER]: 'shared.medicalOrder.empty.medicalOrderTitle',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.medicalOrder.empty.medicalPrescription',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.medicalOrder.empty.radiologyOrder',\r\n} as const;\r\n\r\nexport const MY_MEDICAL_ORDER_DETAIL_COUNT_TEXT: TitleMapping = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: 'shared.medicalOrder.summaryDetailText.laboratoryOrder',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_ORDER]: 'shared.medicalOrder.summaryDetailText.medicalOrder',\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: 'shared.medicalOrder.summaryDetailText.medicalPrescription',\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: 'shared.medicalOrder.summaryDetailText.radiologyOrder',\r\n} as const;\r\n\r\nexport const MY_MEDICAL_ORDER_PRINT_SYSTEM_AREA: TitleMapping2 = {\r\n [MEDICAL_REQUEST_TYPE.LABORATORY_ORDER]: SystemAreas.IMPRESION_ORDEN_LABORATORIO,\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_ORDER]: SystemAreas.IMPRESION_ORDEN_LABORATORIO,\r\n [MEDICAL_REQUEST_TYPE.MEDICAL_PRESCRIPTION]: SystemAreas.IMPRESION_PRESCRIPCION_MEDICA,\r\n [MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER]: SystemAreas.IMPRESION_ORDEN_IMAGENOLOGIA,\r\n} as const;\r\n","export enum NotificacionType {\r\n ACTIVAR_CUENTA = 100,\r\n ACTIVAR_CUENTA_PARA_SOLICITUD_CITA = 100,\r\n ACTIVAR_CUENTA_PARA_PAGO_EN_LINEA = 105\r\n}","export enum OnlineAppointmentStatus{\r\n COMPLETADA = 1,\r\n VENCIDA = 2,\r\n USUARIO_POR_REGISTRAR = 3,\r\n POR_COMPLETAR = 4\r\n}","export enum SignupWorkflowVerificationType{\r\n SIMPLE = 0,\r\n ONLINE_APPOINTMENT_CLINIWEB = 1\r\n}","export enum StateType {\r\n SinValidar = 108,\r\n NombreYApellidoValidados = 109,\r\n NombreApellidoSexoFechaNacimientoValidados = 110\r\n}","export enum SystemAreas {\n PERFIL_PUBLICO_DOCTOR = 3981,\n PERFIL_PUBLICO_HOSPITAL = 3982,\n PERFIL_PUBLICO_LABORATORIO = 3983,\n PERFIL_PUBLICO_CENTRO_IMAGENES = 3984,\n PERFIL_PUBLICO_FARMACIA = 3985,\n PERFIL_PUBLICO_ASEGURADORA = 3986,\n PERFIL_PUBLICO_SEDES_SURA = 3987,\n PERFIL_PUBLICO_FISIOTERAPIA = 3988,\n PERFIL_PUBLICO_SALUD_Y_BELLEZA = 3989,\n PERFIL_PUBLICO_SERVICIOS_ODONTOLOGICOS = 3990,\n PERFIL_PUBLICO_OPTICAS = 3991,\n PERFIL_PUBLICO_CLINICAS_ATENCION_PRIMARIA = 3992,\n PERFIL_PUBLICO_OTROS_PROVEEDORES = 3993,\n PERFIL_PUBLICO_LABORATORIOS_CON_DESCUENTOS = 3994,\n PERFIL_PUBLICO_IMAGENOLOGIA_CON_DESCUENTOS = 3995,\n DIRECTORIO_DOCTORES = 3741,\n BUSCAR_PERFILES_PUBLICOS = 4113,\n BUSCADOR_WIDGET_PERFILES_PUBLICOS = 4115, \n MIS_CITAS = 3459,\n MI_SALUD = 4240,\n MIS_ORDENES_MEDICAS = 4246,\n IMPRESION_ORDEN_LABORATORIO = 4294,\n IMPRESION_ORDEN_IMAGENOLOGIA = 4295,\n IMPRESION_PRESCRIPCION_MEDICA = 4296,\n IMPRESION_CURVA_CRECIMIENTO = 4353\n}\n\n","export default class CommonTypesHelper {\r\n \r\n static dateHasValue(dateToValidate?: Date | null) : boolean {\r\n return (!!dateToValidate && dateToValidate > new Date(1900, 1, 1)); \r\n }\r\n\r\n static stringHasValue(stringToValidate?: string) : boolean {\r\n return (!!stringToValidate && stringToValidate != '9');\r\n }\r\n}","import { NgModule } from '@angular/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule} from '@angular/material/input';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatListModule } from '@angular/material/list';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTableModule } from '@angular/material/table' \nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMomentDateModule } from '@angular/material-moment-adapter';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport {PortalModule} from '@angular/cdk/portal';\n\n@NgModule({\n imports: [\n MatFormFieldModule,\n MatInputModule,\n MatSliderModule,\n MatButtonModule, \n MatCheckboxModule,\n MatToolbarModule,\n MatAutocompleteModule,\n MatIconModule,\n MatSidenavModule,\n MatDividerModule,\n MatListModule,\n MatSelectModule,\n MatCardModule,\n MatProgressSpinnerModule,\n MatMenuModule,\n MatTableModule,\n MatPaginatorModule,\n MatChipsModule,\n MatProgressBarModule,\n MatDialogModule,\n MatTabsModule,\n MatExpansionModule,\n MatTooltipModule,\n MatMomentDateModule,\n MatDatepickerModule,\n MatRadioModule,\n MatSlideToggleModule,\n DragDropModule,\n MatSnackBarModule,\n MatButtonToggleModule,\n PortalModule\n ],\n exports: [\n MatFormFieldModule,\n MatInputModule,\n MatSliderModule,\n MatButtonModule, \n MatCheckboxModule,\n MatToolbarModule,\n MatAutocompleteModule,\n MatIconModule,\n MatSidenavModule,\n MatDividerModule,\n MatListModule,\n MatSelectModule,\n MatCardModule,\n MatProgressSpinnerModule,\n MatMenuModule,\n MatTableModule,\n MatPaginatorModule,\n MatChipsModule,\n MatProgressBarModule,\n MatDialogModule,\n MatTabsModule,\n MatExpansionModule,\n MatTooltipModule,\n MatDatepickerModule,\n MatRadioModule,\n MatSlideToggleModule,\n DragDropModule,\n MatSnackBarModule,\n MatButtonToggleModule,\n PortalModule\n ],\n declarations: []\n})\nexport class MaterialModule { }\n","import { PublicProfileType } from \"../people/profile-search-results.model\";\r\n\r\nexport class DoctorSearchResult {\r\n id : number;\r\n claseId : number; \r\n nombre : string; \r\n descripcion : string; \r\n clase : string; \r\n urlImagen : string; \r\n url : string; \r\n inRedirect : boolean; \r\n prioridadBusqueda : number; \r\n idFuenteReferencia : number;\r\n ciudades : string;\r\n idEmpresa : number;\r\n empresasRelacionadas : string;\r\n idPerfilPublico: number;\r\n idPersona: number;\r\n tipoPerfilPublico: PublicProfileType;\r\n sexo: string;\r\n}","export class DialogData {\n id: string;\n showHeader: boolean = true;\n headerIconClass: string;\n showHeaderIcon: boolean = false;\n title: string;\n description: string;\n message: string;\n colorConfirmButton: string;\n showConfirmButton: boolean = true;\n confirmText: string;\n colorCancelButton: string;\n showCancelButton: boolean = true;\n cancelText: string;\n data: any;\n loading: boolean = false;\n animationIn: string;\n animationOut: string;\n showCloseTextButton: boolean;\n loadLicense:boolean;\n}\n\nexport class MapDialogData extends DialogData{\n showWazeButton: boolean;\n}","export class LoginResponse {\n success: boolean;\n message: string;\n}","export class ChatConversacion {\r\n id: number;\r\n fecha: Date;\r\n idPublico: string;\r\n tipo: number;\r\n idEstado: number;\r\n idEmpresa: number;\r\n idContactoClinico: number;\r\n idSolicitud: number;\r\n idEtapaSolicitud: number;\r\n idSujeto: number;\r\n idDestinatario: number;\r\n idPersonasParticipantes: string;\r\n idPersonasInvolucradas: string;\r\n fechaActualizacion: Date;\r\n idResponsableActualizacion: string;\r\n eliminado: string;\r\n fechaEliminacion: Date;\r\n idResponsableEliminacion: number;\r\n mensajes: ChatConversacionMessage[];\r\n}\r\n\r\nexport class ChatConversacionMessage {\r\n id: number;\r\n idChat: number;\r\n fechaCreacion: Date;\r\n tipo: ChatConversacionMessageType;\r\n idEstado: number;\r\n valor: string;\r\n idSolicitud: number;\r\n idEtapaSolicitud: number;\r\n idEmpresa: number;\r\n idEmisor: number;\r\n nombreEmisor: string;\r\n urlImagenEmisor: string;\r\n idReceptor: number;\r\n idPersonasInvolucradas: string;\r\n fechaEnviado: Date;\r\n fechaRecibido: Date;\r\n fechaLeido: Date;\r\n eliminado: string;\r\n fechaEliminacion: Date;\r\n idResponsableEliminacion: number;\r\n idPacienteEmpresaOrigen: number;\r\n IdPacienteEmpresaDestino: number | undefined; \r\n}\r\n\r\nexport enum ChatConversacionMessageType {\r\n PersonMessaje = 1,\r\n StandardSystemaMessage = 2\r\n}\r\n\r\nexport class ChatCancellationMessage { \r\n mensaje : ChatConversacionMessage;\r\n lenguaje: string;\r\n razonCancelacion: string;\r\n idEmpresaTemplate: number;\r\n}","import { Person } from \"./person.model\";\r\n\r\nexport class Dependent extends Person{\r\n idPersona: number;\r\n idEmpresa: number;\r\n numeroTelCelular: string;\r\n titulo: string;\r\n idPaisResidencia: number;\r\n idPaisNacimiento: number;\r\n emailParticular: string;\r\n tipoRelacion: number;\r\n idEstadoValidacionIdentidadPersona: number;\r\n}\r\n\r\nexport enum DependentRelationshipType {\r\n FatherOrMother = 294,\r\n SonOrDaughter = 295,\r\n Family = 36, \r\n HusbandOrWife = 480,\r\n BrotherOrSister = 481,\r\n GrandfatherOrGrandmother = 482,\r\n Warded = 483,\r\n}\r\n\r\nexport class DependentRequest {\r\n nombre: string;\r\n apellido: string;\r\n sexo: string;\r\n tipoRelacion: number;\r\n fechaNacimiento: Date;\r\n idPersona: number;\r\n idRelacionDependiente: number;\r\n ubicacionLogo: string;\r\n}","export class FormControl {\n id: number;\n titulo: string;\n numeroControlesPorFila?: number;\n componentes: FormControlComponent[];\n valor: string;\n className: string;\n\n constructor();\n constructor(obj:FormControl);\n constructor(obj?:any){\n this.id = obj && obj.id || 0;\n this.titulo = obj && obj.titulo || '';\n this.numeroControlesPorFila = obj && obj.numeroControlesPorFila || null;\n this.componentes = obj && obj.componentes \n ? obj.componentes.map((componente:FormControlComponent)=> {\n componente.idControl = this.id;\n return new FormControlComponent(componente);\n }) \n : [];\n this.valor = obj && obj.valor || '';\n }\n\n isVisible(){\n return this.componentes.find(c=> c.isVisible()) != null;\n }\n}\nexport class FormControlComponent{\n tipo: FormComponentType;\n nombre: string;\n valor: any;\n contenedor: string;\n idControl: number;\n visible: boolean;\n\n constructor();\n constructor(obj:FormControlComponent);\n constructor(obj?:any){\n this.tipo = obj && obj.tipo || FormComponentType.CARD;\n this.nombre = obj && obj.nombre || '';\n this.valor = obj && obj.valor || null;\n this.contenedor = obj && obj.contenedor || '';\n this.idControl = obj && obj.idControl || 0;\n this.visible = obj && obj.visible || true;\n }\n\n isVisible(){\n return this.visible;\n }\n}\n\nexport class FormComponentData {\n nombreComponente: string;\n contenedor: string;\n valor: any;\n configurationData: any;\n idControlPadre: number;\n idFormulario: number;\n nombreFormulario: string;\n}\n\nexport enum FormComponentType{\n CARD = 0,\n LINK = 1\n}","import { FormControl } from \"./form-control.model\";\n\nexport class Form {\n id: number;\n nombre: string;\n descripcion: string;\n valor: string;\n configuracion: FormConfiguration;\n controles: FormControl[];\n\n constructor();\n constructor(obj:Form);\n constructor(obj?: any){\n this.id = obj && obj.id || 0;\n this.nombre = obj && obj.nombre || '';\n this.descripcion = obj && obj.descripcion || '';\n this.valor = obj && obj.valor || '';\n this.controles = obj && obj.controles || null;\n }\n}\n\n/*\nThis is used by some components to customize how the form is shown\nFor example: symptoms components will hide form title, subtitile and controlTitle if the user already have a virtual attention in progress\n*/\nexport class FormConfiguration {\n formId: number;\n showFormTitle : boolean = true;\n showFormSubtitle : boolean = true;\n showControlTitle : boolean = true;\n waitForComponents : boolean = false;\n\n constructor();\n constructor(obj:FormConfiguration);\n constructor(obj?: any){\n if(obj){\n this.formId = obj.formId;\n this.showFormTitle = obj.showFormTitle;\n this.showFormSubtitle = obj.showFormSubtitle;\n this.showControlTitle = obj.showControlTitle;\n this.waitForComponents = obj.waitForComponents;\n }\n else{\n this.formId = 0;\n this.showFormTitle = false;\n this.showFormSubtitle = false;\n this.showControlTitle = false;\n this.waitForComponents = false;\n }\n }\n}\n","export class Person{\r\n id: number;\r\n nombre: string;\r\n apellido: string;\r\n sexo: string;\r\n ubicacionLogo: string;\r\n fechaNacimiento: Date;\r\n}","export class ProfileDetailModel {\r\n idPerfilPublico : number;\r\n idTipoPerfilPublicoDetalle : number;\r\n idPersona : number;\r\n idObjetoDetalle : number;\r\n objetoDetalle : string;\r\n yipoObjetoDetalle : number;\r\n localizacion : string;\r\n institucionTituloObtenido : string;\r\n fechaTituloObtenido : Date;\r\n ubicacionFoto : string;\r\n fechaCreacion : Date;\r\n idResponsableCreacion : number;\r\n fechaActualizacion : Date;\r\n idResponsableActualizacion : number;\r\n eliminado : string;\r\n fechaEliminacion : Date;\r\n idResponsableEliminacion : number;\r\n descipcionEliminacion : string;\r\n idEmpresa : number;\r\n idPais : number;\r\n idProvincia : number;\r\n idCiudad : number;\r\n nombrePais : string;\r\n nombreProvincia : string;\r\n nombreCiudad : string;\r\n descripcion1 : string;\r\n descripcion2 : string;\r\n descripcion3 : string;\r\n descripcion4 : string;\r\n identificadorPaisCiudad : string;\r\n idEmpresaLocalidad : number;\r\n idEmpresaObjetoDetalle : number;\r\n empresaObjetoDetalle : string;\r\n nombreEmpresaPerfilPublico : string;\r\n direccionLocalidad1 : string;\r\n direccionLocalidad2 : string;\r\n detalleDestacado : string;\r\n citaEnLineaHabilitada : string;\r\n prioridadOrden : number;\r\n teleconsulta : string;\r\n idDivisionTerritorial : number;\r\n identificadorDivisionTerritorial : string;\r\n nombreCanonicoDivisionTerritorial : string;\r\n}\r\n\r\nexport enum PublicProfileDetailType {\r\n Language = 1,\r\n Title = 2,\r\n Treatments = 5,\r\n Conditions = 6,\r\n Photo = 7,\r\n Locality = 8,\r\n Specialty = 9,\r\n Subspecialty = 10,\r\n SocialNetworks = 11,\r\n FocusAreas = 14, // MCWNG-169\r\n AutobiographicalDescription = 17,\r\n LaborExperience = 22,\r\n BrowserTitle = 23,\r\n BrowserDescription = 24,\r\n KeywordsSEO = 25,\r\n Posts = 27,\r\n Titles = 48,\r\n Curses = 43,\r\n Workouts = 45,\r\n Licenses = 50,\r\n Affiliations = 4,\r\n Positions = 53,\r\n AboutMe = 49,\r\n PhotoGallery = 56,\r\n FacebookPixel = 57\r\n}","export class ProfileFilterSearchResult {\r\n tc: number;\r\n n_tc: string;\r\n conceptos: ProfileFilterSearchResultConcept[];\r\n}\r\n\r\nexport class ProfileFilterSearchResultConcept {\r\n cc: number;\r\n n_cc: string;\r\n num: number;\r\n\r\n constructor(){\r\n this.cc = 0; \r\n }\r\n}\r\n\r\nexport class ProfileFilterSearchResultGroup {\r\n titulo: string;\r\n tooltip: string;\r\n idsConceptosClinicos: number[];\r\n results: ProfileFilterSearchResultConcept[];\r\n}","export class ProfileSearchResultsModel {\r\n \r\n cantidadTotalResulados: number;\r\n perfiles: ProfileResultModel[];\r\n localidades: ProfileLocationResultModel[];\r\n}\r\n\r\nexport class ProfileResultModel {\r\n id: number;\r\n idEmpresa: number;\r\n idPersona: number;\r\n nombre: string;\r\n sexo: string;\r\n pagoEnLineaHab: string;\r\n citaEnLineaHab: string;\r\n foto: string;\r\n rutaNavegacion: string;\r\n especialidad: string;\r\n subespecialidad: string;\r\n email: string;\r\n sitioWeb: string;\r\n telefonoLocalidad: string;\r\n tipoPerfil: PublicProfileType; \r\n redes: string; \r\n delivery: string; \r\n conceptosDestacados: string;\r\n empresasRelacionadas: string;\r\n}\r\n\r\nexport enum PublicProfileType {\r\n Todos = -1,\r\n Doctor = 1,\r\n Clinica = 2,\r\n Laboratorio = 3,\r\n CentroDeImagenes = 4,\r\n Farmacia = 5,\r\n SedeSura = 7,\r\n Fisioterapia = 8,\r\n SaludYBelleza = 9,\r\n ServiciosOdontologicos = 10,\r\n Opticas = 11,\r\n ClinicasDeAtencionPrimaria = 12\r\n}\r\n\r\nexport class ProfileLocationResultModel {\r\n id: number;\r\n idPersona: number;\r\n empresaObjetoPerfilPublico: string;\r\n empresaPerfilPublico: string;\r\n objetoDetalle: string;\r\n objetoDetalle1: string;\r\n objetoDetalle2: string;\r\n objetoDetalle3: string;\r\n objetoDetalle4: string;\r\n objetoDetalle5: string;\r\n diLocalidad1: string;\r\n diLocalidad2: string;\r\n ciudad: string;\r\n pais: string;\r\n canonicoDivisionTerritorial: string;\r\n teleconsulta: string;\r\n citaEnLineaHabilitada: string;\r\n}","import { Location } from \"./location.model\";\n\nexport class PublicProfile {\n id: number;\n tipoPerfil: number;\n idPerfilPublico : number;\n idPersona?: number;\n idEmpresa: number;\n idPais: number;\n denominacionEmpresa: string;\n username: string;\n nombrePersona: string;\n sexo: string;\n citaEnLineaHabilitada: string;\n ubicacionFoto: string;\n especialidad: string;\n subEspecialidad: string;\n atencionBebes: boolean;\n atencionNinos: boolean;\n atencionAdultos: boolean;\n atencionAdultosMayores: boolean;\n atencionAdolescentes: boolean;\n mensajePublico: string;\n emailRemitenteNotificacion: string;\n sitioWeb: string;\n receptorPagoElectronico: string;\n idEmpresaReceptorPagoElectronico: number;\n empresasRelacionadas: string;\n generarTareaConfirmacionCita: string;\n redesSociales: SocialNetworkPublicProfile[];\n localidades: LocationPublicProfile[];\n enfoquePoblacional: PublicProfileDetailLightweight[];\n especialidades: PublicProfileDetailLightweight[];\n subEspecialidades: PublicProfileDetailLightweight[];\n condiciones: PublicProfileDetailLightweight[];\n tratamientos: PublicProfileDetailLightweight[];\n idiomas: PublicProfileDetailLightweight[];\n fotos: string[];\n fotosGaleria: DocumentPublicProfile[];\n publicaciones: PublicProfileDetailLightweight[];\n browserTitle: string;\n browserDescription: string;\n keywords: string[];\n descripcionAutobiografica: string[];\n titles: EducationPublicProfile[];\n curses: EducationPublicProfile[];\n entrenamientos: EducationPublicProfile[];\n licenses: LicensePublicProfile[];\n affiliations: PublicProfileDetailLightweight[];\n positions: PositionPublicProfile[];\n redes: PublicProfileDetailLightweight[];\n sobreMi: string[];\n facebookPixel: FacebookPixelPublicProfile[];\n experienciaLaboral: string[];\n aprobado: string;\n eliminado: string;\n descuentos: PublicProfileDetailLightweight[];\n firmaImg: string;\n}\n\nexport class SocialNetworkPublicProfile{\n tipo: number;\n url: string;\n}\n\nexport class LocationPublicProfile{\n idPerfilPublicoDetalle: number;\n idEmpresa?: number;\n localidad: Location\n}\n\nexport class PublicProfileDetailLightweight {\n id: number;\n idTipoPerfilPublicoDetalle: number;\n idObjetoDetalle?: number;\n objetoDetalle: string;\n detalleDestacado: string;\n}\n\nexport class DocumentPublicProfile{\n id: number;\n idPerfilPublico: number;\n idTipoPerfilPublicoDetalle: number;\n idEmpresa?: number;\n idPersona: number;\n idObjetoDetalle?: number;\n nombreUsuario: string;\n citaEnLineaHabilitada: string;\n nombreObjetoDetalle: string;\n ubicacionFoto: string;\n idResponsableRegistro?: number;\n idResponsableActualizacion?: number;\n prioridadOrden?: number;\n eliminado: string;\n nombreBucketAmazonS3: string;\n}\n\nexport class EducationPublicProfile{\n idDetalle: number;\n idObjetoDetalle?: number;\n nombre: string;\n mesInicio: string;\n anioInicio: string;\n mesFin: string;\n anioFin: string;\n institucion: string;\n}\n\nexport class LicensePublicProfile{\n idDetalle: number;\n idObjetoDetalle?: number;\n codigo: string;\n especialidad: string;\n nombre: string;\n}\n\nexport class PositionPublicProfile{\n idDetalle: number;\n idObjetoDetalle?: number;\n titulo: string;\n mesInicio: string;\n anioInicio: string;\n mesFin: string;\n anioFin: string;\n descripcion: string;\n}\n\nexport class FacebookPixelPublicProfile{\n idDetalle: number;\n idObjetoDetalle?: number;\n pixelId: string;\n pixelEvent: string;\n}","import { Person } from \"./person.model\";\r\n\r\nexport class UserPerson extends Person {\r\n idEmpresa: number;\r\n numeroTelCelular: string;\r\n numeroCedula: string;\r\n titulo: string;\r\n idPaisResidencia: number;\r\n idPaisNacimiento: number;\r\n emailParticular: string;\r\n idEstadoValidacionIdentidadPersona: number;\r\n autenticadoPorGoogle: boolean;\r\n username: string;\r\n}\r\n\r\nexport class UpdateUser {\r\n nombre: string;\r\n apellido: string;\r\n sexo: string;\r\n fechaNacimiento: Date;\r\n ubicacionLogo: string;\r\n idEstadoValidacionIdentidadPersona?: number;\r\n idPais: number;\r\n}","import { PublicProfile } from \"../people/public-profile.model\";\r\n\r\nexport class BaseRequestModel {\r\n // Base\r\n id: number; \r\n\r\n // SolicitudConsultaBase\r\n idResponsableServicioDestino: number;\r\n nombreResponsableServicioDestino: string;\r\n nicknameResponsableServicioDestino: string;\r\n urlAvatarResponsableServicioDestino: string;\r\n especialidadResponsableServicioDestino: string;\r\n perfilPublico: PublicProfile;\r\n tipoNotificacion: number;\r\n tipoSolicitud: number;\r\n idPersonaEmisora: number;\r\n nombrePersonaEmisora: string;\r\n emailPersonaEmisora: string;\r\n idEmpresaCorporativa: number;\r\n idEmpresaOrigen: number;\r\n idEmpresaDestino: number;\r\n idAreaSistemaDestino: number;\r\n localizacion: string;\r\n comentarioEmisor: string;\r\n codigoVerificacion: string;\r\n registrosClinicos: ClinicalRecord[];\r\n relacionEmisorPaciente: SenderPatientRelationship;\r\n pacienteSolicitante: RequestingPatient;\r\n usuarioSolicitante: RequestingUser;\r\n checkoutUrl:string;\r\n \r\n pagoDetalle: PayModel;\r\n\r\n emailResponsableServicio: string;\r\n nombreEmpresaOrigen: string;\r\n legacyRequestGuid: string;\r\n idEmpresaResponsableServicio: number;\r\n\r\n idEtapaSolicitud: number;\r\n}\r\n\r\nexport class ClinicalRecord{\r\n idConceptoClinico: number;\r\n nombreConceptoClinico: string;\r\n idTipoConcepto: number;\r\n nombreTipoConcepto: string;\r\n valorRutaNavegacion: string;\r\n idFuenteReferencia: number;\r\n nombreFuenteReferencia: string;\r\n idTerminoReferencia: number;\r\n valorTerminoReferencia: string;\r\n nombreClase: string; \r\n}\r\n\r\nexport class RequestingPatient{\r\n id: number;\r\n idEmpresa: number;\r\n denominacion: string;\r\n nombre: string;\r\n apellido: string;\r\n sexo: string;\r\n email: string;\r\n numeroTelefonoParticular: string;\r\n numeroCelularParticular: string;\r\n fechaNacimiento?: Date;\r\n idEstadoValidacionIdentidadPersona: number;\r\n idPaisResidencia: number;\r\n}\r\n\r\nexport class RequestingUser{\r\n id: number;\r\n username: string;\r\n password: string;\r\n passwordSalt: string;\r\n passwordHash: string;\r\n nombre: string;\r\n apellido: string;\r\n sexo: string;\r\n fechaNacimiento?: Date;\r\n urlAvatar: string;\r\n idEstadoValidacionIdentidadPersona: number;\r\n idPaisResidencia: number;\r\n}\r\n\r\nexport enum SenderPatientRelationship{\r\n OTRO = 2,\r\n DESCONOCIDO = 9,\r\n USUARIO = 12,\r\n HIJO_DE = 295,\r\n PROGENITOR_DE = 294,\r\n DEPENDIENTE_FAMILIAR_DE = 36, \r\n ESPOSO = 480,\r\n HERMANO = 481,\r\n ABUELO = 482,\r\n TUTOR = 483\r\n}\r\n\r\nexport class PayModel\r\n{\r\n\t// Credit card data\r\n\ttipoTarjeta : string; // 'VISA'\r\n\tnumeroTarjeta : string;\r\n\tanioExpiracionTarjeta : string;\r\n\tmesExpiracionTarjeta : string;\r\n\tcVVTarjeta : string;\r\n\tnombre : string;\r\n\tapellido : string;\r\n\r\n\t// Pasarela data\r\n\tidSistema : string;\r\n\tidEmpresa : string;\r\n\tidPais : string;\r\n\tidTipoPago : string;\r\n\r\n\t// Payment data\r\n\tmonto : string;\r\n\tmontoImpuestos : string;\r\n\tconcepto : string;\r\n\tdescripcion : string;\r\n\r\n\t// User data\r\n\temail : string;\r\n\tnumeroTelefono : string;\r\n\tdireccion : string;\r\n}","import { PublicProfile } from \"../people/public-profile.model\";\nimport { BaseRequestModel } from \"./base-request.model\";\n\nexport class OnlineAppointmentRequest extends BaseRequestModel {\n // SolicitudCitaEnLinea\n idLocalidad: number;\n nombreLocalidad: string;\n direccionLocalidad: string;\n coordenadasLocalidad: string;\n telefonoLocalidad: string;\n teleconsulta: string;\n fechaInicio: Date;\n fechaFin: Date;\n idProcedimiento: number;\n nombreProcedimiento: string;\n numeroCelularContacto: string;\n tipoContacto: number = 0;\n workflowPosition:number = 0;\n flujoDependientes: boolean = false;\n patientDataInitiallyIncomplete: boolean = false;\n\n idEstado: number;\n nombreEstado: string;\n\n profile: PublicProfile;\n}\n\n","import { PublicProfile } from \"../people/public-profile.model\";\r\nimport { BaseRequestModel } from \"./base-request.model\";\r\n\r\nexport class OnlinePaymentRequest extends BaseRequestModel { \r\n workflowPosition:number = 0;\r\n profile: PublicProfile;\r\n}\r\n\r\n","import { Dependent } from \"../people/dependent.model\";\r\nimport { PublicProfile } from \"../people/public-profile.model\";\r\nimport { Relation } from \"../people/relation.model\";\r\nimport { BaseRequestModel } from \"./base-request.model\";\r\n\r\nexport class WorkflowInitialData extends BaseRequestModel {\r\n idPaciente?: number;\r\n idTipoSolicitud?: number;\r\n emailPaciente: string;\r\n nombrePaciente: string;\r\n isValid: boolean;\r\n publicProfile: PublicProfile;\r\n relations: Relation[];\r\n dependents: Dependent[];\r\n workflowPosition:number = 0;\r\n idUsuario: number;\r\n}","import { PublicProfileType } from \"../people/profile-search-results.model\";\n\nexport class Directory {\n url: string;\n idEmpresa?: number;\n tipo: DirectoryType;\n nombre: string;\n nombreClaseEstilo: string;\n nombreEncabezado: string;\n localizacionDefecto: string;\n urlCorporativo: string;\n tituloPHR: string;\n urlFavicon: string;\n clienteOidc: string;\n nombreCuentaPaciente: string;\n filtros: string;\n nombrePoliticasPhr: string;\n idEmpresaDestinoConsultaVirtual?: number;\n}\n\nexport enum DirectoryType {\n Cliniweb = 1,\n PHR = 2\n}\n\nexport class DirectoryFilters {\n providers: DirectoryFiltersNetwork[];\n}\n\nexport class DirectoryFiltersNetwork {\n type: PublicProfileType;\n searchProviderTypes: PublicProfileType[];\n filters: DirectoryFiltersItems[];\n}\n\nexport class DirectoryFiltersItems { \n tipo: DirectoryFiltersItemType;\n idConceptoClinico: number;\n idClaseConceptoClinico: number;\n nombreClaseConceptoClinico: string;\n}\n\nexport enum DirectoryFiltersItemType {\n RedFavorita = 0,\n RedesSura = 1,\n Especialidad = 2,\n AreaEnfoque = 3,\n Diagnostico = 4,\n Procedimiento = 5,\n Teleconsulta = 6,\n SedeSura = 7,\n Abierto24Hrs = 8,\n Delivery = 9,\n TipoCentroImagenes = 10,\n Urgencias = 11,\n Hospitalizacion = 12,\n Cirugia = 13,\n ServiciosSalud = 14,\n LugarAtencion = 15,\n AgendamientoEnLinea = 16,\n Aseguradora = 17\n}\n\n","import { UserManagerSettings } from \"oidc-client\";\r\nimport { AuthenticationServiceProvider } from \"../../enums/authentication-service-provider\";\r\nimport { TerritorialDivision } from \"./territorial-division.model\";\r\n\r\nexport class PortalPhr { \r\n url: string;\r\n idEmpresa?: number; \r\n nombre: string;\r\n nombreClaseEstilo: string;\r\n nombreEncabezado: string;\r\n localizacionDefecto: string;\r\n urlCorporativo: string;\r\n titulo: string;\r\n urlLogo: string;\r\n urlFavicon: string;\r\n clientesOidc: ConfiguracionServicioAutenticacionPHR[];\r\n nombreCuentaPaciente: string;\r\n filtros: string;\r\n nombrePoliticas: string;\r\n idEmpresaDestinoConsultaVirtual?: number;\r\n idEmpresaDestinoDirectorio?: number; \r\n nombreEmpresaDestinoDirectorio: string;\r\n idAreaSistemaDestinoConsultaVirtual: number;\r\n menuVisible: string;\r\n configuracionBusquedaLocalidad: string;\r\n tipoIdentificacionPoliza: number;\r\n idEmpresasSedes: string;\r\n analyticsKey: string;\r\n idsEmpresasLocalidades: string;\r\n versionPerfilPublico: string;\r\n nombreMenu: string;\r\n descargoResponsabilidad: string;\r\n politicasPrivacidad: string;\r\n terminosCondiciones: string;\r\n versionPhr: number;\r\n}\r\n\r\nexport class PortalPhrConfiguracionLocalidad {\r\n niveles: string;\r\n localidadesPorDefecto: TerritorialDivision[];\r\n}\r\n\r\nexport class OidcUserManagerSettings implements UserManagerSettings {\r\n authenticationServiceProvider? : AuthenticationServiceProvider;\r\n readonly popup_redirect_uri?: string;\r\n authority?: string;\r\n}\r\n\r\nexport enum PublicProfileVersion {\r\n V1 = \"1.0\",\r\n V2 = \"2.0\"\r\n}\r\n\r\nexport enum PHRVersion {\r\n V1 = 1.0,\r\n V2 = 2.0\r\n}\r\n\r\nexport class ConfiguracionServicioAutenticacionPHR {\r\n id: number; \r\n proveedorServicioAutenticacion : AuthenticationServiceProvider;\r\n clienteOidc: string; \r\n}\r\n","import { TextLanguage } from \"../people/text-language.model\";\r\n\r\nexport class TerritorialDivision { \r\n id: number;\r\n idEmpresa?: number;\r\n nombre: string;\r\n nombreCanonico: string;\r\n identificador: string;\r\n nivel: number;\r\n paisISO: string;\r\n idPais:number;\r\n nombreI18n: TextLanguage[];\r\n}\r\n\r\nexport class CountryModel{\r\n territorialDivision: TerritorialDivision;\r\n ip: string; \r\n}","export class Token {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n username: string;\n isInvalid:boolean;\n invalidMessage: string;\n state: string; \n userCreated: boolean;\n}\n\nexport class TokenState {\n email: string;\n returnUrl: string;\n flowType: OAuthFlowType = OAuthFlowType.None;\n sourceType: OAuthSourceType = OAuthSourceType.None;\n \n // Only to solve PWA issues on OIDC callbaks\n workflowType: string = \"\";\n publicProfileIdentifier: string = \"\";\n targetDate: number = 0;\n locationId: number = 0;\n}\n\nexport enum OAuthFlowType {\n None = 1,\n Login = 2,\n Signup = 3\n}\n\nexport enum OAuthSourceType {\n None = 1,\n Sura = 2,\n Google = 3\n}\n","import { PublicProfile } from \"../../people/public-profile.model\";\n\nexport class AppointmentCheckout {\n idResponsableServicio: number;\n urlAvatarResponsableServicio: string;\n nombreResponsableServicio: string;\n especialidadResponsableServicio: string;\n\n perfilPublico: PublicProfile; \n\n nickname: string;\n idLocalidad: number;\n nombreLocalidad: string;\n direccionLocalidad: string;\n coordenadasLocalidad: string;\n telefonoLocalidad: string;\n teleconsulta: string;\n fechaInicio: Date;\n fechaFin: Date;\n idVerificacion: string;\n idEmpresa: number;\n}\n","import { PublicProfile } from \"../../people/public-profile.model\";\r\n\r\nexport class AppointmentInfoDataModel{\r\n appointmentType: AppointmentType;\r\n appointmentDate:Date;\r\n cancellationDate?:Date;\r\n doctorAvatarUrl: string;\r\n doctorName: string;\r\n doctorSpecialty: string;\r\n perfilPublico: PublicProfile;\r\n attentionPlaceName: string;\r\n attentionPlaceLatLng: string;\r\n attentionPlaceAddress: string;\r\n medicalConsultationType: string;\r\n medicalConsultationAmount: number;\r\n patientName: string;\r\n patientGender: string;\r\n patientRelationshipType: number;\r\n \r\n idEtapaSolicitud: number;\r\n idEstado: number;\r\n nombreEstado: string;\r\n idResponsableServicio: number;\r\n idEmpresa: number;\r\n }\r\n \r\n export enum AppointmentType {\r\n FACE_TO_FACE = 0,\r\n VIRTUAL = 1\r\n }","import { AppointmentInfoDataModel } from \"./appointment-info-data.model\";\r\n\r\nexport class AppointmentSummaryDataModel{\r\n appointmentInfo: AppointmentInfoDataModel;\r\n specialty: string;\r\n pendingApproval: boolean;\r\n locationLat: number;\r\n locationLng: number;\r\n locationZoom: number = 15;\r\n phoneNumber: string;\r\n}","import { PublicProfile } from \"../../people/public-profile.model\";\r\n\r\nexport class OnlinePaymentModel {\r\n idResponsableServicio: number;\r\n urlAvatarResponsableServicio: string;\r\n nombreResponsableServicio: string;\r\n especialidadResponsableServicio: string;\r\n nickname: string; \r\n idVerificacion: string;\r\n idEmpresa: number;\r\n\r\n emailResponsableServicio: string;\r\n nombreEmpresa: string;\r\n idEmpresaResponsableServicio: number;\r\n\r\n perfilPublico: PublicProfile;\r\n}","import { AppointmentInfoDataModel } from \"./appointment-info-data.model\";\r\n\r\nexport class PatientFormAppointmentDataModel{\r\n relationship: number;\r\n appointmentInfo: AppointmentInfoDataModel;\r\n\r\n firstname: string;\r\n lastname: string;\r\n birthdate: Date;\r\n gender: string;\r\n email: string;\r\n identityPersonValidationStateId: number;\r\n}","import { SignupWorkflowVerificationType } from \"src/app/shared/enums/signup-workflow-verification.enum\";\r\nimport { PublicProfile } from \"../../people/public-profile.model\";\r\n\r\nexport class PatientVerificationDataModel{\r\n configData: PatientVerificationComponentData;\r\n idResponsableServicio: number;\r\n idVerificacion: string;\r\n idPaciente: number;\r\n nombrePaciente: string; \r\n profile: PublicProfile;\r\n}\r\n\r\nexport class PatientVerificationComponentData{ \r\n showCliniwebSection: boolean;\r\n signupWorkflowVerificationType: SignupWorkflowVerificationType;\r\n workflowType: number;\r\n}","import { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\r\n\r\nexport abstract class BaseWorkflowState implements IWorkflowDataState { \r\n abstract getPosition(): number;\r\n abstract setPosition(position: number): void;\r\n}","import { PublicProfile } from \"../../people/public-profile.model\";\r\nimport { UserPerson } from \"../../people/user-person.model\";\r\nimport { RequestingUser } from \"../../process/base-request.model\";\r\nimport { WorkflowInitialData } from \"../../process/workflow-initial-data.model\";\r\nimport { IAuthenticationWorkflowState } from \"../steps/authentication-step.model\";\r\nimport { IPatientVerificationStep } from \"../steps/patient-verification-step.model\";\r\nimport { BaseWorkflowState } from \"./base-workflow-state.model\";\r\nimport { ISelectPatientRelationshipWorkflowState } from \"../steps/select-patient-relationship-step.model\";\r\nimport { ICreatePatientRelationshipWorkflowState } from \"../steps/create-patient-relationship-step.model\";\r\nimport { Dependent } from \"../../people/dependent.model\";\r\nimport { Relation } from \"../../people/relation.model\";\r\n\r\nexport class GrowthCurvesWorkflowState\r\n extends BaseWorkflowState\r\n implements IPatientVerificationStep,\r\n IAuthenticationWorkflowState,\r\n ISelectPatientRelationshipWorkflowState,\r\n ICreatePatientRelationshipWorkflowState {\r\n\r\n requestModel: WorkflowInitialData;\r\n idVerificacion: string;\r\n\r\n constructor();\r\n constructor(obj: GrowthCurvesWorkflowState);\r\n constructor(obj?:any){\r\n super();\r\n \r\n this.requestModel = obj && obj.requestModel || new WorkflowInitialData();\r\n this.idVerificacion = obj && obj.idVerificacion || null;\r\n \r\n if (obj && !this.requestModel)\r\n this.requestModel = obj.request;\r\n }\r\n\r\n getIdVerificacion(): string {\r\n return this.idVerificacion;\r\n }\r\n\r\n getDoctorAvatarUrl(): string {\r\n return this.requestModel.urlAvatarResponsableServicioDestino || this.requestModel.publicProfile?.ubicacionFoto;\r\n }\r\n\r\n getUserId(): number {\r\n return this.requestModel.usuarioSolicitante && this.requestModel.usuarioSolicitante.id\r\n ? this.requestModel.usuarioSolicitante.id\r\n : -1;\r\n }\r\n\r\n getIdTipoSolicitud(): number {\r\n return this.requestModel?.idTipoSolicitud ?? -1;\r\n }\r\n\r\n getPosition(): number {\r\n return this.requestModel.workflowPosition;\r\n }\r\n\r\n getPublicProfile(): PublicProfile {\r\n return this.requestModel.perfilPublico;\r\n }\r\n\r\n setUserData(userPerson: UserPerson): void {\r\n this.requestModel.emailPersonaEmisora = userPerson.emailParticular;\r\n\r\n if(!this.requestModel.usuarioSolicitante){\r\n this.requestModel.usuarioSolicitante = new RequestingUser();\r\n }\r\n\r\n this.requestModel.usuarioSolicitante.id = userPerson.id;\r\n this.requestModel.usuarioSolicitante.username = userPerson.emailParticular; \r\n this.requestModel.usuarioSolicitante.sexo = userPerson.sexo;\r\n this.requestModel.usuarioSolicitante.fechaNacimiento = userPerson.fechaNacimiento;\r\n this.requestModel.usuarioSolicitante.urlAvatar = userPerson.ubicacionLogo;\r\n this.requestModel.usuarioSolicitante.nombre = userPerson.nombre;\r\n this.requestModel.usuarioSolicitante.apellido = userPerson.apellido;\r\n this.requestModel.usuarioSolicitante.idEstadoValidacionIdentidadPersona = userPerson.idEstadoValidacionIdentidadPersona;\r\n this.requestModel.usuarioSolicitante.idPaisResidencia = userPerson.idPaisResidencia;\r\n }\r\n \r\n setEmmiterPersonId(personId: number): void {\r\n this.requestModel.idPersonaEmisora = personId;\r\n }\r\n\r\n setPosition(position: number): void {\r\n this.requestModel.workflowPosition = position;\r\n }\r\n\r\n setPublicProfile(profile: PublicProfile): void {\r\n this.requestModel.perfilPublico = profile;\r\n }\r\n\r\n getPatientName(): string {\r\n return this.requestModel.nombrePaciente;\r\n }\r\n\r\n setPatientName(nombrePaciente: string): void {\r\n this.requestModel.nombrePaciente = nombrePaciente;\r\n }\r\n\r\n getPatientEmail(): string {\r\n return this.requestModel.emailPaciente;\r\n }\r\n\r\n setPatientEmail() {\r\n this.requestModel.emailPaciente;\r\n }\r\n\r\n getPatientValid(): boolean {\r\n return this.requestModel.isValid;\r\n }\r\n\r\n setPatientValid(valid: boolean) {\r\n this.requestModel.isValid = valid;\r\n }\r\n\r\n getDependents(): Dependent[] {\r\n return this.requestModel.dependents;\r\n }\r\n\r\n getPatientRelationship(): number {\r\n return this.requestModel.relacionEmisorPaciente;\r\n }\r\n\r\n getPatientIdRelationship(): number {\r\n return this.requestModel.idPaciente ?? 0;\r\n }\r\n\r\n setDependents(dependents: Dependent[]): void {\r\n this.requestModel.dependents = dependents;\r\n }\r\n\r\n setPatientRelationship(patientRelationshipType: number): void {\r\n this.requestModel.relacionEmisorPaciente = patientRelationshipType;\r\n }\r\n \r\n setPatientIdRelationship(patientId: number): void {\r\n this.requestModel.idPaciente = patientId;\r\n }\r\n\r\n getRelations(): Relation[] {\r\n return this.requestModel.relations;\r\n }\r\n\r\n setRelations(relations: Relation[]): void {\r\n this.requestModel.relations = relations;\r\n }\r\n \r\n getPatientId(): number {\r\n return this.requestModel.idPaciente ?? 0;\r\n }\r\n\r\n getUserPhrId(): number {\r\n return this.requestModel.idUsuario;\r\n }\r\n}\r\n","import { PublicProfile } from \"../../people/public-profile.model\";\nimport { UserPerson } from \"../../people/user-person.model\";\nimport { RequestingUser } from \"../../process/base-request.model\";\nimport { WorkflowInitialData } from \"../../process/workflow-initial-data.model\";\nimport { IAuthenticationWorkflowState } from \"../steps/authentication-step.model\";\nimport { IPatientVerificationStep } from \"../steps/patient-verification-step.model\";\nimport { ISummaryMedicalOrderWorkflowState } from \"../steps/medical-orders/summary-medical-order-step.model\";\nimport { BaseWorkflowState } from \"./base-workflow-state.model\";\nimport { ISelectPatientRelationshipWorkflowState } from \"../steps/select-patient-relationship-step.model\";\nimport { Dependent } from \"../../people/dependent.model\";\nimport { ICreatePatientRelationshipWorkflowState } from \"../steps/create-patient-relationship-step.model\";\nimport { Relation } from \"../../people/relation.model\";\n\nexport class MedicalOrderWorkflowState\n extends BaseWorkflowState\n implements IPatientVerificationStep, \n IAuthenticationWorkflowState, \n ISummaryMedicalOrderWorkflowState,\n ISelectPatientRelationshipWorkflowState,\n ICreatePatientRelationshipWorkflowState {\n\n requestModel: WorkflowInitialData;\n idVerificacion: string;\n\n constructor();\n constructor(obj: MedicalOrderWorkflowState);\n constructor(obj?:any){\n super();\n \n this.requestModel = obj && obj.requestModel || new WorkflowInitialData();\n this.idVerificacion = obj && obj.idVerificacion || null;\n \n if (obj && !this.requestModel)\n this.requestModel = obj.request;\n }\n\n getIdVerificacion(): string {\n return this.idVerificacion;\n }\n\n getDoctorAvatarUrl(): string {\n return this.requestModel.publicProfile?.ubicacionFoto;\n }\n\n getUserId(): number {\n return this.requestModel.usuarioSolicitante && this.requestModel.usuarioSolicitante.id\n ? this.requestModel.usuarioSolicitante.id\n : -1;\n }\n\n getIdTipoSolicitud(): number {\n return this.requestModel?.idTipoSolicitud ?? -1;\n }\n\n getPosition(): number {\n return this.requestModel.workflowPosition;\n }\n\n getPublicProfile(): PublicProfile {\n return this.requestModel.perfilPublico;\n }\n\n setUserData(userPerson: UserPerson): void {\n this.requestModel.emailPersonaEmisora = userPerson.emailParticular;\n\n if(!this.requestModel.usuarioSolicitante){\n this.requestModel.usuarioSolicitante = new RequestingUser();\n }\n\n this.requestModel.usuarioSolicitante.id = userPerson.id;\n this.requestModel.usuarioSolicitante.username = userPerson.emailParticular; \n this.requestModel.usuarioSolicitante.sexo = userPerson.sexo;\n this.requestModel.usuarioSolicitante.fechaNacimiento = userPerson.fechaNacimiento;\n this.requestModel.usuarioSolicitante.urlAvatar = userPerson.ubicacionLogo;\n this.requestModel.usuarioSolicitante.nombre = userPerson.nombre;\n this.requestModel.usuarioSolicitante.apellido = userPerson.apellido;\n this.requestModel.usuarioSolicitante.idEstadoValidacionIdentidadPersona = userPerson.idEstadoValidacionIdentidadPersona;\n this.requestModel.usuarioSolicitante.idPaisResidencia = userPerson.idPaisResidencia;\n\n /*if(userPerson.numeroTelCelular) {\n this.requestModel.numeroCelularContacto = userPerson.numeroTelCelular;\n }*/\n }\n\n setEmmiterPersonId(personId: number): void {\n this.requestModel.idPersonaEmisora = personId;\n }\n\n setPosition(position: number): void {\n this.requestModel.workflowPosition = position;\n }\n\n setPublicProfile(profile: PublicProfile): void {\n this.requestModel.perfilPublico = profile;\n }\n\n getPatientName(): string {\n return this.requestModel.nombrePaciente;\n }\n\n setPatientName(nombrePaciente: string): void {\n this.requestModel.nombrePaciente = nombrePaciente;\n }\n\n getPatientEmail(): string {\n return this.requestModel.emailPaciente;\n }\n\n setPatientEmail() {\n this.requestModel.emailPaciente;\n }\n\n getPatientValid(): boolean {\n return this.requestModel.isValid;\n }\n\n setPatientValid(valid: boolean) {\n this.requestModel.isValid = valid;\n }\n\n getDependents(): Dependent[] {\n return this.requestModel.dependents;\n }\n\n setDependents(dependents: Dependent[]): void {\n this.requestModel.dependents = dependents;\n }\n\n getPatientRelationship(): number {\n return this.requestModel.relacionEmisorPaciente;\n }\n\n getPatientIdRelationship(): number {\n return this.requestModel.idPaciente ?? 0;\n }\n\n setPatientRelationship(patientRelationshipType: number): void {\n this.requestModel.relacionEmisorPaciente = patientRelationshipType;\n }\n \n setPatientIdRelationship(patientId: number): void {\n this.requestModel.idPaciente = patientId;\n }\n\n getRelations(): Relation[] {\n return this.requestModel.relations;\n }\n\n setRelations(relations: Relation[]): void {\n this.requestModel.relations = relations;\n }\n \n getPatientId(): number {\n return this.requestModel.idPaciente ?? 0;\n }\n\n getUserPhrId(): number {\n return this.requestModel.idUsuario;\n }\n}\n","import { IWorkflowDataState } from \"../../../interfaces/workflow-data-state\";\nimport { OnlineAppointmentRequest } from \"../../process/online-appointment-request.model\";\nimport { AppointmentSummaryDataModel } from \"../models/appointment-summary-data.model\";\nimport { IAuthenticationWorkflowState } from \"../steps/authentication-step.model\";\nimport { IPatientContactFormAppointmentCheckoutWorkflowState } from \"../steps/patient-contact-form-appointment-checkout-step.model\";\nimport { IPatientFormAppointmentCheckoutWorkflowState } from \"../steps/patient-form-appointment-checkout-step.model\";\nimport { ISelectPatientAppointmentCheckoutWorkflowState } from \"../steps/select-patient-appointment-checkout-step.model\";\nimport { ISelectPatientRelationshipAppointmentCheckoutWorkflowState } from \"../steps/select-patient-relationship-appointment-checkout-step.model\";\nimport { ISummaryAppointmentCheckoutWorkflowState } from \"../steps/summary-appointment-checkout-step.model\";\nimport { RequestingPatient, RequestingUser, SenderPatientRelationship } from \"../../process/base-request.model\";\nimport { BaseWorkflowState } from \"./base-workflow-state.model\";\nimport * as moment from \"moment\";\nimport { AppointmentInfoDataModel, AppointmentType } from \"../models/appointment-info-data.model\";\nimport { PatientFormAppointmentDataModel } from \"../models/patient-form-appointment-data.model\";\nimport { UserPerson } from \"../../people/user-person.model\";\nimport { PersonDataModel } from \"../models/select-patient-data.model\";\nimport { PublicProfile } from \"../../people/public-profile.model\";\nimport { StateType } from \"src/app/shared/enums/state-type.enum\";\nimport CommonTypesHelper from \"src/app/shared/helpers/common-types-helper\";\nimport { ISelectCountryWorkflowState } from \"../steps/select-country-step.model\";\nimport { TerritorialDivision } from \"../../systems/territorial-division.model\";\n\nexport class OnlineAppointmentCliniwebState \n extends BaseWorkflowState \n implements \n IWorkflowDataState, \n IAuthenticationWorkflowState,\n ISelectCountryWorkflowState,\n ISelectPatientAppointmentCheckoutWorkflowState,\n IPatientFormAppointmentCheckoutWorkflowState,\n ISelectPatientRelationshipAppointmentCheckoutWorkflowState,\n IPatientContactFormAppointmentCheckoutWorkflowState,\n ISummaryAppointmentCheckoutWorkflowState{\n\n onlineAppointmentRequest: OnlineAppointmentRequest;\n idVerificacion: string;\n\n request: any;\n\n constructor();\n constructor(obj: OnlineAppointmentCliniwebState);\n constructor(obj?:any){\n super();\n \n this.onlineAppointmentRequest = obj && obj.onlineAppointmentRequest || new OnlineAppointmentRequest();\n this.idVerificacion = obj && obj.idVerificacion || null;\n \n if (obj)\n this.request = obj.request;\n }\n\n public getPosition(): number {\n return this.onlineAppointmentRequest.workflowPosition;\n }\n\n public setPosition(position: number): void {\n this.onlineAppointmentRequest.workflowPosition = position;\n }\n\n public getIdVerificacion(): string {\n return this.idVerificacion;\n }\n\n getIdTipoSolicitud(): number {\n return -1;\n }\n\n public getDoctorAvatarUrl(): string {\n return this.onlineAppointmentRequest.urlAvatarResponsableServicioDestino;\n }\n\n setPublicProfile(profile: PublicProfile):void {\n this.onlineAppointmentRequest.perfilPublico = profile;\n }\n\n getPublicProfile():PublicProfile {\n return this.onlineAppointmentRequest.perfilPublico;\n }\n\n public setUserData(userPerson: UserPerson): void {\n this.onlineAppointmentRequest.emailPersonaEmisora = userPerson.emailParticular;\n\n if(!this.onlineAppointmentRequest.usuarioSolicitante){\n this.onlineAppointmentRequest.usuarioSolicitante = new RequestingUser();\n }\n\n this.onlineAppointmentRequest.usuarioSolicitante.id = userPerson.id;\n this.onlineAppointmentRequest.usuarioSolicitante.username = userPerson.emailParticular; \n this.onlineAppointmentRequest.usuarioSolicitante.sexo = userPerson.sexo;\n this.onlineAppointmentRequest.usuarioSolicitante.fechaNacimiento = userPerson.fechaNacimiento;\n this.onlineAppointmentRequest.usuarioSolicitante.urlAvatar = userPerson.ubicacionLogo;\n this.onlineAppointmentRequest.usuarioSolicitante.nombre = userPerson.nombre;\n this.onlineAppointmentRequest.usuarioSolicitante.apellido = userPerson.apellido;\n this.onlineAppointmentRequest.usuarioSolicitante.idEstadoValidacionIdentidadPersona = userPerson.idEstadoValidacionIdentidadPersona;\n this.onlineAppointmentRequest.usuarioSolicitante.idPaisResidencia = userPerson.idPaisResidencia;\n\n if(userPerson.numeroTelCelular) {\n this.onlineAppointmentRequest.numeroCelularContacto = userPerson.numeroTelCelular;\n }\n }\n\n public getUserId(): number {\n return this.onlineAppointmentRequest.usuarioSolicitante && this.onlineAppointmentRequest.usuarioSolicitante.id\n ? this.onlineAppointmentRequest.usuarioSolicitante.id\n : 0;\n }\n\n public setEmmiterPersonId(personId: number): void {\n this.onlineAppointmentRequest.idPersonaEmisora = personId;\n }\n\n public getAppointmentInfo(): AppointmentInfoDataModel {\n let appointmentInfo = new AppointmentInfoDataModel();\n \n appointmentInfo.appointmentType = this.onlineAppointmentRequest.teleconsulta == 'S' \n ? AppointmentType.VIRTUAL \n : AppointmentType.FACE_TO_FACE;\n appointmentInfo.appointmentDate = moment.utc(this.onlineAppointmentRequest.fechaInicio).toDate(); \n appointmentInfo.doctorName = this.onlineAppointmentRequest.nombreResponsableServicioDestino;\n appointmentInfo.doctorSpecialty = this.onlineAppointmentRequest.especialidadResponsableServicioDestino;\n appointmentInfo.doctorAvatarUrl = this.onlineAppointmentRequest.urlAvatarResponsableServicioDestino;\n appointmentInfo.perfilPublico = this.onlineAppointmentRequest.perfilPublico;\n appointmentInfo.attentionPlaceName = this.onlineAppointmentRequest.nombreLocalidad;\n appointmentInfo.attentionPlaceAddress = this.onlineAppointmentRequest.direccionLocalidad;\n appointmentInfo.attentionPlaceLatLng = this.onlineAppointmentRequest.coordenadasLocalidad;\n appointmentInfo.medicalConsultationType = this.onlineAppointmentRequest.nombreProcedimiento;\n appointmentInfo.idEstado = this.onlineAppointmentRequest.idEstado;\n appointmentInfo.nombreEstado = this.onlineAppointmentRequest.nombreEstado;\n\n if(this.onlineAppointmentRequest.pacienteSolicitante)\n appointmentInfo.patientName = this.onlineAppointmentRequest.pacienteSolicitante.nombre;\n\n if(this.onlineAppointmentRequest.pacienteSolicitante && this.onlineAppointmentRequest.pacienteSolicitante.sexo)\n appointmentInfo.patientGender = this.onlineAppointmentRequest.pacienteSolicitante.sexo;\n\n if(this.onlineAppointmentRequest.relacionEmisorPaciente)\n appointmentInfo.patientRelationshipType = this.onlineAppointmentRequest.relacionEmisorPaciente;\n \n if (this.request && this.request.etapasSolicitud && this.request.etapasSolicitud.length > 0) {\n appointmentInfo.idEtapaSolicitud = this.request.etapasSolicitud[0].id;\n appointmentInfo.idResponsableServicio = this.request.etapasSolicitud[0].idResponsableServicio;\n appointmentInfo.idEmpresa = this.request.etapasSolicitud[0].idEmpresa;\n appointmentInfo.idEstado = this.request.etapasSolicitud[0].idEstado;\n appointmentInfo.nombreEstado = this.request.etapasSolicitud[0].nombreEstado;\n }\n\n return appointmentInfo;\n }\n\n public getRelationship(): number {\n return this.onlineAppointmentRequest.relacionEmisorPaciente > 0\n ? this.onlineAppointmentRequest.relacionEmisorPaciente == SenderPatientRelationship.USUARIO \n ? 1 \n : 2\n : 0;\n }\n\n public setRelationship(relationshipType: number): void {\n this.onlineAppointmentRequest.relacionEmisorPaciente = relationshipType == 1 \n ? SenderPatientRelationship.USUARIO\n : SenderPatientRelationship.DESCONOCIDO;\n }\n\n public setPatientId(patientId: number): void {\n if(!this.onlineAppointmentRequest.pacienteSolicitante){\n this.onlineAppointmentRequest.pacienteSolicitante = new RequestingPatient();\n }\n\n this.onlineAppointmentRequest.pacienteSolicitante.id = patientId;\n }\n\n public setDependentsFlow(): void {\n this.onlineAppointmentRequest.flujoDependientes = true;\n }\n\n public getUsername(): string {\n return this.onlineAppointmentRequest.usuarioSolicitante.nombre;\n }\n\n public getRequestingUser(): RequestingUser {\n return this.onlineAppointmentRequest.usuarioSolicitante;\n }\n\n public getRequestingPatient(): RequestingPatient {\n return this.onlineAppointmentRequest.pacienteSolicitante;\n }\n\n public isDependentsFlow(): boolean {\n return this.onlineAppointmentRequest.flujoDependientes;\n }\n\n public setPatientDataInitiallyIncomplete(incomplete: boolean):void {\n this.onlineAppointmentRequest.patientDataInitiallyIncomplete = incomplete;\n }\n public getPatientDataInitiallyIncomplete(): boolean {\n return this.onlineAppointmentRequest.patientDataInitiallyIncomplete;\n }\n\n public setPatient(patient: PersonDataModel): void {\n if(!this.onlineAppointmentRequest.pacienteSolicitante)\n this.onlineAppointmentRequest.pacienteSolicitante = new RequestingPatient();\n\n this.onlineAppointmentRequest.pacienteSolicitante.id = patient.id;\n this.onlineAppointmentRequest.pacienteSolicitante.nombre = patient.firstname;\n this.onlineAppointmentRequest.pacienteSolicitante.apellido = patient.lastname;\n this.onlineAppointmentRequest.pacienteSolicitante.email = patient.email;\n this.onlineAppointmentRequest.pacienteSolicitante.fechaNacimiento = patient.birthDate;\n this.onlineAppointmentRequest.pacienteSolicitante.sexo = patient.gender;\n this.onlineAppointmentRequest.pacienteSolicitante.numeroCelularParticular = patient.cellPhone;\n this.onlineAppointmentRequest.pacienteSolicitante.idEstadoValidacionIdentidadPersona = patient.identityPersonValidationStateId;\n\n this.onlineAppointmentRequest.pacienteSolicitante.idPaisResidencia = this.onlineAppointmentRequest.usuarioSolicitante.idPaisResidencia;\n }\n\n public getPatientFormData(): PatientFormAppointmentDataModel {\n \n let patientForm = new PatientFormAppointmentDataModel();\n\n patientForm.appointmentInfo = this.getAppointmentInfo();\n patientForm.relationship = this.getRelationship();\n\n if(this.onlineAppointmentRequest.pacienteSolicitante){\n var isUserPatient = this.onlineAppointmentRequest.relacionEmisorPaciente == SenderPatientRelationship.USUARIO;\n\n patientForm.firstname = isUserPatient && !this.onlineAppointmentRequest.pacienteSolicitante.nombre\n ? this.onlineAppointmentRequest.usuarioSolicitante.nombre\n : this.onlineAppointmentRequest.pacienteSolicitante.nombre;\n\n patientForm.lastname = isUserPatient && !this.onlineAppointmentRequest.pacienteSolicitante.apellido\n ? this.onlineAppointmentRequest.usuarioSolicitante.apellido\n : this.onlineAppointmentRequest.pacienteSolicitante.apellido;\n\n patientForm.gender = isUserPatient && !this.onlineAppointmentRequest.pacienteSolicitante.sexo\n ? this.onlineAppointmentRequest.usuarioSolicitante.sexo\n : this.onlineAppointmentRequest.pacienteSolicitante.sexo;\n\n if (isUserPatient) {\n if (CommonTypesHelper.dateHasValue(this.onlineAppointmentRequest.pacienteSolicitante.fechaNacimiento)) {\n patientForm.birthdate = (this.onlineAppointmentRequest.pacienteSolicitante.fechaNacimiento as Date);\n } else if (CommonTypesHelper.dateHasValue(this.onlineAppointmentRequest.usuarioSolicitante.fechaNacimiento)){\n patientForm.birthdate = (this.onlineAppointmentRequest.usuarioSolicitante.fechaNacimiento as Date);\n }\n } else if (CommonTypesHelper.dateHasValue(this.onlineAppointmentRequest.pacienteSolicitante.fechaNacimiento)) {\n patientForm.birthdate = (this.onlineAppointmentRequest.pacienteSolicitante.fechaNacimiento as Date);\n }\n\n patientForm.email = this.onlineAppointmentRequest.pacienteSolicitante.email;\n\n if (isUserPatient) {\n patientForm.identityPersonValidationStateId = this.onlineAppointmentRequest.pacienteSolicitante.idEstadoValidacionIdentidadPersona\n ? this.onlineAppointmentRequest.pacienteSolicitante.idEstadoValidacionIdentidadPersona\n : this.onlineAppointmentRequest.usuarioSolicitante.idEstadoValidacionIdentidadPersona;\n } else {\n // el paciente (dependiente) se crea a partir de la pantalla de dependientes donde todos los campos son requeridos\n patientForm.identityPersonValidationStateId = StateType.NombreApellidoSexoFechaNacimientoValidados;\n }\n }\n \n return patientForm;\n }\n\n public setPatientFormData(data: PatientFormAppointmentDataModel): void { \n if(!this.onlineAppointmentRequest.pacienteSolicitante){\n this.onlineAppointmentRequest.pacienteSolicitante = new RequestingPatient();\n }\n\n this.onlineAppointmentRequest.pacienteSolicitante.nombre = data.firstname;\n this.onlineAppointmentRequest.pacienteSolicitante.apellido = data.lastname;\n this.onlineAppointmentRequest.pacienteSolicitante.denominacion = `${data.firstname} ${data.lastname}`;\n this.onlineAppointmentRequest.pacienteSolicitante.fechaNacimiento = data.birthdate;\n this.onlineAppointmentRequest.pacienteSolicitante.sexo = data.gender;\n this.onlineAppointmentRequest.pacienteSolicitante.idEstadoValidacionIdentidadPersona = data.identityPersonValidationStateId;\n\n this.onlineAppointmentRequest.pacienteSolicitante.idPaisResidencia = this.onlineAppointmentRequest.usuarioSolicitante.idPaisResidencia;\n }\n\n public getPatientRelationship(): number {\n return this.onlineAppointmentRequest.relacionEmisorPaciente;\n }\n\n public setPatientRelationship(patientRelationshipType: number): void {\n this.onlineAppointmentRequest.relacionEmisorPaciente = patientRelationshipType;\n }\n\n public getPatientName():string{\n return this.onlineAppointmentRequest.pacienteSolicitante.nombre;\n }\n \n public getUserPhone(): string {\n return this.onlineAppointmentRequest.numeroCelularContacto;\n }\n\n public setUserPhone(userPhone: string): void {\n this.onlineAppointmentRequest.numeroCelularContacto = userPhone;\n }\n\n public getPatientPhone(): string {\n return this.onlineAppointmentRequest.pacienteSolicitante.numeroCelularParticular;\n }\n\n public setPatientPhone(patientPhone: string): void {\n this.onlineAppointmentRequest.numeroCelularContacto = patientPhone;\n this.onlineAppointmentRequest.pacienteSolicitante.numeroCelularParticular = patientPhone;\n }\n\n public getPatientEmail(): string {\n return this.onlineAppointmentRequest.pacienteSolicitante.email;\n }\n\n public setPatientEmail(patientEmail: string): void {\n this.onlineAppointmentRequest.pacienteSolicitante.email = patientEmail;\n }\n\n public getContactType(): number {\n return this.onlineAppointmentRequest.tipoContacto;\n }\n\n public setContactType(contactType: number): void {\n this.onlineAppointmentRequest.tipoContacto = contactType;\n }\n\n public getAppointmentSummary(): AppointmentSummaryDataModel {\n \n let summary = new AppointmentSummaryDataModel();\n\n summary.appointmentInfo = this.getAppointmentInfo();\n\n summary.specialty = this.onlineAppointmentRequest.especialidadResponsableServicioDestino;\n\n if(this.onlineAppointmentRequest.coordenadasLocalidad){\n summary.locationLat = +this.onlineAppointmentRequest.coordenadasLocalidad.split(';')[0];\n summary.locationLng = +this.onlineAppointmentRequest.coordenadasLocalidad.split(';')[1];\n }\n\n if(this.onlineAppointmentRequest.telefonoLocalidad){\n summary.phoneNumber = this.onlineAppointmentRequest.telefonoLocalidad;\n }\n \n return summary;\n }\n\n public getCountryId(): number {\n return this.onlineAppointmentRequest.usuarioSolicitante.idPaisResidencia;\n }\n\n public setCountry(country: TerritorialDivision): void {\n this.onlineAppointmentRequest.usuarioSolicitante.idPaisResidencia = country.idPais;\n }\n}\n","import { IWorkflowDataState } from \"../../../interfaces/workflow-data-state\";\r\nimport { IAuthenticationWorkflowState } from \"../steps/authentication-step.model\";\r\nimport { OnlinePaymentRequest } from \"../../process/online-payment-request.model\";\r\nimport { PayModel, RequestingUser } from \"../../process/base-request.model\";\r\nimport { BaseWorkflowState } from \"./base-workflow-state.model\";\r\nimport { IPaymentAmountWorkflowState } from \"../steps/payment/payment-amount-step.model\";\r\nimport { IPaymentWorkflowState } from \"../steps/payment/payment-form-step.model\";\r\nimport { UserPerson } from \"../../people/user-person.model\";\r\nimport { PublicProfile } from \"../../people/public-profile.model\";\r\nimport { ISelectCountryWorkflowState } from \"../steps/select-country-step.model\";\r\nimport { TerritorialDivision } from \"../../systems/territorial-division.model\";\r\n\r\nexport class OnlinePaymentWorkflowState \r\n extends BaseWorkflowState \r\n implements \r\n IWorkflowDataState,\r\n IAuthenticationWorkflowState,\r\n IPaymentAmountWorkflowState, \r\n IPaymentWorkflowState,\r\n ISelectCountryWorkflowState {\r\n\r\n requestModel: OnlinePaymentRequest;\r\n idVerificacion: string;\r\n request: any;\r\n\r\n constructor(); \r\n \r\n constructor(obj: OnlinePaymentWorkflowState);\r\n constructor(obj?:any){\r\n super();\r\n\r\n this.requestModel = obj && obj.requestModel || new OnlinePaymentRequest();\r\n this.idVerificacion = obj && obj.idVerificacion || null; \r\n } \r\n \r\n /* IWorkflowDataState Members */\r\n public getPosition(): number {\r\n return this.requestModel.workflowPosition;\r\n }\r\n\r\n public setPosition(position: number): void {\r\n this.requestModel.workflowPosition = position;\r\n }\r\n \r\n /* IAuthenticationWorkflowState Members */ \r\n\r\n public getIdVerificacion(): string {\r\n return this.idVerificacion;\r\n }\r\n\r\n getIdTipoSolicitud(): number {\r\n return -1;\r\n }\r\n\r\n public getDoctorAvatarUrl(): string {\r\n return this.requestModel.urlAvatarResponsableServicioDestino;\r\n }\r\n\r\n public setUserData(userPerson: UserPerson): void { \r\n this.requestModel.emailPersonaEmisora = userPerson.emailParticular;\r\n\r\n if(!this.requestModel.usuarioSolicitante){\r\n this.requestModel.usuarioSolicitante = new RequestingUser();\r\n }\r\n\r\n this.requestModel.usuarioSolicitante.id = userPerson.id;\r\n this.requestModel.usuarioSolicitante.username = userPerson.emailParticular;\r\n this.requestModel.usuarioSolicitante.nombre = userPerson.nombre;\r\n this.requestModel.usuarioSolicitante.apellido = userPerson.apellido;\r\n this.requestModel.usuarioSolicitante.sexo = userPerson.sexo;\r\n this.requestModel.usuarioSolicitante.fechaNacimiento = userPerson.fechaNacimiento;\r\n this.requestModel.usuarioSolicitante.urlAvatar = userPerson.ubicacionLogo;\r\n this.requestModel.usuarioSolicitante.idEstadoValidacionIdentidadPersona = userPerson.idEstadoValidacionIdentidadPersona;\r\n this.requestModel.usuarioSolicitante.idPaisResidencia = userPerson.idPaisResidencia;\r\n }\r\n\r\n public getUserId(): number {\r\n return this.requestModel.usuarioSolicitante && this.requestModel.usuarioSolicitante.id\r\n ? this.requestModel.usuarioSolicitante.id \r\n : 0;\r\n }\r\n\r\n public setEmmiterPersonId(personId: number): void {\r\n this.requestModel.idPersonaEmisora = personId;\r\n } \r\n\r\n /* IPaymentAmountWorkflowState Members */ \r\n getTargetUrlAvatar(): string {\r\n return this.requestModel.urlAvatarResponsableServicioDestino;\r\n }\r\n getTargetUsername(): string {\r\n return this.requestModel.nombreResponsableServicioDestino\r\n }\r\n getTargetSpecialty(): string {\r\n return this.requestModel.especialidadResponsableServicioDestino\r\n }\r\n getUserName(): string {\r\n return this.requestModel.usuarioSolicitante?.username;\r\n }\r\n getAmount(): string {\r\n if (this.requestModel.pagoDetalle && this.requestModel.pagoDetalle.monto)\r\n return this.requestModel.pagoDetalle.monto;\r\n else \r\n return \"0.00\";\r\n }\r\n setAmount(amount: string): void {\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n\r\n this.requestModel.pagoDetalle.monto = amount;\r\n }\r\n\r\n setPublicProfile(profile: PublicProfile):void {\r\n this.requestModel.perfilPublico = profile;\r\n }\r\n\r\n getPublicProfile():PublicProfile {\r\n return this.requestModel.perfilPublico;\r\n }\r\n\r\n /* IPaymentWorkflowState Members */\r\n setCreditCardType(creditCardType: string) {\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n\r\n this.requestModel.pagoDetalle.tipoTarjeta = creditCardType;\r\n }\r\n\r\n getCreditCardNumber(): string {\r\n return this.requestModel.pagoDetalle?.numeroTarjeta;\r\n }\r\n setCreditCardNumber(cardNumber: string): void {\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n \r\n this.requestModel.pagoDetalle.numeroTarjeta = cardNumber;\r\n }\r\n getCreditCardExpirationMonth(): string {\r\n return this.requestModel.pagoDetalle?.mesExpiracionTarjeta;\r\n }\r\n setCreditCardExpirationMonth(expMonth: string): void {\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n \r\n this.requestModel.pagoDetalle.mesExpiracionTarjeta = expMonth;\r\n }\r\n getCreditCardExpirationYear(): string {\r\n return this.requestModel.pagoDetalle?.anioExpiracionTarjeta;\r\n }\r\n setCreditCardExpirationYear(expYear: string): void {\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n \r\n this.requestModel.pagoDetalle.anioExpiracionTarjeta = expYear;\r\n }\r\n getCreditCardCvc(): string {\r\n return this.requestModel.pagoDetalle?.cVVTarjeta;\r\n }\r\n setCreditCardCvc(cvc: string): void {\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n \r\n this.requestModel.pagoDetalle.cVVTarjeta = cvc;\r\n }\r\n getCreditCardFullName(): string {\r\n let result = \"\";\r\n\r\n if (this.requestModel.pagoDetalle) {\r\n if (this.requestModel.pagoDetalle.nombre)\r\n result = this.requestModel.pagoDetalle.nombre + \" \";\r\n\r\n if (this.requestModel.pagoDetalle.apellido)\r\n result += this.requestModel.pagoDetalle?.apellido;\r\n }\r\n \r\n return result.trim();\r\n }\r\n setCreditCardFullName(fullName: string): void {\r\n let [firstName, ...rest] = fullName.split(' ');\r\n let lastName = rest.join('_');\r\n\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n\r\n this.requestModel.pagoDetalle.nombre = firstName;\r\n this.requestModel.pagoDetalle.apellido = lastName;\r\n }\r\n getPhoneNumber(): string {\r\n return this.requestModel.pagoDetalle?.numeroTelefono;\r\n }\r\n setPhoneNumber(fullName: string): void {\r\n if (!this.requestModel.pagoDetalle)\r\n this.requestModel.pagoDetalle = new PayModel();\r\n \r\n this.requestModel.pagoDetalle.numeroTelefono = fullName;\r\n }\r\n\r\n public getCountryId(): number {\r\n return this.requestModel.usuarioSolicitante.idPaisResidencia;\r\n }\r\n\r\n public setCountry(country: TerritorialDivision): void {\r\n this.requestModel.usuarioSolicitante.idPaisResidencia = country.idPais;\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\nimport * as moment from 'moment';\n\n@Pipe({\n name: 'ageFromBirthday'\n})\nexport class AgeFromBirthdayPipe implements PipeTransform {\n\n transform(value?: string | Date): string {\n if (!value) return `0 aƱos, 0 meses y 0 dĆ­as`;\n const ahora = moment().set({ hour: 0, minute: 0, second: 0, millisecond: 0});\n const nacimiento = moment(value).set({ hour: 0, minute: 0, second: 0, millisecond: 0});\n const edad = moment.duration(ahora.diff(nacimiento));\n return `${edad.years()} aƱos, ${edad.months()} meses y ${edad.days() + 1} dĆ­as`;\n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { formatCurrency, getCurrencySymbol } from '@angular/common';\r\n@Pipe({\r\n name: 'customCurrency',\r\n })\r\n export class CustomCurrencyPipe implements PipeTransform {\r\n transform(\r\n value: string,\r\n currencyCode: string = 'USD',\r\n display:\r\n | 'code'\r\n | 'symbol'\r\n | 'symbol-narrow'\r\n | string\r\n | boolean = 'symbol',\r\n digitsInfo: string = '2.2-2',\r\n locale: string = 'en-US',\r\n ): string | null {\r\n if (typeof(value) != undefined)\r\n value = value.toString();\r\n else \r\n value = \"\";\r\n\r\n // Remove any character\r\n value = value.replace(new RegExp(\"[^0-9|\\.]+\", \"g\"), \"\");\r\n\r\n // Remove any comma before calling the method\r\n value = value.replace(/,/g, \"\");\r\n\r\n let number = parseFloat(value);\r\n let displayStr = display? getCurrencySymbol(currencyCode, 'wide') : \"\";\r\n\r\n let result = formatCurrency(\r\n number,\r\n locale,\r\n displayStr,\r\n currencyCode,\r\n digitsInfo,\r\n ); \r\n\r\n return result;\r\n }\r\n}","import { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: \"highlight\"\r\n})\r\nexport class HighlightPipe implements PipeTransform { \r\n\r\n transform(value: any, search: string, tagName?: string): any {\r\n if (!search) {\r\n return value;\r\n }\r\n\r\n if(!tagName)\r\n tagName = \"mark\";\r\n\r\n var filteredSearch = search.match(/[!^A-zƀ-Ćŗ0-9]/gi)?.join('');\r\n\r\n filteredSearch = filteredSearch == undefined ? '' : filteredSearch;\r\n\r\n var re = new RegExp(filteredSearch, 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\r\n \r\n return value.replace(re, `<${tagName} class=\"highlight\">$&`);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\nimport { LayoutService } from 'src/app/core/services/layout.service';\n\n@Pipe({\n name: 'i18nText'\n})\nexport class I18nTextPipe implements PipeTransform {\n\n constructor(private layoutService: LayoutService){}\n\n transform(value: any, language:string): unknown {\n return this.layoutService.getTextByLanguage(value, language);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safeHtml'\n})\nexport class SafeHtmlPipe implements PipeTransform {\n\n constructor(private sanitizer: DomSanitizer) { }\n\n transform(html: string | null): SafeHtml {\n if (!html) return '';\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\n\r\n@Pipe({\r\n name: \"safeUrl\"\r\n})\r\nexport class SafeUrlPipe implements PipeTransform { \r\n\r\n constructor(private sanitizer: DomSanitizer) { }\r\n \r\n transform(url :any) {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n}","
\r\n \r\n
\r\n
\r\n

\r\n {{ 'shared.cancelAppointmentDialog.text1' | translate:locale.language }}\r\n

\r\n
\r\n
\r\n \r\n \r\n {{option.text}}\r\n \r\n \r\n
\r\n \r\n {{ 'shared.cancelAppointmentDialog.text2' | translate:locale.language }} \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n

\r\n {{ 'shared.cancelAppointmentDialog.text5' | translate:locale.language }}\r\n

\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { AppointmentCancelledMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { CancelOption } from '../cancel-virtual-attention/cancel-virtual-attention-dialog.component';\r\n\r\n\r\n@Component({\r\n selector: 'app-cancel-appointment-dialog',\r\n templateUrl: './cancel-appointment-dialog.component.html',\r\n styleUrls: ['./cancel-appointment-dialog.component.css'] \r\n})\r\nexport class CancelAppointmentDialogComponent implements OnInit { \r\n solicitudPaciente: PatientAppointment; \r\n loading = false;\r\n completed = false;\r\n selectionControl: FormControl; \r\n reasonText: string;\r\n options: CancelOption[];\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n private mdDialogRef: MatDialogRef, \r\n private baseService: BaseService, \r\n private appointmentService: AppointmentService, \r\n private messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale\r\n ) { \r\n this.selectionControl = new FormControl('auto');\r\n this.solicitudPaciente = this.baseService.parseObject(data.data);\r\n\r\n console.log(this.solicitudPaciente); \r\n\r\n this.options = [\r\n new CancelOption(1, \"No puedo asistir en el horario pactado\"),\r\n new CancelOption(2, \"Deseo tener atenciĆ³n virtual\"),\r\n new CancelOption(3, \"Lo resolvĆ­ de otra forma\"),\r\n new CancelOption(4, \"Ya me siento mucho mejor, no necesito la atenciĆ³n\"),\r\n new CancelOption(5, \"Otro motivo\", true) \r\n ];\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n public cancel() {\r\n this.close(false);\r\n }\r\n\r\n public close(value:any) {\r\n this.mdDialogRef.close(value);\r\n } \r\n\r\n isSaveEnabled() {\r\n let reason = this.getSelectedReason();\r\n\r\n return !this.loading && (reason && reason.trim());\r\n }\r\n\r\n showTextarea() : boolean {\r\n let option = this.options.find(o => o.id == this.selectionControl.value);\r\n\r\n return option != undefined && option.showTextarea;\r\n }\r\n\r\n getSelectedReason() : string {\r\n let reasonId = this.selectionControl.value;\r\n let option = this.options.find(o => o.id == reasonId);\r\n\r\n if (!option)\r\n return \"\";\r\n\r\n return reasonId == 5? this.reasonText : option.text;\r\n }\r\n\r\n confirm() {\r\n this.loading = true;\r\n let reason = this.getSelectedReason();\r\n\r\n this.appointmentService.cancelAppointment(this.solicitudPaciente.idSolicitud, this.solicitudPaciente.idEtapaSolicitud, reason).subscribe(r => {\r\n // Send message so each control can handle the appointment state change\r\n let msg = new AppointmentCancelledMessage();\r\n msg.idEtapaSolicitud = this.solicitudPaciente.idEtapaSolicitud;\r\n this.messageBusService.appointmentCancelled(msg);\r\n \r\n this.loading = false; \r\n this.completed = true; \r\n });\r\n }\r\n \r\n}\r\n","
\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n {{ 'shared.futureAppointments.cardTitle' | translate:locale.language }} {{getAppointmentRemainingTime(app)}}\r\n {{ 'cancelled' | translate:locale.language | titlecase }}\r\n \r\n \r\n
\r\n \r\n {{getAppointmentDateStr(app.fechaRequerido)}} - {{app.fechaRequerido | date:'H:mm' }}\r\n
\r\n
\r\n \r\n {{getLocationDescription(app)}}\r\n
\r\n
\r\n \r\n {{ 'shared.futureAppointments.text9' | translate:locale.language }} \r\n {{ 'shared.futureAppointments.text10' | translate:locale.language }}\r\n \r\n
\r\n \r\n {{ 'cancel' | translate:locale.language }}\r\n {{ 'shared.futureAppointments.text7' | translate:locale.language }}\r\n \r\n
\r\n \r\n
\r\n
{{app.especialidadResponsableServicio}}
\r\n
\r\n {{app.nombreResponsableServicio}} \r\n {{ 'shared.futureAppointments.text1' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.futureAppointments.text2' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n 0\">\r\n \r\n
\r\n \r\n
\r\n \r\n","import { Component, ViewChild, Inject, OnInit, OnDestroy } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { LayoutService } from 'src/app/core/services/layout.service';\r\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { CancelAppointmentDialogComponent } from '../../dialogs/cancel-appointment/cancel-appointment-dialog.component';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { Router } from '@angular/router';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { Directory } from 'src/app/shared/models/systems/directory.model';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-future-appointment-cards-container',\r\n templateUrl: './future-appointments.component.html',\r\n styleUrls: ['./future-appointments.component.css']\r\n})\r\n@ComponentLookup('FutureAppointmentsComponent')\r\nexport class FutureAppointmentsComponent implements OnInit, OnDestroy, IControlComponent {\r\n data: FormComponentData;\r\n pageSize: number = 2;\r\n appointments : PatientAppointment[];\r\n pageAppointments : PatientAppointment[];\r\n day: string;\r\n hour: string;\r\n min: string;\r\n inProgressState: string;\r\n resultsCount: number = 0;\r\n loading = true;\r\n skeletonItems: string[] = [\"\", \"\"];\r\n directory: Directory;\r\n\r\n //subscribes\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private appointmentService: AppointmentService, \r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n public dialog: MatDialog,\r\n private messageBusService: MessageBusService,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private publicProfileService: PublicProfileService,\r\n private layoutService: LayoutService) {\r\n }\r\n \r\n @ViewChild(MatPaginator) paginator: MatPaginator; \r\n\r\n ngOnInit(): void {\r\n this.parseControlData(); \r\n\r\n this.messageBusService.onAppointmentChangeReceived()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(message => {\r\n // Refresh the appointmen\r\n this.getAppointments();\r\n });\r\n\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.day = this.translation.translate('days'); \r\n this.hour = this.translation.translate('hours'); \r\n this.min = this.translation.translate('minutes'); \r\n this.inProgressState = this.translation.translate('shared.futureAppointments.text8'); \r\n }\r\n });\r\n\r\n this.getDirectory();\r\n }\r\n\r\n ngOnDestroy():void{\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n getAppointments() {\r\n this.loading = true;\r\n\r\n this.appointmentService.getFutureAppointments(this.locale.language).subscribe(appointments =>{\r\n this.loading = false;\r\n \r\n this.appointments = appointments;\r\n this.resultsCount = appointments.length;\r\n\r\n this.setPageResults(0, this.pageSize)\r\n\r\n if(this.appointments == null || this.appointments.length == 0 && this.data){\r\n this.layoutService.hideComponent(this.data);\r\n }\r\n },\r\n error => {\r\n this.loading = false;\r\n\r\n this.baseService.handleServiceError(error, \"Error getting future appointment\"); \r\n }); \r\n }\r\n\r\n onPageChange(event: PageEvent) {\r\n let startIndex = event.pageIndex * event.pageSize;\r\n let endIndex = startIndex + event.pageSize;\r\n \r\n if(endIndex > this.appointments.length){\r\n endIndex = this.appointments.length;\r\n }\r\n \r\n this.setPageResults(startIndex, endIndex); \r\n }\r\n\r\n private setPageResults(startIndex: number, endIndex: number) {\r\n this.pageAppointments = this.appointments.slice(startIndex, endIndex);\r\n }\r\n\r\n appointmentTrackBy(index : number, item: PatientAppointment){\r\n return item.idSolicitud; \r\n }\r\n\r\n getLocationDescription(item : PatientAppointment) {\r\n let desc = item.direccionLocalidad;\r\n\r\n if (!desc)\r\n desc = item.nombreLocalidad;\r\n\r\n return desc;\r\n }\r\n\r\n getAvatarUrl(item : PatientAppointment) {\r\n let avatarUrl = item.urlAvatarResponsableServicio;\r\n\r\n if (!avatarUrl)\r\n avatarUrl = \"/assets/images/avatar_male_doctor.svg\";\r\n\r\n return avatarUrl;\r\n }\r\n\r\n getAppointmentDateStr(date: Date) {\r\n return this.baseService.getBasicDateFormat(date)\r\n }\r\n\r\n isAppointmentExpired(item : PatientAppointment) {\r\n let now = new Date().getTime();\r\n let appDate = new Date(item.fechaRequerido).getTime();\r\n\r\n return appDate <= now;\r\n }\r\n\r\n getAppointmentRemainingTime(item : PatientAppointment) {\r\n const dayDiff = 60 * 60 * 24;\r\n const hrDiff = 60 * 60;\r\n let now = new Date();\r\n let appDate = new Date(item.fechaRequerido);\r\n let timeDiff = (appDate.getTime() - now.getTime()) / 1000;\r\n let diffStr = \"\";\r\n\r\n if (timeDiff <= 0) {\r\n diffStr = this.inProgressState;\r\n }\r\n else if (timeDiff > dayDiff) {\r\n diffStr = (Math.ceil(timeDiff / dayDiff)) + \" \" + this.day;\r\n }\r\n else if (timeDiff > hrDiff) {\r\n diffStr = (Math.floor(timeDiff / hrDiff)) + \" \" + this.hour;\r\n }\r\n else {\r\n diffStr = (Math.floor(timeDiff / 60)) + \" \" + this.min;\r\n }\r\n\r\n return diffStr;\r\n }\r\n\r\n isTeleconsultation(item : PatientAppointment) {\r\n return item.teleconsulta && item.teleconsulta.toLocaleUpperCase() === \"S\";\r\n }\r\n\r\n buildTeleconsultationLink(item : PatientAppointment) {\r\n return this.directory.url + \"/meet/\" + item.teleconsultaId;\r\n }\r\n\r\n getDirectory() {\r\n let companyId = this.baseService.getCliniwebDirectoryCompanyId();\r\n\r\n this.baseService.getCliniwebDirectory(companyId).subscribe(d => {\r\n this.directory = d;\r\n\r\n this.getAppointments();\r\n }); \r\n }\r\n\r\n openCancelAppointmentDialog(item : PatientAppointment) {\r\n let dialogData = new DialogData();\r\n dialogData.data = item;\r\n\r\n const dialogRef = this.dialog.open(CancelAppointmentDialogComponent, {\r\n data: dialogData\r\n }); \r\n }\r\n \r\n onReprogramAppointment(item : PatientAppointment) {\r\n \r\n // If the doctor does not have a public profile\r\n if (!item.identificadorPerfilPublico) {\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate(\"shared.pastAppointments.text4\");\r\n dialogData.message = this.translation.translate(\"shared.pastAppointments.text5\");\r\n dialogData.confirmText = this.translation.translate(\"shared.pastAppointments.text6\");\r\n dialogData.showCancelButton = false;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData\r\n });\r\n }\r\n else {\r\n //let url = \"/perfil/\" + item.identificadorPerfilPublico; \r\n let url = this.publicProfileService.getPublicProfileUrl(item.identificadorPerfilPublico);\r\n \r\n this.router.navigate([url], { queryParams: {rs: true} });\r\n } \r\n }\r\n\r\n private parseControlData() {\r\n if (this.data && this.data.valor) {\r\n try {\r\n this.data.valor = JSON.parse(this.data.valor); \r\n\r\n let data = this.data.valor;\r\n\r\n this.pageSize = data.appointments;\r\n\r\n this.skeletonItems = ' '.repeat(this.pageSize).split('')\r\n } catch (ex) {} \r\n } \r\n }\r\n}\r\n\r\nexport interface FutureAppointmentConfigurationDataModel {\r\n appointments: number;\r\n}\r\n","\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {{group.key}}\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n {{getDateAsStr(item.getDate()) | uppercase }}\r\n \r\n \r\n \r\n {{item.getDate() | date: 'h:mm a'}}\r\n
\r\n\r\n \r\n
\r\n\r\n \r\n \r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n
","import { AfterViewInit, Component, ContentChild, ElementRef, Inject, Input, OnDestroy, OnInit, TemplateRef, ViewEncapsulation } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { LayoutService } from 'src/app/core/services/layout.service';\r\n\r\n\r\n@Component({\r\n selector: 'app-timeline-list-container',\r\n templateUrl: './timeline-list.component.html',\r\n styleUrls: ['./timeline-list.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class TimelineListComponent implements OnInit, AfterViewInit, OnDestroy {\r\n groups: TimelineWrapperGroup[] = []; \r\n _items : TimelineWrapperItem[];\r\n _itemType = TimelineWrapperItemType;\r\n\r\n @ContentChild('TimelineContent') TimelineContent: TemplateRef;\r\n @ContentChild('TimelineSkeletonContent') TimelineSkeletonContent: TemplateRef;\r\n @ContentChild('TimelineEmptyStateContent') TimelineEmptyStateContent: TemplateRef;\r\n \r\n @Input() loading : boolean = false;\r\n @Input() skeletonItems : TimelineWrapperSkeletonItem[] = [];\r\n\r\n @Input() \r\n get items(): TimelineWrapperItem[] { return this._items; }\r\n set items(items : TimelineWrapperItem[]) {\r\n this._items = items;\r\n this.onItemsChange(items);\r\n }; \r\n\r\n ngAfterViewInit() { \r\n } \r\n\r\n constructor(\r\n public dialog: MatDialog,\r\n private baseService: BaseService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private layoutService: LayoutService) { \r\n } \r\n \r\n ngOnInit(): void { \r\n this.layoutService.addComponentInitClass(\"timeline-list-component\");\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.layoutService.removeComponentInitClass(\"timeline-list-component\");\r\n }\r\n\r\n onItemsChange(newItems: TimelineWrapperItem[]) {\r\n this.groups = []; \r\n\r\n if (newItems)\r\n this.populateItems(newItems);\r\n }\r\n \r\n populateItems(items : TimelineWrapperItem[]) {\r\n for (let index = 0; index < items.length; index++) {\r\n const item = items[index]; \r\n \r\n // Add item to group\r\n this.addToGroup(item);\r\n }\r\n }\r\n\r\n getGroup(item: TimelineWrapperItem) {\r\n return this.groups.find(g => g.key === item.getGroupKey());\r\n }\r\n\r\n addNewGroup(groupKey: number) {\r\n let group = new TimelineWrapperGroup(groupKey);\r\n\r\n this.groups.push(group);\r\n }\r\n\r\n addToGroup(item: TimelineWrapperItem) {\r\n let group = this.getGroup(item);\r\n\r\n if (!group) \r\n this.addNewGroup(item.getGroupKey());\r\n\r\n this.getGroup(item)?.addItem(item);\r\n }\r\n\r\n getDateAsStr(date: Date) {\r\n return this.baseService.getBasicDateFormat(date, false);\r\n }\r\n \r\n}\r\n\r\nexport class TimelineWrapperGroup {\r\n key : number;\r\n items: T[];\r\n collapsed = false;\r\n\r\n constructor(key: number) {\r\n this.key = key;\r\n this.items = [];\r\n }\r\n\r\n addItem(item: T) {\r\n this.items.push(item);\r\n }\r\n\r\n onClick() {\r\n this.collapsed = !this.collapsed;\r\n }\r\n}\r\n\r\nexport interface TimelineWrapperItem {\r\n getGroupKey() : number;\r\n getDate() : Date;\r\n getItemType(): TimelineWrapperItemType;\r\n showTime(): boolean;\r\n showDate(): boolean;\r\n}\r\n\r\nexport enum TimelineWrapperItemType {\r\n DOT = 1,\r\n CHECKED = 2,\r\n CANCELLED = 3\r\n}\r\n\r\nexport class TimelineWrapperSkeletonItem {\r\n}","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
{{item.patient.nombreResponsableServicio}}
\r\n
\r\n {{item.patient.especialidadResponsableServicio}}\r\n {{ 'shared.pastAppointments.text1' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.pastAppointments.programAgain' | translate:locale.language }}\r\n
\r\n \r\n
\r\n
{{item.patient.nombreLocalidad}}
\r\n
{{ getStateName(item.patient) }}
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n\r\n \r\n \r\n
{{ 'shared.pastAppointments.text8' | translate:locale.language }}
\r\n
\r\n {{ 'shared.pastAppointments.text9' | translate:locale.language }}\r\n {{ 'shared.pastAppointments.text10' | translate:locale.language }}\r\n
\r\n
\r\n\r\n
\r\n \r\n
","import { AfterViewInit, Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { Router } from '@angular/router';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { TimelineWrapperItem, TimelineWrapperItemType, TimelineWrapperSkeletonItem } from '../../timeline-list/timeline-list.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-past-appointment-container',\r\n templateUrl: './past-appointments.component.html',\r\n styleUrls: ['./past-appointments.component.css']\r\n})\r\n@ComponentLookup('PastAppointmentsComponent')\r\nexport class PastAppointmentsComponent implements IControlComponent, OnInit, OnDestroy, AfterViewInit {\r\n data: FormComponentData; \r\n appointments: TimelinePatientAppointment[]; \r\n completedStateName: string;\r\n notCompletedStateName: string;\r\n cancelledStateName: string;\r\n loading = true;\r\n skeletonItems: TimelineWrapperSkeletonItem[] = [new TimelineWrapperSkeletonItem(), new TimelineWrapperSkeletonItem()];\r\n\r\n isBrowser: boolean;\r\n\r\n //subscribes\r\n private ngUnsubscribe = new Subject();\r\n\r\n ngAfterViewInit() { \r\n } \r\n\r\n constructor(\r\n private appointmentService: AppointmentService, \r\n private translation: L10nTranslationService,\r\n private router: Router,\r\n private baseService: BaseService,\r\n public dialog: MatDialog,\r\n private publicProfileService: PublicProfileService,\r\n private messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n \r\n ngOnInit(): void {\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.completedStateName = this.translation.translate('shared.pastAppointments.text2'); \r\n this.notCompletedStateName = this.translation.translate('shared.pastAppointments.text3'); \r\n this.cancelledStateName = this.translation.translate('shared.pastAppointments.text7'); \r\n }\r\n });\r\n\r\n this.appointmentService.getPastAppointments(this.locale.language)\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(appointments =>{\r\n this.appointments = appointments.map(a => new TimelinePatientAppointment(a)); \r\n\r\n this.loading = false;\r\n },\r\n error => {\r\n this.loading = false;\r\n\r\n this.baseService.handleServiceError(error, \"Error getting past appointments\"); \r\n });\r\n\r\n this.messageBusService.onAppointmentChangeReceived()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(\r\n appointments => {\r\n this.appointments = appointments.citasPasadas.map(a => new TimelinePatientAppointment(a)); \r\n this.loading = false;\r\n },\r\n error => { this.baseService.handleServiceError(error, \"Error getting past appointments\") } \r\n );\r\n }\r\n\r\n ngOnDestroy():void{\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n appointmentTrackBy(index : number, item: PatientAppointment){\r\n return item.idSolicitud; \r\n }\r\n\r\n getLocationDescription(item : PatientAppointment) {\r\n let desc = item.direccionLocalidad;\r\n\r\n if (!desc)\r\n desc = item.nombreLocalidad;\r\n\r\n return desc;\r\n }\r\n\r\n getAvatarUrl(item : PatientAppointment) {\r\n let avatarUrl = item.urlAvatarResponsableServicio;\r\n\r\n if (!avatarUrl)\r\n avatarUrl = \"/assets/Images/avatar_male_doctor.svg\";\r\n\r\n return avatarUrl;\r\n }\r\n\r\n getStateName(item : PatientAppointment) {\r\n if (item.idEstado == 7)\r\n return this.cancelledStateName;\r\n if (item.idEstado == 28 || item.idEstado == 22)\r\n return this.notCompletedStateName;\r\n else \r\n return this.completedStateName;\r\n }\r\n\r\n getStateClass(item : PatientAppointment) {\r\n if (item.idEstado == 7)\r\n return \"cancelled\";\r\n if (item.idEstado == 28)\r\n return \"incomplete\";\r\n else \r\n return \"completed\";\r\n }\r\n\r\n isIncomplete(item : PatientAppointment) {\r\n return item.idEstado == 7 || item.idEstado == 28;\r\n }\r\n \r\n navigateToPublicProfile(item : PatientAppointment) { \r\n\r\n // If the doctor does not have a public profile\r\n if (!item.identificadorPerfilPublico) {\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate(\"shared.pastAppointments.text4\");\r\n dialogData.message = this.translation.translate(\"shared.pastAppointments.text5\");\r\n dialogData.confirmText = this.translation.translate(\"shared.pastAppointments.text6\");\r\n dialogData.showCancelButton = false;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData\r\n });\r\n }\r\n else {\r\n //let url = \"/perfil/\" + item.identificadorPerfilPublico; \r\n let url = this.publicProfileService.getPublicProfileUrl(item.identificadorPerfilPublico); \r\n\r\n this.router.navigate([url], { queryParams: {rs: true} });\r\n }\r\n }\r\n\r\n navigateToAppointmentPage() {\r\n if(this.isBrowser)\r\n window.location.reload();\r\n }\r\n}\r\n\r\nexport class TimelinePatientAppointment implements TimelineWrapperItem { \r\n patient : PatientAppointment;\r\n\r\n constructor(patient : PatientAppointment) {\r\n this.patient = patient;\r\n }\r\n \r\n getGroupKey() : number {\r\n return new Date(this.patient.fechaInicio).getFullYear();\r\n }\r\n\r\n getDate() : Date {\r\n return new Date(this.patient.fechaInicio);\r\n }\r\n\r\n getItemType(): TimelineWrapperItemType{\r\n return this.patient.idEstado == 7 || this.patient.idEstado == 28 \r\n ? TimelineWrapperItemType.CANCELLED\r\n : TimelineWrapperItemType.CHECKED;\r\n }\r\n\r\n showTime():boolean{\r\n return true;\r\n }\r\n\r\n showDate():boolean{\r\n return true;\r\n }\r\n}","
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{{ 'name' | translate:locale.language }} \r\n {{app.nombreResponsableServicio}}\r\n {{ 'shared.cancelledAppointments.text1' | translate:locale.language }}\r\n {{ 'specialty' | translate:locale.language }} {{app.especialidadResponsableServicio}} {{ 'date' | translate:locale.language }} {{app.fechaRequerido | date:'dd/MM/yyyy' }} {{ 'state' | translate:locale.language }} {{ getStateName(app) }} {{ 'shared.cancelledAppointments.programAgain' | translate:locale.language }}
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {{app.nombreResponsableServicio}} \r\n {{ 'shared.cancelledAppointments.text1' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'date' | translate:locale.language }}: {{app.fechaRequerido | date:'dd/MM/yyyy' }}\r\n
\r\n
\r\n {{ 'specialty' | translate:locale.language }}: {{app.especialidadResponsableServicio}} \r\n
\r\n
\r\n {{ 'state' | translate:locale.language }}: {{ getStateName(app) }}\r\n
\r\n
\r\n {{ 'shared.cancelledAppointments.programAgain' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
","import { AfterViewInit, Component, ViewChild, Inject, OnInit, OnDestroy } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { Router } from '@angular/router';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'cancelled-appointment-container',\r\n templateUrl: './cancelled-appointments.component.html',\r\n styleUrls: ['./cancelled-appointments.component.css']\r\n})\r\n@ComponentLookup('CancelledAppointmentsComponent')\r\nexport class CancelledAppointmentsComponent implements IControlComponent, OnInit, OnDestroy, AfterViewInit {\r\n data: FormComponentData;\r\n appointments : MatTableDataSource;\r\n appointmentsArray: PatientAppointment[];\r\n appointmentsPage: PatientAppointment[];\r\n resultsCount: number;\r\n displayedColumns: string[] = ['name', 'specialty', 'date', 'state', 'actions']; \r\n canceledStateName: string;\r\n missedStateName: string;\r\n\r\n //subscribes\r\n private ngUnsubscribe = new Subject();\r\n\r\n @ViewChild(MatPaginator) paginator: MatPaginator;\r\n\r\n ngAfterViewInit() { \r\n } \r\n\r\n constructor(\r\n private appointmentService: AppointmentService, \r\n private translation: L10nTranslationService,\r\n private router: Router,\r\n public dialog: MatDialog,\r\n private messageBusService: MessageBusService,\r\n private publicProfileService: PublicProfileService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale) {\r\n }\r\n \r\n ngOnInit(): void {\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.canceledStateName = this.translation.translate('shared.cancelledAppointments.text2'); \r\n this.missedStateName = this.translation.translate('shared.cancelledAppointments.text7'); \r\n }\r\n });\r\n\r\n // Subscribe to appointment cancelled event\r\n this.messageBusService.onAppointmentCancelled()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(message => {\r\n // Refresh the appointments\r\n this.getAppointments();\r\n });\r\n\r\n this.getAppointments();\r\n }\r\n\r\n ngOnDestroy():void{\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n getAppointments() {\r\n this.appointmentService.getIncompletedAppointments()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(appointments =>{\r\n this.appointmentsArray = appointments;\r\n this.appointments = new MatTableDataSource(appointments); \r\n this.appointments.paginator = this.paginator;\r\n this.resultsCount = appointments.length; \r\n \r\n this.setPageResults(0, this.appointments.paginator.pageSize); \r\n },\r\n error => {\r\n \r\n });\r\n }\r\n\r\n OnPageChange(event: PageEvent){\r\n let startIndex = event.pageIndex * event.pageSize;\r\n let endIndex = startIndex + event.pageSize;\r\n \r\n if(endIndex > this.appointmentsArray.length){\r\n endIndex = this.appointmentsArray.length;\r\n }\r\n \r\n this.setPageResults(startIndex, endIndex); \r\n }\r\n\r\n private setPageResults(startIndex: number, endIndex: number) {\r\n this.appointmentsPage = this.appointmentsArray.slice(startIndex, endIndex);\r\n }\r\n\r\n appointmentTrackBy(index : number, item: PatientAppointment){\r\n return item.idSolicitud; \r\n }\r\n\r\n getLocationDescription(item : PatientAppointment) {\r\n let desc = item.direccionLocalidad;\r\n\r\n if (!desc)\r\n desc = item.nombreLocalidad;\r\n\r\n return desc;\r\n }\r\n\r\n getAvatarUrl(item : PatientAppointment) {\r\n let avatarUrl = item.urlAvatarResponsableServicio;\r\n\r\n if (!avatarUrl)\r\n avatarUrl = \"/assets/Images/avatar_male_doctor.svg\";\r\n\r\n return avatarUrl;\r\n } \r\n \r\n navigateToPublicProfile(item : PatientAppointment) { \r\n\r\n // If the doctor does not have a public profile\r\n if (!item.identificadorPerfilPublico) {\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate(\"shared.cancelledAppointments.text4\");\r\n dialogData.message = this.translation.translate(\"shared.cancelledAppointments.text5\");\r\n dialogData.confirmText = this.translation.translate(\"shared.cancelledAppointments.text6\");\r\n dialogData.showCancelButton = false;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData\r\n });\r\n }\r\n else {\r\n //let url = \"/busqueda/perfil/\" + item.identificadorPerfilPublico;\r\n let url = this.publicProfileService.getPublicProfileUrl(item.identificadorPerfilPublico);\r\n\r\n this.router.navigate([url]);\r\n }\r\n }\r\n\r\n getStateName(item : PatientAppointment) {\r\n if (item.idEstado == 7)\r\n return this.canceledStateName; \r\n else \r\n return this.missedStateName; \r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {{ 'shared.appointmentTabs.text1' | translate:locale.language }} \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n \r\n {{ 'shared.appointmentTabs.text2' | translate:locale.language }} \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\n\r\n@Component({\r\n selector: 'appointment-tabs-container',\r\n templateUrl: './appointment-tabs.component.html',\r\n styleUrls: ['./appointment-tabs.component.css']\r\n})\r\n@ComponentLookup('AppointmentTabsComponent')\r\nexport class AppointmentsTabsComponent implements IControlComponent, OnInit {\r\n data: FormComponentData;\r\n\r\n constructor( \r\n @Inject(L10N_LOCALE) public locale: L10nLocale) {\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n}","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\n\n@Component({\n selector: 'app-menu-mobile',\n templateUrl: './menu-mobile.component.html',\n styleUrls: ['./menu-mobile.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class MenuMobileComponent implements OnInit, OnDestroy {\n public menuComponentName: string = \"\";\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\n private mdDialogRef: MatDialogRef,\n private layoutService: LayoutService,\n private baseService: BaseService\n ) { \n this.layoutService.postNavigateSource$\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(data=>{\n this.close();\n });\n }\n\n ngOnInit(): void {\n this.menuComponentName = this.baseService.getMenuComponentName();\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n public close() {\n this.mdDialogRef.close();\n }\n}\n","
\n \n \n \n
","import { DOCUMENT } from '@angular/common';\r\nimport { Component, HostListener, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\n\r\n@Component({\r\n selector: 'app-profile-menu-dialog',\r\n templateUrl: './profile-menu-dialog.component.html',\r\n styleUrls: ['./profile-menu-dialog.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ProfileMenuDialogComponent implements OnInit {\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n @Inject(DOCUMENT) private document: Document,\r\n public mdDialogRef: MatDialogRef\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n history.pushState(null, '', location.href);\r\n } \r\n\r\n public close() {\r\n if(this.data.animationOut){\r\n this.document.getElementsByClassName(this.data.id)[0].classList.remove(this.data.animationIn);\r\n this.document.getElementsByClassName(this.data.id)[0].classList.add(this.data.animationOut);\r\n\r\n setTimeout(()=>{ \r\n this.mdDialogRef.close();\r\n }, 300);\r\n }\r\n else{\r\n this.mdDialogRef.close();\r\n }\r\n } \r\n \r\n @HostListener(\"keydown.esc\") \r\n public onEsc() {\r\n this.close();\r\n }\r\n}","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n
","import { Component, Input, OnChanges } from '@angular/core';\nimport { ProfileMenuDialogComponent } from '../../dialogs/profile-menu-dialog/profile-menu-dialog.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { DialogName, DialogOpenMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\n\n@Component({\n selector: 'app-logged-in-menu-button',\n templateUrl: './logged-in-menu-button.component.html',\n styleUrls: ['./logged-in-menu-button.component.css']\n})\nexport class LoggedInMenuButtonComponent implements OnChanges {\n\n @Input() loggedInUser: UserPerson;\n\n constructor(\n public dialog: MatDialog,\n private utilsService: UtilsService,\n private messageBusService: MessageBusService\n ) { }\n\n ngOnChanges(): void {\n this.setProfilePhoto();\n }\n\n private setProfilePhoto(): void {\n if (!this.loggedInUser.ubicacionLogo) {\n let feNacimiento = this.loggedInUser.fechaNacimiento? new Date(this.loggedInUser.fechaNacimiento) : null;\n this.loggedInUser.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(feNacimiento, this.loggedInUser.sexo);\n }\n }\n\n onMenuClick() {\n const dialogRef = this.dialog.open(ProfileMenuDialogComponent, {\n data: {\n id: 'profile-menu-dialog',\n animationIn: 'public-profile-animation-in',\n animationOut: 'public-profile-animation-out'\n }, \n panelClass: ['profile-menu-dialog', 'public-profile-animation-in']\n });\n\n this.messageBusService.dialogOpen(new DialogOpenMessage(DialogName.UserProfileMenu));\n\n dialogRef.afterClosed().subscribe(accepted => { \n this.messageBusService.dialogClose(new DialogOpenMessage(DialogName.UserProfileMenu));\n });\n }\n\n}\n","
\n \n
","
\n \n \n \n {{ item.locale.language | l10nDisplayNames:locale.language:{ type: 'language' } }}\n \n \n\n
","import { Component, Inject, ViewEncapsulation } from '@angular/core';\nimport { L10N_CONFIG, L10N_LOCALE, L10nConfig, L10nLocale } from 'angular-l10n';\nimport { BaseService } from 'src/app/core/services/base.service';\n\n@Component({\n selector: 'app-anonymous-language-menu',\n templateUrl: './anonymous-language-menu.component.html',\n styleUrls: ['./anonymous-language-menu.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class AnonymousLanguageMenuComponent {\n\n schema = this.l10nConfig.schema;\n\n constructor(\n @Inject(L10N_CONFIG) private l10nConfig: L10nConfig,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private baseService: BaseService\n ) { }\n\n setLocale(locale: L10nLocale): void {\n this.baseService.setLocale(locale);\n }\n\n}\n","import { Component, Inject, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\nimport { environment } from 'src/environments/environment';\nimport { LoginRouteDialogModel } from '../../dialogs/route-dialog/route-dialog.component';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { SignupWorkflowVerificationType } from 'src/app/shared/enums/signup-workflow-verification.enum';\nimport { Router } from '@angular/router';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'app-anonymous-login-signup-menu',\n templateUrl: './anonymous-login-signup-menu.component.html',\n styleUrls: ['./anonymous-login-signup-menu.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class AnonymousLoginSignupMenuComponent {\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private appStorageService: AppStorageService,\n private routeDialogService: RouteDialogService,\n private router: Router,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { }\n\n onCliniwebForDoctorsClick(): void {\n if(isPlatformBrowser(this.platformId)){\n let cliniwebUrl = environment.cliniwebUrl + \"Doctor##comoFuncionaDoctores\";\n window.location.href = cliniwebUrl;\n }\n }\n\n onCliniwebForPatientsClick(): void {\n if(isPlatformBrowser(this.platformId)){\n let cliniwebUrl = environment.cliniwebUrl + \"##comoFuncionaPacientes\";\n window.location.href = cliniwebUrl; \n }\n }\n\n onLoginClick(): void {\n if(isPlatformBrowser(this.platformId)){\n let path = encodeURIComponent(window.location.pathname + window.location.search);\n\n this.appStorageService.setItemSession(STORAGE.SIGNUP_WORKFLOW_VERIFICATION_TYPE, SignupWorkflowVerificationType.SIMPLE);\n this.router.navigate(['welcome', 'login'], { queryParams: { returnUrl: path } });\n }\n /*let routeDialogModel = new LoginRouteDialogModel();\n routeDialogModel.route = \"login\"; \n routeDialogModel.queryParams = { returnUrl: path, closeOnBack: true }\n this.routeDialogService.openDialog(routeDialogModel);*/\n }\n\n /**\n * Redirige al welcome segĆŗn MCWNG-6496\n */\n onSignupClick(): void {\n if(isPlatformBrowser(this.platformId)){\n let path = encodeURIComponent(window.location.pathname + window.location.search);\n\n this.appStorageService.setItemSession(STORAGE.SIGNUP_WORKFLOW_VERIFICATION_TYPE, SignupWorkflowVerificationType.SIMPLE);\n this.router.navigate(['welcome', 'signup'], { queryParams: { returnUrl: path } });\n }\n }\n\n goToPortal(): void {\n if(isPlatformBrowser(this.platformId)){\n let portalUrl = environment.portalUrl;\n window.location.href = portalUrl;\n }\n }\n\n goToPortalPublicProfilePage(): void {\n if(isPlatformBrowser(this.platformId)){\n let portalUrl = environment.portalUrl + \"perfiles\"; \n window.location.href = portalUrl; \n }\n }\n\n onViewAppointmentsClick(): void {\n this.router.navigate(['/mis-citas']);\n }\n\n}\n","","\n\n\n
\n\n \n \n\n \n \n\n
","import { Component, EventEmitter, Inject, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { concat, Observable, of, Subject } from 'rxjs';\nimport { concatMap, delay, map, startWith, takeUntil, withLatestFrom } from 'rxjs/operators';\nimport { LoginCompletedMessage, LogoutMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { DOCUMENT } from '@angular/common';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { PHRVersion, PortalPhr } from 'src/app/shared/models/systems/portal-phr.model';\n\n@Component({\n selector: 'app-anonymous-menu',\n templateUrl: './anonymous-menu.component.html',\n styleUrls: ['./anonymous-menu.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class AnonymousMenuComponent implements OnDestroy, OnInit {\n\n @Output() onLoggedInUser: EventEmitter = new EventEmitter();\n loggedInUser: UserPerson | null = null;\n showAnonymousMenu: boolean = false;\n showLoggedInMenu = false;\n private ngUnsubscribe = new Subject();\n directory: PortalPhr;\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n private authService: AuthService,\n private messageBusService: MessageBusService,\n private userService: UserService,\n private baseService: BaseService\n ) {\n this.messageBusService.onLoginCompleted().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.onLoginCompleted.bind(this));\n this.messageBusService.onLogout().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.onLogout.bind(this));\n this.messageBusService.onRefreshProfileMenu().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.loadProfile.bind(this));\n this.messageBusService.onShowSignupLoginHeaderMenu()\n .pipe(takeUntil(this.ngUnsubscribe), concatMap(x => of(x).pipe(delay(50))))\n .subscribe(x => this.showLoggedInMenu = x);\n /*this.showAnonymousMenu = this.messageBusService.onHideAnonymousMenu()\n .pipe(takeUntil(this.ngUnsubscribe), map(() => false), startWith(true), withLatestFrom(onShowSignupLoginHeaderMenu), map(x => x[0] && x[1]), delay(100));*/\n }\n\n private onLoginCompleted(msg: LoginCompletedMessage) : void {\n if (msg.user) {\n this.loadProfile();\n }\n }\n\n private onLogout(_: LogoutMessage): void {\n this.loggedInUser = null;\n this.onLoggedInUser.emit(null);\n this.document.body.classList.add('anonymous');\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n ngOnInit(): void {\n this.loadProfile();\n\n this.messageBusService.onHideAnonymousMenu()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(m => {\n this.showAnonymousMenu = false;\n });\n \n this.messageBusService.onShowAnonymousMenu()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(m => {\n if (this.directory.versionPhr != PHRVersion.V1)\n this.showAnonymousMenu = true;\n });\n\n this.directory = this.baseService.getDirectory();\n this.showAnonymousMenu = this.directory.versionPhr != PHRVersion.V1;\n }\n\n loadProfile() {\n this.authService.isLoggedInFull()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((result:boolean)=>{\n\n if(result){\n this.userService.getUserPersonLoggedIn().subscribe(this.isLoggedIn.bind(this));\n }\n else{\n this.document.body.classList.add('anonymous');\n }\n });\n }\n\n private isLoggedIn(arg: UserPerson | null): void {\n if (!arg) return;\n this.loggedInUser = arg;\n this.onLoggedInUser.emit(arg);\n this.document.body.classList.remove('anonymous');\n }\n\n}\n","\n \n \n\n
\n \n \n \n
\n \n \n \n {{ 'shared.header.homeLinkText' | translate:language }}\n \n \n \n \n\n \n
\n
\n \n
\n {{publicProfileMenuModel.profile.nombrePersona}}\n \n \n \n \n
\n\n
\n","import { Component, ChangeDetectorRef, Inject, OnDestroy, OnInit, ViewEncapsulation, PLATFORM_ID } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport { MessageBusService, PublicProfileActionMessage } from 'src/app/core/services/message-bus.service';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { ContainerType } from 'src/app/shared/enums/container-type.enum';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { environment } from 'src/environments/environment';\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\nimport { PublicProfileAvatarComponentModel } from '../../public-profile-avatar/public-profile-avatar.component';\n\n@Component({\n selector: 'app-header',\n templateUrl: './header.component.html',\n styleUrls: ['./header.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('HeaderComponent')\nexport class HeaderComponent implements OnInit, OnDestroy, IControlComponent {\n data: FormComponentData;\n\n routeDialogOpened: boolean = false;\n isPublicProfilePage: boolean = false;\n isSearchProfilePage: boolean = false;\n loggedInUser: UserPerson = null as any;\n floatingComponents: FormComponentData[] = [];\n language: string;\n publicProfileMenuModel: HeaderComponentPublicProfileMenuModel;\n\n private ngUnsubscribe = new Subject();\n\n constructor(\n private routeDialogService: RouteDialogService,\n private messageBusService: MessageBusService,\n private router: Router,\n public dialog: MatDialog,\n private cd: ChangeDetectorRef,\n @Inject(DOCUMENT) private document: Document,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n }\n\n ngOnInit(): void {\n\n this.isPublicProfilePage = this.router.url.includes('perfil');\n this.isSearchProfilePage = this.router.url.includes('doctores');\n\n this.router.events\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(event=>{\n if(event instanceof NavigationEnd){\n if(this.routeDialogService.anyOpen())\n return; \n\n this.isPublicProfilePage = this.router.url.includes('perfil');\n this.isSearchProfilePage = this.router.url.includes('doctores');\n\n\n this.language = this.locale.language;\n }\n });\n\n this.messageBusService.onSendFloatingComponents()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message)=>{\n\n if(this.routeDialogService.anyOpen())\n return;\n\n this.floatingComponents = message.componentsData.filter(c=>c.contenedor == ContainerType.HEADER);\n });\n\n this.messageBusService.onOpenRouteDialog()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message)=>{\n\n this.routeDialogOpened = true;\n });\n\n this.messageBusService.onCloseRouteDialog()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message)=>{\n this.routeDialogOpened = false;\n });\n\n this.messageBusService.onAllRouteDialogClosed()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message)=>{\n this.routeDialogOpened = false;\n });\n\n this.messageBusService.onPublicProfileHeaderVisibilityChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message)=> {\n if (message.fromRouteDialog)\n return;\n\n this.publicProfileMenuModel = new HeaderComponentPublicProfileMenuModel();\n this.publicProfileMenuModel.headerVisible = message.headerVisible;\n this.publicProfileMenuModel.profile = message.profile;\n this.publicProfileMenuModel.avatarModel = message.publicProfileAvatarComponentModel;\n this.publicProfileMenuModel.avatarModel.useAvatarPadding = false;\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n openMenuMobile(){\n const dialogRef = this.dialog.open(MenuMobileComponent, {\n panelClass: \"menu-mobile\"\n });\n }\n\n onLogoClick() {\n let url = environment.cliniwebUrl;\n\n if (this.loggedInUser)\n this.router.navigate(['/']);\n else if(isPlatformBrowser(this.platformId))\n window.location.href = url;\n }\n\n setLoggedInUser(arg: UserPerson | null): void {\n this.loggedInUser = arg as any;\n this.cd.detectChanges();\n }\n\n gotoPayment() {\n this.messageBusService.sendPublicProfileAction(new PublicProfileActionMessage(true, false));\n }\n\n onAppointmentBtnClick() {\n this.messageBusService.sendPublicProfileAction(new PublicProfileActionMessage(false, true));\n }\n}\n\nexport class HeaderComponentPublicProfileMenuModel {\n headerVisible: boolean;\n profile: PublicProfile;\n avatarModel: PublicProfileAvatarComponentModel;\n}\n"," \r\n
\r\n
\r\n
\r\n \r\n
{{policy.plan}}
\r\n\r\n \r\n {{ 'policyMenu.text6' | translate:locale.language }}\r\n \r\n\r\n
\r\n {{ 'policyMenu.text2' | translate:locale.language }}: \r\n {{policy.redMedica}}\r\n
\r\n
\r\n {{ 'policyMenu.text3' | translate:locale.language }}: \r\n {{policy.numeroPoliza}}\r\n
\r\n\r\n {{ 'policyMenu.text4' | translate:locale.language }} \r\n
\r\n
","import { isPlatformBrowser } from '@angular/common';\r\nimport { Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { AuthService } from 'src/app/core/services/auth.service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { GoogleAnalyticsService } from 'src/app/core/services/google-analytics.service';\r\nimport { MessageBusService, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { Policy } from 'src/app/shared/models/people/policy.model';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\n\r\n@Component({\r\n selector: 'app-policy-menu-content',\r\n templateUrl: './policy-menu-content.component.html',\r\n styleUrls: ['./policy-menu-content.component.css']\r\n})\r\n\r\nexport class PolicyMenuContentComponent implements OnInit, OnDestroy { \r\n private ngUnsubscribe = new Subject();\r\n user: UserPerson;\r\n policies : Policy[] = [];\r\n cedula: string;\r\n\r\n constructor(\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private baseService: BaseService,\r\n private userService: UserService,\r\n private messageBusService: MessageBusService,\r\n private authService: AuthService,\r\n private googleAnalyticsService: GoogleAnalyticsService,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.authService.isLoggedIn()) {\r\n let tipoIdentificacionPoliza = this.baseService.getDirectory().tipoIdentificacionPoliza; \r\n\r\n tipoIdentificacionPoliza && this.getPolicies(tipoIdentificacionPoliza); \r\n\r\n // Get Cedula\r\n this.userService.getUserIdentificationNumber()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(i => {\r\n if (i && i.length > 0)\r\n this.cedula = i[0].valor; \r\n });\r\n }\r\n \r\n // On SSO when the ngOnInit the user is not yet logged in, so for those cases we will subscribe to this event\r\n this.messageBusService.onLoginCompleted()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(msg => { \r\n if (this.policies.length == 0) {\r\n let tipoIdentificacionPoliza = this.baseService.getDirectory().tipoIdentificacionPoliza; \r\n\r\n tipoIdentificacionPoliza && this.getPolicies(tipoIdentificacionPoliza); \r\n } \r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n getPolicies(tipoIdentificacionPoliza: number){\r\n this.userService.getPolicies(tipoIdentificacionPoliza)\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(policies => {\r\n this.policies = policies; \r\n },\r\n error => {\r\n this.baseService.handleServiceError(error, \"Error getting user policies\"); \r\n });\r\n }\r\n\r\n policyTrackBy(index : number, item: Policy){\r\n return item.numeroPoliza; \r\n }\r\n\r\n goToPolicy(policyNumber: string) {\r\n if(isPlatformBrowser(this.platformId)){\r\n this.googleAnalyticsService.sendEventGoToInsuranceCard();\r\n\r\n let url = this.baseService.getDirectory().urlCorporativo;\r\n \r\n url += \"micarnet?identificacion=\" + this.cedula;\r\n \r\n window.open(url, '_blank')?.focus();\r\n }\r\n }\r\n}\r\n","
\r\n\r\n \r\n \r\n\r\n \r\n \r\n
\r\n\r\n
{{ 'policyMenu.text1' | translate:locale.language }}
\r\n \r\n \r\n \r\n \r\n\r\n
\r\n
\r\n
\r\n","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { AuthService } from 'src/app/core/services/auth.service';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { Policy } from 'src/app/shared/models/people/policy.model';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\n\r\n@Component({\r\n selector: 'app-policy-menu',\r\n templateUrl: './policy-menu.component.html',\r\n styleUrls: ['./policy-menu.component.css']\r\n})\r\n\r\nexport class PolicyMenuComponent implements OnInit, OnDestroy { \r\n private ngUnsubscribe = new Subject();\r\n user: UserPerson;\r\n\r\n constructor(\r\n private userService: UserService,\r\n private authService: AuthService,\r\n private messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n ) { \r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.authService.isLoggedIn()) {\r\n this.userService.getUserPersonLoggedIn()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(p => {\r\n if (p)\r\n this.user = p;\r\n });\r\n }\r\n\r\n // On SSO when the ngOnInit the user is not yet logged in, so for those cases we will subscribe to this event\r\n this.messageBusService.onLoginCompleted()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(msg => {\r\n if (msg.user) \r\n this.user = msg.user;\r\n });\r\n\r\n this.messageBusService.onLogout()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(msg => {\r\n this.user = null as any; \r\n });\r\n } \r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n getUserName() {\r\n return this.user.nombre + \" \" + this.user.apellido;\r\n }\r\n\r\n policyTrackBy(index : number, item: Policy){\r\n return item.numeroPoliza; \r\n }\r\n\r\n}\r\n","\n
\n \n \n \n \n \n \n
\n {{ 'headerSura.text1' | translate:locale.language | uppercase }}\n
\n
","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { Direction } from 'src/app/shared/enums/direction.enum';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'app-header-sura',\n templateUrl: './header-sura.component.html',\n styleUrls: ['./header-sura.component.css']\n})\n@ComponentLookup('HeaderSuraComponent')\nexport class HeaderSuraComponent implements OnInit, OnDestroy, IControlComponent {\n data: FormComponentData;\n\n showHeaderSmall:boolean = false;\n lastHeaderChangeTime : Date = new Date();\n hideHeader = false;\n urlCompany:string;\n userLoggedIn = false;\n\n private ngUnsubscribe = new Subject();\n\n constructor(\n private baseService:BaseService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private layoutService: LayoutService,\n public dialog: MatDialog,\n private router: Router,\n private userService: UserService,\n private authService: AuthService, \n private messageBusService: MessageBusService, \n private route : ActivatedRoute\n ) {\n\n this.layoutService.scrollingBodySource$\n .subscribe((dir:Direction)=>{ \n let showSmall = dir === Direction.Down;\n\n if (showSmall != this.showHeaderSmall) {\n let timeDiff = (new Date().getTime() - this.lastHeaderChangeTime.getTime());\n\n // This will prevent a case in wich when header show/hide the scroll change and the animation enter in a loop\n if (timeDiff >= 500)\n this.lastHeaderChangeTime = new Date();\n else\n return;\n }\n\n this.showHeaderSmall = showSmall;\n });\n }\n\n ngOnInit(): void {\n this.urlCompany = this.baseService.getUrlCompany();\n\n // Get QS parameters\n this.route.queryParams\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(params => {\n if (params && params.hideHeader === \"true\")\n this.hideHeader = true;\n });\n\n if (this.authService.isLoggedIn()) {\n this.userService.getUserPersonLoggedIn()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(p => {\n if (p)\n this.userLoggedIn = true;\n });\n }\n\n // On SSO when the ngOnInit the user is not yet logged in, so for those cases we will subscribe to this event\n this.messageBusService.onLoginCompleted()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n this.userLoggedIn = true;\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n openMenuMobile(){\n const dialogRef = this.dialog.open(MenuMobileComponent, {\n panelClass: \"menu-mobile\"\n });\n }\n\n goToHome() {\n this.router.navigate(['/'], { });\n }\n}\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\n\n@Component({\n selector: 'app-virtual-consultation-linkbox',\n templateUrl: './virtual-consultation-linkbox.component.html',\n styleUrls: ['./virtual-consultation-linkbox.component.css']\n})\n@ComponentLookup('VirtualConsultationLinkboxComponent')\nexport class VirtualConsultationLinkboxComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n\n constructor(\n private router: Router,\n private baseService: BaseService,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnInit(): void {\n }\n\n navigate(){\n let path = this.baseService.getRouteLinkByArea(3458);\n this.router.navigate(['/' + path]);\n }\n}\n","\n \n \n

{{ 'shared.virtualConsultationLinkbox.title' | translate:locale.language | uppercase }}

\n {{ 'shared.virtualConsultationLinkbox.description' | translate:locale.language }}\n \n
\n
\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\n\n@Component({\n selector: 'app-medical-appointments-linkbox',\n templateUrl: './medical-appointments-linkbox.component.html',\n styleUrls: ['./medical-appointments-linkbox.component.css']\n})\n@ComponentLookup('MedicalAppointmentsLinkboxComponent')\nexport class MedicalAppointmentsLinkboxComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n\n constructor(\n private router: Router,\n private baseService: BaseService,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnInit(): void {\n }\n \n navigate(){\n let path = this.baseService.getRouteLinkByArea(3459);\n this.router.navigate(['/' + path]);\n }\n}\n","\n \n \n

{{ 'shared.medicalAppointmentsLinkbox.title' | translate:locale.language | uppercase }}

\n {{ 'shared.medicalAppointmentsLinkbox.description' | translate:locale.language }}\n \n
\n
\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\n\n@Component({\n selector: 'app-results-linkbox',\n templateUrl: './results-linkbox.component.html',\n styleUrls: ['./results-linkbox.component.css']\n})\n@ComponentLookup('ResultsLinkboxComponent')\nexport class ResultsLinkboxComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n\n constructor(\n private router: Router,\n private baseService: BaseService,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnInit(): void {\n }\n\n navigate(){\n let path = this.baseService.getRouteLinkByArea(3460);\n this.router.navigate(['/' + path]);\n }\n}\n","\n \n \n

{{ 'shared.resultsLinkbox.title' | translate:locale.language | uppercase }}

\n {{ 'shared.resultsLinkbox.description' | translate:locale.language }}\n \n
\n
\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\n\r\n@Component({\r\n selector: 'app-historia-clinica-linkbox',\r\n templateUrl: './historia-clinica-linkbox.component.html',\r\n styleUrls: ['./historia-clinica-linkbox.component.css']\r\n})\r\n@ComponentLookup('HistoriaClinicaLinkboxComponent')\r\nexport class HistoriaClinicaLinkboxComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n constructor(\r\n private router: Router,\r\n private baseService: BaseService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n navigate(){\r\n let path = this.baseService.getRouteLinkByArea(3462);\r\n this.router.navigate(['/' + path]);\r\n }\r\n}\r\n","\r\n \r\n \r\n

{{ 'shared.historiaClinicaLinkbox.title' | translate:locale.language | uppercase }}

\r\n {{ 'shared.historiaClinicaLinkbox.description' | translate:locale.language }}\r\n \r\n
\r\n
","import { Component, Inject, OnInit } from '@angular/core';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\n\n@Component({\n selector: 'app-unread-clinical-exam',\n templateUrl: './unread-clinical-exam.component.html',\n styleUrls: ['./unread-clinical-exam.component.css']\n})\n@ComponentLookup('UnreadClinicalExamComponent')\nexport class UnreadClinicalExamComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n \n constructor(@Inject(L10N_LOCALE) public locale: L10nLocale) { }\n\n ngOnInit(): void {\n }\n}\n","\n
\n \n \n

Examen de glucosa en sangre

\n
\n \n Fecha de realizaciĆ³n del examen: 17/12/2020\n
\n \n
\n
\n","export class ClinicConcept {\n id: number = 0;\n nombre: string = '';\n idTerminoReferencia: number = 0;\n valorTerminoReferencia: string = '';\n idFuenteReferencia: number = 0;\n nombreClase: string = '';\n valorRutaNavegacion: string = '';\n idReferenciaConcepto: number = 0;\n idTipoConcepto: number;\n nombreTipoConcepto: string = '';\n nombreFuenteReferencia: string = '';\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { ClinicConcept } from 'src/app/shared/models/cdr/clinic-concept.model';\nimport { BaseService } from './base.service';\nimport { HttpBaseService } from './http-base-service';\nimport { LogService } from './log.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ClinicalConceptService {\n\n constructor(\n private http: HttpBaseService,\n private baseService: BaseService,\n private logService: LogService\n ) { }\n\n getSymptoms(text: string): Observable{\n\n this.logService.logVerbose(\"getSymptoms: \" + text);\n\n if(!text) return of([]);\n\n let language = this.baseService.getLanguage();\n\n return this.http.get(\"api/conceptos-clinicos/sintomas?localizacion=\" + language + \"&textoBusqueda=\" + encodeURIComponent(text));\n }\n\n getFrequentSymptoms():Observable{\n let language = this.baseService.getLanguage();\n\n return this.http.get(\"api/conceptos-clinicos/sintomas/frecuentes?localizacion=\" + language);\n }\n\n getInsuraceConcepts():Observable{\n let language = this.baseService.getLanguage();\n\n return this.http.get(\"api/conceptos-clinicos/aseguradoras?localizacion=\" + language, null, false);\n }\n}\n","
\n
\n \n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n
\n \n
\n\n
\n \n \n \n clear\n {{ symptom.nombre }}\n \n \n \n \n \n \n \n {{ symptom.nombre }}\n \n \n {{ 'shared.selectSymptoms.mandatoryFieldText' | translate:locale.language }}\n \n\n \n {{ 'shared.selectSymptoms.frequentSymptomsLabelText' | translate:locale.language }}\n \n {{ frequentSymptom.nombre }}\n \n \n \n
\n\n
\n
{{ 'shared.selectSymptoms.virtualAttentionQueue' | translate:locale.language }}
\n
{{ 'shared.selectSymptoms.virtualAttentionActive' | translate:locale.language }}
\n
{{ 'shared.selectSymptoms.finishedAttention' | translate:locale.language }}
\n\n \n \n\n \n
","import { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { Component, ElementRef, Inject, Input, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { MatAutocomplete, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatChipInputEvent } from '@angular/material/chips';\nimport { MatDialog } from '@angular/material/dialog';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ClinicalConceptService } from 'src/app/core/services/clinical-concept.service';\nimport { ComponentFinishLoadingMessage, FormConfigurationMessage, LoadChatMessage, MessageBusService, OpenChatMessage, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\nimport { ChatSignalRService } from 'src/app/core/services/signalR/chat-signalr.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { VirtualAttentionService } from 'src/app/core/services/virtual-attention.service';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { ClinicConcept } from '../../models/cdr/clinic-concept.model';\nimport { DialogData } from '../../models/dialog-data.model';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { FormConfiguration } from '../../models/people/form.model';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { VirtualAttention } from '../../models/process/virtual-attention.model';\nimport { ConfirmDialogComponent } from '../dialogs/confirm-dialog/confirm-dialog.component';\nimport { GoogleAnalyticsService } from 'src/app/core/services/google-analytics.service';\n\n@Component({\n selector: 'app-select-symptoms',\n templateUrl: './select-symptoms.component.html',\n styleUrls: ['./select-symptoms.component.css'],\n encapsulation: ViewEncapsulation.None,\n providers: [ChatSignalRService]\n})\n@ComponentLookup('SelectSymptomsComponent')\nexport class SelectSymptomsComponent implements OnInit, OnDestroy, IControlComponent {\n private ngUnsubscribe = new Subject();\n data: FormComponentData;\n selectable = true;\n removable = true;\n addOnBlur = true;\n separatorKeysCodes: number[] = [ENTER, COMMA];\n symptomCtrl = new FormControl();\n filteredSymptoms$: Observable;\n frequentSymptoms: ClinicConcept[] = [];\n symptoms: ClinicConcept[] = [];\n selectedFrequentSymptoms: ClinicConcept[] = [];\n existsResults: boolean = false;\n dropdownAbovePosition: boolean = false;\n autoCompleteOpen = false;\n virtualAttention : VirtualAttention;\n loaded = false;\n loggedUser: UserPerson; \n hasAgentMessage = false;\n virtualAttentionFinished = false;\n\n @Input() parentData: FormComponentData;\n\n @ViewChild('symptomInput') symptomInput: ElementRef;\n @ViewChild('auto') matAutocomplete: MatAutocomplete;\n\n constructor(\n private clinicalConceptService: ClinicalConceptService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n public dialog: MatDialog,\n private translation: L10nTranslationService,\n private baseService: BaseService,\n private messageBusService: MessageBusService,\n private virtualAttentionService : VirtualAttentionService,\n private userService: UserService,\n private googleAnalyticsService: GoogleAnalyticsService,\n private signalRService: ChatSignalRService\n ) {\n this.filteredSymptoms$ = this.symptomCtrl.valueChanges\n .pipe(\n debounceTime(300),\n switchMap(value => this.clinicalConceptService.getSymptoms(value)\n .pipe(\n map(symptoms => {\n\n let filteredSymptoms = symptoms ? symptoms.filter(item => {\n let symptomSelectedIds = this.symptoms.map(s => s.id);\n return symptomSelectedIds.indexOf(item.id) === -1;\n }): [];\n\n this.existsResults = filteredSymptoms.length > 0;\n\n return filteredSymptoms;\n })\n )\n )\n );\n }\n\n ngOnInit(): void {\n if (!this.data)\n this.data = this.parentData;\n\n this.clinicalConceptService.getFrequentSymptoms()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(frequentSymptoms => {\n this.frequentSymptoms = frequentSymptoms;\n },\n (error : any)=> {\n this.showErrorDialog(); \n });\n\n let _this = this;\n setTimeout(function() {\n _this.checkActiveVirtualAttention();\n }, 10);\n \n // If the chat was cancelled\n this.messageBusService.onChatCancelled()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n this.virtualAttention = null as any;\n this.configureForm(true); \n });\n\n this.messageBusService.onChatLoaded()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(m => {\n this.hasAgentMessage = m.hasAgentMessage;\n });\n\n this.messageBusService.onOnVirtualRequestFinished()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(m => {\n this.virtualAttentionFinished = true;\n });\n\n this.userService.getUserPersonLoggedIn()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(logged => {\n if (logged) {\n this.loggedUser = logged; \n }\n }); \n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n \n goToPastVirtualAttentions() {\n this.virtualAttentionFinished = false;\n this.virtualAttention = null as any;\n this.messageBusService.goToPastVirtualRequests();\n }\n\n checkActiveVirtualAttention() {\n // Get active virtual atenttion\n this.virtualAttentionService.getActive()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(va => {\n if (va) { \n this.configureForm();\n \n let msg = new LoadChatMessage();\n msg.idEtapaSolicitud = va.idEtapaSolicitud;\n this.messageBusService.loadChat(msg);\n\n this.messageBusService.openChat(new OpenChatMessage());\n }\n\n this.virtualAttention = va;\n\n // Send event to parent indicating that this control finish loading\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n\n this.loaded = true; \n }, \n (error : any)=> {\n this.showErrorDialog();\n\n this.loaded = true;\n }); \n }\n\n configureForm(showItems: boolean = false) {\n // Send form configuration event\n let config = new FormConfiguration();\n\n config.formId = this.data.idFormulario;\n config.showFormTitle = true;\n config.showFormSubtitle = showItems;\n config.showControlTitle = showItems;\n\n let msg = new FormConfigurationMessage();\n msg.config = config;\n\n this.messageBusService.setFormConfiguration(msg);\n }\n\n addSymptom(event: MatChipInputEvent): void {\n const input = event.input;\n const value = event.value;\n\n if ((value || '').trim()) {\n var currentSymptom = value.trim();\n\n if (this.symptoms.filter(s=> s.nombre.toLowerCase() == currentSymptom.toLowerCase()).length == 0) {\n let newSymptom = new ClinicConcept();\n newSymptom.nombre = currentSymptom;\n newSymptom.idTipoConcepto = 1866; // concepto = sintomas\n newSymptom.nombreTipoConcepto = \"SĆ­ntomas\";\n newSymptom.id = 0;\n newSymptom.idFuenteReferencia = 15;\n newSymptom.idTerminoReferencia = 0;\n\n this.symptoms.push(newSymptom);\n }\n }\n\n if (input) {\n input.value = '';\n }\n }\n\n addSymptomClick(){ \n let value = this.symptomCtrl.value;\n \n if ((value || '').trim()) {\n value = value.trim();\n\n if (this.symptoms.filter(s => s.nombre.toLowerCase() == value.toLowerCase()).length == 0) {\n let newSymptom = new ClinicConcept();\n newSymptom.nombre = value.trim();\n newSymptom.idTipoConcepto = 1866; // concepto = sintomas\n newSymptom.nombreTipoConcepto = \"SĆ­ntomas\";\n newSymptom.id = 0;\n newSymptom.idFuenteReferencia = 15;\n newSymptom.idTerminoReferencia = 0;\n \n this.symptoms.push(newSymptom);\n }\n }\n if (this.symptomCtrl.value) { \n //this.symptomCtrl.setValue(null);\n this.symptomInput.nativeElement.value = '';\n this.symptomInput.nativeElement.focus();\n }\n }\n\n removeSymptom(symptom: ClinicConcept): void{\n const index = this.symptoms.indexOf(symptom, 0);\n if (index > -1) {\n this.symptoms.splice(index, 1);\n }\n }\n\n selected(event: MatAutocompleteSelectedEvent): void {\n\n var currentSymptom = event.option.value;\n\n if (currentSymptom) {\n // remove if another one has the same name.\n var symptomName = currentSymptom.nombre.trim();\n\n this.symptoms = this.symptoms.filter(s=> s.nombre.toLowerCase() != symptomName.toLowerCase());\n\n this.symptoms.push(currentSymptom);\n }\n\n this.symptomInput.nativeElement.value = '';\n this.symptomCtrl.setValue(null);\n this.existsResults = false;\n }\n \n autocompleteOpened():void{\n\n if (this.matAutocomplete.panel && this.matAutocomplete.panel.nativeElement) {\n const parentPanelContainer = this.matAutocomplete.panel.nativeElement.parentNode;\n\n if(parentPanelContainer){\n const classList = parentPanelContainer.classList.value.split(' ');\n this.dropdownAbovePosition = classList.filter((c:string) => c == 'mat-autocomplete-panel-above').length > 0; \n }\n } \n\n this.autoCompleteOpen = true;\n }\n\n autocompleteClosed() {\n this.autoCompleteOpen = false;\n }\n\n isSelectedFrequentSymptom(frequentSymptom: ClinicConcept): boolean {\n const index = this.selectedFrequentSymptoms.indexOf(frequentSymptom);\n return index >= 0;\n }\n\n toggleFrequentSymptom(frequentSymptom: ClinicConcept): void {\n let index = this.selectedFrequentSymptoms.indexOf(frequentSymptom);\n\n if (index >= 0) {\n this.selectedFrequentSymptoms.splice(index, 1);\n } else {\n this.selectedFrequentSymptoms.push(frequentSymptom);\n }\n }\n\n onClickStartConsultation(): void {\n if(this.symptoms.length == 0 && this.selectedFrequentSymptoms.length == 0){\n this.openEmptySymptomsDialog();\n }\n else{\n this.openPoliciesDialog();\n }\n }\n\n private openPoliciesDialog() {\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"shared.selectSymptoms.policiesDialog.title\");\n dialogData.message = this.translation.translate(\"shared.selectSymptoms.policiesDialog.body\");\n dialogData.confirmText = this.translation.translate(\"shared.selectSymptoms.policiesDialog.confirmButtonText\");\n dialogData.cancelText = this.translation.translate(\"shared.selectSymptoms.policiesDialog.cancelButtonText\");\n\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n data: dialogData\n });\n\n dialogRef.afterClosed().subscribe(acceptedPolicies => {\n if(acceptedPolicies) {\n this.startClinicalContact();\n }\n });\n }\n\n private openEmptySymptomsDialog() {\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"shared.selectSymptoms.emptySymptomsDialog.title\");\n dialogData.message = this.translation.translate(\"shared.selectSymptoms.emptySymptomsDialog.body\");\n dialogData.confirmText = this.translation.translate(\"shared.selectSymptoms.emptySymptomsDialog.confirmButtonText\");\n dialogData.showCancelButton = false;\n dialogData.colorConfirmButton = \"accent\";\n\n this.dialog.open(ConfirmDialogComponent, { data: dialogData });\n }\n\n private startClinicalContact(){\n\n let allSelectedSymptoms = this.symptoms.concat(this.selectedFrequentSymptoms.filter(s => this.symptoms.find(sy => sy.id == s.id) == null)); \n \n let idEmpresaDestinoConsultaVirtual = this.baseService.getDirectory().idEmpresaDestinoConsultaVirtual;\n let idEmpresaDestino = idEmpresaDestinoConsultaVirtual ? idEmpresaDestinoConsultaVirtual : this.baseService.getCompanyId();\n let idAreaSistemaDestinoConsultaVirtual = this.baseService.getDirectory().idAreaSistemaDestinoConsultaVirtual;\n let nombreEmisor = this.loggedUser.nombre + ' ' + this.loggedUser.apellido;\n let urlImagenEmisor = this.loggedUser.ubicacionLogo;\n let email = this.loggedUser.emailParticular;\n\n this.loaded = false;\n\n // Post user active so the user shows as online when the Virtual attention is created\n this.userService.postUserActive(idEmpresaDestino, -1).subscribe(() => {\n },\n error => {\n this.baseService.handleServiceError(error, \"Error posting user active\"); \n });\n\n this.virtualAttentionService.startVirtualAttention(\n idEmpresaDestino,\n idAreaSistemaDestinoConsultaVirtual,\n allSelectedSymptoms,\n nombreEmisor,\n urlImagenEmisor,\n email)\n .subscribe(\n idEtapaSolicitud => {\n this.selectedFrequentSymptoms = [];\n this.symptoms = [];\n\n // Get active virtual attention and load chat \n this.checkActiveVirtualAttention();\n\n this.googleAnalyticsService.sendEventInitVirtualConsultation();\n }, \n (error : any)=> {\n this.showErrorDialog();\n this.loaded = true;\n }\n ); \n }\n\n showErrorDialog() {\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"shared.selectSymptoms.errorDialog.title\");\n dialogData.message = this.translation.translate(\"shared.selectSymptoms.errorDialog.description\");\n dialogData.confirmText = this.translation.translate(\"shared.selectSymptoms.errorDialog.btnText\");\n dialogData.showCancelButton = false;\n dialogData.colorConfirmButton = \"accent\";\n\n this.dialog.open(ConfirmDialogComponent, { data: dialogData });\n } \n}","import { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: \"orderBy\"\r\n})\r\nexport class OrderByPipe implements PipeTransform { \r\n\r\n transform(array: any, field: string, order?: string): any[] {\r\n if (!Array.isArray(array)) {\r\n return array;\r\n }\r\n\r\n array.sort((a: any, b: any) => {\r\n let result: number;\r\n\r\n if (a[field] < b[field]) {\r\n result = -1;\r\n } else if (a[field] > b[field]) {\r\n result = 1;\r\n } else {\r\n result = 0;\r\n }\r\n\r\n return order == \"desc\"? result * -1 : result;\r\n });\r\n\r\n return array;\r\n }\r\n}","","import { Component, Inject, Input, OnChanges, OnDestroy, OnInit, PLATFORM_ID, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { MediaChange, MediaObserver } from '@angular/flex-layout';\nimport { Router } from '@angular/router';\nimport { Observable, Subject } from 'rxjs';\nimport { map, takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { Link } from '../../models/people/link.model';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { MatDialog } from '@angular/material/dialog';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'menu-link',\n templateUrl: './menu-link.component.html',\n styleUrls: ['./menu-link.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class MenuLinkComponent implements OnChanges, OnInit, OnDestroy {\n ID_AREA_SISTEMA_MIS_CITAS: number = 3459;\n ID_AREA_SISTEMA_MI_SALUD: number = 4240;\n\n expanded: boolean = true;\n hasOptions = false;\n showNotification: boolean = false;\n notificationValue: number = 0;\n private ngUnsubscribe = new Subject();\n\n @Input() link: Link;\n isMobile$: Observable;\n\n constructor(\n private router: Router,\n private baseService: BaseService,\n private mediaObserver: MediaObserver,\n private layoutService: LayoutService,\n private messageBusService: MessageBusService,\n private appointmentService: AppointmentService,\n private authService: AuthService,\n @Inject(L10N_LOCALE) public locale: L10nLocale, \n public dialog: MatDialog,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.isMobile$ = this.mediaObserver\n .asObservable()\n .pipe(\n map((changes) =>\n changes.some(\n (change: MediaChange) => change.mqAlias === \"lt-md\"\n )\n )\n );\n\n this.messageBusService.onToggleBottomSheetSubject()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(this.onToggleBottomSheetSubjectNext.bind(this));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.link) {\n if (this.link.idAreaSistema == this.ID_AREA_SISTEMA_MI_SALUD) {\n this.expanded = false;\n this.hasOptions = false;\n } else {\n this.hasOptions = this.link.subMenu?.length > 0;\n }\n } \n }\n\n private onToggleBottomSheetSubjectNext(args: { action: string, component?: any}) {\n const menuItem: Element | null = document.querySelector('.mi-salud > a');\n if (args.action == 'open') {\n menuItem?.classList.add('active', 'open');\n } else\n menuItem?.classList.remove('active', 'open');\n }\n\n ngOnInit(): void {\n this.messageBusService.onLoginCompleted()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n if (this.link.idAreaSistema == this.ID_AREA_SISTEMA_MIS_CITAS) {\n this.getAppointments();\n }\n }\n );\n\n if (!this.authService.isLoggedIn()) {\n return;\n }\n \n if (isPlatformBrowser(this.platformId) && this.link.idAreaSistema == this.ID_AREA_SISTEMA_MIS_CITAS) {\n this.getAppointments();\n } \n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n getAppointments() {\n this.appointmentService.getAppointmentsWithCache(this.locale.language)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(\n appointments => {\n this.showNotification = appointments.cantidadCitasFuturas > 0;\n this.notificationValue = appointments.cantidadCitasFuturas;\n },\n error =>{\n console.error(\"Error getting appointments\", error);\n }\n );\n\n this.messageBusService.onAppointmentChangeReceived()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(\n appointment => {\n this.showNotification = appointment.cantidadCitasFuturas > 0;\n this.notificationValue = appointment.cantidadCitasFuturas;\n }\n ); \n }\n\n onLinkSelected(link:Link): void {\n const isMiSalud = this.link.idAreaSistema == this.ID_AREA_SISTEMA_MI_SALUD;\n if (isMiSalud || !link.subMenu?.length) {\n let linkUrl = link.identificadorUrl;\n \n // For search result lets add the current URL to the paremerters\n if (link.identificadorUrl.startsWith(\"busqueda\")) {\n linkUrl += (linkUrl.indexOf(\"?\") > 0? \"&\" : \"?\") + \"rUrl=\" + this.router.url;\n }\n \n this.baseService.goToRoute(linkUrl);\n this.layoutService.postNavigate();\n }\n\n if (link.subMenu?.length && !isMiSalud) {\n this.expanded = !this.expanded;\n }\n }\n\n isLinkActive(link:Link){ \n let url = this.router.url.substr(1).split(\"/\")[0].split(\"?\")[0];\n\n if (!url)\n url = \"inicio\";\n\n return this.baseService.getBasePath(link.identificadorUrl) == url;\n }\n\n isSublinkActive(link:Link){\n let url = this.router.url.substr(1).split(\"/\")[0].split(\"?\")[0];\n\n if (!url)\n url = \"inicio\";\n\n return link.subMenu && link.subMenu.length > 0\n ? link.subMenu.filter(sublink => this.baseService.getBasePath(sublink.identificadorUrl) == url).length > 0\n : false;\n }\n\n getTooltip(link:Link) {\n return link.tooltip? link.tooltip : \"\";\n }\n\n getIconName(link:Link) {\n let isLinkActive = this.isLinkActive(link);\n let iconName = link.nombreIcono;\n\n if (isLinkActive) {\n switch(link.nombreIcono) {\n case \"PHR-inicio-1\":\n iconName = \"PHR-inicio-2\";\n break;\n case \"PHR-date-2\":\n iconName = \"PHR-date-1\";\n break;\n case \"PHR-buscar\":\n iconName = \"PHR-buscar-2\";\n break;\n case \"fav\":\n iconName = \"favfill\";\n break;\n }\n }\n\n return iconName;\n }\n\n}\n","
\n
\n

{{ 'menu.title' | translate:locale.language }}

\n \n \n {{ 'menu.backLinkText' | translate:locale.language }}\n \n
\n \n \n
\n \n \n \n \n \n {{ (user$|async)?.nombre + ' ' + (user$|async)?.apellido }}\n keyboard_arrow_down\n \n \n\n \n \n \n
\n \n
\n \n
\n
\n\n \n\n \n \n \n \n \n
\n","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MediaChange, MediaObserver } from '@angular/flex-layout';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { Observable, Subject } from 'rxjs';\nimport { map, takeUntil } from 'rxjs/operators';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { Link } from '../../models/people/link.model';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'app-menu',\n templateUrl: './menu.component.html',\n styleUrls: ['./menu.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('MenuComponent')\nexport class MenuComponent implements OnInit, OnDestroy {\n private ngUnsubscribe = new Subject();\n urlBack:string;\n links: Link[];\n isMobile$: Observable;\n user$: Observable; \n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private mediaObserver: MediaObserver,\n private appStorageService: AppStorageService,\n private baseService: BaseService,\n private translation: L10nTranslationService,\n private layoutService: LayoutService,\n private userService: UserService,\n private authService: AuthService,\n private router: Router\n ) {\n\n this.translation.onChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe({\n next: (locale: L10nLocale) => {\n\n let menuLanguage = this.appStorageService.getItem(STORAGE.MENU_LANGUAGE);\n\n if(locale.language != menuLanguage)\n this.populateLinks(locale.language);\n }\n });\n\n this.translation.onError()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe({\n next: (error: any) => {\n if (error) console.log(error);\n }\n });\n\n this.isMobile$ = this.mediaObserver\n .asObservable()\n .pipe(\n map((changes) =>\n changes.some(\n (change: MediaChange) => change.mqAlias === \"lt-md\"\n )\n )\n );\n }\n\n ngOnInit(): void {\n this.links = this.appStorageService.getItemSession(STORAGE.MENU, true);\n this.urlBack = this.baseService.getBackUrlCompany();\n\n this.user$ = this.userService.getUserPersonLoggedIn(); \n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n hideUrlBack(){\n return !this.urlBack;\n }\n\n onBackClick() {\n // Get directory\n let directory = this.baseService.getDirectory();\n\n // Logout\n this.authService.logout();\n\n // Redirect to directory corporate url\n this.router.navigate([directory.urlCorporativo]);\n }\n\n populateLinks(language: string){\n this.baseService.getMenuLinks(language)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(data => {\n if (!data || data.length == 0)\n return;\n \n this.links = data;\n\n this.appStorageService.setItem(STORAGE.MENU_LANGUAGE, language);\n });\n }\n}\n","
\n
\n \n
\n
{{ 'shared.myHealth.title' | translate:locale.language }}
\n \n \n \n
\n
\n
\n
\n {{user.nombre}}\n {{'shared.myHealth.relationship1' | translate:locale.language}}\n
\n
\n \n
\n \n \n
\n
\n
\n
\n {{dependent.nombre.toLowerCase()}}\n {{'shared.myHealth.relationship2' | translate:locale.language: { relacion: dependent.relationshipName } }}\n
\n
\n \n
\n \n \n
\n
\n \n
\n {{'shared.myHealth.addFamily' | translate:locale.language}}\n
\n
\n
\n
\n
","import { Component, Inject, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { Link } from '../../models/people/link.model';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { Subject, zip } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { ProfileMenuDependentModel } from '../menu/profile/profile-menu.component';\nimport { SystemAreas } from '../../enums/system-areas.enum';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { ConfigurationPageDialogModel } from '../dialogs/route-dialog/route-dialog.component';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { Platform } from '@angular/cdk/platform';\nimport { ActivatedRoute, ParamMap, Params, Router } from '@angular/router';\nimport { Location } from '@angular/common';\nimport { Dependent } from '../../models/people/dependent.model';\nimport { MatTabGroup } from '@angular/material/tabs';\n\n@Component({\n selector: 'app-my-health',\n templateUrl: './my-health.component.html',\n styleUrls: ['./my-health.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('MyHealthComponent')\nexport class MyHealthComponent implements OnDestroy, OnInit {\n @ViewChild('tabGroup') tabGroup!: MatTabGroup;\n user: UserPerson;\n dependents: ProfileMenuDependentModel[] = [];\n\n loading: boolean;\n loadingDependents: boolean;\n selectedTabIndex: number = 0;\n\n items: Link[] = [];\n private ngUnsubscribe = new Subject();\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private appStorageService: AppStorageService,\n private baseService: BaseService,\n private userService: UserService,\n private utilsService: UtilsService,\n private routeDialogService: RouteDialogService,\n private messageBusService: MessageBusService,\n private layoutService: LayoutService,\n private router: Router,\n private route: ActivatedRoute,\n public platform: Platform,\n ) { }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n ngOnInit(): void {\n const links: Link[] = this.appStorageService.getItemSession(STORAGE.MENU, true);\n const link = links.find(x => x.idAreaSistema == SystemAreas.MI_SALUD);\n this.items = link?.subMenu || [];\n\n this.loadData();\n\n this.messageBusService.onRefreshProfileMenu()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(m => {\n this.loadData();\n }\n );\n }\n\n onLinkSelected(link:Link, patientId?: number){\n let linkUrl = link.identificadorUrl;\n\n if (patientId){\n linkUrl += `?p=${patientId}`;\n }\n \n this.baseService.goToRoute(linkUrl);\n this.layoutService.postNavigate();\n }\n\n onAddFamily(event:any){\n event.stopPropagation();\n \n let routeDialogModel = new ConfigurationPageDialogModel();\n routeDialogModel.route = \"configuracion/dependiente/edicion/0\";\n routeDialogModel.state = null;\n\n this.routeDialogService.openDialog(routeDialogModel);\n }\n\n setTabSelected(event: any){\n if(this.loading)\n return;\n\n if(event.index == (this.dependents.length + 1)){\n return;\n }\n else{\n this.router.navigate([], {\n relativeTo: this.route,\n queryParams: { p: event.index == 0 ? null : this.dependents[event.index - 1].idPersona },\n queryParamsHandling: 'merge'\n });\n }\n }\n\n private loadData(){\n this.loading = true;\n\n const _getUserLoggedIn$ = this.userService.getUserPersonLoggedIn();\n const _getUserDependents$ = this.userService.getUserDependents();\n const _queryParams$ = this.route.queryParamMap;\n\n zip(_getUserLoggedIn$, _getUserDependents$, _queryParams$)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(([user, dependents, paramMap])=>{ \n this.loadUserData(user);\n this.loadDepedentsData(dependents);\n this.configTabIndexByParam(paramMap);\n\n this.loading = false;\n });\n }\n\n private loadUserData(user:UserPerson | null){\n if(!user)\n return;\n\n this.user = user;\n\n let birthDate = this.user.fechaNacimiento \n ? new Date(this.user.fechaNacimiento) \n : null;\n\n if (!this.user.ubicacionLogo)\n this.user.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(birthDate, this.user.sexo); \n }\n\n private loadDepedentsData(dependents: Dependent[]){\n this.dependents = dependents as ProfileMenuDependentModel[];\n\n // Order by age desc\n this.dependents = this.dependents.sort((d1: ProfileMenuDependentModel, d2: ProfileMenuDependentModel) => {\n let getTime = (date: Date) => {return date != null ? new Date(date).getTime() : 0;};\n \n return getTime(d1.fechaNacimiento) - getTime(d2.fechaNacimiento);\n });\n\n this.dependents.forEach(dependent => {\n dependent.fullName = dependent.nombre + \" \" + dependent.apellido; \n dependent.relationshipName = this.userService.getDependentRelationshipName(dependent);\n\n let birthDate = dependent.fechaNacimiento\n ? new Date(dependent.fechaNacimiento) \n : null;\n\n if (!dependent.ubicacionLogo)\n dependent.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(birthDate, dependent.sexo);\n });\n }\n\n private configTabIndexByParam(paramMap:ParamMap){\n\n const idPersona = paramMap.get('p');\n\n if(!idPersona)\n return;\n\n const indexDependent = this.dependents.findIndex(d => d.idPersona === +idPersona);\n\n if(indexDependent != -1){\n this.selectedTabIndex = indexDependent + 1;\n }\n }\n}\n","
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n","import { Component, Inject, OnDestroy, OnInit, Type, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\r\nimport { LayoutService } from 'src/app/core/services/layout.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { Link } from 'src/app/shared/models/people/link.model';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { UtilsService } from 'src/app/core/services/utils.service';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { Breakpoints, MediaMatcher } from '@angular/cdk/layout';\r\nimport { ProfileMenuComponent } from '../profile/profile-menu.component';\r\nimport { MyHealthComponent } from '../../my-health/my-health.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-menu',\r\n templateUrl: './cliniweb-menu.component.html',\r\n styleUrls: ['./cliniweb-menu.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('CliniwebMenuComponent')\r\nexport class CliniwebMenuComponent implements OnInit, OnDestroy {\r\n private ngUnsubscribe = new Subject();\r\n private cargando = false;\r\n ID_AREA_SISTEMAS_MI_SALUD = 4240;\r\n links: Link[];\r\n loggedInUser: UserPerson = null as any;\r\n profileMenuOpen: boolean = false\r\n miSaludMenuOpen = false;\r\n @ViewChild(MatMenuTrigger) profileFloatingMenuTrigger: MatMenuTrigger;\r\n\r\n constructor(\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private appStorageService: AppStorageService,\r\n private translation: L10nTranslationService,\r\n private baseService: BaseService,\r\n private layoutService: LayoutService,\r\n private userService: UserService,\r\n private utilsService: UtilsService,\r\n private messageBusService: MessageBusService,\r\n private mediaMatcher: MediaMatcher\r\n ) {\r\n\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: (locale: L10nLocale) => {\r\n\r\n let menuLanguage = this.appStorageService.getItem(STORAGE.MENU_LANGUAGE);\r\n\r\n if(locale.language != menuLanguage)\r\n this.populateLinks(locale.language);\r\n }\r\n });\r\n\r\n this.translation.onError()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: (error: any) => {\r\n if (error) console.log(error);\r\n }\r\n });\r\n\r\n this.messageBusService.onLoginCompleted()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(msg => {\r\n if (msg.user) {\r\n this.loadProfile();\r\n } \r\n });\r\n\r\n this.messageBusService.onToggleBottomSheetSubject()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(this.onToggleBottomSheetSubjectNext.bind(this));\r\n }\r\n\r\n private onToggleBottomSheetSubjectNext(args: { action: string, component?: any}) {\r\n if (this.cargando) return;\r\n this.cargando = true;\r\n this.miSaludMenuOpen = args.action == 'open' && args.component === MyHealthComponent;\r\n this.profileMenuOpen = args.action === 'open' && args.component === ProfileMenuComponent;\r\n setTimeout(() => this.cargando = false, 100);\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.links = this.appStorageService.getItemSession(STORAGE.MENU, true);\r\n this.links = this.links.map(x => {\r\n const {idAreaSistema, subMenu, ...resto} = x;\r\n return x.idAreaSistema == this.ID_AREA_SISTEMAS_MI_SALUD ? ({...resto, idAreaSistema, subMenu: []}) : x\r\n });\r\n\r\n this.userService.getUserPersonLoggedIn()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(p => {\r\n if (!p)\r\n return;\r\n \r\n this.loggedInUser = p;\r\n\r\n if (!this.loggedInUser.ubicacionLogo) {\r\n let feNacimiento = this.loggedInUser.fechaNacimiento? new Date(this.loggedInUser.fechaNacimiento) : null;\r\n this.loggedInUser.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(feNacimiento, this.loggedInUser.sexo);\r\n }\r\n\r\n setTimeout(() => {\r\n this.profileFloatingMenuTrigger.menuOpened\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(() => {\r\n this.profileMenuOpen = true;\r\n this.layoutService.overflowBodyDisabled();\r\n });\r\n this.profileFloatingMenuTrigger.menuClosed\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(() => {\r\n this.profileMenuOpen = false;\r\n this.layoutService.overflowBodyEnabled();\r\n });\r\n }, 100);\r\n \r\n }); \r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n loadProfile(){\r\n this.userService.getUserPersonLoggedIn().subscribe(p => {\r\n if (!p)\r\n return;\r\n \r\n this.loggedInUser = p;\r\n\r\n if (!this.loggedInUser.ubicacionLogo) {\r\n let feNacimiento = this.loggedInUser.fechaNacimiento? new Date(this.loggedInUser.fechaNacimiento) : null;\r\n this.loggedInUser.ubicacionLogo = this.utilsService.getPersonDefaultAvatarUrl(feNacimiento, this.loggedInUser.sexo);\r\n }\r\n });\r\n }\r\n\r\n populateLinks(language: string){\r\n this.baseService.getMenuLinks(language).subscribe(data => {\r\n if (!data || data.length == 0)\r\n return;\r\n \r\n this.links = data;\r\n\r\n this.appStorageService.setItem(STORAGE.MENU_LANGUAGE, language);\r\n });\r\n }\r\n\r\n openProfile(event: MouseEvent): void {\r\n if (this.mediaMatcher.matchMedia(Breakpoints.Handset)) {\r\n this.messageBusService.sendToggleBottomSheetSubject({action: 'open', component: ProfileMenuComponent});\r\n } else {\r\n this.profileFloatingMenuTrigger.openMenu();\r\n }\r\n event.stopPropagation();\r\n }\r\n \r\n closeProfileMenu() {\r\n this.profileMenuOpen = false;\r\n\r\n this.profileFloatingMenuTrigger.closeMenu();\r\n }\r\n \r\n}\r\n","
\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n \r\n
\r\n
{{getChatDate(chatDate, true) | uppercase }}
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n {{ getChatDate(messageWrapper.message.fechaCreacion) }}\r\n
\r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n {{messageWrapper.message.fechaCreacion | date:'shortTime' }}\r\n \r\n
\r\n\r\n \r\n
\r\n \r\n \r\n {{chatWrapper.getDoctorName()}} \r\n
\r\n \r\n
\r\n {{messageWrapper.message.fechaCreacion | date:'shortTime' }}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { ChatService } from 'src/app/core/services/chat-service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { ChatConversacionMessage, ChatConversacionMessageType } from 'src/app/shared/models/people/chat-conversation.model';\r\nimport { VirtualAttention } from 'src/app/shared/models/process/virtual-attention.model';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { UtilsService } from 'src/app/core/services/utils.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'chat-history-dialog',\r\n templateUrl: './chat-history-dialog.component.html',\r\n styleUrls: ['./chat-history-dialog.component.css'] \r\n})\r\nexport class ChatHistoryDialogComponent implements OnInit, OnDestroy {\r\n chatDate: Date;\r\n timeElapsed: string;\r\n messagesPageSize = 30;\r\n chatWrapper : ChatHistoryWrapper;\r\n etapaSolicitudId: number;\r\n loggedUser: UserPerson; \r\n virtualAttention: VirtualAttention; \r\n loading = false;\r\n\r\n //subscribes\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n private mdDialogRef: MatDialogRef,\r\n private baseService: BaseService, \r\n private chatService: ChatService,\r\n private userService: UserService,\r\n private utilsService : UtilsService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(DOCUMENT) private document: Document,\r\n ) {\r\n this.virtualAttention = this.baseService.parseObject(data.data);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loading = true;\r\n this.loadChat(this.virtualAttention.idEtapaSolicitud);\r\n }\r\n\r\n ngOnDestroy():void{\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n onCloseClick() {\r\n this.mdDialogRef.close();\r\n }\r\n\r\n loadChat(idEtapaSolicitud: number) {\r\n \r\n // Check if the chat was already initialized\r\n if (this.etapaSolicitudId == idEtapaSolicitud && this.chatWrapper && this.chatWrapper.initialized)\r\n return; \r\n\r\n this.etapaSolicitudId = idEtapaSolicitud;\r\n\r\n // Get current user\r\n this.userService.getUserPersonLoggedIn()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(logged => {\r\n if (logged) {\r\n this.loggedUser = logged;\r\n\r\n if (this.virtualAttention) {\r\n \r\n this.chatWrapper = new ChatHistoryWrapper(this.loggedUser, this.virtualAttention);\r\n /* this.chatWrapper.min = this.min;\r\n this.chatWrapper.hour = this.hour;*/\r\n this.chatWrapper.initialized = true;\r\n\r\n // Load chat messages\r\n this.loadChatMessages(this.virtualAttention.idSolicitud, 0);\r\n }\r\n }},\r\n error => {\r\n this.baseService.handleServiceError(error, \"Error getting past appointments\");\r\n }\r\n );\r\n\r\n // Load chat\r\n /*this.chatService.getByEtapaSolicitudId(this.etapaSolicitudId).subscribe(chat => {\r\n this.chat = chat; \r\n });*/\r\n\r\n }; \r\n\r\n onScrollUp() {\r\n // Get message count\r\n let messageCount = this.chatWrapper.messages.length;\r\n \r\n // Load more messages\r\n this.loadChatMessages(this.virtualAttention.idSolicitud, messageCount, true);\r\n\r\n this.loading = true;\r\n }\r\n\r\n scrollBottom() {\r\n let _this = this;\r\n let el = this.document.getElementsByClassName(\"chat-history-msgs-container\")[0];\r\n\r\n if (el)\r\n setTimeout(function() {\r\n _this.utilsService.scrollBottomWithAnimation(el); \r\n }, 100); \r\n }\r\n \r\n loadChatMessages(idSolicitud: number, from: number, upDirection = false) {\r\n \r\n this.chatService.getChatMessages(idSolicitud, from, this.messagesPageSize).subscribe(messages => {\r\n \r\n if (messages.length > 0) {\r\n this.chatDate = messages[0].fechaCreacion;\r\n this.timeElapsed = \"16 hr. 20 min.\";\r\n }\r\n\r\n this.chatWrapper.addMessages(messages, true, upDirection);\r\n this.scrollBottom();\r\n this.loading = false;\r\n },\r\n error => { \r\n this.baseService.handleServiceError(error, \"Error getting chat messages\");\r\n });\r\n }\r\n \r\n getChatDate(date: Date, includeYear: boolean = false) {\r\n return this.baseService.getBasicDateFormat(date, includeYear);\r\n }\r\n}\r\n\r\nexport class ChatHistoryWrapper {\r\n virtualAttention: VirtualAttention;\r\n messages: ChatHistoryMessageWrapper[] = []; \r\n user: UserPerson; \r\n hour: string;\r\n min: string;\r\n minimized: boolean = true;\r\n unreadMessagesCount: number = 0;\r\n loading = false;\r\n initialized = false;\r\n connectionLost = false;\r\n\r\n constructor(user: UserPerson, va: VirtualAttention) {\r\n this.user = user;\r\n this.virtualAttention = va;\r\n this.messages = [];\r\n }\r\n\r\n addMessages(messages: ChatConversacionMessage[], avoidUnreadCountUpdate: boolean = false, upDirection: boolean = false) { \r\n \r\n if (!messages)\r\n return;\r\n\r\n // If we are scrolling up, the service will alway return first the oldest message\r\n // So in order to add it one by one (at the top) we need to revert the array\r\n if (upDirection)\r\n messages = messages.reverse();\r\n\r\n // Check if the msg was already added (when adding the msg the same one can came from signalR)\r\n for(let i = 0; i < messages.length; i++) {\r\n let msg = null;\r\n\r\n if (messages[i].id) {\r\n msg = this.messages.find(m => m.message.id == messages[i].id);\r\n }\r\n \r\n if (!msg) {\r\n\r\n // If the chat is minimized when adding the messages, then add this to the unread counter\r\n if (this.minimized && !avoidUnreadCountUpdate)\r\n this.unreadMessagesCount += 1;\r\n\r\n if (upDirection)\r\n this.messages.unshift(new ChatHistoryMessageWrapper(this.user, messages[i]));\r\n else\r\n this.messages.push(new ChatHistoryMessageWrapper(this.user, messages[i]));\r\n } \r\n }\r\n }\r\n\r\n getDoctorName() {\r\n return this.virtualAttention.nombreResponsableServicio? \r\n this.virtualAttention.nombreResponsableServicio.toLowerCase():\r\n \"\";\r\n }\r\n\r\n getChatTime() {\r\n let startTime = new Date(this.virtualAttention.fechaInicio).getTime();\r\n let now = new Date().getTime();\r\n let timeDiffInMin = (now - startTime) / (1000 * 60);\r\n\r\n if (timeDiffInMin < 60)\r\n return Math.floor(timeDiffInMin) + \" \" + this.min;\r\n else\r\n return Math.floor(timeDiffInMin / 60) + \" \" + this.hour;\r\n }\r\n\r\n isUserBlockMessage(currentMessageIndex: number) {\r\n if (currentMessageIndex == 0)\r\n return false;\r\n\r\n // Get current and previous msg\r\n let previous = this.messages[currentMessageIndex - 1];\r\n let current = this.messages[currentMessageIndex];\r\n\r\n // If we need to show the date stamp for this message then it is a new group\r\n if (this.showDateStamp(currentMessageIndex))\r\n return false;\r\n\r\n // We will only show user msg together if the previous msg was an user message and current is as well\r\n if (previous.isUserMessage() && current.isUserMessage())\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n isAgentBlockMessage(currentMessageIndex: number) {\r\n if (currentMessageIndex == 0)\r\n return false;\r\n\r\n // Get current and previous msg\r\n let previous = this.messages[currentMessageIndex - 1];\r\n let current = this.messages[currentMessageIndex];\r\n\r\n // If we need to show the date stamp for this message then it is a new group\r\n if (this.showDateStamp(currentMessageIndex))\r\n return false;\r\n\r\n // We will only show agent msg together if the previous msg was an agent message and current is as well\r\n if (previous.isAgentMessage() && current.isAgentMessage())\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n showDateStamp(currentMessageIndex: number) {\r\n if (currentMessageIndex == 0)\r\n return true;\r\n\r\n // Get current and previous msg\r\n let previous = new Date(this.messages[currentMessageIndex - 1].message.fechaCreacion);\r\n let current = new Date(this.messages[currentMessageIndex].message.fechaCreacion);\r\n \r\n // If the days are differents, then show the date time stampt\r\n if (previous.getDate() != current.getDate())\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n showMessageTime(currentMessageIndex: number) {\r\n // Only show the time for the last message\r\n return currentMessageIndex === (this.messages.length - 1);\r\n }\r\n\r\n getFirstMessage() : ChatConversacionMessage {\r\n return this.messages[0].message;\r\n }\r\n\r\n hasAgentMessages() {\r\n return this.messages.find(m => m.isAgentMessage()) != null;\r\n }\r\n}\r\n\r\nexport class ChatHistoryMessageWrapper {\r\n message: ChatConversacionMessage;\r\n user: UserPerson; \r\n\r\n constructor(user: UserPerson, message: ChatConversacionMessage) {\r\n this.user = user;\r\n this.message = message;\r\n }\r\n\r\n isUserMessage() {\r\n return this.message.idEmisor == this.user.id && this.message.tipo == ChatConversacionMessageType.PersonMessaje\r\n }\r\n\r\n isAgentMessage() {\r\n return this.message.idEmisor != this.user.id && this.message.tipo == ChatConversacionMessageType.PersonMessaje;\r\n }\r\n}","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
{{ 'shared.pastVirtualConsultations.text1' | translate:locale.language }}
\r\n
{{ 'shared.pastVirtualConsultations.text2' | translate:locale.language }}
\r\n
\r\n {{ 'shared.pastVirtualConsultations.text3' | translate:locale.language }}\r\n
\r\n \r\n
\r\n
{{ 'shared.pastVirtualConsultations.text4' | translate:locale.language }}
\r\n
{{ getStateName(item.consultation) }}
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n\r\n \r\n \r\n
{{ 'shared.pastVirtualConsultations.text5' | translate:locale.language }}
\r\n
\r\n {{ 'shared.pastVirtualConsultations.text6' | translate:locale.language }}\r\n {{ 'shared.pastVirtualConsultations.text7' | translate:locale.language }}\r\n
\r\n
\r\n\r\n
\r\n \r\n
","import { AfterViewInit, Component, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { TimelineWrapperItem, TimelineWrapperItemType, TimelineWrapperSkeletonItem } from '../../timeline-list/timeline-list.component';\r\nimport { VirtualAttention } from 'src/app/shared/models/process/virtual-attention.model';\r\nimport { VirtualAttentionService } from 'src/app/core/services/virtual-attention.service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { ChatHistoryDialogComponent } from '../../dialogs/chat-history-dialog/chat-history-dialog.component';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-past-virtual-consultation-container',\r\n templateUrl: './past-virtual-consultation.component.html',\r\n styleUrls: ['./past-virtual-consultation.component.css']\r\n})\r\nexport class PastVirtualConsultationComponent implements IControlComponent, OnInit, OnDestroy, AfterViewInit {\r\n private ngUnsubscribe = new Subject();\r\n data: FormComponentData; \r\n consultations: TimelineVirtualAttention[]; \r\n completedStateName: string;\r\n notCompletedStateName: string;\r\n cancelledStateName: string;\r\n loading = true;\r\n skeletonItems: TimelineWrapperSkeletonItem[] = [new TimelineWrapperSkeletonItem(), new TimelineWrapperSkeletonItem()];\r\n\r\n ngAfterViewInit() { \r\n } \r\n\r\n constructor(\r\n private virtualAttentionService: VirtualAttentionService, \r\n private translation: L10nTranslationService, \r\n private baseService: BaseService,\r\n public dialog: MatDialog,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale) {\r\n }\r\n \r\n ngOnInit(): void {\r\n this.translation.onChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe({\r\n next: () => {\r\n this.completedStateName = this.translation.translate('shared.pastAppointments.text2'); \r\n this.notCompletedStateName = this.translation.translate('shared.pastAppointments.text3'); \r\n this.cancelledStateName = this.translation.translate('shared.pastAppointments.text7'); \r\n }\r\n });\r\n\r\n this.loading = true;\r\n\r\n this.virtualAttentionService.getPastAttentions()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(consultations =>{\r\n this.consultations = consultations.map(a => new TimelineVirtualAttention(a));\r\n\r\n this.loading = false;\r\n },\r\n error => {\r\n this.loading = false;\r\n\r\n this.baseService.handleServiceError(error, \"Error getting past virtual consultations\"); \r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n appointmentTrackBy(index : number, item: TimelineVirtualAttention){\r\n return item.consultation.idSolicitud; \r\n } \r\n\r\n getAvatarUrl(item : VirtualAttention) {\r\n return item.data? item.data.urlAvatarPaciente : \"\";\r\n }\r\n\r\n getStateClass(item : VirtualAttention) {\r\n if (item.idEstado == 7)\r\n return \"cancelled\"; \r\n else \r\n return \"completed\";\r\n }\r\n\r\n getStateName(item : VirtualAttention) {\r\n if (item.idEstado == 7)\r\n return this.cancelledStateName; \r\n else \r\n return this.completedStateName;\r\n }\r\n\r\n isIncomplete(item : VirtualAttention) {\r\n return item.idEstado == 7;\r\n }\r\n\r\n openChatHistory(virtualAttention: VirtualAttention) {\r\n\r\n let dialogData = new DialogData();\r\n dialogData.data = virtualAttention;\r\n\r\n const dialogRef = this.dialog.open(ChatHistoryDialogComponent, {\r\n data: dialogData,\r\n panelClass: 'chat-history-modal-container'\r\n //autoFocus: false //disable auto focus in dialog\r\n });\r\n }\r\n\r\n navigateToVirtualConsultationPage() {\r\n window.location.reload();\r\n }\r\n}\r\n\r\nexport class TimelineVirtualAttention implements TimelineWrapperItem { \r\n consultation : VirtualAttention;\r\n\r\n constructor(consultation : VirtualAttention) {\r\n this.consultation = consultation;\r\n }\r\n \r\n getGroupKey() : number {\r\n return new Date(this.consultation.fechaInicio).getFullYear();\r\n }\r\n\r\n getDate() : Date {\r\n return new Date(this.consultation.fechaInicio);\r\n }\r\n\r\n getItemType(): TimelineWrapperItemType{\r\n return this.consultation.idEstado == 7 \r\n ? TimelineWrapperItemType.CANCELLED\r\n : TimelineWrapperItemType.CHECKED;\r\n }\r\n\r\n showTime():boolean{\r\n return true;\r\n }\r\n\r\n showDate():boolean{\r\n return true;\r\n }\r\n}","
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {{ 'shared.virtualConsultatiosTabs.text1' | translate:locale.language }} \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n \r\n {{ 'shared.virtualConsultatiosTabs.text2' | translate:locale.language }} \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-virtual-consultation-tabs',\r\n templateUrl: './virtual-consultation-tabs.component.html',\r\n styleUrls: ['./virtual-consultation-tabs.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('VirtualConsultationTabsComponent')\r\nexport class VirtualConsultationTabsComponent implements IControlComponent, OnInit, OnDestroy {\r\n data: FormComponentData;\r\n\r\n private ngUnsubscribe = new Subject();\r\n selectedTabIndex: number;\r\n constructor( \r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private messageBusService: MessageBusService) {\r\n }\r\n\r\n\r\n ngOnInit(): void {\r\n\r\n this.messageBusService.onGoToPastVirtualRequests()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((result) => {\r\n // go to past virtual requests\r\n this.selectedTabIndex = 1;\r\n });\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n}","export class ClinicHistoryConfiguration {\n tabs: TabClinicHistoryConfiguration[];\n}\n\nexport class TabClinicHistoryConfiguration{\n titulo: string;\n componentes: string;\n componentesArray: string[];\n\n constructor(obj:TabClinicHistoryConfiguration){\n this.titulo = obj.titulo;\n this.componentes = obj.componentes;\n this.componentesArray = obj.componentes.split('|')\n }\n}","
\n \n \n {{tab.titulo | i18nText:locale.language}}\n
\n
\n \n
\n
\n
\n
\n
\n","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ClinicHistoryService } from 'src/app/core/services/clinic-history.service';\nimport { GoogleAnalyticsService } from 'src/app/core/services/google-analytics.service';\nimport { ClinicHistoryMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { ClinicHistory } from 'src/app/shared/models/clinic-history/clinic-history.model';\nimport { ClinicHistoryConfiguration, TabClinicHistoryConfiguration } from 'src/app/shared/models/people/clinic-history-configuration.model';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\n\n@Component({\n selector: 'app-clinic-history-tabs',\n templateUrl: './clinic-history-tabs.component.html',\n styleUrls: ['./clinic-history-tabs.component.css']\n})\n@ComponentLookup('ClinicHistoryTabsComponent')\nexport class ClinicHistoryTabsComponent implements OnInit, OnDestroy, IControlComponent {\n data: FormComponentData;\n tabs: TabClinicHistoryConfiguration[];\n\n private clinicHistory: ClinicHistory;\n\n //subscribes\n private ngUnsubscribe = new Subject();\n \n constructor(\n private baseService: BaseService,\n private clinicHistoryService: ClinicHistoryService, \n private messageBusService: MessageBusService,\n private googleAnalyticsService: GoogleAnalyticsService,\n @Inject(L10N_LOCALE) public locale: L10nLocale) {\n\n }\n\n ngOnInit(): void {\n\n this.getClinicHistory();\n this.parseControlData();\n\n this.googleAnalyticsService.sendEventOpenClinicHistory();\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n onSelectTab(){\n // se comenta la actualizaciĆ³n de la historia clĆ­nica al seleccionar un tab\n // una idea para la segunda instancia es de iniciar la actualizaciĆ³n por un mensaje del cloudhub\n // this.getClinicHistory();\n }\n\n getClinicHistory(){\n this.clinicHistoryService.getClinicHistory()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(clinicHistory =>{\n this.clinicHistory = clinicHistory;\n\n this.messageBusService.sendClinicHistory(new ClinicHistoryMessage(this.clinicHistory));\n },\n error => {\n this.baseService.handleServiceError(error, \"Error getting clinic history\"); \n });\n }\n\n private parseControlData() {\n if(this.data && this.data.valor){\n try {\n this.data.valor = JSON.parse(this.data.valor); \n\n let config = this.data.valor;\n\n this.tabs = config.tabs.map(t => new TabClinicHistoryConfiguration(t));\n } catch (ex) {} \n }\n }\n}\n","export enum GroupConcept {\n SUBJETIVO = 1,\n OBJETIVO = 2,\n ANALISIS = 3,\n PLAN = 4,\n ANTECEDENTES = 5,\n ALERGIAS = 6,\n PRESCRIPCION_MEDICA = 7,\n LABORATORIOS = 8,\n VACUNAS = 9,\n ENFERMEDADES = 10,\n ENFERMEDADES_FAMILIARES = 11,\n CIRUGIAS = 12,\n HABITOS = 13\n}\n","
\n \n\n \n \n\n \n \n
\n \n \n \t\t\t\n
\n \n \n \n \n \n \n \n
\n \n
\n \n
\n
\n \n
\n
\n
\n\n
\n\n \n \n \n \n \n \n \n \n
\n \n \n \n \n {{item.attention.iniciales}}\n \n
\n {{item.attention.titulo}}\n {{ 'shared.clinicHistory.attentionHistory.' + item.attention.claveSubtitulo | translate:locale.language }}\n \n \n \n
\n \n \n \n\n \n
\n
\n {{basicConceptGrouped.titulo}}: \n {{basicConceptGrouped.descripcion}}\n
\n
\n \n
\n
\n {{fileConcept.nombreConcepto}}\n {{fileConcept.nombreDocumento}}\n
\n
\n
\n
\n\n \n \n {{ 'shared.clinicHistory.attentionHistory.viewMore' | translate:locale.language | uppercase }}\n {{ 'shared.clinicHistory.attentionHistory.viewLess' | translate:locale.language | uppercase }}\n \n \n
\n {{'shared.clinicHistory.attentionHistory.conclusionConceptsTitle' | translate:locale.language }}\n
\n {{conclusionConceptGrouped.titulo}}\n
\n
\n

{{conclusionConcept.descripcion}}

\n
\n
\n
\n
\n \n
\n
\n {{fileConclusionConcept.nombreConcepto}}\n {{fileConclusionConcept.nombreDocumento}}\n
\n
\n\n
\n
\n
\n
\n
\n\n \n \n
\n
{{ 'shared.clinicHistory.attentionHistory.emptyStateMessage1' | translate:locale.language }}
\n
{{ 'shared.clinicHistory.attentionHistory.emptyStateMessage2' | translate:locale.language }}
\n
\n
\n
\n
","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ClinicHistoryService } from 'src/app/core/services/clinic-history.service';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { GroupConcept } from 'src/app/shared/enums/group-concept.enum';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { AttentionGroupItem, ClinicHistoryItem } from 'src/app/shared/models/clinic-history/attention-history.model';\nimport { ClinicHistory } from 'src/app/shared/models/clinic-history/clinic-history.model';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { FileViewerDialogComponent } from '../../dialogs/file-viewer-dialog/file-viewer-dialog.component';\nimport { FileViewerDto, FileViewerItemDto } from '../../file-viewer/file-viewer.component';\nimport { TimelineWrapperItem, TimelineWrapperItemType, TimelineWrapperSkeletonItem } from '../../timeline-list/timeline-list.component';\n\n@Component({\n selector: 'app-attention-history',\n templateUrl: './attention-history.component.html',\n styleUrls: ['./attention-history.component.css']\n})\n@ComponentLookup('AttentionHistoryComponent')\nexport class AttentionHistoryComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n\n timelineAttentions: TimelineAttentionHistory[] = [];\n skeletonItems: TimelineWrapperSkeletonItem[] = [new TimelineWrapperSkeletonItem(), new TimelineWrapperSkeletonItem()];\n loading = true;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private messageBusService: MessageBusService,\n private clinicHistoryService: ClinicHistoryService,\n private baseService: BaseService,\n public dialog: MatDialog\n ) { }\n\n ngOnInit(): void {\n\n this.messageBusService.onSendClinicHistory().subscribe(message =>{\n this.createTimelineAttentions(message.clinicHistory);\n this.loading = false;\n });\n }\n\n createTimelineAttentions(history: ClinicHistory){\n let dtos: AttentionHistoryViewDTO[] = [];\n let conclusionGroup = [GroupConcept.PLAN, GroupConcept.PRESCRIPCION_MEDICA, GroupConcept.LABORATORIOS];\n\n // For each attention wil will create a card\n history.historialAtenciones.forEach(attention => { \n\n var dto = new AttentionHistoryViewDTO(); \n\n dto.fecha = attention.contactoClinico.fechaContacto;\n dto.avatarUrl = attention.contactoClinico.avatarResponsableServicio;\n dto.titulo = attention.contactoClinico.nombreResponsableServicio; //TODO agregar especialidad\n\n // If this is a virtual attention that was cancelled it will not contain a co_responsable\n if (!dto.titulo) { \n dto.titulo = \"Centro de atenciĆ³n integral de salud SURA\";\n dto.avatarUrl = \"assets/images/sura/logo-sura-simple.png\";\n }\n\n if (!dto.avatarUrl) {\n let avatarInitialsObject = this.baseService.getAvatarInitialObject(attention.contactoClinico.idResponsableServicio, dto.titulo);\n\n dto.iniciales = avatarInitialsObject.initials;\n dto.colorIniciales = avatarInitialsObject.color;\n }\n\n dto.claveSubtitulo = attention.contactoClinico.idTipoSolicitud == 53 || attention.contactoClinico.idTipoSolicitud == 54\n ? 'virtualConsultation'\n : 'faceToFaceConsultation';\n\n\n // Get conclusion items\n let conclusionItems = this.clinicHistoryService.getClinicHistoryItemsByGroup(attention.atenciones, conclusionGroup);\n \n // Get all items that are NOT conclusions\n let basicItems = this.clinicHistoryService.getClinicHistoryItemsByExcludedGroup(attention.atenciones, conclusionGroup);\n\n // Map to UI objects\n dto.conceptosConclusiones = conclusionItems.map(i => new AttentionHistoryItemViewDTO(i));\n dto.conceptosBasicos = basicItems.map(i => new AttentionHistoryItemViewDTO(i)); \n dto.existenConclusiones = conclusionItems.length > 0; \n\n dtos.push(dto); \n });\n\n this.timelineAttentions = dtos.map(dto=> new TimelineAttentionHistory(dto));\n }\n\n getClassPreviewFile(concept: ClinicHistoryItem): string {\n return this.clinicHistoryService.getClassPreviewFile(concept.extensionDocumento);\n }\n\n getPreviewFileUrl(concept: ClinicHistoryItem): string {\n return this.clinicHistoryService.getPreviewFileUrl(concept.extensionDocumento, concept.ubicacionWebDocumento);\n }\n\n onFileClick(item: AttentionHistoryItemViewDTO, file: ClinicHistoryItem) {\n let dialogData = new DialogData();\n let viewerDto = new FileViewerDto(); \n \n viewerDto.selectedFileId = file.idDocumento;\n viewerDto.files = this.getConsultationDocumentAsViewerItems(item); \n\n dialogData.data = viewerDto;\n\n const dialogRef = this.dialog.open(FileViewerDialogComponent, {\n panelClass: 'file-viewer-dialog',\n data: dialogData\n });\n }\n\n getConsultationDocumentAsViewerItems(item: AttentionHistoryItemViewDTO): FileViewerItemDto[] {\n let result = item.documentos.map(d => {\n let fileDto = new FileViewerItemDto();\n\n fileDto.fileId = d.idDocumento;\n fileDto.fileUrl = d.ubicacionWebDocumento;\n fileDto.amazonBucketName = d.nombreBucketAmazon;\n fileDto.fileExtension = d.extensionDocumento;\n fileDto.webUrl = d.ubicacionWebDocumento;\n\n fileDto.createdAt = d.fechaRegistro;\n fileDto.title = d.nombreDocumento;\n fileDto.description = d.descripcion;\n\n return fileDto;\n });\n\n return result;\n }\n}\n\nexport class TimelineAttentionHistory implements TimelineWrapperItem { \n attention : AttentionHistoryViewDTO;\n viewMore: boolean;\n\n constructor(attention : AttentionHistoryViewDTO) {\n this.attention = attention;\n }\n\n getItemType(): TimelineWrapperItemType{\n return TimelineWrapperItemType.DOT;\n }\n \n getGroupKey() : number {\n return new Date(this.attention.fecha).getFullYear();\n }\n\n getDate() : Date {\n return new Date(this.attention.fecha);\n }\n\n showTime():boolean{\n return false;\n }\n\n showDate():boolean{\n return true;\n }\n\n onClickLinkViewMore(){\n this.viewMore = !this.viewMore;\n }\n}\n\nexport class AttentionHistoryViewDTO{\n claveSubtitulo: string;\n avatarUrl: string;\n titulo: string;\n iniciales: string;\n colorIniciales: string;\n fecha: Date;\n existenConclusiones: boolean;\n\n conceptosBasicos: AttentionHistoryItemViewDTO[]; \n conceptosConclusiones: AttentionHistoryItemViewDTO[]; \n}\n\nexport class AttentionHistoryItemViewDTO{\n titulo: string;\n descripcion: string;\n conceptos: ClinicHistoryItem[];\n documentos: ClinicHistoryItem[];\n tieneConceptosBasicos: boolean;\n tieneDocumentos: boolean;\n\n constructor (group: AttentionGroupItem){\n this.titulo = group.nombreTipoConcepto; \n this.conceptos = group.items.filter(c => c.idDocumento == 0);\n this.documentos = group.items.filter(c => c.idDocumento > 0);\n this.descripcion = this.conceptos.map(c => c.descripcion.replace(\"::\", \":\")).join(', ');\n this.tieneConceptosBasicos = this.conceptos.length > 0;\n this.tieneDocumentos = this.documentos.length > 0;\n }\n}","
\n
\n \n \n \n
\n \n \n
\n \n {{ item.titulo }}\n
\n
\n {{ 'shared.clinicHistory.medicines.text2' | translate:locale.language }}\n {{ item.responsable }}\n
\n
\n {{ conceptGrouped.titulo }}\n
\n
\n \n {{ concept.nombreConcepto }}\n : {{ concept.valorConcepto }}\n
\n
\n
\n
\n \n
\n
\n {{fileConcept.nombreConcepto}}\n {{fileConcept.nombreDocumento}}\n
\n
\n
\n
\n
\n
\n
\n\n
\n
{{ 'shared.clinicHistory.medicines.text3' | translate:locale.language }}
\n
{{ 'shared.clinicHistory.medicines.text4' | translate:locale.language }}
\n
\n
\n","import { Inject, OnDestroy } from '@angular/core';\nimport { Component, OnInit } from '@angular/core';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { ClinicHistoryService } from 'src/app/core/services/clinic-history.service';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { GroupConcept } from 'src/app/shared/enums/group-concept.enum';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { AttentionGroupItem, AttentionHistory, ClinicHistoryItem } from 'src/app/shared/models/clinic-history/attention-history.model';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\n\n@Component({\n selector: 'app-medicines',\n templateUrl: './medicines.component.html',\n styleUrls: ['./medicines.component.css']\n})\n@ComponentLookup('MedicinesComponent')\nexport class MedicinesComponent implements OnInit, OnDestroy, IControlComponent {\n data: FormComponentData;\n\n attentions: AttentionHistory[] = [];\n items: MedicinesViewDTO[] = [];\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private messageBusService: MessageBusService,\n private clinicHistoryService: ClinicHistoryService\n ) { }\n\n ngOnInit(): void {\n this.messageBusService.onSendClinicHistory()\n .subscribe(message =>{\n this.createViewDto(message.clinicHistory.historialAtenciones);\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n createViewDto(atenciones: AttentionHistory[]){\n\n let atencionesLaboratorios = this.clinicHistoryService.getAttentionsByGroup(atenciones, GroupConcept.PRESCRIPCION_MEDICA);\n\n atencionesLaboratorios.forEach(attention =>{\n\n let dto = new MedicinesViewDTO();\n\n dto.titulo = attention.contactoClinico.asunto;\n dto.fecha = attention.contactoClinico.fechaContacto;\n dto.responsable = attention.contactoClinico.nombreResponsableServicio;\n\n dto.conceptosMedicamentos = attention.atenciones.map(a => new MedicinesItemViewDTO(a));\n\n this.items.push(dto);\n });\n } \n\n getClassPreviewFile(concept: ClinicHistoryItem): string {\n return this.clinicHistoryService.getClassPreviewFile(concept.extensionDocumento);\n }\n\n getPreviewFileUrl(concept: ClinicHistoryItem): string {\n let url = concept.nombreBucketAmazon ? concept.nombreBucketAmazon : concept.ubicacionWebDocumento;\n\n return this.clinicHistoryService.getPreviewFileUrl(concept.extensionDocumento, url);\n }\n\n}\n\nexport class MedicinesViewDTO{\n titulo: string;\n fecha: Date;\n responsable: string;\n conceptosMedicamentos: MedicinesItemViewDTO[];\n}\n\nexport class MedicinesItemViewDTO {\n titulo: string;\n conceptos: ClinicHistoryItem[];\n documentos: ClinicHistoryItem[];\n tieneConceptos: boolean;\n tieneDocumentos: boolean;\n\n constructor (group: AttentionGroupItem){\n this.titulo = group.nombreTipoConcepto; \n this.conceptos = group.items.filter(c => c.idDocumento == 0);\n this.documentos = group.items.filter(c => c.idDocumento > 0);\n this.tieneConceptos = this.conceptos.length > 0;\n this.tieneDocumentos = this.documentos.length > 0;\n }\n}\n","
\n
\n \n \n \n {{item.titulo}}\n \n \n
\n {{concept.nombreConcepto}} \n {{concept.valorConcepto}}\n
\n
\n
\n
\n
\n
\n
{{ 'shared.clinicHistory.medicalHistory.text2' | translate:locale.language }}
\n
\n
","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { GroupConcept } from 'src/app/shared/enums/group-concept.enum';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { ClinicHistoryItem } from 'src/app/shared/models/clinic-history/attention-history.model';\nimport { MedicalHistory } from 'src/app/shared/models/clinic-history/medical-history.model';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\n\n@Component({\n selector: 'app-medical-history',\n templateUrl: './medical-history.component.html',\n styleUrls: ['./medical-history.component.css']\n})\n@ComponentLookup('MedicalHistoryComponent')\nexport class MedicalHistoryComponent implements OnInit, OnDestroy, IControlComponent {\n data: FormComponentData;\n items: MedicalHistoryViewDTO[] = [];\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private messageBusService: MessageBusService\n ) { }\n\n ngOnInit(): void {\n this.messageBusService.onSendClinicHistory().subscribe(message =>{\n this.items = message.clinicHistory.antecedentes.map(a => new MedicalHistoryViewDTO(a));\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n}\n\nexport class MedicalHistoryViewDTO {\n id: number;\n titulo: string;\n icono: string;\n conceptos: ClinicHistoryItem[];\n\n constructor(group: MedicalHistory){\n this.id = group.idTipoConcepto;\n this.titulo = group.nombreTipoConcepto;\n this.icono = this.getIconNameByGroup(group.agrupadores);\n this.conceptos = group.items;\n }\n\n getIconNameByGroup(groupArray: number[]):string {\n let iconname = 'phr-iconset-laboratorios';\n\n if(groupArray.filter(a => a == GroupConcept.ALERGIAS).length > 0){\n iconname = \"phr-iconset-polen\";\n } else if(groupArray.filter(a => a == GroupConcept.VACUNAS).length > 0){\n iconname = \"phr-iconset-vacuna\";\n } else if(groupArray.filter(a => a == GroupConcept.ENFERMEDADES).length > 0){\n iconname = \"phr-iconset-termometro\";\n } else if(groupArray.filter(a => a == GroupConcept.ENFERMEDADES_FAMILIARES).length > 0){\n iconname = \"phr-iconset-adn\";\n } else if(groupArray.filter(a => a == GroupConcept.CIRUGIAS).length > 0){\n iconname = \"phr-iconset-bisturi\";\n } else if(groupArray.filter(a => a == GroupConcept.HABITOS).length > 0){\n iconname = \"phr-iconset-apple\";\n }\n\n return iconname;\n }\n}\n","
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n clear\r\n {{displayName(option)}}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {{displayName(option)}}\r\n \r\n \r\n\r\n \r\n \r\n
\r\n\r\n
","import { Component, ElementRef, EventEmitter, Inject, Input, OnInit, Output, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { MatAutocomplete, MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material/autocomplete';\r\n\r\n@Component({\r\n selector: 'autocomplete-multiple-selection',\r\n templateUrl: './autocomplete-multiple-selection.component.html',\r\n styleUrls: ['./autocomplete-multiple-selection.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n })\r\n export class AutocompleteMultipleSelectionComponent implements OnInit { \r\n _selectedOptions: any[]; \r\n searchInputCtrl = new FormControl(); \r\n\r\n @Input() placeholder: string; \r\n @Input() cssClass: string; \r\n @Input() filteredOptions: any[];\r\n @Input() selectedOptions: any[];\r\n @Input() displayName: (option: any) => string; \r\n\r\n @Output() onFilter = new EventEmitter();\r\n @Output() onSelectionChanged = new EventEmitter();\r\n\r\n @ViewChild('searchInput') searchInput: ElementRef;\r\n @ViewChild('auto') matAutocomplete: MatAutocomplete;\r\n @ViewChild(MatAutocompleteTrigger) trigger: MatAutocompleteTrigger;\r\n \r\n constructor( \r\n @Inject(L10N_LOCALE) public locale: L10nLocale) {\r\n }\r\n\r\n ngOnInit(): void { \r\n this._selectedOptions = this.selectedOptions? this.selectedOptions : [];\r\n\r\n // On search\r\n this.searchInputCtrl.valueChanges.subscribe(t => {\r\n if (typeof(t) == \"string\") {\r\n this.onFilter.emit(t); \r\n }\r\n });\r\n }\r\n\r\n removeOption(option: any) {\r\n const index = this._selectedOptions.indexOf(option, 0);\r\n\r\n if (index > -1) {\r\n this._selectedOptions.splice(index, 1); \r\n\r\n this.onSelectionChanged.emit(this._selectedOptions);\r\n\r\n // When we remove an item lets update the filter list so the item we removed apears on the results\r\n this.onFilter.emit(\"\");\r\n }\r\n }\r\n \r\n selected(event: MatAutocompleteSelectedEvent): void { \r\n this._selectedOptions.push(event.option.value);\r\n \r\n this.searchInputCtrl.setValue(\"\");\r\n\r\n this.onSelectionChanged.emit(this._selectedOptions);\r\n \r\n // Keep panel open after selection\r\n setTimeout(() => {\r\n this.trigger.openPanel()\r\n }, 50);\r\n }\r\n\r\n autocompleteOpened():void {\r\n // Update the list each time it open\r\n this.onFilter.emit(\"\"); \r\n }\r\n\r\n autocompleteClosed() {\r\n \r\n }\r\n } ","
\n
\n \n \n
\n
\n\n \n
\n

{{'shared.clinicHistory.shareDialog.title2' | translate:locale.language }}

\n
\n \n
\n \n {{ area.nombre | i18nText:locale.language }}\n \n \n {{'shared.clinicHistory.shareDialog.text5' | translate:locale.language }}\n \n
\n \n {{'shared.clinicHistory.shareDialog.text6' | translate:locale.language }} \n
\n
\n
\n
\n
\n\n \n
\n

{{'shared.clinicHistory.shareDialog.title3'| translate:locale.language}}

\n\n
\n \n \n \n {{'shared.clinicHistory.shareDialog.text4'| translate:locale.language}}\n \n \n \n \n \n \n \n
\n {{'shared.clinicHistory.shareDialog.dateRangeHelperText'| translate:locale.language}}\n
\n\n
\n \n
\n \n
\n
\n {{'shared.clinicHistory.shareDialog.specialtiesHelperText'| translate:locale.language}}\n
\n
\n\n
\n
\n\n
\n
\n
\n \n {{'shared.clinicHistory.shareDialog.text1'| translate:locale.language}}\n
\n
\n {{'shared.clinicHistory.shareDialog.link1Text1'| translate:locale.language}}\n {{'shared.clinicHistory.shareDialog.link1Text2'| translate:locale.language}}\n
\n
\n\n \n
\n\n \n \n \n \n
\n
\n\n \n
\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { ClinicHistory } from 'src/app/shared/models/clinic-history/clinic-history.model';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\nimport * as moment from 'moment';\nimport { ClinicHistoryService } from 'src/app/core/services/clinic-history.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport { GoogleAnalyticsService } from 'src/app/core/services/google-analytics.service';\n\n@Component({\n selector: 'app-share-dialog',\n templateUrl: './share-dialog.component.html',\n styleUrls: ['./share-dialog.component.css']\n})\nexport class ShareDialogComponent implements OnInit { \n shareDialogData: ShareDialogData;\n allAreasSelected: boolean = false;\n currentView: HcShareView = HcShareView.FilterItems;\n viewEnum = HcShareView;\n clinicHistory: ClinicHistory; \n filters: AttentionFilters;\n loading = false;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\n private userService: UserService,\n private clinicHistoryService: ClinicHistoryService,\n private baseService: BaseService,\n private googleAnalyticsService: GoogleAnalyticsService,\n private mdDialogRef: MatDialogRef \n ) { \n this.shareDialogData = JSON.parse(data.message);\n\n // By Default all areas will be checked\n this.shareDialogData.areas.forEach(a => a.check = true);\n\n this.clinicHistory = data.data; \n }\n\n ngOnInit(): void {\n this.currentView = HcShareView.SelectItems;\n\n this.filters = new AttentionFilters();\n\n this.loadDoctordata();\n }\n\n loadDoctordata() {\n var data : any = {};\n\n for (let index = 0; index < this.clinicHistory.historialAtenciones.length; index++) {\n const contact = this.clinicHistory.historialAtenciones[index].contactoClinico;\n\n if (!data.hasOwnProperty(contact.idResponsableServicio))\n data[contact.idResponsableServicio] = new DoctorData(contact.idResponsableServicio, contact.nombreResponsableServicio); \n else if (!data[contact.idResponsableServicio].name && contact.nombreResponsableServicio) \n data[contact.idResponsableServicio].name = contact.nombreResponsableServicio;\n }\n\n this.filters.initDoctorData(Object.keys(data).map(key => data[key]));\n } \n\n public cancel() {\n this.closeDialog(false); \n }\n\n public close() {\n this.closeDialog(false); \n }\n\n private closeDialog(value:any) {\n this.mdDialogRef.close(value);\n } \n\n optionHasFilters(value: number) {\n return value == 1; // For not only \"Attention will have filters\"\n }\n\n onBackClick() {\n this.currentView = HcShareView.SelectItems;\n }\n\n onFilterClick(value: number) {\n if (value == 1)\n this.currentView = HcShareView.FilterItems;\n }\n\n confirmFilters() {\n this.currentView = HcShareView.SelectItems;\n }\n\n shareButtonEnabled() {\n return this.shareDialogData.areas.filter(a => a.check).length > 0;\n } \n\n public someAreaSelected(){\n if (this.shareDialogData == null || this.shareDialogData.areas == null) {\n return false;\n }\n return this.shareDialogData.areas.filter(t => t.check).length > 0 && !this.allAreasSelected;\n }\n\n filterDoctors(searchText: string) {\n return this.filters.filterDoctors(searchText);\n } \n\n getDoctorDisplayName(doctor: DoctorData) {\n return doctor.name;\n }\n\n onDoctorSelectionChanged(selectedDoctors: DoctorData[]) {\n this.filters.setSelectedDoctors(selectedDoctors); \n }\n\n getSummary(filter: AttentionFilters) {\n var result = \"\"; \n\n if (filter.startDate) {\n let startDate = this.baseService.getBasicDateFormat(new Date(filter.startDate));\n result += startDate;\n }\n\n if (filter.endDate) {\n let endDate = this.baseService.getBasicDateFormat(new Date(filter.endDate));\n result += result? (\" - \" + endDate) : endDate;\n } \n\n let selectedDocs = filter.getSelectedDoctors();\n\n if (selectedDocs.length > 0) {\n result += result? (\"
\" + selectedDocs.map(d => d.name).join(\", \")) : selectedDocs.map(d => d.name).join(\", \");\n }\n\n return result;\n }\n\n share() {\n let model: any = {};\n\n // Sections\n let selectedSections = this.shareDialogData.areas.filter(a => a.check);\n\n if (selectedSections.length > 0)\n model.Secciones = selectedSections.map(s => s.valor);\n\n // Filters\n if (!this.filters.areEmpty()) { \n if (this.filters.startDate)\n model.FechaIncio = this.filters.startDate;\n if (this.filters.endDate)\n model.FechaFin = this.filters.endDate;\n \n let selectedDocs = this.filters.getSelectedDoctors();\n if (selectedDocs.length > 0)\n model.IdsResponsablesServicios = selectedDocs.map(d => d.id);\n }\n\n // User\n this.userService.getUserPersonLoggedIn().subscribe(p => {\n if (p) {\n model.IdPaciente = p.id;\n\n console.log(model);\n this.loading = true;\n\n this.clinicHistoryService.getClinicHistoryPdf(model).subscribe((data) => {\n\n this.googleAnalyticsService.sendEventDownloadClinicHistory();\n\n let blob = new Blob([data], {type: 'application/pdf'});\n \n var downloadURL = this.baseService.createSafeUrl(data);\n var link = document.createElement('a');\n link.href = downloadURL;\n link.download = this.getDownloadFileName(p);\n\n link.click(); \n\n this.loading = false;\n this.close();\n },\n (error => {\n console.error(\"Error getting pdf\");\n\n this.loading = false;\n this.close();\n }));\n } \n \n }); \n }\n\n getDownloadFileName(user: UserPerson) {\n let name = \"Historia clĆ­nica - \" + this.capitalize(user.nombre) + \" \" + this.capitalize(user.apellido) + \" - \";\n let now = moment(new Date());\n\n // Ej: Historia clĆ­nica - Juan PĆ©rez - 23/feb/2022 3:44 PM.pdf\n\n name += now.format(\"DD_MMM_YYYY_hh_mm_\") + now.format(\"a\").toUpperCase();\n\n return name + \".pdf\";\n }\n\n capitalize = function(str: string) {\n str = str.toLowerCase();\n const arr = str.split(\" \");\n\n for (var i = 0; i < arr.length; i++) {\n arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1);\n }\n\n return arr.join(\" \");\n }\n}\n\nexport enum HcShareView {\n SelectItems,\n FilterItems,\n Finished\n}\n\nexport class ShareDialogData{\n areas:AreaShareDialogData[]\n}\nexport class AreaShareDialogData{\n nombre: string;\n valor: number;\n check: boolean;\n}\n\nexport class DoctorData {\n name: string;\n id: number;\n checked: boolean;\n\n constructor(id: number, name: string) {\n this.name = name;\n this.id = id;\n }\n\n getIdentifier() {\n return this.id.toString();\n }\n\n getDisplayName() {\n return this.name;\n }\n}\n\nexport class AttentionFilters {\n startDate: string;\n endDate: string;\n\n doctors: DoctorData[];\n filteredDoctors : DoctorData[];\n selectedDoctors : DoctorData[]; \n\n constructor() {\n this.doctors = [];\n this.filteredDoctors = [];\n this.selectedDoctors = [];\n }\n\n initDoctorData(doctors: DoctorData[]) {\n this.doctors = doctors;\n this.filteredDoctors = doctors; \n\n this.addAllDoctorsSelection();\n }\n\n addAllDoctorsSelection() {\n this.selectedDoctors = [new DoctorData(-1, \"Todos\")]; \n }\n\n removeAllDoctorsSelection() {\n this.selectedDoctors = this.selectedDoctors.filter(d => d.id > 0); \n }\n\n getSelectedDoctors() {\n return this.selectedDoctors.filter(d => d.id > 0);\n }\n\n setSelectedDoctors(selectedDoctors : DoctorData[]) {\n this.selectedDoctors = selectedDoctors;\n\n if (selectedDoctors.length == 0)\n this.addAllDoctorsSelection();\n else if (selectedDoctors.length > 1)\n this.removeAllDoctorsSelection();\n }\n\n areEmpty() {\n return !this.startDate && this.getSelectedDoctors().length == 0;\n }\n\n clear() {\n this.startDate = undefined as any;\n this.endDate = undefined as any;\n this.filteredDoctors = this.doctors;\n this.addAllDoctorsSelection();\n }\n\n filterDoctors(searchText: string) {\n searchText = searchText.toLowerCase();\n let selectedIds = this.selectedDoctors.map(d => d.id); \n\n this.filteredDoctors = this.doctors.filter(d => d.id > 0 && d.name.toLowerCase().indexOf(searchText) == 0 && selectedIds.indexOf(d.id) == -1);\n } \n} ","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { ClinicHistory } from 'src/app/shared/models/clinic-history/clinic-history.model';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { ShareDialogComponent } from '../share-dialog/share-dialog.component';\n\n@Component({\n selector: 'app-clinic-history-share',\n templateUrl: './clinic-history-share.component.html',\n styleUrls: ['./clinic-history-share.component.css']\n})\n@ComponentLookup('ClinicHistoryShareComponent')\nexport class ClinicHistoryShareComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n clinicHistory: ClinicHistory;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private messageBusService: MessageBusService,\n public dialog: MatDialog\n ) { }\n\n ngOnInit(): void {\n this.messageBusService.onSendClinicHistory().subscribe(message =>{\n this.clinicHistory = message.clinicHistory;\n });\n }\n\n public onClickShareButton(){\n let dialogData = new DialogData();\n\n dialogData.message = this.data.valor;\n dialogData.data = this.clinicHistory;\n\n const dialogRef = this.dialog.open(ShareDialogComponent, { data: dialogData, panelClass: \"common-dialog-container\", width: '680px', height: '600px' }); \n }\n}\n","
\n
\n \n \n \n
\n \n \n
\n \n {{ item.titulo }}\n
\n
\n {{ 'shared.clinicHistory.studiesLaboratories.text2' | translate:locale.language }}\n {{ item.responsable }}\n
\n
\n {{ conceptGrouped.titulo }}\n
\n
\n {{ concept.nombreConcepto }}: \n {{ concept.valorConcepto }}\n
\n
\n
\n
\n \n
\n
\n {{fileConcept.nombreConcepto}}\n {{fileConcept.nombreDocumento}}\n
\n
\n
\n
\n
\n
\n
\n\n
\n
{{ 'shared.clinicHistory.studiesLaboratories.text3' | translate:locale.language }}
\n
{{ 'shared.clinicHistory.studiesLaboratories.text4' | translate:locale.language }}
\n
\n
","
\n \n \n
\n","import { Inject, OnDestroy } from '@angular/core';\nimport { Component, OnInit } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { ClinicHistoryService } from 'src/app/core/services/clinic-history.service';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { GroupConcept } from 'src/app/shared/enums/group-concept.enum';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { AttentionGroupItem, AttentionHistory, ClinicHistoryItem } from 'src/app/shared/models/clinic-history/attention-history.model';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { FileViewerDialogComponent } from '../../dialogs/file-viewer-dialog/file-viewer-dialog.component';\nimport { FileViewerDto, FileViewerItemDto } from '../../file-viewer/file-viewer.component';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'app-studies-laboratories',\n templateUrl: './studies-laboratories.component.html',\n styleUrls: ['./studies-laboratories.component.css']\n})\n@ComponentLookup('StudiesLaboratoriesComponent')\nexport class StudiesLaboratoriesComponent implements OnInit, OnDestroy, IControlComponent {\n data: FormComponentData;\n\n items: StudiesLaboratoriesViewDTO[] = [];\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private messageBusService: MessageBusService,\n public dialog: MatDialog,\n private clinicHistoryService: ClinicHistoryService\n ) { }\n\n ngOnInit(): void {\n this.messageBusService.onSendClinicHistory()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message =>{\n this.createViewDto(message.clinicHistory.historialAtenciones);\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n createViewDto(atenciones: AttentionHistory[]){\n\n let atencionesLaboratorios = this.clinicHistoryService.getAttentionsByGroup(atenciones, GroupConcept.LABORATORIOS);\n\n atencionesLaboratorios.forEach(attention => {\n\n let dto = new StudiesLaboratoriesViewDTO();\n\n dto.titulo = attention.contactoClinico.asunto;\n dto.fecha = attention.contactoClinico.fechaContacto;\n dto.responsable = attention.contactoClinico.nombreResponsableServicio;\n\n dto.conceptosLaboratorios = attention.atenciones.map(a => new StudiesLaboratoriesItemViewDTO(a));\n\n this.items.push(dto);\n });\n }\n\n getClassPreviewFile(concept: ClinicHistoryItem): string {\n return this.clinicHistoryService.getClassPreviewFile(concept.extensionDocumento);\n }\n\n getPreviewFileUrl(concept: ClinicHistoryItem): string {\n return this.clinicHistoryService.getPreviewFileUrl(concept.extensionDocumento, concept.ubicacionWebDocumento);\n }\n\n onFileClick(item: StudiesLaboratoriesItemViewDTO, file: ClinicHistoryItem) {\n let dialogData = new DialogData();\n let viewerDto = new FileViewerDto(); \n \n viewerDto.selectedFileId = file.idDocumento;\n viewerDto.files = this.getConsultationDocumentAsViewerItems(item); \n\n dialogData.data = viewerDto;\n\n const dialogRef = this.dialog.open(FileViewerDialogComponent, {\n panelClass: 'file-viewer-dialog',\n data: dialogData\n });\n }\n\n getConsultationDocumentAsViewerItems(item: StudiesLaboratoriesItemViewDTO): FileViewerItemDto[] {\n let result = item.documentos.map(d => {\n let fileDto = new FileViewerItemDto();\n\n fileDto.fileId = d.idDocumento;\n fileDto.fileUrl = d.ubicacionWebDocumento;\n fileDto.amazonBucketName = d.nombreBucketAmazon;\n fileDto.fileExtension = d.extensionDocumento;\n fileDto.webUrl = d.ubicacionWebDocumento;\n\n fileDto.createdAt = d.fechaRegistro;\n fileDto.title = d.nombreDocumento;\n fileDto.description = d.descripcion;\n\n return fileDto;\n });\n\n return result;\n }\n}\n\nexport class StudiesLaboratoriesViewDTO{\n titulo: string;\n fecha: Date;\n responsable: string;\n conceptosLaboratorios: StudiesLaboratoriesItemViewDTO[];\n}\n\nexport class StudiesLaboratoriesItemViewDTO {\n titulo: string;\n conceptos: ClinicHistoryItem[];\n documentos: ClinicHistoryItem[];\n tieneConceptos: boolean;\n tieneDocumentos: boolean;\n\n constructor (group: AttentionGroupItem){\n this.titulo = group.nombreTipoConcepto;\n this.conceptos = group.items.filter(c => c.idDocumento == 0);\n this.documentos = group.items.filter(c => c.idDocumento > 0);\n this.tieneConceptos = this.conceptos.length > 0;\n this.tieneDocumentos = this.documentos.length > 0;\n }\n}\n","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Router } from '@angular/router';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\n\n@Component({\n selector: 'app-header-mapfre-panama',\n templateUrl: './header-mapfre-panama.component.html',\n styleUrls: ['./header-mapfre-panama.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('HeaderMapfrePanamaComponent')\nexport class HeaderMapfrePanamaComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n\n routeClassName: string = '';\n \n constructor(\n public dialog: MatDialog,\n private router: Router) {\n\n this.router.events.subscribe(()=>{\n this.initRouteClassName();\n\n });\n }\n \n ngOnInit(): void { \n \n }\n\n openMenuMobile(){\n const dialogRef = this.dialog.open(MenuMobileComponent, {\n panelClass: 'menu-mobile',\n width:\"338px\",\n height: \"100%\",\n position: { left: \"0px\"}\n });\n }\n\n private initRouteClassName(){\n this.routeClassName = this.router.url.split('/')[1];\n }\n}\n","
\n \n \n \n\n \n \n \n
\n
\n \n \n
","export enum ClassConcept {\n PROCEDIMIENTO = 1,\n DIAGNOSTICO = 2,\n HALLAZGO = 3,\n SINTOMA = 4,\n ESPECIALIDAD = 5,\n AREAS_DE_ENFOQUE = 6,\n MISCELANEO = 7,\n ASEGURADORA = 8,\n ENFOQUE_POBLACION = 9,\n IDIOMA = 10,\n RED_MEDICA = 11,\n ATRIBUTOS_ENTIDAD_SALUD = 12,\n CENTROS_ATENCION = 13,\n SERVICIOS_ENTIDAD_SALUD = 14\n}\n","export class SearchQsParametersModel{\r\n t:string;\r\n filtros:string;\r\n idC: string;\r\n idTc: string;\r\n}\r\n\r\nexport class SearchQsParamMapModel{\r\n param1:string;\r\n param2:string;\r\n param3:string;\r\n param4:string;\r\n param5:string;\r\n}","
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n\n \n\n
\n \n
\n\n
\n \n {{result.descripcion}}\n
\n
\n
\n
\n\n
\n
\n\n \n \n \n \n \n \n \n \n \n \n
\n \n \n
\n
\n
\n
\n
\n
\n \n
\n\n \n
\n
\n
","import { Component, ElementRef, Inject, Input, OnDestroy, OnInit, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { MatAutocomplete, MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { ActivatedRoute } from '@angular/router';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { of, Subject, zip } from 'rxjs';\nimport { Observable } from 'rxjs/internal/Observable';\nimport { debounceTime, map, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { DoctorService } from 'src/app/core/services/doctors.service';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { ClassConcept } from 'src/app/shared/enums/class-concept.enum';\nimport { DoctorSearchResult } from 'src/app/shared/models/cdr/doctor-search-result.model';\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { ControlComponentClassnameMessage, MessageBusService, ProviderSearchMessage } from 'src/app/core/services/message-bus.service';\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\nimport { TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { ConceptDefaultModel } from 'src/app/shared/models/search-results/concept-default.model';\nimport { LocationDefaultModel } from 'src/app/shared/models/search-results/location-default.model';\nimport { SearchQsParamMapModel, SearchQsParametersModel } from 'src/app/shared/models/search-results/search-parameters.model';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { PublicProfileAvatarComponentModel } from '../../public-profile-avatar/public-profile-avatar.component';\n\n@Component({\n selector: 'app-search-providers',\n templateUrl: './search-providers.component.html',\n styleUrls: ['./search-providers.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('SearchProvidersComponent')\nexport class SearchProvidersComponent implements OnInit, OnDestroy, IControlComponent {\n data: any;\n\n @Input() model: SearchProvidersComponentConfiguration;\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n companyName: string = \"\";\n language: string;\n\n autocompleteOpen:boolean = false;\n loadingSearchProvider: boolean = false;\n searchProviderCtrl = new FormControl();\n filteredResults$: Observable;\n filteredResultsCount:number;\n providerSelected: DoctorSearchResult | null;\n\n highlightValue: string;\n\n locationAutocompleteOpen:boolean = false;\n loadingSearchLocation: boolean = false;\n searchLocationCtrl = new FormControl();\n filteredLocationResults$: Observable;\n filteredLocationResultsCount:number;\n locationObjectSelected: LocationSearchResultItem | null;\n locationLevels: string = \"2,3\";\n\n cityText:string;\n stateText:string;\n countryText:string;\n cityDefaultText:string;\n stateDefaultText:string;\n\n removingSelection:boolean = false;\n\n @ViewChild('searchInput') searchInput: ElementRef;\n @ViewChild('auto') matAutocomplete: MatAutocomplete;\n @ViewChild('searchInput', { read:MatAutocompleteTrigger }) autocompleteProviderTrigger: MatAutocompleteTrigger;\n\n @ViewChild('searchLocationInput') searchLocationInput: ElementRef;\n @ViewChild('autoLocation') matAutocompleteLocation: MatAutocomplete;\n @ViewChild('searchLocationInput', { read:MatAutocompleteTrigger }) autocompleteLocationTrigger: MatAutocompleteTrigger; \n\n isBrowser: boolean;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private baseService: BaseService,\n private layoutService: LayoutService,\n private utilsService: UtilsService,\n private doctorService: DoctorService, \n private route: ActivatedRoute,\n private messageBusService: MessageBusService,\n private territorialDivisionsService: TerritorialDivisionsService,\n private publicProfileService: PublicProfileService,\n private translation: L10nTranslationService,\n @Inject(DOCUMENT) private document: Document,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit(): void {\n this.document.body.classList.add('search-provider-v1');\n\n this.companyName = this.baseService.getCliniwebDirectoryCompanyName();\n this.language = this.baseService.getLanguage();\n\n this.parseControlData();\n\n this.initFromParams();\n\n this.configSearchProviders();\n\n this.configSearchLocations();\n \n this.translation.onChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe({\n next: () => {\n this.cityText = this.translation.translate('city');\n this.stateText = this.translation.translate('province');\n this.countryText = this.translation.translate('country');\n this.cityDefaultText = this.translation.translate('shared.searchResults.searchProviders.mostWantedCities');\n this.stateDefaultText = this.translation.translate('shared.searchResults.searchProviders.mostWantedProvinces');\n }\n });\n\n this.sendControlComponentClassname();\n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n initFromParams(){\n let _paramMap$ = this.route.paramMap;\n let _queryParams$ = this.route.queryParamMap;\n\n zip(_paramMap$, _queryParams$)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(results =>{\n let _paramMap = new SearchQsParamMapModel();\n\n _paramMap.param1 = results[0].get('param1') || '';\n _paramMap.param2 = results[0].get('param2') || '';\n _paramMap.param3 = results[0].get('param3') || '';\n _paramMap.param4 = results[0].get('param4') || '';\n _paramMap.param5 = results[0].get('param5') || '';\n\n let _qsParams = new SearchQsParametersModel();\n \n _qsParams.t = results[1].get('t') || '';\n _qsParams.filtros = results[1].get('filtros') || '';\n\n this.populateDropdownByParams(_paramMap, _qsParams);\n\n }, error=>{\n console.log('error');\n });\n }\n\n getPlaceholderProvider(){\n return this.model && this.model.placeholderProvider \n ? this.layoutService.getTextByLanguage(this.model.placeholderProvider, this.locale.language)\n : '';\n }\n\n getPlaceholderLocation(){\n return this.model && this.model.placeholderLocation \n ? this.layoutService.getTextByLanguage(this.model.placeholderLocation, this.locale.language)\n : '';\n }\n\n private sendControlComponentClassname(){\n let message = new ControlComponentClassnameMessage();\n\n message.conponentName = 'SearchProvidersComponent';\n message.classname = 'search-provider-v1';\n\n this.messageBusService.controlComponentClassname(message);\n }\n \n private parseControlData(){\n if(this.data && this.data.valor){\n try {\n this.model = new SearchProvidersComponentConfiguration(JSON.parse(this.data.valor));\n } catch (ex) {} \n } \n }\n\n private populateDropdownByParams(paramMap:SearchQsParamMapModel, qsParams: SearchQsParametersModel){\n if(paramMap.param1){\n let _locationObjectSelected = new LocationSearchResultItem();\n\n if(paramMap.param1 == \"texto\"){\n this.searchProviderCtrl.setValue({ nombre: qsParams.t });\n\n // carga de dropdown localidad\n if(paramMap.param4){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}/${paramMap.param4}`;\n _locationObjectSelected.nombre = paramMap.param4.replace(/-/g, ' ');\n }\n else if(paramMap.param3){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}`;\n _locationObjectSelected.nombre = paramMap.param3.replace(/-/g, ' ');\n }\n else if(paramMap.param2){\n _locationObjectSelected.url = `${paramMap.param2}`;\n _locationObjectSelected.nombre = paramMap.param2.replace(/-/g, ' ');\n }\n }\n // caso de que se selecciono localidad y el dropdown de proveedores no.\n else if(paramMap.param1 == \"todos\"){\n if(paramMap.param4){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}/${paramMap.param4}`;\n _locationObjectSelected.nombre = paramMap.param4.replace(/-/g, ' ');\n }\n else if(paramMap.param3){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}`;\n _locationObjectSelected.nombre = paramMap.param3.replace(/-/g, ' ');\n }\n else{\n _locationObjectSelected.url = `${paramMap.param2}`;\n _locationObjectSelected.nombre = paramMap.param2.replace(/-/g, ' ');\n } \n }\n else {\n this.providerSelected = new DoctorSearchResult();\n this.providerSelected.nombre = paramMap.param2.replace(/-/g, ' ');\n this.providerSelected.url = `/${paramMap.param1}/${paramMap.param2}`;\n\n this.searchProviderCtrl.setValue(this.providerSelected);\n\n // carga de dropdown localidad\n if(paramMap.param5){\n _locationObjectSelected.url = `${paramMap.param3}/${paramMap.param4}/${paramMap.param5}`;\n _locationObjectSelected.nombre = paramMap.param5.replace(/-/g, ' ');\n }\n else if(paramMap.param4) {\n _locationObjectSelected.url = `${paramMap.param3}/${paramMap.param4}`;\n _locationObjectSelected.nombre = paramMap.param4.replace(/-/g, ' ');\n }\n else if(paramMap.param3){\n _locationObjectSelected.url = `${paramMap.param3}`;\n _locationObjectSelected.nombre = paramMap.param3.replace(/-/g, ' ');\n }\n }\n\n if(this.model.locationDefault && qsParams && qsParams.filtros){\n let conceptIds = qsParams.filtros.split(',').map(Number);\n let conceptSelected = this.model.locationDefault.seccion3?.find(c=> conceptIds.includes(c.id));\n\n if(conceptSelected){\n _locationObjectSelected = new LocationSearchResultItem();\n _locationObjectSelected.id = conceptSelected.id;\n _locationObjectSelected.nombre = this.layoutService.getTextByLanguage(conceptSelected.nombre, this.locale.language);\n }\n }\n\n if(_locationObjectSelected.nombre){\n this.locationObjectSelected = _locationObjectSelected;\n this.searchLocationCtrl.setValue(this.locationObjectSelected);\n }\n }\n }\n\n configSearchProviders(){\n this.filteredResults$ = this.searchProviderCtrl.valueChanges\n .pipe(\n tap(()=>{ \n this.loadingSearchProvider = true;\n }),\n debounceTime(300),\n startWith(''),\n switchMap(value => \n this.filterProviders(value)\n .pipe(\n map(results => {\n this.loadingSearchProvider = false;\n\n this.highlightValue = value;\n\n this.filteredResultsCount = results.length;\n \n return this.groupProviderResults(results);\n })\n )\n )\n );\n }\n\n configSearchLocations(){\n if(this.model.hideLocationAutocomplete)\n return;\n\n if(this.model.locationDefault){\n this.locationLevels = this.model.locationDefault.niveles; \n }\n\n if(this.model.comboLocation){\n this.filteredLocationResults$ = this.searchLocationCtrl.valueChanges\n .pipe(\n tap(()=>{ \n this.loadingSearchLocation = true;\n }),\n debounceTime(300),\n startWith(''),\n switchMap(value => {\n\n let options = this.filterDefaultLocations(value);\n\n this.loadingSearchLocation = false;\n this.highlightValue = !!value \n ? (typeof value === 'string')\n ? value.toLowerCase()\n : value.nombre.toLowerCase()\n : '';\n\n this.filteredLocationResultsCount = options.length;\n\n return of(options);\n })\n );\n }\n else{\n\n this.filteredLocationResults$ = this.searchLocationCtrl.valueChanges\n .pipe(\n tap(()=>{ \n this.loadingSearchLocation = true;\n }),\n debounceTime(300),\n startWith(''),\n switchMap(value =>\n this.filterLocations(value)\n .pipe(\n map(results => {\n this.loadingSearchLocation = false;\n\n this.highlightValue = !!value \n ? (typeof value === 'string')\n ? value.toLowerCase()\n : value.nombre.toLowerCase()\n : '';\n\n this.filteredLocationResultsCount = results.length;\n\n return results;\n })\n )\n )\n );\n }\n }\n\n filterDefaultLocations(value:any):LocationSearchResultGroup[]{\n\n let optionsGrouped = this.getLocationSearchGroupByDefault();\n\n if(value){\n const textValue = (typeof value === 'string')\n ? value.toLowerCase()\n : value.nombre.toLowerCase();\n\n optionsGrouped = optionsGrouped.filter(og => og.results.filter(r => r.nombre.toLowerCase().includes(textValue)).length > 0);\n\n optionsGrouped.forEach(og => {\n og.results = og.results.filter(r => r.nombre.toLowerCase().includes(textValue));\n });\n\n return optionsGrouped;\n }\n else{\n return optionsGrouped;\n }\n }\n\n filterProviders(value:string):Observable {\n if (value)\n value = value.trim();\n \n if(!this.autocompleteOpen)\n return of([]);\n\n if((!value || value == '') && this.model.profilesDefault.length > 0){\n return of(this.getProfilesDefault());\n }\n else{\n let _profileSearchTypes = this.model.profileTypes.split(\",\").map(pt => +pt);\n\n return this.doctorService.searchDoctors(this.locale.language, value, this.companyName, _profileSearchTypes);\n }\n }\n\n filterLocations(value:any):Observable{\n\n value = value ? (typeof value === 'string') ? value.trim() : value.nombre.trim() : '';\n\n if(!this.locationAutocompleteOpen)\n return of([]);\n\n if((!value || value == '') && this.model.locationDefault != null){\n return of(this.getLocationSearchGroupByDefault());\n }\n else{\n return this.getLocationsByLevels(value);\n }\n }\n\n removeSearchProviderSelected(){\n this.removingSelection = true;\n\n this.searchProviderCtrl.reset('');\n this.searchInput.nativeElement.value = '';\n this.providerSelected = null;\n\n if(this.model.profilesDefault.length > 0) {\n setTimeout(()=>{\n this.autocompleteOpen = true;\n this.autocompleteProviderTrigger.openPanel();\n this.autocompleteProviderTrigger._onChange('');\n this.autocompleteProviderTrigger.updatePosition();\n }, 100);\n }\n\n setTimeout(() => {\n this.removingSelection = false;\n }, 100);\n\n this.fireSearchEvent();\n }\n\n removeSearchLocationSelected(){\n this.removingSelection = true;\n\n this.searchLocationCtrl.reset('');\n this.searchLocationInput.nativeElement.value = '';\n this.locationObjectSelected = null;\n\n if(this.model.locationDefault != null) {\n setTimeout(()=>{\n this.locationAutocompleteOpen = true;\n this.autocompleteLocationTrigger.openPanel();\n this.autocompleteLocationTrigger._onChange('');\n this.autocompleteLocationTrigger.updatePosition();\n }, 100);\n }\n\n setTimeout(() => {\n this.removingSelection = false;\n }, 100);\n\n this.fireSearchEvent();\n }\n\n groupProviderResults(results: DoctorSearchResult[]): DoctorSearchResultGroup[]{\n let _resultGroup:DoctorSearchResultGroup[] = [];\n\n let _resultsGrouped = this.utilsService.groupBy(results, sd => sd.claseId);\n\n _resultsGrouped.forEach((value: DoctorSearchResult[], key: number)=>{\n let resultGroupItem = new DoctorSearchResultGroup();\n\n resultGroupItem.classId = key;\n resultGroupItem.className = this.getOptgroupLabelProvider(value[0].clase);\n resultGroupItem.results = value;\n\n _resultGroup.push(resultGroupItem);\n });\n\n return _resultGroup;\n }\n\n getOptgroupLabelProvider(text:string){\n let optgroupFocusAreaText:string = this.translation.translate('shared.searchResults.searchProviders.optgroupFocusArea');\n\n return text.toLocaleLowerCase() == optgroupFocusAreaText.toLocaleLowerCase() \n ? this.translation.translate('shared.searchResults.searchProviders.optgroupExpertIn')\n : text;\n }\n\n profileSelected(event: MatAutocompleteSelectedEvent): void {\n this.loadingSearchProvider = false;\n\n this.removeClassnameSearchOpenedToBody();\n\n let _optionSelected:DoctorSearchResult = event.option.value;\n\n let _clase = _optionSelected.clase.toLowerCase();\n\n if(_clase == 'doctor' || _clase == 'proveedor'){\n let url = this.publicProfileService.getPublicProfileUrl(_optionSelected.url);\n \n this.publicProfileService.openPublicProfile(url);\n }\n else {\n this.providerSelected = _optionSelected;\n \n if(this.model.hideLocationAutocomplete){\n this.fireSearchEvent();\n }\n else{\n if(!this.isExtremeMobile()){\n setTimeout(()=>{\n this.autocompleteLocationTrigger.openPanel();\n console.log('this.searchLocationInput.nativeElement.focus();')\n this.searchLocationInput.nativeElement.focus();\n }, 100);\n }\n \n if(this.locationObjectSelected){\n this.fireSearchEvent();\n }\n }\n }\n }\n\n isExtremeMobile() {\n return this.isBrowser && window.innerWidth < 600;\n }\n\n locationSelected(event: MatAutocompleteSelectedEvent): void {\n this.loadingSearchLocation = false;\n\n let _optionSelected:LocationSearchResultItem = event.option.value;\n\n this.locationObjectSelected = _optionSelected;\n\n this.fireSearchEvent();\n this.closeAutocompleteLocationpanel();\n }\n\n autoCompleteProviderDisplayWith(item: DoctorSearchResult){\n return item \n ? item.nombre \n : \"\";\n }\n\n autoCompleteLocationDisplayWith(item: TerritorialDivision){\n return item \n ? item.nombre \n : \"\";\n }\n\n onKeydownInputSearch($event: KeyboardEvent){\n if($event.key !== 'Enter'){\n this.providerSelected = null;\n }\n }\n\n onKeydownInputLocationSearch($event: KeyboardEvent){\n if($event.key !== 'Enter'){\n this.locationObjectSelected = null;\n }\n }\n\n addClassnameSearchOpenedToBody(){\n this.document.body.classList.add('search-v1-opened');\n }\n\n removeClassnameSearchOpenedToBody(){\n this.document.body.classList.remove('search-v1-opened');\n }\n\n onFocusInputSearch(){\n this.autocompleteOpen = true;\n\n // ejecutar la busqueda del autocomplete si el input tiene un texto\n if(this.searchInput.nativeElement.value){\n this.autocompleteProviderTrigger._onChange(this.searchInput.nativeElement.value);\n }\n // si no tiene texto y valores por defecto, se agrega un timeout para que reposicione el dropdown\n else if(this.model.profilesDefault.length > 0) {\n \n setTimeout(()=>{\n this.autocompleteProviderTrigger._onChange('');\n this.autocompleteProviderTrigger.updatePosition();\n }, 100);\n }\n else{\n this.addClassnameSearchOpenedToBody();\n }\n }\n\n onFocusInputLocationSearch(){\n this.locationAutocompleteOpen = true;\n\n // ejecutar la busqueda del autocomplete si el input tiene un texto\n if(this.searchLocationInput.nativeElement.value){\n this.autocompleteLocationTrigger._onChange(this.searchLocationInput.nativeElement.value);\n }\n // si no tiene texto y valores por defecto, se agrega un timeout para que reposicione el dropdown\n else if(this.model.locationDefault != null) {\n setTimeout(()=>{\n this.autocompleteLocationTrigger._onChange('');\n this.autocompleteLocationTrigger.updatePosition();\n }, 100);\n }\n setTimeout(() => {\n if (this.isExtremeMobile() && this.locationAutocompleteOpen && !this.matAutocompleteLocation.isOpen)\n this.autocompleteLocationTrigger.openPanel();\n }, 100);\n }\n\n onBlurInputSearch(){\n if(!this.locationAutocompleteOpen)\n this.removeClassnameSearchOpenedToBody();\n \n if(!this.isExtremeMobile())\n this.autocompleteOpen = false;\n\n if(!this.searchInput.nativeElement.value){\n this.searchProviderCtrl.setValue(null);\n this.providerSelected = null;\n }\n }\n\n onBlurInputLocationSearch(){\n if(!this.autocompleteOpen)\n this.removeClassnameSearchOpenedToBody();\n\n if(!this.isExtremeMobile())\n this.locationAutocompleteOpen = false;\n\n if(!this.searchLocationInput.nativeElement.value){\n this.searchLocationCtrl.setValue(null);\n this.locationObjectSelected = null;\n }\n }\n\n showingCancelSearchProvider(){\n return this.isExtremeMobile() && this.autocompleteOpen;\n }\n\n onCancelSearchProvider(){\n this.autocompleteOpen = false;\n\n this.autocompleteProviderTrigger.closePanel();\n\n this.searchInput.nativeElement.disabled = true;\n setTimeout(() => this.searchInput.nativeElement.disabled = false, 100);\n\n this.removeClassnameSearchOpenedToBody();\n\n if(this.model.profilesDefault.length == 0 || this.filteredResultsCount == 0)\n event?.stopPropagation();\n }\n\n showingCancelSearchLocation(){\n return this.isExtremeMobile() && this.locationAutocompleteOpen;\n }\n\n onCancelSearchLocation(){ \n this.closeAutocompleteLocationpanel();\n if(this.model.locationDefault == null || this.filteredLocationResultsCount == 0)\n event?.stopPropagation();\n }\n\n private closeAutocompleteLocationpanel(): void {\n this.removeClassnameSearchOpenedToBody();\n\n this.locationAutocompleteOpen = false;\n this.searchLocationInput.nativeElement.disabled = true;\n setTimeout(() => this.searchLocationInput.nativeElement.disabled = false, 100);\n }\n\n autocompleteProfileOpened():void{\n this.autocompleteOpen = true;\n\n this.addClassnameSearchOpenedToBody();\n }\n\n autocompleteClosed() {\n this.removeClassnameSearchOpenedToBody();\n\n if(this.isExtremeMobile() && this.removingSelection)\n return;\n\n this.autocompleteOpen = false;\n }\n\n autocompleteLocationOpened():void{\n this.locationAutocompleteOpen = true;\n\n this.addClassnameSearchOpenedToBody();\n }\n\n autocompleteLocationClosed() {\n this.removeClassnameSearchOpenedToBody();\n\n if(this.isExtremeMobile() && this.removingSelection)\n return;\n\n //this.locationAutocompleteOpen = false;\n }\n\n\n showIconDropdownOption(item:DoctorSearchResult){\n return item.claseId == ClassConcept.ESPECIALIDAD\n || item.claseId == ClassConcept.DIAGNOSTICO\n || item.claseId == ClassConcept.AREAS_DE_ENFOQUE\n || item.claseId == ClassConcept.PROCEDIMIENTO;\n }\n\n getIconClassNameDropdownOption(item:DoctorSearchResult){\n let iconClassName = 'phr-iconset-';\n\n switch(item.claseId){\n case ClassConcept.ESPECIALIDAD:\n iconClassName += 'estetoscopio';\n break;\n case ClassConcept.DIAGNOSTICO:\n iconClassName += 'info-general2';\n break;\n case ClassConcept.AREAS_DE_ENFOQUE:\n iconClassName += 'medal';\n break;\n case ClassConcept.PROCEDIMIENTO:\n iconClassName += 'procedimientos';\n break;\n default:\n break;\n }\n\n return iconClassName;\n }\n\n showAvatarDropdownOption(item:DoctorSearchResult){\n return item.claseId == 0;\n }\n\n showDescriptionDropdownOption(item:DoctorSearchResult){\n return item.claseId == 0;\n }\n\n isDoctor(item:DoctorSearchResult) {\n return item.tipoPerfilPublico == PublicProfileType.Doctor;\n }\n\n getProfileTypeIconClassName(item:DoctorSearchResult){\n\n let profileType = item.tipoPerfilPublico;\n let className: string = 'phr-iconset-';\n\n switch(profileType){\n case PublicProfileType.Doctor:\n default:\n className += 'estetoscopio';\n break;\n case PublicProfileType.Farmacia:\n className += 'farmacia';\n break;\n case PublicProfileType.Clinica:\n className += 'hospital';\n break;\n case PublicProfileType.Fisioterapia:\n className += 'fisioterapia';\n break;\n case PublicProfileType.Laboratorio:\n className += 'laboratorios';\n break;\n case PublicProfileType.CentroDeImagenes:\n className += 'imagenologia';\n break; \n case PublicProfileType.ServiciosOdontologicos:\n className += 'odontologia';\n break;\n case PublicProfileType.Opticas:\n className += 'open-eye';\n break;\n }\n\n return className;\n }\n\n\n onClickSearchButton(){\n this.fireSearchEvent();\n }\n\n private getProfilesDefault(){\n return (this.model.profilesDefault && this.model.profilesDefault.length > 0)\n ? this.model.profilesDefault.map(cd => {\n let doctorSearchResult = new DoctorSearchResult();\n doctorSearchResult.id = cd.id;\n doctorSearchResult.claseId = cd.claseId;\n doctorSearchResult.clase = this.layoutService.getTextByLanguage(cd.clase, this.locale.language);\n doctorSearchResult.nombre = this.layoutService.getTextByLanguage(cd.nombre, this.locale.language);\n doctorSearchResult.descripcion = this.layoutService.getTextByLanguage(cd.descripcion, this.locale.language);\n doctorSearchResult.url = cd.url;\n doctorSearchResult.urlImagen = cd.urlImagen;\n\n return doctorSearchResult;\n })\n : [];\n }\n\n private fireSearchEvent(){\n this.searchInput.nativeElement.value = this.searchInput.nativeElement.value.trim();\n\n let _searchText = this.searchInput.nativeElement.value;\n let _providerSearchMessage = new ProviderSearchMessage();\n\n if(this.providerSelected){\n _providerSearchMessage.conceptNav = this.providerSelected.url;\n _providerSearchMessage.conceptId = this.providerSelected.id;\n _providerSearchMessage.conceptClaseId = this.providerSelected.claseId;\n }\n else {\n _providerSearchMessage.searchText = _searchText;\n }\n\n if(this.locationObjectSelected){\n if(this.locationObjectSelected.url){\n _providerSearchMessage.territorialDivisionIdentification = this.locationObjectSelected.url;\n }\n else {\n _providerSearchMessage.filtros = this.locationObjectSelected.id.toString();\n }\n }\n else{\n this.searchLocationCtrl.reset();\n }\n\n this.messageBusService.providerSearch(_providerSearchMessage);\n }\n\n private getLocationSearchGroupByDefault():LocationSearchResultGroup[]{\n let _resultGroup:LocationSearchResultGroup[] = [];\n\n // SECCION 1\n let _section1Grouped = this.model.locationDefault.seccion1 && this.model.locationDefault.seccion1.length > 0 \n ? this.utilsService.groupBy(this.model.locationDefault.seccion1, sd => sd.nivel)\n : new Map();\n\n _section1Grouped.forEach((value: TerritorialDivision[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.getLocationDisplayNameFromLevelDefault(key);\n\n resultGroupItem.results = value.map(td => { \n return {\n id: td.id, \n nombre: this.layoutService.getTextByLanguage(td.nombreCanonico, this.locale.language),\n url: td.identificador, \n icono: td.paisISO == 'PA' ? 'phr-iconset-panama' : 'phr-iconset-suraplace'\n };\n });\n\n _resultGroup.push(resultGroupItem);\n });\n\n // SECCION 2\n let _section2Grouped = this.model.locationDefault.seccion2 && this.model.locationDefault.seccion2.length > 0 \n ? this.utilsService.groupBy(this.model.locationDefault.seccion2, sd => sd.nivel)\n : new Map();\n\n _section2Grouped.forEach((value: TerritorialDivision[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.getLocationDisplayNameFromLevelDefault(key);\n\n resultGroupItem.results = value.map(td => { \n return {\n id: td.id,\n nombre: this.layoutService.getTextByLanguage(td.nombreCanonico, this.locale.language),\n url: td.identificador,\n icono: 'phr-iconset-suraplace' \n };\n });\n\n _resultGroup.push(resultGroupItem);\n });\n\n // SECCION 3\n let _section3Grouped = this.model.locationDefault.seccion3 && this.model.locationDefault.seccion3.length > 0 \n ? this.utilsService.groupBy(this.model.locationDefault.seccion3, sd => sd.claseId)\n : new Map();\n\n _section3Grouped.forEach((value: ConceptDefaultModel[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.layoutService.getTextByLanguage(value[0].clase, this.locale.language);\n\n resultGroupItem.results = value.map(td => { \n return {\n id: td.id,\n nombre: this.layoutService.getTextByLanguage(td.nombre, this.locale.language),\n url: \"\",\n icono: 'phr-iconset-hospital'\n };\n });\n\n _resultGroup.push(resultGroupItem);\n });\n\n return _resultGroup;\n }\n\n private getLocationsByLevels(value:string):Observable{\n return this.territorialDivisionsService.getByLevels(this.language, value, this.locationLevels).pipe(map((results:TerritorialDivision[])=>{\n let _resultGroup:LocationSearchResultGroup[] = [];\n let _territorialDivisionGrouped = this.utilsService.groupBy(results, sd => sd.nivel);\n\n _territorialDivisionGrouped.forEach((value: TerritorialDivision[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.getLocationDisplayNameFromLevel(key);\n \n resultGroupItem.results = value.map(td => { \n return {id: td.id, nombre: td.nombreCanonico, url: td.identificador, icono: 'phr-iconset-suraplace' };\n });\n \n _resultGroup.push(resultGroupItem);\n });\n\n return _resultGroup;\n }));\n }\n\n private getLocationDisplayNameFromLevel(level: number) {\n return level == 1 ? this.countryText : (level == 2 ? this.stateText : this.cityText);\n }\n\n private getLocationDisplayNameFromLevelDefault(level: number) {\n return level == 1 ? \"\" : (level == 2 ? this.stateDefaultText : this.cityDefaultText);\n }\n\n getAvatarModel(item:DoctorSearchResult) : PublicProfileAvatarComponentModel {\n var avatarModel = new PublicProfileAvatarComponentModel();\n\n avatarModel.personId = item.idPersona;\n avatarModel.avatarUrl = item.urlImagen;\n avatarModel.fullName = item.nombre;\n avatarModel.sex = item.sexo;\n avatarModel.profileType = item.tipoPerfilPublico; \n avatarModel.useAvatarPadding = false;\n\n return avatarModel;\n }\n\n showCloseIcon(){\n return this.providerSelected\n || (this.searchInput \n && this.searchInput.nativeElement \n && this.searchInput.nativeElement.value);\n }\n}\n\nexport class SearchProvidersComponentConfiguration{\n profileTypes:string;\n profilesDefault: ConceptDefaultModel[] = [];\n placeholderProvider: string;\n placeholderLocation: string;\n locationDefault:LocationDefaultModel;\n hideLocationAutocomplete:boolean = false;\n comboLocation:boolean = false;\n\n constructor(obj: SearchProvidersComponentConfiguration);\n constructor(obj?:any){\n this.profileTypes = obj && obj.profileTypes || '';\n this.profilesDefault = obj && obj.profilesDefault || [];\n this.placeholderProvider = obj && obj.placeholderProvider || '';\n this.placeholderLocation = obj && obj.placeholderLocation || '';\n this.locationDefault = obj && obj.locationDefault || null;\n this.hideLocationAutocomplete = obj && obj.hideLocationAutocomplete || false;\n this.comboLocation = obj && obj.comboLocation || false;\n } \n}\n\nexport class DoctorSearchResultGroup {\n classId: number;\n className: string;\n results: DoctorSearchResult[];\n}\n\nexport class LocationSearchResultGroup {\n id: number;\n displayName: string;\n results: LocationSearchResultItem[];\n}\n\nexport class LocationSearchResultItem {\n id: number;\n nombre: string;\n url: string;\n icono?: string;\n}","import { isPlatformBrowser } from '@angular/common';\nimport { Component, HostListener, Inject, Input, OnChanges, PLATFORM_ID, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { DirectorySearchTitle } from 'src/app/shared/interfaces/directory-search-title';\n\n@Component({\n selector: 'app-search-result-title',\n templateUrl: './search-result-title.component.html',\n styleUrls: ['./search-result-title.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class SearchResultTitleComponent implements OnChanges {\n\n @Input() nombreFormulario: string;\n texto1 = 'Doctores';\n texto2 = '';\n textoPrep = '';\n texto3 = '';\n private title: DirectorySearchTitle = {aseguradora: '', id: 0, lugar: '', perfilBusqueda: '', preposicion: ''};\n private texto1Tamanios: {[key: string]: number} = {'600':40, '800':36, '1000':40, '2560':50};\n private texto2Tamanios: {[key: string]: number} = {'600':12, '800':10, '1000':12, '2560':18};\n private texto3Tamanios: {[key: string]: number} = {'600':34, '800':30, '1000':34, '2560':40};\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.nombreFormulario) {\n this.title.perfilBusqueda = (JSON.parse(this.nombreFormulario) as Array<{lenguaje: string, texto: string}>)\n .find(x => x.lenguaje == this.locale.language)?.texto ?? '';\n }\n }\n\n setTitle(arg: DirectorySearchTitle): void {\n this.title = arg;\n this.textoPrep = arg.preposicion;\n this.windowResize()\n }\n\n @HostListener('window:resize', ['$event'])\n private windowResizeEvent(_?: Event) {\n this.windowResize();\n }\n\n private windowResize() {\n if(isPlatformBrowser(this.platformId)){ \n const width = window.innerWidth;\n this.texto1 = this.truncar(this.texto1Tamanios, width, this.title.perfilBusqueda);\n this.texto2 = this.truncar(this.texto2Tamanios, width, this.title.aseguradora);\n this.texto3 = this.truncar(this.texto3Tamanios, width, this.title.lugar);\n }\n }\n\n private truncar(arg0: {[key: string]: number}, arg1: number, arg2: string): string {\n const listKeys = Object.keys(arg0).filter(x => arg1 <= parseInt(x));\n const breakpoint = parseInt(listKeys[0]);\n const maxWidth = arg0[breakpoint] - 1;\n const ellipsis = arg2.length > maxWidth;\n return `${arg2.slice(0, maxWidth).trim()}${ellipsis ? '...' : ''}`;\n }\n\n}\n","
\n \n {{texto1}} {{(texto2 ? 'de ' + texto2 : '')}} {{texto3 ? textoPrep + ' ' + texto3 : ''}}\n
","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MessageBusService, ProviderSearchMessage } from 'src/app/core/services/message-bus.service';\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { ProviderFilterModel } from '../provider-filters-content/provider-filters-content.component';\n\n@Component({\n selector: 'app-provider-filters-dialog',\n templateUrl: './provider-filters-dialog.component.html',\n styleUrls: ['./provider-filters-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ProviderFiltersDialogComponent implements OnInit {\n\n constructor(\n private messageBusService: MessageBusService,\n @Inject(MAT_DIALOG_DATA) public data: ProviderFiltersDialogComponentData,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n ) { }\n\n ngOnInit(): void {\n }\n\n clearFilters(){\n this.messageBusService.clearProviderFilters();\n }\n}\n\nexport class ProviderFiltersDialogComponentData{\n filterModel: ProviderFilterModel;\n publicProfileTypes:PublicProfileType[] ;\n providerSearchMessage: ProviderSearchMessage;\n}\n\n\n","
\n
\n

{{'shared.searchResults.providerFiltersDialog.title' | translate:locale.language }}

\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n","
\n \n \n
","import { Component, HostListener, Inject, Input, OnChanges, OnDestroy, OnInit, PLATFORM_ID, SimpleChanges } from '@angular/core';\nimport { MessageBusService, ProviderSearchMessage } from 'src/app/core/services/message-bus.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { ProviderFiltersDialogComponent, ProviderFiltersDialogComponentData } from '../provider-filters-dialog/provider-filters-dialog.component';\nimport { Observable, Subject, forkJoin, of } from 'rxjs';\nimport { catchError, map, takeUntil } from 'rxjs/operators';\nimport { ProfileFilterSearchResult, ProfileFilterSearchResultConcept } from 'src/app/shared/models/people/profile-filter-search-result.model';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { TextLanguage } from 'src/app/shared/models/people/text-language.model';\nimport { DirectoryFiltersItemType } from 'src/app/shared/models/systems/directory.model';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'app-provider-filters-content',\n templateUrl: './provider-filters-content.component.html',\n styleUrls: ['./provider-filters-content.component.css']\n})\nexport class ProviderFiltersContentComponent implements OnInit, OnChanges, OnDestroy {\n\n private ngUnsubscribe = new Subject();\n private onChanges = new Subject();\n\n filterModel: ProviderFilterModel;\n publicProfileTypes:PublicProfileType[] = [PublicProfileType.Doctor];\n\n show: boolean = false;\n isMobile:boolean = false;\n mdDialogRef: MatDialogRef;\n isDialogOpened: boolean = false;\n\n loading:boolean = false;\n\n selectedConcepts:ProfileFilterSearchResultConcept [] = [];\n\n @Input() profileTypes:string;\n @Input() providerSearchMessage: ProviderSearchMessage;\n\n isBrowser: boolean;\n\n constructor(\n private baseService: BaseService,\n private dialog: MatDialog,\n private messageBusService: MessageBusService,\n private publicProfileService: PublicProfileService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit(): void {\n this.isMobile = this.isBrowser && window.innerWidth <= 800;\n\n if(this.profileTypes)\n this.publicProfileTypes = this.profileTypes.split(',').map(pt => +pt);\n\n this.getDirectoryFilters();\n\n this.messageBusService.onOpenProviderFilters()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(()=>{\n this.openDialog();\n });\n\n this.onChanges\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((data:SimpleChanges)=>{\n this.onChangesInputs();\n });\n \n this.messageBusService.onClearProviderFilters()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(()=>{\n this.filterModel.clear();\n });\n\n this.preloadSelectedFilters();\n\n this.messageBusService.onLocaleChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message =>{\n // Re load filtros \n\n if(this.isBrowser){\n setTimeout(() => {\n window.location.reload();\n }, 500);\n }\n });\n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n this.onChanges.next(changes);\n }\n\n openDialog(){\n\n this.preloadSelectedFilters();\n\n let dataDialog = new ProviderFiltersDialogComponentData();\n \n dataDialog.filterModel = this.filterModel;\n dataDialog.providerSearchMessage = this.providerSearchMessage;\n dataDialog.publicProfileTypes = this.publicProfileTypes;\n\n this.mdDialogRef = this.dialog.open(ProviderFiltersDialogComponent, \n { \n data: dataDialog,\n panelClass: ['provider-filters-dialog', 'provider-filters-dialog-in']\n });\n\n this.isDialogOpened = true;\n\n this.mdDialogRef.afterClosed().subscribe(accepted => {\n this.isDialogOpened = false;\n\n this.getSelectedFilters();\n });\n }\n\n getSelectedFilters(){\n this.loading = false;\n\n this.selectedConcepts = this.filterModel.getSelectedConceptsObject();\n\n this.messageBusService.providerFiltersCount(this.selectedConcepts.length);\n }\n\n removeFilter(concept:ProfileFilterSearchResultConcept){\n\n this.filterModel.remove(concept.cc);\n\n let conceptIds = this.providerSearchMessage.filtros.split(',');\n\n this.providerSearchMessage.filtros = conceptIds.filter(c=> +c != concept.cc).join(',');\n\n this.messageBusService.providerSearch(this.providerSearchMessage);\n\n this.getSelectedFilters();\n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.isMobile = event.target.innerWidth <= 800;\n\n if(!this.isMobile && this.mdDialogRef){\n this.mdDialogRef.close();\n }\n }\n\n private getDirectoryFilters() {\n this.filterModel = new ProviderFilterModel();\n let directory = this.baseService.getDirectory();\n\n if (directory && directory.filtros) {\n let filtersObj = JSON.parse(directory.filtros);\n let directoryFilters = this.baseService.parseObject(filtersObj); \n\n // Find the filter for this provider\n let provider = directoryFilters.providers.find(p => this.publicProfileTypes.includes(p.type));\n\n if (provider) {\n this.filterModel.loadFromModel(provider.filters); \n \n this.show = true;\n }\n }\n }\n\n private preloadSelectedFilters(){\n if(!this.providerSearchMessage.filtros)\n return;\n\n this.loading = true;\n\n let filters = this.providerSearchMessage.filtros.split(',').map(f=> +f);\n\n let loadFiltersArray$:Observable[] = [];\n\n this.filterModel.items.forEach(item => {\n\n if(item.isDropdown()){\n loadFiltersArray$.push(this.loadFilters(item, filters));\n }\n else{\n item.active = filters.filter(f=> f == item.clinicConceptId).length > 0;\n }\n });\n\n if(loadFiltersArray$.length > 0){\n forkJoin(loadFiltersArray$)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result =>{\n this.getSelectedFilters();\n });\n }\n else{\n this.getSelectedFilters();\n }\n\n }\n \n private loadFilters(item: ProviderFilterModelItem, prefilters:number[] = []) {\n let searchText = this.providerSearchMessage.searchText;\n let conceptType = \"\";\n let concept = \"\";\n\n let filtersString = this.getFiltersIds().join(',');\n\n let accountName = this.baseService.getCliniwebDirectoryCompanyName();\n let accountId = this.baseService.getCliniwebDirectoryCompanyId();\n let locationCompanyIds = this.baseService.getCliniwebDirectoryLocationCompanyIds(); \n\n let location = this.baseService.getLocationFromIdentifier(this.providerSearchMessage.territorialDivisionIdentification);\n\n if (!accountName)\n accountName = this.baseService.getCompanyName();\n\n if (this.providerSearchMessage.conceptNav) {\n // Some time the navigation contains '/' like: '/especialidad/cardiologia' in those cases filter the empty strings after split\n let parts = this.providerSearchMessage.conceptNav.split(\"/\").filter(e => e);\n conceptType = parts[0];\n concept = parts[1];\n }\n\n item.loading = true;\n\n return this.publicProfileService.getPublicProfileFilters(\n this.baseService.getLanguage(),\n conceptType,\n searchText, \n concept,\n filtersString,\n accountName,\n location.country,\n location.state,\n location.city,\n item.clinicConceptType,\n this.publicProfileTypes,\n accountId,\n locationCompanyIds,\n this.providerSearchMessage.conceptId,\n this.providerSearchMessage.conceptClaseId\n ).pipe(\n map((result:ProfileFilterSearchResult[]) =>{\n let resultItem = result[0];\n\n if (resultItem) {\n // Mark the items as loaded\n item.loadOption(resultItem.conceptos, prefilters);\n }\n\n item.loading = false;\n\n return true;\n }),\n catchError((err) => {\n this.baseService.handleServiceError(err, \"Error getting profile filters\"); \n return of(false);\n })\n );\n }\n\n private getFiltersIds(){\n let filterByParams = this.providerSearchMessage.filtros \n ? this.providerSearchMessage.filtros.split(',').map(f => +f)\n : [];\n\n let filterSelected = this.filterModel.getSelectedConcepts();\n\n let filterIds = filterByParams.concat(filterSelected);\n\n filterIds = filterIds.filter((item, index)=> { return (filterIds.indexOf(item) == index)});\n\n return filterIds;\n }\n\n private onChangesInputs(){\n this.filterModel.clear();\n\n if(this.providerSearchMessage.filtros){ \n // si hay filtros en el mensaje es por un aseguradora seleccionada\n \n this.loading = true;\n\n let filters = this.providerSearchMessage.filtros.split(',').map(f=> +f);\n let insuranceFilter = this.filterModel.items.find(i=> i.type == DirectoryFiltersItemType.Aseguradora);\n\n if(insuranceFilter){\n this.loadFilters(insuranceFilter, filters)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result =>{\n this.getSelectedFilters();\n });\n } \n }\n else{\n this.getSelectedFilters();\n }\n }\n}\n\nexport class ProviderFilterModel{\n controlId:number = 1;\n loaded = false;\n items: ProviderFilterModelItem[];\n\n loadFromModel(filters: DirectoryFiltersItemsModel[]){\n this.items = [];\n\n let favoriteFilter = filters.find(f => f.tipo == DirectoryFiltersItemType.RedFavorita);\n\n filters.map(f => {\n let item = new ProviderFilterModelItem();\n item.loadFromModel(f, this.controlId);\n\n // se completa el campo para excluirlo del filtro que no es favorito y que es del mismo tipo de concepto\n item.favoriteFilterId = favoriteFilter && favoriteFilter.idClaseConceptoClinico == item.clinicConceptType \n ? favoriteFilter.idConceptoClinico \n : 0;\n\n this.controlId++;\n\n this.items.push(item);\n });\n\n this.loaded = true;\n }\n\n getSelectedConcepts() {\n let selectedList:number[] = [];\n\n if(this.items){\n this.items.forEach(item => {\n let conceptIds = item.getSelectedConceptIds();\n selectedList = selectedList.concat(conceptIds);\n });\n }\n\n return selectedList;\n }\n\n getSelectedConceptsObject(){\n let selectedList:ProfileFilterSearchResultConcept[] = [];\n\n if(this.items){\n this.items.forEach(item => {\n let concepts = item.getSelectedConcepts();\n selectedList = selectedList.concat(concepts);\n });\n }\n\n return selectedList;\n }\n\n clear() {\n if (this.items)\n this.items.map(i => i.clear());\n }\n\n remove(conceptId:number){\n this.items.forEach(item=> {\n if(item.isDropdown() && item.selectedConcepts.find(sc=>sc.cc == conceptId) || item.clinicConceptId == conceptId){\n item.remove(conceptId);\n }\n });\n }\n}\n\nexport class ProviderFilterModelItem {\n controlId:number = 0;\n name: TextLanguage[];\n showInputSearch: boolean;\n type: DirectoryFiltersItemType;\n clinicConceptType:number = 0;\n clinicConceptId:number = 0;\n concepts: ProfileFilterSearchResultConcept[] = [];\n filteredConcepts: Observable;\n loading:boolean;\n loaded:boolean; \n active:boolean;\n selectedConcepts: ProfileFilterSearchResultConcept [] = [];\n favoriteFilterId: number;\n hideOnDesktop: boolean;\n singleSelection: boolean;\n groups: DirectoryFiltersGroupModel[];\n viewConfig: DirectoryFiltersViewConfig;\n\n optionsSubj = new Subject();\n\n loadFromModel(item: DirectoryFiltersItemsModel, controlId:number) {\n this.controlId = controlId;\n this.name = item.nombreClaseConceptoClinico;\n this.showInputSearch = item.mostrarInputSearch;\n this.type = item.tipo;\n this.clinicConceptType = item.idClaseConceptoClinico;\n this.clinicConceptId = item.idConceptoClinico;\n this.hideOnDesktop = item.ocultarEnDesktop;\n this.singleSelection = item.seleccionSimple;\n this.groups = item.grupos;\n this.viewConfig = item.configuracionVista;\n }\n\n isDropdown() {\n return this.clinicConceptId <= 0;\n }\n\n isFavoriteFilter(){\n return this.type == DirectoryFiltersItemType.RedFavorita;\n }\n\n needToLoadOptions() {\n return this.isDropdown() && !this.loaded;\n }\n\n needToFireSearchOnClick() {\n return !this.isDropdown();\n }\n\n clear() {\n this.loaded = false;\n this.active = false;\n this.selectedConcepts = [];\n this.optionsSubj.next([]);\n }\n\n remove(conceptId:number){\n this.loaded = false;\n this.active = false;\n this.selectedConcepts = this.selectedConcepts.filter(selectedConcept=> selectedConcept.cc != conceptId);\n this.optionsSubj.next(this.selectedConcepts);\n }\n\n getSelectedConceptIds(): number[] {\n return this.isDropdown() && this.selectedConcepts.length > 0\n ? this.selectedConcepts.map(c => c.cc)\n : (!this.isDropdown() && this.active)\n ? [this.clinicConceptId]\n : [];\n }\n\n getSelectedConcepts(): ProfileFilterSearchResultConcept[]{\n return this.isDropdown() && this.selectedConcepts.length > 0\n ? this.selectedConcepts\n : (!this.isDropdown() && this.active)\n ? [{cc: this.clinicConceptId, n_cc: JSON.stringify(this.name)} as ProfileFilterSearchResultConcept ]\n : [];\n }\n\n loadOption(options: ProfileFilterSearchResultConcept[], prefilters: number[] = []) {\n this.concepts = this.favoriteFilterId > 0 \n ? options.filter(op => op.cc != this.favoriteFilterId)\n : options; \n \n this.loaded = true;\n\n if(prefilters.length > 0){\n\n prefilters.forEach(pf => {\n let concept = this.concepts.find(c => c.cc == pf);\n\n if(concept && this.selectedConcepts.filter(sc=> sc.cc === concept?.cc).length == 0)\n this.selectedConcepts.push(concept);\n });\n }\n\n // Refresh observer\n this.optionsSubj.next(this.concepts);\n }\n\n onClick() {\n // Chip\n if (!this.isDropdown())\n this.active = !this.active; \n // Dropdown\n else {\n \n }\n }\n\n getIconClass() {\n let iconClass = \"\";\n\n switch (this.type) {\n case DirectoryFiltersItemType.RedFavorita:\n iconClass = \"phr-iconset-fav\";\n break;\n case DirectoryFiltersItemType.RedesSura:\n iconClass = \"phr-iconset-shield\";\n break;\n case DirectoryFiltersItemType.Especialidad:\n iconClass = \"phr-iconset-estetoscopio\";\n break;\n case DirectoryFiltersItemType.AreaEnfoque:\n iconClass = \"phr-iconset-PHR-card\";\n break;\n case DirectoryFiltersItemType.Diagnostico:\n iconClass = \"phr-iconset-illness\";\n break;\n case DirectoryFiltersItemType.Procedimiento:\n iconClass = \"phr-iconset-procedimientos\";\n break;\n case DirectoryFiltersItemType.Teleconsulta:\n iconClass = \"phr-iconset-video-consulta\";\n break;\n case DirectoryFiltersItemType.SedeSura:\n iconClass = \"phr-iconset-place\";\n break;\n case DirectoryFiltersItemType.Abierto24Hrs:\n iconClass = \"phr-iconset-clock\";\n break;\n case DirectoryFiltersItemType.Delivery:\n iconClass = \"phr-iconset-delivery\";\n break;\n case DirectoryFiltersItemType.TipoCentroImagenes:\n iconClass = \"phr-iconset-imagenologia\";\n break;\n case DirectoryFiltersItemType.Urgencias:\n iconClass = \"phr-iconset-urgencia\";\n break;\n case DirectoryFiltersItemType.Hospitalizacion:\n iconClass = \"phr-iconset-suero\";\n break;\n case DirectoryFiltersItemType.Cirugia:\n iconClass = \"phr-iconset-bisturi\";\n break;\n case DirectoryFiltersItemType.LugarAtencion:\n iconClass = \"phr-iconset-hospital\";\n break;\n case DirectoryFiltersItemType.AgendamientoEnLinea:\n iconClass = \"phr-iconset-suradate\";\n break;\n case DirectoryFiltersItemType.Aseguradora:\n iconClass = \"phr-iconset-aseguradora2\";\n break; \n default:\n break;\n }\n\n return iconClass;\n }\n\n getOptionsObserver() {\n return this.optionsSubj.asObservable();\n }\n\n filterOptions = (searchText: any) => {\n // When an option is selected, here we receive the complete object instead of the search string \n if (searchText && searchText.id)\n searchText = searchText.n_cc;\n\n const filterValue = searchText.toLowerCase();\n\n return this.concepts.filter(c => c.n_cc.toLowerCase().indexOf(filterValue) === 0);\n }\n\n getDisplayName = (option: ProfileFilterSearchResultConcept) => {\n if (!option)\n return \"\";\n\n return this.singleSelection\n ? `${option.n_cc}`\n : `${option.n_cc} (${option.num})`;\n }\n\n getDisplayTitleName = (option: ProfileFilterSearchResultConcept) => {\n if (!option)\n return \"\";\n \n return option.n_cc;\n }\n\n getSelectedOptionDisplayName = (option: ProfileFilterSearchResultConcept) => {\n let displayValue = '';\n if(this.selectedConcepts.length > 0){\n this.selectedConcepts.forEach((concept, index) => {\n if (index === 0) {\n displayValue = concept.n_cc;\n } else {\n displayValue += ', ' + concept.n_cc;\n }\n });\n }\n \n return displayValue;\n }\n\n selectOption(option: ProfileFilterSearchResultConcept) {\n this.selectedConcepts.push(option);\n }\n}\n\nexport class DirectoryFiltersModel {\n providers: DirectoryFiltersNetworkModel[];\n}\n\nexport class DirectoryFiltersNetworkModel {\n type: PublicProfileType;\n searchProviderTypes: PublicProfileType[];\n filters: DirectoryFiltersItemsModel[];\n}\n\nexport class DirectoryFiltersItemsModel {\n tipo: DirectoryFiltersItemType;\n idConceptoClinico: number;\n idClaseConceptoClinico: number;\n nombreClaseConceptoClinico: TextLanguage[];\n mostrarInputSearch:boolean;\n ocultarEnDesktop: boolean = false;\n seleccionSimple:boolean;\n grupos: DirectoryFiltersGroupModel[];\n configuracionVista: DirectoryFiltersViewConfig;\n}\n\nexport class DirectoryFiltersGroupModel {\n idsConceptosClinicos: number[];\n tituloGrupo: TextLanguage[];\n tooltip: TextLanguage[];\n}\n\nexport class DirectoryFiltersViewConfig {\n usarIcono: boolean;\n claseCssIcono: string;\n}","\n
\n \n \n
\n\n \n \n
\n\n
\n \n \n \n \n {{getLocationTabTitle(location)}}\n \n \n
\n\n \n\n \n \n
\n
\n
\n
\n
\n
\n
\n","import { Component, Inject, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MatTabChangeEvent } from '@angular/material/tabs';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { PublicProfileDetailType } from 'src/app/shared/models/people/profile-detail.model';\nimport { ProfileLocationResultModel, ProfileResultModel, PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { TextLanguage } from 'src/app/shared/models/people/text-language.model';\n\n@Component({\n selector: 'app-provider-card',\n templateUrl: './provider-card.component.html',\n styleUrls: ['./provider-card.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ProviderCardComponent implements OnInit, OnDestroy {\n\n provider: ProfileResultModel;\n @Input() set profile(provider: ProfileResultModel) {\n this.provider = provider; \n }\n @Input() locations: ProfileLocationResultModel[] = [];\n\n locationSelected: ProfileLocationResultModel | null;\n\n socialNetworksList:SocialNetworkDto[] = [];\n socialNetworksLoaded:boolean = false;\n socialNetworksLoading:boolean = false;\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n constructor(\n private translation: L10nTranslationService,\n private profileService: PublicProfileService,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnInit(): void {\n this.locationSelected = this.locations.length > 0 ? this.locations[0] : null;\n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n goToProfile($event:Event) {\n $event.preventDefault();\n $event.stopPropagation();\n\n let url = this.profileService.getPublicProfileUrl(this.provider.rutaNavegacion); \n\n switch(this.provider.tipoPerfil) {\n case PublicProfileType.Doctor:\n case PublicProfileType.Farmacia: \n case PublicProfileType.Clinica:\n case PublicProfileType.Fisioterapia: \n case PublicProfileType.Laboratorio:\n case PublicProfileType.CentroDeImagenes:\n case PublicProfileType.ServiciosOdontologicos:\n case PublicProfileType.Opticas:\n case PublicProfileType.ClinicasDeAtencionPrimaria:\n default:\n url = `/${url}`;\n break;\n }\n\n this.profileService.openPublicProfile(url);\n }\n\n locationTrackBy(index : number, item: ProfileLocationResultModel){\n return item.id; \n }\n\n getLocationTabTitle(location:ProfileLocationResultModel) {\n let isTeleconsultation = location.teleconsulta == \"S\";\n\n let textTitle = isTeleconsultation\n ? this.translation.translate(\"shared.searchResults.providerCard.labelTabVirtualLocation\", this.locale.language)\n : this.isDoctorProfile()\n ? this.translation.translate(\"shared.searchResults.providerCard.labelTabLocationDoctor\", this.locale.language)\n : this.translation.translate(\"shared.searchResults.providerCard.labelTabLocation\", this.locale.language);\n \n let i = isTeleconsultation\n ? this.locations.filter(l => l.teleconsulta == \"S\").indexOf(location)\n : this.locations.filter(l => l.teleconsulta != \"S\").indexOf(location);\n\n return this.locations.length > 1\n ? `${textTitle} ${i + 1 }`\n : textTitle;\n }\n\n isDoctorProfile(){\n return this.provider.tipoPerfil == PublicProfileType.Doctor;\n }\n\n isClinicProfile(){\n return this.provider.tipoPerfil == PublicProfileType.Clinica;\n }\n\n getWebsiteUrl() {\n let url = this.provider.sitioWeb;\n\n if (!url.startsWith(\"http\"))\n url = \"http://\" + url;\n\n return url;\n }\n\n loadSocialNetworks() {\n this.socialNetworksLoading = true;\n this.profileService.getProfileDetails(\n this.provider.id,\n PublicProfileDetailType.SocialNetworks)\n .subscribe(data => {\n this.socialNetworksLoaded = true;\n this.socialNetworksLoading = false;\n\n if(!data || data.length == 0){\n return;\n }\n\n this.socialNetworksList = data.map(sn => {\n let dto = new SocialNetworkDto();\n\n dto.networkType = sn.idObjetoDetalle;\n dto.url = sn.objetoDetalle;\n dto.iconClassName = this.getSocialNetworkIconClassName(sn.idObjetoDetalle);\n dto.text = this.getOptionTextSocialNetwork(sn.idObjetoDetalle);\n\n return dto;\n });\n });\n }\n\n getSocialNetworkIconClassName(networkType:number){\n let iconClassName = 'phr-iconset-';\n\n switch (networkType) {\n // Facebook\n case 24:\n iconClassName += \"facebook\";\n break;\n // Twitter\n case 25:\n iconClassName += \"twitter\";\n break;\n // Youtube\n case 26:\n iconClassName += \"youtube\";\n break;\n // Linkedin\n case 27:\n iconClassName += \"linked-in\";\n break;\n // Instagram\n case 28:\n iconClassName += \"instagram\";\n break;\n }\n\n return iconClassName;\n }\n\n getOptionTextSocialNetwork(networkType:number){ \n switch (networkType) {\n // Facebook\n case 24:\n return \"Facebook\";\n // Twitter\n case 25:\n return \"Twitter\";\n // Youtube\n case 26:\n return \"Youtube\";\n // Linkedin\n case 27:\n return \"Linkedin\";\n // Instagram\n case 28:\n return \"Instagram\";\n default:\n return \"\";\n }\n }\n\n setLocationSelected(tabEvent:MatTabChangeEvent) { \n this.locationSelected = this.locations[tabEvent.index];\n }\n}\n\nexport class SocialNetworkDto{\n networkType: number;\n url: string;\n iconClassName: string;\n text: string;\n}\n\nexport class FeatureConceptDto{\n text: TextLanguage[];\n iconClassName: string;\n}","
\n \n\n
\n \n
\n \n \n
\n \n \n \n
\n {{subtitle | i18nText:locale.language}}\n
\n
\n {{description | i18nText:locale.language}}\n {{ 'shared.searchResults.results.viewMore' | translate:locale.language }}\n
\n
\n \n
\n \n \n
\n
\n {{providersResult.cantidadTotalResulados}} {{ 'shared.searchResults.results.text1' | translate:locale.language }}\n
\n
\n\n \n
\n \n
\n
\n \n
\n \n\n
\n \n {{'shared.searchResults.results.emptyText1' | translate:locale.language }}\n {{'shared.searchResults.results.emptyText2' | translate:locale.language }}\n
\n\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
","import { Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { Observable, Subject, Subscription, zip } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { MessageBusService, ProviderSearchMessage } from 'src/app/core/services/message-bus.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { ProfileResultModel, ProfileSearchResultsModel, PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { TextLanguage } from 'src/app/shared/models/people/text-language.model';\nimport { environment } from 'src/environments/environment';\nimport { DOCUMENT, isPlatformBrowser, Location } from '@angular/common';\nimport { SearchQsParamMapModel, SearchQsParametersModel } from 'src/app/shared/models/search-results/search-parameters.model';\nimport { DirectoryService } from 'src/app/core/services/directory.service';\nimport { TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\nimport { SearchResultTitleComponent } from '../search-result-title/search-result-title.component';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\n\n@Component({\n selector: 'app-search-results',\n templateUrl: './search-results.component.html',\n styleUrls: ['./search-results.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('SearchResultsComponent')\nexport class SearchResultsComponent implements OnInit, OnDestroy, IControlComponent {\n @ViewChild(SearchResultTitleComponent) private searchResultTitleComponent: SearchResultTitleComponent;\n data: FormComponentData;\n anchoPerfilBusqueda = 0;\n language:string;\n subtitle: TextLanguage[];\n description: TextLanguage[];\n showFullDescription: boolean = false;\n fullDescription: TextLanguage[];\n profileTypes: string;\n profileTypesArray:PublicProfileType[] = [];\n\n providerSearchMessage:ProviderSearchMessage = new ProviderSearchMessage();\n\n accountName:string;\n accountId: number;\n locationCompanyIds: string; \n pageSize:number = 0;\n pageNumber:number = 1;\n disableScroll:boolean = false;\n seed:string = \"\";\n loadingInitialResults = false;\n showDivider:boolean = false;\n loadingResults:boolean = false;\n\n providersResult: ProfileSearchResultsModel;\n\n componentData: SearchResultsComponentData;\n\n private paramMap: SearchQsParamMapModel;\n private qsParams: SearchQsParametersModel;\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n private doSearchProfilesSubscribe:Subscription;\n\n private searchCountry: TerritorialDivision | null;\n\n constructor(\n private baseService: BaseService,\n private publicProfileService: PublicProfileService,\n private route: ActivatedRoute,\n private router: Router,\n private location: Location,\n private messageBusService: MessageBusService,\n private directoryService: DirectoryService,\n private territorialDivisionService: TerritorialDivisionsService,\n @Inject(DOCUMENT) private document: Document,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private utilsService: UtilsService,\n private layoutService: LayoutService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n\n this.language = this.locale.language;\n \n this.messageBusService.onScrollTopBody()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((scrollTop: number)=>{\n this.showDivider = scrollTop > 110;\n });\n\n // Subscribe to new search event\n this.messageBusService.onProviderSearch()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message => {\n\n this.resetSearch();\n\n this.providerSearchMessage = message;\n\n this.updateRoute();\n\n this.searchProviders();\n });\n\n this.messageBusService.onLocaleChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message =>{\n this.language = message.language;\n\n this.resetSearch();\n\n this.searchProviders();\n });\n\n }\n\n ngOnInit(): void {\n this.layoutService.addClassToBody('search-results');\n\n this.accountName = this.baseService.getCliniwebDirectoryCompanyName();\n this.accountId = this.baseService.getCliniwebDirectoryCompanyId();\n this.locationCompanyIds = this.baseService.getCliniwebDirectoryLocationCompanyIds();\n this.seed = this.baseService.getSearchSeed();\n this.pageSize = environment.searchProfilesPageSize;\n\n this.setSearchCountryByCountryApp();\n\n this.parseControlData();\n\n this.initRouteConfig();\n\n this.messageBusService.onSendTerritorialDivisionCountry()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg=>{\n\n this.setSearchCountry(msg.country);\n this.searchProviders();\n }); \n\n let containerEl = this.document.getElementsByTagName(\"html\")[0]; \n this.utilsService.scrollToWithAnimation(containerEl, 0);\n\n // There are some cases in which the user navigate back to this page from login and header is not visible\n if (!this.layoutService.isHeaderVisible()) {\n \n setTimeout(() => {\n this.messageBusService.showHeader();\n this.messageBusService.showAnonymousMenu();\n }, 500);\n }\n }\n\n ngOnDestroy():void{\n this.layoutService.removeClassToBody('search-results');\n\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n initRouteConfig(){\n let _paramMap$ = this.route.paramMap;\n let _queryParams$ = this.route.queryParamMap;\n\n zip(_paramMap$, _queryParams$)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(results =>{\n\n this.paramMap = new SearchQsParamMapModel();\n\n this.paramMap.param1 = results[0].get('param1') || '';\n this.paramMap.param2 = results[0].get('param2') || '';\n this.paramMap.param3 = results[0].get('param3') || '';\n this.paramMap.param4 = results[0].get('param4') || '';\n this.paramMap.param5 = results[0].get('param5') || '';\n\n this.qsParams = new SearchQsParametersModel();\n \n this.qsParams.t = results[1].get('t') || '';\n this.qsParams.filtros = results[1].get('filtros') || '';\n this.qsParams.idC = results[1].get('idC') || \"\";\n this.qsParams.idTc = results[1].get('idTc') || '';\n\n this.fireSearchByParams();\n }, error=>{\n console.log('error');\n });\n }\n\n fireSearchByParams(){ \n if(this.paramMap.param1){\n // busqueda por texto\n if(this.paramMap.param1 == \"texto\" || this.paramMap.param1 == \"todos\"){\n\n if(this.paramMap.param1 == \"texto\")\n this.providerSearchMessage.searchText = this.qsParams.t;\n\n // la ruta contiene division territorial\n if(this.paramMap.param2){\n let _id = this.paramMap.param2;\n\n if(this.paramMap.param3)\n _id +=`/${this.paramMap.param3}`;\n\n if(this.paramMap.param4)\n _id +=`/${this.paramMap.param4}`;\n\n this.providerSearchMessage.territorialDivisionIdentification = _id;\n }\n }\n // busqueda por tipo_concepto/concepto\n else { \n this.providerSearchMessage.conceptNav = `/${this.paramMap.param1}/${this.paramMap.param2}`;\n this.providerSearchMessage.conceptId = this.qsParams.idC? parseInt(this.qsParams.idC) : 0;\n this.providerSearchMessage.conceptClaseId = this.qsParams.idTc? parseInt(this.qsParams.idTc) : 0; \n\n // la ruta contiene division territorial\n if(this.paramMap.param3){\n let _id = this.paramMap.param3;\n\n if(this.paramMap.param4)\n _id +=`/${this.paramMap.param4}`;\n\n if(this.paramMap.param5)\n _id +=`/${this.paramMap.param5}`;\n\n this.providerSearchMessage.territorialDivisionIdentification = _id;\n } \n }\n }\n\n this.providerSearchMessage.filtros = this.qsParams.filtros;\n \n this.searchProviders();\n }\n\n updateRoute(){\n // clear\n this.paramMap.param1 = '';\n this.paramMap.param2 = '';\n this.paramMap.param3 = '';\n this.paramMap.param4 = '';\n this.paramMap.param5 = '';\n this.qsParams.t = '';\n this.qsParams.filtros = '';\n\n // busqueda por texto\n if(this.providerSearchMessage.searchText){\n this.paramMap.param1 = 'texto';\n\n this.qsParams.t = this.providerSearchMessage.searchText;\n }\n // busqueda por concepto\n else if(this.providerSearchMessage.conceptNav){\n\n let conceptNavArray = this.providerSearchMessage.conceptNav.split('/');\n\n this.paramMap.param1 = conceptNavArray[1];\n this.paramMap.param2 = conceptNavArray[2];\n }\n else {\n this.paramMap.param1 = 'todos';\n }\n\n if(this.providerSearchMessage.territorialDivisionIdentification){\n\n let tdArray = this.providerSearchMessage.territorialDivisionIdentification.split('/');\n\n if(this.paramMap.param2){\n this.paramMap.param3 = tdArray[0];\n this.paramMap.param4 = tdArray[1] ?? '';\n this.paramMap.param5 = tdArray[2] ?? '';\n }\n else{\n this.paramMap.param2 = tdArray[0];\n this.paramMap.param3 = tdArray[1] ?? '';\n this.paramMap.param4 = tdArray[2] ?? '';\n }\n }\n\n this.qsParams.filtros = this.providerSearchMessage.filtros;\n \n let url = `${this.baseService.getLanguage()}/${this.router.url.split('/')[1].split('?')[0]}/${this.paramMap.param1}`; \n url += this.paramMap.param2 ? `/${this.paramMap.param2}` : '';\n url += this.paramMap.param3 ? `/${this.paramMap.param3}` : '';\n url += this.paramMap.param4 ? `/${this.paramMap.param4}` : '';\n url += this.paramMap.param5 ? `/${this.paramMap.param5}` : '';\n\n let qs = this.qsParams.t ? `t=${this.qsParams.t}` : '';\n qs += this.qsParams.filtros\n ? qs\n ? `&filtros=${this.qsParams.filtros}`\n : `filtros=${this.qsParams.filtros}`\n : '';\n \n if (this.providerSearchMessage.conceptId > 0) {\n this.qsParams.idC = this.providerSearchMessage.conceptId.toString();\n this.qsParams.idTc = this.providerSearchMessage.conceptClaseId.toString();\n\n if (qs)\n qs += \"&\";\n qs += (\"idC=\" + this.providerSearchMessage.conceptId);\n qs += (\"&idTc=\" + this.providerSearchMessage.conceptClaseId);\n }\n\n this.location.go(url, qs); \n }\n\n searchProviders(){\n this.getTitleText();\n\n this.loadingInitialResults = true;\n\n if(this.doSearchProfilesSubscribe){\n this.doSearchProfilesSubscribe.unsubscribe();\n }\n \n this.doSearchProfilesSubscribe = this.doSearchProfiles()\n .subscribe(result => {\n this.providersResult = result;\n\n this.loadingInitialResults = false;\n },\n error => {\n this.baseService.handleServiceError(error, \"Error getting profiles\"); \n });\n }\n\n resetSearch() { \n this.pageNumber = 1;\n this.disableScroll = false;\n }\n\n onScrollDown() {\n this.loadMoreProfiles();\n }\n\n @HostListener('window:scroll', ['$event'])\n handleScroll(event: Event) {\n if(isPlatformBrowser(this.platformId)){\n\n const windowHeight = window.innerHeight;\n const documentHeight = this.document.documentElement.scrollHeight;\n const scrollPosition = window.scrollY \n || window.pageYOffset \n || this.document.body.scrollTop + (this.document.documentElement && this.document.documentElement.scrollTop || 0);\n\n // Verifica si el usuario ha llegado al final del scroll\n if (scrollPosition + windowHeight >= documentHeight && window.innerWidth <= 800) {\n // El usuario ha llegado al final del scroll, ejecuta tu mƩtodo aquƭ\n this.loadMoreProfiles();\n }\n }\n }\n\n loadMoreProfiles() {\n // all profiles has been loaded\n if(this.providersResult.cantidadTotalResulados == this.providersResult.perfiles.length)\n return;\n\n // Increase page number\n this.pageNumber = this.pageNumber + 1;\n this.loadingResults = true;\n\n this.doSearchProfiles()\n .subscribe(result => {\n\n this.loadingResults = false;\n \n if (result && result.perfiles && result.perfiles.length > 0) {\n\n // Add all the new profiles\n result.perfiles.map(p => this.providersResult.perfiles.push(p));\n \n // Join all locations\n for(let i=0; i < result.localidades.length; i++) {\n let exists = this.providersResult.localidades.find(l => l.id == result.localidades[i].id);\n\n if (!exists)\n this.providersResult.localidades.push(result.localidades[i]);\n }\n\n if (result.perfiles.length < this.pageSize)\n this.disableScroll = true;\n } \n else \n this.disableScroll = true;\n },\n error => {\n this.baseService.handleServiceError(error, \"Error getting profiles\"); \n });\n }\n\n showResults(){\n return this.providersResult && this.providersResult.perfiles && this.providersResult.perfiles.length > 0;\n }\n\n showEmptyState(){\n return !this.loadingInitialResults \n && this.providersResult \n && this.providersResult.perfiles \n && this.providersResult.perfiles.length == 0;\n }\n\n providerTrackBy(index : number, item: ProfileResultModel){\n return item.id; \n }\n\n getProfileTypeIconClassName(){\n\n let profileType = this.profileTypesArray[0];\n let className: string = 'phr-iconset-';\n\n switch(profileType){\n case PublicProfileType.Doctor:\n default:\n className += 'estetoscopio';\n break;\n case PublicProfileType.Farmacia:\n className += 'farmacia';\n break;\n case PublicProfileType.Clinica:\n className += 'hospital';\n break;\n case PublicProfileType.Fisioterapia:\n className += 'fisioterapia';\n break;\n case PublicProfileType.Laboratorio:\n className += 'laboratorios';\n break;\n case PublicProfileType.CentroDeImagenes:\n className += 'imagenologia';\n break; \n case PublicProfileType.ServiciosOdontologicos:\n className += 'odontologia';\n break;\n case PublicProfileType.Opticas:\n className += 'open-eye';\n break;\n case PublicProfileType.ClinicasDeAtencionPrimaria:\n className += 'clinic';\n break;\n case PublicProfileType.Todos:\n className += 'todos';\n break;\n }\n\n return className;\n }\n\n getLocationsByProvider(provider: ProfileResultModel){\n return this.providersResult.localidades.filter(l => l.idPersona == provider.idPersona);\n }\n\n onShowFullDescription(){\n this.showFullDescription = true;\n }\n\n getTitleText(){\n\n let territorialDivisionIdentification = this.providerSearchMessage.territorialDivisionIdentification\n ? this.providerSearchMessage.territorialDivisionIdentification\n : this.searchCountry\n ? this.searchCountry.identificador\n : '';\n\n this.directoryService.getSearchTitle(\n this.language,\n this.profileTypesArray[0],\n this.providerSearchMessage.searchText,\n this.providerSearchMessage.conceptClaseId,\n this.providerSearchMessage.conceptId,\n territorialDivisionIdentification,\n this.providerSearchMessage.filtros)\n .subscribe(x => {\n do {\n this.searchResultTitleComponent?.setTitle(x);\n } while(!this.searchResultTitleComponent);\n }\n , error => {\n this.baseService.handleServiceError(error, \"Error getting profiles\"); \n });\n }\n\n private getAllProfileTypes(){\n // se filtra el tipo de perfil sede sura porque si se deja no lista las clinicas\n return Object.values(PublicProfileType).filter((v) => !isNaN(Number(v))).map((p) => Number(p));\n };\n\n private parseControlData(){\n if(this.data && this.data.valor){\n try {\n this.componentData = this.baseService.parseObject(JSON.parse(this.data.valor));\n\n this.profileTypes = this.componentData.tipos ? this.componentData.tipos : \"1\";\n\n this.profileTypesArray = this.profileTypes.split(\",\").map(pt => +pt);\n\n if(this.profileTypesArray.length == 1 && this.profileTypesArray[0] == PublicProfileType.Todos){\n this.profileTypesArray = this.getAllProfileTypes();\n this.profileTypes = this.profileTypesArray.join(',');\n }\n\n // subtitulo de la pagina\n this.subtitle = this.componentData.subtitulo;\n\n // decripcion\n this.description = this.componentData.descripcion;\n\n // descripcion detallada\n this.fullDescription = this.componentData.descripcionDetallada;\n\n } catch (ex) {} \n } \n } \n\n private getFiltersString(){\n\n let filters:number[] = [];\n\n if(this.providerSearchMessage.filtros){\n filters = filters.concat(this.providerSearchMessage.filtros.split(',').map(f => +f));\n }\n\n filters = filters.filter((item, index)=> { return (filters.indexOf(item) == index)});\n\n return filters.length > 0 ? filters.join(',') : '';\n }\n\n private doSearchProfiles(): Observable{\n let _results$:Observable;\n let filters = this.getFiltersString();\n let location = this.baseService.getLocationFromIdentifier(this.providerSearchMessage.territorialDivisionIdentification);\n\n if(!location.country && this.searchCountry){\n location.country = this.searchCountry.identificador;\n }\n\n // Search text\n if (!this.providerSearchMessage.conceptNav) {\n let text = this.providerSearchMessage.searchText;\n\n if (!text)\n text = \"{-1}\";\n\n _results$ = this.publicProfileService.searchProfileByText(\n this.seed, \n this.language, \n text, \n filters, \n this.accountName,\n this.pageNumber, \n this.pageSize, \n location.country, \n location.state, \n location.city, \n this.profileTypesArray,\n this.accountId,\n this.locationCompanyIds);\n }\n // Concept search\n else {\n _results$ = this.publicProfileService.searchProfileByConcept(\n this.seed,\n this.language,\n this.providerSearchMessage.conceptNav, \n filters,\n this.accountName,\n this.pageNumber,\n this.pageSize,\n location.country,\n location.state,\n location.city,\n this.profileTypesArray,\n this.accountId,\n this.locationCompanyIds,\n this.providerSearchMessage.conceptId,\n this.providerSearchMessage.conceptClaseId);\n }\n\n return _results$;\n }\n\n private setSearchCountry(country:TerritorialDivision){\n let availableCountries = this.territorialDivisionService.getAvailableCountries();\n\n if(country.idPais != 9 && country.idPais != 1 && availableCountries.find(c=> c.idPais == country?.idPais)){\n this.searchCountry = country;\n this.providerSearchMessage.countryIdentification = country.identificador;\n }\n else{\n this.searchCountry = null;\n this.providerSearchMessage.countryIdentification = '';\n }\n }\n\n private setSearchCountryByCountryApp(){\n this.territorialDivisionService.getCountryApp().subscribe(countryApp=>{\n if(countryApp && countryApp.territorialDivision){\n this.setSearchCountry(countryApp.territorialDivision)\n }\n });\n }\n}\n\nexport class SearchResultsComponentData {\n tipos: string;\n subtitulo: TextLanguage[];\n descripcion: TextLanguage[];\n descripcionDetallada: TextLanguage[];\n}","import { AfterViewInit, Component, ElementRef, Inject, Input, ViewChild } from \"@angular/core\";\r\nimport { L10N_LOCALE, L10nLocale } from \"angular-l10n\";\r\nimport { ThemeColorService } from \"src/app/core/services/theme-color.service\";\r\n\r\n@Component({\r\n selector: 'app-anonymous-language-menu-title',\r\n templateUrl: './anonymous-language-menu-title.component.html',\r\n styleUrls: ['./anonymous-language-menu-title.component.css']\r\n})\r\nexport class AnonymousLanguageMenuTitle implements AfterViewInit {\r\n @Input() themeColor = false;\r\n @Input() color = '';\r\n @Input() icon = '';\r\n @Input() text = '';\r\n @ViewChild('titleItem') titleItem: ElementRef;\r\n constructor(@Inject(L10N_LOCALE) public locale: L10nLocale, private themeColorService: ThemeColorService) {}\r\n ngAfterViewInit(): void {\r\n if (this.themeColor) {\r\n const color = this.themeColorService.theme?.properties['--primary'];\r\n this.titleItem.nativeElement.style.background = color || 'linear-gradient(90deg, #00816D 0%, #00816D 100%)';\r\n } else {\r\n this.titleItem.nativeElement.style.background = this.color;\r\n }\r\n }\r\n}","
\r\n \r\n \r\n {{text | translate:locale.language}}\r\n \r\n
","
\r\n
\r\n {{item.locale.language | l10nDisplayNames:locale.language:{ type: 'language' } }}\r\n \r\n
\r\n
","import { AfterViewInit, Component, Inject, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { L10N_CONFIG, L10N_LOCALE, L10nConfig, L10nLocale } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\n\r\n@Component({\r\n selector: 'app-anonymous-language-menu-item',\r\n templateUrl: './anonymous-language-menu-item.component.html',\r\n styleUrls: ['./anonymous-language-menu-item.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class AnonymousLanguageMenuItemComponent implements AfterViewInit {\r\n\r\n schema = this.l10nConfig.schema;\r\n @ViewChild(MatIcon) titleItem: MatIcon;\r\n\r\n constructor(\r\n @Inject(L10N_CONFIG) private l10nConfig: L10nConfig,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private baseService: BaseService,\r\n private themeColorService: ThemeColorService\r\n ) { }\r\n\r\n ngAfterViewInit(): void {\r\n const color = this.themeColorService.theme?.properties['--primary'];\r\n this.titleItem._elementRef.nativeElement.style.color = color || 'linear-gradient(90deg, #00816D 0%, #00816D 100%)';\r\n}\r\n\r\n setLocale(locale: L10nLocale): void {\r\n this.baseService.setLocale(locale);\r\n }\r\n\r\n}\r\n","","import { Component, Inject, Input, OnDestroy, OnInit, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { delay, map, startWith, takeUntil, withLatestFrom } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\r\nimport { FloatingComponentsMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { ContainerType } from 'src/app/shared/enums/container-type.enum';\r\nimport { Router } from '@angular/router';\r\nimport { AuthService } from 'src/app/core/services/auth.service';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\nimport { Platform } from '@angular/cdk/platform';\r\n\r\n@Component({\r\n selector: 'app-unlicensed-menu',\r\n templateUrl: './unlicensed-menu.component.html',\r\n styleUrls: ['./unlicensed-menu.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n })\r\n export class UnlicensedMenuComponent implements OnDestroy, OnInit {\r\n\r\n @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger;\r\n showAnonymousMenu: Observable;\r\n private ngUnsubscribe = new Subject();\r\n\r\n showLogout: boolean = false;\r\n \r\n constructor( \r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private messageBusService: MessageBusService,\r\n private translation: L10nTranslationService,\r\n private dialogRef: MatDialog,\r\n private authService: AuthService,\r\n private router: Router,\r\n private appStorageService: AppStorageService,\r\n private themeColorService: ThemeColorService,\r\n private platform: Platform,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {\r\n const onShowSignupLoginHeaderMenu = this.messageBusService.onShowSignupLoginHeaderMenu();\r\n this.showAnonymousMenu = this.messageBusService.onHideAnonymousMenu()\r\n .pipe(takeUntil(this.ngUnsubscribe), map(() => false), startWith(true), withLatestFrom(onShowSignupLoginHeaderMenu), map(x => x[0] && x[1]), delay(100));\r\n\r\n this.showLogout = this.authService.isLoggedIn();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.messageBusService.onLoginCompleted()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(msg => {\r\n this.showLogout = true;\r\n })\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n onViewAppointmentsClick(): void {\r\n if(isPlatformBrowser(this.platformId)){\r\n var cliniwebPhrLink = environment.cliniwebPhrUrl; \r\n window.open(cliniwebPhrLink + \"/mis-citas\", '_blank'); \r\n } \r\n }\r\n\r\n onCliniwebForPatientsClick(): void {\r\n if(isPlatformBrowser(this.platformId)){\r\n let cliniwebUrl = environment.cliniwebUrl + \"##comoFuncionaPacientes\"; \r\n window.open(cliniwebUrl, '_blank');\r\n }\r\n }\r\n\r\n goToPortal(): void {\r\n if(isPlatformBrowser(this.platformId)){\r\n let portalUrl = environment.portalUrl; \r\n\r\n window.open(portalUrl, '_blank');\r\n }\r\n }\r\n \r\n goToPortalPublicProfilePage(): void {\r\n if(isPlatformBrowser(this.platformId)){\r\n let portalUrl = environment.portalUrl + \"perfiles\"; \r\n \r\n window.open(portalUrl, '_blank');\r\n }\r\n }\r\n\r\n onCliniwebForDoctorsClick(): void {\r\n if(isPlatformBrowser(this.platformId)){\r\n let cliniwebUrl = environment.cliniwebUrl + \"Doctor##comoFuncionaDoctores\";\r\n\r\n window.open(cliniwebUrl, '_blank');\r\n }\r\n }\r\n\r\n onCliniwebLogoutClick(): void{\r\n let dialogData = new DialogData();\r\n \r\n dialogData.title = this.translation.translate(\"shared.profileMenu.text13\"); \r\n dialogData.confirmText = this.translation.translate(\"shared.profileMenu.text14\"); \r\n dialogData.showHeaderIcon = false;\r\n //dialogData.headerIconClass = \"phr-iconset-info\"; \r\n dialogData.showCancelButton = true;\r\n dialogData.cancelText = this.translation.translate(\"shared.profileMenu.text15\");\r\n \r\n const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: ['cliniweb-theme-dialog', 'confirm-logout-dialog', 'confirm-logout-animation-in']\r\n });\r\n \r\n dialogRef.afterClosed().subscribe(accepted => { \r\n if (accepted) {\r\n this.appStorageService.removeSessionItem(STORAGE.SIGNUP_WORKFLOW_VERIFICATION_TYPE);\r\n this.removeFloatingComponentToHeader();\r\n this.authService.logout();\r\n\r\n this.router.navigate(['/welcome/login'], {queryParams: { homeUrl: '/'}});\r\n }\r\n });\r\n }\r\n\r\n removeFloatingComponentToHeader(){\r\n let message = new FloatingComponentsMessage();\r\n let dummyComponentData = new FormComponentData();\r\n dummyComponentData.contenedor = ContainerType.HEADER;\r\n \r\n message.componentsData = [dummyComponentData];\r\n \r\n this.messageBusService.sendFloatingComponents(message);\r\n }\r\n\r\n onCloseClick(): void {\r\n this.menuTrigger.closeMenu();\r\n }\r\n\r\n onMenuClosed(): void {\r\n this.themeColorService.setThemeColor();\r\n }\r\n onMenuOpened(): void {\r\n if (this.platform.ANDROID || this.platform.IOS)\r\n this.themeColorService.setThemeColor('#FFF');\r\n }\r\n}","
\n \n \n \n\n \n \n\n \n \n\n \n
\n\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Router } from '@angular/router';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\nimport { BaseService } from 'src/app/core/services/base.service';\n\n@Component({\n selector: 'app-header-town-center',\n templateUrl: './header-town-center.component.html',\n styleUrls: ['./header-town-center.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('HeaderTownCenterComponent')\nexport class HeaderTownCenterComponent implements OnInit, IControlComponent {\n data: FormComponentData;\n\n routeClassName: string = '';\n isLicensedCompany: boolean = true;\n loading: boolean = true;\n \n constructor(\n public dialog: MatDialog,\n private router: Router,\n private baseService: BaseService) {\n\n this.router.events.subscribe(()=>{\n this.initRouteClassName();\n\n });\n }\n\n ngOnInit(): void {\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\n this.isLicensedCompany = hasLicenses;\n\n this.loading = false;\n },\n error => {\n \n });\n }\n \n openMenuMobile(){\n const dialogRef = this.dialog.open(MenuMobileComponent, {\n panelClass: 'menu-mobile',\n width:\"338px\",\n height: \"100%\",\n position: { left: \"0px\"}\n });\n }\n\n private initRouteClassName(){\n this.routeClassName = this.router.url.split('/')[1];\n }\n\n}\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\n\r\n@Component({\r\n selector: 'app-header-hospital-paitilla',\r\n templateUrl: './header-hospital-paitilla.component.html',\r\n styleUrls: ['./header-hospital-paitilla.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderHospitalPaitillaComponent')\r\nexport class HeaderHospitalPaitillaComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\n\r\n@Component({\r\n selector: 'app-header-hospital-nacional-phr',\r\n templateUrl: './header-hospital-nacional-phr.component.html',\r\n styleUrls: ['./header-hospital-nacional-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderHospitalNacionalPhrComponent')\r\nexport class HeaderHospitalNacionalPhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private themeColorService: ThemeColorService\r\n ) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.themeColorService.setThemeColor('#FFF', true);\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\n\r\n@Component({\r\n selector: 'app-header-cmpaitilla-phr',\r\n templateUrl: './header-cmpaitilla-phr.component.html',\r\n styleUrls: ['./header-cmpaitilla-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderCmpaitillaPhrComponent')\r\nexport class HeaderCmpaitillaPhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private themeColorService: ThemeColorService\r\n ) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.themeColorService.setThemeColor('#FFF', true);\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\n\r\n@Component({\r\n selector: 'app-header-hchiriqui-phr',\r\n templateUrl: './header-hchiriqui-phr.component.html',\r\n styleUrls: ['./header-hchiriqui-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderHchiriquiPhrComponent')\r\nexport class HeaderHchiriquiPhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private themeColorService: ThemeColorService\r\n ) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.themeColorService.setThemeColor('#FFF', true);\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]); \r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\n\r\n@Component({\r\n selector: 'app-header-cmcaribe-phr',\r\n templateUrl: './header-cmcaribe-phr.component.html',\r\n styleUrls: ['./header-cmcaribe-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderCmcaribePhrComponent')\r\nexport class HeaderCmcaribePhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private themeColorService: ThemeColorService\r\n ) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.themeColorService.setThemeColor('#FFF', true);\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\n\r\n@Component({\r\n selector: 'app-header-thepanamaclinic-phr',\r\n templateUrl: './header-thepanamaclinic-phr.component.html',\r\n styleUrls: ['./header-thepanamaclinic-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderThepanamaclinicPhrComponent')\r\nexport class HeaderThepanamaclinicPhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\n\r\n@Component({\r\n selector: 'app-header-chsf-phr',\r\n templateUrl: './header-chsf-phr.component.html',\r\n styleUrls: ['./header-chsf-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderChsfPhrComponent')\r\nexport class HeaderChsfPhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private themeColorService: ThemeColorService\r\n ) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.themeColorService.setThemeColor('#FFF', true);\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]); \r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ThemeColorService } from 'src/app/core/services/theme-color.service';\r\n\r\n@Component({\r\n selector: 'app-header-chpanamericano-phr',\r\n templateUrl: './header-chpanamericano-phr.component.html',\r\n styleUrls: ['./header-chpanamericano-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderChpanamericanoPhrComponent')\r\nexport class HeaderChpanamericanoPhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService,\r\n private themeColorService: ThemeColorService\r\n ) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.themeColorService.setThemeColor('#FFF', true);\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\n\r\n@Component({\r\n selector: 'app-header-hsantafe-phr',\r\n templateUrl: './header-hsantafe-phr.component.html',\r\n styleUrls: ['./header-hsantafe-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderHsantafePhrComponent')\r\nexport class HeaderHsantafePhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Location } from \"@angular/common\";\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\n\r\n@Component({\r\n selector: 'app-header-pacifica-salud-phr',\r\n templateUrl: './header-pacifica-salud-phr.component.html',\r\n styleUrls: ['./header-pacifica-salud-phr.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HeaderPacificaSaludPhrComponent')\r\nexport class HeaderPacificaSaludPhrComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeClassName: string = '';\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private location: Location,\r\n public dialog: MatDialog,\r\n private router: Router,\r\n private baseService: BaseService) {\r\n\r\n this.router.events.subscribe(()=>{\r\n this.initRouteClassName();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n \r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: 'menu-mobile',\r\n width:\"338px\",\r\n height: \"100%\",\r\n position: { left: \"0px\"}\r\n });\r\n }\r\n\r\n navigateToCompany(){\r\n this.router.navigate([this.baseService.getUrlCompany()]);\r\n }\r\n\r\n gotoBack(){\r\n this.location.back();\r\n }\r\n\r\n private initRouteClassName(){\r\n this.routeClassName = this.router.url.split('/')[1];\r\n }\r\n}\r\n","export class Workflow {\n id: number;\n nombre: string;\n nombreComponente: string;\n tipo: number;\n idEmpresa?: number;\n idResponsableServicio?: number;\n items: WorkflowItem[];\n}\n\nexport class WorkflowItem {\n id: number;\n idFlujoTrabajo: number;\n numeroPaso: number;\n idAreaSistema: number;\n valor: string;\n nombreClaseItem: string;\n}\n\nexport class WorkflowItemData{\n endWorkflow: boolean;\n data: any;\n\n constructor();\n constructor(obj:WorkflowItemData);\n constructor(obj?: any){\n this.endWorkflow = obj && obj.endWorkflow ? obj.endWorkflow : false;\n }\n}","
\n \n \n \n
","import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\n@Component({\n selector: 'app-workflow-progress-bar',\n templateUrl: './workflow-progress-bar.component.html',\n styleUrls: ['./workflow-progress-bar.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class WorkflowProgressBarComponent implements OnInit {\n\n @Input() model: WorkflowProgressBarComponentData;\n returnUrl = '';\n\n constructor(private route: ActivatedRoute, private router: Router) { }\n\n ngOnInit(): void {\n this.route.queryParams.subscribe(params => this.returnUrl = params['returnUrl']);\n }\n\n onClick(): void {\n if (this.returnUrl) {\n this.router.navigateByUrl(this.returnUrl);\n } else {\n this.model.backFn();\n }\n }\n\n}\n\nexport class WorkflowProgressBarComponentData {\n show: boolean;\n showButtonBack: boolean;\n showButtonClose: boolean;\n showProgressBar: boolean;\n percentComplete: number = 0;\n backFn: any;\n closeFn: any;\n}","export enum WorkflowStepName {\r\n PATIENT_VERIFICATION = 'PATIENT_VERIFICATION',\r\n AUTHENTICATION = 'AUTHENTICATION',\r\n SELECT_PATIENT_APPOINTMENT_CHECKOUT = 'SELECT_PATIENT_APPOINTMENT_CHECKOUT',\r\n PATIENT_FORM_APPOINTMENT_CHECKOUT = 'PATIENT_FORM_APPOINTMENT_CHECKOUT',\r\n SELECT_PATIENT_RELATIONSHIP_APPOINTMENT_CHECKOUT = 'SELECT_PATIENT_RELATIONSHIP_APPOINTMENT_CHECKOUT',\r\n PATIENT_CONTACT_FORM_APPOINTMENT_CHECKOUT = 'PATIENT_CONTACT_FORM_APPOINTMENT_CHECKOUT',\r\n SUMMARY_APPOINTMENT_CHECKOUT = 'SUMMARY_APPOINTMENT_CHECKOUT',\r\n SUMMARY_MEDICAL_ORDER = 'SUMMARY_MEDICAL_ORDER',\r\n PAYMENT_AMOUNT = 'PAYMENT_AMOUNT',\r\n PAYMENT_FORM = 'PAYMENT_FORM',\r\n SELECT_COUNTRY = \"SELECT_COUNTRY\",\r\n SELECT_PATIENT_RELATIONSHIP = 'SELECT_PATIENT_RELATIONSHIP',\r\n CREATE_PATIENT_RELATIONSHIP = 'CREATE_PATIENT_RELATIONSHIP'\r\n}","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { Observable, Subject, of } from \"rxjs\";\r\nimport { IStepFlow } from \"src/app/shared/interfaces/step-flow\";\r\nimport { ComponentDataSetMessage, FlowStepCompletedMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { takeUntil } from \"rxjs/operators\";\r\nimport { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\r\nimport { WorkflowItem } from \"../../systems/workflow.model\";\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport abstract class BaseStep implements IStepFlow, OnDestroy {\r\n item: WorkflowItem;\r\n stateData: T;\r\n \r\n showHeader: boolean;\r\n showButtonBack: boolean;\r\n showProgressBar: boolean;\r\n showButtonClose: boolean;\r\n\r\n withoutFooter: boolean;\r\n\r\n attached: boolean = false;\r\n\r\n protected ngUnsubscribe = new Subject();\r\n formConfigurationData: { [componentName: string]: any; };\r\n\r\n constructor(\r\n protected messageBusService: MessageBusService,\r\n ){\r\n } \r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n \r\n onBeforeFormLoad(): Observable {\r\n this.formConfigurationData = this.buildComponentConfigurationData();\r\n\r\n this.attachToComponentEvents();\r\n\r\n return of(undefined);\r\n }\r\n\r\n setItem(item: WorkflowItem): void {\r\n this.item = item;\r\n }\r\n\r\n private attachToComponentEvents() {\r\n if(this.attached)\r\n return;\r\n\r\n this.messageBusService.onSendComponentDataSetMessage()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(message => {\r\n if(this.messageForThisStep(message)){\r\n this.handleComponentSetDataMessage(message);\r\n\r\n // Send message to workflow to check if step is completed\r\n this.sendFlowStepCompletedMessage();\r\n }\r\n });\r\n\r\n this.attached = true;\r\n } \r\n\r\n private sendFlowStepCompletedMessage(){\r\n let message = new FlowStepCompletedMessage();\r\n message.state = this.stateData; \r\n\r\n this.messageBusService.sendFlowStepCompleted(message);\r\n }\r\n\r\n /**\r\n * Handle components dataSet message. This message will be send by component when the component model if fully set\r\n * The message will contain the componentName (the component that generate the message) and the model of the component with the data.\r\n */\r\n protected abstract handleComponentSetDataMessage(message: ComponentDataSetMessage) : void;\r\n \r\n /*\r\n * Create base configuration data for each component\r\n * Return a dictionary where the key is the componentName and value is the component model\r\n */\r\n protected abstract buildComponentConfigurationData() : { [componentName: string]: any; };\r\n\r\n protected abstract messageForThisStep(message: ComponentDataSetMessage): boolean;\r\n\r\n abstract setState(stateData: IWorkflowDataState): void;\r\n abstract isCompleted(): Observable;\r\n abstract showStepInActionBack(): boolean;\r\n abstract showStep(): boolean;\r\n}","import { SignupWorkflowVerificationType } from \"src/app/shared/enums/signup-workflow-verification.enum\";\r\nimport { PublicProfile } from \"../../people/public-profile.model\";\r\n\r\nexport class AuthenticationDataModel{\r\n idVerificacion: string;\r\n idTipoSolicitud: number;\r\n idUsuario: number;\r\n doctorAvatarUrl: string; \r\n configData: AuthenticationComponentData;\r\n profile: PublicProfile;\r\n}\r\n\r\nexport class AuthenticationComponentData{ \r\n showCliniwebSection: boolean;\r\n signupWorkflowVerificationType: SignupWorkflowVerificationType;\r\n workflowType: number;\r\n }","import { Injectable } from \"@angular/core\";\nimport { Observable, of } from \"rxjs\";\nimport { catchError, map, switchMap } from \"rxjs/operators\";\nimport { AuthService } from \"src/app/core/services/auth.service\";\nimport { UserService } from \"src/app/core/services/user.service\";\nimport { UserPerson } from \"../../people/user-person.model\";\nimport { WorkflowItem, WorkflowItemData } from \"../../systems/workflow.model\";\nimport { BaseStep } from \"./base-step.model\";\nimport { ComponentDataSetMessage, MessageBusService, ServiceErrorMessage, WorkflowStateUpdateMessage } from \"src/app/core/services/message-bus.service\";\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\nimport { AuthenticationDataModel } from \"../models/authentication-data.model\";\nimport { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\nimport { WorkflowService } from \"src/app/core/services/workflow.service\";\nimport { BaseService } from \"src/app/core/services/base.service\";\nimport { PublicProfile } from \"../../people/public-profile.model\";\n\n@Injectable({\n providedIn: 'root',\n })\nexport class AuthenticationStep extends BaseStep {\n constructor(\n private authService: AuthService,\n private userService: UserService,\n protected messageBusService: MessageBusService, \n private workflowService: WorkflowService,\n private baseService: BaseService\n ) {\n super(messageBusService);\n\n this.showHeader = true;\n this.showProgressBar = true;\n this.showButtonClose = true;\n\n this.withoutFooter = true;\n }\n\n setItem(item: WorkflowItem): void {\n this.item = item;\n }\n\n setState(stateData: any): void {\n this.stateData = this.workflowService.getWorkflowDataState();\n }\n\n isCompleted():Observable{\n return this.authService.isLoggedInFull().pipe(\n switchMap((isLoggedIn)=>{\n\n return (!isLoggedIn)\n ? of(isLoggedIn)\n : this.completeUserDateState().pipe(\n map((result)=>{\n\n // If the user is logged in when the workflow started the auth step will be completed and \n // the auth component will not be loadded. Bacause of this we need to send a message to the \n // workflow with the state date updated\n let msg = new WorkflowStateUpdateMessage();\n msg.state = this.stateData;\n\n this.messageBusService.onWorkflowStateUpdateMessage(msg);\n\n return result;\n }));\n }));\n }\n\n showStepInActionBack(): boolean {\n return true;\n }\n\n showStep(): boolean {\n return true;\n }\n\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\n if (message.componentName == ComponentName.AUTHENTICATION){\n\n let user = message.data as UserPerson;\n\n this.stateData.setUserData(user);\n this.stateData.setEmmiterPersonId(user.id);\n }\n }\n\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\n let formConfigurationData : { [componentName: string]: any; } = {};\n \n formConfigurationData[ComponentName.AUTHENTICATION] = this.getAuthenticationDataModel();\n\n return formConfigurationData;\n }\n\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\n return message.componentName == ComponentName.AUTHENTICATION;\n }\n\n private getAuthenticationDataModel(): AuthenticationDataModel{\n let dataModel = new AuthenticationDataModel();\n\n dataModel.idVerificacion = this.stateData.getIdVerificacion();\n dataModel.idTipoSolicitud = this.stateData.getIdTipoSolicitud();\n dataModel.idUsuario = this.stateData.getUserId();\n dataModel.doctorAvatarUrl = this.stateData.getDoctorAvatarUrl();\n dataModel.profile = this.stateData.getPublicProfile();\n\n if (this.item.valor) { \n let stepItemData = this.baseService.parseObjectDeep(JSON.parse(this.item.valor));\n\n if (stepItemData.data)\n dataModel.configData = stepItemData.data;\n }\n\n return dataModel;\n }\n\n private completeUserDateState():Observable { \n return this.userService.getUserPersonLoggedIn()\n .pipe(\n map((userPerson: UserPerson | null)=>{\n if(userPerson){\n this.stateData.setUserData(userPerson);\n this.stateData.setEmmiterPersonId(userPerson.id);\n\n return true;\n }\n else{\n return false;\n }\n }),\n catchError(error=>{\n this.messageBusService.serviceError(new ServiceErrorMessage(\"Error getting user logged in\"));\n return of(false);\n }));\n }\n}\n\nexport interface IAuthenticationWorkflowState{\n getIdVerificacion(): string;\n getDoctorAvatarUrl():string;\n getUserId():number;\n getPublicProfile():PublicProfile;\n getIdTipoSolicitud(): number;\n\n setUserData(userPerson: UserPerson): void;\n setEmmiterPersonId(personId: number):void;\n setPublicProfile(profile: PublicProfile):void;\n}\n","import { Injectable } from \"@angular/core\";\r\nimport { BaseStep } from \"./base-step.model\";\r\nimport { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\r\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\r\nimport { TerritorialDivision } from \"../../systems/territorial-division.model\";\r\nimport { WorkflowItem } from \"../../systems/workflow.model\";\r\nimport { WorkflowService } from \"src/app/core/services/workflow.service\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { TerritorialDivisionsService } from \"src/app/core/services/territorial-divisions.service\";\r\nimport { UserService } from \"src/app/core/services/user.service\";\r\nimport { switchMap } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SelectCountryStep extends BaseStep {\r\n constructor(\r\n private userService: UserService,\r\n private territorialDivisionService: TerritorialDivisionsService,\r\n private workflowService: WorkflowService,\r\n protected messageBusService: MessageBusService,\r\n ) {\r\n super(messageBusService);\r\n\r\n this.showHeader = true;\r\n this.showProgressBar = true;\r\n this.showButtonClose = true;\r\n\r\n this.withoutFooter = true;\r\n }\r\n \r\n setItem(item: WorkflowItem): void {\r\n this.item = item;\r\n }\r\n\r\n setState(stateData: any): void {\r\n this.stateData = this.workflowService.getWorkflowDataState();\r\n }\r\n\r\n isCompleted():Observable{\r\n return this.countrySelected();\r\n }\r\n\r\n showStepInActionBack(): boolean {\r\n return true;\r\n }\r\n\r\n showStep(): boolean {\r\n return true;\r\n }\r\n\r\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\r\n if (message.componentName == ComponentName.SELECT_COUNTRY){\r\n\r\n let country = message.data as TerritorialDivision;\r\n\r\n this.stateData.setCountry(country);\r\n }\r\n }\r\n\r\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\r\n let formConfigurationData : { [componentName: string]: any; } = {};\r\n \r\n formConfigurationData[ComponentName.SELECT_COUNTRY] = this.getCountryDataModel();\r\n\r\n return formConfigurationData;\r\n }\r\n\r\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\r\n return message.componentName == ComponentName.SELECT_COUNTRY;\r\n }\r\n\r\n private countrySelected(): Observable{\r\n\r\n let countryId = this.stateData.getCountryId();\r\n\r\n if(countryId == 9){\r\n return this.userService.getUserCountry()\r\n .pipe(switchMap((country: TerritorialDivision | null)=>{\r\n if(country){\r\n this.stateData.setCountry(country);\r\n \r\n return of(true);\r\n }\r\n else{\r\n return of(false);\r\n } \r\n }));\r\n }else{\r\n let availableCountries = this.territorialDivisionService.getAvailableCountries();\r\n\r\n let condition = countryId > 0 && availableCountries.filter(c=>c.idPais == countryId).length > 0;\r\n \r\n return of(condition);\r\n }\r\n }\r\n\r\n private getCountryDataModel(): TerritorialDivision | undefined{\r\n let countryId = this.stateData.getCountryId();\r\n\r\n let availableCountries = this.territorialDivisionService.getAvailableCountries();\r\n\r\n return availableCountries.find(c => c.idPais == countryId);\r\n }\r\n}\r\n\r\nexport interface ISelectCountryWorkflowState{\r\n getCountryId():number;\r\n setCountry(country: TerritorialDivision):void;\r\n}","import { AppointmentInfoDataModel } from \"./appointment-info-data.model\";\r\n\r\nexport class SelectPatientDataModel{\r\n relationship: number = 0;\r\n appointmentInfo: AppointmentInfoDataModel;\r\n\r\n user: PersonDataModel;\r\n patientSelected: PersonDataModel;\r\n}\r\n\r\nexport class PersonDataModel {\r\n id: number = 0;\r\n firstname: string;\r\n lastname: string;\r\n avatar: string;\r\n gender: string;\r\n email: string;\r\n cellPhone: string;\r\n birthDate: Date;\r\n identityPersonValidationStateId: number;\r\n}","import { Injectable } from \"@angular/core\";\nimport { Observable, of } from \"rxjs\";\nimport { WorkflowItem } from \"../../systems/workflow.model\";\nimport { OnlineAppointmentCliniwebState } from \"../states/online-appointment-cliniweb-state.model\";\nimport { AppointmentInfoDataModel } from \"../models/appointment-info-data.model\";\nimport { BaseStep } from \"./base-step.model\";\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\nimport { PersonDataModel, SelectPatientDataModel } from \"../models/select-patient-data.model\";\nimport { RequestingPatient, RequestingUser } from \"../../process/base-request.model\";\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SelectPatientAppointmentCheckoutStep extends BaseStep {\n\n constructor(protected messageBusService: MessageBusService){\n super(messageBusService);\n \n this.showHeader = true;\n this.showButtonBack = true;\n this.showProgressBar = true;\n this.showButtonClose = true;\n }\n\n setItem(item: WorkflowItem): void {\n this.item = item;\n }\n\n setState(stateData: any): void {\n this.stateData = new OnlineAppointmentCliniwebState(stateData);\n }\n\n isCompleted():Observable{\n return of(this.relationshipSelected());\n }\n\n showStepInActionBack(): boolean {\n return true;\n }\n \n showStep(): boolean {\n return true;\n }\n \n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\n if (message.componentName == ComponentName.SELECT_PATIENT){\n\n let _dataModel = message.data as SelectPatientDataModel;\n\n this.stateData.setPatientDataInitiallyIncomplete(false);\n\n if(_dataModel.patientSelected && _dataModel.patientSelected.id > 0){\n this.stateData.setPatient(_dataModel.patientSelected);\n this.stateData.setPatientRelationship(_dataModel.relationship);\n this.stateData.setDependentsFlow();\n }\n else{\n this.stateData.setPatient(new PersonDataModel());\n this.stateData.setRelationship(_dataModel.relationship);\n }\n }\n }\n\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\n let formConfigurationData : { [componentName: string]: any; } = {};\n \n formConfigurationData[ComponentName.SELECT_PATIENT] = this.getSelectPatientDataModel();\n\n return formConfigurationData;\n }\n\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\n return message.componentName == ComponentName.SELECT_PATIENT;\n }\n\n private getSelectPatientDataModel():SelectPatientDataModel{\n let dataModel = new SelectPatientDataModel();\n\n dataModel.appointmentInfo = this.stateData.getAppointmentInfo();\n dataModel.relationship = this.stateData.getRelationship();\n\n let requestingUser = this.stateData.getRequestingUser();\n\n dataModel.user = new PersonDataModel();\n dataModel.user.id = requestingUser.id;\n dataModel.user.email = requestingUser.username;\n dataModel.user.firstname = requestingUser.nombre;\n dataModel.user.lastname = requestingUser.apellido;\n dataModel.user.gender = requestingUser.sexo;\n dataModel.user.avatar = requestingUser.urlAvatar;\n\n if(requestingUser.fechaNacimiento)\n dataModel.user.birthDate = requestingUser.fechaNacimiento;\n\n let requestingPatient = this.stateData.getRequestingPatient();\n\n if(requestingPatient){\n dataModel.patientSelected = new PersonDataModel();\n dataModel.patientSelected.id = requestingPatient.id;\n dataModel.patientSelected.firstname = requestingPatient.nombre;\n dataModel.patientSelected.lastname = requestingPatient.apellido;\n dataModel.patientSelected.email = requestingPatient.email;\n dataModel.patientSelected.gender = requestingPatient.sexo;\n \n if(requestingPatient.fechaNacimiento)\n dataModel.patientSelected.birthDate = requestingPatient.fechaNacimiento;\n }\n\n return dataModel;\n }\n\n private relationshipSelected():boolean{\n let relationship = this.stateData.getRelationship();\n\n if(relationship == 1){\n let userId = this.stateData.getUserId();\n\n this.stateData.setPatientId(userId);\n }\n\n return relationship > 0;\n }\n}\n\nexport interface ISelectPatientAppointmentCheckoutWorkflowState{\n getAppointmentInfo():AppointmentInfoDataModel;\n getRelationship(): number;\n\n getRequestingPatient():RequestingPatient;\n getRequestingUser():RequestingUser;\n\n setRelationship(relationshipType:number):void;\n setPatientRelationship(patientRelationshipType: number):void;\n setPatient(patient:PersonDataModel):void;\n setPatientId(patientId: number): void;\n setDependentsFlow():void\n}\n","import { Injectable } from \"@angular/core\";\nimport { Observable, of } from \"rxjs\";\nimport { WorkflowItem } from \"../../systems/workflow.model\";\nimport { OnlineAppointmentCliniwebState } from \"../states/online-appointment-cliniweb-state.model\";\nimport { AppointmentInfoDataModel } from \"../models/appointment-info-data.model\";\nimport { PatientFormAppointmentDataModel } from \"../models/patient-form-appointment-data.model\";\nimport { BaseStep } from \"./base-step.model\";\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\nimport { RequestingPatient } from \"../../process/base-request.model\";\nimport { StateType } from \"src/app/shared/enums/state-type.enum\";\nimport CommonTypesHelper from \"src/app/shared/helpers/common-types-helper\";\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PatientFormAppointmentCheckoutStep extends BaseStep {\n\n constructor(protected messageBusService: MessageBusService){\n super(messageBusService);\n \n this.showHeader = true;\n this.showButtonBack = true;\n this.showProgressBar = true;\n this.showButtonClose = true;\n }\n \n setItem(item: WorkflowItem): void {\n this.item = item;\n }\n\n setState(stateData: any): void {\n this.stateData = new OnlineAppointmentCliniwebState(stateData);\n }\n\n isCompleted(): Observable {\n let isCompleted = this.patientFormDataCompleted();\n\n if (!isCompleted) {\n this.stateData.setPatientDataInitiallyIncomplete(true);\n }\n\n return of(isCompleted);\n }\n\n showStepInActionBack(): boolean {\n let patient = this.stateData.getRequestingPatient();\n let isDependentsFlow = this.stateData.isDependentsFlow();\n let patientDataInitiallyIncomplete = this.stateData.getPatientDataInitiallyIncomplete();\n\n return patient.id == 0 || patientDataInitiallyIncomplete; \n }\n \n showStep(): boolean {\n let patient = this.stateData.getRequestingPatient();\n let isDependentsFlow = this.stateData.isDependentsFlow();\n\n return patient.id == 0 || !isDependentsFlow;\n }\n\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\n if (message.componentName == ComponentName.PATIENT_FORM_APPOINTMENT){\n this.stateData.setPatientFormData(message.data);\n }\n }\n\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\n let formConfigurationData : { [componentName: string]: any; } = {};\n \n formConfigurationData[ComponentName.PATIENT_FORM_APPOINTMENT] = this.stateData.getPatientFormData();\n\n return formConfigurationData;\n }\n\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\n return message.componentName == ComponentName.PATIENT_FORM_APPOINTMENT;\n }\n\n private patientFormDataCompleted():boolean{\n let patientData = this.stateData.getPatientFormData();\n\n let containsGender = CommonTypesHelper.stringHasValue(patientData.gender);\n let isBirthdateValid = CommonTypesHelper.dateHasValue(patientData.birthdate);\n\n if (patientData.firstname && patientData.lastname && isBirthdateValid && containsGender)\n return true;\n else\n return false;\n }\n}\n\nexport interface IPatientFormAppointmentCheckoutWorkflowState{\n getAppointmentInfo():AppointmentInfoDataModel;\n getRelationship(): number;\n getPatientFormData():PatientFormAppointmentDataModel;\n setPatientFormData(data:PatientFormAppointmentDataModel):void;\n getRequestingPatient():RequestingPatient;\n isDependentsFlow():boolean;\n setPatientDataInitiallyIncomplete(incomplete: boolean):void;\n getPatientDataInitiallyIncomplete():boolean;\n}\n","import { AppointmentInfoDataModel } from \"./appointment-info-data.model\";\r\n\r\nexport class SelectPatientRelationshipDataModel{\r\n patientRelationship: number = 0;\r\n appointmentInfo: AppointmentInfoDataModel;\r\n patientName: string;\r\n}","import { Injectable } from \"@angular/core\";\nimport { Observable, of } from \"rxjs\";\nimport { RequestingPatient, SenderPatientRelationship } from \"../../process/base-request.model\";\nimport { WorkflowItem } from \"../../systems/workflow.model\";\nimport { OnlineAppointmentCliniwebState } from \"../states/online-appointment-cliniweb-state.model\";\nimport { AppointmentInfoDataModel } from \"../models/appointment-info-data.model\";\nimport { BaseStep } from \"./base-step.model\";\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\nimport { SelectPatientRelationshipDataModel } from \"../models/select-patient-relationship-data.model\";\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SelectPatientRelationshipAppointmentCheckoutStep extends BaseStep {\n\n constructor(protected messageBusService: MessageBusService){\n super(messageBusService);\n\n this.showHeader = true;\n this.showButtonBack = true;\n this.showProgressBar = true;\n this.showButtonClose = true;\n }\n\n setItem(item: WorkflowItem): void {\n this.item = item;\n }\n\n setState(stateData: any): void {\n this.stateData = new OnlineAppointmentCliniwebState(stateData);\n }\n\n isCompleted(): Observable {\n let patientRelationship = this.stateData.getPatientRelationship();\n\n return of(patientRelationship != SenderPatientRelationship.DESCONOCIDO);\n }\n\n showStepInActionBack(): boolean {\n let patientRelationship = this.stateData.getPatientRelationship();\n\n let patient = this.stateData.getRequestingPatient();\n\n return patient.id == 0 && patientRelationship != SenderPatientRelationship.USUARIO;\n }\n\n showStep(): boolean {\n let patientRelationship = this.stateData.getPatientRelationship();\n\n let patient = this.stateData.getRequestingPatient();\n\n return patient.id == 0 && patientRelationship != SenderPatientRelationship.USUARIO;\n }\n\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\n if (message.componentName == ComponentName.SELECT_PATIENT_RELATIONSHIP_APPOINTMENT){\n this.stateData.setPatientRelationship(message.data.patientRelationship);\n }\n }\n\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\n let formConfigurationData : { [componentName: string]: any; } = {};\n \n formConfigurationData[ComponentName.SELECT_PATIENT_RELATIONSHIP_APPOINTMENT] = this.getSelectPatientRelationshipDataModel();\n\n return formConfigurationData;\n }\n\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\n return message.componentName == ComponentName.SELECT_PATIENT_RELATIONSHIP_APPOINTMENT;\n }\n\n private getSelectPatientRelationshipDataModel():SelectPatientRelationshipDataModel{\n let dataModel = new SelectPatientRelationshipDataModel();\n\n dataModel.appointmentInfo = this.stateData.getAppointmentInfo();\n dataModel.patientRelationship = this.stateData.getPatientRelationship();\n dataModel.patientName = this.stateData.getPatientName();\n\n return dataModel;\n }\n\n \n}\n\nexport interface ISelectPatientRelationshipAppointmentCheckoutWorkflowState{\n getAppointmentInfo():AppointmentInfoDataModel;\n getPatientRelationship(): number; \n getPatientName():string;\n getRequestingPatient():RequestingPatient;\n\n setPatientRelationship(patientRelationshipType:number):void;\n}\n","import { AppointmentInfoDataModel } from \"./appointment-info-data.model\";\r\n\r\nexport class PatientContactFormDataModel{\r\n appointmentInfo: AppointmentInfoDataModel;\r\n patientRelationship: number;\r\n userPhone: string;\r\n patientName: string;\r\n patientPhone: string;\r\n patientEmail: string;\r\n contactType: number = 0;\r\n}","import { Injectable } from \"@angular/core\";\nimport { Observable, of } from \"rxjs\";\nimport { IStepFlow } from \"../../../interfaces/step-flow\";\nimport { WorkflowItem } from \"../../systems/workflow.model\";\nimport { OnlineAppointmentCliniwebState } from \"../states/online-appointment-cliniweb-state.model\";\nimport { AppointmentInfoDataModel } from \"../models/appointment-info-data.model\";\nimport { BaseStep } from \"./base-step.model\";\nimport { ComponentDataSetMessage, MessageBusService, ServiceErrorMessage } from \"src/app/core/services/message-bus.service\";\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\nimport { PatientContactFormDataModel } from \"../models/patient-contact-form-data.model\";\nimport { UserService } from \"src/app/core/services/user.service\";\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PatientContactFormAppointmentCheckoutStep extends BaseStep {\n\n constructor(\n protected messageBusService: MessageBusService,\n private userService: UserService\n ){\n super(messageBusService);\n \n this.showHeader = true;\n this.showButtonBack = true;\n this.showProgressBar = true;\n this.showButtonClose = true;\n }\n\n setItem(item: WorkflowItem): void {\n this.item = item;\n }\n\n setState(stateData: any): void {\n this.stateData = new OnlineAppointmentCliniwebState(stateData);\n }\n\n isCompleted(): Observable {\n let contactType = this.stateData.getContactType();\n\n switch(contactType){\n case 0:\n default:\n return of(false);\n case 1:\n let userPhone = this.stateData.getUserPhone();\n return of(userPhone ? true : false);\n case 2:\n let patientPhone = this.stateData.getPatientPhone();\n let patientEmail = this.stateData.getPatientEmail();\n \n return of((patientPhone && patientEmail) ? true : false);\n }\n }\n\n showStepInActionBack(): boolean {\n return true;\n }\n \n showStep(): boolean {\n return true;\n }\n\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\n if (message.componentName == ComponentName.PATIENT_CONTACT_FORM){\n\n let dataModel = message.data as PatientContactFormDataModel;\n\n this.stateData.setContactType(dataModel.contactType);\n\n if(dataModel.contactType == 1){\n this.stateData.setUserPhone(dataModel.userPhone);\n this.stateData.setPatientPhone(dataModel.userPhone);\n this.updateUserPhoneNumberLoggedIn(dataModel.userPhone);\n }\n else{\n this.stateData.setPatientPhone(dataModel.patientPhone);\n this.stateData.setPatientEmail(dataModel.patientEmail);\n }\n }\n }\n\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\n let formConfigurationData : { [componentName: string]: any; } = {};\n \n formConfigurationData[ComponentName.PATIENT_CONTACT_FORM] = this.getPatientContactFormDataModel();\n\n return formConfigurationData;\n }\n\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\n return message.componentName == ComponentName.PATIENT_CONTACT_FORM;\n }\n\n private getPatientContactFormDataModel(): PatientContactFormDataModel{\n let dataModel = new PatientContactFormDataModel();\n\n dataModel.appointmentInfo = this.stateData.getAppointmentInfo();\n dataModel.patientRelationship = this.stateData.getPatientRelationship();\n dataModel.userPhone = this.stateData.getUserPhone();\n dataModel.patientName = this.stateData.getPatientName();\n dataModel.patientPhone = this.stateData.getPatientPhone();\n dataModel.patientEmail = this.stateData.getPatientEmail();\n dataModel.contactType = this.stateData.getContactType();\n\n return dataModel;\n }\n\n private updateUserPhoneNumberLoggedIn(phoneNumber: string){\n this.userService.getUserPersonLoggedIn()\n .subscribe(user=>{ \n if(user){\n user.numeroTelCelular = phoneNumber;\n this.userService.updateUserLoggedIn(user);\n }\n },\n error=>{\n this.messageBusService.serviceError(new ServiceErrorMessage(\"Error getting user logged in\"));\n });\n }\n}\n\nexport interface IPatientContactFormAppointmentCheckoutWorkflowState{\n getAppointmentInfo():AppointmentInfoDataModel;\n getPatientName():string;\n getUserPhone():string; \n getPatientPhone(): string; \n getPatientEmail():string; \n getContactType():number; \n\n setUserPhone(userPhone:string):void;\n setPatientPhone(patientPhone:string):void;\n setPatientEmail(patientEmail:string):void;\n setContactType(contactType: number):void;\n}","import { Injectable } from \"@angular/core\";\nimport { Observable, of } from \"rxjs\";\nimport { WorkflowItem } from \"../../systems/workflow.model\";\nimport { AppointmentSummaryDataModel } from \"../models/appointment-summary-data.model\";\nimport { OnlineAppointmentCliniwebState } from \"../states/online-appointment-cliniweb-state.model\";\nimport { AppointmentInfoDataModel } from \"../models/appointment-info-data.model\";\nimport { BaseStep } from \"./base-step.model\";\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SummaryAppointmentCheckoutStep extends BaseStep {\n\n constructor(protected messageBusService: MessageBusService){\n super(messageBusService);\n this.showHeader = false;\n }\n\n setItem(item: WorkflowItem): void {\n this.item = item;\n }\n\n setState(stateData: any): void {\n this.stateData = new OnlineAppointmentCliniwebState(stateData);\n }\n\n isCompleted(): Observable {\n return of(false);\n }\n\n showStepInActionBack(): boolean {\n return true;\n }\n\n showStep(): boolean {\n return true;\n }\n\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\n if (message.componentName == ComponentName.SUMMARY_APPOINTMENT){\n }\n }\n\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\n let formConfigurationData : { [componentName: string]: any; } = {};\n \n formConfigurationData[ComponentName.SUMMARY_APPOINTMENT] = this.stateData.getAppointmentSummary();\n\n return formConfigurationData;\n }\n\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\n return message.componentName == ComponentName.SUMMARY_APPOINTMENT;\n }\n}\n\nexport interface ISummaryAppointmentCheckoutWorkflowState{\n getAppointmentInfo():AppointmentInfoDataModel;\n getAppointmentSummary(): AppointmentSummaryDataModel;\n}\n","
\r\n \r\n \r\n
\r\n
{{ 'shared.payment.text1' | translate:locale.language }}
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n {{model.targetUserName}}\r\n
\r\n
\r\n\r\n \r\n
\r\n
$
\r\n \r\n
\r\n
USD
\r\n
\r\n {{ 'shared.payment.text24' | translate:locale.language }} \r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n
","import { Component, ElementRef, Inject, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { CustomCurrencyPipe } from '../../pipes/custom-currency.pipe';\r\nimport { ComponentName } from '../../enums/component-name.enum';\r\nimport { PublicProfileAvatarComponentModel } from '../public-profile-avatar/public-profile-avatar.component';\r\nimport { PublicProfile } from '../../models/people/public-profile.model';\r\nimport { UtilsService } from 'src/app/core/services/utils.service';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-payment-amount',\r\n templateUrl: './payment-amount.component.html',\r\n styleUrls: ['./payment-amount.component.css'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [CustomCurrencyPipe]\r\n })\r\n @ComponentLookup(ComponentName.PAYMENT_AMOUNT)\r\n export class PaymentAmountComponent implements OnInit, OnDestroy, IControlComponent {\r\n \r\n data: FormComponentData; \r\n model: PaymentAmountComponentDataModel = new PaymentAmountComponentDataModel(); \r\n state: any;\r\n invalidInput = false;\r\n avatarModel: PublicProfileAvatarComponentModel;\r\n @ViewChild('amountInputEl') amountInputEl: ElementRef;\r\n\r\n constructor(\r\n protected messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n protected baseService: BaseService,\r\n private currencyPipe : CustomCurrencyPipe,\r\n private utilsService: UtilsService,\r\n @Inject(DOCUMENT) private document: Document\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadDataModel();\r\n\r\n this.sendComponentFinishLoadingMessage();\r\n\r\n setTimeout(() => {\r\n if (this.amountInputEl && this.amountInputEl.nativeElement)\r\n this.amountInputEl.nativeElement.click();\r\n this.amountInputEl.nativeElement.focus();\r\n }, 100); \r\n }\r\n \r\n ngOnDestroy(): void {\r\n \r\n } \r\n\r\n sendComponentFinishLoadingMessage(){\r\n if (!this.data)\r\n return;\r\n\r\n let event = new ComponentFinishLoadingMessage();\r\n \r\n event.idFormulario = this.data.idFormulario;\r\n event.idControl = this.data.idControlPadre;\r\n \r\n this.messageBusService.componentFinishLoading(event); \r\n }\r\n \r\n private loadDataModel() {\r\n if (this.data && this.data.configurationData) {\r\n this.model = this.data.configurationData as PaymentAmountComponentDataModel; \r\n \r\n if (this.model.publicProfile) {\r\n this.avatarModel = new PublicProfileAvatarComponentModel();\r\n this.avatarModel.personId = this.model.publicProfile.id;\r\n this.avatarModel.avatarUrl = this.model.publicProfile.ubicacionFoto;\r\n this.avatarModel.fullName = this.model.publicProfile.nombrePersona;\r\n this.avatarModel.sex = this.model.publicProfile.sexo;\r\n this.avatarModel.profileType = this.model.publicProfile.tipoPerfil;\r\n }\r\n } \r\n }\r\n \r\n /*********************** Payment amount input methods **********************************/\r\n\r\n onAmountInputClick(event: any) {\r\n // Move cursor if the user already type something\r\n if (event.target.value && event.target.value != \"0.00\")\r\n event.target.selectionStart = event.target.selectionEnd = event.target.value.length;\r\n else \r\n event.target.selectionStart = event.target.selectionEnd = 0;\r\n\r\n // Scroll top\r\n setTimeout(() => {\r\n let container = document.body.classList.contains('route-dialog-opened') \r\n ? this.document.getElementsByClassName(\"route-dialog-content\")[0]\r\n : this.document.getElementsByClassName(\"body-container\")[0];\r\n\r\n let el = this.document.getElementsByClassName(\"payment-input\")[0] as Element; \r\n\r\n this.utilsService.scrollToElementWithAnimation(container, el);\r\n }, 100);\r\n }\r\n\r\n onAmountInputKeyup(element: any) {\r\n //console.log(element);\r\n //console.log(\"Old value: \" + element.target.value); \r\n\r\n element.preventDefault();\r\n element.stopPropagation();\r\n\r\n // Enter\r\n if (element.keyCode == 13)\r\n return;\r\n\r\n if (!element.target.value)\r\n element.target.value = \"0.00\";\r\n \r\n let currentValue = element.target.value + element.key;\r\n let newChar = currentValue.substring(currentValue.length - 1);\r\n let amount: string | null; \r\n\r\n // If the new character is a number or backspace\r\n if (element.keyCode == 8 || /\\d/.test(newChar)) {\r\n // Replace all commas\r\n currentValue = currentValue.replace(\",\", \"\");\r\n \r\n // We need to insert the number at the end and move the comma one place\r\n let number = parseFloat(currentValue);\r\n\r\n // In some cases if you type fast we can get this event with 2 or 3 inserted digits\r\n // In those cases we want to move the comma by the number of decimal less 2\r\n // For example 0.0023 will move decimal 2 positions to get 0.23\r\n let multiplier = Math.pow(10, this.countDecimals(number) - 2);\r\n\r\n // In case the user enter '0' and 10 ^ 0 = 1\r\n if (multiplier < 10)\r\n multiplier = 10;\r\n\r\n // If the new character is a backspace move the comma to the left\r\n if (element.keyCode == 8)\r\n number = (number / 10);\r\n else\r\n number = (number * multiplier);\r\n\r\n // Truncate number to 2 digits\r\n number = Math.round(number * 100) / 100;\r\n\r\n amount = this.currencyPipe.transform(number.toFixed(2), 'USD','','1.2-2','en-US');\r\n }\r\n else {\r\n amount = this.currencyPipe.transform(element.target.value, 'USD','','1.2-2','en-US');\r\n } \r\n\r\n if (!amount)\r\n amount = \"0.00\";\r\n\r\n this.model.paymentAmount = amount;\r\n\r\n // Set value to input and move cursor\r\n element.target.value = amount;\r\n element.target.selectionStart = element.target.selectionEnd = amount.length;\r\n\r\n //console.log(\"New value: \" + amount);\r\n }\r\n \r\n validateInputNumber(): boolean {\r\n let amount = parseFloat(this.model.paymentAmount.replace(/,/g, \"\"));\r\n\r\n return (amount >= 1 && amount <= 10000);\r\n }\r\n\r\n onNextClick() {\r\n if (!this.validateInputNumber()) {\r\n this.invalidInput = true;\r\n return;\r\n }\r\n else \r\n this.invalidInput = false;\r\n \r\n let payAmount = parseFloat(this.model.paymentAmount);\r\n\r\n if (payAmount) {\r\n let message = new ComponentDataSetMessage();\r\n message.componentName = ComponentName.PAYMENT_AMOUNT;\r\n message.data = this.model.paymentAmount;\r\n\r\n this.messageBusService.onComponentDataSetMessage(message); \r\n }\r\n } \r\n\r\n private countDecimals = function (number: number) {\r\n if(Math.floor(number) === number) return 0;\r\n return number.toString().split(\".\")[1].length || 0; \r\n } \r\n }\r\n\r\n export class PaymentAmountComponentDataModel {\r\n targetUserName: string = \"\";\r\n targetUserAvatarUrl: string = \"\";\r\n\r\n userName: string = \"\";\r\n specialty: string = \"\";\r\n paymentAmount: string = \"0.00\";\r\n publicProfile: PublicProfile;\r\n }\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { OnlinePaymentWorkflowState } from \"../../states/online-payment-workflow-state.model\";\r\nimport { PaymentAmountComponentDataModel } from \"src/app/shared/components/payment-amount/payment-amount.component\";\r\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\r\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { BaseStep } from \"../base-step.model\";\r\nimport { PublicProfile } from \"../../../people/public-profile.model\";\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PaymentAmountStep extends BaseStep {\r\n \r\n constructor(\r\n protected messageBusService: MessageBusService,\r\n ){ \r\n super(messageBusService);\r\n \r\n this.showHeader = true;\r\n this.showProgressBar = true;\r\n this.showButtonClose = true;\r\n } \r\n\r\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\r\n if (message.componentName == ComponentName.PAYMENT_AMOUNT)\r\n this.stateData.setAmount(message.data); \r\n } \r\n\r\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\r\n let formConfigurationData : { [componentName: string]: any; } = {};\r\n \r\n formConfigurationData[ComponentName.PAYMENT_AMOUNT] = this.getPaymentAmountComponentData();\r\n\r\n return formConfigurationData;\r\n }\r\n\r\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\r\n return message.componentName == ComponentName.PAYMENT_AMOUNT;\r\n }\r\n\r\n private getPaymentAmountComponentData() {\r\n var data = new PaymentAmountComponentDataModel();\r\n\r\n data.targetUserName = this.stateData.getTargetUsername();\r\n data.targetUserAvatarUrl = this.stateData.getTargetUrlAvatar();\r\n data.specialty = this.stateData.getTargetSpecialty();\r\n data.userName = this.stateData.getUserName();\r\n data.paymentAmount = this.stateData.getAmount();\r\n data.publicProfile = this.stateData.getPublicProfile();\r\n\r\n return data;\r\n } \r\n\r\n setState(stateData: any): void {\r\n this.stateData = new OnlinePaymentWorkflowState(stateData);\r\n }\r\n\r\n isCompleted(): Observable {\r\n return of(this.stateData && this.stateData.getAmount() != \"0.00\");\r\n }\r\n\r\n showStepInActionBack(): boolean {\r\n return true;\r\n }\r\n\r\n showStep(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport interface IPaymentAmountWorkflowState{\r\n getTargetUrlAvatar():string;\r\n getTargetUsername():string;\r\n getTargetSpecialty():string;\r\n getUserName():string;\r\n getAmount():string;\r\n getPublicProfile(): PublicProfile;\r\n\r\n setAmount(amount: string):void;\r\n setPublicProfile(profile: PublicProfile):void;\r\n}","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'intlTelInputPlaceholder'\n})\nexport class IntlTelInputPlaceholderPipe implements PipeTransform {\n\n transform(value: any): unknown {\n if(value){\n return value.placeHolder.substring(value.dialCode.length + 1, value.placeHolder.length);\n }\n else{\n return '';\n }\n }\n\n}\n","
\r\n \r\n\r\n \r\n
\r\n
{{ 'shared.payment.text4' | translate:locale.language }}
\r\n
{{ 'shared.payment.text27' | translate:locale.language }}
\r\n
{{profileName}}
\r\n\r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n \r\n {{ 'shared.payment.text5' | translate:locale.language }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n {{creditCardLastFourDigits}}\r\n\r\n \r\n\r\n \r\n\r\n
\r\n {{ 'shared.payment.text9' | translate:locale.language }}\r\n {{ 'shared.payment.text10' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.payment.text11' | translate:locale.language }}\r\n {{ 'shared.payment.text12' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.payment.text13' | translate:locale.language }}\r\n {{ 'shared.payment.text14' | translate:locale.language }}\r\n
\r\n
\r\n\r\n
\r\n \r\n {{ 'shared.payment.text7' | translate:locale.language }}\r\n \r\n {{ 'shared.payment.text15' | translate:locale.language }}\r\n {{ 'shared.payment.text25' | translate:locale.language }}\r\n \r\n
\r\n
\r\n \r\n {{ 'shared.payment.text8' | translate:locale.language }}\r\n \r\n \r\n {{ 'shared.payment.text16' | translate:locale.language }}\r\n {{ 'shared.payment.text17' | translate:locale.language }}\r\n \r\n
\r\n \r\n
\r\n
\r\n
{{ 'shared.payment.text18' | translate:locale.language }}
\r\n {{ 'shared.payment.text19' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n {{ 'shared.payment.text20' | translate:locale.language }}\r\n {{ 'shared.payment.text21' | translate:locale.language }}
\r\n {{ 'shared.payment.text22' | translate:locale.language }}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
{{ 'shared.payment.text28' | translate:locale.language }}
\r\n
\r\n {{profileName}}.\r\n {{profileSpecialty}}\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n {{ 'shared.payment.text18' | translate:locale.language }}\r\n {{ 'shared.payment.text19' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.payment.text20' | translate:locale.language }}\r\n {{ 'shared.payment.text21' | translate:locale.language }}\r\n {{ 'shared.payment.text22' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n\r\n
\r\n
\r\n","import { Component, ElementRef, Inject, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { CreditCardFormatDirective, CreditCardValidators } from 'angular-cc-library';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { CustomCurrencyPipe } from '../../pipes/custom-currency.pipe';\r\nimport { ComponentName } from '../../enums/component-name.enum';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { LegalAgreementsRouteDialogModel } from '../dialogs/route-dialog/route-dialog.component';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { PublicProfile } from '../../models/people/public-profile.model';\r\n\r\n@Component({\r\n selector: 'app-payment',\r\n templateUrl: './payment.component.html',\r\n styleUrls: ['./payment.component.css'],\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [CustomCurrencyPipe]\r\n })\r\n @ComponentLookup(ComponentName.PAYMENT_FORM)\r\n export class PaymentComponent implements OnInit, OnDestroy, IControlComponent {\r\n \r\n data: FormComponentData; \r\n paymentForm: FormGroup; \r\n paymentAmount: string = \"0.0\";\r\n creditCardLastFourDigits: string = \"\";\r\n creditCardType: string = \"\";\r\n creditCardTypeSubscribe: boolean = false;\r\n creditCardOwnerName: string; \r\n cvcFocus: boolean = false;\r\n phoneNumber: string;\r\n formSubmitted: boolean = false;\r\n creditCardNumberFocus: boolean = false;\r\n profileName: string;\r\n profileSpecialty: string;\r\n \r\n @ViewChild('creditCardNumber') creditCardNumberEl: ElementRef;\r\n @ViewChild('creditCardExpiration') creditCardExpirationEl: ElementRef;\r\n @ViewChild('creditCardCvc') creditCardCvcEl: ElementRef;\r\n\r\n constructor(\r\n protected messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n protected baseService: BaseService,\r\n private breakpointObserver : BreakpointObserver,\r\n private formBuilder: FormBuilder,\r\n private routeDialogService: RouteDialogService,\r\n @Inject(DOCUMENT) private document: Document\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.document.body.classList.add('payment-form');\r\n\r\n this.paymentForm = this.formBuilder.group({\r\n creditCardControl: ['', [CreditCardValidators.validateCCNumber]],\r\n expirationDateControl: ['', [CreditCardValidators.validateExpDate]],\r\n cvcControl: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(4)]],\r\n fullNameControl: ['', Validators.required],\r\n phoneNumberControl: ['', Validators.required] \r\n });\r\n\r\n this.loadFromModel();\r\n\r\n this.sendComponentFinishLoadingMessage();\r\n\r\n setTimeout(() => {\r\n this.creditCardNumberEl.nativeElement.focus();\r\n }, 500); \r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.document.body.classList.remove('payment-form');\r\n }\r\n\r\n sendComponentFinishLoadingMessage(){\r\n if (!this.data)\r\n return;\r\n\r\n let event = new ComponentFinishLoadingMessage();\r\n \r\n event.idFormulario = this.data.idFormulario;\r\n event.idControl = this.data.idControlPadre;\r\n \r\n this.messageBusService.componentFinishLoading(event); \r\n }\r\n\r\n loadFromModel() {\r\n if (this.data && this.data.configurationData) {\r\n let model = this.data.configurationData as PaymentComponentData;\r\n\r\n if (model.publicProfile) {\r\n this.profileName = model.publicProfile.nombrePersona;\r\n this.profileSpecialty = model.publicProfile.especialidades.map(s => s.objetoDetalle).join(\", \");\r\n } \r\n\r\n if (model.creditCardNumber) {\r\n let cardExp = model.creditCardExpMonth + \"/\" + model.creditCardExpYear\r\n\r\n this.setControlValue(ControlNames.CardNumber, model.creditCardNumber);\r\n this.setControlValue(ControlNames.CardExpirationDate, cardExp);\r\n this.setControlValue(ControlNames.CardCvc, model.creditCardCvc);\r\n } \r\n\r\n if (model.creditCardFullName)\r\n this.setControlValue(ControlNames.FullName, model.creditCardFullName);\r\n\r\n if (model.phoneNumber)\r\n this.setControlValue(ControlNames.PhoneNumber, model.phoneNumber); \r\n\r\n this.paymentAmount = model.amount;\r\n } \r\n }\r\n\r\n /************************* Form control methods ********************************/ \r\n\r\n getControl(controlName: string) {\r\n return this.paymentForm.controls[controlName];\r\n }\r\n isControlInvalid(controlName: string) {\r\n let control = this.getControl(controlName);\r\n\r\n // First check if the form is submitted or control is dirty\r\n if (!this.formSubmitted && !control.touched)\r\n return false;\r\n\r\n return control.invalid;\r\n }\r\n controlHasError(controlName: string, errorName: string) {\r\n return this.getControl(controlName).hasError(errorName);\r\n }\r\n getControlValue(controlName: string) {\r\n return this.getControl(controlName).value;\r\n }\r\n setControlValue(controlName: string, value: string) {\r\n this.getControl(controlName).setValue(value);\r\n }\r\n \r\n /*********************** Credit card input methods **********************************/\r\n \r\n onCreditCardNumberFocus(element: CreditCardFormatDirective) {\r\n this.creditCardNumberFocus = true;\r\n \r\n if (!this.creditCardTypeSubscribe) {\r\n this.creditCardTypeSubscribe = true;\r\n\r\n element.resolvedScheme$.subscribe(creditCardType => {\r\n if (creditCardType && creditCardType != 'unknown')\r\n this.creditCardType = creditCardType.toUpperCase();\r\n else \r\n this.creditCardType = \"\";\r\n });\r\n }\r\n }\r\n\r\n onCreditCardNumberBlur() {\r\n this.creditCardNumberFocus = false;\r\n }\r\n\r\n onCreditCardNumberKeyup(event: any) { \r\n let el = event.target;\r\n\r\n let creditCardNumber = this.getControlValue(ControlNames.CardNumber);\r\n let isCursorAtEnd = (el.selectionStart == creditCardNumber.length);\r\n\r\n this.creditCardLastFourDigits = creditCardNumber.substring(creditCardNumber.length - 4);\r\n\r\n // If credit card number is valid and user is at the end of the input let move to expiration date\r\n if (!this.getControl(ControlNames.CardNumber).invalid && isCursorAtEnd) {\r\n this.creditCardExpirationEl.nativeElement.focus();\r\n }\r\n }\r\n\r\n isCreditCardExpirationValid(forceValidation: boolean = false) {\r\n let control = this.getControl(ControlNames.CardExpirationDate);\r\n\r\n // First check if the form is submitted or control is dirty\r\n if (!forceValidation && !this.formSubmitted && !control.touched)\r\n return true;\r\n\r\n let dateStr = control.value;\r\n\r\n if (!dateStr)\r\n return false;\r\n \r\n var expParts = dateStr.split(\"/\");\r\n\r\n if (!expParts[0] || !expParts[1])\r\n return false;\r\n\r\n expParts[0] = expParts[0].trim();\r\n expParts[1] = expParts[1].trim();\r\n\r\n let now = new Date();\r\n let expYear = parseInt(now.getFullYear().toString().substring(0, 2) + expParts[1]);\r\n let expDate = new Date(expYear, expParts[0] - 1, 1).getTime();\r\n\r\n return now.getTime() < expDate;\r\n }\r\n\r\n onCreditCardExpirationKeyup() {\r\n var expValue = this.getControlValue(ControlNames.CardExpirationDate);\r\n var expEl = this.creditCardExpirationEl.nativeElement;\r\n\r\n let isCursorAtEnd = (expEl.selectionStart == expValue.length);\r\n\r\n if (isCursorAtEnd && this.isCreditCardExpirationValid(true)) {\r\n this.creditCardCvcEl.nativeElement.focus();\r\n }\r\n }\r\n\r\n onCvcFocus() {\r\n this.cvcFocus = true;\r\n }\r\n onCvcBlur() {\r\n this.cvcFocus = false;\r\n }\r\n onCreditCardSecretKeyup(event: any) {\r\n \r\n }\r\n\r\n onMobileLastFourDigitsClick() {\r\n this.creditCardNumberFocus = true;\r\n this.creditCardNumberEl.nativeElement.focus();\r\n }\r\n\r\n /*********************** Buttons methods **********************************/ \r\n\r\n onPayClick() {\r\n this.paymentForm.markAllAsTouched();\r\n this.formSubmitted = true;\r\n\r\n if (!this.paymentForm.valid || !this.isCreditCardExpirationValid(true))\r\n return;\r\n\r\n let creditCardExpiration = this.getControlValue(ControlNames.CardExpirationDate); \r\n let payAmount = parseFloat(this.paymentAmount);\r\n let expirationParts = creditCardExpiration.split(\"/\").map((p: string) => p.trim());\r\n\r\n // Build out model\r\n let model = new PaymentComponentData();\r\n \r\n model.amount = this.paymentAmount;\r\n model.creditCardType = this.creditCardType;\r\n model.creditCardNumber = this.getControlValue(ControlNames.CardNumber).replace(/\\s/g, \"\");\r\n model.creditCardExpMonth = expirationParts[0];\r\n model.creditCardExpYear = expirationParts[1];\r\n model.creditCardCvc = this.getControlValue(ControlNames.CardCvc);\r\n model.creditCardFullName = this.getControlValue(ControlNames.FullName);\r\n model.phoneNumber = this.getControlValue(ControlNames.PhoneNumber);\r\n \r\n // Format full name\r\n let regEx = /^\\s*([a-zA-Z]{2,25})\\s+([a-zA-Z]{2,25}([a-zA-Z]|\\s)*)$/;\r\n let match = model.creditCardFullName.match(regEx);\r\n\r\n if (!match || match.length < 3)\r\n return;\r\n\r\n model.creditCardFullName = match[1] + \" \" + match[2].trim().replace(/\\s+/, \" \");\r\n\r\n // Send message indicating that the model was completed\r\n let message = new ComponentDataSetMessage();\r\n \r\n message.componentName = ComponentName.PAYMENT_FORM;\r\n message.data = model;\r\n\r\n this.messageBusService.onComponentDataSetMessage(message);\r\n }\r\n\r\n openDialogLegalAgreements(): void {\r\n const routeDialogModel = new LegalAgreementsRouteDialogModel();\r\n routeDialogModel.route = 'terminos-y-condiciones';\r\n this.routeDialogService.openDialog(routeDialogModel);\r\n }\r\n\r\n isMobile(): boolean {\r\n return this.breakpointObserver.isMatched([Breakpoints.Handset, Breakpoints.Tablet]);\r\n }\r\n\r\n }\r\n\r\n export class PaymentComponentData {\r\n creditCardType: string;\r\n creditCardNumber: string;\r\n creditCardExpMonth: string;\r\n creditCardExpYear: string;\r\n creditCardCvc: string;\r\n creditCardFullName: string;\r\n phoneNumber: string;\r\n amount: string;\r\n\r\n publicProfile: PublicProfile;\r\n }\r\n\r\n export enum ControlNames {\r\n CardNumber = \"creditCardControl\",\r\n CardExpirationDate = \"expirationDateControl\",\r\n CardCvc = \"cvcControl\",\r\n FullName = \"fullNameControl\",\r\n PhoneNumber = \"phoneNumberControl\"\r\n }","import { Injectable } from \"@angular/core\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { WorkflowItem } from \"../../../systems/workflow.model\";\r\nimport { OnlinePaymentWorkflowState } from \"../../states/online-payment-workflow-state.model\";\r\nimport { BaseStep } from \"../base-step.model\";\r\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\r\nimport { PaymentComponentData } from \"src/app/shared/components/payment/payment.component\";\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PaymentFormStep extends BaseStep {\r\n \r\n constructor(\r\n protected messageBusService: MessageBusService,\r\n ){ \r\n super(messageBusService);\r\n \r\n this.showHeader = true;\r\n this.showProgressBar = true;\r\n this.showButtonBack = true;\r\n this.showButtonClose = true;\r\n } \r\n\r\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\r\n if (message.componentName == ComponentName.PAYMENT_FORM) {\r\n let model = message.data as PaymentComponentData;\r\n\r\n if (model) {\r\n this.stateData.setCreditCardType(model.creditCardType);\r\n this.stateData.setCreditCardNumber(model.creditCardNumber);\r\n this.stateData.setCreditCardExpirationMonth(model.creditCardExpMonth);\r\n this.stateData.setCreditCardExpirationYear(model.creditCardExpYear);\r\n this.stateData.setCreditCardCvc(model.creditCardCvc);\r\n this.stateData.setCreditCardFullName(model.creditCardFullName);\r\n this.stateData.setPhoneNumber(model.phoneNumber); \r\n }\r\n }\r\n } \r\n\r\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\r\n let formConfigurationData : { [componentName: string]: any; } = {};\r\n \r\n formConfigurationData[ComponentName.PAYMENT_FORM] = this.getPaymenComponentData();\r\n\r\n return formConfigurationData;\r\n }\r\n\r\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\r\n return message.componentName == ComponentName.PAYMENT_FORM;\r\n }\r\n\r\n private getPaymenComponentData() {\r\n var data = new PaymentComponentData();\r\n\r\n data.amount = this.stateData.getAmount();\r\n data.creditCardNumber = this.stateData.getCreditCardNumber();\r\n data.creditCardExpMonth = this.stateData.getCreditCardExpirationMonth();\r\n data.creditCardExpYear = this.stateData.getCreditCardExpirationYear();\r\n data.creditCardFullName = this.stateData.getCreditCardFullName();\r\n data.phoneNumber = this.stateData.getPhoneNumber(); \r\n data.publicProfile = this.stateData.getPublicProfile(); \r\n\r\n return data;\r\n } \r\n\r\n setItem(item: WorkflowItem): void {\r\n this.item = item;\r\n }\r\n\r\n setState(stateData: any): void {\r\n this.stateData = new OnlinePaymentWorkflowState(stateData);\r\n }\r\n\r\n isCompleted(): Observable {\r\n let result = (\r\n this.stateData\r\n && !this.isNullOrEmpty(this.stateData.getCreditCardNumber())\r\n && !this.isNullOrEmpty(this.stateData.getCreditCardExpirationMonth())\r\n && !this.isNullOrEmpty(this.stateData.getCreditCardExpirationYear())\r\n && !this.isNullOrEmpty(this.stateData.getCreditCardCvc())\r\n && !this.isNullOrEmpty(this.stateData.getCreditCardFullName())\r\n && !this.isNullOrEmpty(this.stateData.getPhoneNumber())\r\n );\r\n\r\n return of(result);\r\n }\r\n\r\n showStepInActionBack(): boolean {\r\n return true;\r\n }\r\n\r\n showStep(): boolean {\r\n return true;\r\n }\r\n\r\n private isNullOrEmpty(str: string) {\r\n return str == null || str == undefined || str == \"\";\r\n }\r\n}\r\n\r\nexport interface IPaymentWorkflowState { \r\n getAmount():string;\r\n\r\n setCreditCardType(cardType: string) : void;\r\n\r\n getCreditCardNumber() : string;\r\n setCreditCardNumber(cardNumber: string) : void;\r\n\r\n getCreditCardExpirationMonth() : string;\r\n setCreditCardExpirationMonth(expMonth: string) : void;\r\n getCreditCardExpirationYear() : string;\r\n setCreditCardExpirationYear(expYear: string) : void;\r\n\r\n getCreditCardCvc() : string;\r\n setCreditCardCvc(cvc: string) : void;\r\n\r\n getCreditCardFullName() : string;\r\n setCreditCardFullName(fullName: string) : void;\r\n\r\n getPhoneNumber() : string;\r\n setPhoneNumber(fullName: string) : void;\r\n}","import { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\r\nimport { BaseStep } from \"./base-step.model\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { WorkflowService } from \"src/app/core/services/workflow.service\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\r\nimport { PatientVerificationDataModel } from \"../models/patient-verification-data.model\";\r\nimport { WorkflowItemData } from \"../../systems/workflow.model\";\r\nimport { BaseService } from \"src/app/core/services/base.service\";\r\nimport { PublicProfile } from \"../../people/public-profile.model\";\r\nimport { AuthService } from \"src/app/core/services/auth.service\";\r\nimport { switchMap } from \"rxjs/operators\";\r\nimport { Relation } from \"../../people/relation.model\";\r\nimport { PatientService } from \"src/app/core/services/patient.service\";\r\nimport { PatientVerificationResponse } from \"src/app/shared/interfaces/patient-verification-response\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PatientVerificationStep extends BaseStep {\r\n\r\n constructor(\r\n private patientService: PatientService,\r\n private authService: AuthService,\r\n protected messageBusService: MessageBusService, \r\n private baseService: BaseService,\r\n private workflowService: WorkflowService\r\n ) {\r\n super(messageBusService);\r\n this.showHeader = true;\r\n this.showProgressBar = true;\r\n this.showButtonClose = true;\r\n this.withoutFooter = true;\r\n }\r\n\r\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage): void {\r\n if (message.componentName == ComponentName.PATIENT_VERIFICATION){\r\n\r\n const data = message.data as PatientVerificationResponse;\r\n\r\n if(data){\r\n this.stateData.setPatientEmail(data.emailPaciente);\r\n this.stateData.setPatientValid(data.isValid);\r\n }\r\n }\r\n }\r\n\r\n protected buildComponentConfigurationData(): { [componentName: string]: any; } {\r\n const formConfigurationData : { [componentName: string]: any; } = {};\r\n \r\n formConfigurationData[ComponentName.PATIENT_VERIFICATION] = this.getDataModel();\r\n\r\n return formConfigurationData;\r\n }\r\n\r\n private getDataModel(): PatientVerificationDataModel {\r\n let dataModel = new PatientVerificationDataModel();\r\n\r\n dataModel.idVerificacion = this.stateData.getIdVerificacion();;\r\n dataModel.nombrePaciente = this.stateData.getPatientName();\r\n dataModel.profile = this.stateData.getPublicProfile();\r\n\r\n if (this.item.valor) { \r\n let stepItemData = this.baseService.parseObjectDeep(JSON.parse(this.item.valor));\r\n\r\n if (stepItemData.data) dataModel.configData = stepItemData.data;\r\n }\r\n\r\n return dataModel;\r\n }\r\n\r\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\r\n return message.componentName == ComponentName.PATIENT_VERIFICATION;\r\n }\r\n\r\n setState(stateData: IWorkflowDataState): void {\r\n this.stateData = this.workflowService.getWorkflowDataState();\r\n }\r\n\r\n isCompleted(): Observable {\r\n return this.authService.isLoggedInFull().pipe(\r\n switchMap((isLoggedIn)=>{\r\n const userId = this.stateData.getUserPhrId();\r\n const patientId = this.stateData.getPatientId();\r\n\r\n return userId > 0\r\n ? of(true)\r\n : isLoggedIn && patientId > 0\r\n ? this.containsRelations()\r\n : of(this.stateData.getPatientValid());\r\n }));\r\n }\r\n\r\n showStepInActionBack(): boolean {\r\n return true;\r\n }\r\n \r\n showStep(): boolean {\r\n return true;\r\n }\r\n\r\n containsRelations(): Observable{\r\n let relations = this.stateData.getRelations();\r\n\r\n if(relations){\r\n if(relations.length > 0){\r\n return of(true);\r\n }\r\n else{\r\n return of(this.stateData.getPatientValid());\r\n }\r\n }\r\n else{\r\n return this.patientService.getRelations(this.stateData.getPatientId()).pipe(\r\n switchMap((relations)=>{\r\n if(relations.length > 0){\r\n this.stateData.setRelations(relations);\r\n return of(true);\r\n }\r\n else{\r\n return of(this.stateData.getPatientValid());\r\n }\r\n }));\r\n }\r\n }\r\n}\r\n\r\nexport interface IPatientVerificationStep {\r\n\r\n getIdVerificacion(): string;\r\n getUserPhrId(): number;\r\n getPatientId(): number;\r\n getPatientName(): string;\r\n getPatientEmail(): string;\r\n getPatientValid(): boolean;\r\n getPublicProfile(): PublicProfile;\r\n getRelations(): Relation[];\r\n\r\n setPatientName(nombrePaciente: string): void;\r\n setPatientEmail(patientEmail: string): void;\r\n setPatientValid(valid: boolean): void;\r\n setRelations(relations: Relation[]): void;\r\n}","import { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\r\nimport { BaseStep } from \"../base-step.model\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\r\nimport { BaseService } from \"src/app/core/services/base.service\";\r\nimport { WorkflowService } from \"src/app/core/services/workflow.service\";\r\nimport { WorkflowItemData } from \"../../../systems/workflow.model\";\r\nimport { PatientVerificationDataModel } from \"../../models/patient-verification-data.model\";\r\nimport { PublicProfile } from \"../../../people/public-profile.model\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SummaryMedicalOrderStep extends BaseStep {\r\n\r\n constructor(protected messageBusService: MessageBusService, private baseService: BaseService, private workflowService: WorkflowService) {\r\n super(messageBusService);\r\n this.showHeader = false;\r\n this.showProgressBar = true;\r\n this.showButtonClose = true;\r\n this.withoutFooter = true;\r\n }\r\n\r\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage): void {\r\n }\r\n protected buildComponentConfigurationData(): { [componentName: string]: any; } {\r\n const formConfigurationData : { [componentName: string]: any; } = {};\r\n \r\n formConfigurationData[ComponentName.SUMMARY_MEDICAL_ORDER] = this.getDataModel();\r\n\r\n return formConfigurationData;\r\n }\r\n\r\n private getDataModel(): PatientVerificationDataModel {\r\n let dataModel = new PatientVerificationDataModel();\r\n\r\n dataModel.idVerificacion = this.stateData.getIdVerificacion();\r\n dataModel.idPaciente = this.stateData.getPatientId();\r\n dataModel.nombrePaciente = this.stateData.getPatientName();\r\n dataModel.profile = this.stateData.getPublicProfile();\r\n\r\n if (this.item.valor) { \r\n let stepItemData = this.baseService.parseObjectDeep(JSON.parse(this.item.valor));\r\n\r\n if (stepItemData.data) dataModel.configData = stepItemData.data;\r\n }\r\n\r\n return dataModel;\r\n }\r\n\r\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\r\n return message.componentName == ComponentName.SUMMARY_MEDICAL_ORDER;\r\n }\r\n setState(stateData: IWorkflowDataState): void {\r\n this.stateData = this.workflowService.getWorkflowDataState();;\r\n }\r\n isCompleted(): Observable {\r\n return of(false);\r\n }\r\n showStepInActionBack(): boolean {\r\n return true;\r\n }\r\n showStep(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport interface ISummaryMedicalOrderWorkflowState {\r\n getIdVerificacion(): string;\r\n getUserId():number;\r\n getPublicProfile(): PublicProfile;\r\n getPatientName(): string;\r\n getPatientId(): number;\r\n\r\n setEmmiterPersonId(personId: number):void;\r\n}\r\n","export class SelectPatientRelationshipModel{\r\n patientRelationship: number = 0;\r\n patientIdRelationship: number = 0;\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { BaseStep } from \"./base-step.model\";\r\nimport { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\r\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { WorkflowService } from \"src/app/core/services/workflow.service\";\r\nimport { WorkflowItem } from \"../../systems/workflow.model\";\r\nimport { PatientService } from \"src/app/core/services/patient.service\";\r\nimport { Relation } from \"../../people/relation.model\";\r\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\r\nimport { SelectPatientRelationshipModel } from \"../models/select-patient-relationship.model\";\r\nimport { map, switchMap } from \"rxjs/operators\";\r\nimport { Dependent } from \"../../people/dependent.model\";\r\nimport { UserService } from \"src/app/core/services/user.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n })\r\nexport class SelectPatientRelationshipStep extends BaseStep {\r\n constructor(\r\n protected messageBusService: MessageBusService,\r\n private workflowService: WorkflowService,\r\n private userService: UserService\r\n ){\r\n super(messageBusService);\r\n\r\n this.showHeader = true;\r\n this.showButtonBack = false;\r\n this.showProgressBar = true;\r\n this.showButtonClose = true;\r\n }\r\n\r\n setItem(item: WorkflowItem): void {\r\n this.item = item;\r\n }\r\n\r\n setState(stateData: any): void {\r\n this.stateData = this.workflowService.getWorkflowDataState();\r\n }\r\n\r\n isCompleted(): Observable {\r\n return this.containsDependents().pipe(map((containsDependents: boolean)=>{\r\n return !containsDependents || this.stateData.getPatientRelationship() > 0 || this.stateData.getUserPhrId() > 0;\r\n }));\r\n }\r\n\r\n showStepInActionBack(): boolean {\r\n return true;\r\n }\r\n \r\n showStep(): boolean {\r\n return true;\r\n }\r\n\r\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage) {\r\n if (message.componentName == ComponentName.SELECT_PATIENT_RELATIONSHIP){\r\n this.stateData.setPatientIdRelationship(message.data.patientIdRelationship);\r\n this.stateData.setPatientRelationship(message.data.patientRelationship);\r\n }\r\n }\r\n \r\n protected buildComponentConfigurationData() : { [componentName: string]: any; } {\r\n let formConfigurationData : { [componentName: string]: any; } = {};\r\n \r\n formConfigurationData[ComponentName.SELECT_PATIENT_RELATIONSHIP] = this.getSelectPatientRelationshipModel();\r\n\r\n return formConfigurationData;\r\n }\r\n\r\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\r\n return message.componentName == ComponentName.SELECT_PATIENT_RELATIONSHIP;\r\n }\r\n\r\n containsDependents(): Observable{\r\n let dependents = this.stateData.getDependents();\r\n\r\n if(dependents){\r\n return of(dependents.length > 0);\r\n }\r\n else{\r\n return this.userService.getUserDependents().pipe(\r\n switchMap((dependents)=>{\r\n if(dependents.length > 0){\r\n this.stateData.setDependents(dependents);\r\n return of(true);\r\n }\r\n else{\r\n return of(false);\r\n }\r\n }));\r\n }\r\n }\r\n\r\n private getSelectPatientRelationshipModel():SelectPatientRelationshipModel{\r\n let dataModel = new SelectPatientRelationshipModel();\r\n\r\n dataModel.patientRelationship = this.stateData.getPatientRelationship();\r\n dataModel.patientIdRelationship = this.stateData.getPatientIdRelationship();\r\n\r\n return dataModel;\r\n }\r\n}\r\n\r\nexport interface ISelectPatientRelationshipWorkflowState{\r\n getUserPhrId(): number;\r\n getDependents(): Dependent[];\r\n getPatientRelationship(): number;\r\n getPatientIdRelationship(): number;\r\n\r\n setDependents(dependents: Dependent[]): void;\r\n setPatientRelationship(patientRelationshipType:number):void;\r\n setPatientIdRelationship(patientId:number):void;\r\n}","export class CreatePatientRelationshipDataModel{\r\n patientRelationship: number = 0;\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { BaseStep } from \"./base-step.model\";\r\nimport { IWorkflowDataState } from \"src/app/shared/interfaces/workflow-data-state\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { ComponentDataSetMessage, MessageBusService } from \"src/app/core/services/message-bus.service\";\r\nimport { WorkflowService } from \"src/app/core/services/workflow.service\";\r\nimport { SenderPatientRelationship } from \"../../process/base-request.model\";\r\nimport { WorkflowItem } from \"../../systems/workflow.model\";\r\nimport { ComponentName } from \"src/app/shared/enums/component-name.enum\";\r\nimport { CreatePatientRelationshipDataModel } from \"../models/create-patient-relationship-data.model\";\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n })\r\nexport class CreatePatientRelationshipStep extends BaseStep{\r\n constructor(\r\n protected messageBusService: MessageBusService,\r\n private workflowService: WorkflowService\r\n ){\r\n super(messageBusService);\r\n\r\n this.showHeader = true;\r\n this.showButtonBack = false;\r\n this.showProgressBar = true;\r\n this.showButtonClose = true;\r\n }\r\n\r\n setItem(item: WorkflowItem): void {\r\n this.item = item;\r\n }\r\n\r\n setState(stateData: any): void {\r\n this.stateData = this.workflowService.getWorkflowDataState();\r\n }\r\n\r\n isCompleted(): Observable {\r\n this.showButtonBack = this.stateData.getPatientRelationship() == SenderPatientRelationship.OTRO;\r\n\r\n const isUser = this.stateData.getUserPhrId() > 0 && this.stateData.getPatientRelationship() == SenderPatientRelationship.USUARIO;\r\n\r\n return of(isUser || this.patientRelationshipSelected());\r\n }\r\n\r\n showStepInActionBack(): boolean {\r\n return true;\r\n }\r\n \r\n showStep(): boolean {\r\n return true;\r\n }\r\n\r\n protected handleComponentSetDataMessage(message: ComponentDataSetMessage): void {\r\n if (message.componentName == ComponentName.CREATE_PATIENT_RELATIONSHIP){\r\n this.stateData.setPatientRelationship(message.data.patientRelationship);\r\n\r\n if(message.data.patientRelationship == SenderPatientRelationship.USUARIO){\r\n this.stateData.setPatientIdRelationship(this.stateData.getUserId());\r\n }\r\n }\r\n }\r\n protected buildComponentConfigurationData(): { [componentName: string]: any; } {\r\n let formConfigurationData : { [componentName: string]: any; } = {};\r\n \r\n formConfigurationData[ComponentName.CREATE_PATIENT_RELATIONSHIP] = this.getCreatePatientRelationshipModel();\r\n\r\n return formConfigurationData;\r\n }\r\n \r\n protected messageForThisStep(message: ComponentDataSetMessage): boolean {\r\n return message.componentName == ComponentName.CREATE_PATIENT_RELATIONSHIP;\r\n }\r\n\r\n private patientRelationshipSelected():boolean{\r\n\r\n let patientRelationship = this.stateData.getPatientRelationship();\r\n\r\n return patientRelationship > 0 && patientRelationship != SenderPatientRelationship.OTRO;\r\n }\r\n\r\n private getCreatePatientRelationshipModel():CreatePatientRelationshipDataModel{\r\n let dataModel = new CreatePatientRelationshipDataModel();\r\n\r\n dataModel.patientRelationship = this.stateData.getPatientRelationship();\r\n\r\n return dataModel;\r\n }\r\n}\r\n\r\nexport interface ICreatePatientRelationshipWorkflowState{\r\n getUserId(): number;\r\n getUserPhrId(): number;\r\n getPatientRelationship(): number;\r\n setPatientRelationship(patientRelationshipType:number):void;\r\n setPatientIdRelationship(patientId:number):void;\r\n}","import { Injectable } from '@angular/core';\r\nimport { IStepFlow } from 'src/app/shared/interfaces/step-flow';\r\nimport { IWorkflowDataState } from 'src/app/shared/interfaces/workflow-data-state';\r\nimport { WorkflowItem } from 'src/app/shared/models/systems/workflow.model';\r\nimport { AuthenticationStep } from 'src/app/shared/models/workflow/steps/authentication-step.model';\r\nimport { SelectPatientAppointmentCheckoutStep } from 'src/app/shared/models/workflow/steps/select-patient-appointment-checkout-step.model';\r\nimport { PatientFormAppointmentCheckoutStep } from 'src/app/shared/models/workflow/steps/patient-form-appointment-checkout-step.model';\r\nimport { SelectPatientRelationshipAppointmentCheckoutStep } from 'src/app/shared/models/workflow/steps/select-patient-relationship-appointment-checkout-step.model';\r\nimport { PatientContactFormAppointmentCheckoutStep } from 'src/app/shared/models/workflow/steps/patient-contact-form-appointment-checkout-step.model';\r\nimport { WorkflowStepName } from 'src/app/shared/enums/workflow-step-name.enum';\r\nimport { SummaryAppointmentCheckoutStep } from 'src/app/shared/models/workflow/steps/summary-appointment-checkout-step.model';\r\nimport { PaymentAmountStep } from 'src/app/shared/models/workflow/steps/payment/payment-amount-step.model';\r\nimport { PaymentFormStep } from 'src/app/shared/models/workflow/steps/payment/payment-form-step.model';\r\nimport { environment } from 'src/environments/environment';\r\nimport { SelectCountryStep } from 'src/app/shared/models/workflow/steps/select-country-step.model';\r\nimport { PatientVerificationStep } from 'src/app/shared/models/workflow/steps/patient-verification-step.model';\r\nimport { SummaryMedicalOrderStep } from 'src/app/shared/models/workflow/steps/medical-orders/summary-medical-order-step.model';\r\nimport { SelectPatientRelationshipStep } from 'src/app/shared/models/workflow/steps/select-patient-relationship-step.model';\r\nimport { CreatePatientRelationshipStep } from 'src/app/shared/models/workflow/steps/create-patient-relationship-step.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WorkflowStepService {\r\n\r\n encryptSessionData = environment.encryptLocalStorage;\r\n\r\n constructor(\r\n private authenticationStep: AuthenticationStep,\r\n private selectCountryStep: SelectCountryStep,\r\n private selectPatientAppointmentCheckoutStep: SelectPatientAppointmentCheckoutStep,\r\n private patientFormAppointmentCheckoutStep: PatientFormAppointmentCheckoutStep,\r\n private selectPatientRelationshipAppointmentCheckoutStep: SelectPatientRelationshipAppointmentCheckoutStep,\r\n private patientContactFormAppointmentCheckoutStep: PatientContactFormAppointmentCheckoutStep,\r\n private summaryAppointmentCheckoutStep: SummaryAppointmentCheckoutStep,\r\n private paymentAmountStep: PaymentAmountStep,\r\n private paymentFormStep: PaymentFormStep,\r\n private patientVerificationStep: PatientVerificationStep,\r\n private summaryMedicalOrderStep: SummaryMedicalOrderStep,\r\n private selectPatientRelationshipStep: SelectPatientRelationshipStep,\r\n private createPatientRelationshipStep: CreatePatientRelationshipStep\r\n ) { \r\n\r\n }\r\n\r\n createSteps(items: WorkflowItem[], state: IWorkflowDataState): IStepFlow[]{\r\n\r\n let steps: IStepFlow[] = [];\r\n\r\n items.forEach(item=>{\r\n\r\n switch(item.nombreClaseItem){\r\n case WorkflowStepName.PATIENT_VERIFICATION:\r\n this.patientVerificationStep.setItem(item);\r\n this.patientVerificationStep.setState(state);\r\n steps.push(this.patientVerificationStep);\r\n break;\r\n case WorkflowStepName.AUTHENTICATION:\r\n this.authenticationStep.setItem(item);\r\n this.authenticationStep.setState(state);\r\n steps.push(this.authenticationStep);\r\n break;\r\n case WorkflowStepName.SELECT_COUNTRY:\r\n this.selectCountryStep.setItem(item);\r\n this.selectCountryStep.setState(state);\r\n steps.push(this.selectCountryStep);\r\n break; \r\n case WorkflowStepName.SELECT_PATIENT_APPOINTMENT_CHECKOUT:\r\n this.selectPatientAppointmentCheckoutStep.setItem(item);\r\n this.selectPatientAppointmentCheckoutStep.setState(state);\r\n steps.push(this.selectPatientAppointmentCheckoutStep);\r\n break;\r\n case WorkflowStepName.PATIENT_FORM_APPOINTMENT_CHECKOUT:\r\n this.patientFormAppointmentCheckoutStep.setItem(item);\r\n this.patientFormAppointmentCheckoutStep.setState(state);\r\n steps.push(this.patientFormAppointmentCheckoutStep);\r\n break;\r\n case WorkflowStepName.SELECT_PATIENT_RELATIONSHIP_APPOINTMENT_CHECKOUT:\r\n this.selectPatientRelationshipAppointmentCheckoutStep.setItem(item);\r\n this.selectPatientRelationshipAppointmentCheckoutStep.setState(state);\r\n steps.push(this.selectPatientRelationshipAppointmentCheckoutStep);\r\n break;\r\n case WorkflowStepName.PATIENT_CONTACT_FORM_APPOINTMENT_CHECKOUT:\r\n this.patientContactFormAppointmentCheckoutStep.setItem(item);\r\n this.patientContactFormAppointmentCheckoutStep.setState(state);\r\n steps.push(this.patientContactFormAppointmentCheckoutStep);\r\n break;\r\n case WorkflowStepName.SUMMARY_APPOINTMENT_CHECKOUT:\r\n this.summaryAppointmentCheckoutStep.setItem(item);\r\n this.summaryAppointmentCheckoutStep.setState(state);\r\n steps.push(this.summaryAppointmentCheckoutStep);\r\n break;\r\n case WorkflowStepName.SUMMARY_MEDICAL_ORDER:\r\n this.summaryMedicalOrderStep.setItem(item);\r\n this.summaryMedicalOrderStep.setState(state);\r\n steps.push(this.summaryMedicalOrderStep);\r\n break;\r\n case WorkflowStepName.PAYMENT_AMOUNT:\r\n this.paymentAmountStep.setItem(item);\r\n this.paymentAmountStep.setState(state);\r\n steps.push(this.paymentAmountStep);\r\n break;\r\n case WorkflowStepName.PAYMENT_FORM:\r\n this.paymentFormStep.setItem(item);\r\n this.paymentFormStep.setState(state);\r\n steps.push(this.paymentFormStep);\r\n break;\r\n case WorkflowStepName.SELECT_PATIENT_RELATIONSHIP:\r\n this.selectPatientRelationshipStep.setItem(item);\r\n this.selectPatientRelationshipStep.setState(state);\r\n steps.push(this.selectPatientRelationshipStep);\r\n break;\r\n case WorkflowStepName.CREATE_PATIENT_RELATIONSHIP:\r\n this.createPatientRelationshipStep.setItem(item);\r\n this.createPatientRelationshipStep.setState(state);\r\n steps.push(this.createPatientRelationshipStep);\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n return steps;\r\n } \r\n}\r\n","import { Component, Inject, OnDestroy } from '@angular/core';\nimport { Observable, of, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { MessageBusService, WorkflowDataMessage } from 'src/app/core/services/message-bus.service';\nimport { WorkflowService } from 'src/app/core/services/workflow.service';\nimport { IWorkflowComponent } from 'src/app/shared/interfaces/workflow-component';\nimport { IStepFlow } from 'src/app/shared/interfaces/step-flow';\nimport { Workflow, WorkflowItemData } from 'src/app/shared/models/systems/workflow.model';\nimport { WorkflowProgressBarComponentData } from '../workflow-progress-bar/workflow-progress-bar.component';\nimport { IWorkflowDataState } from 'src/app/shared/interfaces/workflow-data-state';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { WorkflowStepService } from 'src/app/core/services/workflow-step.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { BaseRequestModel } from 'src/app/shared/models/process/base-request.model';\nimport { DOCUMENT, Location } from '@angular/common';\nimport { ActivatedRoute, Params } from '@angular/router';\n\n@Component({\n selector: 'app-base-workflow',\n template: '',\n styleUrls: ['./base-workflow.component.css']\n})\nexport class BaseWorkflowComponent implements IWorkflowComponent, OnDestroy {\n protected ngUnsubscribe = new Subject();\n\n model: Workflow;\n data: any;\n \n stepIndex: number = 0;\n progressBarModel: WorkflowProgressBarComponentData = new WorkflowProgressBarComponentData();\n\n workflowMessage: WorkflowDataMessage;\n\n currentStep: IStepFlow;\n steps: Array = [];\n state: IWorkflowDataState;\n backToFlowStep: boolean = false;\n validationStepCompletedDisabled: boolean = false;\n\n checkingStep:boolean;\n\n formConfigurationData: {[componentName: string] : any; };\n\n constructor(\n protected location: Location,\n protected route: ActivatedRoute,\n protected baseService: BaseService,\n protected messageBusService: MessageBusService,\n protected publicProfileService: PublicProfileService,\n protected workflowService: WorkflowService,\n protected workflowStepService: WorkflowStepService,\n @Inject(DOCUMENT) protected document: Document\n ){\n\n this.messageBusService.onSendWorkflowStateUpdateMessage()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message=>{\n this.state = message.state;\n\n this.workflowService.setWorkflowDataState(this.state);\n });\n\n this.messageBusService.onSendFlowStepCompleted()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message=>{\n if(message.state){\n this.state = message.state;\n\n this.workflowService.setWorkflowDataState(this.state);\n }\n \n this.flowStepCompleted();\n });\n\n this.messageBusService.onCloseWorkFlowRequest()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(args => this.closeWorkflow(args));\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n init(){\n this.steps = this.workflowStepService.createSteps(this.model.items, this.state);\n\n this.loadStep();\n\n this.route.queryParams\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(this.closeWorkflowIfQueryParamExists.bind(this));\n }\n\n private closeWorkflowIfQueryParamExists(args: Params): void {\n const cerrar = args['close'] === 'true';\n if (cerrar) {\n const currentUrl: string = this.location.path();\n const urlWithoutQueryParams = currentUrl.split('?')[0];\n\n this.location.replaceState(urlWithoutQueryParams);\n\n\n setTimeout(() => {\n this.closeWorkflow(); \n }, 100);\n \n }\n }\n\n protected getPublicProfileUrl(state: BaseRequestModel): string {\n return this.publicProfileService.getPublicProfileUrl(state.nicknameResponsableServicioDestino ?? '');\n }\n\n loadStep() {\n let currentStep = this.steps[this.stepIndex];\n currentStep.setState(this.state);\n\n // Once current step is set the form will be loaded, so before that we call step method to do any prior form setup\n currentStep.onBeforeFormLoad().subscribe(() => {\n this.formConfigurationData = currentStep.formConfigurationData;\n\n this._loadStep();\n });\n }\n\n private _loadStep() {\n this.currentStep = this.steps[this.stepIndex];\n this.currentStep.setState(this.state);\n\n if(this.backToFlowStep){\n if(this.currentStep.showStepInActionBack()){\n this.backToFlowStep = false;\n\n this.validationStepCompletedDisabled = true;\n\n this.buildProgressBarModel();\n this.configFooter();\n }\n else{\n this.onBackFlowStep();\n }\n }\n else if(this.validationStepCompletedDisabled){\n\n if(!this.currentStep.showStep()){\n this.doFlowStepCompleted();\n }\n\n this.buildProgressBarModel();\n this.configFooter();\n }\n else{\n this.checkingStep = true;\n this.currentStep.isCompleted()\n .subscribe((result:boolean)=>{ \n if(result){\n this.doFlowStepCompleted();\n }\n\n this.checkingStep = false;\n\n this.buildProgressBarModel();\n this.configFooter();\n });\n }\n }\n\n loadNextStep(){\n this.stepIndex++;\n\n if(this.model.items.length > this.stepIndex){\n this.loadStep();\n } \n }\n\n flowStepCompleted(){\n this.currentStep.setState(this.state); \n\n this.currentStep.isCompleted()\n .subscribe((result:boolean)=>{\n if(result){\n // When the user completes a step, always set this flag to false\n this.validationStepCompletedDisabled = false;\n this.doFlowStepCompleted(true);\n }\n else{\n console.log(\"flow step completed error\")\n this.loadStep();\n }\n });\n }\n\n doFlowStepCompleted(updateState: boolean = false){\n this.workflowService.setWorkflowDataState(this.state);\n\n let stepItemData = new WorkflowItemData(JSON.parse(this.currentStep.item.valor));\n\n if(stepItemData && stepItemData.endWorkflow){\n this.completeWorkflowStateData()\n .subscribe(\n (a)=>{\n if(this.model.items.length > this.stepIndex)\n this.loadNextStep();\n },\n error => {\n this.baseService.handleServiceError(error, \"Error completing flow\");\n });\n }\n else if(updateState) {\n this.updateWorkflowStateData()\n .subscribe(\n (a)=>{\n this.loadNextStep();\n },\n error =>{\n this.baseService.handleServiceError(error, \"Error completing flow step\");\n });\n }\n else{\n this.loadNextStep();\n }\n }\n\n showWorkflowContent():boolean{\n return this.currentStep && !this.checkingStep;\n }\n\n getIdAreaSistema():number{\n return this.currentStep ? this.currentStep.item.idAreaSistema : -1;\n }\n\n buildProgressBarModel(){\n\n this.progressBarModel.show = this.currentStep.showHeader;\n this.progressBarModel.showButtonBack = this.currentStep.showButtonBack;\n this.progressBarModel.showButtonClose = this.currentStep.showButtonClose;\n this.progressBarModel.showProgressBar = this.currentStep.showProgressBar;\n\n // TODO replace with a defined value at each step\n this.progressBarModel.percentComplete = this.calculateProgressBarProgress(this.model.items.length, this.stepIndex);\n\n this.progressBarModel.backFn = this.onBackFlowStep.bind(this);\n }\n\n calculateProgressBarProgress(workflowStepsCount: number, currentStepIndex: number) {\n return (100 / workflowStepsCount) * (currentStepIndex + 1);\n }\n\n configFooter(){\n if(this.currentStep.withoutFooter){\n this.document.body.classList.add('step-without-footer');\n }\n else{\n this.document.body.classList.remove('step-without-footer');\n }\n }\n\n onBackFlowStep(){\n this.stepIndex--;\n this.backToFlowStep = true;\n this.loadStep();\n }\n\n setPercentComplete(percentage: number){\n this.progressBarModel.percentComplete = percentage;\n }\n\n completeWorkflowStateData():Observable{\n // override in the particular workflow component\n return of();\n }\n\n updateWorkflowStateData():Observable{\n // override in the particular workflow component\n return of(); \n }\n\n closeWorkflow(args?: any): void {\n // override in the particular workflow component\n }\n}","","import { Component, Inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { DialogData } from '../../models/dialog-data.model';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ConfirmDialogComponent } from '../dialogs/confirm-dialog/confirm-dialog.component';\nimport { Router } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'app-logout-bar',\n templateUrl: './logout-bar.component.html',\n styleUrls: ['./logout-bar.component.css']\n})\nexport class LogoutBarComponent implements OnInit, OnDestroy {\n\n show: boolean = false;\n profileImg: string;\n profileName: string;\n\n private ngUnsubscribe = new Subject();\n\n @Input()closeFn: any;\n \n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private authService: AuthService,\n private userService: UserService,\n private appStoreService: AppStorageService,\n private translation: L10nTranslationService,\n private dialog: MatDialog,\n private router: Router\n ) { }\n\n ngOnInit(): void {\n let existsTokenInSession = this.appStoreService.getItemSession(STORAGE.TOKEN) ? true : false;\n\n if(!existsTokenInSession){\n this.authService.isLoggedInFull()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((result:boolean)=>{\n if(result){\n this.userService.getUserPersonLoggedIn()\n .subscribe((user)=>{\n if(user){\n this.show = true;\n\n this.profileImg = user.ubicacionLogo;\n this.profileName = user.nombre;\n }\n });\n }\n });\n }\n else{\n this.show = false;\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n onClick(){\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"shared.logoutDialog.title\", { name: this.profileName });\n dialogData.confirmText = this.translation.translate(\"shared.logoutDialog.confirmText\"); \n dialogData.cancelText = this.translation.translate(\"shared.logoutDialog.cancelText\");\n dialogData.showHeaderIcon = false;\n dialogData.showCancelButton = true;\n dialogData.id = 'confirm-logout-dialog';\n dialogData.animationIn = 'confirm-logout-animation-in';\n dialogData.animationOut = 'confirm-logout-animation-out';\n\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n data: dialogData,\n panelClass: ['confirm-logout-dialog', 'confirm-logout-animation-in']\n });\n\n dialogRef.afterClosed().subscribe(accepted => {\n\n if(accepted){\n this.closeFn();\n\n this.show = false;\n }\n });\n }\n}","
\n \n \n \n
\n \n
\n
\n
\n \n
\n\n\n\n","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { MessageBusService, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\nimport { WorkflowService } from 'src/app/core/services/workflow.service';\nimport { WorkflowLookup } from 'src/app/shared/decorators/workflow-lookup.decorator';\nimport { OnlineAppointmentRequest } from 'src/app/shared/models/process/online-appointment-request.model';\nimport { AppointmentCheckout } from 'src/app/shared/models/workflow/models/appointment-checkout.model';\nimport { OnlineAppointmentCliniwebState } from 'src/app/shared/models/workflow/states/online-appointment-cliniweb-state.model';\nimport { BaseWorkflowComponent } from '../base-workflow/base-workflow.component';\nimport { DOCUMENT, Location } from '@angular/common';\nimport { OnlineAppointmentStatus } from 'src/app/shared/enums/online-appointment-status.enum';\nimport { WorkflowStepService } from 'src/app/core/services/workflow-step.service';\nimport { StatesRequestVerifyDataModel } from '../../states-request-verify/states-request-verify.component';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { RouteDialogType } from '../../dialogs/route-dialog/route-dialog.component';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { CompanyModel } from 'src/app/shared/models/systems/company.model';\n\n@Component({\n selector: 'app-online-appointment-cliniweb',\n templateUrl: './online-appointment-cliniweb.component.html',\n styleUrls: [\n '../base-workflow/base-workflow.component.css',\n './online-appointment-cliniweb.component.css'\n ],\n encapsulation: ViewEncapsulation.None\n})\n@WorkflowLookup('OnlineAppointmentCliniwebComponent')\nexport class OnlineAppointmentCliniwebComponent extends BaseWorkflowComponent implements OnInit { \n state: OnlineAppointmentCliniwebState = new OnlineAppointmentCliniwebState();\n\n showState:boolean = false;\n onlineAppointmentStatus: OnlineAppointmentStatus;\n statesRequestVerifyDataModel: StatesRequestVerifyDataModel;\n activatingAccount: boolean;\n\n logoutFn: any;\n\n constructor(\n protected route: ActivatedRoute,\n private router: Router,\n protected location: Location,\n private appointmentService: AppointmentService,\n private userService: UserService,\n private translation: L10nTranslationService,\n private dialog: MatDialog,\n protected publicProfileService: PublicProfileService,\n private routeDialogService: RouteDialogService,\n private authService: AuthService,\n protected baseService: BaseService,\n protected messageBusService: MessageBusService,\n protected workflowService: WorkflowService,\n protected workflowStepService: WorkflowStepService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private appStorageService: AppStorageService,\n @Inject(DOCUMENT) protected document: Document\n ){\n super(\n location,\n route,\n baseService, \n messageBusService, \n publicProfileService, \n workflowService, \n workflowStepService, \n document);\n\n this.logoutFn = this.logout.bind(this);\n }\n \n ngOnInit() {\n if(this.data && this.data.idVerificacion){\n this.checkOnlineAppointmentStatus();\n } else{\n this.startWorkflow();\n }\n }\n\n logout() {\n this.authService.logout();\n\n this.stepIndex = 0;\n this.loadStep(); \n }\n\n checkOnlineAppointmentStatus(){\n this.appointmentService.getStatus(this.data.idVerificacion).subscribe({\n next: this.getStatusNext.bind(this), \n error: _ => this.messageBusService.serviceError(new ServiceErrorMessage(\"Error getting request status\"))\n });\n }\n\n private getStatusNext(status: OnlineAppointmentStatus): void {\n this.onlineAppointmentStatus = status;\n\n if (this.onlineAppointmentStatus == OnlineAppointmentStatus.POR_COMPLETAR) {\n this.showState = false;\n this.startWorkflow();\n }\n else if (this.onlineAppointmentStatus == OnlineAppointmentStatus.USUARIO_POR_REGISTRAR) {\n this.showState = false;\n\n this.activatingAccount = true;\n\n this.userConfirmation().subscribe(this.userConfirmationNext.bind(this));\n }\n else if(this.onlineAppointmentStatus == OnlineAppointmentStatus.COMPLETADA) {\n this.authService.isLoggedInFull().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.isLoggedInFullNext.bind(this));\n }\n else{\n this.configStatusView();\n this.showState = true;\n }\n }\n\n private userConfirmationNext(result: boolean): void {\n if (result) {\n this.configStatusView();\n this.showState = true;\n } else{\n this.messageBusService.serviceError(new ServiceErrorMessage(\"Error confirming user\"));\n }\n setTimeout(() => this.activatingAccount = false, 500);\n }\n\n private isLoggedInFullNext(isLoggedIn: boolean): void {\n if (isLoggedIn) {\n this.stepIndex = this.model.items.length - 1;\n this.startWorkflow();\n } else{\n this.router.navigate(['welcome', 'login'], { queryParams: { returnUrl: this.router.routerState.snapshot.url } });\n } \n }\n\n configStatusView(): void {\n this.statesRequestVerifyDataModel = new StatesRequestVerifyDataModel();\n\n this.statesRequestVerifyDataModel.companyLogoUrl = 'assets/images/cliniweb/logo-cliniweb-phr.svg';\n this.statesRequestVerifyDataModel.mainImageUrl = 'assets/images/cliniweb/Campana.gif';\n this.statesRequestVerifyDataModel.showActionButton = true;\n this.statesRequestVerifyDataModel.showHomeButton = false;\n\n switch(this.onlineAppointmentStatus){\n case OnlineAppointmentStatus.USUARIO_POR_REGISTRAR:\n this.statesRequestVerifyDataModel.buttonActionFn = this.continueWithAppointment.bind(this);\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.continueWithAppointment';\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.accountActivatedInCliniweb';\n break;\n case OnlineAppointmentStatus.COMPLETADA:\n this.statesRequestVerifyDataModel.buttonActionFn = this.gotoAppointments.bind(this);\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.gotoAppointments';\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.scheduledAppointment';\n break;\n case OnlineAppointmentStatus.VENCIDA:\n this.statesRequestVerifyDataModel.buttonActionFn = this.gotoSignup.bind(this);\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.gotoSignup';\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.expiredAppointment';\n this.statesRequestVerifyDataModel.textDescriptionRefI18n = 'shared.statesRequestVerify.expiredAppointmentDescription';\n break;\n }\n }\n\n private userConfirmation():Observable{\n return this.userService.postConfirmation(this.data.idVerificacion)\n .pipe(\n map((response)=>{\n return response.success;\n }),\n catchError((err) => {\n return of(false);\n })\n );\n }\n\n continueWithAppointment(){\n this.showState = false;\n\n this.startWorkflow();\n }\n\n gotoAppointments(){\n this.router.navigate(['mis-citas']);\n }\n\n gotoSignup(){\n this.router.navigate(['signup']);\n }\n\n\n startWorkflow(){\n this.workflowService.setWorkflowTypeActive(STORAGE.ONLINE_APPOINTMENT_CLINIWEB_STATE);\n\n this.getState().subscribe((state:OnlineAppointmentCliniwebState)=>{\n\n if(!state){\n //TODO analizar agregar una vista que informe al usuario que no hay datos de la cita, con el link al home\n this.onlineAppointmentStatus = OnlineAppointmentStatus.VENCIDA;\n\n this.configStatusView();\n this.showState = true;\n }\n\n this.state = state;\n this.workflowService.setWorkflowDataState(this.state);\n\n this.init();\n });\n\n this.progressBarModel.closeFn = this.closeWorkflow.bind(this);\n }\n\n getState():Observable{\n \n if(this.data){\n return this.getStateByAppointmentCheckout(this.data); \n }\n else {\n let bootstrapState = this.appStorageService.getItemSession(STORAGE.ONLINE_APPOINTMENT_CLINIWEB_BOOTSTRAP_STATE) as AppointmentCheckout;\n\n if(bootstrapState){\n this.data = bootstrapState;\n\n this.appStorageService.removeSessionItem(STORAGE.ONLINE_APPOINTMENT_CLINIWEB_BOOTSTRAP_STATE);\n \n return this.getStateByAppointmentCheckout(this.data);\n }\n else {\n return of(this.workflowService.getWorkflowDataState() as OnlineAppointmentCliniwebState);\n }\n } \n }\n\n getStateByAppointmentCheckout(appointmentCheckout: AppointmentCheckout):Observable{\n let _state:OnlineAppointmentCliniwebState = new OnlineAppointmentCliniwebState();\n\n // If we do not get the state from localstorage first we will loose the request data from the state\n _state = this.workflowService.getWorkflowDataState(STORAGE.ONLINE_APPOINTMENT_CLINIWEB_STATE);\n\n if (!_state)\n _state = new OnlineAppointmentCliniwebState(); \n\n if(appointmentCheckout.idVerificacion){\n return this.appointmentService.getOnlineAppointmentRequest(appointmentCheckout.idVerificacion)\n .pipe(\n map((request:OnlineAppointmentRequest)=>{ \n _state.onlineAppointmentRequest = request;\n _state.setPublicProfile(request.profile);\n \n if (_state.request && _state.request.etapasSolicitud && _state.request.etapasSolicitud.length > 0) {\n _state.request.etapasSolicitud[0].idEstado = _state.onlineAppointmentRequest.idEstado;\n _state.request.etapasSolicitud[0].nombreEstado = _state.onlineAppointmentRequest.nombreEstado;\n }\n\n _state.idVerificacion = appointmentCheckout.idVerificacion;\n\n return _state;\n }),\n catchError((err) => {\n this.baseService.handleServiceError(err, \"Error getting online appointment request\");\n\n this.router.navigate(['/not-found']);\n\n return of(_state);\n })\n );\n }\n else{\n let _onlineAppointmentRequest = new OnlineAppointmentRequest();\n\n _onlineAppointmentRequest.fechaInicio = appointmentCheckout.fechaInicio;\n _onlineAppointmentRequest.fechaFin = appointmentCheckout.fechaFin;\n _onlineAppointmentRequest.idResponsableServicioDestino = appointmentCheckout.idResponsableServicio;\n _onlineAppointmentRequest.nombreResponsableServicioDestino = appointmentCheckout.nombreResponsableServicio;\n _onlineAppointmentRequest.urlAvatarResponsableServicioDestino = appointmentCheckout.urlAvatarResponsableServicio;\n _onlineAppointmentRequest.nicknameResponsableServicioDestino = appointmentCheckout.nickname;\n _onlineAppointmentRequest.especialidadResponsableServicioDestino = appointmentCheckout.especialidadResponsableServicio;\n\n _onlineAppointmentRequest.perfilPublico = appointmentCheckout.perfilPublico; \n\n _onlineAppointmentRequest.idLocalidad = appointmentCheckout.idLocalidad;\n _onlineAppointmentRequest.nombreLocalidad = appointmentCheckout.nombreLocalidad;\n _onlineAppointmentRequest.direccionLocalidad = appointmentCheckout.direccionLocalidad;\n _onlineAppointmentRequest.coordenadasLocalidad = appointmentCheckout.coordenadasLocalidad;\n _onlineAppointmentRequest.telefonoLocalidad = appointmentCheckout.telefonoLocalidad;\n _onlineAppointmentRequest.teleconsulta = appointmentCheckout.teleconsulta;\n _onlineAppointmentRequest.idEmpresaDestino = appointmentCheckout.idEmpresa;\n _onlineAppointmentRequest.checkoutUrl = this.document.location.origin + '/citas/checkout/'; \n _onlineAppointmentRequest.localizacion = this.locale.language;\n\n return this.baseService.getCompanyByLicense()\n .pipe(switchMap((company:CompanyModel)=>{\n _onlineAppointmentRequest.idEmpresaOrigen = company.id;\n _onlineAppointmentRequest.nombreEmpresaOrigen = company.name;\n\n _state.onlineAppointmentRequest = _onlineAppointmentRequest;\n _state.idVerificacion = '';\n\n return of(_state);\n }), \n catchError((err) => {\n this.baseService.handleServiceError(err, \"Error getting online appointment request\");\n return of(_state);\n }));\n }\n }\n \n closeWorkflow(){\n\n if(this.state && this.state.idVerificacion){\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"shared.appointmentCancelDialog.title\");\n dialogData.message = this.translation.translate(\"shared.appointmentCancelDialog.message\");\n dialogData.confirmText = this.translation.translate(\"shared.appointmentCancelDialog.confirmText\"); \n dialogData.cancelText = this.translation.translate(\"shared.appointmentCancelDialog.cancelText\");\n dialogData.showHeaderIcon = false;\n dialogData.showCancelButton = true;\n dialogData.loadLicense = true;\n \n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n data: dialogData,\n panelClass: 'cancel-appointment-dialog'\n });\n \n dialogRef.afterClosed().subscribe(accepted => {\n \n if(accepted){\n this.onCloseWorkflow();\n }\n });\n }\n else{\n this.onCloseWorkflow();\n }\n }\n\n onCloseWorkflow(){\n this.messageBusService.showHeader();\n\n this.workflowService.removeWorkflowData(STORAGE.ONLINE_APPOINTMENT_CLINIWEB);\n this.appStorageService.removeSessionItem(STORAGE.ONLINE_APPOINTMENT_CLINIWEB_BOOTSTRAP_STATE);\n\n if(this.routeDialogService.isOpen(RouteDialogType.APPOINTMENT)){\n this.routeDialogService.closeDialog(RouteDialogType.APPOINTMENT);\n }\n else{\n const url = this.getPublicProfileUrl(this.state.onlineAppointmentRequest);\n \n this.router.navigate([url]);\n }\n }\n\n updateWorkflowStateData():Observable{ \n if(this.state.idVerificacion){\n return this.appointmentService.updateOnlineAppointmentRequest(\n this.state.idVerificacion,\n this.state.onlineAppointmentRequest)\n .pipe(map((id:number)=>{\n this.state.onlineAppointmentRequest.id = id;\n this.workflowService.setWorkflowDataState(this.state);\n }),\n catchError(err=>{\n this.baseService.handleServiceError(err, \"Error updating online appointment request\");\n return of();\n }));\n }\n else{\n return this.appointmentService.createOnlineAppointmentRequest(this.state.onlineAppointmentRequest)\n .pipe(map((idVerificacion:string)=>{\n this.state.idVerificacion = idVerificacion;\n this.workflowService.setWorkflowDataState(this.state);\n\n //this.location.go(`${this.baseService.getLanguage() + this.router.url}/${idVerificacion}`);\n this.router.navigate([`${this.baseService.getLanguage() + this.router.url}/${idVerificacion}`]);\n }),\n catchError(err=>{\n this.baseService.handleServiceError(err, \"Error creating online appointment request\");\n return of();\n }));\n }\n }\n\n completeWorkflowStateData():Observable{\n return this.appointmentService.confirmOnlineAppointmentRequest(\n this.state.idVerificacion,\n this.state.onlineAppointmentRequest)\n .pipe(map((request:any)=>{\n this.state.request = request;\n this.workflowService.setWorkflowDataState(this.state);\n \n this.userService.getUserPersonLoggedInFromService().subscribe(\n usr => {},\n error => {\n this.baseService.handleServiceError(error, \"Error getting user person logged in\");\n });\n }));\n }\n\n toCompleteStatus(){\n return this.onlineAppointmentStatus == OnlineAppointmentStatus.POR_COMPLETAR;\n }\n\n completedStatus(){\n return this.onlineAppointmentStatus == OnlineAppointmentStatus.COMPLETADA;\n }\n\n expiredStatus(){\n return this.onlineAppointmentStatus == OnlineAppointmentStatus.VENCIDA;\n }\n}","
\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n","import { Component, HostListener, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\n\r\n@Component({\r\n selector: 'app-loading-dialog',\r\n templateUrl: './loading-dialog.component.html',\r\n styleUrls: ['./loading-dialog.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class LoadingDialogComponent implements OnInit {\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n private mdDialogRef: MatDialogRef\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n public cancel() {\r\n this.close(false);\r\n }\r\n\r\n public close(value:any) {\r\n this.mdDialogRef.close(value);\r\n }\r\n\r\n public confirm() {\r\n this.close(true);\r\n }\r\n \r\n @HostListener(\"keydown.esc\") \r\n public onEsc() {\r\n this.close(false);\r\n }\r\n}","
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n\r\n\r\n","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, map, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { MessageBusService, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\r\nimport { WorkflowService } from 'src/app/core/services/workflow.service';\r\nimport { WorkflowLookup } from 'src/app/shared/decorators/workflow-lookup.decorator';\r\nimport { BaseWorkflowComponent } from '../base-workflow/base-workflow.component';\r\nimport { OnlinePaymentWorkflowState } from 'src/app/shared/models/workflow/states/online-payment-workflow-state.model';\r\nimport { OnlinePaymentRequest } from 'src/app/shared/models/process/online-payment-request.model';\r\nimport { OnlinePaymentModel } from 'src/app/shared/models/workflow/models/online-payment.model';\r\nimport { PaymentService } from 'src/app/core/services/payment-service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { LoadingDialogComponent } from '../../dialogs/loading-dialog/loading-dialog.component';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { WorkflowStepService } from 'src/app/core/services/workflow-step.service';\r\nimport { NotificacionType } from 'src/app/shared/enums/notification-type.enum';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { HttpResponseModel } from 'src/app/shared/models/http-response-model';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\r\nimport { RouteDialogType } from '../../dialogs/route-dialog/route-dialog.component';\r\nimport { CompanyModel } from 'src/app/shared/models/systems/company.model';\r\nimport { DOCUMENT, Location } from '@angular/common';\r\nimport { StatesRequestVerifyDataModel } from '../../states-request-verify/states-request-verify.component';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { OnlineAppointmentStatus } from 'src/app/shared/enums/online-appointment-status.enum';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { AuthService } from 'src/app/core/services/auth.service';\r\n\r\n\r\n@Component({\r\n selector: 'app-online-payment-workflow',\r\n templateUrl: './online-payment-workflow.component.html',\r\n styleUrls: [\r\n '../base-workflow/base-workflow.component.css',\r\n './online-payment-workflow.component.css'\r\n ],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@WorkflowLookup('OnlinePaymentWorkflowComponent')\r\nexport class OnlinePaymentWorkflowComponent extends BaseWorkflowComponent implements OnInit { \r\n state: OnlinePaymentWorkflowState = new OnlinePaymentWorkflowState();\r\n\r\n // Model passed by payment module to workflow\r\n sourceModel: OnlinePaymentModel;\r\n\r\n savingDialogRef: MatDialogRef;\r\n\r\n showState:boolean = false;\r\n statesRequestVerifyDataModel: StatesRequestVerifyDataModel;\r\n activatingAccount: boolean;\r\n onlineAppointmentStatus: OnlineAppointmentStatus;\r\n\r\n constructor(\r\n protected route: ActivatedRoute,\r\n protected location: Location,\r\n private router: Router,\r\n private paymentService: PaymentService,\r\n private translation: L10nTranslationService,\r\n private dialog: MatDialog,\r\n protected publicProfileService: PublicProfileService,\r\n private routeDialogService: RouteDialogService,\r\n private appStorageService: AppStorageService,\r\n protected baseService: BaseService,\r\n protected messageBusService: MessageBusService,\r\n protected workflowService: WorkflowService,\r\n protected workflowStepService: WorkflowStepService, \r\n private appointmentService: AppointmentService,\r\n private userService: UserService,\r\n private authService: AuthService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(DOCUMENT) protected document: Document\r\n ){\r\n super(location, route, baseService, messageBusService, publicProfileService, workflowService, workflowStepService, document);\r\n }\r\n \r\n ngOnInit() {\r\n if (this.data)\r\n this.sourceModel = this.data as OnlinePaymentModel;\r\n\r\n if(this.data && this.data.idVerificacion){\r\n this.checkOnlineAppointmentStatus();\r\n }\r\n else{\r\n this.startWorkflow();\r\n }\r\n }\r\n\r\n checkOnlineAppointmentStatus(){\r\n this.appointmentService.getStatus(this.data.idVerificacion).subscribe({\r\n next: this.getStatusNext.bind(this),\r\n error: _ => this.messageBusService.serviceError(new ServiceErrorMessage(\"Error getting request status\"))\r\n });\r\n }\r\n\r\n private getStatusNext(status: OnlineAppointmentStatus): void {\r\n this.onlineAppointmentStatus = status;\r\n\r\n if(this.onlineAppointmentStatus == OnlineAppointmentStatus.POR_COMPLETAR){\r\n this.showState = false;\r\n this.startWorkflow();\r\n }\r\n else if(this.onlineAppointmentStatus == OnlineAppointmentStatus.USUARIO_POR_REGISTRAR){\r\n this.showState = false;\r\n\r\n this.activatingAccount = true;\r\n\r\n this.userConfirmation().subscribe(this.userConfirmationNext.bind(this));\r\n }\r\n else if(this.onlineAppointmentStatus == OnlineAppointmentStatus.COMPLETADA) {\r\n this.authService.isLoggedInFull().pipe(takeUntil(this.ngUnsubscribe)).subscribe(this.isLoggedInFull.bind(this));\r\n }\r\n else{\r\n this.configStatusView();\r\n this.showState = true;\r\n }\r\n }\r\n\r\n private userConfirmationNext(result : boolean): void {\r\n setTimeout(() => this.activatingAccount = false, 500);\r\n\r\n if (result) {\r\n this.configStatusView();\r\n this.showState = true;\r\n }\r\n else {\r\n this.messageBusService.serviceError(new ServiceErrorMessage(\"Error confirming user\"));\r\n }\r\n }\r\n\r\n private isLoggedInFull(isLoggedIn: boolean): void {\r\n if( isLoggedIn) {\r\n this.stepIndex = this.model.items.length - 1;\r\n this.startWorkflow();\r\n }\r\n else {\r\n this.router.navigate(['welcome', 'login'], { queryParams: { returnUrl: this.router.routerState.snapshot.url } });\r\n } \r\n }\r\n\r\n private userConfirmation():Observable{\r\n return this.userService.postConfirmation(this.data.idVerificacion)\r\n .pipe(\r\n map((response)=>{\r\n return response.success;\r\n }),\r\n catchError((err) => {\r\n return of(false);\r\n })\r\n );\r\n }\r\n\r\n configStatusView(){\r\n this.statesRequestVerifyDataModel = new StatesRequestVerifyDataModel();\r\n\r\n this.statesRequestVerifyDataModel.companyLogoUrl = 'assets/images/cliniweb/logo-cliniweb-phr.svg';\r\n this.statesRequestVerifyDataModel.mainImageUrl = 'assets/images/cliniweb/Campana.gif';\r\n this.statesRequestVerifyDataModel.showActionButton = true;\r\n this.statesRequestVerifyDataModel.showHomeButton = false;\r\n\r\n switch(this.onlineAppointmentStatus){\r\n case OnlineAppointmentStatus.USUARIO_POR_REGISTRAR:\r\n this.statesRequestVerifyDataModel.buttonActionFn = this.continueWithPayment.bind(this);\r\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.continueWithPayment';\r\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.accountActivatedInCliniweb';\r\n break;\r\n case OnlineAppointmentStatus.COMPLETADA:\r\n this.statesRequestVerifyDataModel.buttonActionFn = this.gotoHome.bind(this);\r\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.buttonHomeText';\r\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.scheduledAppointment';\r\n break;\r\n case OnlineAppointmentStatus.VENCIDA:\r\n this.statesRequestVerifyDataModel.buttonActionFn = this.gotoSignup.bind(this);\r\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.gotoSignup';\r\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.expiredAppointment';\r\n this.statesRequestVerifyDataModel.textDescriptionRefI18n = 'shared.statesRequestVerify.expiredAppointmentDescription';\r\n break;\r\n }\r\n }\r\n\r\n \r\n continueWithPayment(){\r\n this.showState = false;\r\n\r\n this.startWorkflow();\r\n }\r\n\r\n gotoHome(){\r\n this.router.navigate(['/']);\r\n }\r\n\r\n gotoSignup(){\r\n this.router.navigate(['signup']);\r\n }\r\n\r\n startWorkflow(){\r\n // Set this workflow as active\r\n this.workflowService.setWorkflowTypeActive(STORAGE.ONLINE_PAYMENT_WORKFLOW_STATE);\r\n\r\n // Get state\r\n this.getState().subscribe((state:OnlinePaymentWorkflowState)=>{\r\n this.state = state;\r\n\r\n this.workflowService.setWorkflowDataState(this.state);\r\n this.init();\r\n });\r\n\r\n this.progressBarModel.closeFn = this.closeWorkflow.bind(this);\r\n }\r\n\r\n // Override base function\r\n calculateProgressBarProgress(workflowStepsCount: number, currentStepIndex: number) {\r\n // If the user is on the last step\r\n /*if (currentStepIndex == (workflowStepsCount - 1))\r\n return 96;*/\r\n \r\n if (currentStepIndex == (workflowStepsCount - 2))\r\n return 55;\r\n \r\n return (100 / workflowStepsCount) * (currentStepIndex + 1);\r\n }\r\n\r\n getState() : Observable {\r\n var state = this.workflowService.getWorkflowDataState() as OnlinePaymentWorkflowState; \r\n let bootstrapState = this.appStorageService.getItemSession(STORAGE.ONLINE_PAYMENT_WORKFLOW_BOOTSTRAP_STATE) as OnlinePaymentModel;\r\n\r\n // First alway get it from idSolicitudPorVerificar\r\n if (this.sourceModel && this.sourceModel.idVerificacion) {\r\n console.log(\"Get state from request\");\r\n return this.getStateFromRequest(this.sourceModel.idVerificacion);\r\n }\r\n // Build it from source model\r\n else if (this.sourceModel) {\r\n console.log(\"Build state from request\");\r\n return this.buildStateFromModel(this.sourceModel);\r\n }\r\n // Get it from browser storage\r\n else if (state) {\r\n console.log(\"Get state from local storage\");\r\n return of(state);\r\n } \r\n else if (bootstrapState) {\r\n console.log(\"Build state from session storage bootstrap\");\r\n this.sourceModel = bootstrapState;\r\n\r\n this.appStorageService.removeSessionItem(STORAGE.ONLINE_PAYMENT_WORKFLOW_BOOTSTRAP_STATE);\r\n\r\n return this.buildStateFromModel(this.sourceModel);\r\n }\r\n else {\r\n // This can happend if the user left the tab open with the workflow\r\n // When session expire the session variable with the workflow state will disappear\r\n // Go back to home\r\n this.router.navigate(['/']);\r\n throw \"State expired\";\r\n } \r\n }\r\n\r\n getStateFromRequest(requestId: string) : Observable {\r\n let state : OnlinePaymentWorkflowState;\r\n \r\n // If we do not get the state from localstorage first we will loose the request data from the state\r\n state = this.workflowService.getWorkflowDataState(STORAGE.ONLINE_PAYMENT_WORKFLOW_STATE);\r\n\r\n if (!state)\r\n state = new OnlinePaymentWorkflowState();\r\n\r\n return this.paymentService.getOnlinePaymentRequest(requestId)\r\n .pipe(\r\n map((request:OnlinePaymentRequest) => {\r\n state.requestModel = request;\r\n state.idVerificacion = requestId;\r\n \r\n state.setPublicProfile(request.profile);\r\n\r\n return state;\r\n }),\r\n catchError((err) => {\r\n this.baseService.handleServiceError(err, \"Error getting online payment request\");\r\n\r\n this.router.navigate(['/not-found']);\r\n\r\n return of(state);\r\n })\r\n );\r\n }\r\n\r\n buildStateFromModel(sourceModel: OnlinePaymentModel) : Observable {\r\n let state = new OnlinePaymentWorkflowState();\r\n let onlinePaymentRequest = new OnlinePaymentRequest();\r\n\r\n onlinePaymentRequest.idResponsableServicioDestino = sourceModel.idResponsableServicio;\r\n onlinePaymentRequest.nombreResponsableServicioDestino = sourceModel.nombreResponsableServicio;\r\n onlinePaymentRequest.urlAvatarResponsableServicioDestino = sourceModel.urlAvatarResponsableServicio;\r\n onlinePaymentRequest.nicknameResponsableServicioDestino = sourceModel.nickname;\r\n onlinePaymentRequest.especialidadResponsableServicioDestino = sourceModel.especialidadResponsableServicio; \r\n onlinePaymentRequest.idEmpresaDestino = sourceModel.idEmpresa;\r\n onlinePaymentRequest.checkoutUrl = this.document.location.origin + '/pagos/checkout/'; \r\n onlinePaymentRequest.localizacion = this.locale.language;\r\n onlinePaymentRequest.emailResponsableServicio = sourceModel.emailResponsableServicio; \r\n onlinePaymentRequest.idEmpresaResponsableServicio = sourceModel.idEmpresaResponsableServicio;\r\n\r\n onlinePaymentRequest.perfilPublico = sourceModel.perfilPublico;\r\n\r\n return this.baseService.getCompanyByLicense()\r\n .pipe(switchMap((company:CompanyModel)=>{\r\n onlinePaymentRequest.idEmpresaOrigen = company.id;\r\n onlinePaymentRequest.nombreEmpresaOrigen = company.name;\r\n\r\n state.requestModel = onlinePaymentRequest;\r\n state.idVerificacion = '';\r\n\r\n return of(state);\r\n }), \r\n catchError((err) => {\r\n this.baseService.handleServiceError(err, \"Error getting online appointment request\");\r\n return of(state);\r\n }));\r\n } \r\n \r\n closeWorkflow() {\r\n\r\n // Only show the message if the user is logged in\r\n if (this.state && this.state.getUserId() > 0) {\r\n\r\n let dialogData = new DialogData();\r\n dialogData.title = this.translation.translate(\"shared.paymentCancelDialog.title\");\r\n dialogData.message = this.translation.translate(\"shared.paymentCancelDialog.message\");\r\n dialogData.confirmText = this.translation.translate(\"shared.paymentCancelDialog.confirmText\"); \r\n dialogData.cancelText = this.translation.translate(\"shared.paymentCancelDialog.cancelText\");\r\n dialogData.showHeaderIcon = false;\r\n dialogData.showCancelButton = true;\r\n dialogData.loadLicense = true;\r\n\r\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\r\n data: dialogData,\r\n panelClass: 'cancel-appointment-dialog'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(accepted => {\r\n\r\n if(accepted){\r\n this._closeWorkflow();\r\n }\r\n });\r\n }\r\n else {\r\n this._closeWorkflow();\r\n } \r\n }\r\n\r\n private _closeWorkflow() {\r\n this.messageBusService.showHeader();\r\n\r\n this.workflowCleanup();\r\n\r\n if(this.routeDialogService.isOpen(RouteDialogType.PAYMENT)){\r\n this.routeDialogService.closeDialog(RouteDialogType.PAYMENT);\r\n }\r\n else{\r\n let url = this.getPublicProfileUrl(this.state.requestModel); \r\n \r\n this.router.navigate([url]);\r\n }\r\n }\r\n\r\n updateWorkflowStateData():Observable{ \r\n \r\n // If we have a created request lets update it\r\n if(this.state.idVerificacion) {\r\n return this.paymentService.updateOnlinePaymentRequest(\r\n this.state.idVerificacion,\r\n this.state.requestModel)\r\n .pipe(map((id:number)=>{\r\n this.state.requestModel.id = id;\r\n this.workflowService.setWorkflowDataState(this.state);\r\n }),\r\n catchError(err=>{\r\n this.baseService.handleServiceError(err, \"Error updating online payment request\");\r\n return of();\r\n }));\r\n }\r\n else{\r\n return of(void 0);\r\n\r\n /*return this.paymentService.createOnlinePaymentRequest(this.state.requestModel)\r\n .pipe(map((idVerificacion:string)=>{\r\n this.state.idVerificacion = idVerificacion;\r\n this.workflowService.setWorkflowDataState(this.state);\r\n\r\n this.location.go(`${this.baseService.getLanguage() + this.router.url}/${idVerificacion}`);\r\n }));*/\r\n }\r\n }\r\n\r\n completeWorkflowStateData():Observable{\r\n this.sendLoadingMessage(); \r\n\r\n // Check if we have a SolicitudPorVerificar created\r\n // In case the user was logged in for example the request will not be created at this point\r\n if (this.state.idVerificacion) {\r\n return this.confirmRequest();\r\n }\r\n else {\r\n // Create initial request\r\n return this.createInitilRequest()\r\n .pipe(switchMap(() => {\r\n\r\n // Confirm request\r\n return this.confirmRequest(); \r\n })\r\n ); \r\n }\r\n }\r\n\r\n createInitilRequest() : Observable { \r\n this.state.requestModel.tipoNotificacion = NotificacionType.ACTIVAR_CUENTA_PARA_PAGO_EN_LINEA;\r\n\r\n return this.paymentService.createOnlinePaymentRequest(this.state.requestModel)\r\n .pipe(map((idVerificacion: string) => {\r\n this.state.idVerificacion = idVerificacion;\r\n this.state.requestModel.codigoVerificacion = idVerificacion;\r\n this.workflowService.setWorkflowDataState(this.state, STORAGE.ONLINE_PAYMENT_WORKFLOW_STATE); \r\n }),\r\n catchError((err) => {\r\n console.log('There was an error creating the request');\r\n this.baseService.handleServiceError(err, \"Error creating online payment request\");\r\n return of(void 0);\r\n }) \r\n );\r\n }\r\n\r\n confirmRequest() : Observable{\r\n return this.paymentService.confirmOnlinePaymentRequest(\r\n this.state.idVerificacion, this.state.requestModel)\r\n .pipe(\r\n map((request:OnlinePaymentRequest)=>{\r\n this.state.requestModel = request;\r\n this.workflowService.setWorkflowDataState(this.state);\r\n\r\n this.sendCompletedMessage(); \r\n }),\r\n catchError((err) => {\r\n console.log('There was an error processing the request');\r\n console.log(err);\r\n\r\n this.sendErrorMessage();\r\n\r\n return of(void 0);\r\n }) \r\n );\r\n }\r\n\r\n workflowCleanup() {\r\n this.workflowService.removeWorkflowData(STORAGE.ONLINE_PAYMENT_WORKFLOW_STATE);\r\n this.appStorageService.removeSessionItem(STORAGE.ONLINE_PAYMENT_WORKFLOW_BOOTSTRAP_STATE);\r\n }\r\n\r\n clearCreditCardData() {\r\n this.state.setCreditCardNumber(\"\");\r\n this.state.setCreditCardCvc(\"\");\r\n \r\n this.workflowService.setWorkflowDataState(this.state, STORAGE.ONLINE_PAYMENT_WORKFLOW_STATE);\r\n }\r\n\r\n sendLoadingMessage() { \r\n let data = new DialogData();\r\n \r\n data.title = \"\";\r\n data.description = \"Realizando pago\";\r\n data.showHeaderIcon = false;\r\n data.loading = true;\r\n data.showCancelButton = false;\r\n data.showConfirmButton = false;\r\n data.confirmText = \"\";\r\n data.headerIconClass = \"phr-iconset-state-ok\";\r\n\r\n let dialogRef = this.dialog.open(LoadingDialogComponent, { \r\n panelClass: 'loading-dialog',\r\n data: data,\r\n disableClose: true\r\n });\r\n \r\n this.savingDialogRef = dialogRef;\r\n }\r\n\r\n sendCompletedMessage() { \r\n this.savingDialogRef.close();\r\n \r\n let data = new DialogData();\r\n \r\n data.title = \"Pago aprobado\";\r\n data.description = \"Enviamos el detalle del cargo a tu correo\";\r\n data.showHeaderIcon = true;\r\n data.loading = false;\r\n data.showCancelButton = false;\r\n data.showConfirmButton = true;\r\n data.confirmText = \"Listo\";\r\n data.headerIconClass = \"phr-iconset-ok-circle\"; \r\n\r\n let dialogRef = this.dialog.open(LoadingDialogComponent, { \r\n panelClass: 'loading-dialog',\r\n data: data,\r\n disableClose: true\r\n });\r\n \r\n dialogRef.afterClosed().subscribe(accepted => { \r\n let publicProfileIdentifier = this.state.requestModel.nicknameResponsableServicioDestino;\r\n \r\n // Clean up\r\n this.workflowCleanup(); \r\n\r\n if (this.routeDialogService.isOpen(RouteDialogType.PAYMENT))\r\n this.routeDialogService.closeDialog(RouteDialogType.PAYMENT);\r\n else \r\n this.router.navigate(['perfil/' + publicProfileIdentifier]);\r\n });\r\n }\r\n\r\n sendErrorMessage() {\r\n this.clearCreditCardData();\r\n\r\n this.savingDialogRef.close();\r\n \r\n let data = new DialogData();\r\n \r\n data.title = \"Upssss\";\r\n data.description = \"Hubo un problema al procesar el pago\";\r\n data.showHeaderIcon = true;\r\n data.loading = false;\r\n data.showCancelButton = false;\r\n data.showConfirmButton = true;\r\n data.confirmText = \"Listo\";\r\n data.headerIconClass = \"phr-iconset-error\"; \r\n\r\n let dialogRef = this.dialog.open(LoadingDialogComponent, { \r\n panelClass: 'loading-dialog',\r\n data: data,\r\n disableClose: true\r\n });\r\n \r\n dialogRef.afterClosed().subscribe(accepted => { \r\n let publicProfileIdentifier = this.state.requestModel.nicknameResponsableServicioDestino;\r\n\r\n\r\n });\r\n }\r\n}","import { Component, HostBinding, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-cola-goblo-dialogo',\n templateUrl: './cola-goblo-dialogo.component.html',\n styleUrls: ['./cola-goblo-dialogo.component.css']\n})\nexport class ColaGobloDialogoComponent implements OnInit {\n\n @HostBinding('style.width') width = '100%';\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","
\r\n \"cola-globo-dialogo\"\r\n
\r\n
","\n
\n
\n \n
\n \n
\n \n
\n
\n \n
\n
{{avatarModel.fullName}}
\n
\n
\n \n
\n \n {{ 'shared.authentication.separator' | translate:locale.language }}\n \n
\n \n
\n \n\n
\n {{ 'shared.authentication.loginText' | translate:locale.language }} \n {{ 'shared.authentication.loginLinkText' | translate:locale.language }}\n
\n
\n {{ 'shared.authentication.termsText' | translate:locale.language }} \n \n {{ 'shared.authentication.termsLink' | translate:locale.language }}\n {{ 'shared.authentication.and' | translate:locale.language }} \n {{ 'shared.authentication.privacyLink' | translate:locale.language }}\n \n
\n
\n
\n\n","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, LoginCompletedMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { RequestingUser } from '../../models/process/base-request.model';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { AuthenticationComponentData, AuthenticationDataModel } from '../../models/workflow/models/authentication-data.model';\nimport { PublicProfileAvatarComponentModel } from '../public-profile-avatar/public-profile-avatar.component';\nimport { OAuthFlowType, OAuthSourceType, TokenState } from '../../models/token.model';\nimport { WorkflowService } from 'src/app/core/services/workflow.service';\nimport { AuthOidcService } from 'src/app/core/services/auth-oidc.service';\nimport { LegalAgreementType } from '../../enums/legal-agreements-type.enum';\n\n@Component({\n selector: 'app-authentication',\n templateUrl: './authentication.component.html',\n styleUrls: ['./authentication.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('AuthenticationComponent')\nexport class AuthenticationComponent implements IControlComponent, OnInit, OnDestroy {\n data: FormComponentData;\n componentData: AuthenticationComponentData;\n \n model: AuthenticationDataModel = new AuthenticationDataModel();\n\n private ngUnsubscribe = new Subject();\n loading:boolean = false;\n loadingGoogle: boolean = false;\n requestingUser:RequestingUser;\n isCliniweb: boolean;\n avatarModel: PublicProfileAvatarComponentModel;\n\n titleTextRefence: string;\n\n unlicensed:boolean;\n\n alreadyLoggedIn: boolean;\n\n constructor(\n private router: Router,\n private baseService: BaseService,\n private authService: AuthService,\n private userService: UserService,\n private appStorageService: AppStorageService,\n private messageBusService: MessageBusService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private workflowService: WorkflowService,\n private authOidcService: AuthOidcService\n ) {\n }\n\n ngOnInit(): void {\n this.parseControlData();\n\n this.init();\n\n this.sendComponentFinishLoadingMessage();\n\n this.isCliniweb = this.baseService.isCliniwebCompany();\n\n if(this.isCliniweb){\n this.unlicensed = false;\n this.titleTextRefence = this.getTitleTextReference();\n }\n else{\n this.baseService.isLicensedCompany()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result=>{\n this.unlicensed = !result;\n\n this.titleTextRefence = this.getTitleTextReference();\n });\n }\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n redirectToSignup(): void {\n\n this.appStorageService.setItemSession(STORAGE.SIGNUP_WORKFLOW_VERIFICATION_TYPE, this.componentData.signupWorkflowVerificationType);\n this.router.navigate(\n ['signup/checkin'],\n { \n queryParams: {\n returnUrl: this.router.routerState.snapshot.url.split('?')[0],\n closeUrl: this.router.routerState.snapshot.url.split('?')[0] + '?close=true'\n }\n });\n }\n\n redirectToLogin(): void {\n this.router.navigate(['login'], { queryParams: { returnUrl: this.router.routerState.snapshot.url.split('?')[0] } });\n }\n\n loginByGoogle(){\n this.loadingGoogle = true;\n\n let oidcModel: TokenState;\n let workflowType = this.workflowService.getWorkflowTypeActive();\n\n if (workflowType) {\n oidcModel = this.workflowService.getTokenStateFromWorkflow();\n }\n else {\n oidcModel = new TokenState();\n }\n\n oidcModel.returnUrl = this.router.url;\n oidcModel.flowType = OAuthFlowType.Login;\n oidcModel.sourceType = OAuthSourceType.Google;\n\n let stringState = JSON.stringify(oidcModel);\n\n this.authOidcService.startAuthentication(stringState);\n }\n\n openTermsDialog(){\n this.baseService.openLegalAgreementsDialog(LegalAgreementType.TERMINOS_CONDICIONES);\n }\n\n openPrivacyDialog(){\n this.baseService.openLegalAgreementsDialog(LegalAgreementType.POLITICA_PRIVACIDAD);\n }\n\n onAppointmentKnowMoreClick() {\n if(this.unlicensed){\n this.baseService.openLearnMoreDialog();\n }\n }\n\n private init() {\n this.authService.isLoggedInFull().pipe(takeUntil(this.ngUnsubscribe)).subscribe({\n next: this.isLoggedInFull.bind(this),\n error: error => this.baseService.handleServiceError(error, \"Error getting user logged in\")\n });\n }\n\n private isLoggedInFull(isLoggedIn: boolean): void {\n if(isLoggedIn){\n this.alreadyLoggedIn = true;\n // If we do not use a timeout the sendComponentFinishLoadingMessage will be send at the same time the worflow is loading\n // this will make the workflow advance two steps (beacuse it gets the step completed when it is already moving to next step).\n setTimeout(() => {\n this.getUserPersonLoggedIn();\n }, 1000); \n }\n else if (this.model.idVerificacion){\n const workflowTypeActive: string = this.workflowService.getWorkflowTypeActive();\n const condicion = workflowTypeActive == STORAGE.MEDICAL_ORDER_WORKFLOW_STATE || workflowTypeActive == STORAGE.GROWTH_CURVES_WORKFLOW_STATE;\n if (this.model.idUsuario <= 0 && !condicion) {\n this.completeAuthentication();\n }\n }\n }\n\n private completeAuthentication() {\n this.loading = true;\n\n this.userService.postConfirmation(this.model.idVerificacion)\n .subscribe({next:(response) => {\n if(response.success) {\n this.getUserPersonLoggedIn();\n }\n else{\n setTimeout(() => this.loading = false, 500);\n this.baseService.handleServiceError(response.message, \"user confirmation error\");\n }\n },\n error: error => {\n this.loading = false;\n this.baseService.handleServiceError(error, \"user confirmation error\");\n }\n });\n } \n\n private parseControlData(){\n this.loading = true;\n\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as AuthenticationDataModel;\n this.componentData = this.model.configData; \n\n this.avatarModel = new PublicProfileAvatarComponentModel();\n this.avatarModel.personId = this.model.profile.id;\n this.avatarModel.avatarUrl = this.model.profile.ubicacionFoto;\n this.avatarModel.fullName = this.model.profile.nombrePersona;\n this.avatarModel.sex = this.model.profile.sexo;\n this.avatarModel.profileType = this.model.profile.tipoPerfil;\n }\n\n this.loading = false;\n }\n\n private getTitleTextReference(){\n let textReference:string = '';\n\n if(!this.componentData?.workflowType)\n return textReference;\n\n textReference = this.selectTitleTextByWorkFlowTyope();\n\n if(this.unlicensed)\n textReference += '_unlicensed';\n\n return textReference;\n }\n\n private selectTitleTextByWorkFlowTyope(): string {\n let textReference = 'shared.authentication.appointmentText';\n \n switch(this.componentData.workflowType){\n case 1:\n textReference = 'shared.authentication.appointmentText';\n break;\n case 2:\n textReference = 'shared.authentication.paymentText';\n break;\n case 3:\n textReference = 'shared.authentication.medicalOrderText';\n break;\n case 4:\n textReference = 'shared.authentication.growthChartText';\n }\n\n return textReference;\n }\n\n private sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n private onGetUserPersonLoggedIn(user:UserPerson){\n this.messageBusService.loginCompleted(new LoginCompletedMessage(user));\n\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.AUTHENTICATION;\n message.data = user;\n\n this.messageBusService.onComponentDataSetMessage(message); \n }\n\n private getUserPersonLoggedIn(){\n this.loading = true;\n this.userService.getUserPersonLoggedIn()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(user => {\n this.loading = false;\n\n if (user)\n this.onGetUserPersonLoggedIn(user);\n },\n error=>{\n this.baseService.handleServiceError(error, \"Error creating online payment request\");\n });\n }\n}\n\n","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { AppointmentInfoDataModel } from 'src/app/shared/models/workflow/models/appointment-info-data.model';\n\n@Component({\n selector: 'app-appointment-info-dialog',\n templateUrl: './appointment-info-dialog.component.html',\n styleUrls: ['./appointment-info-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class AppointmentInfoDialogComponent implements OnInit {\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: AppointmentInfoDataModel,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnInit(): void {\n }\n\n onClose(){\n this.dialogRef.close();\n }\n}\n","
\n
\n

{{ 'shared.appointmentInfoDialog.title' | translate:locale.language }}

\n \n
\n
\n \n
\n
","\n
\n \n \n
\n \n {{model.user.firstname}}, \n {{ 'shared.selectPatientAppointmentCheckout.title' | translate:locale.language }}\n {{ 'shared.selectPatientAppointmentCheckout.title2' | translate:locale.language }}\n \n\n
\n\n \n
\n \n \n {{'shared.selectPatientAppointmentCheckout.radioOption1' | translate:locale.language}}\n \n \n \n {{'shared.selectPatientAppointmentCheckout.radioOption2' | translate:locale.language}}\n \n \n
\n {{'shared.selectPatientAppointmentCheckout.selectRadioValidation' | translate:locale.language}}\n
\n
\n\n \n
\n \n \n \n {{ model.user.firstname }}\n {{'shared.selectPatientAppointmentCheckout.userRelationship' | translate:locale.language}}\n \n \n \n {{dependent.nombre}}\n {{getRelationshipText(dependent)}}\n \n \n \n {{'shared.selectPatientAppointmentCheckout.otherText' | translate:locale.language}}\n {{'shared.selectPatientAppointmentCheckout.otherDescription' | translate:locale.language}}\n \n \n
\n\n \n
\n
\n {{ model.appointmentInfo.appointmentDate | date:'d MMM, h:mm a': 'UTC': language }}\n ā€¢ \n {{ model.appointmentInfo.attentionPlaceName }}\n \n
\n \n
\n\n \n
\n
\n
","import { Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { PersonDataModel, SelectPatientDataModel } from '../../models/workflow/models/select-patient-data.model';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { Dependent } from '../../models/people/dependent.model';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { SenderPatientRelationship } from '../../models/process/base-request.model';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AppointmentInfoDialogComponent } from '../dialogs/appointment-info-dialog/appointment-info-dialog.component';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'app-select-patient-appointment-checkout',\n templateUrl: './select-patient-appointment-checkout.component.html',\n styleUrls: ['./select-patient-appointment-checkout.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('SelectPatientAppointmentCheckoutComponent')\nexport class SelectPatientAppointmentCheckoutComponent implements IControlComponent, OnInit, OnDestroy {\n data: FormComponentData;\n language: string;\n\n model: SelectPatientDataModel = new SelectPatientDataModel();\n showAppointmentInfo: boolean;\n patientRelationshipTypeForm:FormGroup;\n showForm:boolean = false;\n showInitialView:boolean = false;\n loading: boolean = false; \n dependents: Dependent[] = [];\n private ngUnsubscribe = new Subject();\n formSubmitted: boolean = false;\n\n constructor(\n private baseService: BaseService,\n private dialog: MatDialog,\n private formBuilder: FormBuilder,\n private messageBusService: MessageBusService,\n private userService: UserService,\n private utilsService: UtilsService,\n private translation: L10nTranslationService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.language = locale.dateLanguage ?? 'es-AR';\n }\n \n ngOnInit(): void {\n this.loadDataModel();\n\n this.userService.getUserDependents()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((dependents:Dependent[]) =>{\n this.dependents = dependents;\n\n // Order by age desc\n this.dependents = this.dependents.sort((d1: Dependent, d2: Dependent) => {\n let getTime = (date: Date) => {return date != null ? new Date(date).getTime() : 0;};\n \n return getTime(d1.fechaNacimiento) - getTime(d2.fechaNacimiento);\n });\n\n // let exampleDependent = new Dependent();\n // exampleDependent.id = 5871197;\n // exampleDependent.nombre = 'test';\n // exampleDependent.apellido = 'local';\n // exampleDependent.sexo = 'M';\n // exampleDependent.fechaNacimiento = new Date();\n // exampleDependent.tipoRelacion = 295;\n\n // this.dependents = [exampleDependent];\n\n this.showInitialView = this.dependents.length == 0;\n\n this.loadForm();\n\n this.sendComponentFinishLoadingMessage(); \n },\n error=>{\n this.baseService.handleServiceError(error, \"Error getting user dependents\");\n }\n );\n\n if(isPlatformBrowser(this.platformId)){\n this.showAppointmentInfo = window.innerWidth > 799;\n } \n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n loadForm(){\n let _relationshipStringValue;\n\n if(this.showInitialView){\n _relationshipStringValue = this.model.relationship > 0 \n ? this.model.relationship.toString() \n : '';\n }\n else{\n _relationshipStringValue = this.model.patientSelected\n ? this.model.patientSelected.id > 0\n ? this.model.patientSelected.id.toString()\n : '2'\n : this.model.user.id.toString();\n\n this.model.relationship = +_relationshipStringValue;\n }\n\n this.patientRelationshipTypeForm = this.formBuilder.group(\n {\n relationship: [_relationshipStringValue, [Validators.required]]\n }\n );\n\n this.showForm = true;\n }\n\n sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n getControl(controlName: string) {\n return this.patientRelationshipTypeForm.controls[controlName];\n }\n\n isControlInvalid(controlName: string) {\n let control = this.getControl(controlName);\n\n // First check if the form is submitted or control is dirty\n if (!this.formSubmitted && !control.touched)\n return false;\n\n return control.invalid;\n }\n\n onClickContinue(){\n this.formSubmitted = true;\n \n if (this.patientRelationshipTypeForm.invalid) {\n return;\n }\n\n this.loading = true;\n\n let _valueSelected = +(this.patientRelationshipTypeForm.controls.relationship.value);\n\n if(this.showInitialView){\n this.model.patientSelected = new PersonDataModel();\n this.model.relationship = _valueSelected;\n\n this.userService.getUserPersonLoggedInFromService()\n .subscribe(u => {\n // updates necessary fields.\n if (u?.nombre)\n this.model.user.firstname = u.nombre;\n\n if (u?.apellido)\n this.model.user.lastname = u.apellido;\n\n if (u?.fechaNacimiento)\n this.model.user.birthDate = u.fechaNacimiento;\n\n if (u?.sexo)\n this.model.user.gender = u.sexo;\n\n this.continueFlow();\n },\n error=>{\n this.baseService.handleServiceError(error, \"Error getting user logged in\");\n });\n }\n else {\n let _dependentSelected = this.dependents.find(d=> d.idPersona == _valueSelected);\n\n // a dependent has been selected\n if(_dependentSelected){ \n this.model.patientSelected = new PersonDataModel();\n\n this.model.patientSelected.id = _dependentSelected.idPersona;\n this.model.patientSelected.firstname = _dependentSelected.nombre;\n this.model.patientSelected.lastname = _dependentSelected.apellido;\n this.model.patientSelected.avatar = _dependentSelected.ubicacionLogo;\n this.model.patientSelected.birthDate = _dependentSelected.fechaNacimiento;\n this.model.patientSelected.gender = _dependentSelected.sexo;\n this.model.patientSelected.email = _dependentSelected.emailParticular;\n this.model.patientSelected.cellPhone = _dependentSelected.numeroTelCelular;\n\n this.model.relationship = _dependentSelected.tipoRelacion;\n this.continueFlow();\n\n } else if (this.model.user.id == _valueSelected) {\n // the user has been selected\n this.userService.getUserPersonLoggedInFromService()\n .subscribe(u => {\n // updates necessary fields.\n if (u?.nombre)\n this.model.user.firstname = u.nombre;\n\n if (u?.apellido)\n this.model.user.lastname = u.apellido;\n\n if (u?.fechaNacimiento)\n this.model.user.birthDate = u.fechaNacimiento;\n\n if (u?.sexo)\n this.model.user.gender = u.sexo;\n \n this.model.patientSelected = this.model.user;\n this.model.relationship = SenderPatientRelationship.USUARIO;\n this.continueFlow();\n },\n error=>{\n this.baseService.handleServiceError(error, \"Error getting user logged in\");\n }); \n }\n // someone else has been selected\n else {\n this.model.patientSelected = new PersonDataModel();\n\n this.model.relationship = _valueSelected;\n this.continueFlow();\n }\n }\n\n \n }\n\n continueFlow() {\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.SELECT_PATIENT;\n\n message.data = this.model;\n\n this.messageBusService.onComponentDataSetMessage(message); \n }\n\n buttonDisabled():boolean{\n return this.patientRelationshipTypeForm.invalid;\n }\n\n getUserAvatar(user: PersonDataModel){ \n return user.avatar\n ? user.avatar\n : this.utilsService.getPersonDefaultAvatarUrl(user.birthDate, user.gender);\n }\n\n getDependentAvatar(dependent: Dependent){\n return dependent.ubicacionLogo\n ? dependent.ubicacionLogo\n : this.utilsService.getPersonDefaultAvatarUrl(dependent.fechaNacimiento, dependent.sexo);\n }\n\n getRelationshipText(dependent: Dependent){\n return this.translation.translate(`shared.selectPatientAppointmentCheckout.relationship_${dependent.tipoRelacion}_${dependent.sexo}`);\n }\n\n openAppointmentInfoDialog(){\n this.dialog.open(AppointmentInfoDialogComponent, { \n panelClass: ['appointment-info-dialog', 'appointment-info-animation-in'],\n data: this.model.appointmentInfo\n });\n }\n\n private loadDataModel() {\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as SelectPatientDataModel; \n } \n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n if(isPlatformBrowser(this.platformId)){\n this.showAppointmentInfo = event.target.innerWidth > 799;\n }\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\n/**\r\n * Valida que el valor del control no tenga espacios en blanco al inicio ni al final.\r\n * \r\n * Valida que contenga letras acentuadas tanto en mayusculas como minĆŗsculas\r\n * \r\n * MCWNG-6194: Permite que exista hasta un espacio en blanco al inicio y/o al final.\r\n * @param allowSpaces Si es false, no permite ninguna espacio en blanco al inicio ni al final. Default: false\r\n * @returns ValidatorFn\r\n */\r\nexport function ValidatePersonName(allowSpaces = false): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n let regex = /^[A-Za-zĆĆ‰ĆĆ“ĆšĆ‘Ć”Ć©Ć­Ć³ĆŗƱ0-9']+(?: [A-Za-zĆĆ‰ĆĆ“ĆšĆ‘Ć”Ć©Ć­Ć³ĆŗƱ0-9']+)*$/;\r\n if (allowSpaces) regex = /^( ?)[A-Za-zĆĆ‰ĆĆ“ĆšĆ‘Ć”Ć©Ć­Ć³ĆŗƱ0-9']+(?: [A-Za-zĆĆ‰ĆĆ“ĆšĆ‘Ć”Ć©Ć­Ć³ĆŗƱ0-9']+)*( ?)$/;\r\n const validacion: boolean = regex.test(control.value);\r\n return validacion ? null : { whitespace: true };\r\n }\r\n}\r\n","import { AbstractControl } from '@angular/forms';\r\nimport CommonTypesHelper from '../helpers/common-types-helper';\r\n\r\nexport function ValidateGender(control: AbstractControl) {\r\n const validacion: boolean = CommonTypesHelper.stringHasValue(control.value);\r\n return validacion ? null : { whitespace: true };\r\n}","
\n \n \n
\n {{ 'shared.patientFormAppointmentCheckout.title' + model.relationship | translate:locale.language }}\n \n \n
\n
\n \n {{ 'formfield.firstname' | translate:locale.language }}\n \n \n {{'validation.firstnameRequired' | translate:locale.language}}\n \n \n \n {{ 'formfield.lastname' | translate:locale.language }}\n \n \n {{'validation.lastnameRequired' | translate:locale.language}}\n \n \n \n
\n {{ 'formfield.gender' | translate:locale.language }}\n \n \n \n {{'formfield.gender1' | translate:locale.language}}\n \n \n \n {{'formfield.gender2' | translate:locale.language}}\n \n \n \n {{'validation.genderRequired' | translate:locale.language}}\n \n
\n
\n\n \n
\n
\n {{ model.appointmentInfo.appointmentDate | date:'d MMM, h:mm a': 'UTC': language }}\n ā€¢ \n {{ model.appointmentInfo.attentionPlaceName }}\n \n
\n \n
\n
\n
\n
","import { Component, HostListener, Inject, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { PatientFormAppointmentDataModel } from '../../models/workflow/models/patient-form-appointment-data.model';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { ValidatePersonName } from '../../validators/person-name.validator';\nimport { StateType } from '../../enums/state-type.enum';\nimport CommonTypesHelper from '../../helpers/common-types-helper';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AppointmentInfoDialogComponent } from '../dialogs/appointment-info-dialog/appointment-info-dialog.component';\nimport { ValidateGender } from '../../validators/gender.validator';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'app-patient-form-appointment-checkout',\n templateUrl: './patient-form-appointment-checkout.component.html',\n styleUrls: ['./patient-form-appointment-checkout.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('PatientFormAppointmentCheckoutComponent')\nexport class PatientFormAppointmentCheckoutComponent implements IControlComponent, OnInit {\n data: FormComponentData;\n model: PatientFormAppointmentDataModel = new PatientFormAppointmentDataModel();\n\n language: string;\n patientForm: FormGroup;\n showAppointmentInfo: boolean;\n state: any;\n\n minDate: Date;\n maxDate: Date;\n\n formSubmitted: boolean = false;\n loading: boolean = false;\n\n isBrowser: boolean;\n\n constructor(\n private dialog: MatDialog,\n private formBuilder: FormBuilder,\n private messageBusService: MessageBusService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.language = locale.dateLanguage ?? 'es-AR';\n this.isBrowser = isPlatformBrowser(this.platformId);\n\n const currentYear = new Date().getFullYear();\n this.minDate = new Date(currentYear - 120, 0, 1);\n this.maxDate = new Date();\n\n this.patientForm = this.formBuilder.group(\n {\n firstname: [this.model.firstname, [Validators.required, ValidatePersonName(true)]],\n lastname: [this.model.lastname, [Validators.required, ValidatePersonName(true)]],\n birthdate: [this.model.birthdate, [Validators.required]],\n gender: [this.model.gender, [Validators.required, ValidateGender]]\n }\n );\n }\n \n ngOnInit(): void {\n this.loadDataModel();\n this.loadForm();\n this.sendComponentFinishLoadingMessage();\n\n this.showAppointmentInfo = this.isBrowser && window.innerWidth > 799;\n }\n\n loadForm(){\n if (this.model.identityPersonValidationStateId == StateType.SinValidar) {\n this.patientForm.get('firstname')?.setValue(undefined);\n this.patientForm.get('lastname')?.setValue(undefined);\n this.patientForm.get('birthdate')?.setValue(undefined);\n this.patientForm.get('gender')?.setValue(undefined);\n } else {\n this.patientForm.get('firstname')?.setValue(this.model.firstname);\n this.patientForm.get('lastname')?.setValue(this.model.lastname);\n this.patientForm.get('birthdate')?.setValue(this.model.birthdate);\n this.patientForm.get('gender')?.setValue(this.model.gender);\n }\n }\n\n sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event);\n }\n\n onClickContinue(){\n this.patientForm.markAllAsTouched();\n this.formSubmitted = true;\n\n // stop here if form is invalid\n if (this.patientForm.invalid) {\n return;\n }\n\n this.loading = true;\n\n this.updateModel();\n\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.PATIENT_FORM_APPOINTMENT;\n message.data = this.model;\n\n this.messageBusService.onComponentDataSetMessage(message); \n }\n\n updateModel(){\n this.model.firstname = this.patientForm.controls.firstname.value.trim();\n this.model.lastname = this.patientForm.controls.lastname.value.trim();\n this.model.birthdate = this.patientForm.controls.birthdate.value;\n this.model.gender = this.patientForm.controls.gender.value;\n\n if (this.model.firstname && this.model.lastname) {\n this.model.identityPersonValidationStateId = StateType.NombreYApellidoValidados;\n\n if (CommonTypesHelper.dateHasValue(this.model.birthdate) && CommonTypesHelper.stringHasValue(this.model.gender)) {\n this.model.identityPersonValidationStateId = StateType.NombreApellidoSexoFechaNacimientoValidados;\n }\n }\n }\n\n getControl(controlName: string) {\n return this.patientForm.controls[controlName];\n }\n \n isControlInvalid(controlName: string) {\n let control = this.getControl(controlName);\n\n // First check if the form is submitted or control is dirty\n if (!this.formSubmitted && !control.touched)\n return false;\n\n return control.invalid;\n }\n\n getBirthdateControl():FormControl | null{\n return this.patientForm.get('birthdate') \n ? this.patientForm.get('birthdate') as FormControl \n : null;\n }\n\n openAppointmentInfoDialog(){\n this.dialog.open(AppointmentInfoDialogComponent, { \n panelClass: ['appointment-info-dialog', 'appointment-info-animation-in'],\n data: this.model.appointmentInfo\n });\n }\n\n private loadDataModel() {\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as PatientFormAppointmentDataModel; \n } \n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.showAppointmentInfo = event.target.innerWidth > 799;\n }\n}","
\n \n \n
\n {{ 'shared.selectPatientRelationshipAppointmentCheckout.title' | translate:locale.language: { name: model.patientName } }}\n\n
\n
\n \n {{ 'shared.selectPatientRelationshipAppointmentCheckout.defaultOption' | translate:locale.language }} \n \n \n {{ 'shared.selectPatientRelationshipAppointmentCheckout.option1' | translate:locale.language }}\n {{ 'shared.selectPatientRelationshipAppointmentCheckout.option2' | translate:locale.language }}\n {{ 'shared.selectPatientRelationshipAppointmentCheckout.option3' | translate:locale.language }}\n\n {{ 'shared.selectPatientRelationshipAppointmentCheckout.option4' | translate:locale.language }}\n {{ 'shared.selectPatientRelationshipAppointmentCheckout.option5' | translate:locale.language }}\n {{ 'shared.selectPatientRelationshipAppointmentCheckout.option6' | translate:locale.language }}\n {{ 'shared.selectPatientRelationshipAppointmentCheckout.option7' | translate:locale.language }}\n \n \n {{ 'shared.selectPatientRelationshipAppointmentCheckout.text1' | translate:locale.language }}\n \n \n
\n
\n
\n {{ model.appointmentInfo.appointmentDate | date:'d MMM, h:mm a': 'UTC': language }}\n ā€¢ \n {{ model.appointmentInfo.attentionPlaceName }}\n \n
\n \n
\n
\n
\n
\n","import { Component, HostListener, Inject, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { SenderPatientRelationship } from '../../models/process/base-request.model';\nimport { SelectPatientRelationshipDataModel } from '../../models/workflow/models/select-patient-relationship-data.model';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AppointmentInfoDialogComponent } from '../dialogs/appointment-info-dialog/appointment-info-dialog.component';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Component({\n selector: 'app-select-patient-relationship-appointment-checkout',\n templateUrl: './select-patient-relationship-appointment-checkout.component.html',\n styleUrls: ['./select-patient-relationship-appointment-checkout.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('SelectPatientRelationshipAppointmentCheckoutComponent')\nexport class SelectPatientRelationshipAppointmentCheckoutComponent implements IControlComponent,OnInit {\n data: FormComponentData;\n\n model:SelectPatientRelationshipDataModel = new SelectPatientRelationshipDataModel();\n\n language: string;\n patientRelationshipForm: FormGroup;\n showAppointmentInfo: boolean;\n\n loading: boolean = false;\n formSubmitted: boolean = false;\n\n constructor(\n private dialog: MatDialog,\n private formBuilder: FormBuilder,\n private messageBusService: MessageBusService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.language = locale.dateLanguage ?? 'es-AR';\n }\n \n ngOnInit(): void {\n this.loadDataModel();\n \n this.loadForm();\n\n this.sendComponentFinishLoadingMessage();\n \n if(isPlatformBrowser(this.platformId)){\n this.showAppointmentInfo = window.innerWidth > 799;\n } \n }\n\n getControl(controlName: string) {\n return this.patientRelationshipForm.controls[controlName];\n }\n \n isControlInvalid(controlName: string) {\n let control = this.getControl(controlName);\n\n // First check if the form is submitted or control is dirty\n if (!this.formSubmitted && !control.touched)\n return false;\n\n return control.invalid;\n }\n \n loadForm(){\n this.patientRelationshipForm = this.formBuilder.group(\n {\n patientRelationship: ['', [Validators.required]]\n }\n );\n\n if (this.model.patientRelationship && this.model.patientRelationship != 9)\n this.patientRelationshipForm.controls.patientRelationship.setValue(this.model.patientRelationship.toString());\n }\n\n sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n onClickContinue(){\n\n this.formSubmitted = true;\n\n if (this.patientRelationshipForm.invalid || this.patientRelationshipForm.controls.patientRelationship.value == SenderPatientRelationship.DESCONOCIDO) {\n return;\n }\n\n this.loading = true;\n\n this.model.patientRelationship = +(this.patientRelationshipForm.controls.patientRelationship.value);\n\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.SELECT_PATIENT_RELATIONSHIP_APPOINTMENT;\n message.data = this.model;\n\n this.messageBusService.onComponentDataSetMessage(message); \n }\n\n openAppointmentInfoDialog(){\n this.dialog.open(AppointmentInfoDialogComponent, { \n panelClass: ['appointment-info-dialog', 'appointment-info-animation-in'],\n data: this.model.appointmentInfo\n });\n }\n\n buttonDisabled():boolean{\n return this.patientRelationshipForm.controls.patientRelationship.value == SenderPatientRelationship.DESCONOCIDO;\n }\n\n private loadDataModel() {\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as SelectPatientRelationshipDataModel; \n } \n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n if(isPlatformBrowser(this.platformId)){\n this.showAppointmentInfo = event.target.innerWidth > 799;\n } \n }\n}","import { isPlatformBrowser } from '@angular/common';\nimport { Inject, Injectable, NgZone, PLATFORM_ID } from '@angular/core';\nimport { fromEvent, merge, Observable, of } from 'rxjs';\nimport { map, startWith, distinctUntilChanged } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class KeyboardService {\n private visualViewportSizeChangedSubject = new Observable();\n private keyboardOpenSubject = new Observable();\n\n constructor(\n private zone: NgZone,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n\n if(isPlatformBrowser(this.platformId)){\n this.initKeyboardDetection();\n }\n }\n\n private initKeyboardDetection() {\n this.zone.runOutsideAngular(() => {\n\n this.visualViewportSizeChangedSubject = window.visualViewport \n ? fromEvent(window.visualViewport, 'resize').pipe(\n map(() => this.isKeyboardOpen()),\n startWith(this.isKeyboardOpen()),\n distinctUntilChanged()\n )\n : of(false);\n \n const focus$ = fromEvent(window, 'focusin').pipe(map(this.isKeyboardOpen.bind(this)));\n const blur$ = fromEvent(window, 'focusout').pipe(\n map(() => this.isKeyboardClosed()),\n startWith(this.isKeyboardOpen()),\n distinctUntilChanged()\n );\n\n this.keyboardOpenSubject = merge(this.visualViewportSizeChangedSubject, focus$, blur$);\n });\n }\n\n private isKeyboardOpen(): boolean {\n const visualViewport = window.visualViewport;\n return visualViewport != null && visualViewport.height < window.innerHeight;\n }\n\n private isKeyboardClosed(): boolean {\n const visualViewport = window.visualViewport;\n return visualViewport != null && visualViewport.height === window.innerHeight;\n }\n\n getVisualViewportSizeChangedObservable(): Observable {\n return this.visualViewportSizeChangedSubject;\n }\n\n getKeyboardOpenObservable(): Observable {\n return this.keyboardOpenSubject;\n }\n}","
\n \n \n
\n \n \n {{ 'shared.patientContactFormAppointmentCheckout.title1' | translate:locale.language }}\n \n \n {{ 'shared.patientContactFormAppointmentCheckout.title2' | translate:locale.language: { name: model.patientName } }}\n \n \n
\n
\n \n \n {{'shared.patientContactFormAppointmentCheckout.radioOption1' | translate:locale.language}}\n \n \n \n
\n \n {{ 'shared.patientContactFormAppointmentCheckout.phoneText' | translate:locale.language }}\n \n \n \n {{ 'shared.patientContactFormAppointmentCheckout.fieldRequiredText' | translate:locale.language }}\n \n \n {{ 'shared.patientContactFormAppointmentCheckout.invalidFormat' | translate:locale.language }}\n \n \n
\n \n \n {{'shared.patientContactFormAppointmentCheckout.radioOption2' | translate:locale.language: { name: model.patientName } }}\n \n \n \n
\n \n {{ 'shared.patientContactFormAppointmentCheckout.phoneText' | translate:locale.language }}\n \n \n \n {{ 'shared.patientContactFormAppointmentCheckout.fieldRequiredText' | translate:locale.language }}\n \n \n {{ 'shared.patientContactFormAppointmentCheckout.invalidFormat' | translate:locale.language }}\n \n \n \n {{ 'shared.patientContactFormAppointmentCheckout.emailText' | translate:locale.language }}\n \n \n {{ 'shared.patientContactFormAppointmentCheckout.fieldRequiredText' | translate:locale.language }}\n \n \n {{ 'shared.patientContactFormAppointmentCheckout.invalidFormat' | translate:locale.language }}\n \n \n
\n
\n
\n
\n
\n {{ model.appointmentInfo.appointmentDate | date:'d MMM, h:mm a': 'UTC': language }}\n ā€¢ \n {{ model.appointmentInfo.attentionPlaceName }}\n \n
\n
\n Cita para {{model.patientName}} ({{getRelationship() | translate:locale.language}})\n
\n \n
\n
\n
\n
\n","import { AfterViewInit, Component, ElementRef, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { SenderPatientRelationship } from '../../models/process/base-request.model';\nimport { PatientContactFormDataModel } from '../../models/workflow/models/patient-contact-form-data.model';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AppointmentInfoDialogComponent } from '../dialogs/appointment-info-dialog/appointment-info-dialog.component';\nimport { CustomEmailValidator } from '../../validators/custom-email.validator';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { KeyboardService } from 'src/app/core/services/keyboard.service';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n\n@Component({\n selector: 'app-patient-contact-form-appointment-checkout',\n templateUrl: './patient-contact-form-appointment-checkout.component.html',\n styleUrls: ['./patient-contact-form-appointment-checkout.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('PatientContactFormAppointmentCheckoutComponent')\nexport class PatientContactFormAppointmentCheckoutComponent implements IControlComponent, OnInit, AfterViewInit, OnDestroy {\n data: FormComponentData;\n model: PatientContactFormDataModel = new PatientContactFormDataModel();\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n language: string;\n patientContactForm: FormGroup;\n showAppointmentInfo: boolean;\n userPatientMode: boolean;\n formSubmitted: boolean = false;\n loading: boolean = false;\n\n @ViewChild('userPhone', { read: ElementRef }) userPhone: ElementRef;\n @ViewChild('patientPhone', { read: ElementRef }) patientPhone: ElementRef;\n\n isBrowser: boolean;\n \n constructor(\n private dialog: MatDialog,\n private formBuilder: FormBuilder,\n private messageBusService: MessageBusService,\n private userService: UserService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(DOCUMENT) public document: Document,\n private renderer: Renderer2,\n private keyboardService: KeyboardService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.language = locale.dateLanguage ?? 'es-AR';\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n \n ngOnInit(): void {\n this.loadDataModel();\n \n this.loadForm();\n\n this.sendComponentFinishLoadingMessage();\n \n this.showAppointmentInfo = this.isBrowser ? window.innerWidth > 799 : true;\n\n this.userPatientMode = this.model.patientRelationship == SenderPatientRelationship.USUARIO;\n\n this.keyboardService.getKeyboardOpenObservable()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(isOpen=>{\n\n if(this.userPatientMode){\n this.onChangeHeightContainer();\n } \n });\n }\n\n ngOnDestroy():void{\n if(this.isBrowser && window.innerWidth < 800){\n console.log('onChangeHeightContainer executed !');\n let container = this.document.getElementsByClassName('online-appointment-container');\n\n if(container.length > 0 && window.visualViewport){\n\n this.renderer.setStyle(container[0], 'height', `100dvh`);\n }\n }\n\n\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n ngAfterViewInit(){\n // if(this.userPatientMode){\n // const userTelInputElement: HTMLInputElement = this.userPhone.nativeElement;\n // const userInputElement = userTelInputElement.getElementsByTagName('input')[0];\n \n // userInputElement.addEventListener('focus', this.onChangeHeightContainer.bind(this));\n // userInputElement.addEventListener('blur', this.onChangeHeightContainer.bind(this));\n // }\n }\n\n loadForm(){\n\n this.model.contactType = this.model.contactType == 0 ? 1 : this.model.contactType;\n\n this.patientContactForm = this.formBuilder.group(\n {\n contactRadio:[ this.model.contactType.toString() ],\n userPhone: [this.model.userPhone, [this.requiredIfValidator(()=> this.patientContactForm.get('contactRadio')?.value == '1')]], \n patientPhone: [this.model.patientPhone, [this.requiredIfValidator(()=> this.patientContactForm.get('contactRadio')?.value == '2')]],\n patientEmail: [this.model.patientEmail, [\n this.requiredIfValidator(()=> this.patientContactForm.get('contactRadio')?.value == '2'),\n CustomEmailValidator\n ]],\n }\n );\n\n this.patientContactForm.get('contactRadio')?.valueChanges\n .subscribe(value => {\n this.patientContactForm.get('userPhone')?.updateValueAndValidity();\n this.patientContactForm.get('patientPhone')?.updateValueAndValidity();\n this.patientContactForm.get('patientEmail')?.updateValueAndValidity();\n }); \n }\n\n sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.showAppointmentInfo = event.target.innerWidth > 799;\n }\n \n onChangeHeightContainer(){\n setTimeout(() => {\n if(this.isBrowser && window.innerWidth < 800){\n console.log('onChangeHeightContainer executed !');\n let container = this.document.getElementsByClassName('online-appointment-container');\n\n if(container.length > 0 && window.visualViewport){\n\n this.renderer.setStyle(container[0], 'height', `${window.visualViewport.height}px`);\n }\n }\n }, 100);\n }\n\n onClickFinish(){\n // stop here if form is invalid\n if (this.patientContactForm.invalid) {\n return;\n }\n\n this.loading = true;\n\n this.updateModel();\n\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.PATIENT_CONTACT_FORM;\n message.data = this.model;\n\n this.messageBusService.onComponentDataSetMessage(message); \n }\n\n buttonDisabled():boolean{\n return this.patientContactForm.invalid;\n }\n\n getControl(controlName: string) {\n return this.patientContactForm.controls[controlName];\n }\n\n isControlInvalid(controlName: string) {\n let control = this.getControl(controlName);\n\n if(this.formSubmitted || control.touched)\n return control.invalid;\n\n return false;\n }\n\n controlHasError(controlName: string, errorName: string) {\n return this.getControl(controlName).hasError(errorName);\n }\n\n getControlValue(controlName: string) {\n return this.getControl(controlName).value;\n }\n\n updateModel(){ \n this.model.contactType = +(this.patientContactForm.controls.contactRadio.value);\n\n if(this.model.contactType == 1) {\n this.model.userPhone = this.patientContactForm.controls.userPhone.value;\n }\n else {\n this.model.patientPhone = this.patientContactForm.controls.patientPhone.value;\n this.model.patientEmail = this.patientContactForm.controls.patientEmail.value;\n }\n\n // refresh user in cache\n this.userService.getUserPersonLoggedInFromService();\n }\n\n getRelationship(): string {\n const condicion = this.model.patientRelationship === SenderPatientRelationship.USUARIO;\n const condicionSexoPaciente = this.model.appointmentInfo.patientGender == `${SenderPatientRelationship.DESCONOCIDO}`;\n const me = 'shared.selectPatientAppointmentCheckout.userRelationship';\n const relantionship = 'shared.appointmentInfoCheckout.relationship_';\n const patientGender = condicionSexoPaciente ? 'M' : this.model.appointmentInfo.patientGender;\n return condicion ? me : `${relantionship}${this.model.patientRelationship}_${patientGender}`;\n }\n\n openAppointmentInfoDialog(){\n this.dialog.open(AppointmentInfoDialogComponent, { \n panelClass: ['appointment-info-dialog', 'appointment-info-animation-in'],\n data: this.model.appointmentInfo\n });\n }\n\n private requiredIfValidator(predicate: any) {\n return ((formControl:AbstractControl) => {\n if (!formControl.parent) {\n return null;\n }\n if (predicate()) {\n return Validators.required(formControl); \n }\n return null;\n })\n }\n\n private loadDataModel() {\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as PatientContactFormDataModel; \n } \n }\n}\n","
\n \n \n {{'shared.publicProfileHeader.linkText' | translate:locale.language}}\n \n \n \n\n \n
\n
\n \n
\n {{publicProfileMenuModel.profile.nombrePersona}}\n \n \n \n \n
\n
","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { RouteDialogHeaderModel } from '../../../dialogs/route-dialog/route-dialog.component';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { Router } from '@angular/router';\nimport { HeaderComponentPublicProfileMenuModel } from '../../header/header.component';\nimport { MessageBusService, PublicProfileActionMessage } from 'src/app/core/services/message-bus.service';\nimport { takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'app-public-profile-header',\n templateUrl: './public-profile-header.component.html',\n styleUrls: ['./public-profile-header.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('PublicProfileHeaderComponent')\nexport class PublicProfileHeaderComponent implements OnInit, IControlComponent, OnDestroy {\n data: RouteDialogHeaderModel;\n urlPublicProfile: string;\n publicProfileMenuModel: HeaderComponentPublicProfileMenuModel;\n private ngUnsubscribe = new Subject();\n \n constructor(\n private router: Router,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private messageBusService: MessageBusService) { }\n\n ngOnInit(): void {\n this.urlPublicProfile = this.data.dialogModel.route;\n\n this.messageBusService.onPublicProfileHeaderVisibilityChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((message)=> {\n if (!message.fromRouteDialog)\n return;\n\n this.publicProfileMenuModel = new HeaderComponentPublicProfileMenuModel();\n this.publicProfileMenuModel.headerVisible = message.headerVisible;\n this.publicProfileMenuModel.profile = message.profile;\n this.publicProfileMenuModel.avatarModel = message.publicProfileAvatarComponentModel;\n this.publicProfileMenuModel.avatarModel.useAvatarPadding = message.headerVisible;\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n onCloseClick(){\n this.data.closeFn();\n }\n\n gotoPayment() {\n this.messageBusService.sendPublicProfileAction(new PublicProfileActionMessage(true, false));\n }\n\n onAppointmentBtnClick() {\n this.messageBusService.sendPublicProfileAction(new PublicProfileActionMessage(false, true));\n }\n}\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { RouteDialogHeaderModel } from '../../../dialogs/route-dialog/route-dialog.component';\n\n@Component({\n selector: 'app-default-header',\n templateUrl: './default-header.component.html',\n styleUrls: ['./default-header.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('DefaultHeaderComponent')\nexport class DefaultHeaderComponent implements OnInit, IControlComponent {\n\n constructor() { }\n data: RouteDialogHeaderModel;\n\n ngOnInit(): void {}\n\n onCloseClick(){\n this.data.closeFn();\n }\n\n}\n","
\n \n
","import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { RouteDialogHeaderModel } from '../../../dialogs/route-dialog/route-dialog.component';\r\nimport { MessageBusService, NavigationBackMessage } from 'src/app/core/services/message-bus.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-default-back-header',\r\n templateUrl: './default-back-header.component.html',\r\n styleUrls: ['./default-back-header.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('DefaultBackHeaderComponent')\r\nexport class DefaultBackHeaderComponent implements OnInit, IControlComponent, OnDestroy {\r\n\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private messageBusService: MessageBusService \r\n ) { }\r\n data: RouteDialogHeaderModel;\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n onBackClick(){\r\n let dialogType = this.data.dialogModel.id;\r\n\r\n this.messageBusService.navigateBack(new NavigationBackMessage(dialogType));\r\n } \r\n}","
\r\n \r\n \r\n \r\n
","import { Component, Inject, OnDestroy, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { RouteDialogHeaderModel } from '../../../dialogs/route-dialog/route-dialog.component';\r\nimport { MessageBusService, NavigationBackMessage } from 'src/app/core/services/message-bus.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-default-back-with-link-header',\r\n templateUrl: './default-back-with-link-header.component.html',\r\n styleUrls: ['./default-back-with-link-header.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('DefaultBackWithLinkHeaderComponent')\r\nexport class DefaultBackWithLinkHeaderComponent implements OnInit, IControlComponent, OnDestroy {\r\n\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) { }\r\n data: RouteDialogHeaderModel;\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n onBackClick(){\r\n let dialogId = this.data.dialogModel.id;\r\n\r\n this.messageBusService.navigateBack(new NavigationBackMessage(dialogId));\r\n }\r\n\r\n onOpenInNewWindow() {\r\n if(isPlatformBrowser(this.platformId)){\r\n let url = window.location.href;\r\n\r\n window.open(url, \"_blank\");\r\n }\r\n }\r\n}","","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-medical-appointments-linkbox',\r\n templateUrl: './cliniweb-medical-appointments-linkbox.component.html',\r\n styleUrls: ['./cliniweb-medical-appointments-linkbox.component.css']\r\n})\r\n@ComponentLookup('CliniwebMedicalAppointmentsLinkboxComponent')\r\nexport class CliniwebMedicalAppointmentsLinkboxComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n constructor(\r\n private router: Router,\r\n private baseService: BaseService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n \r\n onLinkClick(){\r\n //let path = this.baseService.getRouteLinkByArea(3459);\r\n this.router.navigate(['/mis-citas']);\r\n }\r\n}","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n","import { Injectable } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { SystemAreas } from 'src/app/shared/enums/system-areas.enum';\nimport { FormComponentData, FormControl, FormControlComponent } from 'src/app/shared/models/people/form-control.model';\nimport { Form } from 'src/app/shared/models/people/form.model';\nimport { SearchProvidersConfiguration } from 'src/app/shared/models/search-results/search-providers-configuration.model';\nimport { LayoutService } from './layout.service';\nimport { FloatingComponentsMessage, MessageBusService } from './message-bus.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SearchProvidersService {\n\n constructor(\n private layoutService: LayoutService, \n private messageBusService: MessageBusService\n ) { }\n\n searchProviderComponentName= 'SearchProvidersV2Component';\n systemArea = SystemAreas.BUSCAR_PERFILES_PUBLICOS;\n\n openSearch(systemArea?: number){\n\n if(systemArea)\n this.systemArea = systemArea;\n\n this.getControlConfig().subscribe(config=>{\n if(config){\n let message = new FloatingComponentsMessage();\n \n message.componentsData = config;\n \n this.messageBusService.sendFloatingComponents(message);\n }\n });\n }\n\n getControlConfig(){\n\n return this.layoutService.getForm(this.systemArea)\n .pipe(map(\n (form:Form)=>{\n\n if(!form) return;\n let searchControl = form.controles.map(c=> { return new FormControl(c) });\n \n let searchComponent:FormControlComponent[] = [];\n\n searchControl.forEach(sc => {\n searchComponent = searchComponent.concat(sc.componentes); \n });\n\n let componentsData = searchComponent.map(c=> this.getComponentData(form, c));\n\n return componentsData.filter(d => d.nombreComponente == this.searchProviderComponentName);\n }));\n\n }\n\n getComponentData(form:Form , component:FormControlComponent): FormComponentData{\n let componentData = new FormComponentData();\n componentData.nombreComponente = component.nombre;\n componentData.contenedor = component.contenedor;\n componentData.valor = component.valor;\n componentData.idControlPadre = component.idControl;\n componentData.idFormulario = form.id;\n componentData.nombreFormulario = form.nombre;\n\n return componentData; \n }\n}\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { SearchProvidersService } from 'src/app/core/services/search-providers.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-book-appointment-linkbox',\r\n templateUrl: './cliniweb-book-appointment-linkbox.component.html',\r\n styleUrls: ['./cliniweb-book-appointment-linkbox.component.css']\r\n})\r\n@ComponentLookup('CliniwebBookAppointmentLinkboxComponent')\r\nexport class CliniwebBookAppointmentLinkboxComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n constructor(\r\n private router: Router,\r\n private baseService: BaseService,\r\n private searchProvidersService: SearchProvidersService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n \r\n onLinkClick(){\r\n this.searchProvidersService.openSearch();\r\n }\r\n}","
\r\n \r\n \r\n \r\n {{ 'shared.latestDoctors.text1' | translate:locale.language }}\r\n \r\n \r\n \r\n \r\n
0\">\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {{ doctor.nombreResponsableServicio }}\r\n
\r\n
\r\n {{ doctor.especialidadResponsableServicio }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{ 'shared.latestDoctors.text4' | translate:locale.language }}\r\n
\r\n
\r\n
 
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n {{ 'shared.latestDoctors.text2' | translate:locale.language }}\r\n \r\n \r\n {{ 'shared.latestDoctors.text3' | translate:locale.language }} \r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
","import { Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\r\nimport { AppointmentDoctor } from '../../models/people/appointment-doctor';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { SearchProvidersService } from 'src/app/core/services/search-providers.service';\r\nimport { PublicProfileAvatarComponentModel } from '../public-profile-avatar/public-profile-avatar.component';\r\nimport { PublicProfileType } from '../../models/people/profile-search-results.model';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-latest-doctors',\r\n templateUrl: './latest-doctors.component.html',\r\n styleUrls: ['./latest-doctors.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('LatestDoctorsComponent')\r\nexport class LatestDoctorsComponent implements OnInit, IControlComponent, OnDestroy {\r\n data: FormComponentData;\r\n qs: any = null;\r\n private _latestDoctors: AppointmentDoctor[];\r\n finishedLoading: boolean = false;\r\n private currentMaxDoctorsToShow = 3;\r\n private maxDoctorsToShow = 5;\r\n private ngUnsubscribe = new Subject();\r\n get latestDoctors(): AppointmentDoctor[] { return this._latestDoctors.filter((_, i) => i < this.currentMaxDoctorsToShow);}\r\n\r\n constructor(\r\n private router: Router,\r\n private route : ActivatedRoute,\r\n private baseService: BaseService,\r\n private publicProfileService: PublicProfileService,\r\n private appointmentService: AppointmentService, \r\n private messageBusService: MessageBusService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private searchProvidersService: SearchProvidersService,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n // Get QS parameters\r\n this.route.queryParams\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(params => {\r\n this.qs = params;\r\n });\r\n\r\n this.getLatestDoctors();\r\n\r\n this.messageBusService.onAppointmentChangeReceived()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(\r\n appointments => {\r\n if (appointments.doctores && appointments.doctores.length > this.currentMaxDoctorsToShow) {\r\n this._latestDoctors = appointments.doctores.slice(0, this.currentMaxDoctorsToShow);\r\n } else {\r\n this._latestDoctors = appointments.doctores;\r\n }\r\n },\r\n error => { this.baseService.handleServiceError(error, \"Error getting latest doctors\") } \r\n );\r\n this.onResize();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n \r\n getLatestDoctors() {\r\n this.appointmentService.getLatestDoctors(this.locale.language, this.maxDoctorsToShow)\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(\r\n doctors => {\r\n this._latestDoctors = doctors;\r\n\r\n this._latestDoctors.forEach(d => {\r\n let avatarInitialsObject = this.baseService.getAvatarInitialObject(d.idResponsableServicio, d.nombreResponsableServicio);\r\n d.iniciales = avatarInitialsObject.initials;\r\n });\r\n this.finishedLoading = true;\r\n },\r\n error => { this.baseService.handleServiceError(error, \"Error getting latest doctors\"); }\r\n ); \r\n }\r\n\r\n getMissingDoctorCount(): number[] {\r\n return Array.from({length: this.currentMaxDoctorsToShow - this.latestDoctors.length}, (_, index) => index);\r\n }\r\n\r\n onDoctorClick(doctor : AppointmentDoctor) { \r\n let url = this.publicProfileService.getPublicProfileUrl(doctor.identificadorPerfilPublico);\r\n this.publicProfileService.openPublicProfile(url);\r\n }\r\n\r\n onOtherClick() { \r\n this.searchProvidersService.openSearch();\r\n }\r\n\r\n onNavigateToAppointmentClick(){\r\n //this.router.navigate(['/mis-citas']);\r\n this.searchProvidersService.openSearch();\r\n }\r\n\r\n @HostListener('window:resize', [])\r\n onResize(): void {\r\n if(isPlatformBrowser(this.platformId)){\r\n this.currentMaxDoctorsToShow = window.innerWidth < 800 ? 5 : 3;\r\n }\r\n }\r\n\r\n getAvatarModel(item:AppointmentDoctor) : PublicProfileAvatarComponentModel {\r\n var avatarModel = new PublicProfileAvatarComponentModel();\r\n\r\n avatarModel.personId = item.idResponsableServicio;\r\n avatarModel.avatarUrl = item.urlAvatarResponsableServicio;\r\n avatarModel.fullName = item.nombreResponsableServicio;\r\n avatarModel.sex = item.sexoResponsableServicio;\r\n avatarModel.profileType = PublicProfileType.Doctor;\r\n\r\n return avatarModel;\r\n }\r\n\r\n}","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\n\r\n@Component({\r\n selector: 'app-most-common-specialties',\r\n templateUrl: './most-common-specialties.component.html',\r\n styleUrls: ['./most-common-specialties.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('MostCommonSpecialtiesComponent')\r\nexport class MostCommonSpecialtiesComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n constructor(\r\n private router: Router,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n \r\n onDentistClick() {\r\n this.router.navigate([\"/doctores/especialidad/odontologia\"], {queryParams: {idC: 47, idTc: 5 }} );\r\n }\r\n\r\n onNutritionClick() {\r\n this.router.navigate([\"/doctores/especialidad/nutricion\"], {queryParams: {idC: 46, idTc: 5 }} );\r\n }\r\n\r\n onGynecologyClick() {\r\n this.router.navigate([\"/doctores/especialidad/ginecologia\"], {queryParams: {idC: 28, idTc: 5 }} );\r\n }\r\n\r\n onPediatricsClick() { \r\n this.router.navigate([\"/doctores/especialidad/pediatria\"], {queryParams: {idC: 58, idTc: 5 }} );\r\n }\r\n}","
\r\n \r\n \r\n \r\n \r\n {{ 'shared.healthAllies.text1' | translate:locale.language }}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \"ally.title\r\n
\r\n {{ ally.title | translate:locale.language }}\r\n {{ ally.subTitle | translate:locale.language }}\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
","
\r\n \r\n \r\n \r\n \r\n {{ 'shared.mostCommonSpecialties.text1' | translate:locale.language }}\r\n \r\n \r\n {{ 'shared.mostCommonSpecialties.text2' | translate:locale.language }}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text3' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text4' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text5' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text6' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text7' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text8' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text9' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.mostCommonSpecialties.text10' | translate:locale.language }}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\n\r\n@Component({\r\n selector: 'app-health-allies',\r\n templateUrl: './health-allies.component.html',\r\n styleUrls: ['./health-allies.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('HealthAlliesComponent')\r\nexport class HealthAlliesComponent implements OnInit, IControlComponent {\r\n\r\n healthAllies = [\r\n {\r\n \"id\": 3195,\r\n \"logo\": \"assets/images/logos/assa.png\",\r\n \"title\": \"shared.healthAllies.text4\",\r\n \"subTitle\": \"shared.healthAllies.text9\"\r\n },\r\n {\r\n \"id\": 20142,\r\n \"logo\": \"assets/images/logos/sura.png\",\r\n \"title\": \"shared.healthAllies.text3\",\r\n \"subTitle\": \"shared.healthAllies.text9\"\r\n },\r\n {\r\n \"id\": 3205,\r\n \"logo\": \"assets/images/logos/mapfre.png\",\r\n \"title\": \"shared.healthAllies.text2\",\r\n \"subTitle\": \"shared.healthAllies.text9\"\r\n },\r\n {\r\n \"id\": 61090,\r\n \"logo\": \"assets/images/logos/CMC.png\",\r\n \"title\": \"shared.healthAllies.text13\",\r\n \"subTitle\": \"shared.healthAllies.text11\"\r\n },\r\n {\r\n \"id\": 61092,\r\n \"logo\": \"assets/images/logos/HChiriqui.png\",\r\n \"title\": \"shared.healthAllies.text14\",\r\n \"subTitle\": \"shared.healthAllies.text12\"\r\n },\r\n {\r\n \"id\": 61848,\r\n \"logo\": \"assets/images/logos/HPaitilla.png\",\r\n \"title\": \"shared.healthAllies.text15\",\r\n \"subTitle\": \"shared.healthAllies.text12\"\r\n },\r\n {\r\n \"id\": 61096,\r\n \"logo\": \"assets/images/logos/HSanFernando.png\",\r\n \"title\": \"shared.healthAllies.text6\",\r\n \"subTitle\": \"shared.healthAllies.text12\"\r\n },\r\n {\r\n \"id\": 61093,\r\n \"logo\": \"assets/images/logos/HSantaFe.png\",\r\n \"title\": \"shared.healthAllies.text8\",\r\n \"subTitle\": \"shared.healthAllies.text12\"\r\n },\r\n {\r\n \"id\": 61097,\r\n \"logo\": \"assets/images/logos/PuntaPacifica.png\",\r\n \"title\": \"shared.healthAllies.text16\",\r\n \"subTitle\": \"shared.healthAllies.text11\"\r\n },\r\n {\r\n \"id\": 61095,\r\n \"logo\": \"assets/images/logos/panamaClinic.png\",\r\n \"title\": \"shared.healthAllies.text7\",\r\n \"subTitle\": \"shared.healthAllies.text12\"\r\n },\r\n {\r\n \"id\": 61773,\r\n \"logo\": \"assets/images/logos/townCenter.png\",\r\n \"title\": \"shared.healthAllies.text5\",\r\n \"subTitle\": \"shared.healthAllies.text10\"\r\n }\r\n ];\r\n\r\n data: FormComponentData;\r\n\r\n constructor(\r\n private router: Router,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n \r\n navigateToSearch(clinicalConceptId: number) { \r\n this.router.navigate([\"/doctores/todos\"], {queryParams: {filtros: clinicalConceptId}});\r\n } \r\n}","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\n\r\n@Component({\r\n selector: 'app-preventive-control-tips',\r\n templateUrl: './preventive-control-tips.component.html',\r\n styleUrls: ['./preventive-control-tips.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('PreventiveControlTipsComponent')\r\nexport class PreventiveControlTipsComponent implements OnInit, IControlComponent {\r\n data: FormComponentData;\r\n\r\n constructor(\r\n private router: Router,\r\n private baseService: BaseService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n \r\n onGeneralMedicineClick() {\r\n this.router.navigate([\"/doctores/especialidad/medicina-general\"], {queryParams: {idC: 35, idTc: 5 }} );\r\n }\r\n\r\n onDermatologyClick() {\r\n this.router.navigate([\"/doctores/especialidad/dermatologia\"], {queryParams: {idC: 19, idTc: 5 }} );\r\n }\r\n\r\n onDentistClick() {\r\n this.router.navigate([\"/doctores/especialidad/odontologia\"], {queryParams: {idC: 47, idTc: 5 }} );\r\n }\r\n \r\n onOphthalmologyClick() {\r\n this.router.navigate([\"/doctores/especialidad/oftalmologia\"], {queryParams: {idC: 49, idTc: 5 }} );\r\n } \r\n}","
\r\n \r\n
\r\n {{ 'shared.cliniwebHomeLayout.text1' | translate:locale.language }} {{userName}},\r\n {{ 'shared.cliniwebHomeLayout.text2' | translate:locale.language }}\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
","
\r\n \r\n \r\n \r\n \r\n {{ 'shared.preventiveControlTips.text1' | translate:locale.language }}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text2' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text3' | translate:locale.language }}\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text4' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text5' | translate:locale.language }}\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text6' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text7' | translate:locale.language }}\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text8' | translate:locale.language }}\r\n
\r\n
\r\n {{ 'shared.preventiveControlTips.text9' | translate:locale.language }}\r\n
\r\n \r\n
\r\n
\r\n
\r\n
","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { AuthService } from 'src/app/core/services/auth.service';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-home-layout',\r\n templateUrl: './cliniweb-home-layout.component.html',\r\n styleUrls: ['./cliniweb-home-layout.component.css']\r\n})\r\n@ComponentLookup('HomeCliniwebComponent')\r\nexport class CliniwebHomeLayoutComponent implements OnInit, IControlComponent, OnDestroy {\r\n data: FormComponentData;\r\n user: UserPerson | null = null;\r\n userName: string;\r\n\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private userService: UserService,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private messageBusService: MessageBusService,\r\n private authService: AuthService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.messageBusService.onRefreshProfileMenu()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(m => {\r\n this.getUser();\r\n }\r\n );\r\n\r\n this.authService.isLoggedInFull().subscribe(loggedIn => {\r\n if (loggedIn)\r\n this.getUser();\r\n });\r\n } \r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n private getUser() {\r\n this.userService.getUserPersonLoggedIn().subscribe(person => {\r\n if (person) {\r\n this.user = person;\r\n this.userName = this.user?.nombre.split(\"@\")[0];\r\n } \r\n });\r\n }\r\n \r\n}","
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
0\">\r\n \r\n \r\n \r\n \r\n\r\n
1\" (click)=\"onShowAll()\">\r\n {{'shared.cliniwebFutureAppointments.text1' | translate:locale.language}}\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{'shared.cliniwebFutureAppointments.text2' | translate:locale.language}}\r\n \r\n \r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n \r\n \r\n
\r\n \r\n","import { Component, Inject, OnDestroy, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { Directory } from 'src/app/shared/models/systems/directory.model';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { Observable, Subject, forkJoin, of, zip } from 'rxjs';\r\nimport { catchError, takeUntil, tap } from 'rxjs/operators';\r\nimport { Dependent } from 'src/app/shared/models/people/dependent.model';\r\nimport { SearchProvidersService } from 'src/app/core/services/search-providers.service';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-future-appointment',\r\n templateUrl: './cliniweb-future-appointments.component.html',\r\n styleUrls: ['./cliniweb-future-appointments.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('CliniwebFutureAppointmentsComponent')\r\nexport class CliniwebFutureAppointmentsComponent implements OnInit, OnDestroy, IControlComponent {\r\n data: FormComponentData; \r\n appointments : PatientAppointment[];\r\n appointmentsToShow : PatientAppointment[]; \r\n inProgressState: string; \r\n loading = true;\r\n skeletonItems: string[] = [\"\", \"\"];\r\n directory: Directory;\r\n showAll: boolean = true;\r\n dependents: Dependent[]; \r\n loggedInUser: UserPerson;\r\n intervalId: any;\r\n\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private appointmentService: AppointmentService, \r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n public dialog: MatDialog,\r\n private messageBusService: MessageBusService,\r\n private baseService: BaseService,\r\n private userService: UserService,\r\n private searchProvidersService: SearchProvidersService,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n \r\n this.loading = true;\r\n\r\n this.messageBusService.onAppointmentChangeReceived()\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(appointments => {\r\n if (appointments.citasFuturas) {\r\n this.appointments = appointments.citasFuturas.sort(this.sortByAppointmentState()); \r\n this.appointmentsToShow = this.showAll ? this.appointments : this.appointments.slice(0, 1);\r\n }\r\n this.loading = false;\r\n }); \r\n\r\n let observables: Observable[] = [\r\n this.getDirectory(),\r\n this.getUser(),\r\n this.getDependents(),\r\n this.getAppointments()\r\n ];\r\n\r\n forkJoin(observables)\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(results => {\r\n this.directory = results[0] as Directory;\r\n this.loggedInUser = results[1] as UserPerson;\r\n this.dependents = results[2] as Dependent[];\r\n \r\n var appointments = results[3] as PatientAppointment[];\r\n this.appointments = appointments.sort(this.sortByAppointmentState());\r\n this.appointmentsToShow = this.showAll ? this.appointments : this.appointments.slice(0, 1);\r\n\r\n this.loading = false;\r\n },\r\n error => {\r\n this.loading = false;\r\n console.log('forkJoin: ' + error);\r\n }\r\n );\r\n\r\n // Check appointment every 20 seconds\r\n\r\n if(isPlatformBrowser(this.platformId)) {\r\n this.intervalId = setInterval(() => {\r\n this.checkFutureAppointmentTime();\r\n }, 20 * 1000);\r\n }\r\n }\r\n \r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n\r\n clearInterval(this.intervalId);\r\n this.intervalId = null;\r\n } \r\n\r\n getDirectory() : Observable {\r\n let companyId = this.baseService.getCliniwebDirectoryCompanyId();\r\n\r\n return this.baseService.getCliniwebDirectory(companyId);\r\n }\r\n\r\n getUser() : Observable {\r\n return this.userService.getUserPersonLoggedIn().pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => { \r\n this.baseService.handleServiceError(e, \"Error getting user\"); \r\n \r\n return of(null);\r\n })));\r\n }\r\n\r\n getDependents() : Observable{\r\n return this.userService.getUserDependents().pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => { \r\n this.baseService.handleServiceError(e, \"Error getting dependents\"); \r\n \r\n return of([]);\r\n })));\r\n }\r\n\r\n getAppointments() : Observable {\r\n this.loading = true;\r\n\r\n return this.appointmentService.getFutureAppointments(this.locale.language).pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => {\r\n this.baseService.handleServiceError(e, \"Error getting future appointment\"); \r\n \r\n return of([]);\r\n })));\r\n } \r\n\r\n refreshAppointments() {\r\n this.loading = true;\r\n\r\n this.appointmentService.clearAppointmentsCache();\r\n\r\n this.getAppointments().subscribe(apps => {\r\n this.appointments = apps;\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n onShowAll(){ \r\n this.showAll = true;\r\n this.appointmentsToShow = this.appointments;\r\n }\r\n\r\n appointmentTrackBy(index : number, item: PatientAppointment){\r\n return item.idSolicitud; \r\n } \r\n \r\n onNewAppointmentClick() {\r\n this.searchProvidersService.openSearch();\r\n } \r\n\r\n private sortByAppointmentState(): ((a: PatientAppointment, b: PatientAppointment) => number) | undefined {\r\n return (a1, a2) => {\r\n if (a1.idEstado != a2.idEstado) {\r\n // si la cita esta cancelada o no asistio va a lo ultimo\r\n if (a2.idEstado == 7)\r\n return -1;\r\n\r\n if (a1.idEstado == 7 || a1.idEstado == 28)\r\n return 1;\r\n }\r\n\r\n return 0;\r\n };\r\n }\r\n\r\n private checkFutureAppointmentTime() {\r\n if (!this.appointments || this.appointments.length == 0)\r\n return;\r\n\r\n this.appointments.forEach(app => {\r\n if (this.isAppointmentExpired(app)) {\r\n this.refreshAppointments();\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private isAppointmentExpired(item : PatientAppointment) {\r\n let now = new Date().getTime();\r\n let appDate = new Date(item.fechaRequerido).getTime();\r\n\r\n return appDate <= now;\r\n }\r\n\r\n}\r\n\r\n\r\n","
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{'shared.cliniwebPastAppointments.text1' | translate:locale.language}}\r\n \r\n {{ 'shared.cliniwebPastAppointments.text2' | translate:locale.language }}\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n \r\n\r\n
","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { L10nLocale, L10N_LOCALE, L10nTranslationService } from 'angular-l10n';\r\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { Directory } from 'src/app/shared/models/systems/directory.model';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { Observable, Subject, forkJoin, of } from 'rxjs';\r\nimport { catchError, tap } from 'rxjs/operators';\r\nimport { Dependent } from 'src/app/shared/models/people/dependent.model';\r\nimport { TimelineWrapperItem, TimelineWrapperItemType } from '../../timeline-list/timeline-list.component';\r\nimport { SearchProvidersService } from 'src/app/core/services/search-providers.service';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-past-appointment',\r\n templateUrl: './cliniweb-past-appointments.component.html',\r\n styleUrls: ['./cliniweb-past-appointments.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('CliniwebPastAppointmentsComponent')\r\nexport class CliniwebPastAppointmentsComponent implements OnInit, OnDestroy, IControlComponent {\r\n data: FormComponentData; \r\n appointments : CliniwebTimelinePatientAppointment[]; \r\n inProgressState: string; \r\n loading = true;\r\n skeletonItems: string[] = [\"\", \"\"];\r\n directory: Directory; \r\n dependents: Dependent[]; \r\n loggedInUser: UserPerson;\r\n\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private appointmentService: AppointmentService, \r\n @Inject(L10N_LOCALE) public locale: L10nLocale, \r\n private translation: L10nTranslationService,\r\n public dialog: MatDialog,\r\n private messageBusService: MessageBusService,\r\n private baseService: BaseService,\r\n private userService: UserService,\r\n private searchProvidersService: SearchProvidersService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n let observables: Observable[] = [];\r\n \r\n this.loading = true;\r\n\r\n this.messageBusService.onAppointmentChangeReceived()\r\n .subscribe(appointments => {\r\n if (appointments.citasFuturas) {\r\n this.appointments = appointments.citasPasadas.map(app => new CliniwebTimelinePatientAppointment(app));\r\n }\r\n this.loading = false;\r\n }); \r\n\r\n observables.push(this.getDirectory());\r\n observables.push(this.getUser());\r\n observables.push(this.getDependents());\r\n observables.push(this.getAppointments());\r\n\r\n forkJoin(observables).subscribe(results => { \r\n this.directory = results[0] as Directory;\r\n this.loggedInUser = results[1] as UserPerson;\r\n this.dependents = results[2] as Dependent[];\r\n\r\n let appointments = results[3] as PatientAppointment[];\r\n this.appointments = appointments.map(app => new CliniwebTimelinePatientAppointment(app));\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n getDirectory() : Observable {\r\n let companyId = this.baseService.getCliniwebDirectoryCompanyId();\r\n\r\n return this.baseService.getCliniwebDirectory(companyId);\r\n }\r\n\r\n getUser() : Observable {\r\n return this.userService.getUserPersonLoggedIn().pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => { \r\n this.baseService.handleServiceError(e, \"Error getting user\"); \r\n \r\n return of(null);\r\n })));\r\n }\r\n\r\n getDependents() : Observable{\r\n return this.userService.getUserDependents().pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => { \r\n this.baseService.handleServiceError(e, \"Error getting dependents\"); \r\n \r\n return of([]);\r\n })));\r\n }\r\n\r\n getAppointments() : Observable {\r\n this.loading = true;\r\n\r\n return this.appointmentService.getPastAppointments(this.locale.language).pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => {\r\n this.baseService.handleServiceError(e, \"Error getting appointments\"); \r\n \r\n return of([]);\r\n })));\r\n } \r\n\r\n appointmentTrackBy(index : number, item: PatientAppointment){\r\n return item.idSolicitud; \r\n } \r\n\r\n getAppointmentsToShow() {\r\n return this.appointments.map(a => a.appointment);\r\n } \r\n \r\n onNewAppointmentClick() {\r\n this.searchProvidersService.openSearch();\r\n }\r\n}\r\n\r\nexport class CliniwebTimelinePatientAppointment implements TimelineWrapperItem { \r\n appointment : PatientAppointment;\r\n\r\n constructor(appointment : PatientAppointment) {\r\n this.appointment = appointment;\r\n }\r\n \r\n getGroupKey() : number {\r\n return new Date(this.appointment.fechaInicio).getFullYear();\r\n }\r\n\r\n getDate() : Date { \r\n return new Date(this.appointment.fechaInicio);\r\n }\r\n\r\n getItemType(): TimelineWrapperItemType{\r\n let type : TimelineWrapperItemType;\r\n\r\n /*return this.appointment.idEstado == 7 || this.appointment.idEstado == 28 \r\n ? TimelineWrapperItemType.CANCELLED\r\n : TimelineWrapperItemType.CHECKED;*/\r\n\r\n if (this.appointment.idEstado == 7 || this.appointment.idEstado == 28)\r\n type = TimelineWrapperItemType.CANCELLED \r\n else \r\n type = TimelineWrapperItemType.CHECKED;\r\n\r\n return type;\r\n }\r\n\r\n showTime():boolean{\r\n return false;\r\n }\r\n\r\n showDate():boolean{\r\n return false;\r\n }\r\n}\r\n\r\n\r\n","
\r\n
{{ 'shared.cliniwebAppointmentTabs.text1' | translate:locale.language }}
\r\n\r\n \r\n \r\n \r\n \r\n
\r\n {{ 'shared.cliniwebAppointmentTabs.text2' | translate:locale.language }} \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {{ 'shared.cliniwebAppointmentTabs.text3' | translate:locale.language }} \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from '../../../decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\r\n\r\n@Component({\r\n selector: 'app-cliniweb-appointment-tabs',\r\n templateUrl: './cliniweb-appointment-tabs.component.html',\r\n styleUrls: ['./cliniweb-appointment-tabs.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('CliniwebAppointmentTabsComponent')\r\nexport class CliniwebAppointmentTabsComponent implements IControlComponent, OnInit {\r\n data: FormComponentData;\r\n\r\n constructor(\r\n @Inject(L10N_LOCALE) public locale: L10nLocale) {\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n}","import { DoctorSearchResult } from \"../cdr/doctor-search-result.model\";\r\nimport { TextLanguage } from \"../people/text-language.model\";\r\nimport { ConceptDefaultModel } from \"./concept-default.model\";\r\nimport { LocationDefaultModel, LocationV2DefaultModel } from \"./location-default.model\";\r\n\r\nexport class SearchProvidersConfiguration{\r\n searchType: SearchProvidersType = SearchProvidersType.DEFAULT;\r\n searchParamMap: string;\r\n\r\n profileTypes:string = '1';\r\n \r\n titleMobile: TextLanguage[] = [];\r\n placeholderMobile: TextLanguage[] = [];\r\n \r\n profilesPlaceholderClosed: TextLanguage[] = [];\r\n profilesPlaceholderOpened: TextLanguage[] = [];\r\n profilesLabel: TextLanguage[] = [];\r\n profilesDefault: ConceptDefaultModel[] = [];\r\n \r\n showLocationsAutocomplete: boolean = true;\r\n locationsPlaceholderClosed: TextLanguage[] = [];\r\n locationsPlaceholderOpened: TextLanguage[] = [];\r\n locationsLabel: TextLanguage[];\r\n locationsDefault:LocationV2DefaultModel[] = [];\r\n locationsLikeCombo:boolean = false;\r\n \r\n showInsurersAutocomplete: boolean = false;\r\n insurersPlaceholderClosed: TextLanguage[] = [];\r\n insurersPlaceholderOpened: TextLanguage[] = [];\r\n insurersLabel: TextLanguage[] = [];\r\n insurersDefault: ConceptDefaultModel[] = [];\r\n insurersLikeCombo: boolean = true;\r\n \r\n constructor();\r\n constructor(obj: SearchProvidersConfiguration);\r\n constructor(obj?:any){\r\n\r\n if(obj){\r\n this.searchType = obj.searchType || SearchProvidersType.DEFAULT;\r\n this.searchParamMap = obj.searchParamMap || '';\r\n\r\n this.profileTypes = obj.profileTypes || '1';\r\n \r\n this.titleMobile = obj.titleMobile || [];\r\n this.placeholderMobile = obj.placeholderMobile || [];\r\n \r\n this.profilesPlaceholderClosed = obj.profilesPlaceholderClosed || [];\r\n this.profilesPlaceholderOpened = obj.profilesPlaceholderOpened || [];\r\n this.profilesLabel = obj.profilesLabel || [];\r\n this.profilesDefault = obj.profilesDefault || [];\r\n \r\n this.showLocationsAutocomplete = obj.showLocationsAutocomplete == undefined ? true : obj.showLocationsAutocomplete;\r\n this.locationsPlaceholderClosed = obj.locationsPlaceholderClosed || [];\r\n this.locationsPlaceholderOpened = obj.locationsPlaceholderOpened || [];\r\n this.locationsLabel = obj.locationsLabel || [];\r\n this.locationsDefault = obj.locationsDefault || [];\r\n this.locationsLikeCombo = obj.locationsLikeCombo == undefined ? false: obj.locationsLikeCombo;\r\n \r\n this.showInsurersAutocomplete = obj.showInsurersAutocomplete == undefined ? false : obj.showInsurersAutocomplete;\r\n this.insurersPlaceholderClosed = obj.insurersPlaceholderClosed || [];\r\n this.insurersPlaceholderOpened = obj.insurersPlaceholderOpened || [];\r\n this.insurersLabel = obj.insurersLabel || [];\r\n this.insurersDefault = obj.insurersDefault || [];\r\n this.insurersLikeCombo = obj.insurersLikeCombo == undefined ? true : obj.insurersLikeCombo;\r\n }\r\n }\r\n}\r\n\r\nexport enum SearchProvidersType{\r\n DEFAULT = 'default',\r\n POPUP = 'popup',\r\n WIDGET = 'widget'\r\n}\r\n\r\nexport enum SearchProvidersActionType{\r\n FOCUS_ON_PROVIDER = 1,\r\n FOCUS_ON_LOCATION = 2,\r\n FOCUS_ON_INSURANCE = 3,\r\n REMOVE_PROVIDER = 4,\r\n REMOVE_LOCATION = 5,\r\n REMOVE_INSURANCE = 6,\r\n REMOVE_ALL = 7\r\n}\r\n\r\nexport class DoctorSearchResultGroup {\r\n classId: number;\r\n className: string;\r\n results: DoctorSearchResult[];\r\n}\r\n\r\nexport class LocationSearchResultGroup {\r\n id: number;\r\n displayName: string;\r\n results: LocationSearchResultItem[];\r\n}\r\n\r\nexport class LocationSearchResultItem {\r\n id: number;\r\n nombre: string;\r\n url: string;\r\n icono?: string;\r\n}\r\n\r\nexport class InsuranceSearchResultGroup {\r\n id: number;\r\n displayName: string;\r\n results: InsuranceSearchResultItem[];\r\n}\r\n\r\nexport class InsuranceSearchResultItem{\r\n id: number;\r\n nombre: string;\r\n url: string;\r\n icono?: string;\r\n}","
\n \n
\n
\n
\n
\n \n {{ model.profilesPlaceholderClosed | i18nText:locale.language }}\n \n
\n {{ getPreviewProviderValue() }}\n \n
\n
\n
\n \n {{ model.locationsPlaceholderClosed | i18nText:locale.language }}\n \n
\n {{ getPreviewLocationValue() }}\n \n
\n
\n
\n \n {{ model.insurersPlaceholderClosed | i18nText:locale.language }}\n \n
\n {{insuranceObjectSelected.n_cc}}\n \n
\n
\n \n
\n
\n
\n
\n \n \n {{ model.placeholderMobile | i18nText:locale.language }}\n \n
\n {{ getSelectionTextMobile() }}\n \n
\n \n
\n
\n
\n\n
\n \n
\n \n
\n
\n \n \n \n \n
\n \n \n \n \n
\n \n \n {{'shared.searchResults.searchProvidersV2.noMatchesFound' | translate:locale.language}}\n \n \n
\n
\n \n
\n
\n \n
\n \n
\n
\n \n {{ lastestDoctor.nombreResponsableServicio }}\n
\n
\n \n
\n
\n
\n \n {{ lastestDoctor.nombreResponsableServicio }}\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n \n \n
\n \n \n \n \n
\n \n
\n \n
\n \n {{result.descripcion}}\n
\n
\n
\n
\n
\n
\n
\n\n \n \n \n \n
\n \n \n \n \n
\n \n
\n \n
\n \n {{'shared.searchResults.searchProvidersV2.noMatchesFound' | translate:locale.language}}\n \n \n \n
\n \n \n
\n
\n
\n
\n
\n\n \n \n \n \n
\n \n \n \n \n
\n \n
\n \n
\n\n
\n 0\"\n [ngClass]=\"{'label-hidden': !group.titulo }\">\n \n
0\">\n {{group.titulo}}\n \n
\n \n \n
\n \n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n
\n
\n
\n
\n
","import { AfterContentChecked, ChangeDetectorRef, Component, ElementRef, HostListener, Inject, Input, OnDestroy, OnInit, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { MatAutocomplete, MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { ActivatedRouteSnapshot, Params, Router } from '@angular/router';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { of, Subject } from 'rxjs';\nimport { Observable } from 'rxjs/internal/Observable';\nimport { catchError, debounceTime, map, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { DoctorService } from 'src/app/core/services/doctors.service';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { ClassConcept } from 'src/app/shared/enums/class-concept.enum';\nimport { DoctorSearchResult } from 'src/app/shared/models/cdr/doctor-search-result.model';\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { MessageBusService, ProviderSearchMessage } from 'src/app/core/services/message-bus.service';\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\nimport { TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { ConceptDefaultModel } from 'src/app/shared/models/search-results/concept-default.model';\nimport { SearchQsParamMapModel, SearchQsParametersModel } from 'src/app/shared/models/search-results/search-parameters.model';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { SearchProvidersConfiguration, SearchProvidersType } from 'src/app/shared/models/search-results/search-providers-configuration.model';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { PublicProfileAvatarComponentModel } from '../../public-profile-avatar/public-profile-avatar.component';\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\nimport { AppointmentDoctor } from 'src/app/shared/models/people/appointment-doctor';\nimport { Platform } from '@angular/cdk/platform';\nimport { LocationV2DefaultModel } from 'src/app/shared/models/search-results/location-default.model';\nimport { ClinicalConceptService } from 'src/app/core/services/clinical-concept.service';\nimport { DirectoryFiltersItemsModel, DirectoryFiltersModel } from '../provider-filters/provider-filters-content/provider-filters-content.component';\nimport { ProfileFilterSearchResult, ProfileFilterSearchResultConcept, ProfileFilterSearchResultGroup } from 'src/app/shared/models/people/profile-filter-search-result.model';\n\n@Component({\n selector: 'app-search-providers-v2',\n templateUrl: './search-providers-v2.component.html',\n styleUrls: ['./search-providers-v2.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('SearchProvidersV2Component')\nexport class SearchProvidersV2Component implements OnInit, OnDestroy, AfterContentChecked , IControlComponent {\n data: any;\n\n @Input() model: SearchProvidersConfiguration = new SearchProvidersConfiguration(); \n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n companyName: string = \"\";\n language: string;\n searchCountry: TerritorialDivision;\n\n searchOpened: boolean = false;\n\n autocompleteOpen:boolean = false;\n loadingSearchProvider: boolean = false;\n searchProviderCtrl = new FormControl();\n filteredResults$: Observable;\n filteredResultsCount:number;\n providerSelected: DoctorSearchResult | null = null;\n\n highlightValue: string;\n\n locationAutocompleteOpen:boolean = false;\n loadingSearchLocation: boolean = false;\n searchLocationCtrl = new FormControl();\n filteredLocationResults$: Observable;\n filteredLocationResultsCount:number;\n locationObjectSelected: LocationSearchResultItem | null = null;\n locationLevels: string = \"1,2,3\";\n locationDefault: LocationV2DefaultModel | undefined = undefined;\n\n insuranceAutocompleteOpen: boolean = false;\n loadingSearchInsurance: boolean = false;\n searchInsuranceCtrl = new FormControl();\n filteredInsuranceResults$: Observable;\n filteredInsuranceResultsCount:number;\n insuranceObjectSelected: ProfileFilterSearchResultConcept | null = null;\n\n insuranceFilter: DirectoryFiltersItemsModel; \n providerSearchMessage: ProviderSearchMessage;\n insuranceUnfilteredResults: ProfileFilterSearchResultConcept[]; \n\n cityText:string;\n stateText:string;\n countryText:string;\n cityDefaultText:string;\n stateDefaultText:string;\n countryDefaultText: string;\n dontApplyInsuranceText:string;\n\n removingSelection:boolean = false;\n\n isMobile:boolean = false;\n fullsize: boolean = false;\n\n isAnonymous:boolean = true;\n\n mobileDelimiter: number = 800;\n\n maxLastestDoctorsToShow: number = 4;\n lastestDoctors: AppointmentDoctor[] = [];\n loadingLastestDoctors:boolean = false;\n lastestDoctorsIndex: number = 0;\n\n otherInsuranceComp: ConceptDefaultModel[] = [];\n qsParams: SearchQsParametersModel;\n\n @ViewChild('inputWrapperProvider') inputWrapperProvider: ElementRef;\n @ViewChild('searchInput') searchInput: ElementRef;\n @ViewChild('auto') matAutocomplete: MatAutocomplete;\n @ViewChild('searchInput', { read:MatAutocompleteTrigger }) autocompleteProviderTrigger: MatAutocompleteTrigger;\n\n @ViewChild('inputWrapperLocation') inputWrapperLocation: ElementRef;\n @ViewChild('searchLocationInput') searchLocationInput: ElementRef;\n @ViewChild('autoLocation') matAutocompleteLocation: MatAutocomplete;\n @ViewChild('searchLocationInput', { read:MatAutocompleteTrigger }) autocompleteLocationTrigger: MatAutocompleteTrigger;\n\n @ViewChild('inputWrapperInsurance') inputWrapperInsurance: ElementRef;\n @ViewChild('searchInsuranceInput') searchInsuranceInput: ElementRef;\n @ViewChild('autoInsurance') matAutocompleteInsurance: MatAutocomplete;\n @ViewChild('searchInsuranceInput', { read:MatAutocompleteTrigger }) autocompleteInsuranceTrigger: MatAutocompleteTrigger;\n\n isBrowser: boolean;\n\n constructor( \n private baseService: BaseService,\n private appointmentService: AppointmentService,\n private layoutService: LayoutService,\n private utilsService: UtilsService,\n private doctorService: DoctorService,\n private router: Router,\n private messageBusService: MessageBusService,\n private territorialDivisionsService: TerritorialDivisionsService,\n private publicProfileService: PublicProfileService,\n private translation: L10nTranslationService,\n private authService: AuthService,\n @Inject(DOCUMENT) private document: Document,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private cdref: ChangeDetectorRef,\n public platform: Platform,\n private clinicalConceptsService: ClinicalConceptService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngAfterContentChecked(): void {\n this.cdref.detectChanges();\n }\n \n ngOnInit(): void {\n this.document.body.classList.add('search-providers-v2');\n this.isMobile = this.isBrowser && window.innerWidth <= this.mobileDelimiter;\n\n this.companyName = this.baseService.getCliniwebDirectoryCompanyName();\n this.language = this.baseService.getLanguage();\n\n this.parseControlData();\n\n this.configSearchByCountryApp();\n \n this.configSearchProviders();\n\n this.configSearchLocations();\n\n this.configSearchInsurers();\n\n this.initBySearchType();\n\n this.setDefaultsText();\n\n this.getDirectoryFilters();\n\n this.translation.onChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe({\n next: () => {\n this.setDefaultsText();\n }\n });\n\n this.messageBusService.onLoginCompleted()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n if (msg.user) {\n this.isAnonymous = false;\n } \n });\n\n this.messageBusService.onSendTerritorialDivisionCountry()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(msg => {\n this.configSearchByCountry(msg.country);\n \n this.setLocationDefaultByCountry();\n });\n\n this.authService.isLoggedInFull()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((result:boolean)=>{\n this.isAnonymous = !result;\n\n if(result){\n this.getLatestDoctors();\n } \n });\n\n this.messageBusService.onAppointmentChangeReceived()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(\n appointments => {\n\n this.lastestDoctors = appointments.doctores;\n },\n error => { this.baseService.handleServiceError(error, \"Error getting latest doctors\") } \n );\n\n // Subscribe to new search event\n this.messageBusService.onProviderSearch()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(message => {\n this.providerSearchMessage = message;\n\n this.toggleAutocompleteInsurance(message);\n });\n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n\n this.document.body.classList.remove('search-providers-v2');\n }\n\n getParamMaps(): Params {\n const url = this.router.routerState.snapshot.url;\n\n const { params, queryParams } = this.processUrl(url);\n\n return {...params, ...queryParams};\n }\n\n private processUrl(url: string): { params: Record, queryParams: Record } {\n const [path, queryString] = url.split('?');\n \n const segments = path.split('/').filter(segment => segment);\n \n const params: Record = {\n param1: segments[1] || '',\n param2: segments[2] || '',\n param3: segments[3] || '',\n param4: segments[4] || '',\n param5: segments[5] || ''\n };\n \n const queryParams: Record = {};\n if (queryString) {\n const urlParams = new URLSearchParams(queryString);\n urlParams.forEach((value, key) => {\n queryParams[key] = value;\n });\n }\n \n return { params, queryParams };\n }\n\n initBySearchType(){\n\n switch(this.model.searchType){\n case SearchProvidersType.DEFAULT:\n default:\n this.initFromParams();\n break;\n case SearchProvidersType.POPUP:\n this.initLikePopup();\n\n this.initEmptyProviderSearchMessage();\n break;\n case SearchProvidersType.WIDGET:\n this.initLikeWidget();\n\n this.initEmptyProviderSearchMessage();\n break;\n }\n }\n\n initLikePopup(){\n this.searchOpened = true;\n\n this.layoutService.overflowBodyDisabled();\n\n if(!this.isMobile){\n setTimeout(()=>{\n this.autocompleteProviderTrigger.openPanel();\n this.searchInput.nativeElement.focus();\n }, 100);\n }\n }\n\n initLikeWidget(){\n // this.searchOpened = true;\n\n this.mobileDelimiter = 600;\n\n this.isMobile = this.isBrowser && window.innerWidth <= this.mobileDelimiter;\n\n this.document.body.classList.add('widget-mode');\n }\n\n initFromParams(){\n // let params = this.getParamMaps();\n const currentSnapshot: ActivatedRouteSnapshot = this.router.routerState.snapshot.root;\n let params = this.collectParams(currentSnapshot);\n let _paramMap = new SearchQsParamMapModel();\n\n _paramMap.param1 = params['param1'] || '';\n _paramMap.param2 = params['param2'] || '';\n _paramMap.param3 = params['param3'] || '';\n _paramMap.param4 = params['param4'] || '';\n _paramMap.param5 = params['param5'] || '';\n\n this.qsParams = new SearchQsParametersModel();\n \n this.qsParams.t = params['t'] || '';\n this.qsParams.filtros = params['filtros'] || '';\n this.qsParams.idC = params['idC'] || '';\n this.qsParams.idTc = params['idTc'] || '';\n\n this.populateDropdownByParams(_paramMap, this.qsParams);\n }\n\n configSearchProviders(){\n this.filteredResults$ = this.searchProviderCtrl.valueChanges\n .pipe(\n tap(()=>{ \n this.loadingSearchProvider = true;\n }),\n debounceTime(300),\n startWith(''),\n switchMap(value => \n this.filterProviders(value)\n .pipe(\n map(results => {\n this.loadingSearchProvider = false;\n\n this.highlightValue = value;\n\n this.filteredResultsCount = results.length;\n \n return this.groupProviderResults(results);\n })\n )\n )\n );\n }\n\n configSearchLocations(){\n if(!this.model.showLocationsAutocomplete)\n return;\n\n this.setLocationDefaultByCountry();\n\n if(this.model.locationsLikeCombo){\n this.filteredLocationResults$ = this.searchLocationCtrl.valueChanges\n .pipe(\n tap(()=>{ \n this.loadingSearchLocation = true;\n }),\n debounceTime(0),\n startWith(''),\n switchMap(value => {\n\n let options = this.filterDefaultLocations(value);\n\n this.loadingSearchLocation = false;\n this.highlightValue = (typeof value === 'string')\n ? value.toLowerCase()\n : value.nombre.toLowerCase();\n this.filteredLocationResultsCount = options.length;\n\n return of(options);\n })\n );\n }\n else{\n\n this.filteredLocationResults$ = this.searchLocationCtrl.valueChanges\n .pipe(\n tap(()=>{ \n this.loadingSearchLocation = true;\n }),\n debounceTime(0),\n startWith(''),\n switchMap(value =>\n this.filterLocations(value)\n .pipe(\n map(results => {\n this.loadingSearchLocation = false;\n\n this.highlightValue = !!value \n ? (typeof value === 'string')\n ? value.toLowerCase()\n : value.nombre.toLowerCase()\n : '';\n\n this.filteredLocationResultsCount = results.length;\n\n return results;\n })\n )\n )\n );\n }\n } \n\n filterDefaultLocations(value:any):LocationSearchResultGroup[]{\n\n let optionsGrouped = this.getLocationSearchGroupByDefault();\n\n if(value){\n\n const textValue = (typeof value === 'string')\n ? value.toLowerCase()\n : value.nombre.toLowerCase();\n\n optionsGrouped = optionsGrouped.filter(og => og.results.filter(r => r.nombre.toLowerCase().includes(textValue)).length > 0);\n\n optionsGrouped.forEach(og => {\n og.results = og.results.filter(r => r.nombre.toLowerCase().includes(textValue));\n });\n\n return optionsGrouped;\n }\n else{\n return optionsGrouped;\n }\n } \n\n filterProviders(value:any):Observable {\n\n if(value instanceof DoctorSearchResult){\n return of([value]);\n }\n else if(value){\n value = value.trim(); \n }\n \n if(!this.autocompleteOpen)\n return of([]);\n\n if((!value || value == '') && this.model.profilesDefault.length > 0){\n return of(this.getProfilesDefault());\n }\n else{\n\n let _profileSearchTypes = this.model.profileTypes.split(\",\").map(pt => +pt);\n\n return this.doctorService.searchDoctors(this.locale.language, value, this.companyName, _profileSearchTypes);\n }\n }\n\n filterLocations(value:any):Observable{\n value = value ? (typeof value === 'string') ? value.trim() : value.nombre.trim() : '';\n\n if(!this.locationAutocompleteOpen)\n return of([]);\n\n if((!value || value == '') && this.model.locationsDefault != null){\n return of(this.getLocationSearchGroupByDefault());\n }\n else{\n return this.getLocationsByLevels(value);\n }\n }\n\n removeSearchProviderSelected(){\n this.removingSelection = true;\n\n this.searchProviderCtrl.reset('');\n\n if(this.searchInput){\n this.searchInput.nativeElement.value = '';\n }\n\n this.providerSelected = null;\n\n if(this.searchOpened && this.model.profilesDefault.length > 0) {\n setTimeout(()=>{\n this.autocompleteOpen = true;\n this.autocompleteProviderTrigger.openPanel();\n this.autocompleteProviderTrigger._onChange('');\n this.autocompleteProviderTrigger.updatePosition();\n }, 100);\n }\n\n setTimeout(() => {\n this.removingSelection = false;\n }, 100);\n\n if(this.isSearchDefault()){\n this.fireSearchEvent();\n }\n }\n\n removeSearchLocationSelected(){\n this.removingSelection = true;\n\n this.searchLocationCtrl.reset('');\n\n if(this.searchLocationInput){\n this.searchLocationInput.nativeElement.value = '';\n }\n\n this.locationObjectSelected = null;\n\n if(this.searchOpened && this.model.locationsDefault != null) {\n setTimeout(()=>{\n this.locationAutocompleteOpen = true;\n this.autocompleteLocationTrigger.openPanel();\n this.autocompleteLocationTrigger._onChange('');\n this.autocompleteLocationTrigger.updatePosition();\n }, 100);\n }\n\n setTimeout(() => {\n this.removingSelection = false;\n }, 100);\n\n if(this.isSearchDefault()){\n this.fireSearchEvent();\n }\n }\n\n removeSearchInsuranceSelected(){\n \n this.removingSelection = true;\n\n this.searchInsuranceCtrl.reset('');\n\n if(this.searchInsuranceInput){\n this.searchInsuranceInput.nativeElement.value = '';\n }\n\n this.insuranceObjectSelected = null;\n\n //if(this.searchOpened && this.model.insurersDefault != null) {\n if (this.searchOpened && this.insuranceUnfilteredResults != null) {\n setTimeout(()=>{\n this.insuranceAutocompleteOpen = true;\n this.autocompleteInsuranceTrigger.openPanel();\n this.autocompleteInsuranceTrigger._onChange('');\n this.autocompleteInsuranceTrigger.updatePosition();\n }, 100);\n }\n\n setTimeout(() => {\n this.removingSelection = false;\n }, 100);\n\n if(this.isSearchDefault()){\n this.fireSearchEvent();\n }\n } \n\n groupProviderResults(results: DoctorSearchResult[]): DoctorSearchResultGroup[]{\n let _resultGroup:DoctorSearchResultGroup[] = [];\n\n let _resultsGrouped = this.utilsService.groupBy(results, sd => sd.claseId);\n\n _resultsGrouped.forEach((value: DoctorSearchResult[], key: number)=>{\n let resultGroupItem = new DoctorSearchResultGroup();\n\n resultGroupItem.classId = key;\n resultGroupItem.className = this.getOptgroupLabelProvider(value[0].clase);\n resultGroupItem.results = value;\n\n _resultGroup.push(resultGroupItem);\n });\n\n return _resultGroup;\n }\n\n getOptgroupLabelProvider(text:string){\n let optgroupFocusAreaText:string = this.translation.translate('shared.searchResults.searchProvidersV2.optgroupFocusArea');\n let optgroupDoctorText: string = this.translation.translate('shared.searchResults.searchProvidersV2.optgroupDoctor');\n\n switch(text.toLocaleLowerCase()){\n case optgroupFocusAreaText:\n return this.translation.translate('shared.searchResults.searchProvidersV2.optgroupExpertIn');\n case optgroupDoctorText:\n return this.translation.translate('shared.searchResults.searchProvidersV2.optgroupDoctors');\n default:\n return text;\n }\n }\n\n profileSelected(event: MatAutocompleteSelectedEvent): void {\n this.loadingSearchProvider = false;\n\n let _optionSelected:DoctorSearchResult = event.option.value;\n let _clase = _optionSelected.clase.toLowerCase();\n\n if(_clase == 'doctor' || _clase == 'proveedor'){\n let url = this.publicProfileService.getPublicProfileUrl(_optionSelected.url);\n \n this.triggerOpenPublicProfileByType(url);\n }\n else {\n this.providerSelected = _optionSelected;\n\n if(this.isMobile || this.fullsize){\n this.searchInput.nativeElement.blur();\n }\n else if (this.model.showLocationsAutocomplete){\n setTimeout(()=>{\n this.autocompleteLocationTrigger.openPanel();\n this.searchLocationInput.nativeElement.focus();\n }, 100);\n }\n else if(this.model.showInsurersAutocomplete){\n setTimeout(()=>{\n this.autocompleteInsuranceTrigger.openPanel();\n this.searchInsuranceInput.nativeElement.focus();\n }, 100);\n }\n else {\n this.fireSearchEvent();\n this.closeSearch();\n }\n }\n }\n\n gotoProfile(doctor: AppointmentDoctor){\n this.autocompleteOpen = false;\n this.autocompleteProviderTrigger.closePanel();\n \n let url = this.publicProfileService.getPublicProfileUrl(doctor.identificadorPerfilPublico);\n \n this.triggerOpenPublicProfileByType(url);\n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.isMobile = this.isBrowser && event.target.innerWidth <= this.mobileDelimiter;\n }\n\n @HostListener('scroll', ['$event'])\n onScroll(e: Event) {\n this.searchInputBlur(this.searchInput.nativeElement);\n this.searchInputBlur(this.searchLocationInput.nativeElement);\n this.searchInputBlur(this.searchInsuranceInput.nativeElement);\n }\n\n locationSelected(event: MatAutocompleteSelectedEvent): void {\n this.loadingSearchLocation = false;\n\n let _optionSelected:LocationSearchResultItem = event.option.value;\n\n this.locationObjectSelected = _optionSelected;\n\n if(this.isMobile || this.fullsize){\n this.searchLocationInput.nativeElement.blur();\n }\n else if(this.model.showInsurersAutocomplete){\n setTimeout(()=>{\n this.autocompleteInsuranceTrigger.openPanel();\n this.searchInsuranceInput.nativeElement.focus();\n }, 100);\n }\n else {\n this.fireSearchEvent();\n this.closeSearch();\n }\n }\n\n insuranceSelected(event: MatAutocompleteSelectedEvent): void {\n this.loadingSearchInsurance = false;\n\n let _optionSelected:ProfileFilterSearchResultConcept = event.option.value;\n\n this.insuranceObjectSelected = _optionSelected;\n\n if(this.isMobile || this.fullsize){\n this.searchInsuranceInput.nativeElement.blur();\n }\n else{\n this.fireSearchEvent();\n this.closeSearch();\n }\n }\n\n autoCompleteProviderDisplayWith(item: DoctorSearchResult){\n return item \n ? item.nombre \n : \"\";\n }\n\n autoCompleteLocationDisplayWith(item: TerritorialDivision){\n return item \n ? item.nombre \n : \"\";\n }\n\n autoCompleteInsuranceDisplayWith(item: ProfileFilterSearchResultConcept){\n return item \n ? item.n_cc \n : \"\";\n }\n\n onKeydownInputSearch($event: KeyboardEvent){\n if($event.key !== 'Enter'){\n this.providerSelected = null;\n }\n }\n\n onKeydownInputLocationSearch($event: KeyboardEvent){\n if($event.key !== 'Enter'){\n this.locationObjectSelected = null;\n }\n }\n\n onKeydownInputInsuranceSearch($event: KeyboardEvent){\n if($event.key !== 'Enter'){\n this.insuranceObjectSelected = null;\n }\n }\n\n onFocusInputSearch(){\n\n this.autocompleteOpen = true;\n\n // ejecutar la busqueda del autocomplete si el input tiene un texto\n if(this.searchInput.nativeElement.value){\n this.autocompleteProviderTrigger._onChange(this.searchInput.nativeElement.value);\n }\n // si no tiene texto y valores por defecto, se agrega un timeout para que reposicione el dropdown\n else if(this.model.profilesDefault.length > 0) {\n setTimeout(()=>{\n this.autocompleteProviderTrigger._onChange('');\n this.autocompleteProviderTrigger.updatePosition();\n }, 100);\n }\n }\n\n onFocusInputLocationSearch(){\n this.locationAutocompleteOpen = true;\n\n // ejecutar la busqueda del autocomplete si el input tiene un texto\n if(this.searchLocationInput.nativeElement.value){\n this.autocompleteLocationTrigger._onChange(this.searchLocationInput.nativeElement.value);\n }\n // si no tiene texto y valores por defecto, se agrega un timeout para que reposicione el dropdown\n else if(this.model.locationsDefault != null) {\n setTimeout(()=>{\n this.autocompleteLocationTrigger._onChange('');\n this.autocompleteLocationTrigger.updatePosition();\n }, 100);\n }\n\n // ajuste para IOS\n if(this.isBrowser && this.isMobile){\n setTimeout(() => {\n window.scroll(0,0);\n }, 200);\n }\n } \n\n onBlurInputSearch(){\n if(this.isMobile || this.lastestDoctors.length > 0)\n return;\n\n this.autocompleteOpen = false;\n\n if(!this.searchInput.nativeElement.value){\n this.searchProviderCtrl.setValue(null);\n this.providerSelected = null;\n }\n }\n\n onBlurInputLocationSearch(){\n\n if(this.isMobile)\n return;\n\n setTimeout(() => {\n \n this.locationAutocompleteOpen = false;\n\n if(!this.searchLocationInput.nativeElement.value){\n this.searchLocationCtrl.setValue(null);\n this.locationObjectSelected = null;\n }\n }, 100);\n\n }\n \n onBlurInputInsuranceSearch(){\n if(this.isMobile)\n return;\n \n setTimeout(() => {\n this.insuranceAutocompleteOpen = false;\n\n if(!this.searchInsuranceInput.nativeElement.value){\n this.searchInsuranceCtrl.setValue(null);\n this.insuranceObjectSelected = null;\n }\n }, 100);\n }\n\n onCancelMobile(){\n event?.stopPropagation();\n\n this.autocompleteOpen = false;\n this.locationAutocompleteOpen = false;\n this.insuranceAutocompleteOpen = false;\n this.autocompleteProviderTrigger.closePanel();\n this.autocompleteLocationTrigger.closePanel();\n this.autocompleteInsuranceTrigger.closePanel();\n this.searchInputBlur(this.searchInput.nativeElement);\n this.searchInputBlur(this.searchLocationInput.nativeElement);\n this.searchInputBlur(this.searchInsuranceInput.nativeElement);\n }\n\n onClickSearchTextMobile(){\n this.autocompleteOpen = false;\n this.autocompleteProviderTrigger.closePanel();\n }\n\n autocompleteOpened():void{\n if(this.isMobile)\n setTimeout(() => {\n this.matAutocomplete.panel.nativeElement.classList.add('opened');\n this.inputWrapperProvider.nativeElement.classList.add('opened');\n }, 300);\n\n this.autocompleteOpen = true;\n\n if(!this.searchOpened)\n this.sendMessageIframeResizeOpen();\n }\n\n autocompleteClosed() {\n if(this.isMobile && this.removingSelection)\n return;\n\n if(this.isMobile){\n this.matAutocomplete.panel.nativeElement.classList.remove('opened');\n this.inputWrapperProvider.nativeElement.classList.remove('opened');\n }\n\n this.autocompleteOpen = false;\n this.searchInputBlur(this.searchInput.nativeElement);\n\n if(!this.isMobile && !this.searchOpened && !(this.locationAutocompleteOpen && this.insuranceAutocompleteOpen))\n this.sendMessageIframeResizeClose();\n }\n\n autocompleteLocationOpened():void{\n if(this.isMobile){ \n setTimeout(() => {\n this.matAutocompleteLocation.panel.nativeElement.classList.add('opened');\n this.inputWrapperLocation.nativeElement.classList.add('opened');\n }, 300);\n }\n\n this.locationAutocompleteOpen = true;\n\n if(!this.searchOpened)\n this.sendMessageIframeResizeOpen();\n }\n\n autocompleteLocationClosed() {\n if(this.isMobile && this.removingSelection)\n return;\n\n if(this.isMobile){\n this.matAutocompleteLocation.panel.nativeElement.classList.remove('opened');\n this.inputWrapperLocation.nativeElement.classList.remove('opened');\n }\n \n this.locationAutocompleteOpen = false;\n this.searchInputBlur(this.searchLocationInput.nativeElement);\n\n if(!this.isMobile && !this.searchOpened && !(this.autocompleteOpen && this.insuranceAutocompleteOpen))\n this.sendMessageIframeResizeClose();\n }\n\n autocompleteInsuranceOpened():void{\n\n if(this.isMobile)\n setTimeout(() => {\n this.matAutocompleteInsurance.panel.nativeElement.classList.add('opened');\n this.inputWrapperInsurance.nativeElement.classList.add('opened');\n }, 300);\n\n this.insuranceAutocompleteOpen = true;\n\n if(!this.searchOpened)\n this.sendMessageIframeResizeOpen();\n\n this.searchInputBlur(this.searchInsuranceInput.nativeElement);\n }\n\n autocompleteInsuranceClosed() {\n if(this.isMobile && this.removingSelection)\n return;\n\n if(this.isMobile){\n this.matAutocompleteInsurance.panel.nativeElement.classList.remove('opened');\n this.inputWrapperInsurance.nativeElement.classList.remove('opened');\n }\n \n this.insuranceAutocompleteOpen = false;\n\n if(!this.isMobile && !this.searchOpened && !(this.locationAutocompleteOpen && this.autocompleteOpen))\n this.sendMessageIframeResizeClose();\n }\n\n showIconDropdownOption(item:DoctorSearchResult){\n return item.claseId == ClassConcept.ESPECIALIDAD\n || item.claseId == ClassConcept.DIAGNOSTICO\n || item.claseId == ClassConcept.AREAS_DE_ENFOQUE\n || item.claseId == ClassConcept.PROCEDIMIENTO;\n }\n\n getIconClassNameDropdownOption(item:DoctorSearchResult){\n let iconClassName = 'phr-iconset-';\n\n switch(item.claseId){\n case ClassConcept.ESPECIALIDAD:\n iconClassName += 'estetoscopio';\n break;\n case ClassConcept.DIAGNOSTICO:\n iconClassName += 'info-general2';\n break;\n case ClassConcept.AREAS_DE_ENFOQUE:\n iconClassName += 'medal';\n break;\n case ClassConcept.PROCEDIMIENTO:\n iconClassName += 'procedimientos';\n break;\n default:\n break;\n }\n\n return iconClassName;\n }\n\n showAvatarDropdownOption(item:DoctorSearchResult){\n return item.claseId == 0;\n }\n\n showDescriptionDropdownOption(item:DoctorSearchResult){\n return item.claseId == 0;\n }\n\n isDoctor(item:DoctorSearchResult) {\n return item.tipoPerfilPublico == PublicProfileType.Doctor;\n }\n\n getProfileTypeIconClassName(item:DoctorSearchResult){\n\n let profileType = item.tipoPerfilPublico;\n let className: string = 'phr-iconset-';\n\n switch(profileType){\n case PublicProfileType.Doctor:\n default:\n className += 'estetoscopio';\n break;\n case PublicProfileType.Farmacia:\n className += 'farmacia';\n break;\n case PublicProfileType.Clinica:\n className += 'hospital';\n break;\n case PublicProfileType.Fisioterapia:\n className += 'fisioterapia';\n break;\n case PublicProfileType.Laboratorio:\n className += 'laboratorios';\n break;\n case PublicProfileType.CentroDeImagenes:\n className += 'imagenologia';\n break; \n case PublicProfileType.ServiciosOdontologicos:\n className += 'odontologia';\n break;\n case PublicProfileType.Opticas:\n className += 'open-eye';\n break;\n }\n\n return className;\n }\n\n onClickSearchButton(){\n event?.stopPropagation();\n\n this.closeSearch();\n this.fireSearchEvent();\n }\n \n getPlaceholderProvider() {\n let result = '';\n\n if (this.model) {\n if (this.isMobile && this.model.profilesLabel) {\n if (this.autocompleteOpen == true) \n result = this.layoutService.getTextByLanguage(this.model.profilesPlaceholderOpened, this.locale.language);\n else \n result = this.layoutService.getTextByLanguage(this.model.profilesLabel, this.locale.language);\n } \n else if (!this.isMobile && this.model.profilesPlaceholderOpened)\n result = this.layoutService.getTextByLanguage(this.model.profilesPlaceholderOpened, this.locale.language); \n }\n\n /*return this.model && this.model.profilesPlaceholderOpened \n ? this.layoutService.getTextByLanguage(this.model.profilesPlaceholderOpened, this.locale.language)\n : '';*/\n \n return result;\n }\n\n getPlaceholderLocation(){\n let result = '';\n let optionalText = \" \" + this.translation.translate('shared.searchResults.searchProvidersV2.optionalText');\n\n if (this.model) {\n if (this.isMobile && this.model.locationsLabel) {\n if (this.locationAutocompleteOpen == true)\n result = this.layoutService.getTextByLanguage(this.model.locationsPlaceholderOpened, this.locale.language);\n else\n result = this.layoutService.getTextByLanguage(this.model.locationsLabel, this.locale.language) + optionalText;\n }\n else if (!this.isMobile && this.model.locationsPlaceholderOpened)\n result = this.layoutService.getTextByLanguage(this.model.locationsPlaceholderOpened, this.locale.language); \n }\n\n return result;\n\n /*return this.model && this.model.locationsPlaceholderOpened \n ? this.layoutService.getTextByLanguage(this.model.locationsPlaceholderOpened, this.locale.language)\n : '';*/\n }\n\n showPreviewProviderPlaceholder(){\n return this.providerSelected == null \n && !(this.searchInput \n && this.searchInput.nativeElement \n && this.searchInput.nativeElement.value);\n }\n\n showPreviewProviderValue(){\n return this.providerSelected != null \n || (this.searchInput \n && this.searchInput.nativeElement \n && this.searchInput.nativeElement.value);\n }\n\n getPreviewProviderValue(){\n return this.providerSelected \n ? this.providerSelected.nombre \n : this.searchInput.nativeElement.value;\n }\n\n showPreviewLocationPlaceholder(){\n return this.locationObjectSelected == null \n && !(this.searchLocationInput \n && this.searchLocationInput.nativeElement \n && this.searchLocationInput.nativeElement.value);\n }\n\n showPreviewLocationValue(){\n return this.locationObjectSelected != null \n || (this.searchLocationInput \n && this.searchLocationInput.nativeElement \n && this.searchLocationInput.nativeElement.value);\n }\n\n showButtonRemoveProvider(){\n return this.providerSelected\n || (this.searchInput \n && this.searchInput.nativeElement \n && this.searchInput.nativeElement.value);\n }\n\n showButtonRemoveLocation(){\n return this.locationObjectSelected\n || (this.searchLocationInput \n && this.searchLocationInput.nativeElement \n && this.searchLocationInput.nativeElement.value);\n }\n\n showHeaderMobile(){\n return !this.autocompleteOpen && !this.locationAutocompleteOpen && !this.insuranceAutocompleteOpen;\n }\n\n getPreviewLocationValue(){\n return this.locationObjectSelected \n ? this.locationObjectSelected.nombre \n : this.searchLocationInput.nativeElement.value;\n }\n\n onFocusProvider(){\n this.openSearch();\n\n setTimeout(()=>{\n this.autocompleteProviderTrigger.openPanel();\n this.searchInput.nativeElement.focus();\n }, 100);\n }\n\n clearProviderSelected(){\n this.removeSearchProviderSelected();\n\n this.onFocusProvider();\n }\n\n sendMessageIframeResizeOpen(){\n\n this.fullsize = this.isMobile;\n\n var message = this.isMobile\n ? { height: \"100vh\", fullsize: true }\n : { height: \"600px\" };\n\n if(this.isBrowser){\n window.parent.postMessage(message, '*');\n } \n }\n\n sendMessageIframeResizeClose(){\n var message = this.isMobile\n ? { height: \"100px\", fullsize: false }\n : { height: \"100px\" };\n\n if(this.isBrowser){\n window.parent.postMessage(message, '*');\n }\n }\n\n onFocusLocation(){\n this.openSearch();\n\n setTimeout(()=>{\n this.autocompleteLocationTrigger.openPanel();\n this.searchLocationInput.nativeElement.focus();\n }, 100);\n\n this.sendMessageIframeResizeOpen();\n }\n\n clearLocationSelected(){\n this.removeSearchLocationSelected();\n\n this.onFocusLocation();\n }\n\n onFocusInsurance(){\n this.openSearch();\n\n setTimeout(()=>{\n this.autocompleteInsuranceTrigger.openPanel();\n this.searchInsuranceInput.nativeElement.focus();\n }, 100); \n }\n\n clearInsuranceSelected(){\n this.removeSearchInsuranceSelected();\n\n this.onFocusInsurance();\n }\n\n clearSearchSelected(){\n // this.openSearch();\n\n this.searchProviderCtrl.reset('');\n this.searchLocationCtrl.reset('');\n this.searchInsuranceCtrl.reset('');\n\n if(this.searchInput){\n this.searchInput.nativeElement.value = '';\n }\n\n if(this.searchLocationInput){\n this.searchLocationInput.nativeElement.value = '';\n }\n\n if(this.searchInsuranceInput){\n this.searchInsuranceInput.nativeElement.value = '';\n }\n\n this.providerSelected = null;\n this.locationObjectSelected = null;\n this.insuranceObjectSelected = null;\n\n if(this.isSearchDefault())\n this.fireSearchEvent();\n }\n\n isPopup(){\n return this.model.searchType == SearchProvidersType.POPUP;\n }\n\n isWidget(){\n return this.model.searchType == SearchProvidersType.WIDGET;\n }\n\n isSearchDefault(){\n return this.model.searchType == SearchProvidersType.DEFAULT;\n }\n\n openSearch(){\n this.searchOpened = true;\n\n this.document.body.classList.add('search-opened');\n\n this.layoutService.overflowBodyDisabled();\n\n this.sendMessageIframeResizeOpen();\n }\n\n onClickMobilePreview(){\n this.openSearch();\n\n if(!this.isMobile){\n\n setTimeout(()=>{\n this.autocompleteProviderTrigger.openPanel();\n this.searchInput.nativeElement.focus();\n }, 100);\n }\n }\n\n closeDropdownProvider(){\n this.autocompleteOpen = false;\n this.autocompleteProviderTrigger.closePanel();\n }\n\n closeDropdownLocation(){\n this.locationAutocompleteOpen = false;\n this.autocompleteLocationTrigger.closePanel();\n }\n\n closeDropdownInsurance(){\n this.insuranceAutocompleteOpen = false;\n this.autocompleteInsuranceTrigger.closePanel();\n }\n\n closeSearch(){\n this.searchOpened = false;\n\n this.document.body.classList.remove('search-opened');\n\n this.layoutService.overflowBodyEnabled();\n\n if(this.model.searchType == SearchProvidersType.POPUP){\n this.document.body.classList.remove('search-providers-v2');\n } \n\n this.autocompleteOpen = false;\n this.autocompleteProviderTrigger.closePanel();\n\n if(this.model.showLocationsAutocomplete){\n this.locationAutocompleteOpen = false;\n this.autocompleteLocationTrigger.closePanel();\n }\n\n if(this.model.showInsurersAutocomplete){\n this.insuranceAutocompleteOpen = false;\n this.autocompleteInsuranceTrigger.closePanel();\n }\n\n this.sendMessageIframeResizeClose();\n }\n\n showSearchPlaceholderMobile(){\n return this.providerSelected == null \n && !(this.searchInput && this.searchInput.nativeElement && this.searchInput.nativeElement.value)\n && (!this.model.showLocationsAutocomplete || this.locationObjectSelected == null)\n && (!this.model.showInsurersAutocomplete || this.insuranceObjectSelected == null);\n }\n\n getSelectionTextMobile(){\n let result = '';\n \n if(this.providerSelected){\n result += this.providerSelected.nombre;\n }\n else if(this.searchInput && this.searchInput.nativeElement && this.searchInput.nativeElement.value){\n result += this.searchInput.nativeElement.value;\n }\n \n if(this.locationObjectSelected){\n result = result \n ? result + ', ' + this.locationObjectSelected.nombre\n : this.locationObjectSelected.nombre;\n }\n\n if(this.insuranceObjectSelected){\n result = result \n ? result + ', ' + this.insuranceObjectSelected.n_cc\n : this.insuranceObjectSelected.n_cc; \n }\n return result;\n }\n\n getPlaceholderInsurance() {\n let result = '';\n let optionalText = \" \" + this.translation.translate('shared.searchResults.searchProvidersV2.optionalText');\n\n if (this.model) {\n if (this.isMobile && this.model.insurersLabel) {\n /*if (this.insuranceAutocompleteOpen == true)\n result = this.layoutService.getTextByLanguage(this.model.insurersPlaceholderOpened, this.locale.language);\n else \n result = this.layoutService.getTextByLanguage(this.model.insurersLabel, this.locale.language) + optionalText;*/\n \n result = this.layoutService.getTextByLanguage(this.model.insurersLabel, this.locale.language) + optionalText;\n }\n else if (!this.isMobile && this.model.insurersPlaceholderOpened)\n result = this.layoutService.getTextByLanguage(this.model.insurersPlaceholderOpened, this.locale.language); \n }\n\n return result;\n\n /*return this.model && this.model.insurersPlaceholderOpened \n ? this.layoutService.getTextByLanguage(this.model.insurersPlaceholderOpened, this.locale.language)\n : '';*/\n }\n\n getAvatarModel(item:DoctorSearchResult) : PublicProfileAvatarComponentModel {\n var avatarModel = new PublicProfileAvatarComponentModel();\n\n avatarModel.personId = item.idPersona;\n avatarModel.avatarUrl = item.urlImagen;\n avatarModel.fullName = item.nombre;\n avatarModel.sex = item.sexo;\n avatarModel.profileType = item.tipoPerfilPublico; \n avatarModel.useAvatarPadding = false;\n\n return avatarModel;\n }\n\n getAvatarModelByLastestDoctor(item:AppointmentDoctor) : PublicProfileAvatarComponentModel {\n var avatarModel = new PublicProfileAvatarComponentModel();\n\n avatarModel.personId = item.idResponsableServicio;\n avatarModel.avatarUrl = item.urlAvatarResponsableServicio;\n avatarModel.fullName = item.nombreResponsableServicio;\n avatarModel.sex = item.sexoResponsableServicio;\n avatarModel.profileType = PublicProfileType.Doctor;\n\n return avatarModel;\n }\n\n prevLastestDoctors(){\n if (this.lastestDoctorsIndex > 0) {\n this.lastestDoctorsIndex -= this.maxLastestDoctorsToShow;\n }\n }\n\n nextLastestDoctors(){\n if (this.lastestDoctorsIndex + this.maxLastestDoctorsToShow < this.lastestDoctors.length) {\n this.lastestDoctorsIndex += this.maxLastestDoctorsToShow;\n }\n }\n\n showLastestDoctors(){\n return (this.loadingLastestDoctors || this.lastestDoctors.length > 0) && this.searchInput && !this.searchInput.nativeElement.value;\n }\n\n showSearchTextOption(){\n return this.providerSelected == null \n && this.searchInput \n && this.searchInput.nativeElement \n && this.searchInput.nativeElement.value\n && this.filteredResultsCount > 0;\n }\n\n getSearchTextOption(){\n return this.searchInput \n && this.searchInput.nativeElement \n && this.searchInput.nativeElement.value\n ? this.searchInput.nativeElement.value\n : \"\";\n }\n\n private parseControlData(){\n if(this.data && this.data.valor){\n try {\n var asd = JSON.parse(this.data.valor);\n\n this.model = new SearchProvidersConfiguration(JSON.parse(this.data.valor));\n } catch (ex) {} \n } \n }\n\n private populateDropdownByParams(paramMap:SearchQsParamMapModel, qsParams: SearchQsParametersModel){\n if(paramMap.param1){\n let _locationObjectSelected = new LocationSearchResultItem();\n\n if(paramMap.param1 == \"texto\"){\n this.searchProviderCtrl.setValue({ nombre: qsParams.t });\n\n // carga de dropdown localidad\n if(paramMap.param4){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}/${paramMap.param4}`;\n _locationObjectSelected.nombre = paramMap.param4.replace(/-/g, ' ');\n }\n else if(paramMap.param3){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}`;\n _locationObjectSelected.nombre = paramMap.param3.replace(/-/g, ' ');\n }\n else if(paramMap.param2){\n _locationObjectSelected.url = `${paramMap.param2}`;\n _locationObjectSelected.nombre = paramMap.param2.replace(/-/g, ' ');\n }\n }\n // caso de que se selecciono localidad y el dropdown de proveedores no.\n else if(paramMap.param1 == \"todos\"){\n if(paramMap.param4){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}/${paramMap.param4}`;\n _locationObjectSelected.nombre = paramMap.param4.replace(/-/g, ' ');\n }\n else if(paramMap.param3){\n _locationObjectSelected.url = `${paramMap.param2}/${paramMap.param3}`;\n _locationObjectSelected.nombre = paramMap.param3.replace(/-/g, ' ');\n }\n else{\n _locationObjectSelected.url = `${paramMap.param2}`;\n _locationObjectSelected.nombre = paramMap.param2.replace(/-/g, ' ');\n } \n }\n else {\n this.providerSelected = new DoctorSearchResult();\n this.providerSelected.nombre = paramMap.param2.replace(/-/g, ' ');\n this.providerSelected.url = `/${paramMap.param1}/${paramMap.param2}`;\n\n if(qsParams.idC)\n this.providerSelected.id = +qsParams.idC;\n\n if(qsParams.idTc)\n this.providerSelected.claseId = +qsParams.idTc;\n\n this.searchProviderCtrl.setValue(this.providerSelected);\n\n // carga de dropdown localidad\n if(paramMap.param5){\n _locationObjectSelected.url = `${paramMap.param3}/${paramMap.param4}/${paramMap.param5}`;\n _locationObjectSelected.nombre = paramMap.param5.replace(/-/g, ' ');\n }\n else if(paramMap.param4) {\n _locationObjectSelected.url = `${paramMap.param3}/${paramMap.param4}`;\n _locationObjectSelected.nombre = paramMap.param4.replace(/-/g, ' ');\n }\n else if(paramMap.param3){\n _locationObjectSelected.url = `${paramMap.param3}`;\n _locationObjectSelected.nombre = paramMap.param3.replace(/-/g, ' ');\n }\n }\n\n if(this.locationDefault && qsParams && qsParams.filtros){\n\n let conceptIds = qsParams.filtros.split(',').map(Number);\n let conceptSelected = this.locationDefault.seccion3.find(c=> conceptIds.includes(c.id));\n\n if(!conceptSelected) {\n let concept = this.locationDefault.seccion1.find(c=> conceptIds.includes(c.id));\n \n if (concept) {\n conceptSelected = new TerritorialDivision();\n conceptSelected.id = concept.id;\n\n let name = concept.nombre.find(l => l.lenguaje == this.locale.language);\n conceptSelected.nombre = name? name.texto : \"\";\n } \n }\n\n if(conceptSelected){\n _locationObjectSelected = new LocationSearchResultItem();\n _locationObjectSelected.id = conceptSelected.id;\n _locationObjectSelected.nombre = this.layoutService.getTextByLanguage(conceptSelected.nombre, this.locale.language);\n }\n }\n\n if(_locationObjectSelected.nombre){\n this.locationObjectSelected = _locationObjectSelected;\n this.searchLocationCtrl.setValue(this.locationObjectSelected);\n }\n\n if (!this.providerSearchMessage) {\n let territorialDivisionIdentification = this.locationObjectSelected? this.locationObjectSelected.url : \"\";\n\n this.providerSearchMessage = new ProviderSearchMessage();\n this.providerSearchMessage.filtros = this.qsParams.filtros;\n this.providerSearchMessage.territorialDivisionIdentification = territorialDivisionIdentification;\n this.providerSearchMessage.countryIdentification = this.searchCountry?.identificador;\n this.providerSearchMessage.searchText = this.qsParams.t;\n this.providerSearchMessage.conceptId = this.qsParams.idC? parseInt(this.qsParams.idC) : 0;\n this.providerSearchMessage.conceptClaseId = this.qsParams.idTc? parseInt(this.qsParams.idTc) : 0;\n }\n\n this.setInsuranceBaseOnQueryParams();\n }\n }\n\n private initEmptyProviderSearchMessage() {\n this.providerSearchMessage = new ProviderSearchMessage();\n this.providerSearchMessage.countryIdentification = this.searchCountry?.identificador;\n }\n\n private setInsuranceBaseOnQueryParams() {\n if(this.qsParams && this.qsParams.filtros) {\n this.loadFilters().subscribe(filters => {\n //if(this.model.insurersDefault && this.qsParams && this.qsParams.filtros){\n \n if(this.insuranceUnfilteredResults){\n let conceptIds = this.qsParams.filtros.split(',').map(Number);\n /*let conceptSelected = this.model.insurersDefault.find(c=> conceptIds.includes(c.id));\n\n if(conceptSelected) {\n this.insuranceObjectSelected = new ProfileFilterSearchResultConcept();\n this.insuranceObjectSelected.cc = conceptSelected.id;\n this.insuranceObjectSelected.n_cc = this.layoutService.getTextByLanguage(conceptSelected.nombre, this.locale.language);\n\n this.searchInsuranceCtrl.setValue(this.insuranceObjectSelected);\n }*/\n\n let conceptSelected = this.insuranceUnfilteredResults.find(c=> conceptIds.includes(c.cc));\n\n if(conceptSelected) {\n this.insuranceObjectSelected = conceptSelected;\n\n this.searchInsuranceCtrl.setValue(this.insuranceObjectSelected);\n }\n }\n });\n }\n }\n\n private getProfilesDefault(){\n return (this.model.profilesDefault && this.model.profilesDefault.length > 0)\n ? this.model.profilesDefault.map(cd => {\n let doctorSearchResult = new DoctorSearchResult();\n doctorSearchResult.id = cd.id;\n doctorSearchResult.claseId = cd.claseId;\n doctorSearchResult.clase = this.translation.translate('shared.searchResults.searchProvidersV2.suggestionsText');\n doctorSearchResult.nombre = this.layoutService.getTextByLanguage(cd.nombre, this.locale.language);\n doctorSearchResult.descripcion = this.layoutService.getTextByLanguage(cd.descripcion, this.locale.language);\n doctorSearchResult.url = cd.url;\n doctorSearchResult.urlImagen = cd.urlImagen;\n\n return doctorSearchResult;\n })\n : [];\n } \n\n private fireSearchEvent(){\n let _searchText = this.searchInput \n ? this.searchInput.nativeElement.value.trim()\n : '';\n\n let _providerSearchMessage = new ProviderSearchMessage();\n\n _providerSearchMessage.countryIdentification = this.searchCountry.identificador;\n\n if(this.providerSelected){\n _providerSearchMessage.conceptNav = this.providerSelected.url;\n _providerSearchMessage.conceptId = this.providerSelected.id;\n _providerSearchMessage.conceptClaseId = this.providerSelected.claseId;\n }\n else {\n _providerSearchMessage.searchText = _searchText;\n }\n\n if(this.locationObjectSelected){\n if(this.locationObjectSelected.url){\n _providerSearchMessage.territorialDivisionIdentification = this.locationObjectSelected.url;\n }\n else {\n _providerSearchMessage.filtros = this.locationObjectSelected.id.toString();\n }\n }\n else{\n this.searchLocationCtrl.reset();\n }\n\n if(this.insuranceObjectSelected){\n if(this.insuranceObjectSelected.cc > 0){\n _providerSearchMessage.filtros = _providerSearchMessage.filtros\n ? _providerSearchMessage.filtros + ',' + this.insuranceObjectSelected.cc.toString()\n : this.insuranceObjectSelected.cc.toString();\n }\n }\n else{\n this.searchInsuranceCtrl.reset();\n }\n\n if (!this.providerSearchMessage)\n this.providerSearchMessage = _providerSearchMessage;\n\n this.triggerSearchByType(_providerSearchMessage); \n }\n\n private triggerSearchByType(providerSearchMessage: ProviderSearchMessage){\n\n switch(this.model.searchType){\n case SearchProvidersType.DEFAULT:\n default:\n this.messageBusService.providerSearch(providerSearchMessage);\n break;\n case SearchProvidersType.POPUP:\n this.redirectToSearchPage(providerSearchMessage);\n break;\n case SearchProvidersType.WIDGET:\n this.goToSearhPage(providerSearchMessage);\n break;\n }\n }\n\n private triggerOpenPublicProfileByType(publicProfileUrl:string){\n switch(this.model.searchType){\n case SearchProvidersType.DEFAULT:\n case SearchProvidersType.POPUP:\n default:\n this.publicProfileService.openPublicProfile(publicProfileUrl);\n break;\n case SearchProvidersType.WIDGET:\n this.goToPublicPage(publicProfileUrl)\n break;\n }\n }\n\n private redirectToSearchPage(providerSearchMessage: ProviderSearchMessage){\n\n let searchProviderUrl = this.getRelativeSearchPath(providerSearchMessage);\n\n this.router.navigate([searchProviderUrl.url], {queryParams:searchProviderUrl.qsParams});\n }\n\n private getRelativeSearchPath(providerSearchMessage: ProviderSearchMessage):SearchProvidersUrl{\n let paramMap:SearchQsParamMapModel = new SearchQsParamMapModel();\n let qsParams:SearchQsParametersModel = new SearchQsParametersModel();\n\n // busqueda por texto\n if(providerSearchMessage.searchText){\n paramMap.param1 = 'texto';\n\n qsParams.t = providerSearchMessage.searchText;\n }\n // busqueda por concepto\n else if(providerSearchMessage.conceptNav){\n\n let conceptNavArray = providerSearchMessage.conceptNav.split('/');\n\n paramMap.param1 = conceptNavArray[1];\n paramMap.param2 = conceptNavArray[2];\n }\n else{\n paramMap.param1 = 'todos';\n }\n\n if(providerSearchMessage.territorialDivisionIdentification){\n\n let tdArray = providerSearchMessage.territorialDivisionIdentification.split('/');\n\n if(paramMap.param2){\n paramMap.param3 = tdArray[0];\n paramMap.param4 = tdArray[1] ?? '';\n paramMap.param5 = tdArray[2] ?? '';\n }\n else{\n paramMap.param2 = tdArray[0];\n paramMap.param3 = tdArray[1] ?? '';\n paramMap.param4 = tdArray[2] ?? '';\n }\n }\n\n qsParams.filtros = providerSearchMessage.filtros;\n \n let url = `${this.baseService.getLanguage()}/${this.model.searchParamMap}/${paramMap.param1}`;\n url += paramMap.param2 ? `/${paramMap.param2}` : '';\n url += paramMap.param3 ? `/${paramMap.param3}` : '';\n url += paramMap.param4 ? `/${paramMap.param4}` : '';\n url += paramMap.param5 ? `/${paramMap.param5}` : '';\n\n if (providerSearchMessage.conceptId > 0){\n qsParams.idC = providerSearchMessage.conceptId.toString();\n qsParams.idTc = providerSearchMessage.conceptClaseId.toString();\n }\n\n let searchProviderUrl = new SearchProvidersUrl();\n\n searchProviderUrl.url = url;\n searchProviderUrl.qsParams = qsParams;\n\n return searchProviderUrl;\n }\n\n private goToPublicPage(publicProfileUrl:string){\n if(this.isBrowser){\n const url = this.router.serializeUrl(\n this.router.createUrlTree([publicProfileUrl])\n );\n \n window.parent.location.href = url;\n }\n }\n\n private goToSearhPage(providerSearchMessage: ProviderSearchMessage) {\n if(this.isBrowser){\n let searchProviderUrl = this.getRelativeSearchPath(providerSearchMessage);\n\n const url = this.router.serializeUrl(\n this.router.createUrlTree([searchProviderUrl.url], {queryParams:searchProviderUrl.qsParams})\n );\n\n window.parent.location.href = url;\n }\n }\n\n private getLocationSearchGroupByDefault():LocationSearchResultGroup[]{\n let _resultGroup:LocationSearchResultGroup[] = [];\n\n if(!this.locationDefault)\n return _resultGroup; \n\n // SECCION 1\n let _section2Grouped = this.locationDefault.seccion1 && this.locationDefault.seccion1.length > 0 \n ? this.utilsService.groupBy(this.locationDefault.seccion1, sd => sd.claseId)\n : new Map();\n\n _section2Grouped.forEach((value: ConceptDefaultModel[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.layoutService.getTextByLanguage(value[0].clase, this.locale.language);\n\n resultGroupItem.results = value.map(td => { \n return {\n id: td.id,\n nombre: this.layoutService.getTextByLanguage(td.nombre, this.locale.language),\n url: \"\",\n icono: 'phr-iconset-hospital'\n };\n });\n\n _resultGroup.push(resultGroupItem);\n });\n\n // SECCION 2\n let _section1Grouped = this.locationDefault.seccion2 && this.locationDefault.seccion2.length > 0 \n ? this.utilsService.groupBy(this.locationDefault.seccion2, sd => sd.nivel)\n : new Map();\n\n _section1Grouped.forEach((value: TerritorialDivision[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.getLocationDisplayNameFromLevelDefault(key);\n\n resultGroupItem.results = value.map(td => { \n return {\n id: td.id, \n nombre: this.layoutService.getTextByLanguage(td.nombreCanonico, this.locale.language),\n url: td.identificador, \n icono: 'phr-iconset-suraplace'\n };\n });\n\n _resultGroup.push(resultGroupItem);\n });\n\n // SECCION 3\n let _section3Grouped = this.locationDefault.seccion3 && this.locationDefault.seccion3.length > 0 \n ? this.utilsService.groupBy(this.locationDefault.seccion3, sd => sd.nivel)\n : new Map();\n\n _section3Grouped.forEach((value: TerritorialDivision[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.getLocationDisplayNameFromLevelDefault(key);\n\n resultGroupItem.results = value.map(td => { \n return {\n id: td.id,\n nombre: this.layoutService.getTextByLanguage(td.nombreCanonico, this.locale.language),\n url: td.identificador,\n icono: 'phr-iconset-suraplace' \n };\n });\n\n _resultGroup.push(resultGroupItem);\n });\n\n return _resultGroup;\n }\n \n private getLocationsByLevels(value:string):Observable{\n return this.territorialDivisionsService.getByLevels(\n this.language,\n value, \n this.locationLevels,\n this.searchCountry.idPais)\n .pipe(map((results:TerritorialDivision[])=>{\n let _resultGroup:LocationSearchResultGroup[] = [];\n let _territorialDivisionGrouped = this.utilsService.groupBy(results, sd => sd.nivel);\n\n _territorialDivisionGrouped.forEach((value: TerritorialDivision[], key: number)=>{\n let resultGroupItem = new LocationSearchResultGroup();\n resultGroupItem.id = key;\n resultGroupItem.displayName = this.getLocationDisplayNameFromLevel(key);\n \n resultGroupItem.results = value.map(td => { \n return {id: td.id, nombre: td.nombreCanonico, url: td.identificador, icono: 'phr-iconset-suraplace' };\n });\n \n _resultGroup.push(resultGroupItem);\n });\n\n return _resultGroup;\n }));\n }\n\n private getLocationDisplayNameFromLevel(level: number) {\n return level == 1 ? this.countryText : (level == 2 ? this.stateText : this.cityText);\n }\n\n private getLocationDisplayNameFromLevelDefault(level: number) {\n switch(level){\n case 1:\n return this.countryDefaultText;\n case 2:\n return this.stateDefaultText;\n case 3:\n return this.cityDefaultText;\n default:\n return \"\";\n }\n }\n\n /*private getOtherInsuranceCompanies() {\n this.clinicalConceptsService.getInsuraceConcepts()\n .subscribe(concepts => {\n // Filter out all insurance companies that are already on defaults\n let filteredConcepts = concepts.filter(c => !this.model.insurersDefault.find(d => d.id == c.id));\n\n this.otherInsuranceComp = filteredConcepts.map(c => {\n let model = new ConceptDefaultModel();\n \n let classNameEs = new TextLanguage();\n classNameEs.lenguaje = \"es\";\n classNameEs.texto = \"otras aseguradoras\";\n let classNameEn = new TextLanguage();\n classNameEn.lenguaje = \"en\";\n classNameEn.texto = \"Other insurances\";\n\n let insuranceName = new TextLanguage();\n insuranceName.lenguaje = this.locale.language;\n insuranceName.texto = c.nombre;\n\n model.id = c.id;\n model.clase = [classNameEs, classNameEn];\n model.claseId = 0;\n model.descripcion = [insuranceName];\n model.nombre = [insuranceName];\n\n return model;\n });\n\n // Add the other insurance companies to the defaults\n this.model.insurersDefault = this.model.insurersDefault.concat(this.otherInsuranceComp);\n\n if (this.otherInsuranceComp.length > 0 && this.qsParams && this.qsParams.filtros) {\n this.setInsuranceBaseOnQueryParams();\n }\n }\n );\n }*/ \n\n private searchInputBlur(input: HTMLInputElement): void {\n if(this.isMobile || this.fullsize) {\n input?.blur();\n }\n }\n\n private setDefaultsText(){\n this.cityText = this.translation.translate('city');\n this.stateText = this.translation.translate('province');\n this.countryText = this.translation.translate('country');\n this.cityDefaultText = this.translation.translate('shared.searchResults.searchProvidersV2.mostWantedCities');\n this.stateDefaultText = this.translation.translate('shared.searchResults.searchProvidersV2.mostWantedProvinces');\n this.countryDefaultText = this.translation.translate('shared.searchResults.searchProvidersV2.mostWantedCountries');\n this.dontApplyInsuranceText = this.translation.translate('shared.searchResults.searchProvidersV2.dontApplyInsuranceText');\n }\n \n private collectParams(snapshot: ActivatedRouteSnapshot): Params {\n let params: Params = { ...snapshot.params, ...snapshot.queryParams };\n\n const childSnapshots = snapshot.children;\n \n while (childSnapshots.length) {\n snapshot = childSnapshots[0];\n params = { ...params, ...snapshot.params, ...snapshot.queryParams };\n childSnapshots.shift();\n childSnapshots.push(...snapshot.children);\n }\n \n return params;\n }\n\n private getLatestDoctors() {\n this.loadingLastestDoctors = true;\n this.appointmentService.getLatestDoctors(this.locale.language, 20)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(\n doctors => {\n this.loadingLastestDoctors = false;\n\n this.lastestDoctors = doctors;\n\n this.lastestDoctors.forEach(d => {\n let avatarInitialsObject = this.baseService.getAvatarInitialObject(d.idResponsableServicio, d.nombreResponsableServicio);\n d.iniciales = avatarInitialsObject.initials;\n });\n },\n error => { this.baseService.handleServiceError(error, \"Error getting latest doctors\"); }\n ); \n }\n\n \n private configSearchByCountry(country:TerritorialDivision){\n let availableCountries = this.territorialDivisionsService.getAvailableCountries();\n\n if(country.idPais != 9 && country.idPais != 1 && availableCountries.find(c=> c.idPais == country?.idPais)){\n this.searchCountry = country;\n }\n else{\n this.searchCountry = new TerritorialDivision ();\n this.searchCountry.idPais = -1;\n this.searchCountry.identificador = '';\n }\n }\n\n private configSearchByCountryApp(){\n this.territorialDivisionsService.getCountryApp().subscribe(countryApp=>{\n if(countryApp && countryApp.territorialDivision){\n this.configSearchByCountry(countryApp.territorialDivision)\n }\n });\n }\n\n private setLocationDefaultByCountry(){\n\n this.locationDefault = this.model.locationsDefault.find(s=> s.idPais == this.searchCountry.idPais);\n\n // si no encuentra una secciĆ³n, se establece por defecto la de panamĆ”\n if(!this.locationDefault)\n this.locationDefault = this.model.locationsDefault.filter(s=> s.idPais == 28)[0];\n\n this.locationLevels = this.locationDefault.niveles;\n }\n\n private toggleAutocompleteInsurance(providerSearchMessage: ProviderSearchMessage){\n\n if(!this.model.showInsurersAutocomplete || !this.insuranceUnfilteredResults)\n return;\n\n if(providerSearchMessage.filtros) {\n let filters = providerSearchMessage.filtros.split(',').map(f=> +f);\n \n let selectedInsurers = this.insuranceUnfilteredResults.find(concept => filters.includes(concept.cc));\n\n if(selectedInsurers) {\n this.insuranceObjectSelected = selectedInsurers;\n this.searchInsuranceCtrl.setValue(this.insuranceObjectSelected);\n }\n \n //let selectedInsurers = this.model.insurersDefault.filter(insuranceDefault => filters.includes(insuranceDefault.id));\n\n /*if(selectedInsurers.length > 0) {\n this.insuranceObjectSelected = new ProfileFilterSearchResultConcept();\n this.insuranceObjectSelected.cc = selectedInsurers[0].id;\n this.insuranceObjectSelected.n_cc = this.layoutService.getTextByLanguage(selectedInsurers[0].nombre, this.locale.language);\n\n this.searchInsuranceCtrl.setValue(this.insuranceObjectSelected);\n }*/\n }\n else{\n this.searchInsuranceCtrl.reset('');\n\n if(this.searchInsuranceInput){\n this.searchInsuranceInput.nativeElement.value = '';\n }\n \n this.insuranceObjectSelected = null;\n }\n }\n\n /********************** Insurance Search *************************/\n\n configSearchInsurers(){\n if(!this.model.showInsurersAutocomplete)\n return;\n\n //this.getOtherInsuranceCompanies();\n\n this.filteredInsuranceResults$ = this.searchInsuranceCtrl.valueChanges\n .pipe(\n tap(()=>{ \n this.loadingSearchInsurance = true;\n }),\n debounceTime(0),\n startWith(''),\n switchMap(value => {\n\n if(!this.insuranceAutocompleteOpen){\n this.loadingSearchInsurance = false;\n return of([]);\n }\n\n if(this.model.insurersLikeCombo){\n let options = this.filterDefaultInsurers(value);\n\n this.loadingSearchInsurance = false;\n this.highlightValue = value;\n this.filteredInsuranceResultsCount = options.length;\n \n return of(options);\n }\n else{\n return of([]);\n }\n })\n );\n }\n\n filterDefaultInsurers(value:any) : ProfileFilterSearchResultGroup[]{\n let optionsGrouped = this.getInsuranceSearchGroupByDefault(); \n\n if(value){\n\n const textValue = (typeof value === 'string')\n ? value.toLowerCase()\n : value.nombre.toLowerCase();\n\n optionsGrouped = optionsGrouped.filter(og => og.results.filter(r => r.n_cc.toLowerCase().includes(textValue)).length > 0);\n\n optionsGrouped.forEach(og => {\n og.results = og.results.filter(r => r.n_cc.toLowerCase().includes(textValue));\n });\n\n return optionsGrouped;\n }\n else{\n return optionsGrouped;\n }\n }\n\n private getInsuranceSearchGroupByDefault() : ProfileFilterSearchResultGroup[] {\n return this.publicProfileService.groupProfileFilters(this.insuranceUnfilteredResults, this.insuranceFilter.grupos, this.locale.language);\n }\n\n onFocusInputInsuranceSearch(){\n event?.preventDefault();\n\n this.insuranceAutocompleteOpen = true;\n\n // Re-load the filters when opening the insurance\n this.loadFilters()\n .subscribe(filters => {\n\n // ejecutar la busqueda del autocomplete si el input tiene un texto\n if(this.searchInsuranceInput.nativeElement.value){\n this.autocompleteInsuranceTrigger._onChange(this.searchInsuranceInput.nativeElement.value);\n }\n // si no tiene texto y valores por defecto, se agrega un timeout para que reposicione el dropdown\n else if(filters.length > 0) { \n setTimeout(()=>{\n this.autocompleteInsuranceTrigger._onChange('');\n this.autocompleteInsuranceTrigger.updatePosition();\n }, 100);\n }\n },\n error => {\n\n }\n );\n }\n\n private getDirectoryFilters() { \n let directory = this.baseService.getDirectory();\n\n if (directory && directory.filtros) {\n let filtersObj = JSON.parse(directory.filtros);\n let directoryFilters = this.baseService.parseObject(filtersObj); \n\n // Find the Insurance provider \n for(let p of directoryFilters.providers) {\n let filter = p.filters.find(f => f.idClaseConceptoClinico == 8);\n\n if (filter) {\n this.insuranceFilter = filter;\n break;\n }\n }\n }\n }\n \n private loadFilters() : Observable {\n if (!this.providerSearchMessage)\n this.initEmptyProviderSearchMessage();\n\n let searchText = this.providerSearchMessage.searchText;\n let conceptType = \"\";\n let concept = \"\";\n\n let filtersString = this.providerSearchMessage.filtros;\n\n let accountName = this.baseService.getCliniwebDirectoryCompanyName();\n let accountId = this.baseService.getCliniwebDirectoryCompanyId();\n let locationCompanyIds = this.baseService.getCliniwebDirectoryLocationCompanyIds(); \n\n let location = this.baseService.getLocationFromIdentifier(this.providerSearchMessage.territorialDivisionIdentification);\n\n if(!location.country && this.providerSearchMessage.countryIdentification){\n location.country = this.providerSearchMessage.countryIdentification;\n }\n\n if (!accountName)\n accountName = this.baseService.getCompanyName();\n\n if (this.providerSearchMessage.conceptNav) {\n // Some time the navigation contains '/' like: '/especialidad/cardiologia' in those cases filter the empty strings after split\n let parts = this.providerSearchMessage.conceptNav.split(\"/\").filter(e => e);\n conceptType = parts[0];\n concept = parts[1];\n } \n\n let profileSearchTypes = this.model.profileTypes.split(\",\").map(pt => +pt);\n\n return this.publicProfileService.getPublicProfileFilters(\n this.baseService.getLanguage(),\n conceptType,\n searchText, \n concept,\n filtersString,\n accountName,\n location.country,\n location.state,\n location.city,\n 8, // Insurance\n profileSearchTypes,\n accountId,\n locationCompanyIds,\n this.providerSearchMessage.conceptId,\n this.providerSearchMessage.conceptClaseId\n ).pipe(\n map((result:ProfileFilterSearchResult[]) =>{\n if (!result || result.length == 0)\n return [];\n\n this.insuranceUnfilteredResults = result[0].conceptos;\n\n return result;\n }),\n catchError((err) => {\n this.baseService.handleServiceError(err, \"Error getting profile filters\"); \n return of([]);\n })\n ); \n } \n\n}\n\nexport class DoctorSearchResultGroup {\n classId: number;\n className: string;\n results: DoctorSearchResult[];\n}\n\nexport class LocationSearchResultGroup {\n id: number;\n displayName: string;\n results: LocationSearchResultItem[];\n}\n\nexport class LocationSearchResultItem {\n id: number;\n nombre: string;\n url: string;\n icono?: string;\n}\n\nexport class SearchProvidersUrl{\n url: string;\n qsParams:SearchQsParametersModel;\n}","import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { RouteDialogHeaderModel } from '../../../dialogs/route-dialog/route-dialog.component';\r\nimport { MessageBusService, NavigationBackMessage } from 'src/app/core/services/message-bus.service';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-default-logo-header',\r\n templateUrl: './default-logo-header.component.html',\r\n styleUrls: ['./default-logo-header.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('DefaultLogoHeaderComponent')\r\nexport class DefaultLogoHeaderComponent implements OnInit, IControlComponent, OnDestroy {\r\n\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private messageBusService: MessageBusService\r\n ) { }\r\n data: RouteDialogHeaderModel;\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n onBackClick(){\r\n let dialogId = this.data.dialogModel.id;\r\n\r\n this.messageBusService.navigateBack(new NavigationBackMessage(dialogId));\r\n } \r\n}","
\r\n \r\n \r\n \r\n \r\n
","import { Directive, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewContainerRef } from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { merge, Observable, Subscription } from 'rxjs';\nimport { DropdownPanel } from './dropdown.component';\nimport { TemplatePortal } from '@angular/cdk/portal';\n\n@Directive({\n selector: '[dropdownTriggerFor]',\n host: {\n '(click)': 'toggleDropdown()'\n }\n})\nexport class DropdownTriggerForDirective implements OnDestroy {\n private isDropdownOpen = false;\n private overlayRef: OverlayRef;\n private dropdownClosingActionsSub = Subscription.EMPTY;\n\n @Input('dropdownTriggerFor') public dropdownPanel: DropdownPanel;\n @Output('dropdownOverlay') public dropdownOverlay = new EventEmitter();\n\n constructor(\n private overlay: Overlay,\n private elementRef: ElementRef,\n private viewContainerRef: ViewContainerRef\n ) { }\n\n toggleDropdown(): void {\n this.isDropdownOpen ? this.destroyDropdown() : this.openDropdown();\n }\n\n openDropdown(): void {\n this.isDropdownOpen = true;\n\n let overlayConfig = new OverlayConfig();\n overlayConfig.hasBackdrop = true;\n overlayConfig.backdropClass = this.dropdownPanel.overlayTransparent\n ? 'cdk-overlay-transparent-backdrop'\n : 'cdk-overlay-dark-backdrop';\n overlayConfig.panelClass = this.dropdownPanel.panelClass;\n\n if(this.dropdownPanel.fullscreen){\n overlayConfig.scrollStrategy = this.overlay.scrollStrategies.block();\n }\n else{\n overlayConfig.scrollStrategy = this.overlay.scrollStrategies.close();\n overlayConfig.positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 8\n }\n ]);\n }\n\n this.overlayRef = this.overlay.create(overlayConfig);\n\n const templatePortal = new TemplatePortal(\n this.dropdownPanel.templateRef,\n this.viewContainerRef\n );\n \n this.overlayRef.attach(templatePortal);\n\n this.dropdownPanel.overlayRef.emit(this.overlayRef);\n\n this.dropdownClosingActionsSub = this.dropdownClosingActions().subscribe(\n () => this.destroyDropdown()\n );\n }\n\n private dropdownClosingActions(): Observable {\n const backdropClick$ = this.overlayRef.backdropClick();\n const detachment$ = this.overlayRef.detachments();\n const dropdownClosed = this.dropdownPanel.closed;\n\n return merge(backdropClick$, detachment$, dropdownClosed);\n }\n\n private destroyDropdown(): void {\n if (!this.overlayRef || !this.isDropdownOpen) {\n return;\n }\n\n this.dropdownClosingActionsSub.unsubscribe();\n this.isDropdownOpen = false;\n this.overlayRef.detach();\n }\n\n ngOnDestroy(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n }\n }\n}\n","\n
\n \n
\n
","import { Component, EventEmitter, Input, Output, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'app-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrls: ['./dropdown.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class DropdownComponent implements DropdownPanel {\n\n @ViewChild(TemplateRef) templateRef: TemplateRef;\n @Output() closed = new EventEmitter();\n @Output() overlayRef = new EventEmitter();\n @Input() panelClass: string;\n @Input() fullscreen: boolean = false;\n @Input() overlayTransparent: boolean = true;\n\n constructor() { }\n}\n\nexport interface DropdownPanel {\n templateRef: TemplateRef;\n readonly closed: EventEmitter;\n readonly overlayRef: EventEmitter;\n readonly panelClass: string;\n readonly fullscreen: boolean;\n readonly overlayTransparent: boolean;\n}","
\n \n \n\n \n \n
\n {{placeholder}}\n \n
\n
\n \n \n \n
\n \n \n
\n
0\">\n {{group.titulo}}\n \n
\n\n \n \n \n \n
\n
\n
\n
\n\n \n \n {{ 'shared.checkAutocomplete.searching' | translate:locale.language }}\n {{ 'shared.checkAutocomplete.emptyResult' | translate:locale.language }}\n \n
\n \n
\n
\n
\n
\n \n
\n
\n\n
\n","import { Component, ElementRef, EventEmitter, HostListener, Inject, Input, OnDestroy, OnInit, Output, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { L10nLocale, L10N_LOCALE } from 'angular-l10n';\nimport { Observable, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { DropdownPanel } from '../dropdown/dropdown.component';\nimport { OverlayRef } from '@angular/cdk/overlay';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { DirectoryFiltersGroupModel, DirectoryFiltersViewConfig } from '../search-results/provider-filters/provider-filters-content/provider-filters-content.component';\nimport { ProfileFilterSearchResultConcept, ProfileFilterSearchResultGroup } from '../../models/people/profile-filter-search-result.model';\nimport { TextLanguage } from '../../models/people/text-language.model';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\n\n@Component({\n selector: 'app-check-autocomplete',\n templateUrl: './check-autocomplete.component.html',\n styleUrls: ['./check-autocomplete.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class CheckAutocompleteComponent implements OnInit, OnDestroy {\n checkAutocompleteForm: FormGroup;\n control: FormControl;\n options: any[];\n \n filteredGroups: any[] = [];\n filteredOptions: any[] = [];\n\n visible:boolean = false;\n clasnameComponent:string;\n\n isMobile: boolean = false;\n\n overlayRef: OverlayRef;\n\n @Input() componentId: number;\n @Input() selectedOptions: any[];\n @Input() idAttributeName: string;\n @Input() placeholder: string;\n @Input() iconClassName: string;\n @Input() cssClass: string;\n @Input() loading: boolean;\n @Input() showInputSearch: boolean;\n @Input() singleSelection: boolean;\n @Input() groups: DirectoryFiltersGroupModel[];\n @Input() viewConfig: DirectoryFiltersViewConfig;\n @Input() optionsObs: Observable;\n @Input() optionFilterFtn: (searchText: string) => any[]; \n @Input() optionDisplayNameFtn: (option: any) => string;\n @Input() optionDisplayTitleNameFtn: (option: any) => string;\n @Input() selectedOptionDisplayNameFtn: (option: any) => string;\n \n @Output() onAutocompleteClick = new EventEmitter();\n @Output() onAutocompleteOptionsChanged = new EventEmitter();\n\n @ViewChild('searchInput') searchInput: ElementRef;\n @ViewChild('button') button: ElementRef;\n @ViewChild('dropdown') dropdown: DropdownPanel;\n\n private ngUnsubscribe = new Subject();\n\n isBrowser: boolean;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private messageBusService: MessageBusService,\n @Inject(DOCUMENT) private document: Document,\n private layoutService: LayoutService,\n private publicProfileService: PublicProfileService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.isBrowser = isPlatformBrowser(this.platformId);\n }\n\n ngOnInit(): void {\n this.isMobile = this.isBrowser ? window.innerWidth <= 800 : false;\n\n this.clasnameComponent = `check-autocomplete-${this.componentId}`;\n\n this.control = new FormControl('');\n\n this.checkAutocompleteForm = new FormGroup({\n control: this.control\n });\n\n this.optionsObs.subscribe(ops => {\n this.searchInput.nativeElement.value = '';\n this.options = ops;\n this.filteredOptions = ops;\n this.filteredGroups = this.groupConcepts(ops);\n });\n\n // Auto complete search function\n this.control.valueChanges.subscribe(v => {\n let filtered = this.filterItems(v);\n\n this.filteredGroups = this.groupConcepts(filtered);\n });\n\n this.messageBusService.onCloseCheckAutocomplete()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result=>{\n\n if(result != this.componentId)\n this.visible = false;\n });\n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n toggleAutocomplete(){\n\n event?.stopPropagation();\n\n this.visible = !this.visible;\n\n if(this.visible && !this.isMobile){\n setTimeout(() => {\n this.searchInput.nativeElement.focus();\n }, 100); \n }\n }\n\n getClassNameButton(){\n return {\n 'open': this.visible,\n 'selected': this.selectedOptions.length > 0\n }\n }\n\n getButtonText(){\n return this.selectedOptions.length > 0\n ? this.selectedOptionDisplayNameFtn(this.selectedOptions[0])\n : this.placeholder;\n }\n\n onClickAutocomplete() {\n this.toggleAutocomplete();\n this.onAutocompleteClick.emit();\n }\n\n optionClicked(event: Event, option: any) {\n event.stopPropagation();\n this.toggleSelection(option);\n }\n\n toggleSelection(option: any){\n let optionDeleted:any = null;\n\n if (this.singleSelection) {\n if (this.selectedOptions.length > 0) {\n optionDeleted = this.selectedOptions.splice(0, 1)[0]; \n }\n\n // If option was selected, then now was removed\n if (!this.isOptionSelected(option)) {\n this.selectedOptions.push(option);\n }\n\n this.onAutocompleteOptionsChanged.emit(optionDeleted ? [optionDeleted] : null);\n }\n else {\n if(this.isOptionSelected(option)){\n const i = this.selectedOptions.findIndex(value => value[this.idAttributeName] === option[this.idAttributeName]);\n this.selectedOptions.splice(i, 1);\n \n optionDeleted = option;\n }\n else{\n this.selectedOptions.push(option);\n }\n \n this.onAutocompleteOptionsChanged.emit(optionDeleted ? [optionDeleted] : null);\n } \n }\n\n onClearFilter() {\n\n event?.stopPropagation();\n\n this.onAutocompleteOptionsChanged.emit(this.selectedOptions);\n\n this.selectedOptions = [];\n this.control.setValue(\"\");\n this.visible = false;\n }\n\n isOptionSelected(option:any):boolean{\n return this.selectedOptions.length > 0 \n && this.selectedOptions.filter(s=> s[this.idAttributeName] === option[this.idAttributeName]).length > 0;\n }\n\n closeDropdown(){\n this.dropdown.closed.emit();\n }\n\n onFocusInputSearchDropdown(){\n if(!this.isMobile)\n return;\n\n event?.preventDefault()\n\n this.overlayRef.addPanelClass('fullscreen');\n }\n\n setOverlayRef(overlayRef: OverlayRef){\n this.overlayRef = overlayRef;\n }\n\n @HostListener('document:click', ['$event'])\n clickout(event : any){\n let container = this.document.getElementsByClassName(this.clasnameComponent)[0];\n\n if(container && !container.contains(event.target)){\n this.visible = false;\n }\n }\n\n @HostListener('window:resize', ['$event'])\n onResize(event: any) {\n this.isMobile = event.target.innerWidth <= 800;\n }\n\n private filterItems(value: string): any[] {\n try {\n // Filter concepts base on search results\n let filteredOptions = this.optionFilterFtn(value);\n\n this.filteredOptions = filteredOptions;\n\n return filteredOptions;\n } \n catch (error) {}\n\n return [];\n }\n\n private groupConcepts(filteredConcepts: ProfileFilterSearchResultConcept[]) : ProfileFilterSearchResultGroup[] {\n return this.publicProfileService.groupProfileFilters(filteredConcepts, this.groups, this.locale.language);\n }\n}\n\nexport class CheckAutocompleteOption{\n object: any;\n selected: boolean;\n\n constructor(object: any){\n this.object = object;\n }\n}\n","
\n \n \n \n
\n \n \n
\n \n {{ getNameI18n(filterItem.name) }}\n
\n\n \n
\n
\n \n \n
\n
\n
\n
\n
\n","import { Component, Inject, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { ProfileFilterSearchResult, ProfileFilterSearchResultConcept } from 'src/app/shared/models/people/profile-filter-search-result.model';\nimport { Observable, Subject, forkJoin, of } from 'rxjs';\nimport { MessageBusService, ProviderSearchMessage } from 'src/app/core/services/message-bus.service';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { catchError, map, takeUntil } from 'rxjs/operators';\nimport { TextLanguage } from 'src/app/shared/models/people/text-language.model';\nimport { ProviderFilterModel, ProviderFilterModelItem } from '../provider-filters-content/provider-filters-content.component';\nimport { Platform } from '@angular/cdk/platform';\n\n@Component({\n selector: 'app-provider-filters-body',\n templateUrl: './provider-filters-body.component.html',\n styleUrls: ['./provider-filters-body.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ProviderFiltersBodyComponent implements OnInit, OnChanges, OnDestroy {\n \n filterSelectedCount:number = 0;\n \n //subscribes\n private ngUnsubscribe = new Subject();\n\n @Input() filterModel: ProviderFilterModel;\n @Input() publicProfileTypes:PublicProfileType[] ;\n @Input() providerSearchMessage: ProviderSearchMessage;\n\n private onChanges = new Subject();\n\n constructor(\n public platform: Platform,\n private baseService: BaseService,\n private layoutService: LayoutService,\n private messageBusService: MessageBusService,\n private publicProfileService: PublicProfileService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private translation: L10nTranslationService\n ) { }\n\n ngOnChanges(changes: SimpleChanges){\n this.onChanges.next(changes);\n }\n\n ngOnInit(): void {\n this.onChanges\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((data:SimpleChanges)=>{\n this.filterModel.clear();\n });\n\n this.messageBusService.onClearProviderFilters()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(()=>{\n this.clearAll();\n });\n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n clearAll(){\n let conceptIds = this.getFiltersIds();\n\n this.fireFilterEvent(conceptIds);\n\n this.filterModel.clear();\n }\n\n filterTrackBy(index : number, item: ProviderFilterModelItem){\n return item.clinicConceptType; \n }\n\n loadFilters(item: ProviderFilterModelItem, prefilters:number[] = []) {\n let searchText = this.providerSearchMessage.searchText;\n let conceptType = \"\";\n let concept = \"\";\n\n let filtersString = this.getFiltersIds().join(',');\n\n let accountName = this.baseService.getCliniwebDirectoryCompanyName();\n let accountId = this.baseService.getCliniwebDirectoryCompanyId();\n let locationCompanyIds = this.baseService.getCliniwebDirectoryLocationCompanyIds(); \n\n let location = this.baseService.getLocationFromIdentifier(this.providerSearchMessage.territorialDivisionIdentification);\n\n if(!location.country && this.providerSearchMessage.countryIdentification){\n location.country = this.providerSearchMessage.countryIdentification;\n }\n\n if (!accountName)\n accountName = this.baseService.getCompanyName();\n\n if (this.providerSearchMessage.conceptNav) {\n // Some time the navigation contains '/' like: '/especialidad/cardiologia' in those cases filter the empty strings after split\n let parts = this.providerSearchMessage.conceptNav.split(\"/\").filter(e => e);\n conceptType = parts[0];\n concept = parts[1];\n }\n\n item.loading = true;\n\n return this.publicProfileService.getPublicProfileFilters(\n this.baseService.getLanguage(),\n conceptType,\n searchText, \n concept,\n filtersString,\n accountName,\n location.country,\n location.state,\n location.city,\n item.clinicConceptType,\n this.publicProfileTypes,\n accountId,\n locationCompanyIds,\n this.providerSearchMessage.conceptId,\n this.providerSearchMessage.conceptClaseId\n ).pipe(\n map((result:ProfileFilterSearchResult[]) =>{\n let resultItem = result[0];\n\n if (resultItem) {\n // Mark the items as loaded\n item.loadOption(resultItem.conceptos, prefilters);\n }\n else{\n item.loadOption([], prefilters);\n }\n\n item.loading = false;\n\n return true;\n }),\n catchError((err) => {\n this.baseService.handleServiceError(err, \"Error getting profile filters\"); \n return of(false);\n })\n );\n }\n\n getFiltersIds(){\n let filterByParams = this.providerSearchMessage.filtros \n ? this.providerSearchMessage.filtros.split(',').map(f => +f)\n : [];\n\n let filterSelected = this.filterModel.getSelectedConcepts();\n\n let filterIds = filterByParams.concat(filterSelected);\n\n filterIds = filterIds.filter((item, index)=> { return (filterIds.indexOf(item) == index)});\n\n return filterIds;\n }\n\n onFilterItemClick(item: ProviderFilterModelItem) {\n item.onClick();\n\n this.messageBusService.closeCheckAutocomplete(item.controlId);\n\n if (item.needToLoadOptions()){\n this.loadFilters(item)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result =>{\n this.filterSelectedCount = this.getFiltersIds().length;\n });\n }\n\n if (item.needToFireSearchOnClick()){\n let conceptDeleted = item.active ? null : [item.clinicConceptId];\n this.fireFilterEvent(conceptDeleted);\n this.filterSelectedCount = this.getFiltersIds().length;\n } \n }\n\n fireFilterEvent(conceptsDeleted:number[] | null = null) {\n\n let conceptIds = this.getFiltersIds();\n\n if(conceptsDeleted){\n conceptIds = conceptIds.filter(c=> conceptsDeleted.indexOf(c) === -1);\n }\n\n this.providerSearchMessage.filtros = conceptIds.join(',');\n\n this.messageBusService.providerSearch(this.providerSearchMessage);\n\n this.filterModel.items.forEach(_item => {_item.loaded = false;});\n }\n\n getNameI18n(name: TextLanguage[]){\n return this.layoutService.getTextByLanguage(name, this.locale.language);\n }\n\n getIdAttributeName(){\n return Object.getOwnPropertyNames(new ProfileFilterSearchResultConcept())[0];\n }\n\n onOptionChanged(optionsDeleted: ProfileFilterSearchResultConcept[] | null, item: ProviderFilterModelItem) {\n\n if(optionsDeleted && optionsDeleted?.length > 0)\n item.selectedConcepts = item.selectedConcepts.filter(concept => !optionsDeleted.find(conceptDeleted=> conceptDeleted.cc == concept.cc));\n \n this.fireFilterEvent(optionsDeleted ? optionsDeleted.map(o=> o.cc) : null);\n\n this.loadFilters(item)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(result =>{\n this.filterSelectedCount = this.getFiltersIds().length;\n });\n }\n\n getFilterMobileClassName(){\n return {\n 'selected': this.filterSelectedCount > 0 && this.filterModel.getSelectedConcepts().length > 0\n }\n }\n\n getFilterMobileText(){\n let filterText = this.translation.translate('shared.searchResults.providerFilters.filters');\n return this.filterSelectedCount > 0 && this.filterModel.getSelectedConcepts().length > 0\n ? `${filterText} (${this.filterModel.getSelectedConcepts().length})`\n : filterText;\n }\n\n isMobile(){\n return this.platform.ANDROID || this.platform.IOS;\n }\n}\n","\r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n {{ 'shared.header.homeLinkText' | translate:language }}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n {{publicProfileMenuModel.profile.nombrePersona}}\r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n","import { Component, ChangeDetectorRef, Inject, OnDestroy, OnInit, ViewEncapsulation, PLATFORM_ID } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\r\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\r\nimport { FormComponentData } from 'src/app/shared/models/people/form-control.model';\r\nimport { MenuMobileComponent } from '../../dialogs/menu-mobile/menu-mobile.component';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { MessageBusService, PublicProfileActionMessage } from 'src/app/core/services/message-bus.service';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport { ContainerType } from 'src/app/shared/enums/container-type.enum';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\r\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\r\nimport { environment } from 'src/environments/environment';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { HeaderComponentPublicProfileMenuModel } from '../header/header.component';\r\n\r\n@Component({\r\n selector: 'app-public-profile-header',\r\n templateUrl: './public-profile-header.component.html',\r\n styleUrls: ['./public-profile-header.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\n@ComponentLookup('PublicProfilePageHeaderComponent')\r\nexport class PublicProfilePageHeaderComponent implements OnInit, OnDestroy, IControlComponent {\r\n data: FormComponentData;\r\n\r\n routeDialogOpened: boolean = false;\r\n isPublicProfilePage: boolean = false;\r\n isSearchProfilePage: boolean = false;\r\n loggedInUser: UserPerson = null as any;\r\n floatingComponents: FormComponentData[] = [];\r\n language: string;\r\n publicProfileMenuModel: HeaderComponentPublicProfileMenuModel;\r\n headerLogo: string = \"\";\r\n isLicensedCompany: boolean = true;\r\n loading: boolean = true;\r\n directoryUrl: string = environment.cliniwebUrl;\r\n\r\n private ngUnsubscribe = new Subject();\r\n\r\n constructor(\r\n private routeDialogService: RouteDialogService,\r\n private messageBusService: MessageBusService,\r\n private router: Router,\r\n public dialog: MatDialog,\r\n private cd: ChangeDetectorRef,\r\n @Inject(DOCUMENT) private document: Document,\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n private baseService: BaseService,\r\n @Inject(PLATFORM_ID) private platformId: Object\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.setHeaderLogo();\r\n\r\n this.isPublicProfilePage = this.router.url.includes('perfil');\r\n this.isSearchProfilePage = this.router.url.includes('doctores');\r\n\r\n if (this.baseService.isCliniwebCompany()) {\r\n this.isLicensedCompany = true;\r\n this.loading = false;\r\n }\r\n else {\r\n this.baseService.isLicensedCompany().subscribe(hasLicenses => {\r\n this.isLicensedCompany = hasLicenses;\r\n \r\n this.loading = false;\r\n });\r\n\r\n /*let companyId = this.baseService.getCliniwebDirectoryCompanyId();\r\n this.baseService.getCliniwebDirectory(companyId).subscribe(dir => {\r\n this.directoryUrl = dir.url;\r\n });*/\r\n } \r\n\r\n this.router.events\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(event=>{\r\n if(event instanceof NavigationEnd){\r\n if(this.routeDialogService.anyOpen())\r\n return; \r\n\r\n this.isPublicProfilePage = this.router.url.includes('perfil');\r\n this.isSearchProfilePage = this.router.url.includes('doctores');\r\n\r\n\r\n this.language = this.locale.language;\r\n }\r\n });\r\n\r\n this.messageBusService.onSendFloatingComponents()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((message)=>{\r\n\r\n if(this.routeDialogService.anyOpen())\r\n return;\r\n\r\n this.floatingComponents = message.componentsData.filter(c=>c.contenedor == ContainerType.HEADER);\r\n });\r\n\r\n this.messageBusService.onOpenRouteDialog()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((message)=>{\r\n\r\n this.routeDialogOpened = true;\r\n });\r\n\r\n this.messageBusService.onCloseRouteDialog()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((message)=>{\r\n this.routeDialogOpened = false;\r\n });\r\n\r\n this.messageBusService.onAllRouteDialogClosed()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((message)=>{\r\n this.routeDialogOpened = false;\r\n });\r\n\r\n this.messageBusService.onPublicProfileHeaderVisibilityChange()\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((message)=> {\r\n if (message.fromRouteDialog)\r\n return;\r\n\r\n this.publicProfileMenuModel = new HeaderComponentPublicProfileMenuModel();\r\n this.publicProfileMenuModel.headerVisible = message.headerVisible;\r\n this.publicProfileMenuModel.profile = message.profile;\r\n this.publicProfileMenuModel.avatarModel = message.publicProfileAvatarComponentModel;\r\n this.publicProfileMenuModel.avatarModel.useAvatarPadding = message.headerVisible;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n setHeaderLogo() {\r\n var directoryName = this.baseService.getCliniwebDirectoryCompanyName();\r\n var logo = \"/assets/images/cliniweb/logo-cliniweb-phr.svg\";\r\n\r\n switch(directoryName) {\r\n case \"consultorios-towncenter\":\r\n logo = \"/assets/images/town-center/logo.svg\";\r\n break;\r\n case \"hospital-paitilla-directorio\":\r\n logo = \"/assets/images/hospital-paitilla/logo-HPaitilla.png\";\r\n break; \r\n case \"pacificasalud\": \r\n logo = \"/assets/images/pacifica-salud-phr/logo-pacifica-salud-phr-public-profile.svg\";\r\n break;\r\n case \"hsantafe\": \r\n logo = \"/assets/images/hsantafe-phr/logo-hsantafe-phr-public-profile.svg\";\r\n break;\r\n case \"chpanamericano\": \r\n logo = \"/assets/images/chpanamericano-phr/logo-chpanamericano-phr-public-profile.svg\";\r\n break;\r\n case \"chsf\": \r\n logo = \"/assets/images/chsf-phr/logo-chsf-phr-public-profile.svg\";\r\n break;\r\n case \"thepanamaclinic\": \r\n logo = \"/assets/images/thepanamaclinic-phr/logo-thepanamaclinic-phr-public-profile.svg\";\r\n break;\r\n case \"cmcaribe\": \r\n logo = \"/assets/images/cmcaribe-phr/logo-cmcaribe-phr-public-profile.svg\";\r\n break;\r\n case \"hchiriqui\": \r\n logo = \"/assets/images/hchiriqui-phr/logo-hchiriqui-phr-public-profile.png\";\r\n break;\r\n case \"cmpaitilla\": \r\n logo = \"/assets/images/cmpaitilla-phr/logo-cmpaitilla-phr.svg\";\r\n break;\r\n case \"hospital-nacional-directorio\": \r\n logo = \"/assets/images/hospital-nacional-phr/logo-hospital-nacional-phr-public-profile.png\";\r\n break;}\r\n\r\n this.headerLogo = logo;\r\n }\r\n\r\n openMenuMobile(){\r\n const dialogRef = this.dialog.open(MenuMobileComponent, {\r\n panelClass: \"menu-mobile\"\r\n });\r\n }\r\n\r\n onLogoClick() {\r\n let isCliniweb = this.baseService.isCliniwebCompany();\r\n\r\n if(isPlatformBrowser(this.platformId)){\r\n if (isCliniweb) {\r\n if (this.loggedInUser)\r\n this.router.navigate(['/']);\r\n else\r\n window.location.href = environment.cliniwebUrl;\r\n }\r\n else {\r\n var urlCompany = this.baseService.getUrlCompany();\r\n window.location.href = urlCompany;\r\n }\r\n } \r\n }\r\n\r\n setLoggedInUser(arg: UserPerson | null): void {\r\n this.loggedInUser = arg as any;\r\n this.cd.detectChanges();\r\n }\r\n\r\n gotoPayment() {\r\n this.messageBusService.sendPublicProfileAction(new PublicProfileActionMessage(true, false));\r\n }\r\n\r\n onAppointmentBtnClick() {\r\n this.messageBusService.sendPublicProfileAction(new PublicProfileActionMessage(false, true));\r\n }\r\n}\r\n\r\n","import { Component, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { TerritorialDivision } from '../../models/systems/territorial-division.model';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\n\n@Component({\n selector: 'app-country-form-checkout',\n templateUrl: './country-form-checkout.component.html',\n styleUrls: ['./country-form-checkout.component.css']\n})\n@ComponentLookup('CountryFormCheckoutComponent')\nexport class CountryFormCheckoutComponent implements IControlComponent, OnInit {\n data: FormComponentData;\n country: TerritorialDivision;\n\n errorSubject = new BehaviorSubject('');\n get errorObservable(): Observable {\n return this.errorSubject.asObservable();\n }\n\n constructor(\n private userService: UserService,\n private territorialDivisionService: TerritorialDivisionsService,\n private appStorageService: AppStorageService,\n private messageBusService: MessageBusService\n ) { }\n\n ngOnInit(): void {\n this.loadCountry();\n\n this.sendComponentFinishLoadingMessage();\n }\n\n onCountrySelected(country: TerritorialDivision){\n\n this.userService.updateUserResidenceCountry(country.idPais).subscribe(result=>{\n\n // SET COUNTRY APP\n this.territorialDivisionService.setCountryApp(country.idPais);\n\n // UPDATE USER\n this.userService.getUserPersonLoggedIn().subscribe(user=>{\n\n if(user){\n user.idPaisResidencia = country.idPais;\n\n this.userService.updateUserLoggedIn(user);\n }\n });\n\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.SELECT_COUNTRY;\n message.data = country;\n \n this.messageBusService.onComponentDataSetMessage(message);\n \n this.appStorageService.removeSessionItem(STORAGE.SELECT_COUNTRY);\n \n }, error =>{\n \n this.errorSubject.next(\"Hubo un error al grabar el paĆ­s, intente nuevamente\");\n });\n }\n\n sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event);\n }\n\n private loadCountry() {\n if (this.data && this.data.configurationData) {\n this.country = this.data.configurationData as TerritorialDivision; \n } \n }\n}\n","\n","import { SenderPatientRelationship } from \"../process/base-request.model\";\r\n\r\nexport class RequestToVerifyUpdateModel{\r\n idPacientePhr: number;\r\n tipoRelacionPacienteUsuario: SenderPatientRelationship;\r\n workflowPosition: number;\r\n esUsuarioNuevo: string;\r\n}","
\n \n \n \n
\n \n
\n
\n
\n \n
\n\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { BaseWorkflowComponent } from '../base-workflow/base-workflow.component';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { DOCUMENT, Location } from '@angular/common';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LoginCompletedMessage, MessageBusService, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { WorkflowService } from 'src/app/core/services/workflow.service';\nimport { WorkflowStepService } from 'src/app/core/services/workflow-step.service';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { StatesRequestVerifyDataModel } from '../../states-request-verify/states-request-verify.component';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { WorkflowLookup } from 'src/app/shared/decorators/workflow-lookup.decorator';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { MedicalOrderWorkflowState } from 'src/app/shared/models/workflow/states/medical-order-workflow-state.model';\nimport { Observable, of } from 'rxjs';\nimport { CompanyModel } from 'src/app/shared/models/systems/company.model';\nimport { catchError, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { WorkflowInitialData } from 'src/app/shared/models/process/workflow-initial-data.model';\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\nimport { OnlineAppointmentStatus } from 'src/app/shared/enums/online-appointment-status.enum';\nimport { RequestToVerifySummary } from 'src/app/shared/interfaces/request-to-verify-summary';\nimport { RequestsToVerifyService } from 'src/app/core/services/requests-to-verify.service';\nimport { RequestToVerifyUpdateModel } from 'src/app/shared/models/systems/resquest-to-verify-update.model';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\n\n@Component({\n selector: 'app-medical-order-workflow',\n templateUrl: './medical-order-workflow.component.html',\n styleUrls: ['./medical-order-workflow.component.css']\n})\n@WorkflowLookup('MedicalOrderWorkflowComponent')\nexport class MedicalOrderWorkflowComponent extends BaseWorkflowComponent implements OnInit {\n\n logoutFn: () => void;\n onlineAppointmentStatus: OnlineAppointmentStatus;\n showState = false;\n data: RequestToVerifySummary;\n state: MedicalOrderWorkflowState = new MedicalOrderWorkflowState();\n statesRequestVerifyDataModel: StatesRequestVerifyDataModel;\n updatedUserLoggedIn: boolean = false;\n\n constructor(\n @Inject(DOCUMENT) protected document: Document,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n protected baseService: BaseService,\n protected location: Location,\n protected messageBusService: MessageBusService,\n protected publicProfileService: PublicProfileService,\n protected route: ActivatedRoute,\n protected workflowService: WorkflowService,\n protected workflowStepService: WorkflowStepService,\n private appointmentService: AppointmentService,\n private appStorageService: AppStorageService,\n private requestToVerifyService: RequestsToVerifyService,\n private authService: AuthService,\n private userService: UserService,\n private dialog: MatDialog,\n private router: Router,\n private translation: L10nTranslationService\n ) {\n super(location, route, baseService, messageBusService, publicProfileService, workflowService, workflowStepService, document);\n this.logoutFn = this.logout.bind(this);\n }\n\n ngOnInit(): void { \n if(this.data && this.data.idVerificacion){\n this.checkMedicalOrderStatus();\n } else{\n this.startWorkflow();\n }\n }\n\n private checkMedicalOrderStatus(): void {\n this.appointmentService.getStatus(this.data.idVerificacion).subscribe(\n this.getStatusNext.bind(this),\n error => this.messageBusService.serviceError(new ServiceErrorMessage(\"Error getting request status\"))\n );\n }\n\n private getStatusNext(status: OnlineAppointmentStatus): void {\n this.onlineAppointmentStatus = status;\n\n if(this.onlineAppointmentStatus == OnlineAppointmentStatus.POR_COMPLETAR \n || this.onlineAppointmentStatus == OnlineAppointmentStatus.COMPLETADA){\n this.showState = false;\n this.startWorkflow();\n } else{\n this.configStatusView();\n this.showState = true;\n }\n }\n\n configStatusView(): void {\n this.statesRequestVerifyDataModel = new StatesRequestVerifyDataModel();\n\n this.statesRequestVerifyDataModel.buttonActionFn = this.gotoHome.bind(this);\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.buttonHomeText';\n this.statesRequestVerifyDataModel.companyLogoUrl = 'assets/images/cliniweb/logo-cliniweb-phr.svg';\n this.statesRequestVerifyDataModel.mainImageUrl = 'assets/images/cliniweb/Campana.gif';\n this.statesRequestVerifyDataModel.showActionButton = true;\n this.statesRequestVerifyDataModel.showHomeButton = false;\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.scheduledAppointment';\n }\n\n gotoHome(): void {\n this.router.navigate(['/']);\n }\n\n startWorkflow(): void {\n // Set this workflow as active\n this.workflowService.setWorkflowTypeActive(STORAGE.MEDICAL_ORDER_WORKFLOW_STATE);\n\n // Get state\n this.getState().subscribe((state:MedicalOrderWorkflowState)=>{\n this.state = state;\n\n this.workflowService.setWorkflowDataState(this.state);\n this.init();\n });\n\n this.progressBarModel.closeFn = this.closeWorkflow.bind(this);\n }\n\n getState() : Observable {\n var state = this.workflowService.getWorkflowDataState() as MedicalOrderWorkflowState;\n\n if(state){\n return of(state);\n }\n else if(this.data){\n return this.buildStateFromModel(this.data);\n }\n else {\n // This can happend if the user left the tab open with the workflow\n // When session expire the session variable with the workflow state will disappear\n // Go back to home\n this.router.navigate(['/']);\n throw \"State expired\";\n } \n }\n\n buildStateFromModel(sourceModel: RequestToVerifySummary) : Observable {\n let state = new MedicalOrderWorkflowState();\n let medicalOrderRequest = new WorkflowInitialData();\n \n medicalOrderRequest.idTipoSolicitud = sourceModel.idTipoSolicitud;\n medicalOrderRequest.checkoutUrl = this.document.location.origin + '/ordenes-medicas/'; \n medicalOrderRequest.localizacion = this.locale.language;\n\n medicalOrderRequest.perfilPublico = new PublicProfile();\n medicalOrderRequest.perfilPublico.id = sourceModel.idResponsableServicio;\n medicalOrderRequest.perfilPublico.nombrePersona = sourceModel.nombreResponsableServicio;\n medicalOrderRequest.perfilPublico.ubicacionFoto = sourceModel.ubicacionFoto;\n\n medicalOrderRequest.idUsuario = sourceModel.idUsuario;\n medicalOrderRequest.idPaciente = sourceModel.idPaciente;\n medicalOrderRequest.nombrePaciente = sourceModel.nombrePaciente;\n medicalOrderRequest.relacionEmisorPaciente = sourceModel.relacionEmisorPaciente;\n\n medicalOrderRequest.workflowPosition = sourceModel.workflowPosition;\n\n return this.baseService.getCompanyByLicense()\n .pipe(switchMap((company:CompanyModel)=>{\n medicalOrderRequest.idEmpresaOrigen = company.id;\n medicalOrderRequest.nombreEmpresaOrigen = company.name;\n\n state.requestModel = medicalOrderRequest;\n state.idVerificacion = sourceModel.idVerificacion;\n\n return of(state);\n }), \n catchError((err) => {\n this.baseService.handleServiceError(err, \"Error getting online appointment request\");\n return of(state);\n }));\n }\n\n closeWorkflow(ruta = 'welcome') {\n // Only show the message if the user is logged in\n if (this.state && this.state.getUserId() > 0 && ruta == 'welcome') {\n\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"shared.medicalOrder.dialog.title\");\n dialogData.message = this.translation.translate(\"shared.medicalOrder.dialog.message\");\n dialogData.confirmText = this.translation.translate(\"shared.medicalOrder.dialog.confirmText\"); \n dialogData.cancelText = this.translation.translate(\"shared.medicalOrder.dialog.cancelText\");\n dialogData.showHeaderIcon = false;\n dialogData.showCancelButton = true;\n dialogData.loadLicense = true;\n\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n data: dialogData,\n panelClass: 'cancel-appointment-dialog'\n });\n\n dialogRef.afterClosed().subscribe(accepted => {\n\n if(accepted){\n this._closeWorkflow(ruta);\n }\n });\n }\n else {\n this._closeWorkflow(ruta);\n } \n }\n\n private _closeWorkflow(ruta: string) {\n this.messageBusService.showHeader();\n\n this.workflowCleanup();\n\n this.router.navigateByUrl(ruta);\n }\n\n logout(): void {\n this.authService.logout();\n\n this.stepIndex = 0;\n this.loadStep(); \n }\n\n updateWorkflowStateData(): Observable {\n if(this.authService.isLoggedIn()){\n let updateModel = new RequestToVerifyUpdateModel();\n updateModel.idPacientePhr = this.state.getPatientIdRelationship();\n updateModel.tipoRelacionPacienteUsuario = this.state.getPatientRelationship();\n updateModel.workflowPosition = this.state.getPosition();\n updateModel.esUsuarioNuevo = this.userService.wasUserCreated() ? 'S' : 'N';\n\n return this.requestToVerifyService.update(this.state.idVerificacion, updateModel)\n .pipe(map((model:RequestToVerifyUpdateModel)=>{\n\n if(updateModel.esUsuarioNuevo == 'S' && !this.updatedUserLoggedIn){\n\n setTimeout(() => {\n this.userService.getUserPersonLoggedInFromService().subscribe((user:UserPerson | null)=>{\n if (user){\n this.messageBusService.loginCompleted(new LoginCompletedMessage(user));\n this.updatedUserLoggedIn = true;\n }\n }); \n }, 2000);\n }\n\n return true;\n }),\n catchError(err=>{\n this.baseService.handleServiceError(err, \"Error updating medical order request\");\n return of();\n }));\n }\n else{\n return of(true);\n }\n }\n\n workflowCleanup() {\n this.workflowService.removeWorkflowData(STORAGE.MEDICAL_ORDER_WORKFLOW_STATE);\n this.appStorageService.removeSessionItem(STORAGE.MEDICAL_ORDER_WORKFLOW_BOOTSTRAP_STATE);\n }\n}\n","
\n
\n \n
\n \n
\n \n
\n
\n \n
\n
{{avatarModel.fullName}}
\n
\n
\n \n\n \n\n
\n \n
\n \n\n
\n
\n\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { ComponentLookup } from 'src/app/shared/decorators/component-lookup.decorator';\nimport { PublicProfileAvatarComponentModel, PublicProfileToPublicProfileAvatarComponentModelConverter } from '../../public-profile-avatar/public-profile-avatar.component';\nimport { IControlComponent } from 'src/app/shared/interfaces/control-component';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { PatientVerificationComponentData, PatientVerificationDataModel } from 'src/app/shared/models/workflow/models/patient-verification-data.model';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { ComponentName } from 'src/app/shared/enums/component-name.enum';\nimport { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\nimport * as moment from 'moment';\nimport { PatientVerificationResponse } from 'src/app/shared/interfaces/patient-verification-response';\nimport { RequestsToVerifyService } from 'src/app/core/services/requests-to-verify.service';\n\n@Component({\n selector: 'app-patient-verification',\n templateUrl: './patient-verification.component.html',\n styleUrls: ['./patient-verification.component.css']\n})\n@ComponentLookup(ComponentName.PATIENT_VERIFICATION)\nexport class PatientVerificationComponent implements IControlComponent, OnInit {\n\n avatarModel = new PublicProfileAvatarComponentModel();\n componentData: PatientVerificationComponentData;\n data: any;\n errorMessage: string;\n formulario: FormGroup;\n isCliniweb: boolean;\n loading: boolean = false;\n sending: boolean = false;\n maxDate: Date;\n minDate: Date;\n model = new PatientVerificationDataModel;\n patientName = '';\n titleTextRefence = 'shared.medicalOrder.patientVerification.title';\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private baseService: BaseService,\n private formBuilder: FormBuilder,\n private requestsToVerifyService: RequestsToVerifyService,\n private messageBusService: MessageBusService,\n private userService: UserService\n ) {\n this.configBirthday();\n this.formulario = this.formBuilder.group({\n patientBirthdate: [null, Validators.required]\n });\n }\n\n private configBirthday(): void {\n const currentYear = new Date().getFullYear();\n this.maxDate = new Date();\n this.minDate = new Date(currentYear - 120, 0, 1);\n }\n\n ngOnInit(): void {\n this.parseControlData();\n this.isCliniweb = this.baseService.isCliniwebCompany();\n this.sendComponentFinishLoadingMessage();\n }\n\n private parseControlData(): void {\n this.loading = true;\n\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as PatientVerificationDataModel;\n this.componentData = this.model.configData; \n this.patientName = this.model.nombrePaciente;\n this.avatarModel = new PublicProfileToPublicProfileAvatarComponentModelConverter(this.model.profile);\n }\n\n this.loading = false;\n }\n\n private sendComponentFinishLoadingMessage(): void {\n if (!this.data) return;\n\n const event = new ComponentFinishLoadingMessage();\n \n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n\n controlHasError(controlName: string, errorName: string): boolean {\n return this.getControl(controlName).hasError(errorName);\n }\n\n private getControl(controlName: string): AbstractControl {\n return this.formulario.controls[controlName];\n }\n\n enviar(): void {\n try{\n this.formulario.markAllAsTouched();\n \n if (this.formulario.invalid) return;\n \n const patientBirthdate = this.formulario.controls.patientBirthdate.value;\n \n this.sending = true;\n this.formulario.disable();\n \n this.requestsToVerifyService.validate(patientBirthdate, this.model.idVerificacion).subscribe({\n next: (response) => {\n console.log('validaciĆ³n de la fecha de nacimiento recibida:', response);\n this.validateNext(response);\n },\n error: (error) => {\n this.baseService.handleServiceError(error, \"Error al validar la fecha de nacimiento\");\n this.formulario.enable();\n this.sending = false;\n },\n complete: () => {\n this.formulario.enable();\n this.sending = false; \n }\n });\n }\n catch(error){\n this.formulario.enable();\n this.sending = false;\n throw error;\n }\n }\n\n private validateNext(args: PatientVerificationResponse): void {\n let message = new ComponentDataSetMessage();\n \n message.componentName = ComponentName.PATIENT_VERIFICATION;\n message.data = args;\n\n if (!args.isValid) {\n this.errorMessage = 'shared.medicalOrder.patientVerification.text6';\n } else {\n this.messageBusService.onComponentDataSetMessage(message);\n }\n } \n\n getBirthdateControl(): FormControl | null{\n return this.formulario.get('patientBirthdate') ? this.formulario.get('patientBirthdate') as FormControl : null;\n }\n}\n","import { Component, Inject, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { MEDICAL_REQUEST_TYPE, MY_MEDICAL_ORDER_EMPTY_STATE_TEXT, MY_MEDICAL_ORDER_EMPTY_STATE_TITLE } from 'src/app/shared/enums/medical-request-type.enum';\n\n@Component({\n selector: 'app-my-medical-orders-empty-state',\n templateUrl: './my-medical-orders-empty-state.component.html',\n styleUrls: ['./my-medical-orders-empty-state.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class MyMedicalOrdersEmptyStateComponent implements OnChanges {\n\n @Input() tipoSolicitud = MEDICAL_REQUEST_TYPE.LABORATORY_ORDER;\n text:string = '';\n title: string = '';\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n ) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.tipoSolicitud) {\n this.text = MY_MEDICAL_ORDER_EMPTY_STATE_TEXT[this.tipoSolicitud];\n this.title = MY_MEDICAL_ORDER_EMPTY_STATE_TITLE[this.tipoSolicitud];\n }\n }\n\n}\n","
\n

{{title | translate:locale.language}}

\n

{{text | translate:locale.language}}

\n \n
","
\n
\n \n \n \n {{ nombreTipo | translate:locale.language }}\n
\n \n \n \n \n
\n \n \n
\n
\n
\n {{'shared.myMedicalOrders.completedStatus' | translate:locale.language }}\n {{'shared.myMedicalOrders.pendingStatus' | translate:locale.language }}\n
\n
\n {{ nombreTipoCardText | translate:locale.language }}\n NĀ° {{item.numeroOrdenMedica}}\n
\n para {{patientData.nombre}}\n \n
\n
\n Ordenado por {{item.nombreDoctor}}
\n el {{item.fecha | date:\"dd 'de' MMM',' yyyy\":'':locale.language}}
\n {{item.cantidadDetalles || 0}} {{nombreConteoDetalle + (item.cantidadDetalles != 1 ? 'Plural' : '') | translate:locale.language}}\n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { BreakpointObserver } from '@angular/cdk/layout';\nimport { RouteDialogService } from 'src/app/core/services/route-dialog.service';\nimport { MyOrderSummaryRouteDialogModel } from '../dialogs/route-dialog/route-dialog.component';\nimport { MedicalOrderService } from 'src/app/core/services/medical-order.service';\nimport { ActivatedRoute, Data, Params, Router } from '@angular/router';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { Dependent } from '../../models/people/dependent.model';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { PublicProfileAvatarComponentModel } from '../public-profile-avatar/public-profile-avatar.component';\nimport { PublicProfileType } from '../../models/people/profile-search-results.model';\nimport { MEDICAL_REQUEST_STATE, MEDICAL_REQUEST_TYPE, MY_MEDICAL_ORDERS_CARD_TEXT, MY_MEDICAL_ORDERS_BUTTON_TEXT, MY_MEDICAL_ORDERS_TITLE, MY_MEDICAL_ORDER_DETAIL_COUNT_TEXT } from '../../enums/medical-request-type.enum';\nimport { Person } from '../../models/people/person.model';\nimport { MedicalOrderViewModel } from '../../models/clinic-history/medical-order.model';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { Link } from '../../models/people/link.model';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\n\n@Component({\n selector: 'app-my-medical-orders',\n templateUrl: './my-medical-orders.component.html',\n styleUrls: ['./my-medical-orders.component.css']\n})\n@ComponentLookup('MyMedicalOrdersComponent')\nexport class MyMedicalOrdersComponent implements OnDestroy, OnInit {\n\n loading: boolean;\n items: MedicalOrderItemModel[] = [];\n private ngUnsubscribe = new Subject();\n patientData: Person = new Person;\n patientId: number;\n\n idTipo: number;\n nombreTipo: string;\n nombreTipoCardText: string;\n nombreTipoButtonText: string;\n nombreConteoDetalle: string;\n\n tipoSolitudEnum = MEDICAL_REQUEST_TYPE;\n estadoOrdenMedicaEnum = MEDICAL_REQUEST_STATE;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private baseService: BaseService,\n private breakpointObserver: BreakpointObserver,\n private routeDialogService: RouteDialogService,\n private medicalOrderService: MedicalOrderService,\n private route: ActivatedRoute,\n private userService: UserService,\n private utilsService: UtilsService,\n private appStorageService: AppStorageService,\n private router: Router\n ) {\n \n }\n\n ngOnInit(): void { \n\n this.route.data\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe({ \n next: this.routeParamsNext.bind(this),\n error: (error) =>{\n console.log(error)\n\n this.loading = false;\n } \n });\n\n this.loading = true;\n\n this.route.queryParams\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((queryParams) => {\n this.configByParams(queryParams);\n },\n error => {\n console.log(error)\n\n this.loading = false;\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n private configByParams(params: Params){\n if(params[\"p\"]){\n\n this.patientId = +params[\"p\"];\n\n this.userService.getUserDependents()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((dependents: Dependent[])=>{\n\n let dependent = dependents.find(d=> d.idPersona == +params[\"p\"]);\n\n if(dependent){\n dependent.id = dependent.idPersona;\n this.setPatient(dependent);\n this.getMedicalOrders();\n }\n else {\n this.loading = false;\n }\n });\n }\n else{\n this.userService.getUserPersonLoggedIn()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((userPerson:UserPerson | null)=>{\n if(userPerson){\n\n this.setPatient(userPerson);\n this.getMedicalOrders();\n }\n else{\n this.loading = false;\n }\n });\n }\n }\n\n private setPatient(person: Person){\n this.patientData = person;\n\n this.patientData.ubicacionLogo = person.ubicacionLogo \n ? person.ubicacionLogo \n : this.utilsService.getPersonDefaultAvatarUrl(person.fechaNacimiento, person.sexo ?? 'm');\n }\n\n private routeParamsNext(args: Data): void {\n\n if(args.idsTipoContenidos){\n this.idTipo = args.idsTipoContenidos[0];\n }\n else{\n this.getTypeByLink();\n }\n\n this.nombreTipo = MY_MEDICAL_ORDERS_TITLE[this.idTipo];\n this.nombreTipoCardText = MY_MEDICAL_ORDERS_CARD_TEXT[this.idTipo];\n this.nombreTipoButtonText = MY_MEDICAL_ORDERS_BUTTON_TEXT[this.idTipo];\n this.nombreConteoDetalle = MY_MEDICAL_ORDER_DETAIL_COUNT_TEXT[this.idTipo];\n }\n\n private getTypeByLink(){\n let links: Link[] = this.appStorageService.getItemSession(STORAGE.MENU, true);\n const cleanUrl = this.router.url.replace(\"/\", \"\");\n\n let link = this.findLink(links, cleanUrl);\n\n if(link){\n this.idTipo = +link.idsTipoContenidos;\n } \n }\n\n private findLink(arg0:Link[] | null, arg1: string): Link | undefined {\n let resultado: Link | undefined;\n for (let item of (arg0 ?? [])) {\n resultado = item.identificadorUrl == arg1 ? item : this.findLink(item.subMenu, arg1);\n if (resultado) break;\n }\n return resultado;\n }\n\n private getMedicalOrders(){\n\n const tipos = this.idTipo == MEDICAL_REQUEST_TYPE.LABORATORY_ORDER || this.idTipo == MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER\n ? `${MEDICAL_REQUEST_TYPE.LABORATORY_ORDER},${MEDICAL_REQUEST_TYPE.RADIOLOGY_ORDER}`\n : this.idTipo.toString();\n\n this.medicalOrderService.getList(this.patientData.id, tipos)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((medicalOrders:MedicalOrderViewModel[])=>{\n\n medicalOrders.forEach(medicalOrder=>{\n\n let item = this.baseService.parseObject(medicalOrder);\n item.publicProfileAvatar = new PublicProfileAvatarComponentModel();\n \n item.publicProfileAvatar.personId = item.idDoctor;\n item.publicProfileAvatar.avatarUrl = item.avatarDoctor;\n item.publicProfileAvatar.fullName = item.nombreDoctor;\n item.publicProfileAvatar.sex = '9';\n item.publicProfileAvatar.profileType = PublicProfileType.Doctor;\n\n this.items.push(item);\n });\n\n this.loading = false;\n });\n }\n\n viewMoreClick(uidOrdenMedica: string): void {\n let routeDialogModel = new MyOrderSummaryRouteDialogModel();\n const isMobile: boolean = this.breakpointObserver.isMatched('(max-width: 800px)');\n if (isMobile) routeDialogModel.headerName = 'DefaultBackHeaderComponent';\n routeDialogModel.route = `ordenes-medicas/${ uidOrdenMedica }`;\n \n this.routeDialogService.openDialog(routeDialogModel);\n }\n}\n\nexport class MedicalOrderItemModel extends MedicalOrderViewModel{\n publicProfileAvatar: PublicProfileAvatarComponentModel;\n}","import { TextLanguage } from \"../people/text-language.model\";\r\n\r\nexport class GrowthMeasurementType{\r\n id: ChartType;\r\n rangos: GrowthMeasurementRange[];\r\n}\r\n\r\nexport class GrowthMeasurementRange{\r\n id: number;\r\n nombre: string;\r\n rangoInicial: number;\r\n rangoFinal: number;\r\n codigoUnidadMedida: number;\r\n nombreUnidadMedida: string;\r\n codigoEstandar: GrowthMeasurementStandard;\r\n intervaloX: number;\r\n intervaloY: number;\r\n}\r\n\r\nexport enum ChartType{\r\n SIZE_FOR_AGE = 1,\r\n WEIGHT_FOR_AGE = 2,\r\n WEIGHT_FOR_SIZE = 3,\r\n BMI_FOR_AGE = 4,\r\n HEAD_CIRCUMFERENCE_FOR_AGE = 5\r\n}\r\n\r\nexport enum GrowthMeasurementStandard{\r\n OMS = 1,\r\n CDC = 2\r\n}\r\n\r\nexport enum GrowthMeasurementUnitType{\r\n YEARS = 479,\r\n MONTHS = 481,\r\n WEEKS = 486 \r\n}","import { Injectable } from \"@angular/core\";\r\nimport { HttpBaseService } from \"./http-base-service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { GrowthMeasurements } from \"src/app/shared/models/clinic-history/growth-measurements.model\";\r\nimport { GrowthPercentile } from \"src/app/shared/models/clinic-history/growth-percentile.model\";\r\nimport { ChartType, GrowthMeasurementType } from \"src/app/shared/models/clinic-history/growth-measurement-type.model\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GrowthMeasurementsService{\r\n\r\n constructor(\r\n private http: HttpBaseService\r\n ) { }\r\n\r\n getByPatientId(idPaciente:number, idEmpresa: number, idResponsableServicio: number, idTipoConcepto?:number): Observable{\r\n let url = `api/mediciones-crecimiento/paciente/${idPaciente}`;\r\n url += `?idEmpresa=${idEmpresa}`;\r\n url += `&idResponsableServicio=${idResponsableServicio}`;\r\n\r\n if(idTipoConcepto && idTipoConcepto > 0)\r\n url += `&idTipoConcepto=${idTipoConcepto}`;\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n getPercentiles(\r\n idEstandarMedicion: number, \r\n idTipoMedicion:number, \r\n sexo:string, \r\n rangoInicial: number, \r\n rangoFinal: number, \r\n idUnidadMedidaRango:number): Observable{\r\n let url = `api/mediciones-crecimiento/percentiles`\r\n url += `?idEstandarMedicion=${idEstandarMedicion}`;\r\n url+=`&idTipoMedicion=${idTipoMedicion}`;\r\n url+=`&sexo=${sexo}`;\r\n url+=`&rangoInicial=${rangoInicial}`;\r\n url+=`&rangoFinal=${rangoFinal}`;\r\n url+=`&idUnidadMedidaRango=${idUnidadMedidaRango}`;\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n getMeasurementTypes(): Observable{\r\n return this.http.get(\"api/mediciones-crecimiento/tipos\");\r\n }\r\n\r\n getHcaFieldByType(chartType:ChartType):string{\r\n switch(chartType){\r\n case ChartType.SIZE_FOR_AGE:\r\n default:\r\n return 'TallaEdad';\r\n case ChartType.WEIGHT_FOR_AGE:\r\n return 'PesoEdad';\r\n case ChartType.WEIGHT_FOR_SIZE:\r\n return 'PesoTalla';\r\n case ChartType.BMI_FOR_AGE:\r\n return 'IMCEdad';\r\n case ChartType.HEAD_CIRCUMFERENCE_FOR_AGE:\r\n return 'CirunferenciaCefalicaEdad';\r\n }\r\n }\r\n\r\n getIntervaleByRangeAndType(rangeId: number, typeId:number){\r\n }\r\n}","export enum Gender {\r\n MALE = 'M',\r\n FEMALE = 'F',\r\n OTHER = '9'\r\n}","import { Component, Inject, Input, OnInit } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { Gender } from 'src/app/shared/enums/person-gender.enum';\n\n@Component({\n selector: 'app-growth-charts-tab-data-type',\n templateUrl: './growth-charts-tab-data-type.component.html',\n styleUrls: ['./growth-charts-tab-data-type.component.css']\n})\nexport class GrowthChartsTabDataTypeComponent implements OnInit {\n\n @Input() gender: string;\n\n private genderClassMap: {[gender: string]: string} = {\n [Gender.MALE]: 'ninio',\n [Gender.FEMALE]: 'ninia',\n [Gender.OTHER]: ''\n };\n private genderTextMap: {[gender: string]: string} = {\n [Gender.MALE]: 'shared.growthCharts.omsDataBoy',\n [Gender.FEMALE]: 'shared.growthCharts.omsDataGirl',\n [Gender.OTHER]: ''\n };\n\n get omsDataColor(): string {\n return this.genderClassMap[this.gender] || '';\n }\n\n get omsDataText(): string {\n return this.genderTextMap[this.gender] || '';\n }\n\n constructor(@Inject(L10N_LOCALE) public locale: L10nLocale) { }\n\n ngOnInit(): void {\n }\n\n}\n","
\n
\n {{omsDataText | translate:locale.language}}\n
\n
","
\n
\n
\n \n \n \n {{ range.nombre | i18nText:locale.language }}\n \n \n \n
\n
\n \n
\n
\n","import { Component, Inject, Input, OnDestroy, OnInit, ViewChild, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { GrowthMeasurementsService } from 'src/app/core/services/growth-measurements.service';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { ChartType, GrowthMeasurementRange, GrowthMeasurementUnitType } from 'src/app/shared/models/clinic-history/growth-measurement-type.model';\nimport { GrowthMeasurements } from 'src/app/shared/models/clinic-history/growth-measurements.model';\nimport { GrowthPercentile } from 'src/app/shared/models/clinic-history/growth-percentile.model';\nimport { MatSelect } from '@angular/material/select';\ndeclare var CanvasJS : any;\n\n@Component({\n selector: 'app-growth-charts-tab',\n templateUrl: './growth-charts-tab.component.html',\n styleUrls: ['./growth-charts-tab.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class GrowthChartsTabComponent implements OnInit, OnDestroy {\n\n //subscribes\n private ngUnsubscribe = new Subject();\n\n @Input() loading: boolean = false;\n @Input() id: string;\n @Input() type: ChartType;\n @Input() ranges: GrowthMeasurementRange[] = [];\n @Input() gender: string;\n @Input() measurements: GrowthMeasurements;\n @ViewChild('rangeSelect') rangeSelect: MatSelect;\n\n percentiles: GrowthPercentile[] = [];\n\n selectedRange: number;\n\n axisYText: string;\n\n constructor(\n private baseService: BaseService,\n private layoutService: LayoutService,\n private growthMeasurementsService: GrowthMeasurementsService,\n private translation: L10nTranslationService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n ) {\n }\n\n ngOnInit(): void {\n if(this.ranges.length > 0){\n this.selectedRange = this.ranges[0].id;\n\n this.updateTab();\n }\n\n this.fillAxisYText();\n\n this.translation.onChange()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe({\n next: () => {\n this.fillAxisYText();\n\n if(!this.loading)\n this.renderCharts();\n }\n });\n }\n\n ngOnDestroy():void{\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.measurements) {\n this.renderCharts();\n }\n }\n\n updateTab(){\n const range = this.ranges.find(r => r.id == this.selectedRange);\n\n if(!range){\n return; \n }\n\n this.loading = true;\n\n const chartContainer = document.getElementById('chart_' + this.type);\n\n if (chartContainer) {\n chartContainer.innerHTML = '';\n\n const emptyStateDiv = document.createElement('div');\n emptyStateDiv.className = 'loading-state';\n emptyStateDiv.innerHTML = 'Cargando...';\n\n chartContainer.appendChild(emptyStateDiv);\n }\n\n this.growthMeasurementsService.getPercentiles(\n range.codigoEstandar, \n this.type,\n this.gender,\n range.rangoInicial,\n range.rangoFinal,\n range.codigoUnidadMedida\n ).subscribe(p=>{\n\n this.percentiles = p;\n\n this.loading = false;\n\n this.renderCharts();\n });\n\n }\n\n renderCharts() {\n const chartContainer = document.getElementById('chart_' + this.type);\n\n if (chartContainer) {\n chartContainer.innerHTML = '';\n }\n\n let selectedRangeObj = this.ranges.find(r => r.id == this.selectedRange);\n\n if (!selectedRangeObj) {\n return;\n }\n\n if (!this.measurements || this.measurements.mediciones.length === 0 || this.getPatientGrowthMeasurementsByRange(selectedRangeObj).length === 0) {\n chartContainer?.parentElement?.classList.add('empty-state');\n this.showEmptyState();\n return;\n }\n\n chartContainer?.parentElement?.classList.remove('empty-state');\n\n // agrupo los percentiles por el nombre\n const groupedData = this.percentiles.reduce((acc:any, item:GrowthPercentile) => {\n if (!acc[item.nombre]) {\n acc[item.nombre] = [];\n }\n acc[item.nombre].push({ x: item.x, y: item.y, legendText: item.nombre });\n return acc;\n }, {});\n\n // genero la estructura del objeto de canvajs para cada percentil\n const data = Object.keys(groupedData).map(key => {\n const dataPercentile = new CanvasDataModel();\n\n dataPercentile.type = \"line\";\n dataPercentile.name = key;\n dataPercentile.markerSize = 0;\n dataPercentile.indexLabelFontSize = 13;\n dataPercentile.indexLabelFontFamily = \"Segoe UI\";\n dataPercentile.indexLabelFontColor = \"#404040\";\n dataPercentile.showInLegend = true;\n dataPercentile.dataPoints = groupedData[key];\n\n return dataPercentile;\n });\n\n // datos del paciente\n const dataPatient = new CanvasDataModel();\n dataPatient.type = \"line\";\n dataPatient.name = \"Paciente\";\n dataPatient.lineColor = \"#000000\";\n dataPatient.markerColor = \"#000000\";\n dataPatient.color = \"#000000\";\n dataPatient.indexLabelFontSize = 13;\n dataPatient.indexLabelFontFamily = \"Segoe UI\";\n dataPatient.indexLabelFontColor = \"#404040\";\n dataPatient.showInLegend = true;\n dataPatient.dataPoints = this.getPatientGrowthMeasurementsByRange(selectedRangeObj);\n \n data.push(dataPatient);\n\n // opciones para canvasjs\n let options = {\n animationEnabled: true,\n animationDuration: 500,\n theme: \"light2\",\n axisY: {\n title: this.axisYText,\n titleFontSize: 16,\n titleFontFamily: \"Segoe UI\",\n titleFontColor: '#404040',\n includeZero: false,\n interval: selectedRangeObj.intervaloY\n },\n axisX: {\n },\n data: data,\n toolTip: {\n backgroundColor: 'black',\n contentFormatter: (e:any) => {\n let content = null;\n for (var i = 0; i < e.entries.length; i++) {\n const item = e.entries[i];\n if (item.dataSeries.name === 'Paciente')\n content = `${item.dataPoint.xReference}
${item.dataPoint.yReference}
${item.dataPoint.references}`;\n }\n return content;\n },\n fontColor: 'white',\n fontSize: 12\n } \n };\n\n // configuraciĆ³n de eje x\n const axisX = new AxisXCanvasDataModel();\n axisX.title = this.layoutService.getTextByLanguage(selectedRangeObj.nombreUnidadMedida, this.locale.language);\n axisX.titleFontSize = 16;\n axisX.titleFontFamily = \"Segoe UI\";\n axisX.titleFontColor = '#404040';\n axisX.interval = selectedRangeObj.intervaloX;\n\n if(this.type == ChartType.WEIGHT_FOR_SIZE){\n axisX.title = this.translation.translate('shared.growthChartsTab.axisY1');\n axisX.minimum = data[0].dataPoints[0].x;\n axisX.maximun = data[0].dataPoints[data[0].dataPoints.length - 1].x;\n axisX.viewportMinimum = data[0].dataPoints[0].x;\n axisX.viewportMaximun = data[0].dataPoints[data[0].dataPoints.length - 1].x;\n }\n else{\n axisX.minimum = selectedRangeObj.rangoInicial;\n axisX.maximun = selectedRangeObj.rangoFinal;\n axisX.viewportMinimum = selectedRangeObj.rangoInicial;\n axisX.viewportMaximun = selectedRangeObj.rangoFinal;\n }\n\n options.axisX = axisX;\n\n let chart = new CanvasJS.Chart('chart_' + this.type, options);\n chart.render();\n }\n\n private fillAxisYText(){\n this.axisYText = this.translation.translate('shared.growthChartsTab.axisY' + this.type);\n }\n\n private getPatientGrowthMeasurementsByRange(range: GrowthMeasurementRange){\n if(!this.measurements || this.measurements.mediciones.length == 0){\n return [];\n }\n\n let measurements:CanvasDataPoint[] = [];\n\n if (this.type == ChartType.WEIGHT_FOR_SIZE) {\n measurements = this.measurements.mediciones.map(m => {\n const hca = JSON.parse(m.jsonHistoriaClinicaActual);\n const data = hca && hca['PesoTalla'] || { Percentiles: [], Unidad: 'cm' };\n const percentiles = data.Percentiles;\n\n const dataPoint:CanvasDataPoint = {\n x: m.valorTallaCm,\n y: m.valorPesoKg,\n xReference: this.translation.translate(`shared.growthChartsTab.axisYWithValue1`, { value: m.valorTallaCm }),\n yReference: this.translation.translate(`shared.growthChartsTab.axisYWithValue2`, { value: m.valorPesoKg }),\n references: percentiles.reduce((prev:any, curr:any) => `${prev}${curr.Nombre}: ${curr.Valor.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} ${data.Unidad}
`, '')\n }\n\n return dataPoint;\n });\n\n measurements = measurements.filter(m => m.x >= this.percentiles[0].x && m.x <= this.percentiles[this.percentiles.length -1].x);\n }\n else {\n const measurementsForRange = this.measurements.mediciones.filter(obj => {\n let edadTotal = this.getDecimalAge(obj.edadAnios, obj.edadMeses, obj.edadDias, range.codigoUnidadMedida);\n return edadTotal >= range.rangoInicial && edadTotal < range.rangoFinal;\n });\n\n measurements = measurementsForRange.map(m => {\n const hca = JSON.parse(m.jsonHistoriaClinicaActual);\n const data = hca && hca[this.growthMeasurementsService.getHcaFieldByType(this.type)] || { Percentiles: [], Unidad: '' };\n const percentiles = data.Percentiles;\n const edadTotal = this.getDecimalAge(m.edadAnios, m.edadMeses, m.edadDias, range.codigoUnidadMedida);\n const valor = this.getAxisYTextByType(m);\n const y = this.getAxisYByType(m);\n\n const dataPoint:CanvasDataPoint ={\n x: edadTotal,\n y: y,\n xReference: this.baseService.getDetailedAge(m.edadAnios, m.edadMeses, m.edadDias),\n yReference: valor,\n references: percentiles.reduce((prev:any, curr:any) => `${prev}${curr.Nombre}: ${curr.Valor.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} ${data.Unidad}
`, '')\n };\n\n return dataPoint;\n });\n\n measurements = measurements.filter(m => m.x >= range.rangoInicial && m.x <= range.rangoFinal);\n }\n\n return measurements.filter(m => m.y > 0);\n }\n\n private getDecimalAge(yearAge:number, monthsAge: number, daysAge: number, unitType: GrowthMeasurementUnitType):number{\n switch (unitType) {\n case GrowthMeasurementUnitType.YEARS:\n return yearAge + (monthsAge / 12) + (daysAge / 365.25); // 365.25 para aƱos bisiestos\n case GrowthMeasurementUnitType.MONTHS:\n return (yearAge * 12) + monthsAge + (daysAge / 30.44); // 30.44 para promedio mensual\n case GrowthMeasurementUnitType.WEEKS:\n return (yearAge * 52) + (monthsAge * 4.34524) + (daysAge / 7); // 4.34524 promedio de semanas por mes\n default:\n return 0;\n }\n }\n\n private getAxisYTextByType(hca:any):string{\n let value = this.getAxisYByType(hca);\n\n return this.translation.translate(`shared.growthChartsTab.axisYWithValue${this.type}`, { value });\n }\n\n private getAxisYByType(hca:any):number{\n switch (this.type) {\n case ChartType.SIZE_FOR_AGE:\n default:\n return hca.valorTallaCm;\n case ChartType.WEIGHT_FOR_AGE:\n return hca.valorPesoKg;\n case ChartType.BMI_FOR_AGE:\n return hca.valorIMC;\n case ChartType.HEAD_CIRCUMFERENCE_FOR_AGE:\n return hca.valorCircunferenciaCefalicaCm;\n }\n }\n\n private showEmptyState() {\n const chartContainer = document.getElementById('chart_' + this.type);\n\n if (chartContainer) {\n chartContainer.innerHTML = '';\n\n const emptyStateDiv = document.createElement('div');\n emptyStateDiv.className = 'empty-state';\n\n const img = document.createElement('img');\n img.src = '/assets/images/curvas_crecimiento/empy_state_curvas.png';\n img.alt = 'Empty State';\n img.className = 'image-empty';\n emptyStateDiv.appendChild(img);\n\n const selectedRange = this.ranges.find(r => r.id === this.selectedRange);\n const selectedRangeText = this.layoutService.getTextByLanguage(selectedRange?.nombre, this.locale.language).toLowerCase();\n\n const tipoMedicion = this.layoutService.getTextByLanguage(this.translation.translate(`shared.growthCharts.labeltab_${this.type}`), this.locale.language);\n\n let tabText;\n\n switch (this.type) {\n case 4: \n tabText = \"IMC\";\n break;\n default:\n tabText = tipoMedicion.split(' ')[0].toLowerCase();\n break;\n }\n\n const text = `No hay datos de ${tabText} que graficar para la escala `;\n\n const textDiv = document.createElement('div');\n textDiv.className = 'empty-state-text text-common';\n textDiv.innerHTML = text;\n\n // Creo un span para el selectedRangeText\n const rangeTextSpan = document.createElement('span');\n rangeTextSpan.className = 'range-text';\n rangeTextSpan.innerText = selectedRangeText;\n\n // Agrego evento de clic al span para desplegar el menu de rangos\n rangeTextSpan.addEventListener('click', () => {\n if (this.rangeSelect) {\n this.rangeSelect.open();\n }\n });\n\n textDiv.appendChild(rangeTextSpan);\n emptyStateDiv.appendChild(textDiv);\n\n // Agrego texto descripcion\n const additionalTextDiv = document.createElement('div');\n additionalTextDiv.className = 'additional-text text-common';\n additionalTextDiv.innerText = \"Para ver informaciĆ³n de crecimiento, puedes probar cambiando la escala y/o navegando entre las diferentes pestaƱas de Peso, Talla, Cabeza, etc.\";\n\n emptyStateDiv.appendChild(additionalTextDiv);\n chartContainer.appendChild(emptyStateDiv);\n }\n }\n}\n\nexport class CanvasDataModel{\n type: string;\n name: string;\n lineColor: string;\n markerSize: number;\n markerColor: string;\n color: string;\n indexLabelFontSize: number;\n indexLabelFontFamily: string;\n indexLabelFontColor: string;\n showInLegend: boolean;\n dataPoints: any\n}\nexport class AxisXCanvasDataModel{\n title: string | undefined;\n titleFontSize: number;\n titleFontFamily: string;\n titleFontColor: string;\n interval: number;\n viewportMinimum: number;\n viewportMaximun: number;\n minimum: number;\n maximun: number;\n}\n\nexport class CanvasDataPoint {\n x: number;\n y: number;\n xReference: string;\n yReference: string;\n references: string;\n}\n","
\n\n
\n \n \n \n {{ 'shared.growthCharts.breadcrumbs2' | translate:locale.language }}\n
\n
\n
\n \n
\n {{model.patientFirstName + ' ' + model.patientLastName}}\n {{ model.patientBirthDate | ageFromBirthday }}\n
1\">\n \n \n \n {{ doctor.nombre }}\n \n \n \n
\n \n \n \n \n \n \n \n \n
\n
","import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { ActivatedRoute, Params } from '@angular/router';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { AvatarUploadComponentOptions, AvatarUploadedFileModel } from '../avatar-upload/avatar-upload.component';\nimport { DependentRequest } from '../../models/people/dependent.model';\nimport { GrowthMeasurementType } from '../../models/clinic-history/growth-measurement-type.model';\nimport { GrowthMeasurementsService } from 'src/app/core/services/growth-measurements.service';\nimport { GrowthMeasurements } from '../../models/clinic-history/growth-measurements.model';\nimport { Subject } from 'rxjs';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { BaseService } from 'src/app/core/services/base.service';\n\n@Component({\n selector: 'app-growth-charts',\n templateUrl: './growth-charts.component.html',\n styleUrls: ['./growth-charts.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n@ComponentLookup('GrowthChartsComponent')\nexport class GrowthChartsComponent implements IControlComponent, OnInit, OnDestroy {\n data: any;\n private ngUnsubscribe = new Subject();\n private tabChangeSubject = new Subject();\n loading: boolean;\n tabLoading: boolean = false;\n model: GrowthChartsModel = new GrowthChartsModel();\n avatarUploadOptions : AvatarUploadComponentOptions;\n\n showDoctorSelect: boolean = true;\n selectedDoctorId: number = 0;\n\n selectedTabIndex = 0;\n initializedTabs: boolean[];\n\n patientId?: number;\n\n constructor(\n private route: ActivatedRoute,\n private userService: UserService,\n private baseService: BaseService,\n private growthMeasurementsService: GrowthMeasurementsService,\n private translation: L10nTranslationService,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnInit(): void {\n this.loading = true;\n\n this.initAvatarUploadOptions();\n\n this.growthMeasurementsService.getMeasurementTypes()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(measurementTypes=>{\n this.initGrowthChartTabs(measurementTypes);\n });\n\n this.tabChangeSubject\n .pipe(takeUntil(this.ngUnsubscribe), debounceTime(570))\n .subscribe(this._onTabChange.bind(this));\n\n this.route.queryParams\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((queryParams) => {\n this.configByParams(queryParams);\n },\n error => {\n console.log(error)\n\n this.loading = false;\n });\n }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n updateDoctor($event: any){\n this.selectedDoctorId = $event.value;\n this.getGrowthMeasurementsPatient(this.selectedDoctorId);\n }\n\n onAvatarUploaded(file: AvatarUploadedFileModel) {\n this.model.patientAvatar = file?.webUrl;\n this.model.patientObject.ubicacionLogo = file?.webUrl;\n\n if(this.model.patientDependentRelationId > 0){\n //dependiente\n var model = new DependentRequest();\n\n model.idPersona = this.model.patientId; \n model.idRelacionDependiente = this.model.patientDependentRelationId;\n model.nombre = this.model.patientFirstName;\n model.apellido = this.model.patientLastName;\n model.fechaNacimiento = this.model.patientBirthDate;\n model.sexo = this.model.patientGender;\n model.tipoRelacion = this.model.patientRelationType;\n model.ubicacionLogo = this.model.patientAvatar;\n\n this.userService.createOrUpdateDependent(model);\n }\n else{\n this.userService.updateUserLoggedIn(this.model.patientObject);\n } \n }\n\n onTabChange(event: any): void {\n this.tabChangeSubject.next(event)\n }\n\n private _onTabChange(index: number): void {\n const trueIndex = this.initializedTabs.findIndex(x => x);\n\n if (trueIndex >= 0 && index != trueIndex) {\n this.initializedTabs[trueIndex] = false;\n this.setSelectedTabIndex(index);\n }\n }\n\n private configByParams(params: Params){\n if(params[\"idResponsableServicio\"]){\n this.showDoctorSelect = false;\n this.selectedDoctorId = params[\"idResponsableServicio\"];\n }\n\n if(params[\"p\"]){\n this.patientId = +params[\"p\"];\n\n //dependiente\n this.userService.getUserDependents()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(dependents => {\n \n let dependent = dependents.find(d=> d.idPersona == +params[\"p\"]);\n\n if(dependent){\n this.model.patientId = dependent.idPersona;\n this.model.patientFirstName = dependent.nombre;\n this.model.patientLastName = dependent.apellido;\n this.model.patientAvatar = dependent.ubicacionLogo;\n this.model.patientBirthDate = dependent.fechaNacimiento;\n this.model.patientGender = dependent.sexo;\n this.model.patientRelationType = dependent.tipoRelacion;\n this.model.patientDependentRelationId = dependent.id;\n this.model.patientObject = dependent;\n\n this.loadGrowthData();\n this.loading = false;\n }\n });\n\n }\n else{\n this.userService.getUserPersonLoggedIn()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(p => {\n if (p) {\n this.model.patientId = p.id;\n this.model.patientFirstName = p.nombre;\n this.model.patientLastName = p.apellido;\n this.model.patientAvatar = p.ubicacionLogo;\n this.model.patientBirthDate = p.fechaNacimiento;\n this.model.patientGender = p.sexo;\n this.model.patientObject = p;\n\n this.loadGrowthData();\n\n this.loading = false;\n } \n });\n }\n }\n\n private loadGrowthData(){\n const doctorId = this.model.growthMeasurements && this.model.growthMeasurements.idResponsableMedicion > 0 \n ? this.model.growthMeasurements.idResponsableMedicion\n : this.selectedDoctorId > 0\n ? this.selectedDoctorId\n : -1;\n\n this.getGrowthMeasurementsPatient(doctorId);\n }\n\n private getGrowthMeasurementsPatient(doctorId: number){\n this.tabLoading = true;\n this.growthMeasurementsService.getByPatientId(\n this.model.patientId, \n this.baseService.getCompanyId(),\n doctorId \n ).subscribe(growthMeasurements=>{\n this.model.growthMeasurements = growthMeasurements;\n\n if(this.showDoctorSelect && growthMeasurements && growthMeasurements.responsablesAsociados.length > 0){\n this.selectedDoctorId = growthMeasurements.responsablesAsociados[0].id;\n }\n\n this.tabLoading = false;\n });\n }\n\n private initAvatarUploadOptions(){\n this.avatarUploadOptions = new AvatarUploadComponentOptions();\n this.avatarUploadOptions.requiredFileType = \"image/png,image/jpeg\";\n this.avatarUploadOptions.selectFileLabel = \"aƱadir foto\";\n this.avatarUploadOptions.changeFileLabel = \"Editar\";\n this.avatarUploadOptions.showFileOnceUpload = true;\n\n this.avatarUploadOptions.selectFileLabel = this.translation.translate('shared.growthCharts.selectFile');\n this.avatarUploadOptions.changeFileLabel = this.translation.translate('shared.growthCharts.changeFile');\n this.avatarUploadOptions.changePictureLabel = this.translation.translate('shared.growthCharts.changePicture');\n this.avatarUploadOptions.deleteFileLabel = this.translation.translate('shared.growthCharts.deleteFile');\n }\n\n private initGrowthChartTabs(measurementTypes: GrowthMeasurementType[]){\n this.model.growthTabsModel = measurementTypes;\n\n this.initializedTabs = new Array(this.model.growthTabsModel.length).fill(false);\n this.setSelectedTabIndex(0);\n }\n\n private setSelectedTabIndex(index: number): void {\n this.selectedTabIndex = index;\n this.initializedTabs[this.selectedTabIndex] = true;\n }\n\n}\n\nexport class GrowthChartsModel{\n patientId: number;\n patientAvatar: string;\n patientFirstName: string;\n patientLastName: string;\n patientBirthDate: Date;\n patientGender: string;\n patientRelationType: number;\n patientDependentRelationId: number;\n patientObject: any;\n\n growthTabsModel: GrowthMeasurementType[];\n growthMeasurements: GrowthMeasurements;\n}\n\n\n\n","
\n \n \n \n
\n \n
\n
\n
\n \n
\n\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { WorkflowLookup } from 'src/app/shared/decorators/workflow-lookup.decorator';\nimport { BaseWorkflowComponent } from '../base-workflow/base-workflow.component';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { DOCUMENT, Location } from '@angular/common';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { LoginCompletedMessage, MessageBusService, ServiceErrorMessage } from 'src/app/core/services/message-bus.service';\nimport { PublicProfileService } from 'src/app/core/services/public-profile.service';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { WorkflowService } from 'src/app/core/services/workflow.service';\nimport { WorkflowStepService } from 'src/app/core/services/workflow-step.service';\nimport { AppointmentService } from 'src/app/core/services/appointment.service';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { AuthService } from 'src/app/core/services/auth.service';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Observable, of } from 'rxjs';\nimport { ConfirmDialogComponent } from '../../dialogs/confirm-dialog/confirm-dialog.component';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\nimport { catchError, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { CompanyModel } from 'src/app/shared/models/systems/company.model';\nimport { StatesRequestVerifyDataModel } from '../../states-request-verify/states-request-verify.component';\nimport { OnlineAppointmentStatus } from 'src/app/shared/enums/online-appointment-status.enum';\nimport { GrowthCurvesWorkflowState } from 'src/app/shared/models/workflow/states/growth-curves-workflow-state.model';\nimport { WorkflowInitialData } from 'src/app/shared/models/process/workflow-initial-data.model';\nimport { RequestsToVerifyConfirmationResponse, RequestsToVerifyService } from 'src/app/core/services/requests-to-verify.service';\nimport { SenderPatientRelationship } from 'src/app/shared/models/process/base-request.model';\nimport { RequestToVerifySummary } from 'src/app/shared/interfaces/request-to-verify-summary';\nimport { PublicProfile } from 'src/app/shared/models/people/public-profile.model';\nimport { RequestToVerifyUpdateModel } from 'src/app/shared/models/systems/resquest-to-verify-update.model';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\n\n@Component({\n selector: 'app-growth-curves-workflow',\n templateUrl: './growth-curves-workflow.component.html',\n styleUrls: ['./growth-curves-workflow.component.css']\n})\n@WorkflowLookup('GrowthCurvesWorkflowComponent')\nexport class GrowthCurvesWorkflowComponent extends BaseWorkflowComponent implements OnInit {\n\n logoutFn: () => void;\n onlineAppointmentStatus: OnlineAppointmentStatus;\n showState = false;\n data: RequestToVerifySummary;\n state: GrowthCurvesWorkflowState = new GrowthCurvesWorkflowState();\n statesRequestVerifyDataModel: StatesRequestVerifyDataModel;\n updatedUserLoggedIn: boolean = false;\n\n constructor(\n @Inject(DOCUMENT) protected document: Document,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n protected baseService: BaseService,\n protected location: Location,\n protected messageBusService: MessageBusService,\n protected publicProfileService: PublicProfileService,\n protected route: ActivatedRoute,\n protected workflowService: WorkflowService,\n protected workflowStepService: WorkflowStepService,\n private appointmentService: AppointmentService,\n private requestToVerifyService: RequestsToVerifyService,\n private authService: AuthService,\n private dialog: MatDialog,\n private router: Router,\n private translation: L10nTranslationService,\n private requestsToVerifyService: RequestsToVerifyService,\n private userService: UserService\n ) {\n super(location, route, baseService, messageBusService, publicProfileService, workflowService, workflowStepService, document);\n this.logoutFn = this.logout.bind(this);\n }\n\n ngOnInit(): void { \n if(this.data && this.data.idVerificacion){\n this.checkMedicalOrderStatus();\n } else{\n this.startWorkflow();\n }\n }\n\n private checkMedicalOrderStatus(): void {\n this.appointmentService.getStatus(this.data.idVerificacion).subscribe(\n this.getStatusNext.bind(this),\n _ => this.messageBusService.serviceError(new ServiceErrorMessage(\"Error getting request status\"))\n );\n }\n\n private getStatusNext(status: OnlineAppointmentStatus): void {\n this.onlineAppointmentStatus = status;\n\n if(this.onlineAppointmentStatus == OnlineAppointmentStatus.POR_COMPLETAR \n || this.onlineAppointmentStatus == OnlineAppointmentStatus.COMPLETADA){\n this.showState = false;\n this.startWorkflow();\n } else{\n this.configStatusView();\n this.showState = true;\n }\n }\n\n configStatusView(): void {\n this.statesRequestVerifyDataModel = new StatesRequestVerifyDataModel();\n\n this.statesRequestVerifyDataModel.buttonActionFn = this.gotoHome.bind(this);\n this.statesRequestVerifyDataModel.buttonTextRefI18n = 'shared.statesRequestVerify.buttonHomeText';\n this.statesRequestVerifyDataModel.companyLogoUrl = 'assets/images/cliniweb/logo-cliniweb-phr.svg';\n this.statesRequestVerifyDataModel.mainImageUrl = 'assets/images/cliniweb/Campana.gif';\n this.statesRequestVerifyDataModel.showActionButton = true;\n this.statesRequestVerifyDataModel.showHomeButton = false;\n this.statesRequestVerifyDataModel.textRefI18n = 'shared.statesRequestVerify.scheduledAppointment';\n }\n\n gotoHome(): void {\n this.router.navigate(['/']);\n }\n\n startWorkflow(): void {\n // Set this workflow as active\n this.workflowService.setWorkflowTypeActive(STORAGE.GROWTH_CURVES_WORKFLOW_STATE);\n\n // Get state\n this.getState().subscribe((state: GrowthCurvesWorkflowState)=>{\n this.state = state;\n\n this.workflowService.setWorkflowDataState(this.state);\n this.init();\n });\n\n this.progressBarModel.closeFn = this.closeWorkflow.bind(this);\n }\n\n getState() : Observable {\n var state = this.workflowService.getWorkflowDataState() as GrowthCurvesWorkflowState;\n\n if(state){\n return of(state);\n }\n else if(this.data){\n return this.buildStateFromModel(this.data);\n }\n else {\n // This can happend if the user left the tab open with the workflow\n // When session expire the session variable with the workflow state will disappear\n // Go back to home\n this.router.navigate(['/']);\n throw \"State expired\";\n } \n }\n\n buildStateFromModel(sourceModel: RequestToVerifySummary) : Observable {\n let state = new GrowthCurvesWorkflowState();\n let growthCurvesRequest = new WorkflowInitialData();\n\n growthCurvesRequest.idTipoSolicitud = sourceModel.idTipoSolicitud;\n growthCurvesRequest.checkoutUrl = this.document.location.origin + '/curvas-crecimiento/'; \n growthCurvesRequest.localizacion = this.locale.language;\n\n growthCurvesRequest.perfilPublico = new PublicProfile();\n growthCurvesRequest.perfilPublico.id = sourceModel.idResponsableServicio;\n growthCurvesRequest.perfilPublico.nombrePersona = sourceModel.nombreResponsableServicio;\n growthCurvesRequest.perfilPublico.ubicacionFoto = sourceModel.ubicacionFoto;\n\n growthCurvesRequest.idUsuario = sourceModel.idUsuario;\n growthCurvesRequest.idPaciente = sourceModel.idPaciente;\n growthCurvesRequest.nombrePaciente = sourceModel.nombrePaciente;\n growthCurvesRequest.relacionEmisorPaciente = sourceModel.relacionEmisorPaciente;\n\n growthCurvesRequest.workflowPosition = sourceModel.workflowPosition;\n\n return this.baseService.getCompanyByLicense()\n .pipe(switchMap((company: CompanyModel)=>{\n growthCurvesRequest.idEmpresaOrigen = company.id;\n growthCurvesRequest.nombreEmpresaOrigen = company.name;\n\n state.requestModel = growthCurvesRequest;\n state.idVerificacion = sourceModel.idVerificacion;\n\n return of(state);\n }), \n catchError((err) => {\n this.baseService.handleServiceError(err, \"Error getting growth curves request\");\n return of(state);\n }));\n }\n\n closeWorkflow(ruta = 'welcome') {\n // Only show the message if the user is logged in\n if (this.state && this.state.getUserId() > 0 && ruta == 'welcome') {\n\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"shared.medicalOrder.dialog.title\");\n dialogData.message = this.translation.translate(\"shared.medicalOrder.dialog.message\");\n dialogData.confirmText = this.translation.translate(\"shared.medicalOrder.dialog.confirmText\"); \n dialogData.cancelText = this.translation.translate(\"shared.medicalOrder.dialog.cancelText\");\n dialogData.showHeaderIcon = false;\n dialogData.showCancelButton = true;\n dialogData.loadLicense = true;\n\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n data: dialogData,\n panelClass: 'cancel-appointment-dialog'\n });\n\n dialogRef.afterClosed().subscribe(accepted => {\n\n if(accepted){\n this._closeWorkflow(ruta);\n }\n });\n }\n else {\n this._closeWorkflow(ruta);\n } \n }\n\n private _closeWorkflow(ruta: string) {\n this.messageBusService.showHeader();\n\n this.workflowCleanup();\n\n this.router.navigateByUrl(ruta);\n }\n\n logout(): void {\n this.authService.logout();\n\n this.stepIndex = 0;\n this.loadStep();\n }\n\n updateWorkflowStateData(): Observable {\n\n if(this.authService.isLoggedIn()){\n\n let updateModel = new RequestToVerifyUpdateModel();\n updateModel.idPacientePhr = this.state.getPatientIdRelationship();\n updateModel.tipoRelacionPacienteUsuario = this.state.getPatientRelationship();\n updateModel.workflowPosition = this.state.getPosition();\n updateModel.esUsuarioNuevo = this.userService.wasUserCreated() ? 'S' : 'N';\n \n return this.requestToVerifyService.update(this.state.idVerificacion, updateModel)\n .pipe(map((model:RequestToVerifyUpdateModel)=>{\n\n if(updateModel.esUsuarioNuevo == 'S' && !this.updatedUserLoggedIn){\n\n setTimeout(() => {\n this.userService.getUserPersonLoggedInFromService().subscribe((user:UserPerson | null)=>{\n if (user){\n this.messageBusService.loginCompleted(new LoginCompletedMessage(user));\n this.updatedUserLoggedIn = true;\n }\n });\n }, 2000);\n }\n return true;\n }),\n catchError(err=>{\n this.baseService.handleServiceError(err, \"Error updating medical order request\");\n return of();\n }));\n }\n else{\n return of(true);\n }\n }\n\n workflowCleanup() {\n this.workflowService.removeWorkflowData(STORAGE.GROWTH_CURVES_WORKFLOW_STATE);\n }\n\n completeWorkflowStateData(): Observable {\n const state: GrowthCurvesWorkflowState = this.workflowService.getWorkflowDataState(STORAGE.GROWTH_CURVES_WORKFLOW_STATE);\n const idResponsableServicio: number = state.getPublicProfile()?.id;\n\n this.requestsToVerifyService.confirmation(state.getIdVerificacion())\n .subscribe(confirmacionResponse => {\n this.userService.getUserIdLoggedIn()\n .subscribe((userId: number) => {\n let url = `mi-salud/curvas-crecimiento?idResponsableServicio=${idResponsableServicio}`;\n\n if (confirmacionResponse.idPaciente != userId) {\n url += `&p=${confirmacionResponse.idPaciente}`;\n }\n \n this.messageBusService.closeWorkFlowRequest(url);\n })\n \n });\n\n return of();\n }\n}\n","
\n
\n {{ 'shared.selectPatientRelationship.title' | translate:locale.language }}\n
\n
\n \n \n \n {{ user.nombre }}\n {{'shared.selectPatientRelationship.userRelationship' | translate:locale.language}}\n \n \n \n {{dependent.nombre}}\n {{getRelationshipText(dependent)}}\n \n \n \n {{'shared.selectPatientRelationship.otherText' | translate:locale.language}}\n {{'shared.selectPatientRelationship.otherDescription' | translate:locale.language}}\n \n \n
\n\n
\n \n
\n
\n
\n
","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\nimport { L10N_LOCALE, L10nLocale, L10nTranslationService } from 'angular-l10n';\nimport { SelectPatientRelationshipModel } from '../../models/workflow/models/select-patient-relationship.model';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { takeUntil } from 'rxjs/operators';\nimport { Subject, zip } from 'rxjs';\nimport { Dependent } from '../../models/people/dependent.model';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { UserPerson } from '../../models/people/user-person.model';\nimport { UtilsService } from 'src/app/core/services/utils.service';\nimport { SenderPatientRelationship } from '../../models/process/base-request.model';\n\n@Component({\n selector: 'app-select-patient-relationship',\n templateUrl: './select-patient-relationship.component.html',\n styleUrls: ['./select-patient-relationship.component.css'],\n encapsulation: ViewEncapsulation.None\n})\n\n@ComponentLookup(ComponentName.SELECT_PATIENT_RELATIONSHIP)\nexport class SelectPatientRelationshipComponent implements IControlComponent, OnInit {\n data: FormComponentData;\n \n model:SelectPatientRelationshipModel = new SelectPatientRelationshipModel();\n private ngUnsubscribe = new Subject();\n formSubmitted: boolean = false;\n loading: boolean = false;\n user: UserPerson;\n dependents: Dependent[] = [];\n patientRelationshipTypeForm:FormGroup;\n showForm:boolean = false;\n\n constructor(\n private baseService: BaseService,\n private userService: UserService,\n private utilsService: UtilsService,\n private formBuilder: FormBuilder,\n private messageBusService: MessageBusService,\n private translation: L10nTranslationService,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n \n\n ngOnInit(): void {\n this.loadDataModel();\n\n const _getUserLoggedIn$ = this.userService.getUserPersonLoggedIn();\n const _getUserDependents$ = this.userService.getUserDependents();\n\n zip(_getUserLoggedIn$, _getUserDependents$)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(([user, dependents])=>{\n\n if(!user)\n return;\n \n this.user = user;\n this.dependents = dependents;\n // Order by age desc\n this.dependents = this.dependents.sort((d1: Dependent, d2: Dependent) => {\n let getTime = (date: Date) => {return date != null ? new Date(date).getTime() : 0;};\n \n return getTime(d1.fechaNacimiento) - getTime(d2.fechaNacimiento);\n });\n\n this.loadForm();\n\n this.sendComponentFinishLoadingMessage();\n },\n error=>{\n this.baseService.handleServiceError(error, \"Error getting user info\");\n });\n }\n\n getUserAvatar(user: UserPerson){ \n return user.ubicacionLogo\n ? user.ubicacionLogo\n : this.utilsService.getPersonDefaultAvatarUrl(user.fechaNacimiento, user.sexo);\n }\n\n getDependentAvatar(dependent: Dependent){\n return dependent.ubicacionLogo\n ? dependent.ubicacionLogo\n : this.utilsService.getPersonDefaultAvatarUrl(dependent.fechaNacimiento, dependent.sexo);\n }\n\n getRelationshipText(dependent: Dependent){\n return this.translation.translate(`shared.selectPatientAppointmentCheckout.relationship_${dependent.tipoRelacion}_${dependent.sexo}`);\n }\n\n onClickContinue(){\n this.formSubmitted = true;\n \n if (this.patientRelationshipTypeForm.invalid) {\n return;\n }\n\n this.loading = true;\n\n let _valueSelected = +(this.patientRelationshipTypeForm.controls.relationship.value);\n\n let _dependentSelected = this.dependents.find(d=> d.idPersona == _valueSelected);\n\n if(_dependentSelected){\n this.model.patientRelationship = _dependentSelected.tipoRelacion;\n this.model.patientIdRelationship = _dependentSelected.idPersona;\n }\n else if(this.user.id == _valueSelected){\n this.model.patientIdRelationship = this.user.id;\n this.model.patientRelationship = SenderPatientRelationship.USUARIO;\n }\n else {\n this.model.patientIdRelationship = 0;\n this.model.patientRelationship = SenderPatientRelationship.OTRO;\n }\n\n this.continueFlow();\n }\n\n private continueFlow() {\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.SELECT_PATIENT_RELATIONSHIP;\n\n message.data = this.model;\n\n this.messageBusService.onComponentDataSetMessage(message); \n }\n\n private loadDataModel() {\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as SelectPatientRelationshipModel; \n } \n }\n\n private loadForm(){\n this.patientRelationshipTypeForm = this.formBuilder.group(\n {\n relationship: [this.model.patientIdRelationship, [Validators.required]]\n }\n );\n\n this.showForm = true;\n }\n\n private sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n}\n","
\n
\n {{ title | translate:locale.language }}\n
\n \n \n \n {{ relationType.viewValue | translate:locale.language }}\n \n \n \n
\n \n
\n
\n
\n
","import { Component, Inject, OnInit } from '@angular/core';\nimport { ComponentLookup } from '../../decorators/component-lookup.decorator';\nimport { ComponentName } from '../../enums/component-name.enum';\nimport { IControlComponent } from '../../interfaces/control-component';\nimport { FormComponentData } from '../../models/people/form-control.model';\nimport { CreatePatientRelationshipDataModel } from '../../models/workflow/models/create-patient-relationship-data.model';\nimport { Subject } from 'rxjs';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { SenderPatientRelationship } from '../../models/process/base-request.model';\nimport { ComponentDataSetMessage, ComponentFinishLoadingMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\n\n@Component({\n selector: 'app-create-patient-relationship',\n templateUrl: './create-patient-relationship.component.html',\n styleUrls: ['./create-patient-relationship.component.css']\n})\n@ComponentLookup(ComponentName.CREATE_PATIENT_RELATIONSHIP)\nexport class CreatePatientRelationshipComponent implements IControlComponent, OnInit {\n data: FormComponentData;\n\n title: string;\n model:CreatePatientRelationshipDataModel = new CreatePatientRelationshipDataModel();\n\n formSubmitted: boolean = false;\n loading: boolean = false;\n relationTypes: RelationTypeOption[] = [];\n createPatientRelationshipForm:FormGroup;\n showForm:boolean = false;\n\n constructor(\n private messageBusService: MessageBusService,\n private formBuilder: FormBuilder,\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n \n ngOnInit(): void {\n\n this.loadDataModel();\n\n this.configTitle();\n\n this.loadForm();\n\n this.sendComponentFinishLoadingMessage();\n }\n\n onClickContinue(){\n this.formSubmitted = true;\n \n if (this.createPatientRelationshipForm.invalid) {\n return;\n }\n\n this.loading = true;\n\n let _valueSelected = +(this.createPatientRelationshipForm.controls.relationship.value);\n\n this.model.patientRelationship = _valueSelected;\n\n this.continueFlow();\n }\n \n private continueFlow() {\n let message = new ComponentDataSetMessage();\n message.componentName = ComponentName.CREATE_PATIENT_RELATIONSHIP;\n\n message.data = this.model;\n\n this.messageBusService.onComponentDataSetMessage(message); \n }\n\n private configTitle(){\n this.title = this.model.patientRelationship == SenderPatientRelationship.OTRO\n ? 'shared.createPatientRelationship.title1'\n : 'shared.createPatientRelationship.title2'\n }\n\n private loadDataModel() {\n if (this.data && this.data.configurationData) {\n this.model = this.data.configurationData as CreatePatientRelationshipDataModel; \n } \n }\n\n private loadForm(){\n\n if(this.model.patientRelationship != SenderPatientRelationship.OTRO){\n this.relationTypes.push({\n value: SenderPatientRelationship.USUARIO, \n viewValue: 'shared.createPatientRelationship.relationship_' + SenderPatientRelationship.USUARIO\n });\n }\n\n let relationTypeIds = [\n SenderPatientRelationship.PROGENITOR_DE,\n SenderPatientRelationship.HIJO_DE,\n SenderPatientRelationship.ESPOSO,\n SenderPatientRelationship.HERMANO,\n SenderPatientRelationship.ABUELO,\n SenderPatientRelationship.TUTOR,\n SenderPatientRelationship.DEPENDIENTE_FAMILIAR_DE\n ];\n\n relationTypeIds.forEach(relationTypeId=> {\n this.relationTypes.push({value: relationTypeId, viewValue: 'shared.createPatientRelationship.relationship_' + relationTypeId });\n });\n\n this.createPatientRelationshipForm = this.formBuilder.group(\n {\n relationship: [this.model.patientRelationship, [Validators.required]]\n }\n );\n\n this.showForm = true;\n }\n\n private sendComponentFinishLoadingMessage(){\n let event = new ComponentFinishLoadingMessage();\n event.idFormulario = this.data.idFormulario;\n event.idControl = this.data.idControlPadre;\n\n this.messageBusService.componentFinishLoading(event); \n }\n}\n\nexport interface RelationTypeOption{\n value: number;\n viewValue: string;\n}","
\n\n
\n \n \n {{location.objetoDetalle5}}\n \n \n {{ 'shared.searchResults.providerCard.unspecified' | translate:locale.language }}\n \n
\n\n
\n \n {{ item.value }}\n
\n\n
\n
\n
\n \n \n {{ 'shared.searchResults.providerCard.unspecified' | translate:locale.language }}\n \n
\n
\n
\n\n
","import { Component, HostBinding, Inject, Input, OnChanges, OnInit, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { ProfileLocationResultModel } from 'src/app/shared/models/people/profile-search-results.model';\n\n@Component({\n selector: 'app-provider-card-contacts',\n templateUrl: './provider-card-contacts.component.html',\n styleUrls: ['./provider-card-contacts.component.css']\n})\nexport class ProviderCardContactsComponent implements OnChanges {\n\n @HostBinding('style.margin-top') flexGrow = 'auto';\n @Input() location: ProfileLocationResultModel;\n @Input() isDoctorProfile = true;\n\n locations: any[];\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale\n ) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.location) {\n this.mapObjetoToArray();\n }\n }\n\n private mapObjetoToArray() {\n this.locations = [\n {\n icon: 'whatsapp',\n value: this.location.objetoDetalle1\n },\n {\n icon: 'PHR-phone',\n value: this.location.objetoDetalle2\n },\n {\n icon: 'PHR-mail',\n value: this.location.objetoDetalle4\n },\n ].filter(x => x.value);\n }\n\n}\n","
\n\n
\n\n \n\n
\n {{ locationTitle }}\n
\n\n
\n {{ locationAvailability | translate:locale.language }}\n
\n\n {{locationAddress}}\n\n
\n \n {{ 'shared.searchResults.providerCard.bookAppointmentByPhone' | translate:locale.language }}\n \n \n {{ 'shared.searchResults.providerCard.seeAttentionHours' | translate:locale.language }}\n \n
\n\n \n\n
\n\n
\n","import { Component, EventEmitter, Inject, Input, OnChanges, Output, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { MapDialogData } from 'src/app/shared/models/dialog-data.model';\nimport { ProfileLocationResultModel, ProfileResultModel } from 'src/app/shared/models/people/profile-search-results.model';\nimport { MapDialogComponent } from '../../../dialogs/map-dialog/map-dialog.component';\n\n@Component({\n selector: 'app-provider-card-location',\n templateUrl: './provider-card-location.component.html',\n styleUrls: ['./provider-card-location.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ProviderCardLocationComponent implements OnChanges {\n\n @Input() location: ProfileLocationResultModel;\n @Input() isDoctorProfile = false;\n @Input() provider: ProfileResultModel;\n @Output() goToProfile: EventEmitter = new EventEmitter();\n\n locationAddress = '';\n locationAvailability = '';\n locationIconClass = '';\n locationTitle = '';\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private dialog: MatDialog\n ) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.location) {\n this.setLocationIconClass();\n this.setLocationAddress();\n this.setLocationAvailability();\n this.setLocationTitle();\n }\n }\n\n setLocationAddress(): void {\n let result = \"\";\n\n if (this.location.diLocalidad2)\n result += this.location.diLocalidad2;\n\n if (this.location.diLocalidad1) {\n if (result && !result.endsWith(\",\") && !result.endsWith(\".\") && !result.endsWith(\"-\"))\n result += \" - \";\n\n result += this.location.diLocalidad1;\n }\n\n if (this.location.ciudad) {\n if (result && !result.endsWith(\",\") && !result.endsWith(\".\"))\n result += \", \";\n\n result += \" \" + this.location.ciudad;\n }\n\n if (this.location.pais) {\n if (result && !result.endsWith(\",\") && !result.endsWith(\".\"))\n result += \", \";\n\n result += \" \" + this.location.pais;\n }\n\n this.locationAddress = result;\n }\n\n private setLocationIconClass(): void {\n this.locationIconClass = this.location?.teleconsulta != \"S\" \n ? 'phr-iconset-PHR-place' \n : 'phr-iconset-PHR-video';\n }\n\n private setLocationAvailability(): void {\n const availability = this.provider?.citaEnLineaHab != 'N' ? 'bookAppointment' : 'viewProfile';\n\n this.locationAvailability = `shared.searchResults.providerCard.${availability}`;\n }\n\n goToProfileEvent($event:Event) {\n this.goToProfile.emit($event)\n }\n\n onClickHowToGetButton(location: ProfileLocationResultModel, $event:Event){\n \n $event.preventDefault();\n $event.stopPropagation();\n\n let data = new MapDialogData();\n \n data.title = this.locationTitle;\n // data.description = this.getLocationAddress(location);\n data.showWazeButton = true;\n data.message = location.objetoDetalle3;\n data.animationIn = 'map-phr-animation-in';\n data.animationOut = 'map-phr-animation-out';\n data.showCloseTextButton = true;\n\n this.dialog.open(MapDialogComponent, { \n panelClass: ['map-dialog','map-phr-dialog', 'map-phr-animation-in'],\n data: data\n });\n }\n\n setLocationTitle(): void {\n let result = \"\";\n\n if (this.location.empresaObjetoPerfilPublico)\n result = this.location.empresaObjetoPerfilPublico;\n\n if (this.location.empresaPerfilPublico && this.location.empresaPerfilPublico.trim() != \".\")\n result += (result ? \" - \" : \"\") + this.location.empresaPerfilPublico;\n\n this.locationTitle = result;\n }\n\n}\n","
\n\n
\n Delivery\n \n {{featuresConceptsText | i18nText:locale.language }}\n
\n\n
\n \n
\n \n \n\n
\n {{ provider.redes }}\n {{provider.nombre}}\n
\n {{provider.especialidad}}\n {{provider.subespecialidad}}\n
\n
\n\n \n\n
","import { Component, Inject, Input, OnChanges, OnInit, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { PublicProfileAvatarComponentModel } from '../../../public-profile-avatar/public-profile-avatar.component';\nimport { ProfileResultModel, PublicProfileType } from 'src/app/shared/models/people/profile-search-results.model';\nimport { BaseService } from 'src/app/core/services/base.service';\nimport { FeatureConceptDto } from '../provider-card.component';\nimport { TextLanguage } from 'src/app/shared/models/people/text-language.model';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\n\n@Component({\n selector: 'app-provider-card-profile',\n templateUrl: './provider-card-profile.component.html',\n styleUrls: ['./provider-card-profile.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ProviderCardProfileComponent implements OnChanges {\n\n @Input() isClinicProfile = false;\n @Input() isDoctorProfile = true;\n @Input() set profile(provider: ProfileResultModel) {\n this.provider = provider; \n }\n\n avatarModel: PublicProfileAvatarComponentModel;\n featureConceptIconClassName = 'phr-iconset-';\n featuresConceptsText: string | TextLanguage[] = '';\n isCliniwebCompany = false;\n isPharmacyProfile = false;\n provider = new ProfileResultModel();\n profileTypeIconClassName = '';\n showAvatarInitials = false;\n\n constructor(\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private baseService: BaseService\n ) {\n this.isCliniwebCompany = this.baseService.isCliniwebCompany();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.profile) {\n this.setAvatarModel();\n this.setIsPharmacyProfile();\n this.setFeatureConcepts();\n this.setShowAvatarInitials();\n this.setProfileTypeIconClassName();\n }\n }\n\n private setAvatarModel(): void {\n this.avatarModel = new PublicProfileAvatarComponentModel();\n this.avatarModel.personId = this.provider.idPersona;\n this.avatarModel.avatarUrl = this.provider.foto;\n this.avatarModel.fullName = this.provider.nombre;\n this.avatarModel.sex = this.provider.sexo;\n this.avatarModel.profileType = this.provider.tipoPerfil; \n }\n\n private setShowAvatarInitials(): void {\n this.showAvatarInitials = !!this.provider.foto || this.provider.tipoPerfil == PublicProfileType.Doctor;\n }\n\n private setIsPharmacyProfile(): void {\n this.isPharmacyProfile = this.provider.tipoPerfil == PublicProfileType.Farmacia;\n }\n\n private setFeatureConcepts(): void {\n try{\n const featuresConceptsObject: FeatureConceptDto = JSON.parse(this.provider.conceptosDestacados);\n\n this.featureConceptIconClassName = featuresConceptsObject && featuresConceptsObject.iconClassName ? `phr-iconset-${featuresConceptsObject.iconClassName}` : '';\n this.featuresConceptsText = featuresConceptsObject && featuresConceptsObject.text ? featuresConceptsObject.text : '';\n } catch(e) {\n this.featureConceptIconClassName = '';\n this.featuresConceptsText = '';\n }\n }\n\n private setProfileTypeIconClassName(): void {\n const profileType = this.provider.tipoPerfil;\n this.profileTypeIconClassName = `phr-iconset-${this.getProfileTypeIconClassName(profileType)}`;\n }\n\n private getProfileTypeIconClassName(profileType: PublicProfileType): string {\n return profileTypeIconMap[profileType] || 'estetoscopio';\n }\n\n}\n\nexport const profileTypeIconMap: { [key in PublicProfileType]: string } = {\n [PublicProfileType.Doctor]: 'estetoscopio',\n [PublicProfileType.Farmacia]: 'farmacia',\n [PublicProfileType.Clinica]: 'hospital',\n [PublicProfileType.Fisioterapia]: 'fisioterapia',\n [PublicProfileType.Laboratorio]: 'laboratorios',\n [PublicProfileType.CentroDeImagenes]: 'imagenologia',\n [PublicProfileType.ServiciosOdontologicos]: 'odontologia',\n [PublicProfileType.Opticas]: 'open-eye',\n [PublicProfileType.ClinicasDeAtencionPrimaria]: 'clinic',\n [PublicProfileType.Todos]: '',\n [PublicProfileType.SedeSura]: '',\n [PublicProfileType.SaludYBelleza]: ''\n}; \n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { NotFoundComponent } from './components/not-found/not-found.component';\nimport { DynamicHostDirective } from './directives/dynamic-host.directive';\nimport { IFrameResizerDirective } from './directives/iframe-resizer.directive';\nimport { FormComponent } from './components/form/form.component';\nimport { DynamicComponent } from './components/dynamic/dynamic.component';\nimport { FutureAppointmentsComponent } from './components/appointments/future-appointments/future-appointments.component';\nimport { PastAppointmentsComponent } from './components/appointments/past-appointments/past-appointments.component';\nimport { CancelledAppointmentsComponent } from './components/appointments/cancelled-appointments/cancelled-appointments.component';\nimport { AppointmentsTabsComponent } from './components/appointments/appointment-tabs/appointment-tabs.component';\nimport { SearchDoctorsComponent } from './components/search/search-doctors.component';\nimport { ProfileFiltersComponent } from './components/profile-filters/profile-filters.component';\nimport { ChatComponent } from './components/chat/chat.component';\nimport { MaterialModule } from './material.module';\nimport { L10nIntlModule, L10nTranslationModule } from 'angular-l10n';\nimport { HeaderComponent } from './components/headers/header/header.component';\nimport { HeaderSuraComponent } from './components/headers/header-sura/header-sura.component';\nimport { I18nTextPipe } from './pipes/i18n-text.pipe';\nimport { OrderByPipe } from './pipes/order-by.pipe';\nimport { HighlightPipe } from './pipes/highlight.pipe';\nimport { SafeUrlPipe } from './pipes/safe-url.pipe';\nimport { ReplacePipe } from './pipes/replace.pipe';\nimport { CustomCurrencyPipe } from './pipes/custom-currency.pipe';\nimport { VirtualConsultationLinkboxComponent } from './components/linkboxs/virtual-consultation-linkbox/virtual-consultation-linkbox.component';\nimport { MedicalAppointmentsLinkboxComponent } from './components/linkboxs/medical-appointments-linkbox/medical-appointments-linkbox.component';\nimport { ResultsLinkboxComponent } from './components/linkboxs/results-linkbox/results-linkbox.component';\nimport { HistoriaClinicaLinkboxComponent } from './components/linkboxs/historia-clinica-linkbox/historia-clinica-linkbox.component';\nimport { UnreadClinicalExamComponent } from './components/unread-clinical-exam/unread-clinical-exam.component';\nimport { LoadingComponent } from './components/loading/loading.component';\nimport { SelectSymptomsComponent } from './components/select-symptoms/select-symptoms.component';\nimport { ConfirmDialogComponent } from './components/dialogs/confirm-dialog/confirm-dialog.component';\nimport { CancelAppointmentDialogComponent } from './components/dialogs/cancel-appointment/cancel-appointment-dialog.component';\nimport { MapDialogComponent } from './components/dialogs/map-dialog/map-dialog.component';\nimport { SocialNetworksDialogComponent } from './components/dialogs/social-networks-dialog/social-networks-dialog.component';\nimport { CancelVirtualAttentionDialogComponent } from './components/dialogs/cancel-virtual-attention/cancel-virtual-attention-dialog.component';\nimport { ChatHistoryDialogComponent } from './components/dialogs/chat-history-dialog/chat-history-dialog.component';\nimport { MenuComponent } from './components/menu/menu.component';\nimport { CliniwebMenuComponent } from './components/menu/cliniweb-menu/cliniweb-menu.component';\nimport { RouterModule } from '@angular/router';\nimport { MenuMobileComponent } from './components/dialogs/menu-mobile/menu-mobile.component';\nimport { environment } from 'src/environments/environment';\nimport { MenuLinkComponent } from './components/menu-link/menu-link.component';\nimport { CustomAutocompleteComponent } from './components/custom-autocomplete/custom-autocomplete.component';\nimport { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { TimelineListComponent } from './components/timeline-list/timeline-list.component';\nimport { PolicyMenuComponent } from './components/menu/policy/policy-menu.component';\nimport { PolicyMenuContentComponent } from './components/menu/policy/policy-menu-content.component';\nimport { ProfileMenuComponent } from './components/menu/profile/profile-menu.component';\nimport { VirtualConsultationTabsComponent } from './components/virtual-consultation/virtual-consultation-tabs/virtual-consultation-tabs.component';\nimport { PastVirtualConsultationComponent } from './components/virtual-consultation/past-virtual-consultation/past-virtual-consultation.component';\nimport { ToastrModule } from 'ngx-toastr';\nimport { ClinicHistoryTabsComponent } from './components/clinic-history/clinic-history-tabs/clinic-history-tabs.component';\nimport { AttentionHistoryComponent } from './components/clinic-history/attention-history/attention-history.component';\nimport { MedicinesComponent } from './components/clinic-history/medicines/medicines.component';\nimport { MedicalHistoryComponent } from './components/clinic-history/medical-history/medical-history.component';\nimport { ClinicHistoryShareComponent } from './components/clinic-history/clinic-history-share/clinic-history-share.component';\nimport { ShareDialogComponent } from './components/clinic-history/share-dialog/share-dialog.component';\nimport { StudiesLaboratoriesComponent } from './components/clinic-history/studies-laboratories/studies-laboratories.component';\nimport { HeaderMapfrePanamaComponent } from './components/headers/header-mapfre-panama/header-mapfre-panama.component';\nimport { SearchProvidersComponent } from './components/search-results/search-providers/search-providers.component';\nimport { SearchResultsComponent } from './components/search-results/search-results/search-results.component';\nimport { AutocompleteMultipleSelectionComponent } from './components/autocomplete-multiple-selection/autocomplete-multiple-selection.component';\nimport { ProviderCardComponent } from './components/search-results/provider-card/provider-card.component';\nimport { AvatarInitialsComponent } from './components/avatar-initials/avatar-initials.component';\nimport { CheckAutocompleteComponent } from './components/check-autocomplete/check-autocomplete.component';\nimport { FileViewerComponent } from './components/file-viewer/file-viewer.component';\nimport { FileViewerDialogComponent } from './components/dialogs/file-viewer-dialog/file-viewer-dialog.component';\nimport { HeaderTownCenterComponent } from './components/headers/header-town-center/header-town-center.component';\nimport { HeaderHospitalPaitillaComponent } from './components/headers/header-hospital-paitilla/header-hospital-paitilla.component';\nimport { HeaderHospitalNacionalPhrComponent } from './components/headers/header-hospital-nacional-phr/header-hospital-nacional-phr.component';\nimport { HeaderCmpaitillaPhrComponent } from './components/headers/header-cmpaitilla-phr/header-cmpaitilla-phr.component';\nimport { HeaderHchiriquiPhrComponent } from './components/headers/header-hchiriqui-phr/header-hchiriqui-phr.component';\nimport { HeaderCmcaribePhrComponent } from './components/headers/header-cmcaribe-phr/header-cmcaribe-phr.component';\nimport { HeaderThepanamaclinicPhrComponent } from './components/headers/header-thepanamaclinic-phr/header-thepanamaclinic-phr.component';\nimport { HeaderChsfPhrComponent } from './components/headers/header-chsf-phr/header-chsf-phr.component';\nimport { HeaderChpanamericanoPhrComponent } from './components/headers/header-chpanamericano-phr/header-chpanamericano-phr.component';\nimport { HeaderHsantafePhrComponent } from './components/headers/header-hsantafe-phr/header-hsantafe-phr.component';\nimport { HeaderPacificaSaludPhrComponent } from './components/headers/header-pacifica-salud-phr/header-pacifica-salud-phr.component';\nimport { WorkflowManagerComponent } from './components/workflows/workflow-manager/workflow-manager.component';\nimport { OnlineAppointmentCliniwebComponent } from './components/workflows/online-appointment-cliniweb/online-appointment-cliniweb.component';\nimport { OnlinePaymentWorkflowComponent } from './components/workflows/online-payment/online-payment-workflow.component';\nimport { WorkflowDynamicComponent } from './components/workflows/workflow-dynamic/workflow-dynamic.component';\nimport { BaseWorkflowComponent } from './components/workflows/base-workflow/base-workflow.component';\nimport { AuthenticationComponent } from './components/authentication/authentication.component';\nimport { WorkflowProgressBarComponent } from './components/workflows/workflow-progress-bar/workflow-progress-bar.component';\nimport { DoctorMessageDialogComponent } from './components/dialogs/doctor-message-dialog/doctor-message-dialog.component';\nimport { RecaptchaModule, RecaptchaFormsModule } from 'ng-recaptcha';\nimport { PaymentComponent } from './components/payment/payment.component';\nimport { PaymentAmountComponent } from './components/payment-amount/payment-amount.component';\nimport { SelectPatientAppointmentCheckoutComponent } from './components/select-patient-appointment-checkout/select-patient-appointment-checkout.component';\nimport { AppointmentInfoCheckoutComponent } from './components/appointment-info-checkout/appointment-info-checkout.component';\nimport { PatientFormAppointmentCheckoutComponent } from './components/patient-form-appointment-checkout/patient-form-appointment-checkout.component';\nimport { CreditCardDirectivesModule } from 'angular-cc-library';\nimport { SelectPatientRelationshipAppointmentCheckoutComponent } from './components/select-patient-relationship-appointment-checkout/select-patient-relationship-appointment-checkout.component';\nimport { NgxMatIntlTelInputModule } from 'ngx-mat-intl-tel-input';\nimport { PatientContactFormAppointmentCheckoutComponent } from './components/patient-contact-form-appointment-checkout/patient-contact-form-appointment-checkout.component';\nimport { SummaryAppointmentCheckoutComponent } from './components/summary-appointment-checkout/summary-appointment-checkout.component';\nimport { LoadingDialogComponent } from './components/dialogs/loading-dialog/loading-dialog.component';\nimport { StatesRequestVerifyComponent } from './components/states-request-verify/states-request-verify.component';\nimport { CustomSnackBarComponent } from './components/custom-snack-bar/custom-snack-bar.component';\nimport { EmailCallbackComponent } from './components/email-callback/email-callback.component';\nimport { RouteDialogComponent } from './components/dialogs/route-dialog/route-dialog.component';\nimport { PublicProfileHeaderComponent } from './components/headers/route-dialog-headers/public-profile-header/public-profile-header.component';\nimport { DefaultHeaderComponent } from './components/headers/route-dialog-headers/default-header/default-header.component';\nimport { DefaultBackHeaderComponent } from './components/headers/route-dialog-headers/default-back-header/default-back-header.component';\nimport { DefaultBackWithLinkHeaderComponent } from './components/headers/route-dialog-headers/default-back-with-link-header/default-back-with-link-header.component';\nimport { ViewUserComponent } from './components/user/view-user/view-user.component';\nimport { EditUserComponent } from './components/user/edit-user/edit-user.component';\nimport { ViewDependentComponent } from './components/dependent/view-dependent/view-dependent.component';\nimport { LogoutBarComponent } from './components/logout-bar/logout-bar.component';\nimport { IntlTelInputPlaceholderPipe } from './pipes/intl-tel-input-placeholder.pipe';\nimport { EditDependentComponent } from './components/dependent/edit-dependent/edit-dependent.component';\nimport { ProfileMenuDialogComponent } from './components/dialogs/profile-menu-dialog/profile-menu-dialog.component';\nimport { AvatarUploadComponent } from './components/avatar-upload/avatar-upload.component';\nimport { CliniwebMedicalAppointmentsLinkboxComponent } from './components/linkboxs/cliniweb-medical-appointments-linkbox/cliniweb-medical-appointments-linkbox.component';\nimport { CliniwebBookAppointmentLinkboxComponent } from './components/linkboxs/cliniweb-book-appointment-linkbox/cliniweb-book-appointment-linkbox.component';\nimport { CliniwebHomeLayoutComponent } from './components/home-layouts/cliniweb-home-layout/cliniweb-home-layout.component';\nimport { MostCommonSpecialtiesComponent } from './components/most-common-specialties/most-common-specialties.component';\nimport { LatestDoctorsComponent } from './components/latest-doctors/latest-doctors.component';\nimport { PreventiveControlTipsComponent } from './components/preventive-control-tips/preventive-control-tips.component';\nimport { HealthAlliesComponent } from './components/health-allies/health-allies.component';\nimport { CliniwebAppointmentTabsComponent } from './components/cliniweb-appointments/cliniweb-appointment-tabs/cliniweb-appointment-tabs.component';\nimport { CliniwebFutureAppointmentsComponent } from './components/cliniweb-appointments/cliniweb-future-appointments/cliniweb-future-appointments.component';\nimport { CliniwebAppointmentsComponent } from './components/cliniweb-appointments/cliniweb-appointment/cliniweb-appointment.component';\nimport { CliniwebPastAppointmentsComponent } from './components/cliniweb-appointments/cliniweb-past-appointments/cliniweb-past-appointments.component';\nimport { CliniwebCancelAppointmentComponent } from './components/cliniweb-appointments/cliniweb-cancel-appointment/cliniweb-cancel-appointment.component';\nimport { SearchProvidersV2Component } from './components/search-results/search-providers-v2/search-providers-v2.component';\nimport { LocationLanguageComponent } from './components/location-language/location-language.component';\nimport { MatSelectCustomDirective } from './directives/mat-select-custom.directive';\nimport { SafeHtmlPipe } from './pipes/safe-html.pipe';\nimport { LegalAgreementsComponent } from './components/legal-agreements/legal-agreements.component';\nimport { LearnMoreComponent } from './components/learn-more/learn-more.component';\nimport { DefaultLogoHeaderComponent } from './components/headers/route-dialog-headers/default-logo-header/default-logo-header.component';\nimport { UserPaymentsListComponent } from './components/user-payments/user-payments-list/user-payments-list.component';\nimport { UserPaymentComponent } from './components/user-payments/user-payment/user-payment.component';\nimport { ProviderFiltersDialogComponent } from './components/search-results/provider-filters/provider-filters-dialog/provider-filters-dialog.component';\nimport { ProviderFiltersBodyComponent } from './components/search-results/provider-filters/provider-filters-body/provider-filters-body.component';\nimport { ProviderFiltersContentComponent } from './components/search-results/provider-filters/provider-filters-content/provider-filters-content.component';\nimport { ProviderFiltersTriggerComponent } from './components/search-results/provider-filters/provider-filters-trigger/provider-filters-trigger.component';\nimport { CompanyLogoComponent } from './components/company-logo/company-logo.component';\nimport { AnonymousMenuComponent } from './components/menu/anonymous-menu/anonymous-menu.component';\nimport { AnonymousLanguageMenuComponent } from './components/menu/anonymous-language-menu/anonymous-language-menu.component';\nimport { AnonymousLoginSignupMenuComponent } from './components/menu/anonymous-login-signup-menu/anonymous-login-signup-menu.component';\nimport { LoggedInMenuButtonComponent } from './components/menu/logged-in-menu-button/logged-in-menu-button.component';\nimport { UnlicensedMenuComponent } from './components/menu/unlicensed-menu/unlicensed-menu.component';\nimport { CenterInputDirective } from './directives/center-input.directive';\nimport { DatepickerFieldComponent } from './components/datepicker-field/datepicker-field.component';\nimport { PublicProfileAvatarComponent } from './components/public-profile-avatar/public-profile-avatar.component';\nimport { TouchMoveListenerDirective } from './directives/touch-move-listener.directive';\nimport { DisableAutoFocusIfMobileDirective } from './directives/disable-auto-focus-if-mobile.directive';\nimport { AppointmentInfoDialogComponent } from './components/dialogs/appointment-info-dialog/appointment-info-dialog.component';\nimport { NextAppointmentDialogComponent } from './components/dialogs/next-appointment-dialog/next-appointment-dialog.component';\nimport { SearchResultTitleComponent } from './components/search-results/search-result-title/search-result-title.component';\nimport { PublicProfilePageHeaderComponent } from './components/headers/public-profile-header/public-profile-header.component';\nimport { CountryFormComponent } from './components/country-form/country-form.component';\nimport { LoginSingupErrorBannerComponent } from './components/error-banner/login-singup-error-banner/login-singup-error-banner.component';\nimport { CountryFormCheckoutComponent } from './components/country-form-checkout/country-form-checkout.component';\nimport { SelectCountryDialogComponent } from './components/dialogs/select-country-dialog/select-country-dialog.component';\nimport { LegalAgreementsDialogComponent } from './components/dialogs/legal-agreements-dialog/legal-agreements-dialog.component';\nimport { LearnMoreDialogComponent } from './components/dialogs/learn-more-dialog/learn-more-dialog.component';\nimport { DropdownComponent } from './components/dropdown/dropdown.component';\nimport { DropdownTriggerForDirective } from './components/dropdown/dropdown-trigger-for.directive';\nimport { ColaGobloDialogoComponent } from './components/cola-goblo-dialogo/cola-goblo-dialogo.component';\nimport { CapitalizeDirective } from './directives/capitalize.directive';\nimport { MedicalOrderWorkflowComponent } from './components/workflows/medical-order-workflow/medical-order-workflow.component';\nimport { PatientVerificationComponent } from './components/medical-order/patient-verification/patient-verification.component';\nimport { SummaryMedicalOrderComponent } from './components/medical-order/summary-medical-order/summary-medical-order.component';\nimport { AgeFromBirthdayPipe } from './pipes/age-from-birthday.pipe';\nimport { MyHealthComponent } from './components/my-health/my-health.component';\nimport { MyMedicalOrdersComponent } from './components/my-medical-orders/my-medical-orders.component';\nimport { DatepickerFlatFieldComponent } from './components/datepicker-flat-field/datepicker-flat-field.component';\nimport { BottomSheetMenuComponent } from './components/dialogs/bottom-sheet-menu/bottom-sheet-menu.component';\nimport { MyMedicalOrdersEmptyStateComponent } from './components/my-medical-orders/my-medical-orders-empty-state/my-medical-orders-empty-state.component';\nimport { SpinnerComponent } from './components/spinner/spinner.component';\nimport { ErrorDialogComponent } from './components/dialogs/error-dialog/error-dialog.component';\nimport { GrowthChartsComponent } from './components/growth-charts/growth-charts.component';\nimport { GrowthChartsTabComponent } from './components/growth-charts/growth-charts-tab/growth-charts-tab.component';\nimport { GrowthCurvesWorkflowComponent } from './components/workflows/growth-curves-workflow/growth-curves-workflow.component';\nimport { GrowthChartsTabDataTypeComponent } from './components/growth-charts/growth-charts-tab-data-type/growth-charts-tab-data-type.component';\nimport { SelectPatientRelationshipComponent } from './components/select-patient-relationship/select-patient-relationship.component';\nimport { CreatePatientRelationshipComponent } from './components/create-patient-relationship/create-patient-relationship.component';\nimport { SummaryOrderFooterComponent } from './components/medical-order/summary-medical-order/summary-order-footer/summary-order-footer.component';\nimport { SummaryOrderDownloadButtonComponent } from './components/medical-order/summary-medical-order/summary-order-download-button/summary-order-download-button.component';\nimport { ProviderCardContactsComponent } from './components/search-results/provider-card/provider-card-contacts/provider-card-contacts.component';\nimport { ProviderCardLocationComponent } from './components/search-results/provider-card/provider-card-location/provider-card-location.component';\nimport { ProviderCardProfileComponent } from './components/search-results/provider-card/provider-card-profile/provider-card-profile.component';\nimport { CliniwebDirectoryLinkComponent } from './components/cliniweb-directory-link/cliniweb-directory-link.component';\nimport { SummaryOrderConceptValueComponent } from './components/medical-order/summary-medical-order/summary-order-concept-value/summary-order-concept-value.component';\nimport { AnonymousLanguageMenuItemComponent } from './components/menu/anonymous-language-menu-item/anonymous-language-menu-item.component';\nimport { SummaryOrderSignComponent } from './components/medical-order/summary-medical-order/summary-order-sign/summary-order-sign.component';\nimport { AnonymousLanguageMenuTitle } from './components/menu/anonymous-language-menu-title/anonymous-language-menu-title.component';\nimport { GoogleMapsModule } from '@angular/google-maps';\nimport { CustomDatePipe } from './pipes/custom-date.pipe';\n\n@NgModule({\n exports: [\n FlexLayoutModule,\n MaterialModule,\n DynamicComponent,\n DynamicHostDirective,\n IFrameResizerDirective,\n MatSelectCustomDirective,\n HeaderComponent,\n HeaderSuraComponent,\n I18nTextPipe,\n OrderByPipe,\n HighlightPipe,\n SafeUrlPipe,\n ReplacePipe,\n CustomCurrencyPipe,\n SearchDoctorsComponent,\n ProfileFiltersComponent,\n LoadingComponent,\n ConfirmDialogComponent,\n ProfileMenuDialogComponent,\n CancelAppointmentDialogComponent,\n MapDialogComponent,\n SocialNetworksDialogComponent,\n CancelVirtualAttentionDialogComponent,\n ChatHistoryDialogComponent,\n MenuComponent,\n CliniwebMenuComponent,\n MenuMobileComponent,\n CustomAutocompleteComponent,\n NgxSkeletonLoaderModule,\n ChatComponent,\n TimelineListComponent,\n PolicyMenuContentComponent,\n PolicyMenuComponent,\n ProfileMenuComponent,\n VirtualConsultationTabsComponent,\n PastVirtualConsultationComponent,\n ToastrModule,\n AutocompleteMultipleSelectionComponent,\n AppointmentsTabsComponent,\n CancelledAppointmentsComponent,\n FutureAppointmentsComponent,\n PastAppointmentsComponent,\n AttentionHistoryComponent,\n ClinicHistoryShareComponent,\n ClinicHistoryTabsComponent,\n MedicalHistoryComponent,\n MedicinesComponent,\n StudiesLaboratoriesComponent,\n HeaderMapfrePanamaComponent,\n HistoriaClinicaLinkboxComponent,\n MedicalAppointmentsLinkboxComponent,\n ResultsLinkboxComponent,\n VirtualConsultationLinkboxComponent,\n SearchResultsComponent,\n SelectSymptomsComponent,\n UnreadClinicalExamComponent,\n FileViewerComponent,\n FileViewerDialogComponent,\n HeaderTownCenterComponent,\n HeaderHospitalPaitillaComponent,\n\tHeaderHospitalNacionalPhrComponent,\n\tHeaderCmpaitillaPhrComponent,\n HeaderHchiriquiPhrComponent,\n HeaderCmcaribePhrComponent,\n HeaderThepanamaclinicPhrComponent,\n HeaderChsfPhrComponent,\n HeaderChpanamericanoPhrComponent,\n HeaderHsantafePhrComponent,\n HeaderPacificaSaludPhrComponent,\n FormComponent,\n WorkflowManagerComponent,\n DoctorMessageDialogComponent,\n PaymentComponent,\n PaymentAmountComponent,\n LoadingDialogComponent,\n EmailCallbackComponent,\n AvatarUploadComponent,\n CliniwebMedicalAppointmentsLinkboxComponent,\n CliniwebBookAppointmentLinkboxComponent,\n CliniwebHomeLayoutComponent,\n MostCommonSpecialtiesComponent,\n LatestDoctorsComponent,\n PreventiveControlTipsComponent,\n HealthAlliesComponent,\n CliniwebAppointmentTabsComponent,\n CliniwebFutureAppointmentsComponent,\n CliniwebAppointmentsComponent,\n CliniwebPastAppointmentsComponent,\n SummaryAppointmentCheckoutComponent,\n CliniwebCancelAppointmentComponent,\n LocationLanguageComponent,\n LearnMoreComponent,\n LegalAgreementsComponent,\n SafeHtmlPipe,\n StatesRequestVerifyComponent,\n WorkflowProgressBarComponent,\n CompanyLogoComponent,\n CenterInputDirective,\n PublicProfileAvatarComponent,\n DisableAutoFocusIfMobileDirective,\n CountryFormComponent,\n LoginSingupErrorBannerComponent,\n ColaGobloDialogoComponent,\n AgeFromBirthdayPipe,\n MyHealthComponent,\n SummaryMedicalOrderComponent,\n DatepickerFlatFieldComponent,\n BottomSheetMenuComponent,\n SpinnerComponent,\n ErrorDialogComponent,\n GrowthChartsComponent,\n GrowthChartsTabComponent,\n CliniwebDirectoryLinkComponent,\n CustomDatePipe\n ],\n declarations: [\n NotFoundComponent,\n DynamicHostDirective,\n IFrameResizerDirective,\n MatSelectCustomDirective,\n FormComponent,\n DynamicComponent,\n FutureAppointmentsComponent,\n PastAppointmentsComponent,\n CancelledAppointmentsComponent,\n AppointmentsTabsComponent,\n HeaderComponent,\n SearchDoctorsComponent,\n ProfileFiltersComponent,\n HeaderSuraComponent,\n I18nTextPipe,\n OrderByPipe,\n HighlightPipe,\n SafeUrlPipe,\n ReplacePipe,\n CustomCurrencyPipe,\n VirtualConsultationLinkboxComponent,\n MedicalAppointmentsLinkboxComponent,\n ResultsLinkboxComponent,\n HistoriaClinicaLinkboxComponent,\n UnreadClinicalExamComponent,\n LoadingComponent,\n ChatComponent,\n SelectSymptomsComponent,\n ConfirmDialogComponent,\n ProfileMenuDialogComponent,\n CancelAppointmentDialogComponent,\n MapDialogComponent,\n SocialNetworksDialogComponent,\n CancelVirtualAttentionDialogComponent,\n ChatHistoryDialogComponent,\n MenuComponent,\n CliniwebMenuComponent,\n MenuMobileComponent,\n MenuLinkComponent,\n CustomAutocompleteComponent,\n TimelineListComponent,\n PolicyMenuContentComponent,\n PolicyMenuComponent,\n ProfileMenuComponent,\n VirtualConsultationTabsComponent,\n PastVirtualConsultationComponent,\n ClinicHistoryTabsComponent,\n AttentionHistoryComponent,\n MedicinesComponent,\n MedicalHistoryComponent,\n ClinicHistoryShareComponent,\n ShareDialogComponent,\n StudiesLaboratoriesComponent,\n HeaderMapfrePanamaComponent,\n SearchProvidersComponent,\n SearchProvidersV2Component,\n SearchResultsComponent,\n AutocompleteMultipleSelectionComponent,\n ProviderCardComponent,\n AvatarInitialsComponent,\n CheckAutocompleteComponent,\n FileViewerComponent,\n FileViewerDialogComponent,\n HeaderTownCenterComponent,\n HeaderHospitalPaitillaComponent,\n\tHeaderHospitalNacionalPhrComponent,\n\tHeaderCmpaitillaPhrComponent,\n HeaderHchiriquiPhrComponent,\n HeaderCmcaribePhrComponent,\n HeaderThepanamaclinicPhrComponent,\n HeaderChsfPhrComponent,\n HeaderChpanamericanoPhrComponent,\n HeaderHsantafePhrComponent,\n HeaderPacificaSaludPhrComponent,\n WorkflowManagerComponent,\n BaseWorkflowComponent,\n OnlineAppointmentCliniwebComponent,\n OnlinePaymentWorkflowComponent,\n WorkflowDynamicComponent,\n AuthenticationComponent,\n WorkflowProgressBarComponent,\n DoctorMessageDialogComponent,\n PaymentComponent,\n PaymentAmountComponent,\n SelectPatientAppointmentCheckoutComponent,\n AppointmentInfoCheckoutComponent,\n PatientFormAppointmentCheckoutComponent,\n SelectPatientRelationshipAppointmentCheckoutComponent,\n PatientContactFormAppointmentCheckoutComponent,\n SummaryAppointmentCheckoutComponent,\n LoadingDialogComponent,\n StatesRequestVerifyComponent,\n CustomSnackBarComponent,\n EmailCallbackComponent,\n RouteDialogComponent,\n PublicProfileHeaderComponent,\n DefaultHeaderComponent,\n DefaultBackHeaderComponent,\n DefaultBackWithLinkHeaderComponent,\n ViewUserComponent,\n EditUserComponent,\n ViewDependentComponent,\n LogoutBarComponent,\n IntlTelInputPlaceholderPipe,\n EditDependentComponent,\n AvatarUploadComponent,\n CliniwebMedicalAppointmentsLinkboxComponent,\n CliniwebBookAppointmentLinkboxComponent,\n CliniwebHomeLayoutComponent,\n MostCommonSpecialtiesComponent,\n LatestDoctorsComponent,\n PreventiveControlTipsComponent,\n HealthAlliesComponent,\n CliniwebAppointmentTabsComponent,\n CliniwebFutureAppointmentsComponent,\n CliniwebAppointmentsComponent,\n CliniwebPastAppointmentsComponent,\n CliniwebCancelAppointmentComponent,\n LocationLanguageComponent,\n LearnMoreComponent,\n DefaultLogoHeaderComponent,\n UserPaymentsListComponent,\n LegalAgreementsComponent,\n SafeHtmlPipe,\n UserPaymentComponent,\n ProviderFiltersDialogComponent,\n ProviderFiltersBodyComponent,\n ProviderFiltersContentComponent,\n CompanyLogoComponent,\n ProviderFiltersTriggerComponent,\n AnonymousMenuComponent,\n AnonymousLanguageMenuComponent,\n AnonymousLoginSignupMenuComponent,\n LoggedInMenuButtonComponent,\n UnlicensedMenuComponent,\n CenterInputDirective,\n DatepickerFieldComponent,\n PublicProfileAvatarComponent,\n TouchMoveListenerDirective,\n DisableAutoFocusIfMobileDirective,\n AppointmentInfoDialogComponent,\n NextAppointmentDialogComponent,\n SearchResultTitleComponent,\n PublicProfilePageHeaderComponent,\n CountryFormComponent,\n LoginSingupErrorBannerComponent,\n CountryFormCheckoutComponent,\n SelectCountryDialogComponent,\n LegalAgreementsDialogComponent,\n LearnMoreDialogComponent,\n DropdownComponent,\n DropdownTriggerForDirective,\n CapitalizeDirective,\n ColaGobloDialogoComponent,\n MedicalOrderWorkflowComponent,\n PatientVerificationComponent,\n SummaryMedicalOrderComponent,\n AgeFromBirthdayPipe,\n MyHealthComponent,\n MyMedicalOrdersComponent,\n DatepickerFlatFieldComponent,\n BottomSheetMenuComponent,\n MyMedicalOrdersEmptyStateComponent,\n SpinnerComponent,\n ErrorDialogComponent,\n GrowthChartsComponent,\n GrowthChartsTabComponent,\n GrowthCurvesWorkflowComponent,\n GrowthChartsTabDataTypeComponent,\n SelectPatientRelationshipComponent,\n CreatePatientRelationshipComponent,\n SummaryOrderFooterComponent,\n SummaryOrderDownloadButtonComponent,\n ProviderCardContactsComponent,\n ProviderCardLocationComponent,\n ProviderCardProfileComponent,\n SummaryOrderConceptValueComponent,\n CliniwebDirectoryLinkComponent,\n CustomDatePipe,\n SummaryOrderSignComponent,\n AnonymousLanguageMenuItemComponent,\n AnonymousLanguageMenuTitle\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n FlexLayoutModule,\n MaterialModule,\n L10nTranslationModule,\n L10nIntlModule,\n RouterModule,\n NgxSkeletonLoaderModule,\n InfiniteScrollModule, \n ToastrModule.forRoot(),\n RecaptchaModule, \n RecaptchaFormsModule,\n CreditCardDirectivesModule,\n NgxMatIntlTelInputModule,\n GoogleMapsModule\n ],\n entryComponents: [ConfirmDialogComponent, MenuMobileComponent],\n \n /* Every component needs to be added here in order to be rendered after deploy\n If the component is NOT added when angular run the compilaiton and optimization, as these components are render dinamically \n and NOT refereced in any page, angular will remove it from the bundle result.\n */\n bootstrap: [\n AppointmentsTabsComponent,\n CancelledAppointmentsComponent,\n FutureAppointmentsComponent,\n PastAppointmentsComponent,\n AttentionHistoryComponent,\n ClinicHistoryShareComponent,\n ClinicHistoryTabsComponent,\n MedicalHistoryComponent,\n MedicinesComponent,\n StudiesLaboratoriesComponent,\n HeaderComponent,\n HeaderMapfrePanamaComponent,\n HeaderSuraComponent,\n HistoriaClinicaLinkboxComponent,\n MedicalAppointmentsLinkboxComponent,\n ResultsLinkboxComponent,\n VirtualConsultationLinkboxComponent,\n SearchDoctorsComponent,\n SearchResultsComponent,\n UnreadClinicalExamComponent,\n SelectSymptomsComponent, \n VirtualConsultationTabsComponent,\n PastVirtualConsultationComponent,\n HeaderTownCenterComponent,\n HeaderHospitalPaitillaComponent,\n\t HeaderHospitalNacionalPhrComponent,\n\t HeaderCmpaitillaPhrComponent,\n HeaderHchiriquiPhrComponent,\n HeaderCmcaribePhrComponent,\n HeaderThepanamaclinicPhrComponent,\n HeaderChsfPhrComponent,\n HeaderChpanamericanoPhrComponent,\n HeaderHsantafePhrComponent,\n HeaderPacificaSaludPhrComponent,\n OnlineAppointmentCliniwebComponent,\n OnlinePaymentWorkflowComponent,\n MedicalOrderWorkflowComponent,\n GrowthCurvesWorkflowComponent,\n AuthenticationComponent,\n SelectPatientAppointmentCheckoutComponent,\n PatientFormAppointmentCheckoutComponent,\n PatientVerificationComponent,\n SelectPatientRelationshipAppointmentCheckoutComponent,\n PatientContactFormAppointmentCheckoutComponent,\n SummaryAppointmentCheckoutComponent,\n PublicProfileHeaderComponent,\n DefaultHeaderComponent,\n DefaultBackHeaderComponent,\n DefaultBackWithLinkHeaderComponent,\n ViewUserComponent,\n EditUserComponent,\n ViewDependentComponent,\n EditDependentComponent,\n MenuComponent,\n CliniwebMenuComponent,\n CliniwebHomeLayoutComponent,\n CliniwebAppointmentTabsComponent,\n SearchProvidersComponent,\n SearchProvidersV2Component,\n PaymentComponent,\n PaymentAmountComponent,\n DefaultLogoHeaderComponent,\n UserPaymentsListComponent,\n UserPaymentComponent,\n PublicProfilePageHeaderComponent,\n CountryFormCheckoutComponent,\n SummaryMedicalOrderComponent,\n MyHealthComponent,\n MyMedicalOrdersComponent,\n GrowthChartsComponent,\n GrowthChartsTabComponent,\n SelectPatientRelationshipComponent,\n CreatePatientRelationshipComponent\n ]\n})\nexport class SharedModule { }\n","import { AbstractControl } from '@angular/forms';\r\n\r\nexport function CustomEmailValidator(control: AbstractControl) {\r\n if (control.value) {\r\n const matches = control.value.match(/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/);\r\n \r\n return matches ? null : { 'email': true };\r\n } \r\n else {\r\n return null;\r\n }\r\n}","export const environment = {\n version: '3.80.5.03-oaj',\n production: true,\n apiUrl: 'https://api.cliniweb.com/',\n cloudHubUrl: \"https://apps.aspsoluciones.com/CloudHubWebApi/cloudhub\",\n cliniwebUrl: \"https://www.cliniweb.com/\",\n logLevel: 1,\n searchProfilesPageSize: 8,\n googleApiKey: 'AIzaSyAhEjpF14LorjB9dHPlSMDr0GP81hy2IAU',\n cKey: '2e35f242a46d67eeb74aabc37d5e5d05',\n googleFileViewerUrl: 'https://drive.google.com/viewerng/viewer?embedded=true&url=',\n useElasticsearchForProfiles: true,\n googleCaptchaSiteKey: '6Lf6gBUUAAAAAHb2HNwaQx5TpP6FJcTHjF-yPAjO',\n encryptLocalStorage: true,\n portalUrl: 'https://professional.cliniweb.com/',\n idEmpresaCliniwebPHR: 4243012,\n nombreEmpresaCliniwebPHR: 'cliniweb-phr',\n cliniwebPhrUrl: 'https://app.cliniweb.com/',\n gatewayUrl: 'http://webservices:8082/Gateway/'\n};\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { filter, map, switchMap, take } from 'rxjs/operators';\nimport { AuthService } from '../services/auth.service';\nimport { MessageBusService } from '../services/message-bus.service';\nimport { RouteLoaderService } from '../services/route-loader.service';\nimport { AppInitializationService } from '../services/app-initializer.service';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthGuard implements CanActivate {\n\n constructor(\n private authService: AuthService,\n private messageBusService: MessageBusService,\n private appInitializationService: AppInitializationService,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { }\n\n canActivate(\n route: ActivatedRouteSnapshot, \n state: RouterStateSnapshot\n ): Observable|Promise|boolean|UrlTree {\n\n // Verifica si es el cliente (navegador) antes de proceder\n if (!isPlatformBrowser(this.platformId)) {\n return true; // Si no es navegador, permitir la navegaciĆ³n (en SSR no bloquea)\n }\n\n\n // Esperar a que la aplicaciĆ³n estĆ© completamente inicializada\n return this.appInitializationService.isInitialized().pipe(\n filter(initialized => initialized), // Esperar hasta que sea `true`\n take(1), // Tomar solo el primer valor `true`\n switchMap(() => {\n\n return this.authService.hasPermissions(state.url).pipe(map((result: boolean) => {\n if (route.queryParams.authIframe) {\n this.messageBusService.authIframe();\n }\n return result;\n }));\n })\n );\n }\n}\n","
\r\n \r\n \r\n
\r\n {{'shared.locationLanguage.text1' | translate:locale.language}}\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n {{ item.locale.language | l10nDisplayNames:locale.language:{ type: 'language' } | titlecase }}\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
","import { Component, Inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { L10N_CONFIG, L10N_LOCALE, L10nConfig, L10nLocale, L10nSchema } from 'angular-l10n';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { CloseRouteDialogMessage, MessageBusService } from 'src/app/core/services/message-bus.service';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { FormControl } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-location-language',\r\n templateUrl: './location-language.component.html',\r\n styleUrls: ['./location-language.component.css']\r\n})\r\nexport class LocationLanguageComponent implements OnInit, OnDestroy { \r\n \r\n private ngUnsubscribe = new Subject();\r\n schema: L10nSchema[];\r\n saving: boolean = false;\r\n selectionControl: FormControl;\r\n\r\n constructor(\r\n @Inject(L10N_LOCALE) public locale: L10nLocale,\r\n @Inject(L10N_CONFIG) private l10nConfig: L10nConfig,\r\n private baseService: BaseService,\r\n private messageBusService: MessageBusService\r\n ) {\r\n this.selectionControl = new FormControl('auto');\r\n }\r\n\r\n ngOnInit(): void {\r\n \r\n this.schema = this.l10nConfig.schema;\r\n this.selectionControl.setValue(this.locale.language);\r\n\r\n // On Header Back click\r\n this.messageBusService.onNavigateBack()\r\n .pipe(takeUntil(this.ngUnsubscribe)) \r\n .subscribe(m => {\r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n }\r\n ); \r\n } \r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n onSaveClick() {\r\n // Get locale\r\n let schema = this.schema.find(s => s.locale.language == this.selectionControl.value);\r\n\r\n if (!schema)\r\n return;\r\n\r\n this.saving = true;\r\n\r\n this.baseService.setLocale(schema.locale);\r\n\r\n this.saving = false;\r\n\r\n this.messageBusService.closeRouteDialog(new CloseRouteDialogMessage());\r\n }\r\n}","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { environment } from 'src/environments/environment';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ShowNonProdGuard implements CanActivate {\n\n constructor(private router: Router) {}\n\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n let resultado = environment.production;\n if (resultado) { \n this.router.navigate(['not-found']);\n }\n return !resultado;\n }\n \n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { AuthService } from '../services/auth.service';\nimport { AppInitializationService } from '../services/app-initializer.service';\nimport { filter, switchMap, take } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthPrivateRoutesGuard implements CanActivate {\n\n constructor(\n private authService: AuthService, \n private router: Router,\n private appInitializationService: AppInitializationService\n ) {}\n\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable | Promise {\n\n return this.appInitializationService.isInitialized().pipe(\n filter(initialized => initialized),\n take(1),\n switchMap(() => {\n return this.isRouteValid(route, state);\n })\n ); \n }\n\n private isRouteValid(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\n const isRestrictedRoute: boolean = route.data['isRestrictedRoute'];\n\n if (!isRestrictedRoute) {\n return of(true);\n }\n\n const transferToken = route.queryParams['token'];\n\n if(transferToken){\n return this.authService.loginByTransferToken(transferToken).pipe(switchMap((response) => {\n return of(true);\n }));\n }\n\n if (this.authService.getToken()) {\n return of(true);\n }\n else{\n const homeUrl: string = state.url;\n this.router.navigate(['welcome', 'login'], { queryParams: { homeUrl } });\n\n return of(false);\n }\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\nimport { AuthService } from '../services/auth.service';\r\nimport { AppInitializationService } from '../services/app-initializer.service';\r\nimport { filter, map, take } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInitializationGuard implements CanActivate {\r\n\r\n constructor(\r\n private authService: AuthService, \r\n private router: Router,\r\n private appInitializationService: AppInitializationService) {}\r\n\r\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable | Promise {\r\n return this.appInitializationService.isInitialized().pipe(\r\n filter(initialized => initialized),\r\n take(1),\r\n map(() => true)\r\n ); \r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { Routes, RouterModule } from '@angular/router';\nimport { L10nResolver } from 'angular-l10n';\nimport { AuthGuard } from './core/guards/auth.guard';\nimport { NotFoundComponent } from './shared/components/not-found/not-found.component';\nimport { ViewUserComponent } from './shared/components/user/view-user/view-user.component';\nimport { EditUserComponent } from './shared/components/user/edit-user/edit-user.component';\nimport { ViewDependentComponent } from './shared/components/dependent/view-dependent/view-dependent.component';\nimport { EditDependentComponent } from './shared/components/dependent/edit-dependent/edit-dependent.component';\nimport { ProfileMenuComponent } from './shared/components/menu/profile/profile-menu.component';\nimport { LocationLanguageComponent } from './shared/components/location-language/location-language.component';\nimport { ShowNonProdGuard } from './core/guards/show-non-prod.guard';\nimport { LearnMoreComponent } from './shared/components/learn-more/learn-more.component';\nimport { LegalAgreementsComponent } from './shared/components/legal-agreements/legal-agreements.component';\nimport { UserPaymentsListComponent } from './shared/components/user-payments/user-payments-list/user-payments-list.component';\nimport { UserPaymentComponent } from './shared/components/user-payments/user-payment/user-payment.component';\nimport { LegalAgreementType } from './shared/enums/legal-agreements-type.enum';\nimport { AuthPrivateRoutesGuard } from './core/guards/auth-private-routes.guard';\nimport { environment } from 'src/environments/environment';\nimport { AppInitializationGuard } from './core/guards/app-initialization.guard';\n\nconst routes: Routes = [\n {\n path: 'welcome',\n loadChildren: () => import('./modules/welcome/welcome.module').then(m => m.WelcomeModule),\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [\n { name: 'welcome', asset: './assets/i18n/welcome', options: { version: environment.version } },\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } }\n ]\n }\n },\n {\n path: 'login',\n loadChildren: () => import('./modules/login/login.module').then(m => m.LoginModule),\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n { name: 'login', asset: './assets/i18n/login', options: { version: environment.version } }\n ]\n }\n },\n {\n path: 'signup',\n loadChildren: () => import('./modules/signup/signup.module').then(m => m.SignupModule),\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n { name: 'signup', asset: './assets/i18n/signup', options: { version: environment.version } }\n ]\n }\n },\n {\n path: 'busqueda',\n loadChildren: () => import('./modules/search-results/search-results.module').then(m => m.SearchResultsModule),\n canActivate: [],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n { name: 'search', asset: './assets/i18n/search', options: { version: environment.version } },\n ]\n }\n },\n {\n path: 'perfil-v1',\n loadChildren: () => import('./modules/search-results/search-results.module').then(m => m.SearchResultsModule),\n canActivate: [],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n { name: 'search', asset: './assets/i18n/search', options: { version: environment.version } },\n ],\n animation: 'PublicProfilePage'\n }\n },\n {\n path: 'perfil',\n loadChildren: () => import('./modules/public-profiles/public-profiles.module').then(m => m.PublicProfilesModule),\n canActivate: [],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n { name: 'publicProfiles', asset: './assets/i18n/public-profiles', options: { version: environment.version } },\n ],\n animation: 'PublicProfilePage'\n }\n },\n {\n path: 'citas',\n loadChildren: () => import('./modules/appointments/appointments.module').then(m => m.AppointmentsModule),\n canActivate: [],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n ],\n animation: 'AppointmentsPage'\n }\n },\n {\n path: 'pagos',\n loadChildren: () => import('./modules/payment/payment.module').then(m => m.PaymentsModule),\n canActivate: [],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n ],\n animation: 'AppointmentsPage'\n }\n },\n {\n path: 'ordenes-medicas',\n loadChildren: () => import('./modules/medical-orders/medical-orders.module').then(m => m.MedicalOrdersModule),\n canActivate: [],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n ]\n }\n },\n {\n path: 'curvas-crecimiento',\n loadChildren: () => import('./modules/growth-curves/growth-curves.module').then(m => m.GrowthCurvesModule),\n canActivate: [],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n ],\n animation: 'AppointmentsPage'\n }\n },\n { \n path: 'not-found', component: NotFoundComponent \n },\n {\n path: 'support',\n loadChildren: () => import('./modules/support/support.module').then(m => m.SupportModule),\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n ]\n }\n },\n {\n path: 'politicas',\n loadChildren: () => import('./modules/privacy-policies/privacy-policies.module').then(m => m.PrivacyPoliciesModule),\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'privacypolicies', asset: './assets/i18n/privacy-policies', options: { version: environment.version } } \n ]\n }\n },\n {\n path: 'configuracion', \n canActivate: [AuthGuard, AuthPrivateRoutesGuard],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n { name: 'search', asset: './assets/i18n/search', options: { version: environment.version } },\n ],\n isRestrictedRoute: true\n },\n children:[\n {\n path: 'menu',\n component: ProfileMenuComponent\n },\n {\n path: 'usuario',\n component: ViewUserComponent\n },\n {\n path: 'usuario/edicion',\n component: EditUserComponent\n },\n {\n path: 'dependiente/:id',\n component: ViewDependentComponent\n }, \n {\n path: 'dependiente/edicion/:id',\n component: EditDependentComponent\n },\n {\n path: 'locale',\n component: LocationLanguageComponent\n },\n {\n path: 'pagos',\n component: UserPaymentsListComponent\n },\n {\n path: 'pagos/:id',\n component: UserPaymentComponent\n }\n ]\n },\n {\n path: 'plantilla',\n canActivate: [ShowNonProdGuard],\n loadChildren: () => import('./modules/template-panel/template-panel.module').then(m => m.TemplatePanelModule)\n },\n {\n\tpath: 'terminos-y-condiciones',\n component: LegalAgreementsComponent,\n data: { id: LegalAgreementType.TERMINOS_CONDICIONES }\n },\n {\n\tpath: 'disclaimer',\n component: LegalAgreementsComponent,\n data: { id: LegalAgreementType.DISCLAIMER }\n },\n {\n path: 'politicas-de-privacidad',\n data: {id: LegalAgreementType.POLITICA_PRIVACIDAD},\n component: LegalAgreementsComponent\n },\n {\n path: 'conoce-mas',\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [ \n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } },\n { name: 'search', asset: './assets/i18n/search', options: { version: environment.version } },\n ]\n },\n component: LearnMoreComponent\n },\n {\n path: 'widget',\n loadChildren: () => import('./modules/widget/widget.module').then(m => m.WidgetModule),\n resolve: { l10n: L10nResolver },\n data:{\n showHeader: false,\n l10nProviders: [\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } }\n ]\n }\n },\n {\n path: 'charts',\n loadChildren: () => import('./modules/charts/charts.module').then(m => m.ChartsModule),\n resolve: { l10n: L10nResolver },\n data:{\n showHeader: false,\n l10nProviders: [\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } }\n ]\n }\n },\n {\n path: '**',\n loadChildren: () => import('./modules/home/home.module').then(m => m.HomeModule),\n canActivate: [AuthGuard, AppInitializationGuard],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [\n { name: 'home', asset: './assets/i18n/home', options: { version: environment.version } },\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } }\n ]\n }\n },\n {\n path: '',\n loadChildren: () => import('./modules/home/home.module').then(m => m.HomeModule),\n canActivate: [AuthGuard, AppInitializationGuard],\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [\n { name: 'home', asset: './assets/i18n/home', options: { version: environment.version } },\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } }\n ],\n animation: 'HomePage'\n }\n }\n];\n\n@NgModule({\n imports: [\n BrowserModule,\n BrowserAnimationsModule,\n RouterModule.forRoot(routes, {\n relativeLinkResolution: 'corrected',\n initialNavigation: 'disabled'\n })\n ],\n exports: [RouterModule]\n})\nexport class AppRoutingModule { }\n","import { Component } from '@angular/core';\r\n\r\n// A dummy dialog component just to show an overlay\r\n@Component({\r\n selector: 'empty-dialog',\r\n template: '' \r\n })\r\n export class EmptyDialogComponent {\r\n constructor() {} \r\n }","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatSnackBarRef } from '@angular/material/snack-bar';\nimport { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\nimport { OpenSnackBarMessage, SnackBarType } from 'src/app/core/services/message-bus.service';\n\n@Component({\n selector: 'app-custom-snack-bar',\n templateUrl: './custom-snack-bar.component.html',\n styleUrls: ['./custom-snack-bar.component.css']\n})\nexport class CustomSnackBarComponent implements OnInit {\n\n text: string;\n\n constructor(\n public snackBarRef: MatSnackBarRef,\n @Inject(MAT_SNACK_BAR_DATA) public data: OpenSnackBarMessage\n ) { }\n\n ngOnInit(): void {\n this.text = this.data.text;\n }\n\n onClose(){\n this.snackBarRef.dismiss();\n }\n\n getIconClassname(){\n switch(this.data.type){\n case SnackBarType.SUCCESS:\n return 'phr-iconset-PHR-Tup-2';\n case SnackBarType.ERROR:\n return 'phr-iconset-error';\n case SnackBarType.INFO:\n return 'phr-iconset-info';\n case SnackBarType.ALERT:\n return 'phr-iconset-alert';\n }\n }\n\n getTypeClassname(){\n switch(this.data.type){\n case SnackBarType.SUCCESS:\n return 'success';\n case SnackBarType.ERROR:\n return 'error';\n case SnackBarType.INFO:\n return 'info';\n case SnackBarType.ALERT:\n return 'alert';\n } \n }\n}\n","
\n \n {{text}}\n \n
","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { AppStorageService } from '../app-storage.service';\r\nimport { BaseService } from '../base.service';\r\nimport { SignalrService } from './signalr.service';\r\nimport { AppointmentEvent } from 'src/app/shared/models/signalr/appointment-event.model';\r\n\r\n/*\r\nIt is important for this Service to NOT be a Singleton (avoid adding \"providedIn: 'root'\")\r\nin order to work properly. If not all the event related to connection and re-connection get mixed between all the clients that use the service\r\nIn order to use the service on an component add it to the providers of the component like: \"providers: [AppointmentSignalRService]\"\"\r\n*/\r\n@Injectable()\r\nexport class AppointmentsSignalRService extends SignalrService {\r\n\r\n protected appointmentChangedSubject = new Subject();\r\n\r\n constructor(protected baseService: BaseService, protected appStorageService: AppStorageService, @Inject(PLATFORM_ID) protected platformId: Object) { \r\n super(baseService, appStorageService, platformId);\r\n \r\n this.hubName = \"CliniwebHub\";\r\n } \r\n\r\n registerOnServerEvents(): void { \r\n\r\n // new appointment event received\r\n this.proxy.on('AppointmentChangeEvent', (appointmentEvent: AppointmentEvent) => { \r\n \r\n console.log(\"SignalR: AppointmentChange event received.\");\r\n \r\n this.appointmentChangedSubject.next(appointmentEvent);\r\n });\r\n }\r\n\r\n onAppointmentChangedReceived() : Observable {\r\n return this.appointmentChangedSubject.asObservable();\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { Component, HostListener, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';\r\nimport { Observable, forkJoin, of } from 'rxjs';\r\nimport { catchError, tap } from 'rxjs/operators';\r\nimport { BaseService } from 'src/app/core/services/base.service';\r\nimport { UserService } from 'src/app/core/services/user.service';\r\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\r\nimport { Dependent } from 'src/app/shared/models/people/dependent.model';\r\nimport { UserPerson } from 'src/app/shared/models/people/user-person.model';\r\nimport { PatientAppointment } from 'src/app/shared/models/process/appointment.model';\r\nimport { Directory } from 'src/app/shared/models/systems/directory.model';\r\n\r\n@Component({\r\n selector: 'app-next-appointment-dialog',\r\n templateUrl: './next-appointment-dialog.component.html',\r\n styleUrls: ['./next-appointment-dialog.component.css'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class NextAppointmentDialogComponent implements OnInit { \r\n appointment : PatientAppointment; \r\n loading = true; \r\n directory: Directory;\r\n showAll: boolean = true;\r\n dependents: Dependent[]; \r\n loggedInUser: UserPerson;\r\n\r\n constructor(\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n @Inject(DOCUMENT) private document: Document,\r\n public mdDialogRef: MatDialogRef,\r\n private baseService: BaseService,\r\n private userService: UserService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loading = true;\r\n\r\n let observables: Observable[] = [];\r\n observables.push(this.getDirectory());\r\n observables.push(this.getUser());\r\n observables.push(this.getDependents());\r\n\r\n forkJoin(observables) \r\n .subscribe(results => { \r\n this.directory = results[0] as Directory;\r\n this.loggedInUser = results[1] as UserPerson;\r\n this.dependents = results[2] as Dependent[];\r\n \r\n this.appointment = this.baseService.parseObject(this.data.data);\r\n \r\n this.loading = false;\r\n });\r\n } \r\n\r\n getDirectory() : Observable {\r\n let companyId = this.baseService.getCliniwebDirectoryCompanyId();\r\n\r\n return this.baseService.getCliniwebDirectory(companyId);\r\n }\r\n\r\n getUser() : Observable {\r\n return this.userService.getUserPersonLoggedIn().pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => { \r\n this.baseService.handleServiceError(e, \"Error getting user\"); \r\n \r\n return of(null);\r\n })));\r\n }\r\n\r\n getDependents() : Observable{\r\n return this.userService.getUserDependents().pipe(\r\n tap(() => {\r\n \r\n }),\r\n catchError((e => { \r\n this.baseService.handleServiceError(e, \"Error getting dependents\"); \r\n \r\n return of([]);\r\n })));\r\n }\r\n\r\n public close() {\r\n if(this.data.animationOut){\r\n this.document.getElementsByClassName(this.data.id)[0].classList.remove(this.data.animationIn);\r\n this.document.getElementsByClassName(this.data.id)[0].classList.add(this.data.animationOut);\r\n\r\n setTimeout(()=>{ \r\n this.mdDialogRef.close();\r\n }, 300);\r\n }\r\n else{\r\n this.mdDialogRef.close();\r\n }\r\n } \r\n \r\n @HostListener(\"keydown.esc\") \r\n public onEsc() {\r\n this.close();\r\n }\r\n}","
\r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { AppStorageService, STORAGE } from 'src/app/core/services/app-storage.service';\nimport { TerritorialDivisionsService } from 'src/app/core/services/territorial-divisions.service';\nimport { UserService } from 'src/app/core/services/user.service';\nimport { TerritorialDivision } from 'src/app/shared/models/systems/territorial-division.model';\n\n@Component({\n selector: 'app-select-country-dialog',\n templateUrl: './select-country-dialog.component.html',\n styleUrls: ['./select-country-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class SelectCountryDialogComponent implements OnInit {\n\n\n errorSubject = new BehaviorSubject('');\n get errorObservable(): Observable {\n return this.errorSubject.asObservable();\n }\n \n constructor(\n private userService: UserService,\n private territorialDivisionService: TerritorialDivisionsService,\n private appStorageService: AppStorageService,\n private mdDialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: any, \n @Inject(L10N_LOCALE) public locale: L10nLocale,\n ) { }\n\n ngOnInit(): void {\n }\n\n countrySelected(country: TerritorialDivision){\n this.userService.updateUserResidenceCountry(country.idPais).subscribe(result=>{\n\n // SET COUNTRY APP\n this.territorialDivisionService.setCountryApp(country.idPais);\n\n // UPDATE USER\n this.userService.getUserPersonLoggedIn().subscribe(user=>{\n\n if(user){\n user.idPaisResidencia = country.idPais;\n\n this.userService.updateUserLoggedIn(user);\n }\n });\n\n this.mdDialogRef.close();\n this.appStorageService.removeSessionItem(STORAGE.SELECT_COUNTRY);\n }, error =>{\n \n this.errorSubject.next(\"Hubo un error al grabar el paĆ­s, intente nuevamente\");\n });\n }\n}\n","
\n
\n \n \n
\n
","import { DOCUMENT } from '@angular/common';\nimport { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { L10N_LOCALE, L10nLocale } from 'angular-l10n';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { LayoutService } from 'src/app/core/services/layout.service';\nimport { DialogData } from 'src/app/shared/models/dialog-data.model';\n\n@Component({\n selector: 'app-error-dialog',\n templateUrl: './error-dialog.component.html',\n styleUrls: ['./error-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ErrorDialogComponent implements OnDestroy, OnInit {\n\n private ngUnsubscribe = new Subject();\n licenseLoading: boolean = true;\n\n constructor(\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\n @Inject(DOCUMENT) private document: Document,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n private layoutService: LayoutService,\n private mdDialogRef: MatDialogRef\n ) { }\n\n ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n ngOnInit(): void {\n if(this.data.loadLicense){\n this.layoutService.loadLicenseTheme('error-dialog-wrapper')\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(_ => this.licenseLoading = false);\n }\n else{\n this.licenseLoading = false;\n }\n }\n\n public close(value = false): void {\n if (this.data.animationOut) {\n this.document.getElementsByClassName(this.data.id)[0].classList.remove(this.data.animationIn);\n this.document.getElementsByClassName(this.data.id)[0].classList.add(this.data.animationOut);\n\n setTimeout(()=> this.mdDialogRef.close(value), 300);\n } else {\n this.mdDialogRef.close(value);\n }\n }\n}\n","
\n
\n

Upsss

\n

\n {{ 'errorDialog.message' | translate:locale.language }}\n

\n \n
\n
\n \n
\n
\n","export class ReferralMedical{\r\n idControlFormulario: string;\r\n \r\n // datos para la respuesta\r\n data: any;\r\n}","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeLoaderService {\n insertedElement: HTMLElement;\n\n init(themeName: string) {\n\n\n import(\n /* webpackChunkName: \"[request]\" */\n `../../../themes/${themeName}/theme.js`\n )\n .then((s) => s.default)\n .then(this.insertToDom);\n\n\n // const head = document.getElementsByTagName('head')[0];\n\n // const link = document.createElement('link');\n // link.rel = 'stylesheet';\n // link.href = `${themeName}.css`;\n // head.appendChild(link);\n }\n\n insertToDom = (content: string) => {\n const element = document.createElement('style');\n element.textContent = content;\n document.head.appendChild(element);\n\n if (this.insertedElement) this.insertedElement.remove();\n this.insertedElement = element;\n };\n}","import { Injectable } from \"@angular/core\";\r\nimport { environment } from \"src/environments/environment\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n })\r\n export class GoogleMapsLoaderService {\r\n private static promise: Promise;\r\n \r\n constructor() {}\r\n \r\n load(): Promise {\r\n if (!GoogleMapsLoaderService.promise) {\r\n GoogleMapsLoaderService.promise = new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = `https://maps.googleapis.com/maps/api/js?key=${environment.googleApiKey}`;\r\n script.async = true;\r\n script.defer = true;\r\n \r\n script.onload = () => {\r\n resolve();\r\n };\r\n \r\n script.onerror = (error: any) => {\r\n reject(error);\r\n };\r\n \r\n document.head.appendChild(script);\r\n });\r\n }\r\n \r\n return GoogleMapsLoaderService.promise;\r\n }\r\n }","
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n\r\n
0\">\r\n \r\n \r\n \r\n
\r\n
","import { OverlayContainer } from '@angular/cdk/overlay';\nimport { ChangeDetectorRef, Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID, ViewEncapsulation } from '@angular/core';\nimport { BaseService } from './core/services/base.service';\nimport { DOCUMENT, isPlatformBrowser, Location } from '@angular/common';\nimport { LayoutService } from './core/services/layout.service';\nimport { Direction } from './shared/enums/direction.enum';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { IframeMessageService } from './core/services/iframe-message.service';\nimport { EmptyDialogComponent } from './shared/components/dialogs/empty-dialog.component';\nimport { Debounce } from './shared/decorators/debounce.decorator';\nimport { UserService } from './core/services/user.service';\nimport { ActivatedRoute, ActivatedRouteSnapshot, ChildrenOutletContexts, NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport { LoadChatMessage, LoginCompletedMessage, MessageBusService, PageScrollMessage, TerritorialDivionCountryMessage } from './core/services/message-bus.service';\nimport { VirtualAttentionService } from './core/services/virtual-attention.service';\nimport { AuthService } from './core/services/auth.service';\nimport { DialogData } from './shared/models/dialog-data.model';\nimport { L10nLocale, L10nTranslationService, L10N_LOCALE } from 'angular-l10n';\nimport { ConfirmDialogComponent } from './shared/components/dialogs/confirm-dialog/confirm-dialog.component';\nimport { DateAdapter } from '@angular/material/core';\nimport { GoogleAnalyticsService } from './core/services/google-analytics.service';\nimport { environment } from 'src/environments/environment';\nimport { fadeAnimation } from './shared/animations';\nimport { ThemeLoaderService } from './core/services/theme-loader.service';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { CustomSnackBarComponent } from './shared/components/custom-snack-bar/custom-snack-bar.component';\nimport { Subscription } from 'rxjs/internal/Subscription';\nimport { FormComponentData } from './shared/models/people/form-control.model';\nimport { ContainerType } from './shared/enums/container-type.enum';\nimport { AppointmentsSignalRService } from './core/services/signalR/appointments-signalr.service';\nimport { AppointmentEvent } from './shared/models/signalr/appointment-event.model';\nimport { AppointmentService } from './core/services/appointment.service';\nimport { AppStorageService, STORAGE } from './core/services/app-storage.service';\nimport { ThemeColorService } from './core/services/theme-color.service';\nimport { PatientAppointment } from './shared/models/process/appointment.model';\nimport { NextAppointmentDialogComponent } from './shared/components/dialogs/next-appointment-dialog/next-appointment-dialog.component';\nimport { SelectCountryDialogComponent } from './shared/components/dialogs/select-country-dialog/select-country-dialog.component';\nimport { ErrorDialogComponent } from './shared/components/dialogs/error-dialog/error-dialog.component';\nimport { GoogleMapsLoaderService } from './core/services/google-maps-loader.service';\nimport { ReferralMedical } from './shared/models/systems/referral-medical.model';\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styleUrls: ['./app.component.css'],\n animations: [ fadeAnimation ],\n providers: [AppointmentsSignalRService],\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent implements OnInit, OnDestroy {\n title = 'PHR';\n headerName = '';\n directoryClass= 'cliniweb';\n iframeZIndex = 1;\n dummyDialog : MatDialogRef; \n showHeader = true;\n interconsulta = false;\n sessionExpiredPopupOpen = false;\n serviceErrorPopupOpen = false;\n isIframeModalOpen = false;\n hasJointGroup = false;\n lastUrl = '';\n\n routeDialogOpened: boolean = false;\n reloadPage: boolean = false;\n\n floatingComponents: FormComponentData[] = [];\n\n private selectCountryDialogOpened:boolean = false;\n\n private scrollTop: number = 0;\n private routeQueryParamsSubscribe:Subscription;\n\n ID_AREA_SISTEMA_MIS_CITAS: number = 3459;\n ID_AREA_SISTEMA_INICIO: number = 3457;\n ID_AREA_SISTEMA_DOCTORES: number = 3741;\n\n isDesktopMac: boolean = false;\n isIOS: boolean = false;\n\n pathName: string;\n\n isBrowser: boolean;\n \n constructor(\n private baseService: BaseService,\n private overlayContainer: OverlayContainer,\n private layoutService: LayoutService,\n private dialog: MatDialog,\n private iframeMessageService: IframeMessageService,\n private googleAnalyticsService: GoogleAnalyticsService,\n private matIconRegistry: MatIconRegistry,\n private userService: UserService,\n private messageBusService: MessageBusService,\n private authService: AuthService, \n private virtualAttentionService: VirtualAttentionService,\n private appointmentService: AppointmentService,\n private themeLoaderService: ThemeLoaderService,\n private translation: L10nTranslationService,\n private router: Router,\n private route: ActivatedRoute,\n private location: Location,\n private dateAdapter: DateAdapter,\n private contexts: ChildrenOutletContexts,\n private snackBar: MatSnackBar,\n private changeDetector: ChangeDetectorRef,\n private appointmentSignalRService: AppointmentsSignalRService,\n private appStorageService: AppStorageService,\n private themeColorService: ThemeColorService,\n private googleMapsLoaderService: GoogleMapsLoaderService,\n @Inject(L10N_LOCALE) public locale: L10nLocale,\n @Inject(DOCUMENT) private document: Document,\n @Inject(PLATFORM_ID) private platformId: Object\n ) \n {\n this.isBrowser = isPlatformBrowser(this.platformId);\n\n this.matIconRegistry.registerFontClassAlias('phr-iconset');\n\n this.messageBusSubscriptions();\n\n this.googleAnalyticsConfig();\n\n this.workarroundForRouteDialog();\n }\n\n private messageBusSubscriptions(){\n\n this.messageBusService.onAuthIframe().subscribe((a) =>{\n this.showHeader = false;\n });\n \n this.messageBusService.onHideHeader().subscribe((a) =>{\n this.showHeader = false;\n this.changeDetector.detectChanges();\n });\n\n this.messageBusService.onShowHeader().subscribe((a) =>{\n this.showHeader = true;\n });\n\n this.messageBusService.onOpenSnackBar().subscribe((message)=>{\n this.snackBar.openFromComponent(CustomSnackBarComponent, {\n data: message, \n duration: message.duration,\n horizontalPosition: 'left'\n }); \n });\n\n this.messageBusService.onSendFloatingComponents().subscribe((message)=>{\n if(this.document.body.classList.contains('route-dialog-opened'))\n return;\n\n this.floatingComponents = message.componentsData.filter(c=>c.contenedor == ContainerType.MAIN);\n });\n }\n\n private googleAnalyticsConfig(){\n if(this.isBrowser && environment.production){\n this.location.onUrlChange(url =>{\n let snapshotUrl = this.router.routerState.snapshot.url;\n \n let exceptedUrls = ['', '/', '/es', '/en'];\n let languages = ['es', 'en'];\n \n let isntExceptedUrl = exceptedUrls.filter(e => e == snapshotUrl).length == 0;\n let containsLanguage = languages.filter( l => l == url.split('/')[1]).length > 0;\n let sameUrlAsAbove = this.lastUrl && this.lastUrl == url;\n \n if(isntExceptedUrl && containsLanguage && !sameUrlAsAbove){\n this.lastUrl = url;\n this.googleAnalyticsService.logPageView(url);\n }\n });\n }\n }\n\n private workarroundForRouteDialog(){\n this.router.events.subscribe((val)=>{\n if(this.isBrowser){\n if(val instanceof NavigationStart){\n if(document.body.classList.contains('route-dialog-opened') && val.navigationTrigger == 'popstate'){\n window.location.reload();\n }\n }\n \n if(val instanceof NavigationEnd){\n \n //add classname by page\n if(!this.document.body.classList.contains('route-dialog-opened')){\n \n var path = this.router.url.split('/')[1].split('?')[0];\n \n if(path != this.pathName){\n this.layoutService.removeClassToBody(this.pathName);\n \n this.pathName = path;\n \n this.layoutService.addClassToBody(this.pathName);\n }\n }\n \n // show header by data\n let showHeader = this.route.snapshot?.data?.showHeader;\n \n if(showHeader && showHeader == 'false'){\n this.showHeader = false;\n }\n \n if(this.reloadPage && !document.body.classList.contains('route-dialog-opened')){\n this.reloadPage = false;\n window.location.reload();\n }\n \n setTimeout(() => {\n if(document.body.classList.contains('route-dialog-opened')){\n this.routeDialogOpened = true;\n }\n else if(this.routeDialogOpened) {\n console.log('actualizar route config!');\n \n this.routeDialogOpened = false;\n this.reloadPage = true;\n }\n \n // Check if there is a next appointment alert to show\n this.checkNextAppointmentAlert();\n }, 600);\n \n \n if(!val.url.includes('checkout') \n && this.appStorageService.getItemSession(STORAGE.SELECT_COUNTRY) \n && !this.selectCountryDialogOpened){\n this.selectCountryDialogOpened = true;\n this.dialog.open(SelectCountryDialogComponent, {disableClose: true});\n }\n }\n }\n }); \n }\n\n ngOnInit(): void {\n if(this.isBrowser){\n\n //this.headerName = this.baseService.getHeaderName();\n this.setHeaderComponentName();\n\n this.toggleHeaderView();\n\n this.loadDirectoryTheme();\n\n this.setOverlayMaterial();\n\n this.setFavicon();\n\n this.setManifestUrl();\n\n this.setIframeModalActions();\n\n this.manageVirtualAttentionActions();\n\n this.manageSessionExpiredAction();\n\n this.manageServiceErrorAction();\n\n this.setDateAdapter();\n\n this.startNewAppointmentsListener();\n\n this.setCountryByUser();\n\n this.setZIndexInitialValue();\n\n this.isIOS = this.baseService.isIOS();\n this.isDesktopMac = this.baseService.isMacDesktop();\n\n this.googleMapsLoader();\n\n this.configByReferralMedical();\n } \n }\n\n private configByReferralMedical(){\n this.route.queryParams.subscribe(params => {\n if(params && params.interconsulta == 'true') {\n\n this.interconsulta = true;\n\n this.document.body.classList.add('referral-medical');\n\n const referralMedical = Object.assign(new ReferralMedical(), params);\n \n this.appStorageService.setItemSession(STORAGE.REFERRAL_MEDICAL, referralMedical);\n }\n });\n }\n\n private googleMapsLoader(){\n this.googleMapsLoaderService.load().then(() => {\n }).catch(error => {\n console.error('Error loading Google Maps API:', error);\n });\n };\n\n private setHeaderComponentName() {\n if (this.location.path().indexOf(\"/perfil/\") >= 0) {\n this.headerName = \"PublicProfilePageHeaderComponent\";\n }\n else {\n this.headerName = this.baseService.getHeaderName();\n }\n }\n\n @HostListener('window:beforeunload')\n ngOnDestroy() {\n\n if(this.routeQueryParamsSubscribe) {\n this.routeQueryParamsSubscribe.unsubscribe();\n }\n\n if(this.isBrowser)\n this.appointmentService.clearAppointmentsCache();\n }\n\n loadDirectoryTheme(){\n\n if(this.isBrowser){\n this.directoryClass = this.baseService.getDirectoryClass();\n this.themeColorService.directoryClass = this.directoryClass;\n\n this.document.body.classList.remove('loading-page');\n this.document.body.classList.add(this.getDirectoryClassName());\n\n this.setThemeProperties();\n\n this.themeColorService.setThemeColor();\n \n this.themeLoaderService.init(this.directoryClass);\n }\n }\n\n toggleHeaderView(){\n // Get QS parameters\n this.route.queryParams.subscribe(params => {\n if (params && params.hideHeader == 'true') {\n this.showHeader = false;\n }\n });\n }\n\n startNewAppointmentsListener() {\n this.userService.getUserPersonLoggedIn().subscribe(\n user => { user != null && user.id > 0 ? this.initAppointmentSignalR(user.id) : 0 },\n error => {}\n );\n }\n\n setCountryByUser(){\n this.messageBusService.onLoginCompleted().subscribe(message=>{\n\n this.userService.getUserCountry().subscribe(country=>{\n if(country){\n let msg = new TerritorialDivionCountryMessage();\n msg.country = country;\n \n this.messageBusService.sendTerritorialDivisionCountry(msg);\n }\n else{\n this.appStorageService.setItemSession(STORAGE.SELECT_COUNTRY, true);\n }\n });\n });\n }\n\n initAppointmentSignalR(userId: number) {\n if(!this.isBrowser){\n return;\n }\n\n if (!this.hasJointGroup) {\n this.appointmentSignalRService.onConnectionLost().subscribe(m => {\n console.log(\"Appointments: Connection lost\");\n });\n \n this.appointmentSignalRService.onConnectionStablished().subscribe(m => {\n \n console.log(\"Appointments: Connection stablished\");\n this.hasJointGroup = true;\n // Join group that will receive appointments\n this.appointmentSignalRService.joinGroup(userId);\n });\n \n\n if(this.isBrowser){\n // Init signalR\n this.appointmentSignalRService.init();\n }\n \n // Subscribe to events\n this.subscribeToSignalREvents(userId);\n }\n }\n\n subscribeToSignalREvents(userId: number): void { \n \n // NEW MESSAGE\n this.appointmentSignalRService.onAppointmentChangedReceived().subscribe((message: AppointmentEvent) => { \n \n // second layer user validation\n if (message && message.IdUsuario == userId) {\n this.appointmentService.getAppointments(this.locale.language).subscribe(\n appointments => this.messageBusService.appointmentChangeReceived(appointments),\n error => {}\n );\n }\n });\n } \n\n getRouteAnimationData(route?: ActivatedRouteSnapshot): string {\n if (!route) {\n route = this.contexts.getContext('primary')?.route?.snapshot;\n }\n \n let result = route?.data?.['animation'];\n \n if (route?.children?.length) {\n const response = result = this.getRouteAnimationData(route.children[0]);\n if (response) {\n result = response;\n }\n }\n\n return result ?? '';\n }\n\n getActiveVirtualAttention() {\n this.virtualAttentionService.getActive().subscribe(va => { \n if (!va)\n return;\n \n let msg = new LoadChatMessage();\n msg.idEtapaSolicitud = va.idEtapaSolicitud;\n \n this.messageBusService.loadChat(msg);\n });\n }\n\n setOverlayMaterial(){\n const overlayContainerClasses = this.overlayContainer.getContainerElement().classList;\n const themeClassesToRemove = Array.from(overlayContainerClasses).filter((item: string) => item.includes('-theme'));\n if (themeClassesToRemove.length) {\n overlayContainerClasses.remove(...themeClassesToRemove);\n }\n overlayContainerClasses.add(this.getDirectoryClassName());\n }\n\n getDirectoryClassName(){\n return this.directoryClass + \"-theme\";\n }\n\n setThemeProperties(){\n const element = this.document.body;\n const theme = this.themeColorService.theme;\n\n if(!theme) return;\n\n for (const key in theme.properties) {\n element.style.setProperty(key, theme.properties[key]);\n }\n }\n\n setFavicon(){\n const urlFavicon = this.baseService.getDirectoryUrlFavicon();\n\n const htmlElement:HTMLLinkElement | null = this.document.querySelector('#faviconLink');\n const appleHtmlElement:HTMLLinkElement | null = this.document.querySelector('#applefaviconLink');\n\n const currentTheme = this.themeColorService.theme;\n\n if(htmlElement) \n htmlElement.href = urlFavicon;\n\n if (appleHtmlElement && currentTheme)\n appleHtmlElement.href = currentTheme.properties[\"--favicon-big\"];\n }\n\n setManifestUrl(){\n const manifestUrl = \"pwa/manifest/manifest-\" + this.directoryClass + \".json\";\n\n const htmlElement:HTMLLinkElement | null = this.document.querySelector('#manifestLink');\n\n if(htmlElement)\n htmlElement.href = manifestUrl;\n }\n\n @HostListener('scroll', ['$event'])\n //@Debounce(100)\n onScroll($event:Event){\n\n const scrollTop = ($event.target as Element).scrollTop;\n const offset = this.scrollTop - scrollTop;\n const elOffsetTop = ($event.target as HTMLElement).offsetTop\n\n if(Math.abs(offset) < 50) return; \n\n const direction = offset < 0\n ? Direction.Down\n : Direction.Up;\n\n this.scrollTop = scrollTop;\n\n this.layoutService.onScrollingBody(direction);\n\n this.messageBusService.pageScroll(new PageScrollMessage(direction, scrollTop, elOffsetTop, false));\n }\n\n @HostListener('touchmove', ['$event'])\n @Debounce(200)\n onTouchMove($event: Event) {\n const activeElement = this.document.activeElement;\n if (activeElement && (activeElement as HTMLElement).blur) {\n (activeElement as HTMLElement).blur();\n }\n }\n\n onDialogOpen() { \n // This dummy dialog will provide the overlay we need on the page when openning a modal inside the iframe\n this.dummyDialog = this.dialog.open(EmptyDialogComponent, {\n panelClass: 'dummy-dialog', \n disableClose: true\n });\n\n // We need to change the page main div z-index in this case to show the iframe above the overlay and modal we just onpened\n this.iframeZIndex = 9999;\n\n this.isIframeModalOpen = true;\n }\n\n onDialogClose() {\n if (this.dummyDialog)\n this.dummyDialog.close();\n\n //this.iframeZIndex = 1;\n this.setZIndexInitialValue();\n\n this.isIframeModalOpen = false;\n }\n\n setZIndexInitialValue() {\n /*let isMobile = window.innerWidth < 800;\n\n this.iframeZIndex = isMobile? 1 : 2;*/\n\n this.iframeZIndex = 1;\n }\n\n onRequestUserId() {\n this.userService.processRequestUserId();\n }\n\n private setIframeModalActions(){\n // Register to ModalOpen and ModalClose events that are fired from an iframe\n this.iframeMessageService.onModalOpen().subscribe(msg => {\n this.onDialogOpen();\n });\n this.iframeMessageService.onModalClose().subscribe(msg => {\n this.onDialogClose();\n });\n \n this.iframeMessageService.onRequestUserId().subscribe(msg => {\n this.onRequestUserId();\n });\n \n // We will get this event when user login using the popup of Cliniweb, as the PHR instance of the popup is in another window\n // Cliniweb need to send us a message to let us know the user loged in\n this.iframeMessageService.onRefreshUser().subscribe(m => {\n this.userService.getUserPersonLoggedIn().subscribe(p => {\n if (p)\n this.messageBusService.loginCompleted(new LoginCompletedMessage(p));\n });\n });\n }\n\n private manageVirtualAttentionActions(){\n // Get active virtual attention\n if (this.authService.isLoggedIn()) {\n this.getActiveVirtualAttention();\n }\n \n // On SSO when the ngOnInit the user is not yet logged in, so for those cases we will subscribe to this event\n this.messageBusService.onLoginCompleted().subscribe(msg => { \n this.getActiveVirtualAttention();\n this.startNewAppointmentsListener();\n });\n }\n\n private manageSessionExpiredAction(){\n // On Session expired\n this.messageBusService.onSessionExpired().subscribe(msg => {\n\n if (this.sessionExpiredPopupOpen)\n return;\n \n this.sessionExpiredPopupOpen = true;\n\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"sessionExpired.title\");\n dialogData.message = this.translation.translate(\"sessionExpired.message\");\n dialogData.confirmText = this.translation.translate(\"sessionExpired.btnText\"); \n dialogData.showHeaderIcon = false;\n //dialogData.headerIconClass = \"phr-iconset-info\"; \n dialogData.showCancelButton = false;\n\n const dialogRef = this.dialog.open(ConfirmDialogComponent, {\n data: dialogData,\n panelClass: ['cliniweb-theme-dialog', 'session-expired-dialog']\n });\n\n dialogRef.afterClosed().subscribe(accepted => { \n this.sessionExpiredPopupOpen = false;\n \n this.authService.logout();\n this.appStorageService.removeSessionItem(STORAGE.SIGNUP_WORKFLOW_VERIFICATION_TYPE);\n this.router.navigate(['/login'], { queryParams: { homeUrl: msg.returnUrl } });\n }); \n });\n }\n\n private manageServiceErrorAction(){\n // On Service Error\n this.messageBusService.onServiceError().subscribe(msg => {\n\n if (msg.innerError && msg.innerError.message == \"Popup window closed\" || this.sessionExpiredPopupOpen) {\n // popups closed should not return error.\n return;\n }\n \n if (this.serviceErrorPopupOpen)\n return;\n \n this.serviceErrorPopupOpen = true;\n\n let messageText = msg.displayMessage? msg.displayMessage : this.translation.translate(\"serviceError.message\");\n\n let dialogData = new DialogData();\n dialogData.title = this.translation.translate(\"serviceError.title\");\n dialogData.message = messageText;\n dialogData.confirmText = this.translation.translate(\"serviceError.btnText\"); \n dialogData.showHeaderIcon = true;\n dialogData.headerIconClass = \"phr-iconset-warning\"; \n dialogData.showCancelButton = false;\n\n const dialogRef = this.dialog.open(ErrorDialogComponent, {\n data: dialogData\n });\n\n dialogRef.afterClosed().subscribe(accepted => { \n this.serviceErrorPopupOpen = false; \n });\n });\n }\n\n private setDateAdapter(){\n if(isPlatformBrowser(this.platformId)){\n // When language change we need to set the propper locale to the datepicker\n this.dateAdapter.setLocale(this.locale.dateLanguage);\n\n this.baseService.localeChanged$.subscribe(l => {\n this.dateAdapter.setLocale(l.dateLanguage);\n });\n }\n }\n\n private checkNextAppointmentAlert() {\n let companyName = this.baseService.getCompanyName();\n\n if (companyName.toLocaleLowerCase() == \"sura-pacientes-pa\")\n return;\n\n // If user is logged in\n this.userService.getUserPersonLoggedIn().subscribe(p => {\n if (!p)\n return;\n \n // If account has \"citas\" on the menu\n this.baseService.getMenuLinks(this.locale.language).subscribe(links => {\n if (links && links.length > 0 && links.find(l => l.idAreaSistema == this.ID_AREA_SISTEMA_MIS_CITAS)) {\n \n let path = document.location.pathname.replace(this.locale.language, \"\").replace(/\\//g, \"\"); \n\n // If we are now on \"Inicio\" or \"doctors\" page\n if (links.find(l => \n (l.idAreaSistema == this.ID_AREA_SISTEMA_INICIO || l.idAreaSistema == this.ID_AREA_SISTEMA_DOCTORES)\n && l.identificadorUrl == path\n )) {\n this.hasNextAppointmentAlert();\n }\n }\n });\n });\n }\n\n private hasNextAppointmentAlert() {\n this.appointmentService.getNextAppointment(this.locale.language).subscribe(appointment => {\n if (!appointment)\n return;\n\n let now = new Date().getTime();\n let lastTimeShown = this.appointmentService.getAppointmentLastTimeShown(appointment.idEtapaSolicitud);\n let creationDate = new Date(appointment.fechaRegistro).getTime(); \n \n if (lastTimeShown <= 0)\n lastTimeShown = creationDate;\n \n let timeDiff = now - lastTimeShown;\n let hrsDiff = (24 * 60 * 60 * 1000); // 24 hrs\n\n if (timeDiff > hrsDiff) { \n this.appointmentService.setAppointmentLastTimeShown(appointment.idEtapaSolicitud);\n\n // Show the alert\n this.showNextAppointmentAlert(appointment);\n }\n });\n }\n\n showNextAppointmentAlert(appointment: PatientAppointment) {\n let dialogData = new DialogData();\n dialogData.data = appointment;\n \n const dialogRef = this.dialog.open(NextAppointmentDialogComponent, {\n data: {\n id: 'next-appointment-dialog', \n data: appointment,\n animationIn: 'next-appointment-animation-in',\n animationOut: 'next-appointment-animation-out'\n },\n panelClass: ['next-appointment-dialog', 'next-appointment-animation-in']\n });\n \n dialogRef.afterClosed().subscribe(() => {\n\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { Router } from '@angular/router';\nimport { catchError } from 'rxjs/operators';\nimport { LogService } from '../services/log.service';\nimport { AuthService } from '../services/auth.service';\nimport { MessageBusService, ServiceErrorMessage } from '../services/message-bus.service';\n\n@Injectable()\nexport class ErrorInterceptor implements HttpInterceptor {\n\n constructor(\n private router: Router,\n private logService: LogService,\n private authService: AuthService,\n private messageBusService: MessageBusService\n ) {}\n\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\n// this.messageBusService.serviceError(new ServiceErrorMessage(''));\n return next.handle(request).pipe(catchError(this.catchError.bind(this)));\n }\n\n private catchError(err: HttpErrorResponse): Observable {\n const error: string = err?.error?.message || err.statusText;\n \n /*if ([401, 403].includes(err.status) || (err.error && err.error.error == 'invalid_grant')) {\n this.authService.sessionExpired(this.router.routerState.snapshot.url); \n \n //this.router.navigate(['/login'], { queryParams: { returnUrl: this.router.routerState.snapshot.url } });\n }\n else if(err && err.error && err.error.error && err.error.error != 'invalid_grant') {\n this.logService.logError(error);\n }*/\n\n this.sendLogs(err, error);\n\n this.showErrorDialog(err);\n\n return throwError(error);\n }\n\n private sendLogs(err: any, error: string) {\n if(err?.error?.error && err.error.error != 'invalid_grant') {\n this.logService.logError(error);\n }\n }\n\n private showErrorDialog(err: any): void {\n if (err.status > 404) {\n this.messageBusService.serviceError(new ServiceErrorMessage(''));\n }\n}\n\n}\n","import { Injectable, Inject, Optional, PLATFORM_ID } from \"@angular/core\";\r\nimport { HttpClient, HttpHeaders, HttpParams } from \"@angular/common/http\";\r\nimport { Observable } from \"rxjs\";\r\n\r\nimport {\r\n L10nConfig,\r\n L10nLoader,\r\n L10nStorage,\r\n L10nLocale,\r\n L10nTranslationLoader,\r\n L10nProvider,\r\n L10nValidation,\r\n L10N_LOCALE,\r\n L10nNumberFormatOptions,\r\n L10nDateTimeFormatOptions,\r\n parseDigits,\r\n L10nTranslationService\r\n} from \"angular-l10n\";\r\nimport { isPlatformBrowser } from \"@angular/common\";\r\n\r\n\r\nexport const l10nConfig: L10nConfig = {\r\n format: 'language',\r\n providers: [\r\n { name: 'app', asset: './assets/i18n/app', options: { version: '1.0.0' } }\r\n ],\r\n fallback: false,\r\n cache: true,\r\n keySeparator: '.',\r\n defaultLocale: { language: 'es', currency: 'USD', dateLanguage: 'es-ES' },\r\n schema: [\r\n { locale: { language: 'es', currency: 'USD', dateLanguage: 'es-ES' }, dir: 'ltr', text: 'PanamĆ”' },\r\n { locale: { language: 'en', currency: 'USD', dateLanguage: 'en-US' }, dir: 'ltr', text: 'United States' } \r\n ],\r\n defaultRouting: false\r\n};\r\n\r\nexport function l10nPreload(translation: L10nTranslationService, translationLoader: L10nTranslationLoader): () => Promise {\r\n return () => new Promise((resolve) => {\r\n translationLoader.get('es', { name: 'app', asset: './assets/i18n/app', options: { version: '1.0.0' } })\r\n .subscribe({\r\n next: (data) => {\r\n translation.addData(data, 'es');\r\n },\r\n complete: () => resolve()\r\n });\r\n });\r\n}\r\n\r\nexport function initL10n(l10nLoader: L10nLoader): () => Promise {\r\n return () => l10nLoader.init();\r\n}\r\n\r\n@Injectable() export class AppStorage implements L10nStorage {\r\n\r\n private isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: Object) {\r\n // Determina si el cĆ³digo se ejecuta en el navegador\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n public async read(): Promise {\r\n if (this.isBrowser) { // Solo usar localStorage en el cliente\r\n let locale = JSON.parse(localStorage.getItem('locale') || '{}');\r\n if (!locale || !locale.language) {\r\n locale = l10nConfig.defaultLocale;\r\n }\r\n return Promise.resolve(locale);\r\n }\r\n return Promise.resolve(l10nConfig.defaultLocale); // En el servidor, retorna el valor por defecto\r\n }\r\n\r\n public async write(locale: L10nLocale): Promise {\r\n if (this.isBrowser) {\r\n localStorage.setItem('locale', JSON.stringify(locale));\r\n }\r\n }\r\n}\r\n\r\n@Injectable() export class HttpTranslationLoader implements L10nTranslationLoader {\r\n\r\n private headers = new HttpHeaders({ 'Content-Type': 'application/json' });\r\n\r\n constructor(@Optional() private http: HttpClient) { }\r\n\r\n public get(language: string, provider: L10nProvider): Observable<{ [key: string]: any }> {\r\n\r\n const url = `${provider.asset}-${language}.json`;\r\n const options = {\r\n headers: this.headers,\r\n params: new HttpParams().set('v', provider.options.version)\r\n };\r\n return this.http.get(url, options);\r\n }\r\n}\r\n\r\n@Injectable() export class LocaleValidation implements L10nValidation {\r\n\r\n constructor(@Inject(L10N_LOCALE) private locale: L10nLocale) { }\r\n\r\n public parseNumber(value: string, options?: L10nNumberFormatOptions, language = this.locale.language): number | null {\r\n if (value === '' || value == null) return null;\r\n\r\n let format = {\r\n ...parseDigits(options && options.digits ? options.digits : '') \r\n };\r\n\r\n format.minimumIntegerDigits = 1;\r\n format.minimumFractionDigits = 0;\r\n format.maximumFractionDigits = 0;\r\n\r\n let decimalSeparator: string;\r\n switch (language) {\r\n case 'es':\r\n decimalSeparator = ',';\r\n break;\r\n default:\r\n decimalSeparator = '.';\r\n }\r\n\r\n const pattern = `^-?[\\\\d]{${format.minimumIntegerDigits},}(\\\\${decimalSeparator}[\\\\d]{${format.minimumFractionDigits},${format.maximumFractionDigits}})?$`;\r\n const regex = new RegExp(pattern);\r\n return regex.test(value) ? parseFloat(value.replace(decimalSeparator, '.')) : null;\r\n }\r\n\r\n public parseDate(value: string, options?: L10nDateTimeFormatOptions, language = this.locale.language): Date | null {\r\n return null;\r\n }\r\n\r\n}\r\n","import { BaseService } from \"../services/base.service\";\r\nimport { MessageBusService, ServiceErrorMessage } from \"../services/message-bus.service\";\r\nimport { RouteLoaderService } from \"../services/route-loader.service\";\r\nimport { take } from \"rxjs/operators\";\r\nimport { TerritorialDivisionsService } from \"../services/territorial-divisions.service\";\r\nimport { forkJoin, Observable } from \"rxjs\";\r\nimport { Router } from \"@angular/router\";\r\nimport { isPlatformBrowser } from \"@angular/common\";\r\nimport { AppInitializationService } from \"../services/app-initializer.service\";\r\n\r\nexport function appInitializer(\r\n baseService: BaseService,\r\n routeLoader: RouteLoaderService,\r\n messageBusService: MessageBusService,\r\n territorialDivisionService: TerritorialDivisionsService,\r\n router: Router,\r\n platformId: Object,\r\n appInitializationService: AppInitializationService\r\n) {\r\n return () => new Promise((resolve) => {\r\n appInitializationService.setInitialized();\r\n\r\n let activeProcesses = 0;\r\n\r\n const manageProcesses = {\r\n start: () => activeProcesses++,\r\n finish: () => {\r\n activeProcesses--;\r\n if (activeProcesses === 0) {\r\n resolve();\r\n }\r\n },\r\n };\r\n\r\n if (isPlatformBrowser(platformId)) {\r\n baseService.checkVersion();\r\n }\r\n\r\n const appConfig$ = baseService.getAppConfig().pipe(take(1));\r\n const observables: Observable[] = [appConfig$];\r\n\r\n if (isPlatformBrowser(platformId)) {\r\n const country$ = territorialDivisionService.getCountryByIp().pipe(take(1));\r\n observables.push(country$);\r\n }\r\n\r\n manageProcesses.start();\r\n\r\n forkJoin(observables).subscribe({\r\n next: (results) => handleInitializationResults(results),\r\n error: (error) => handleInitializationError(error),\r\n });\r\n\r\n function handleInitializationResults(results: any[]) {\r\n const directory = results[0];\r\n\r\n manageProcesses.start();\r\n routeLoader.load(directory.localizacionDefecto, directory.idEmpresa)\r\n .subscribe({\r\n complete: () => {\r\n router.initialNavigation();\r\n manageProcesses.finish();\r\n }\r\n });\r\n\r\n manageProcesses.finish();\r\n }\r\n\r\n function handleInitializationError(error: any) {\r\n router.initialNavigation();\r\n resolve();\r\n\r\n setTimeout(() => {\r\n messageBusService.serviceError(new ServiceErrorMessage(\"Error during initialization\"));\r\n }, 100);\r\n }\r\n });\r\n}","import { Injectable } from '@angular/core';\nimport { Subject } from \"rxjs\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LoadingService {\n\n private _loading: boolean = false;\n loadingStatus = new Subject();\n\n constructor() { }\n\n get loading():boolean {\n return this._loading;\n }\n\n set loading(value) {\n this._loading = value;\n this.loadingStatus.next(value);\n }\n\n startLoading() {\n this.loading = true;\n }\n\n stopLoading() {\n this.loading = false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { LoadingService } from '../services/loading.service';\nimport { finalize } from 'rxjs/operators';\n\n@Injectable()\nexport class LoadingInterceptor implements HttpInterceptor {\n\n activeRequests: number = 0;\n\n constructor(private loadingService: LoadingService) {\n }\n\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\n if (this.activeRequests === 0) {\n this.loadingService.startLoading();\n }\n\n this.activeRequests++;\n return next.handle(request).pipe(\n finalize(() => {\n this.activeRequests--;\n if (this.activeRequests === 0) {\n this.loadingService.stopLoading();\n }\n })\n )\n };\n}\n","import { Theme } from \"../theme\";\r\n\r\nexport const suraTheme: Theme = {\r\n name: 'sura',\r\n properties: {\r\n '--primary': '#0033a0',\r\n '--primary2': '#0033a0',\r\n '--primary3': '#0033a0',\r\n '--on-primary': '#fff',\r\n '--accent': '#00aec7',\r\n '--on-accent': '#fff',\r\n '--accent1': '#E3E829',\r\n '--error': '#FF4C4C',\r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'sura',\r\n '--font-primary': 'Barlow, FSJoey',\r\n '--font-secundary': 'Montserrat, sans-serif',\r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD', \r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692',\r\n\r\n '--variant-color2': '#0033a0',\r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n\r\n '--public-profile-title-color': '#0033a0',\r\n '--public-profile-btn-appointment-color': '#0033a0',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/sura/pwa/Sura-512x512.png',\r\n }\r\n};","\r\nimport { Injectable } from '@angular/core';\r\nimport { MatPaginatorIntl } from '@angular/material/paginator';\r\nimport { L10nTranslationService } from 'angular-l10n';\r\n\r\n@Injectable()\r\nexport class MatPaginatorI18nService extends MatPaginatorIntl {\r\n \r\n private ofStr : string;\r\n\r\n public constructor(private translation: L10nTranslationService) {\r\n super();\r\n\r\n this.translation.onChange().subscribe({\r\n next: () => { \r\n this.itemsPerPageLabel = this.translation.translate('paginator.itemPerPage'); \r\n this.nextPageLabel = this.translation.translate('paginator.nextPage'); \r\n this.previousPageLabel = this.translation.translate('paginator.previousPage'); \r\n this.firstPageLabel = this.translation.translate('paginator.firstPage'); \r\n this.lastPageLabel = this.translation.translate('paginator.lastPage'); \r\n this.ofStr = this.translation.translate('paginator.of'); \r\n }\r\n }); \r\n }\r\n\r\n public getRangeLabel = (page: number, pageSize: number, length: number): string => {\r\n if (length === 0 || pageSize === 0) {\r\n return `0 / ${length}`;\r\n }\r\n\r\n length = Math.max(length, 0);\r\n\r\n const of = this.ofStr;\r\n const startIndex: number = page * pageSize;\r\n const endIndex: number = startIndex < length\r\n ? Math.min(startIndex + pageSize, length)\r\n : startIndex + pageSize;\r\n\r\n //return `${startIndex + 1} - ${endIndex} / ${length}`;\r\n return `${endIndex} ${of} ${length}`;\r\n }\r\n\r\n}","import { Theme } from \"../theme\";\r\n\r\nexport const mapfrePanamaTheme: Theme = {\r\n name: 'mapfre-panama',\r\n properties: {\r\n '--primary': '#d81e05',\r\n '--primary2': '#d81e05',\r\n '--primary3': '#d81e05',\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#E3E829',\r\n '--error': '#FF4C4C',\r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'SegoeUI',\r\n '--font-secundary': 'Montserrat',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692',\r\n\r\n '--variant-color2': '#d81e05',\r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#000',\r\n '--public-profile-btn-appointment-color': '#d81e05',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/mapfre/pwa/Mapfre-512x512.png',\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const mapfreGuatemalaTheme: Theme = {\r\n name: 'mapfre-guatemala',\r\n properties: {\r\n '--primary': '#d81e05',\r\n '--primary2': '#d81e05',\r\n '--primary3': '#d81e05',\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#E3E829',\r\n '--error': '#FF4C4C',\r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'SegoeUI',\r\n '--font-secundary': 'Montserrat',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050', \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692',\r\n\r\n '--variant-color2': '#d81e05',\r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#000',\r\n '--public-profile-btn-appointment-color': '#d81e05',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/mapfre/pwa/Mapfre-512x512.png',\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const mapfrePanamaAsistenciaTheme: Theme = {\r\n name: 'mapfre-panama-asistencia',\r\n properties: {\r\n '--primary': '#d81e05',\r\n '--primary2': '#d81e05',\r\n '--primary3': '#d81e05',\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#E3E829',\r\n '--error': '#FF4C4C',\r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'SegoeUI',\r\n '--font-secundary': 'Montserrat',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692',\r\n\r\n '--variant-color2': '#d81e05',\r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n \r\n '--public-profile-title-color': '#000',\r\n '--public-profile-btn-appointment-color': '#d81e05',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/mapfre-panama-asistencia/pwa/PanamaAsistencia-512x512.png',\r\n }\r\n};","import { Injectable } from '@angular/core';\nimport { ActivatedRoute, Route, Router } from '@angular/router';\nimport { L10nResolver } from 'angular-l10n';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { HomeComponent } from 'src/app/modules/home/pages/home/home.component';\nimport { FormComponent } from 'src/app/shared/components/form/form.component';\nimport { Link } from 'src/app/shared/models/people/link.model';\nimport { MenuGuard } from '../guards/menu.guard';\nimport { BaseService } from './base.service';\nimport { AuthPrivateRoutesGuard } from '../guards/auth-private-routes.guard';\nimport { environment } from 'src/environments/environment';\nimport { AppInitializationGuard } from '../guards/app-initialization.guard';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RouteLoaderService {\n\n constructor(private baseService: BaseService, public router: Router, public activedRoute: ActivatedRoute) { }\n\n public load(language:string, companyId: number):Observable{\n return this.baseService.getMenuLinks(language, companyId).pipe(map((links: Link[])=> this.buildMenuRoutes(links)));\n }\n\n buildMenuRoutes(links: Link[]): void {\n let alreadyAdded = this.router.config.find(r=> r.path == links[0].identificadorUrl);\n\n if(alreadyAdded) return;\n\n links.forEach(link=>{\n if (link.identificadorUrl) {\n this.createRoute(link);\n }\n \n if (link.subMenu?.length) {\n link.subMenu.forEach(subLink => this.createRoute(subLink, true));\n }\n });\n \n this.router.resetConfig(this.router.config);\n }\n\n private createRoute(link: Link, isSublink = false) {\n let path = this.baseService.getBasePath(link.identificadorUrl);\n\n if(isSublink){\n path = this.baseService.getBasePath(link.identificadorUrl);\n }\n\n const existingRoute = this.router.config.find(r => r.path == path);\n\n if (existingRoute) {\n this.addChildrenRoute(existingRoute, link);\n } else {\n this.addNewRoute(link);\n }\n }\n\n private addNewRoute(link: Link) {\n const childrenRoutes = this.buildChildrenRoutebyLink(link);\n \n this.router.config.unshift(\n {\n path: this.baseService.getBasePath(link.identificadorUrl), \n canActivate: [MenuGuard, AuthPrivateRoutesGuard, AppInitializationGuard],\n component: HomeComponent,\n children: childrenRoutes,\n resolve: { l10n: L10nResolver },\n data: {\n l10nProviders: [\n { name: 'home', asset: './assets/i18n/home', options: { version: environment.version } },\n { name: 'shared', asset: './assets/i18n/shared', options: { version: environment.version } }\n ],\n animation: link.nombreAnimacion ?? '',\n isRestrictedRoute: link.accesoPublico === 'N'\n }\n });\n }\n\n\n private addChildrenRoute (existingRoute: Route, link: Link) {\n let parentPath = existingRoute.path ?? '';\n parentPath += '/';\n\n const path = link.identificadorUrl.replace(parentPath, '');\n\n const childrenRoute = this.childrenRoute(link, path);\n\n if(existingRoute.children){\n existingRoute.children.unshift(childrenRoute);\n } \n }\n\n private buildChildrenRoutebyLink(link:Link): Route[] {\n let childrenRouteArray: Route[] = [];\n const paramsArray = link.parametrosUrl?.split('/');\n \n if (!paramsArray?.length) {\n childrenRouteArray.push(this.childrenRoute(link));\n } else {\n childrenRouteArray = childrenRouteArray.concat(this.ifHaveParamsArray(paramsArray, link));\n }\n\n return childrenRouteArray;\n }\n\n private ifHaveParamsArray(paramsArray: string[], link: Link): Route[] {\n const routes = [];\n\n routes.push(this.childrenRoute(link, ''));\n\n const paramRoutes = paramsArray.map((_, i) => {\n const path = this.getPathByNumber(link.parametrosUrl, i + 1);\n return this.childrenRoute(link, path);\n });\n\n routes.push(...paramRoutes);\n\n return routes.reverse();\n }\n\n private childrenRoute(link: Link, path = ''): Route {\n return {\n path, component: FormComponent,\n data: {\n idAreaSistema: link.idAreaSistema,\n nombreComponenteAnonimo: link.nombreComponenteAnonimo,\n idsTipoContenidos: link.idsTipoContenidos?.split(',')\n }\n };\n }\n\n private getPathByNumber(originPath: string, index: number): string {\n return originPath.split(\"/\").slice(0, index).join(\"/\");\n }\n\n}\n","import { Theme } from \"../theme\";\r\n\r\nexport const townCenterTheme: Theme = {\r\n name: 'town-center',\r\n properties: { \r\n '--primary': '#1F4381',\r\n '--primary2': '#2D6A8E',\r\n '--primary3': '#A8E1EF',\r\n\r\n '--brand-color': '#1F4381',\r\n '--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#AAC9FF',\r\n '--variant-color2': '#E0ECFF',\r\n '--variant-color3': '#CCDFFF',\r\n '--variant-color4': '#234A8D',\r\n '--variant-color5': '#C2DCEC',\r\n '--variant-color6': '#E6F4FC',\r\n '--variant-color7': '#7CC3D4',\r\n '--variant-color8': '#CDFCFF',\r\n '--variant-color9': '#FF2D91',\r\n '--variant-color10': '#87DAEE',\r\n '--variant-color11': '#32739A',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#1F438180',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n\r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n \r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#1F4381',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/town-center/pwa/TownCenter-512x512.png',\r\n '--company-icon': 'url(assets/images/logos/townCenter.png)',\r\n '--company-image': 'url(assets/images/town-center/logo.svg)',\r\n // '--background-img':'url(assets/images/town-center/tow-center-background.svg)',\r\n '--background-color': '#F5F9FF'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const hospitalPaitillaTheme: Theme = {\r\n name: 'hospital-paitilla',\r\n properties: {\r\n '--primary': '#009BDF',\r\n '--primary2': '#185A7D',\r\n '--primary3': '#64ECF4',\r\n\r\n '--brand-color': '#1F4381',\r\n '--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#7DD7FF',\r\n '--variant-color2': '#D6F2FF',\r\n '--variant-color3': '#B4E8FF',\r\n '--variant-color4': '#18A2DF',\r\n '--variant-color5': '#C5DAE4',\r\n '--variant-color6': '#E8F3F9',\r\n '--variant-color7': '#55CAD1',\r\n '--variant-color8': '#CDFCFF',\r\n '--variant-color9': '#FF2D91',\r\n '--variant-color10': '#60E3EB',\r\n '--variant-color11': '#1D6286',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF80',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/hospital-paitilla/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/hospital-paitilla/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/hospital-paitilla/paitilla-background.svg)',\r\n '--background-color': '#F3FBFF'\r\n }\r\n};","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { WorkflowService } from '../services/workflow.service';\r\nimport { STORAGE } from '../services/app-storage.service';\r\nimport { MedicalOrderWorkflowState } from 'src/app/shared/models/workflow/states/medical-order-workflow-state.model';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Injectable()\r\nexport class OidcWorkflowInterceptor implements HttpInterceptor {\r\n\r\n constructor(private workflowService: WorkflowService, @Inject(PLATFORM_ID) private platformId: Object) { }\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n \r\n let request2: HttpRequest = request.clone();\r\n\r\n if(isPlatformBrowser(this.platformId)) {\r\n const workflowType: string = this.workflowService.getWorkflowTypeActive();\r\n if (workflowType == STORAGE.MEDICAL_ORDER_WORKFLOW_STATE || workflowType == STORAGE.GROWTH_CURVES_WORKFLOW_STATE) {\r\n this.procesarMedicalOrderWorklow(request2);\r\n }\r\n }\r\n\r\n return next.handle(request2);\r\n }\r\n\r\n private procesarMedicalOrderWorklow(request: HttpRequest) {\r\n if (request.url.includes('api/authentication/oidc')) {\r\n const workflowState: MedicalOrderWorkflowState = this.workflowService.getWorkflowDataState();\r\n const idVerificacionSolicitudPorVerificar = workflowState.getIdVerificacion();\r\n request.body.idVerificacionSolicitudPorVerificar = idVerificacionSolicitudPorVerificar;\r\n }\r\n }\r\n}\r\n","import { Theme } from \"../theme\";\r\n\r\nexport const pacificaSaludPhrTheme: Theme = {\r\n name: 'pacifica-salud-phr',\r\n properties: {\r\n '--primary': '#062a5e',\r\n // '--primary2': '#185A7D',\r\n // '--primary3': '#64ECF4',\r\n\r\n // '--brand-color': '#1F4381',\r\n // '--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#A3C8FF',\r\n '--variant-color2': '#DFECFE',\r\n '--variant-color3': '#C8DEFF',\r\n '--variant-color4': '#0A326B',\r\n // '--variant-color5': '#C5DAE4',\r\n // '--variant-color6': '#E8F3F9',\r\n // '--variant-color7': '#55CAD1',\r\n // '--variant-color8': '#CDFCFF',\r\n // '--variant-color9': '#FF2D91',\r\n // '--variant-color10': '#60E3EB',\r\n // '--variant-color11': '#1D6286',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#062A5E',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#062a5e',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/pacifica-salud-phr/logo-pacifica-salud-phr.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/pacifica-salud-phr/logo-paitilla.png)',\r\n '--background-img':'url(assets/images/pacifica-salud-phr/paitilla-background.svg)',\r\n '--background-color': '#F4F9FF'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const hsantafePhrTheme: Theme = {\r\n name: 'hsantafe-phr',\r\n properties: {\r\n '--primary': '#00816D',\r\n '--primary2': '#FF8065',\r\n '--primary3': '#7474C1',\r\n\r\n // '--brand-color': '#7474C1',\r\n // '--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#C5FBB2',\r\n '--variant-color2': '#9DFFEF',\r\n '--variant-color3': '#00F9D1',\r\n '--variant-color4': '#008A74',\r\n '--variant-color5': '#FFCBC0',\r\n '--variant-color6': '#FFEEEB',\r\n '--variant-color7': '#6363A7',\r\n '--variant-color8': '#F2F2FF',\r\n // '--variant-color9': '#FF2D91',\r\n '--variant-color10': '#CDCDFF',\r\n '--variant-color11': '#FF8B72',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#00816D',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C5FBB2',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/hsantafe-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/hsantafe-phr/logo-hsantafe-phr.svg)',\r\n // '--background-img':'url(assets/images/hsantafe-phr/paitilla-background.svg)',\r\n '--background-color': '#FCFAF7'\r\n }\r\n};","import { ErrorHandler, Injectable } from '@angular/core';\r\nimport { MessageBusService, ServiceErrorMessage } from '../services/message-bus.service';\r\nimport { LogService } from '../services/log.service';\r\n\r\n@Injectable()\r\nexport class GlobalErrorHandler implements ErrorHandler {\r\n\r\n constructor(\r\n private messageBusService: MessageBusService,\r\n private logService: LogService\r\n ){\r\n }\r\n\r\n handleError(error: any): void {\r\n\r\n console.error('GlobalErrorHandler', error);\r\n\r\n this.logService.logError(error);\r\n \r\n var message = new ServiceErrorMessage(error || 'Error desconocido', error);\r\n this.messageBusService.serviceError(message);\r\n }\r\n}","import { Theme } from \"../theme\";\r\n\r\nexport const chpanamericanoPhrTheme: Theme = {\r\n name: 'chpanamericano-phr',\r\n properties: {\r\n '--primary': '#002F87',\r\n '--primary2': '#0082CA',\r\n // '--primary3': '#64ECF4',\r\n\r\n // '--brand-color': '#1F4381',\r\n // '--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#A6C5FF',\r\n '--variant-color2': '#E1ECFF',\r\n '--variant-color3': '#CADCFF',\r\n '--variant-color4': '#003597',\r\n '--variant-color5': '#A0DDFF',\r\n '--variant-color6': '#E0F4FF',\r\n '--variant-color7': '#F3F8FB',\r\n // '--variant-color8': '#CDFCFF',\r\n '--variant-color9': '#FF2D91',\r\n // '--variant-color10': '#60E3EB',\r\n '--variant-color11': '#008AD7',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/chpanamericano-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/chpanamericano-phr/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/chpanamericano-phr/paitilla-background.svg)',\r\n '--background-color': '#F3F8FB'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const chsfPhrTheme: Theme = {\r\n name: 'chsf-phr',\r\n properties: {\r\n '--primary': '#003A5D',\r\n '--primary2': '#636569',\r\n '--primary3': '#F4F4F4',\r\n\r\n // '--brand-color': '#1F4381',\r\n // '--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#82B6EC',\r\n // '--variant-color2': '#D6F2FF',\r\n // '--variant-color3': '#B4E8FF',\r\n '--variant-color4': '#00446D',\r\n // '--variant-color5': '#C5DAE4',\r\n // '--variant-color6': '#E8F3F9',\r\n // '--variant-color7': '#55CAD1',\r\n // '--variant-color8': '#CDFCFF',\r\n // '--variant-color9': '#FF2D91',\r\n '--variant-color10': '#ECECEC',\r\n '--variant-color11': '#6C6E73',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF80',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/chsf-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/chsf-phr/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/chsf-phr/paitilla-background.svg)',\r\n '--background-color': '#F9F9F9'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const thepanamaclinicPhrTheme: Theme = {\r\n name: 'thepanamaclinic-phr',\r\n properties: {\r\n '--primary': '#FF7900',\r\n '--primary2': '#4AADC6',\r\n '--primary3': '#1080B5',\r\n '--primary4': '#898A8D', //Este color es nuevo para este PHR.\r\n\r\n //'--brand-color': '#1F4381',\r\n //'--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#50C2DE',\r\n //'--variant-color2': '#D6F2FF',\r\n //'--variant-color3': '#B4E8FF',\r\n '--variant-color4': '#FD881F',\r\n //'--variant-color5': '#C5DAE4',\r\n //'--variant-color6': '#E8F3F9',\r\n //'--variant-color7': '#55CAD1',\r\n //'--variant-color8': '#CDFCFF',\r\n //'--variant-color9': '#FF2D91',\r\n '--variant-color10': '#1185BC',\r\n '--variant-color11': '#4FB5CF',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF80',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/thepanamaclinic-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/thepanamaclinic-phr/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/thepanamaclinic-phr/paitilla-background.svg)',\r\n '--background-color': '#F9F9F9'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const cmcaribePhrTheme: Theme = {\r\n name: 'cmcaribe-phr',\r\n properties: {\r\n '--primary': '#008CA4',\r\n '--primary2': '#023047',\r\n //'--primary3': '#64ECF4',\r\n\r\n //'--brand-color': '#1F4381',\r\n //'--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#00C3E5',\r\n //'--variant-color2': '#D6F2FF',\r\n //'--variant-color3': '#B4E8FF',\r\n '--variant-color4': '#0095AF',\r\n //'--variant-color5': '#C5DAE4',\r\n //'--variant-color6': '#E8F3F9',\r\n //'--variant-color7': '#55CAD1',\r\n //'--variant-color8': '#CDFCFF',\r\n //'--variant-color9': '#FF2D91',\r\n //'--variant-color10': '#60E3EB',\r\n '--variant-color11': '#033954',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF80',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/cmcaribe-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/cmcaribe-phr/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/cmcaribe-phr/paitilla-background.svg)',\r\n '--background-color': '#F9F9F9'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const hchiriquiPhrTheme: Theme = {\r\n name: 'hchiriqui-phr',\r\n properties: {\r\n '--primary': '#3871BC',\r\n '--primary2': '#294A74',\r\n //'--primary3': '#64ECF4',\r\n\r\n //'--brand-color': '#1F4381',\r\n //'--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#82B6EC',\r\n //'--variant-color2': '#D6F2FF',\r\n //'--variant-color3': '#B4E8FF',\r\n '--variant-color4': '#3D7ACB',\r\n //'--variant-color5': '#C5DAE4',\r\n //'--variant-color6': '#E8F3F9',\r\n //'--variant-color7': '#55CAD1',\r\n //'--variant-color8': '#CDFCFF',\r\n //'--variant-color9': '#FF2D91',\r\n //'--variant-color10': '#60E3EB',\r\n '--variant-color11': '#305687',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF80',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/hchiriqui-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/hchiriqui-phr/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/hchiriqui-phr/paitilla-background.svg)',\r\n '--background-color': '#F9F9F9'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const cmpaitillaPhrTheme: Theme = {\r\n name: 'cmpaitilla-phr',\r\n properties: {\r\n '--primary': '#1987B7',\r\n '--primary2': '#0A4F8B',\r\n '--primary3': '#0A2C55',\r\n '--primary4': '#E2F3FD',\r\n\r\n //'--brand-color': '#1F4381',\r\n //'--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#7BCEFF',\r\n //'--variant-color2': '#D6F2FF',\r\n //'--variant-color3': '#B4E8FF',\r\n '--variant-color4': '#198DC0',\r\n //'--variant-color5': '#C5DAE4',\r\n //'--variant-color6': '#E8F3F9',\r\n //'--variant-color7': '#55CAD1',\r\n //'--variant-color8': '#CDFCFF',\r\n //'--variant-color9': '#FF2D91',\r\n '--variant-color10': '#0C3363',\r\n '--variant-color11': '#0C589A',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF80',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/cmpaitilla-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/cmpaitilla-phr/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/cmpaitilla-phr/paitilla-background.svg)',\r\n '--background-color': '#F3F8FB'\r\n }\r\n};","import { Theme } from \"../theme\";\r\n\r\nexport const hospitalNacionalPhrTheme: Theme = {\r\n name: 'hospital-nacional-phr',\r\n properties: {\r\n '--primary': '#FE6100',\r\n '--primary2': '#005941',\r\n //'--primary3': '#64ECF4',\r\n\r\n '--brand-color': '#1F4381',\r\n '--brand-color2': '#1F4381',\r\n \r\n '--variant-color': '#82D0BB',\r\n //'--variant-color2': '#D6F2FF',\r\n //'--variant-color3': '#B4E8FF',\r\n '--variant-color4': '#FF7119',\r\n //'--variant-color5': '#C5DAE4',\r\n //'--variant-color6': '#E8F3F9',\r\n //'--variant-color7': '#55CAD1',\r\n //'--variant-color8': '#CDFCFF',\r\n //'--variant-color9': '#FF2D91',\r\n //'--variant-color10': '#60E3EB',\r\n '--variant-color11': '#00503B',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#009BDF80',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#404040',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n \r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons',\r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish',\r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n \r\n '--grey': '#404040',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692', \r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#C8C8C8',\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#009BDF',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/hospital-nacional-phr/logo-paitilla.png',\r\n '--company-icon': 'url(assets/images/logos/paitilla-round.png)',\r\n '--company-image': 'url(assets/images/hospital-nacional-phr/logo-paitilla.png)',\r\n // '--background-img':'url(assets/images/hospital-nacional-phr/paitilla-background.svg)',\r\n '--background-color': '#F9F9F9'\r\n }\r\n};","import { BrowserModule } from '@angular/platform-browser';\r\nimport { NgModule, CUSTOM_ELEMENTS_SCHEMA, APP_INITIALIZER, LOCALE_ID, PLATFORM_ID, ErrorHandler } from '@angular/core';\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { AppComponent } from './app.component';\r\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { CoreModule } from './core/core.module';\r\nimport { SharedModule } from './shared/shared.module';\r\nimport { ErrorInterceptor } from './core/interceptors/error.interceptor';\r\nimport { L10nIntlModule, L10nRoutingModule, L10nTranslationModule, L10nValidationModule } from 'angular-l10n';\r\nimport { AppStorage, HttpTranslationLoader, l10nConfig, LocaleValidation } from './core/l10n-config';\r\nimport { appInitializer } from './core/helpers/app.initializer';\r\nimport { BaseService } from './core/services/base.service';\r\nimport { LoadingInterceptor } from './core/interceptors/loading.interceptor';\r\nimport { suraTheme } from 'src/themes/sura/sura';\r\nimport { cliniwebTheme } from 'src/themes/cliniweb/cliniweb';\r\nimport { THEMES } from 'src/themes/theme';\r\nimport { PrivacyPoliciesModule } from './modules/privacy-policies/privacy-policies.module';\r\nimport { MatPaginatorIntl } from '@angular/material/paginator';\r\nimport { MatPaginatorI18nService } from './core/services/mat-paginator-i18n.service';\r\nimport { mapfrePanamaTheme } from 'src/themes/mapfre-panama/mapfre-panama';\r\nimport { mapfreGuatemalaTheme } from 'src/themes/mapfre-guatemala/mapfre-guatemala';\r\nimport { mapfrePanamaAsistenciaTheme } from 'src/themes/mapfre-panama-asistencia/mapfre-panama-asistencia';\r\nimport { RouteLoaderService } from './core/services/route-loader.service';\r\nimport { MessageBusService } from './core/services/message-bus.service';\r\nimport { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';\r\nimport { MAT_MOMENT_DATE_FORMATS, MomentDateAdapter } from '@angular/material-moment-adapter';\r\nimport { townCenterTheme } from 'src/themes/town-center/town-center';\r\nimport { hospitalPaitillaTheme } from 'src/themes/hospital-paitilla/hospital-paitilla';\r\nimport { ServiceWorkerModule } from '@angular/service-worker';\r\nimport localeEsES from '@angular/common/locales/es';\r\nimport localeEnUS from '@angular/common/locales/en';\r\nimport { registerLocaleData } from '@angular/common';\r\nimport { TerritorialDivisionsService } from './core/services/territorial-divisions.service';\r\nimport { OidcWorkflowInterceptor } from './core/interceptors/oidc-workflow.interceptor';\r\nimport { pacificaSaludPhrTheme } from 'src/themes/pacifica-salud-phr/pacifica-salud-phr';\r\nimport { hsantafePhrTheme } from 'src/themes/hsantafe-phr/hsantafe-phr';\r\nimport { GlobalErrorHandler } from './core/handlers/global-error.handler';\r\nimport { chpanamericanoPhrTheme } from 'src/themes/chpanamericano-phr/chpanamericano-phr';\r\nimport { chsfPhrTheme } from 'src/themes/chsf-phr/chsf-phr';\r\nimport { Router } from '@angular/router';\r\nimport { AppInitializationService } from './core/services/app-initializer.service';\r\nimport { thepanamaclinicPhrTheme } from 'src/themes/thepanamaclinic-phr/thepanamaclinic-phr';\r\nimport { cmcaribePhrTheme } from 'src/themes/cmcaribe-phr/cmcaribe-phr';\r\nimport { hchiriquiPhrTheme } from 'src/themes/hchiriqui-phr/hchiriqui-phr';\r\nimport { cmpaitillaPhrTheme } from 'src/themes/cmpaitilla-phr/cmpaitilla-phr';\r\nimport { hospitalNacionalPhrTheme } from 'src/themes/hospital-nacional-phr/hospital-nacional-phr';\r\n\r\nregisterLocaleData(localeEsES, 'es');\r\nregisterLocaleData(localeEsES, 'es-ES');\r\nregisterLocaleData(localeEnUS, 'en-US');\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n ],\r\n imports: [\r\n BrowserModule.withServerTransition({ appId: 'serverApp' }),\r\n AppRoutingModule,\r\n HttpClientModule,\r\n BrowserAnimationsModule,\r\n FlexLayoutModule,\r\n CoreModule,\r\n SharedModule,\r\n L10nTranslationModule.forRoot(\r\n l10nConfig,\r\n {\r\n storage: AppStorage,\r\n translationLoader: HttpTranslationLoader\r\n }\r\n ),\r\n L10nIntlModule,\r\n L10nValidationModule.forRoot({ validation: LocaleValidation }),\r\n L10nRoutingModule.forRoot(),\r\n ServiceWorkerModule.register(\"ngsw-worker.js\", {enabled: true})\r\n ],\r\n providers: [\r\n { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },\r\n { provide: HTTP_INTERCEPTORS, useClass: LoadingInterceptor, multi: true },\r\n { provide: HTTP_INTERCEPTORS, useClass: OidcWorkflowInterceptor, multi: true },\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: appInitializer,\r\n deps: [\r\n BaseService,\r\n RouteLoaderService,\r\n MessageBusService,\r\n TerritorialDivisionsService,\r\n Router,\r\n PLATFORM_ID,\r\n AppInitializationService\r\n ],\r\n multi: true\r\n },\r\n {\r\n provide: THEMES,\r\n useValue: [\r\n cliniwebTheme,\r\n suraTheme,\r\n cliniwebTheme,\r\n mapfrePanamaTheme, \r\n mapfreGuatemalaTheme, \r\n mapfrePanamaAsistenciaTheme,\r\n townCenterTheme,\r\n hospitalPaitillaTheme,\r\n pacificaSaludPhrTheme,\r\n hsantafePhrTheme,\r\n chpanamericanoPhrTheme,\r\n chsfPhrTheme,\r\n thepanamaclinicPhrTheme,\r\n cmcaribePhrTheme,\r\n hchiriquiPhrTheme,\r\n cmpaitillaPhrTheme,\r\n hospitalNacionalPhrTheme\r\n ]\r\n },\r\n {\r\n provide: MatPaginatorIntl,\r\n useClass: MatPaginatorI18nService,\r\n },\r\n {provide: MAT_DATE_LOCALE, useValue: 'es-ES'},\r\n {provide: LOCALE_ID, useValue: 'es' },\r\n {provide: LOCALE_ID, useValue: 'es-ES' },\r\n {provide: LOCALE_ID, useValue: 'en-US' },\r\n {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]},\r\n {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS},\r\n MessageBusService,\r\n { provide: ErrorHandler, useClass: GlobalErrorHandler }\r\n ],\r\n bootstrap: [AppComponent],\r\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ]\r\n})\r\nexport class AppModule { }","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nfunction bootstrap() {\n platformBrowserDynamic().bootstrapModule(AppModule)\n .catch(err => console.error(err));\n};\n\n\nfunction ensureUrlIsString(url: any): string {\n if (typeof url === 'string') {\n return url;\n } else {\n console.error('URL is not a string:', url);\n return '';\n }\n}\n\nif (document.readyState === 'complete') {\n bootstrap();\n} else {\n document.addEventListener('DOMContentLoaded', () => {\n // Intercepta y corrige la URL antes de pasarla a cualquier funciĆ³n que la manipule\n const url = ensureUrlIsString(window.location.href);\n const urlsSpinner = ['ordenes-medicas/landing'];\n\n if (urlsSpinner.some(x => url.includes(x))) {\n const mainSpinner = document.getElementsByClassName('main-spinner');\n if(mainSpinner.item(0)){\n mainSpinner.item(0)?.classList.add('loading');\n }\n }\n\n bootstrap();\n });\n}\n","import { Theme } from \"../theme\";\r\n\r\nexport const cliniwebTheme: Theme = {\r\n name: 'cliniweb',\r\n properties: {\r\n '--primary': '#3F0097',\r\n '--primary2': '#FF0C80',\r\n '--primary3': '#35F3FF',\r\n '--brand-color': '#3F0097',\r\n '--brand-color2': '#3C3C46',\r\n '--variant-color': '#D9BEFF',\r\n '--variant-color2': '#F0ECFF',\r\n '--variant-color3': '#E3DCFF',\r\n '--variant-color4': '#5100BC',\r\n '--variant-color5': '#FFBEDD',\r\n '--variant-color6': '#FFECF5',\r\n '--variant-color7': '#00CEDB',\r\n '--variant-color8': '#CDFCFF',\r\n '--variant-color9': '#FF2D91',\r\n '--variant-color10': '#35E6F1',\r\n '--variant-color11': '#FE208A',\r\n\r\n '--secondary-color': '#FF4C4C',\r\n '--secondary-color2': '#FFE8E6',\r\n '--secondary-color3': '#229F1D',\r\n '--secondary-color4': '#5FCC08',\r\n '--secondary-color5': '#E7FFD4',\r\n '--secondary-color6': '#1976D2',\r\n '--secondary-color7': '#DDF3FF',\r\n '--secondary-color8': '#FF9900',\r\n '--secondary-color9': '#FFEDD2',\r\n\r\n '--primary-50-transparent': '#3F009780',\r\n\r\n '--on-primary': '#fff',\r\n '--accent': '#ff6f00',\r\n '--on-accent': '#fff',\r\n '--accent1': '#a8e1ef33',\r\n '--error': '#FF4C4C',\r\n '--button-disabled': 'rgba(129, 137, 169, 0.27)',\r\n '--on-button-disabled': '#8189A9',\r\n '--hint-color': '#768692',\r\n '--dialog-text-color': '#53565A',\r\n '--nav-list-active': 'rgba(236, 240, 241, 0.5)',\r\n '--border-color-inactive': '#ECF0F1',\r\n '--box-shadow-color': '#ECF0F1',\r\n '--background-color-disabled': '#FBFBFB',\r\n '--font-icon': 'cliniweb-icons', \r\n '--font-primary': 'Mulish',\r\n '--font-secundary': 'Mulish', \r\n '--font-color': '#000',\r\n '--input-placeholder': '#9E9E9E',\r\n '--input-placeholder-show': '#505050',\r\n '--grey': '#53565A',\r\n '--grey2': '#DDDDDD',\r\n '--grey3': '#F2F2F2',\r\n '--grey4': '#C4C4C4',\r\n '--grey5': '#757575',\r\n '--grey6': '#636363',\r\n '--grey7': '#BEBEBE',\r\n '--grey8': '#9E9E9E',\r\n '--grey9': '#505050',\r\n '--grey10': '#53565A',\r\n '--grey11': '#768692',\r\n\r\n '--grayscale': '#1E1E1E',\r\n '--grayscale2': '#2D2D2D',\r\n '--grayscale3': '#3C3C3C',\r\n '--grayscale4': '#505050',\r\n '--grayscale5': '#646464',\r\n '--grayscale6': '#787878',\r\n '--grayscale7': '#8C8C8C',\r\n '--grayscale8': '#A0A0A0 ',\r\n '--grayscale9': '#B4B4B4',\r\n '--grayscale10': '#C8C8C8',\r\n '--grayscale11': '#DCDCDC',\r\n '--grayscale12': '#F0F0F0 ',\r\n\r\n '--public-profile-avatar-border-color': '#35F3FF',\r\n\r\n '--public-profile-title-color': '#505050',\r\n '--public-profile-btn-appointment-color': '#3F0097',\r\n '--public-profile-btn-pay-color': '#505050',\r\n '--favicon-big': '../../assets/images/cliniweb/pwa/Clinweb-512x512.png',\r\n '--company-icon': 'url(assets/images/cliniweb/cliniweb-favicon.png)',\r\n '--company-image': 'url(assets/images/cliniweb/logo-cliniweb-phr.svg)',\r\n '--background-img':'url(assets/images/fondo-cliniweb-1.svg)',\r\n '--background-color': '#F8F6FF'\r\n }\r\n};","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const THEMES = new InjectionToken('THEMES');\r\n\r\nexport interface Theme {\r\n name:string;\r\n properties: any;\r\n}","var map = {\n\t\"./af\": 8685,\n\t\"./af.js\": 8685,\n\t\"./ar\": 254,\n\t\"./ar-dz\": 4312,\n\t\"./ar-dz.js\": 4312,\n\t\"./ar-kw\": 2614,\n\t\"./ar-kw.js\": 2614,\n\t\"./ar-ly\": 8630,\n\t\"./ar-ly.js\": 8630,\n\t\"./ar-ma\": 8674,\n\t\"./ar-ma.js\": 8674,\n\t\"./ar-sa\": 9032,\n\t\"./ar-sa.js\": 9032,\n\t\"./ar-tn\": 4730,\n\t\"./ar-tn.js\": 4730,\n\t\"./ar.js\": 254,\n\t\"./az\": 3052,\n\t\"./az.js\": 3052,\n\t\"./be\": 150,\n\t\"./be.js\": 150,\n\t\"./bg\": 3069,\n\t\"./bg.js\": 3069,\n\t\"./bm\": 3466,\n\t\"./bm.js\": 3466,\n\t\"./bn\": 8516,\n\t\"./bn-bd\": 557,\n\t\"./bn-bd.js\": 557,\n\t\"./bn.js\": 8516,\n\t\"./bo\": 6273,\n\t\"./bo.js\": 6273,\n\t\"./br\": 9588,\n\t\"./br.js\": 9588,\n\t\"./bs\": 9815,\n\t\"./bs.js\": 9815,\n\t\"./ca\": 3331,\n\t\"./ca.js\": 3331,\n\t\"./cs\": 1320,\n\t\"./cs.js\": 1320,\n\t\"./cv\": 2219,\n\t\"./cv.js\": 2219,\n\t\"./cy\": 8266,\n\t\"./cy.js\": 8266,\n\t\"./da\": 6427,\n\t\"./da.js\": 6427,\n\t\"./de\": 7435,\n\t\"./de-at\": 2871,\n\t\"./de-at.js\": 2871,\n\t\"./de-ch\": 2994,\n\t\"./de-ch.js\": 2994,\n\t\"./de.js\": 7435,\n\t\"./dv\": 2357,\n\t\"./dv.js\": 2357,\n\t\"./el\": 5649,\n\t\"./el.js\": 5649,\n\t\"./en-au\": 9961,\n\t\"./en-au.js\": 9961,\n\t\"./en-ca\": 9878,\n\t\"./en-ca.js\": 9878,\n\t\"./en-gb\": 3924,\n\t\"./en-gb.js\": 3924,\n\t\"./en-ie\": 864,\n\t\"./en-ie.js\": 864,\n\t\"./en-il\": 1579,\n\t\"./en-il.js\": 1579,\n\t\"./en-in\": 940,\n\t\"./en-in.js\": 940,\n\t\"./en-nz\": 6181,\n\t\"./en-nz.js\": 6181,\n\t\"./en-sg\": 4301,\n\t\"./en-sg.js\": 4301,\n\t\"./eo\": 5291,\n\t\"./eo.js\": 5291,\n\t\"./es\": 4529,\n\t\"./es-do\": 3764,\n\t\"./es-do.js\": 3764,\n\t\"./es-mx\": 2584,\n\t\"./es-mx.js\": 2584,\n\t\"./es-us\": 3425,\n\t\"./es-us.js\": 3425,\n\t\"./es.js\": 4529,\n\t\"./et\": 5203,\n\t\"./et.js\": 5203,\n\t\"./eu\": 678,\n\t\"./eu.js\": 678,\n\t\"./fa\": 4826,\n\t\"./fa.js\": 4826,\n\t\"./fi\": 6262,\n\t\"./fi.js\": 6262,\n\t\"./fil\": 2521,\n\t\"./fil.js\": 2521,\n\t\"./fo\": 4555,\n\t\"./fo.js\": 4555,\n\t\"./fr\": 3131,\n\t\"./fr-ca\": 8239,\n\t\"./fr-ca.js\": 8239,\n\t\"./fr-ch\": 1702,\n\t\"./fr-ch.js\": 1702,\n\t\"./fr.js\": 3131,\n\t\"./fy\": 267,\n\t\"./fy.js\": 267,\n\t\"./ga\": 3821,\n\t\"./ga.js\": 3821,\n\t\"./gd\": 1753,\n\t\"./gd.js\": 1753,\n\t\"./gl\": 4074,\n\t\"./gl.js\": 4074,\n\t\"./gom-deva\": 2762,\n\t\"./gom-deva.js\": 2762,\n\t\"./gom-latn\": 5969,\n\t\"./gom-latn.js\": 5969,\n\t\"./gu\": 2809,\n\t\"./gu.js\": 2809,\n\t\"./he\": 5402,\n\t\"./he.js\": 5402,\n\t\"./hi\": 315,\n\t\"./hi.js\": 315,\n\t\"./hr\": 410,\n\t\"./hr.js\": 410,\n\t\"./hu\": 8288,\n\t\"./hu.js\": 8288,\n\t\"./hy-am\": 8999,\n\t\"./hy-am.js\": 8999,\n\t\"./id\": 1334,\n\t\"./id.js\": 1334,\n\t\"./is\": 6959,\n\t\"./is.js\": 6959,\n\t\"./it\": 4864,\n\t\"./it-ch\": 1124,\n\t\"./it-ch.js\": 1124,\n\t\"./it.js\": 4864,\n\t\"./ja\": 6141,\n\t\"./ja.js\": 6141,\n\t\"./jv\": 9187,\n\t\"./jv.js\": 9187,\n\t\"./ka\": 2136,\n\t\"./ka.js\": 2136,\n\t\"./kk\": 4332,\n\t\"./kk.js\": 4332,\n\t\"./km\": 8607,\n\t\"./km.js\": 8607,\n\t\"./kn\": 4305,\n\t\"./kn.js\": 4305,\n\t\"./ko\": 234,\n\t\"./ko.js\": 234,\n\t\"./ku\": 6003,\n\t\"./ku.js\": 6003,\n\t\"./ky\": 5061,\n\t\"./ky.js\": 5061,\n\t\"./lb\": 2786,\n\t\"./lb.js\": 2786,\n\t\"./lo\": 6183,\n\t\"./lo.js\": 6183,\n\t\"./lt\": 29,\n\t\"./lt.js\": 29,\n\t\"./lv\": 4169,\n\t\"./lv.js\": 4169,\n\t\"./me\": 8577,\n\t\"./me.js\": 8577,\n\t\"./mi\": 8177,\n\t\"./mi.js\": 8177,\n\t\"./mk\": 337,\n\t\"./mk.js\": 337,\n\t\"./ml\": 5260,\n\t\"./ml.js\": 5260,\n\t\"./mn\": 2325,\n\t\"./mn.js\": 2325,\n\t\"./mr\": 4695,\n\t\"./mr.js\": 4695,\n\t\"./ms\": 5334,\n\t\"./ms-my\": 7151,\n\t\"./ms-my.js\": 7151,\n\t\"./ms.js\": 5334,\n\t\"./mt\": 3570,\n\t\"./mt.js\": 3570,\n\t\"./my\": 7963,\n\t\"./my.js\": 7963,\n\t\"./nb\": 8028,\n\t\"./nb.js\": 8028,\n\t\"./ne\": 6638,\n\t\"./ne.js\": 6638,\n\t\"./nl\": 302,\n\t\"./nl-be\": 6782,\n\t\"./nl-be.js\": 6782,\n\t\"./nl.js\": 302,\n\t\"./nn\": 3501,\n\t\"./nn.js\": 3501,\n\t\"./oc-lnc\": 563,\n\t\"./oc-lnc.js\": 563,\n\t\"./pa-in\": 869,\n\t\"./pa-in.js\": 869,\n\t\"./pl\": 5302,\n\t\"./pl.js\": 5302,\n\t\"./pt\": 9687,\n\t\"./pt-br\": 4884,\n\t\"./pt-br.js\": 4884,\n\t\"./pt.js\": 9687,\n\t\"./ro\": 9107,\n\t\"./ro.js\": 9107,\n\t\"./ru\": 3627,\n\t\"./ru.js\": 3627,\n\t\"./sd\": 355,\n\t\"./sd.js\": 355,\n\t\"./se\": 3427,\n\t\"./se.js\": 3427,\n\t\"./si\": 1848,\n\t\"./si.js\": 1848,\n\t\"./sk\": 4590,\n\t\"./sk.js\": 4590,\n\t\"./sl\": 184,\n\t\"./sl.js\": 184,\n\t\"./sq\": 6361,\n\t\"./sq.js\": 6361,\n\t\"./sr\": 8965,\n\t\"./sr-cyrl\": 1287,\n\t\"./sr-cyrl.js\": 1287,\n\t\"./sr.js\": 8965,\n\t\"./ss\": 5456,\n\t\"./ss.js\": 5456,\n\t\"./sv\": 451,\n\t\"./sv.js\": 451,\n\t\"./sw\": 7558,\n\t\"./sw.js\": 7558,\n\t\"./ta\": 2702,\n\t\"./ta.js\": 2702,\n\t\"./te\": 3693,\n\t\"./te.js\": 3693,\n\t\"./tet\": 1243,\n\t\"./tet.js\": 1243,\n\t\"./tg\": 2500,\n\t\"./tg.js\": 2500,\n\t\"./th\": 5768,\n\t\"./th.js\": 5768,\n\t\"./tk\": 7761,\n\t\"./tk.js\": 7761,\n\t\"./tl-ph\": 5780,\n\t\"./tl-ph.js\": 5780,\n\t\"./tlh\": 9590,\n\t\"./tlh.js\": 9590,\n\t\"./tr\": 3807,\n\t\"./tr.js\": 3807,\n\t\"./tzl\": 3857,\n\t\"./tzl.js\": 3857,\n\t\"./tzm\": 654,\n\t\"./tzm-latn\": 8806,\n\t\"./tzm-latn.js\": 8806,\n\t\"./tzm.js\": 654,\n\t\"./ug-cn\": 845,\n\t\"./ug-cn.js\": 845,\n\t\"./uk\": 9232,\n\t\"./uk.js\": 9232,\n\t\"./ur\": 7052,\n\t\"./ur.js\": 7052,\n\t\"./uz\": 7967,\n\t\"./uz-latn\": 2233,\n\t\"./uz-latn.js\": 2233,\n\t\"./uz.js\": 7967,\n\t\"./vi\": 8615,\n\t\"./vi.js\": 8615,\n\t\"./x-pseudo\": 2320,\n\t\"./x-pseudo.js\": 2320,\n\t\"./yo\": 1313,\n\t\"./yo.js\": 1313,\n\t\"./zh-cn\": 4490,\n\t\"./zh-cn.js\": 4490,\n\t\"./zh-hk\": 5910,\n\t\"./zh-hk.js\": 5910,\n\t\"./zh-mo\": 8262,\n\t\"./zh-mo.js\": 8262,\n\t\"./zh-tw\": 4223,\n\t\"./zh-tw.js\": 4223\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6700;","var map = {\n\t\"./chpanamericano-phr/theme.js\": [\n\t\t6679,\n\t\t\"chpanamericano-phr-theme-js\"\n\t],\n\t\"./chsf-phr/theme.js\": [\n\t\t1027,\n\t\t\"chsf-phr-theme-js\"\n\t],\n\t\"./cliniweb/theme.js\": [\n\t\t9557,\n\t\t\"cliniweb-theme-js\"\n\t],\n\t\"./cmcaribe-phr/theme.js\": [\n\t\t1455,\n\t\t\"cmcaribe-phr-theme-js\"\n\t],\n\t\"./cmpaitilla-phr/theme.js\": [\n\t\t9272,\n\t\t\"cmpaitilla-phr-theme-js\"\n\t],\n\t\"./hchiriqui-phr/theme.js\": [\n\t\t1371,\n\t\t\"hchiriqui-phr-theme-js\"\n\t],\n\t\"./hospital-nacional-phr/theme.js\": [\n\t\t9825,\n\t\t\"hospital-nacional-phr-theme-js\"\n\t],\n\t\"./hospital-paitilla/theme.js\": [\n\t\t2873,\n\t\t\"hospital-paitilla-theme-js\"\n\t],\n\t\"./hsantafe-phr/theme.js\": [\n\t\t7592,\n\t\t\"hsantafe-phr-theme-js\"\n\t],\n\t\"./mapfre-guatemala/theme.js\": [\n\t\t4673,\n\t\t\"mapfre-guatemala-theme-js\"\n\t],\n\t\"./mapfre-panama-asistencia/theme.js\": [\n\t\t422,\n\t\t\"mapfre-panama-asistencia-theme-js\"\n\t],\n\t\"./mapfre-panama/theme.js\": [\n\t\t8381,\n\t\t\"mapfre-panama-theme-js\"\n\t],\n\t\"./pacifica-salud-phr/theme.js\": [\n\t\t2029,\n\t\t\"pacifica-salud-phr-theme-js\"\n\t],\n\t\"./sura/theme.js\": [\n\t\t7783,\n\t\t\"sura-theme-js\"\n\t],\n\t\"./thepanamaclinic-phr/theme.js\": [\n\t\t5247,\n\t\t\"thepanamaclinic-phr-theme-js\"\n\t],\n\t\"./town-center/theme.js\": [\n\t\t3530,\n\t\t\"town-center-theme-js\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 5813;\nmodule.exports = webpackAsyncContext;"]}