{"version":3,"file":"main.e99b30e31670d844.js","mappings":"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AqC,sBAMZA,4DACSA,uCACJA,sCAAc,k1VCAnD6uG,GAAb,GAiLM,gCC/LF7uG,oDAaIA,kBACIA,gBAAMA,6BAAuCA,QACjDA,8BADUA,kGAINA,gBAA2BA,yCAASkwD,EAATza,OAASya,0BAAyBlwD,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,aCtHCqwG,GAAsB,MAuCjC3yG,YACUC,EACAk4C,EACA13C,EACAN,EACAsV,EACAtF,EACAmE,EACApE,EACkBwW,GACEza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,eAAgB,UAChB,eAAgB,UAChB,eAAgB,UAChB,eAAgB,UAChB,eAAgB,UAChB,eAAgB,UAChB,eAAgB,WAChB,eAAgB,UAChB,gBAAiB,UACjB,gBAAiB,UACjB,gBAAiB,WAEjB,uCAAwC,UAExC,+BAAgC,UAChC,yCAA0C,UAC1C,iCAAkC,UAClC,gBAAiB,uDACjB,iBAAkB,mDAClB,kBAAmB,oDACnB,mBAAmB,0CACnB,qBAAsB,2DCrFrB,MAAMoB,EAAS,YAAI+zH,KAAe,2BCFzC,OACA,YACA,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,gCACAjuF,EAEA,YAEAhB,kBACA,uBAEAA,YACAkvF,aACAlvF,2BCnSA,OACA,iCACA,KACA,+BAEA,uBACA,KACA,qBAEA,uBACA,KACA,qBAEA,2BACA,KACA,yBAEA,6BACA,KACA,2BAEA,4BACA,KACA,0BAEA,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,gCACA1gD,IAIA,kBACA,0BACAihF,MAGAvgC,0BACAA,UACAkvF","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","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","fe","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","Z","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","ae","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","K","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","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","ye","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","ce","appDate","getAppointmentRemainingTime","timeDiff","diffStr","inProgressState","xe","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","D","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","se","V","oe","_e","k","_f","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","G","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","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","M","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","Ye","Comentarios","ve","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","T","le","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","lt","idResponsableImpresion","it","yt","_g","_h","urlLogoEmpresa","htmlReporte","formatoHoja","jt","wt","_j","_k","vt","Pt","_l","_m","idContactoClinico","Kt","_o","_p","idHistoriaClinicaActualQR","mn","dn","dt","idHistoriaClinicaActualInicial","_q","_r","an","_s","fechaOrdenMedica","comentario","Gt","hn","_t","_u","summaryOrderSignComponent","licenciaProfesionalInfo","urlFirma","numeroOrden","categorias","obtenerCategoriasPorTiposolicitud","Oi","_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","be","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","Be","StateType","ViewUserComponent","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","pt","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","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","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","patientBirthday","PublicProfileToPublicProfileAvatarComponentModelConverter","enviar","datos","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","reloadPage","checkNextAppointmentAlert","selectCountryDialogOpened","setHeaderComponentName","toggleHeaderView","loadDirectoryTheme","setOverlayMaterial","setFavicon","setManifestUrl","setIframeModalActions","manageVirtualAttentionActions","manageSessionExpiredAction","manageServiceErrorAction","setDateAdapter","startNewAppointmentsListener","setCountryByUser","setZIndexInitialValue","isDesktopMac","googleMapsLoader","routeQueryParamsSubscribe","getDirectoryClassName","setThemeProperties","initAppointmentSignalR","hasJointGroup","IdUsuario","getRouteAnimationData","getContext","he","ie","Ae","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","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-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/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/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}\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 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 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 \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.get('day')?.setErrors(errors, { emitEvent });\n this.formulario.get('month')?.setErrors(errors, { emitEvent });\n this.formulario.get('year')?.setErrors(errors, { emitEvent });\n if (errors) {\n this.formulario.get('day')?.markAsTouched({ onlySelf: emitEvent });\n this.formulario.get('month')?.markAsTouched({ onlySelf: emitEvent });\n this.formulario.get('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 if (dateToValidate && new Date(dateToValidate) > new Date(1900, 1, 1)) {\r\n return true;\r\n } else {\r\n return false; \r\n } \r\n }\r\n\r\n static stringHasValue(stringToValidate?: string) : boolean {\r\n if (stringToValidate && stringToValidate != '9') {\r\n return true;\r\n } else {\r\n return false;\r\n }\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-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 this.stateData.setPatientEmail(data.emailPaciente);\r\n this.stateData.setPatientValid(data.isValid);\r\n this.stateData.setPosition(this.stateData.getPosition() + 1);\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\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 patientBirthday: [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 this.formulario.markAllAsTouched();\n \n if (this.formulario.invalid) return;\n\n const datos: { patientBirthday: string } = this.formulario.value;\n\n this.sending = true;\n this.formulario.disable();\n\n this.requestsToVerifyService.validate(datos.patientBirthday, 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: () => { this.formulario.enable(); this.sending = false; }\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('patientBirthday') ? this.formulario.get('patientBirthday') 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 { 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 HeaderCmpaitillaPhrComponent,\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 HeaderCmpaitillaPhrComponent,\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\tHeaderCmpaitillaPhrComponent,\n\tHeaderHchiriquiPhrComponent,\n\tHeaderCmcaribePhrComponent,\n\tHeaderThepanamaclinicPhrComponent,\n\tHeaderChsfPhrComponent,\n\tHeaderChpanamericanoPhrComponent,\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.71.00.1-ubo',\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","
\n
\n

Upsss

\n

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

\n \n
\n
\n \n
\n
\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 { Meta } from '@angular/platform-browser';\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';\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 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 meta: Meta,\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 }\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 }\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 { 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\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 ]\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-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;"]}