File

src/app/plugins/profile/components/profile-page/profile-page.component.ts

Implements

OnInit OnDestroy AfterViewInit

Metadata

Index

Properties
Methods

Constructor

constructor(courseCService: CsCourseService, cacheService: CacheService, resourceService: ResourceService, coursesService: CoursesService, toasterService: ToasterService, profileService: ProfileService, userService: UserService, configService: ConfigService, router: Router, utilService: UtilService, searchService: SearchService, playerService: PlayerService, activatedRoute: ActivatedRoute, orgDetailsService: OrgDetailsService, navigationhelperService: NavigationHelperService, certRegService: CertRegService, telemetryService: TelemetryService, layoutService: LayoutService, formService: FormService, certDownloadAsPdf: CertificateDownloadAsPdfService, connectionService: ConnectionService, CsCertificateService: CsCertificateService)
Parameters :
Name Type Optional
courseCService CsCourseService No
cacheService CacheService No
resourceService ResourceService No
coursesService CoursesService No
toasterService ToasterService No
profileService ProfileService No
userService UserService No
configService ConfigService No
router Router No
utilService UtilService No
searchService SearchService No
playerService PlayerService No
activatedRoute ActivatedRoute No
orgDetailsService OrgDetailsService No
navigationhelperService NavigationHelperService No
certRegService CertRegService No
telemetryService TelemetryService No
layoutService LayoutService No
formService FormService No
certDownloadAsPdf CertificateDownloadAsPdfService No
connectionService ConnectionService No
CsCertificateService CsCertificateService No

Methods

convertToString
convertToString(value)
Parameters :
Name Optional
value No
Returns : any
copyToClipboard
copyToClipboard(userName)
Parameters :
Name Optional
userName No
Returns : void
downloadCert
downloadCert(course)
Parameters :
Name Optional
course No
Returns : void
downloadOldAndRCCert
downloadOldAndRCCert(courseObj)
Parameters :
Name Optional
courseObj No
Returns : void
downloadPdfCertificate
downloadPdfCertificate(value)
Parameters :
Name Optional
value No
Returns : void
getContribution
getContribution()
Returns : void
Private getCustodianOrgUser
getCustodianOrgUser()
Returns : void
getLocationDetails
getLocationDetails(locations, type)
Parameters :
Name Optional
locations No
type No
Returns : any
getNavParams
getNavParams()
Returns : void
getOrgDetails
getOrgDetails()
Returns : void
getOtherCertificates
getOtherCertificates(userId, certType)

It will fetch certificates of user, other than courses

Parameters :
Name Optional Description
userId No

It will fetch certificates of user, other than courses

certType No
Returns : void
Private Async getPersonaConfig
getPersonaConfig(persona: string)
Parameters :
Name Type Optional
persona string No
Returns : unknown
getSelfDeclaredDetails
getSelfDeclaredDetails()
Returns : void
Private Async getSubPersonaConfig
getSubPersonaConfig(persona: string, userLocation: any)
Parameters :
Name Type Optional
persona string No
userLocation any No
Returns : Promise<string[]>
getTrainingAttended
getTrainingAttended()
Returns : void
Private getUserLocation
getUserLocation(profile: any)
Parameters :
Name Type Optional
profile any No
Returns : {}
goBack
goBack()
Returns : void
initLayout
initLayout()
Returns : void
navigate
navigate(url, formAction)
Parameters :
Name Optional
url No
formAction No
Returns : void
navigateToCourse
navigateToCourse(coursedata)
Parameters :
Name Optional Description
coursedata No
  • data of the course which user will click from the courses section
Returns : void
ngAfterViewInit
ngAfterViewInit()
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void
Public onLocationModalClose
onLocationModalClose(event)
Parameters :
Name Optional
event No
Returns : void
openContent
openContent(content)
Parameters :
Name Optional
content No
Returns : void
Public prepareVisits
prepareVisits(event)
Parameters :
Name Optional
event No
Returns : void
setInteractEventData
setInteractEventData()
Returns : void
setNonCustodianUserLocation
setNonCustodianUserLocation()
Returns : void
toggle
toggle(showMore)
Parameters :
Name Optional
showMore No
Returns : void
toggleCourse
toggleCourse(showMoreCourse, courseLimit)
Parameters :
Name Optional
showMoreCourse No
courseLimit No
Returns : void
toggleOtherCertific
toggleOtherCertific(showMore)
Parameters :
Name Optional
showMore No
Returns : void
triggerAutoScroll
triggerAutoScroll()
Returns : void
updateProfile
updateProfile(data)
Parameters :
Name Optional
data No
Returns : void

Properties

addRecoveryIdInteractEdata
Type : IInteractEventEdata
attendedTraining
Type : Array<object>
avatarConfig
Type : object
Default value : { size: this.configService.constants.SIZE.LARGE, view: this.configService.constants.VIEW.VERTICAL, isTitle:false }
Public certRegService
Type : CertRegService
Public configService
Type : ConfigService
contributions
Type : []
Default value : []
courseLimit
Default value : this.configService.appConfig.PROFILE.defaultViewMoreLimit
Public coursesService
Type : CoursesService
declarationDetails
Private Static Readonly DEFAULT_PERSONA_LOCATION_CONFIG_FORM_REQUEST
Type : object
Default value : { formType: 'profileConfig_v2', contentType: 'default', formAction: 'get' }
districtObj
downloadCertificateEData
Type : IInteractEventEdata
downloadOthersCertificateEData
Type : IInteractEventEdata
editEmailInteractEdata
Type : IInteractEventEdata
editMobileInteractEdata
Type : IInteractEventEdata
editProfileInteractEdata
Type : IInteractEventEdata
editRecoveryIdInteractEdata
Type : IInteractEventEdata
emailObj
Type : literal type
externalIds
Type : literal type
instance
Type : string
isConnected
Default value : true
isCustodianOrgUser
Default value : true
isDesktopApp
layoutConfiguration
Type : any
Public layoutService
Type : LayoutService
myFrameworkEditEdata
Type : IInteractEventEdata
Public navigationhelperService
Type : NavigationHelperService
nonCustodianUserLocation
Type : object
Default value : {}
orgDetails
Type : any
Default value : []
Public orgDetailsService
Type : OrgDetailsService
otherCertificateLimit
Default value : this.configService.appConfig.PROFILE.defaultViewMoreLimit
otherCertificates
Type : Array<object>
otherCertificatesCounts
Type : number
persona
Type : literal type
phoneObj
Type : literal type
profileModal
Decorators :
@ViewChild('profileModal')
Public profileService
Type : ProfileService
Public resourceService
Type : ResourceService
roles
Type : Array<string>
Public router
Type : Router
schoolObj
Type : literal type
scrollToId
Public searchService
Type : SearchService
selfDeclaredErrorTypes
Type : []
Default value : []
selfDeclaredInfo
Type : []
Default value : []
showContactPopup
Default value : false
showEdit
Default value : false
showEditUserDetailsPopup
Default value : false
showFullScreenLoader
Default value : false
showMoreCertificates
Default value : true
showMoreRoles
Default value : true
showMoreRolesLimit
Default value : this.configService.appConfig.PROFILE.defaultShowMoreLimit
showMoreTrainings
Default value : true
showRecoveryId
Default value : false
slickModal
Decorators :
@ViewChild('slickModal')
stateObj
submitTeacherDetailsInteractEdata
Type : IInteractEventEdata
subPersona
Type : string[]
Private Static Readonly SUPPORTED_PERSONA_LIST_FORM_REQUEST
Type : object
Default value : { formType: 'config', formAction: 'get', contentType: 'userType', component: 'portal' }
teacherObj
Type : literal type
telemetryImpression
Type : IImpressionEventInput
tenantInfo
Public toasterService
Type : ToasterService
totalContributions
Type : Number
udiseObj
Type : literal type
Public unsubscribe$
Default value : new Subject<void>()
updateTeacherDetailsInteractEdata
Type : IInteractEventEdata
userFrameWork
Type : any
userLocation
Type : literal type
userProfile
Type : any
Public userService
Type : UserService
userSubscription
Type : Subscription
Public utilService
Type : UtilService
import {ProfileService} from '../../services';
import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild, Inject } from '@angular/core';
import {
  CertRegService,
  CoursesService,
  OrgDetailsService,
  PlayerService,
  SearchService,
  UserService,
  FormService
} from '@sunbird/core';
import {
  ConfigService,
  IUserData, LayoutService,
  NavigationHelperService,
  ResourceService,
  ServerResponse,
  ToasterService,
  UtilService,
  ConnectionService
} from '@sunbird/shared';
import * as _ from 'lodash-es';
import {Subject, Subscription} from 'rxjs';
import {IImpressionEventInput, IInteractEventEdata, TelemetryService} from '@sunbird/telemetry';
import {ActivatedRoute, Router} from '@angular/router';
import { CacheService } from '../../../../modules/shared/services/cache-service/cache.service';
import {takeUntil} from 'rxjs/operators';
import { CertificateDownloadAsPdfService } from 'sb-svg2pdf-v13';
import { CsCourseService } from '@project-sunbird/client-services/services/course/interface';
import { FieldConfig, FieldConfigOption } from '@project-sunbird/common-form-elements-full';
import { CsCertificateService } from '@project-sunbird/client-services/services/certificate/interface';

@Component({
  templateUrl: './profile-page.component.html',
  styleUrls: ['./profile-page.component.scss'],
  providers: [CertificateDownloadAsPdfService]
})
export class ProfilePageComponent implements OnInit, OnDestroy, AfterViewInit {
  private static readonly SUPPORTED_PERSONA_LIST_FORM_REQUEST =
  { formType: 'config', formAction: 'get', contentType: 'userType', component: 'portal' };
  private static readonly DEFAULT_PERSONA_LOCATION_CONFIG_FORM_REQUEST =
  { formType: 'profileConfig_v2', contentType: 'default', formAction: 'get' };
  @ViewChild('profileModal') profileModal;
  @ViewChild('slickModal') slickModal;
  userProfile: any;
  contributions = [];
  totalContributions: Number;
  attendedTraining: Array<object>;
  roles: Array<string>;
  showMoreRoles = true;
  showMoreTrainings = true;
  showMoreCertificates = true;
  isCustodianOrgUser = true; // set to true to avoid showing icon before api return value
  showMoreRolesLimit = this.configService.appConfig.PROFILE.defaultShowMoreLimit;
  courseLimit = this.configService.appConfig.PROFILE.defaultViewMoreLimit;
  otherCertificateLimit = this.configService.appConfig.PROFILE.defaultViewMoreLimit;
  showEdit = false;
  userSubscription: Subscription;
  orgDetails: any = [];
  showContactPopup = false;
  showEditUserDetailsPopup = false;
  userFrameWork: any;
  telemetryImpression: IImpressionEventInput;
  myFrameworkEditEdata: IInteractEventEdata;
  editProfileInteractEdata: IInteractEventEdata;
  editMobileInteractEdata: IInteractEventEdata;
  editEmailInteractEdata: IInteractEventEdata;
  downloadCertificateEData: IInteractEventEdata;
  editRecoveryIdInteractEdata: IInteractEventEdata;
  addRecoveryIdInteractEdata: IInteractEventEdata;
  submitTeacherDetailsInteractEdata: IInteractEventEdata;
  updateTeacherDetailsInteractEdata: IInteractEventEdata;
  showRecoveryId = false;
  otherCertificates: Array<object>;
  otherCertificatesCounts: number;
  downloadOthersCertificateEData: IInteractEventEdata;
  udiseObj: { idType: string, provider: string, id: string };
  phoneObj: { idType: string, provider: string, id: string };
  emailObj: { idType: string, provider: string, id: string };
  teacherObj: { idType: string, provider: string, id: string };
  stateObj;
  districtObj;
  externalIds: {};
  schoolObj: { idType: string, provider: string, id: string };
  instance: string;
  layoutConfiguration: any;
  public unsubscribe$ = new Subject<void>();
  nonCustodianUserLocation: object = {};
  declarationDetails;
  tenantInfo;
  selfDeclaredInfo = [];
  selfDeclaredErrorTypes = [];
  scrollToId;
  isDesktopApp;
  userLocation: {};
  persona: {};
  subPersona: string[];
  isConnected = true;
  showFullScreenLoader = false;
  avatarConfig = {
    size: this.configService.constants.SIZE.LARGE,
    view: this.configService.constants.VIEW.VERTICAL,
    isTitle:false
  };

  constructor(@Inject('CS_COURSE_SERVICE') private courseCService: CsCourseService, private cacheService: CacheService,
  public resourceService: ResourceService, public coursesService: CoursesService,
    public toasterService: ToasterService, public profileService: ProfileService, public userService: UserService,
    public configService: ConfigService, public router: Router, public utilService: UtilService, public searchService: SearchService,
    private playerService: PlayerService, private activatedRoute: ActivatedRoute, public orgDetailsService: OrgDetailsService,
    public navigationhelperService: NavigationHelperService, public certRegService: CertRegService,
    private telemetryService: TelemetryService, public layoutService: LayoutService, private formService: FormService,
    private certDownloadAsPdf: CertificateDownloadAsPdfService, private connectionService: ConnectionService,
    @Inject('CS_CERTIFICATE_SERVICE') private CsCertificateService: CsCertificateService) {
    this.getNavParams();
  }

  getNavParams() {
    this.scrollToId = _.get(this.router.getCurrentNavigation(), 'extras.state.scrollToId');
  }

  ngOnInit() {
    this.isDesktopApp = this.utilService.isDesktopApp;

    this.activatedRoute.queryParams.subscribe((params) => {
      if (params['showEditUserDetailsPopup']) {
        this.showEditUserDetailsPopup = true;
      }
      });

    if (this.isDesktopApp) {
      this.connectionService.monitor()
      .pipe(takeUntil(this.unsubscribe$)).subscribe(isConnected => {
        this.isConnected = isConnected;
      });
    }
    this.initLayout();
    this.instance = _.upperFirst(_.toLower(this.resourceService.instance || 'SUNBIRD'));
    this.getCustodianOrgUser();
    this.userSubscription = this.userService.userData$.subscribe((user: IUserData) => {
      /* istanbul ignore else */
      this.showFullScreenLoader = false;
      if (user.userProfile) {
        this.userProfile = user.userProfile;
        const role: string = (!this.userProfile.profileUserType.type ||
          (this.userProfile.profileUserType.type && this.userProfile.profileUserType.type === 'OTHER')) ? '' : this.userProfile.profileUserType.type;
        this.userLocation = this.getUserLocation(this.userProfile);
        this.getPersonaConfig(role).then((val) => {
          this.persona = val;
        });
        this.getSubPersonaConfig(role.toLowerCase(), this.userLocation).then((val) => {
          this.subPersona = val;
        });
        this.userFrameWork = this.userProfile.framework ? _.cloneDeep(this.userProfile.framework) : {};
        this.getOrgDetails();
        this.getContribution();
        this.getOtherCertificates(_.get(this.userProfile, 'userId'), 'all');
        this.getTrainingAttended();
        this.setNonCustodianUserLocation();
        /* istanbul ignore else */
        if (_.get(this.userProfile, 'declarations') && this.userProfile.declarations.length > 0) {
          this.declarationDetails = _.get(this.userProfile, 'declarations')[0];
          if (this.declarationDetails.errorType) {
            this.selfDeclaredErrorTypes = this.declarationDetails.errorType.split(',');
          }
          this.getSelfDeclaredDetails();
        }
      }
    });
    this.setInteractEventData();
  }

  initLayout() {
    this.layoutConfiguration = this.layoutService.initlayoutConfig();
    this.layoutService.switchableLayout().pipe(takeUntil(this.unsubscribe$)).subscribe(layoutConfig => {
      /* istanbul ignore else */
      if (layoutConfig != null) {
        this.layoutConfiguration = layoutConfig.layout;
      }
    });
  }

  setNonCustodianUserLocation() {
    const subOrgs = _.filter(this.userProfile.organisations, (org) => {
      /*istanbul ignore else */
      if (this.userProfile.rootOrgId !== org.organisationId) {
        return org;
      }
    });
    /*istanbul ignore else */
    if (!_.isEmpty(subOrgs)) {
      const sortedSubOrgs = _.reverse(_.sortBy(subOrgs, 'orgjoindate'));
      /*istanbul ignore else */
      if (!_.isEmpty(sortedSubOrgs[0]) && !_.isEmpty(sortedSubOrgs[0].locations)) {
        _.forEach(sortedSubOrgs[0].locations, (location) => {
          this.nonCustodianUserLocation[location.type] = location.name;
        });
      }
    }
  }

  getOrgDetails() {
    let orgList = [];
    this.roles = [];
    _.forEach(this.userProfile.organisations, (org, index) => {
      if (this.userProfile.rootOrgId !== org.organisationId) {
        if (org.locations && org.locations.length === 0) {
          if (this.userProfile.organisations[0].locationIds && this.userProfile.organisations[0].locations) {
            org.locationIds = this.userProfile.organisations[0].locationIds;
            org.locations = this.userProfile.organisations[0].locations;
          }
        }
        if (org.orgjoindate) {
          org.modifiedJoinDate = new Date(org.orgjoindate).getTime();
        }
        orgList.push(org);
      } else {
        if (org.locations && org.locations.length !== 0) {
          if (org.orgjoindate) {
            org.modifiedJoinDate = new Date(org.orgjoindate).getTime();
          }
          orgList.push(org);
        }
      }
    });
    let userRoles;
    if (_.get(this.userProfile, 'roles') && !_.isEmpty(this.userProfile.roles)) {
      userRoles = _.map(this.userProfile.roles, 'role');
    }
    _.forEach(userRoles, (value, key) => {
      if (value !== 'PUBLIC') {
        const roleName = _.find(this.userProfile.roleList, { id: value });
        if (roleName) {
          this.roles.push(roleName['name']);
        }
      }
    });
    this.roles = _.uniq(this.roles).sort();
    orgList = _.sortBy(orgList, ['modifiedJoinDate']);
    this.orgDetails = _.last(orgList);
  }

  convertToString(value) {
    return _.isArray(value) ? _.join(value, ', ') : undefined;
  }

  getLocationDetails(locations, type) {
    const location: any = _.find(locations, { type: type });
    return location ? location.name : false;
  }

  getContribution(): void {
    const { constantData, metaData, dynamicFields } = this.configService.appConfig.Course.otherCourse;
      const searchParams = {
        status: ['Live'],
        contentType: this.configService.appConfig.WORKSPACE.contentType,
        params: { lastUpdatedOn: 'desc' }
      };
      const inputParams = { params: this.configService.appConfig.PROFILE.contentApiQueryParams };
      this.searchService.searchContentByUserId(searchParams, inputParams).subscribe((data: ServerResponse) => {
        this.contributions = this.utilService.getDataForCard(data.result.content, constantData, dynamicFields, metaData);
        this.totalContributions = _.get(data, 'result.count') || 0;
      });
  }

  getTrainingAttended() {
    this.coursesService.enrolledCourseData$.pipe().subscribe(data => {
      this.attendedTraining = _.reverse(_.sortBy(data.enrolledCourses, val => {
        return _.isNumber(_.get(val, 'completedOn')) ? _.get(val, 'completedOn') : Date.parse(val.completedOn);
      })) || [];
    });
  }

/**
 * @param userId
 *It will fetch certificates of user, other than courses
 */
  getOtherCertificates(userId, certType) {
    this.otherCertificates = [];
    let requestBody = { userId: userId, schemaName: 'certificate' };
    if (this.otherCertificatesCounts) {
      requestBody['size'] = this.otherCertificatesCounts;
    }
    this.CsCertificateService.fetchCertificates(requestBody, {
      apiPath: '/learner/certreg/v2',
      apiPathLegacy: '/certreg/v1',
      rcApiPath: '/learner/rc/${schemaName}/v1',
    }).subscribe((_res) => {
      if (_res && _res?.certificates?.length > 0) {
        this.otherCertificates = _.get(_res, 'certificates');
        this.otherCertificatesCounts = (_.get(_res, 'certRegCount') ? _.get(_res, 'certRegCount') : 0) + (_.get(_res, 'rcCount') ? _.get(_res, 'rcCount') : 0);
      }
    }, (error) => {
      this.toasterService.error(this.resourceService.messages.emsg.m0005);
      console.log('Portal :: CSL : Fetch certificate CSL API failed ', error);
    });
  }

  downloadCert(course) {
    if (this.isDesktopApp && !this.isConnected) {
      this.toasterService.error(this.resourceService.messages.desktop.emsg.cannotAccessCertificate);
      return;
    }
    // Check for V2
    if (_.get(course, 'issuedCertificates.length')) {
      this.toasterService.success(_.get(this.resourceService, 'messages.smsg.certificateGettingDownloaded'));
      const certificateInfo = course.issuedCertificates[0];
      const courseName = course.courseName || _.get(course, 'issuedCertificates[0].name') || 'certificate';
      if (_.get(certificateInfo, 'type') === 'TrainingCertificate') {
        const courseObj = {
          id: certificateInfo.identifier,
          type: 'rc_certificate_registry',
          templateUrl: _.get(certificateInfo, 'templateUrl'),
          trainingName: courseName
        }
        this.downloadOldAndRCCert(courseObj);
      } else if (_.get(certificateInfo, 'identifier')) {
        this.courseCService.getSignedCourseCertificate(_.get(certificateInfo, 'identifier'))
          .pipe(takeUntil(this.unsubscribe$))
          .subscribe((resp) => {
            if (_.get(resp, 'printUri')) {
              this.certDownloadAsPdf.download(resp.printUri, null, courseName);
            } else if (_.get(course, 'certificates.length')) {
              this.downloadPdfCertificate(course.certificates[0]);
            } else {
              this.toasterService.error(this.resourceService.messages.emsg.m0076);
            }
          }, error => {
            this.downloadPdfCertificate(certificateInfo);
          });
      } else {
        this.downloadPdfCertificate(certificateInfo);
      }
    } else if (_.get(course, 'certificates.length')) { // For V1 - backward compatibility
      this.toasterService.success(_.get(this.resourceService, 'messages.smsg.certificateGettingDownloaded'));
      this.downloadPdfCertificate(course.certificates[0]);
    } else {
      this.toasterService.error(this.resourceService.messages.emsg.m0076);
    }
  }

  downloadOldAndRCCert(courseObj) {
    let requestBody = {
      certificateId: courseObj.id,
      schemaName: 'certificate',
      type: courseObj.type,
      templateUrl: courseObj.templateUrl
    };
    this.CsCertificateService.getCerificateDownloadURI(requestBody, {
      apiPath: '/learner/certreg/v2',
      apiPathLegacy: '/certreg/v1',
      rcApiPath: '/learner/rc/${schemaName}/v1',
    })
      .pipe(takeUntil(this.unsubscribe$))
      .subscribe((resp) => {
        if (_.get(resp, 'printUri')) {
          this.certDownloadAsPdf.download(resp.printUri, null, courseObj.trainingName);
        } else {
          this.toasterService.error(this.resourceService.messages.emsg.m0076);
        }
      }, error => {
        console.log('Portal :: CSL : Download certificate CSL API failed ', error);
      });
  }

  downloadPdfCertificate(value) {
    if (_.get(value, 'url')) {
      const request = {
        request: {
          pdfUrl: _.get(value, 'url')
        }
      };
      this.profileService.downloadCertificates(request).subscribe((apiResponse) => {
        const signedPdfUrl = _.get(apiResponse, 'result.signedUrl');
        if (signedPdfUrl) {
          window.open(signedPdfUrl, '_blank');
        } else {
          this.toasterService.error(this.resourceService.messages.emsg.m0076);
        }
      }, (err) => {
        this.toasterService.error(this.resourceService.messages.emsg.m0076);
      });
    } else {
      this.toasterService.error(this.resourceService.messages.emsg.m0076);
    }
  }

  toggle(showMore) {
    if (showMore === true) {
      this.showMoreRolesLimit = this.roles.length;
      this.showMoreRoles = false;
    } else {
      this.showMoreRoles = true;
      this.showMoreRolesLimit = this.configService.appConfig.PROFILE.defaultShowMoreLimit;
    }
  }

  toggleCourse(showMoreCourse, courseLimit) {
    if (showMoreCourse === true) {
      this.courseLimit = courseLimit;
      this.showMoreTrainings = false;
    } else {
      this.showMoreTrainings = true;
      this.courseLimit = 3;
    }
  }

  updateProfile(data) {
    this.profileService.updateProfile({ framework: data }).subscribe(res => {
      this.userProfile.framework = data;
      this.toasterService.success(this.resourceService.messages.smsg.m0046);
      this.profileModal && this.profileModal.deny();
      // this.showEdit = false;
    }, err => {
      // this.showEdit = false;
      this.toasterService.warning(this.resourceService.messages.emsg.m0012);
      this.profileModal && this.profileModal.deny();
      this.cacheService.set('showFrameWorkPopUp', 'installApp');
    });
  }

  openContent(content) {
    this.playerService.playContent(content.data.metaData);
  }

  public prepareVisits(event) {
    const inViewLogs = _.map(event, (content, index) => ({
      objid: content.metaData.courseId ? content.metaData.courseId : content.metaData.identifier,
      objtype: 'course', index: index,
      section: content.section,
    }));
    if (this.telemetryImpression) {
      this.telemetryImpression.edata.visits = inViewLogs;
      this.telemetryImpression.edata.subtype = 'pageexit';
      this.telemetryImpression = Object.assign({}, this.telemetryImpression);
    }
  }
  private getCustodianOrgUser() {
    this.orgDetailsService.getCustodianOrgDetails().subscribe(custodianOrg => {
      if (_.get(this.userService, 'userProfile.rootOrg.rootOrgId') === _.get(custodianOrg, 'result.response.value')) {
        this.isCustodianOrgUser = true;
      } else {
        this.isCustodianOrgUser = false;
      }
    });
  }

  goBack() {
    this.navigationhelperService.goBack();
  }

  setInteractEventData() {
    this.myFrameworkEditEdata = {
      id: 'profile-edit-framework',
      type: 'click',
      pageid: 'profile-read'
    };
    this.editProfileInteractEdata = {
      id: 'profile-edit',
      type: 'click',
      pageid: 'profile-read'
    };
    this.editMobileInteractEdata = {
      id: 'profile-edit-mobile',
      type: 'click',
      pageid: 'profile-read'
    };
    this.editEmailInteractEdata = {
      id: 'profile-edit-emailId',
      type: 'click',
      pageid: 'profile-read'
    };
    this.downloadCertificateEData = {
      id: 'profile-download-certificate',
      type: 'click',
      pageid: 'profile-read'
    };
    this.editRecoveryIdInteractEdata = {
      id: 'profile-edit-recoveryId',
      type: 'click',
      pageid: 'profile-read'
    };
    this.addRecoveryIdInteractEdata = {
      id: 'profile-add-recoveryId',
      type: 'click',
      pageid: 'profile-read'
    };
    this.downloadOthersCertificateEData = {
      id: 'profile-download-others-certificate',
      type: 'click',
      pageid: 'profile-read'
    };
    this.submitTeacherDetailsInteractEdata = {
      id: 'add-teacher-details',
      type: 'click',
      pageid: 'profile-read'
    };
    this.updateTeacherDetailsInteractEdata = {
      id: 'edit-teacher-details',
      type: 'click',
      pageid: 'profile-read'
    };
  }

  navigate(url, formAction) {
    this.router.navigate([url], {queryParams: {formaction: formAction}});
  }

  ngAfterViewInit() {
    setTimeout(() => {
      this.telemetryImpression = {
        context: {
          env: this.activatedRoute.snapshot.data.telemetry.env
        },
        object: {
          id: this.userService.userid,
          type: 'User',
          ver: '1.0'
        },
        edata: {
          type: this.activatedRoute.snapshot.data.telemetry.type,
          pageid: 'profile-read',
          subtype: this.activatedRoute.snapshot.data.telemetry.subtype,
          uri: this.router.url,
          duration: this.navigationhelperService.getPageLoadTime()
        }
      };
    });
  }

  ngOnDestroy() {
    if (this.userSubscription) {
      this.userSubscription.unsubscribe();
    }
    this.unsubscribe$.next();
    this.unsubscribe$.complete();
  }

  /**
   * @since - #SH-19
   * @param  {object} coursedata - data of the course which user will click from the courses section
   * @description - This method will redirect to the courses page which enrolled by the user
   */
  navigateToCourse(coursedata) {
    const courseId = _.get(coursedata, 'courseId');
    const batchId = _.get(coursedata, 'batchId');
    const interactData = {
      context: {
        env: _.get(this.activatedRoute.snapshot.data.telemetry, 'env'),
        cdata: [{
          type: 'batch',
          id: _.get(coursedata, 'batchId')
        }]
      },
      edata: {
        id: 'course-play',
        type: 'click',
        pageid: 'profile-read',
      },
      object: {
        id: courseId,
        type: _.get(coursedata, 'content.contentType'),
        ver: '1.0',
        rollup: {},
      }
    };
    this.telemetryService.interact(interactData);
    this.router.navigate([`learn/course/${courseId}/batch/${batchId}`]);
  }

  toggleOtherCertific(showMore) {
    if (showMore) {
      if (this.otherCertificates.length !== this.otherCertificatesCounts) {
        this.getOtherCertificates(_.get(this.userProfile, 'userId'), 'all');
      }
      this.otherCertificateLimit = this.otherCertificatesCounts;
      this.showMoreCertificates = false;
    } else {
      this.otherCertificateLimit = this.configService.appConfig.PROFILE.defaultViewMoreLimit;
      this.showMoreCertificates = true;
    }
  }

  /**
   * @since - #SH-920
   * @description - This method will map self declared values with teacher details dynamic fields to display on profile page
   */
  getSelfDeclaredDetails() {
    this.selfDeclaredInfo = [];
    this.profileService.getPersonaTenantForm().pipe(takeUntil(this.unsubscribe$)).subscribe(res => {
      const tenantConfig: any = res.find(config => config.code === 'tenant');
      this.tenantInfo = _.get(tenantConfig, 'templateOptions.options').find(tenant => tenant.value === this.declarationDetails.orgId);

      this.profileService.getSelfDeclarationForm(this.declarationDetails.orgId).pipe(takeUntil(this.unsubscribe$)).subscribe(formConfig => {
        const externalIdConfig = formConfig.find(config => config.code === 'externalIds');
        (externalIdConfig.children as FieldConfig<any>[]).forEach(config => {
          if (this.declarationDetails.info[config.code]) {
            this.selfDeclaredInfo.push({ label: config.fieldName, value: this.declarationDetails.info[config.code], code: config.code });
          }
        });
      });
    });
  }

  copyToClipboard(userName) {
    const textElement = document.createElement('textarea');
    textElement.style.position = 'fixed';
    textElement.value = userName;
    document.body.appendChild(textElement);
    textElement.select();
    document.execCommand('copy');
    document.body.removeChild(textElement);
    this.toasterService.success((this.resourceService.messages.profile.smsg.m0041).replace('{instance}', this.instance));
  }

  triggerAutoScroll() {
    setTimeout(() => {
      const element = document.getElementById(this.scrollToId);
      if (!element) { return; }
      const elementPosition = element.getBoundingClientRect().top;
      const offsetPosition = elementPosition - 144;

      window.scrollTo({
          top: offsetPosition,
          behavior: 'smooth'
      });
    });
  }

  private getUserLocation(profile: any) {
   const userLocation = {};
    if (profile && profile.userLocations && profile.userLocations.length) {
        profile.userLocations.forEach((d) => {
            userLocation[d.type] = d;
        });
    }
    return userLocation;
}

private async getPersonaConfig(persona: string) {
  const formFields = await this.formService.getFormConfig(ProfilePageComponent.SUPPORTED_PERSONA_LIST_FORM_REQUEST).toPromise();
  return formFields.find(config => config.code === persona);
}

private async getSubPersonaConfig(persona: string, userLocation: any): Promise<string[]> {
  if ((!this.userProfile.profileUserTypes || !this.userProfile.profileUserTypes.length) &&
  (!this.userProfile.profileUserType || !this.userProfile.profileUserType.subType)) {
      return undefined;
  }
  let formFields;
  try {
      const state = userLocation.state;
      formFields = await this.formService.getFormConfig({
        ...ProfilePageComponent.DEFAULT_PERSONA_LOCATION_CONFIG_FORM_REQUEST,
        ...(state ? {contentType: state.code} : {})
      }).toPromise();
  } catch (e) {
      formFields = await this.formService.getFormConfig(ProfilePageComponent.DEFAULT_PERSONA_LOCATION_CONFIG_FORM_REQUEST).toPromise();
  }

  const personaConfig = formFields.find(formField => formField.code === 'persona');
  const personaChildrenConfig: FieldConfig<any>[] = personaConfig['children'][persona];
  const subPersonaConfig = personaChildrenConfig.find(formField => formField.code === 'subPersona');
  if (!subPersonaConfig) {
      return undefined;
   }
  const subPersonaList = [];
  if (_.get(subPersonaConfig, 'templateOptions.multiple')) {
    if (this.userProfile.profileUserTypes && this.userProfile.profileUserTypes.length) {
      this.userProfile.profileUserTypes.forEach(ele => {
        if (_.get(ele, 'subType')) {
          subPersonaList.push(ele.subType);
        }
      });
    } else {
      subPersonaList.push(this.userProfile.profileUserType.subType);
    }
  } else {
    subPersonaList.push(this.userProfile.profileUserType.subType);
  }

   const subPersonaFieldConfigOption = [];
   subPersonaList.forEach((ele) => {
    subPersonaFieldConfigOption.push((subPersonaConfig.templateOptions.options as FieldConfigOption<any>[]).
    find(option => option.value === ele).label);
   });

  return subPersonaFieldConfigOption;
}

public onLocationModalClose(event) {
  this.showEditUserDetailsPopup = !this.showEditUserDetailsPopup;
  this.showFullScreenLoader = !event?.isSubmitted ? false : true;
  setTimeout(() => {
    if (this.showFullScreenLoader) {
      this.showFullScreenLoader = false;
      this.toasterService.error(this.resourceService.messages.emsg.m0005);
    }
  }, 5000);
}
}
<app-landing-section [textToDisplay]=""
[layoutConfiguration]="{}" [noTitle]="true"></app-landing-section>
  <!--profile Content Header -->
  <div [ngClass]="layoutConfiguration ? 'sb-back-actionbar' : 'sb-bg-white cc-player__btn-back'" class="relative position mt-0">
    <div class="ui container py-0 px-0 d-flex flex-ai-center">
      <button type="button" (click)="goBack()" [ngClass]="layoutConfiguration ? 'sb-btn-primary sb-btn-round' : 'sb-btn-link sb-btn-link-primary sb-left-icon-btn px-0'" class="sb-btn sb-btn-normal" tabindex="0" attr.aria-label="{{resourceService?.frmelmnts?.btn?.back}}">
      <i class="icon-svg icon-svg--xxs icon-back mr-4"><svg class="icon icon-svg--primary">
          <use xlink:href="assets/images/sprite.svg#arrow-long-left"></use>
        </svg></i>
     <span>{{resourceService?.frmelmnts?.btn?.back}}</span>
    </button>
      <div class="content-header__content w-100 ml-16">
        <div class="d-flex flex-dc flex-basis-1 mr-32 min-w-0 content-header__content__title">
          <div class="content-header__title font-weight-bold ellipsis text-left"  tabindex="0" role="heading" aria-level="2">{{resourceService.frmelmnts?.lnk?.profile}}</div>
        </div>
      </div>
    </div>
  </div>
  
<div [ngClass]="layoutConfiguration ? 'sbt-inside-page-container' : ''">
<div [ngClass]="layoutConfiguration ? 'relative9' : ''">
<div [appTelemetryImpression]="telemetryImpression" *ngIf="userProfile">
  <section class="py-24 d-flex flex-ai-center flex-dc">
    <div class="ui container">
      <div class="mb-15 d-flex flex-jc-center relative avatar-container" aria-label="Profile">
       <img *ngIf="userProfile.stateValidated || !isCustodianOrgUser" role="img" src="assets/images/avatar-tickmark.svg" alt="certified" class="avatar-tickmark"
        matTooltip="{{resourceService.frmelmnts.lbl.stateVerified}}" [matTooltipPosition]="'right'">

       <sb-avatar [ngClass]="{verified: userProfile.stateValidated}" class="my-avatar"   [style]="avtarDesktopStyle"
                     [config]=avatarConfig initialsSize="1" [initial]="userProfile?.firstName[0]"
                    [title]="userProfile?.firstName">
                  </sb-avatar>
      </div>
    </div>
    <div class="profile-user-label font-w-bold d-flex text-center relative position">{{userProfile.firstName | titlecase}} {{userProfile.lastName |
      titlecase}}
    </div>
    <div class="mt-8 mb-16 d-flex flex-jc-center">
      <div class="fnormal">{{resourceService?.frmelmnts?.lbl?.instacnceId | interpolate:'{instance}': instance}} :</div>
      <div class="fnormal ml-5" id="copyUser">{{userProfile.userName}}</div>
      <div role="button" class="ml-8 cursor-pointer" tabindex="0" (click)="copyToClipboard(userProfile.userName)" matTooltip="{{resourceService.frmelmnts?.lbl?.copyid | interpolate:'{instance}': instance}}" [matTooltipPosition]="'left'">
        <i class="icon-svg icon-svg--xs icon-edit">
          <svg class="icon icon-svg--primary">
          <use xlink:href="assets/images/sprite.svg#copy-alternate"></use>
        </svg>
        </i>
        <span class="sb-color-primary" role="link" tabindex="0" attr.aria-label=“{{resourceService?.frmelmnts?.lbl?.copy}}”>{{resourceService?.frmelmnts?.lbl?.copy}}</span>
      </div>

    </div>
    <div class="mb-15 text-center profile-label-container" *ngIf="roles && roles.length > 0">
      <span class="ui dodger-blue basic label mr-15 mt-5"
        *ngFor="let role of roles | slice:0:showMoreRolesLimit">{{role}}</span>
    </div>
    <div *ngIf="roles.length > configService.appConfig.PROFILE.defaultShowMoreLimit"
      class="fs-1 color-2 mb-8 font-w-bold cursor-pointer">
      <span tabindex="0" *ngIf="showMoreRoles" (click)="toggle(true)">+ {{roles.length -
        configService.appConfig.PROFILE.defaultShowMoreLimit}} {{resourceService.frmelmnts.lbl.more}}
        <i class="chevron down icon"></i>
      </span>
      <span (click)="toggle(false)" *ngIf="!showMoreRoles">
        {{resourceService.frmelmnts.lbl.showLess}}
        <i class="chevron up icon"></i>
      </span>
    </div>
    <div class="ui container">
      
  </div>
    <div class="fs-1-5 font-w-bold d-flex mb-8 text-center org-info" *ngIf=" orgDetails && orgDetails.orgName">{{orgDetails.orgName}}
    </div>
    <!-- <div class="ui container" *ngIf="!isCustodianOrgUser">
      <div class="d-flex flex-dc flex-jcc-center flex-ai-center">
        <button appTelemetryInteract
          [telemetryInteractEdata]="editProfileInteractEdata"
          class="sb-btn sb-btn-primary sb-btn-normal sb-btn-border my-16 computer only"
          (click)="showEditUserDetailsPopup=true">{{resourceService.frmelmnts.lbl.edit}}</button>
          </div>
    </div> -->
    <!-- <div class="m-0 pl-0 computer only" *ngIf="nonCustodianUserLocation && !isCustodianOrgUser">
      <div class="mb-0 d-flex mb-5 flex-jc-center" *ngIf="nonCustodianUserLocation.block">
        <div class="fmedium">{{resourceService.frmelmnts.lbl.block}} :</div>
        <div class="fmedium font-w-bold ml-5">{{nonCustodianUserLocation.block}}</div>
      </div>
      <div class="mb-0 d-flex mb-5 flex-jc-center" *ngIf="nonCustodianUserLocation.district">
        <div class="fmedium">{{resourceService.frmelmnts.lbl.district}} :</div>
        <div class="fmedium font-w-bold ml-5">{{nonCustodianUserLocation.district}}</div>
      </div>
      <div class="mb-0 d-flex mb-5 flex-jc-center" *ngIf="nonCustodianUserLocation.state">
        <div class="fmedium">{{resourceService.frmelmnts.lbl.state}} :</div>
        <div class="fmedium font-w-bold ml-5">{{nonCustodianUserLocation.state}}</div>
      </div>
    </div> -->

    <!-- <div class="m-0 pl-0 mobile only" *ngIf="orgDetails && orgDetails.locations && !isCustodianOrgUser">
      <div class="mb-0 d-flex m-responsive-flex-dc mt-15" *ngIf="getLocationDetails(orgDetails.locations, 'block')">
        <span class="fmedium text-center">{{resourceService.frmelmnts.lbl.block}} :</span>
        <span class="fmedium font-w-bold text-center">{{getLocationDetails(orgDetails.locations, 'block')}}</span>
      </div>
      <div class="mb-0 d-flex m-responsive-flex-dc mt-15" *ngIf="getLocationDetails(orgDetails.locations, 'district')">
        <span class="fmedium text-center">{{resourceService.frmelmnts.lbl.district}} :</span>
        <span class="fmedium font-w-bold text-center">{{getLocationDetails(orgDetails.locations, 'district')}}</span>
      </div>
      <div class="mb-0 d-flex m-responsive-flex-dc mt-15" *ngIf="getLocationDetails(orgDetails.locations, 'state')">
        <span class="fmedium text-center text-center">{{resourceService.frmelmnts.lbl.state}} :</span>
        <span class="fmedium font-w-bold text-center">{{getLocationDetails(orgDetails.locations, 'state')}}</span>
      </div>
    </div> -->
  </section>

  <section class="d-flex flex-ai-center flex-dc pb-24 content-preference">
    <h3 class="content-header-info font-weight-bold mb-16">{{resourceService.frmelmnts.lbl.profiledetails}}</h3>
    <!-- add state and district -->
      <div class="ui container content-preference__info pt-16">
        <div *ngIf="persona?.name" class="mb-0 d-flex flex-jc-center m-responsive-flex-dc m-responsive-mt-15">
          <div class="fmedium text-center">{{resourceService.frmelmnts.lbl.role}} :</div>
          <div class="fmedium ml-5 font-w-bold text-center">{{persona.name}}</div>
        </div>
        <div *ngIf="subPersona" class="mb-0 d-flex flex-jc-center m-responsive-flex-dc m-responsive-mt-15">
          <div class="fmedium text-center white-space-nowrap">{{resourceService.frmelmnts.lbl.subRole}} :</div>
          <div class="fmedium ml-5 font-w-bold text-center">{{subPersona.join(', ')}}</div>
        </div>
        <div *ngIf="userLocation?.district && userLocation?.district?.name" class="mb-0 d-flex flex-jc-center m-responsive-flex-dc m-responsive-mt-15">
          <div class="fmedium text-center">{{resourceService.frmelmnts.lbl.district}} :</div>
          <div class="fmedium ml-5 font-w-bold text-center">
            {{userLocation.district.name}} </div>
        </div>
        <div *ngIf="userLocation?.state && userLocation?.state?.name" class="d-flex mb-5 flex-jc-center m-responsive-flex-dc m-responsive-mt-15">
          <div class="fmedium text-center">{{resourceService.frmelmnts.lbl.state}} :</div>
          <div class="fmedium ml-5 font-w-bold text-center">
            {{userLocation.state.name}}</div>
        </div>
        <div *ngIf="userLocation?.block && userLocation?.block?.name" class="mb-0 d-flex flex-jc-center m-responsive-flex-dc m-responsive-mt-15">
          <div class="fmedium text-center">{{resourceService.frmelmnts.lbl.block}} :</div>
          <div class="fmedium ml-5 font-w-bold text-center">
            {{userLocation.block.name}} </div>
        </div>
        <div *ngIf="userLocation?.cluster && userLocation?.cluster?.name" class="mb-0 d-flex flex-jc-center m-responsive-flex-dc m-responsive-mt-15">
          <div class="fmedium text-center">{{resourceService.frmelmnts.lbl.cluster}} :</div>
          <div class="fmedium ml-5 font-w-bold text-center">
            {{userLocation.cluster.name}} </div>
        </div>
        <div *ngIf="userLocation?.school && userLocation?.school?.name" class="mb-0 d-flex flex-jc-center m-responsive-flex-dc m-responsive-mt-15">
          <div class="fmedium text-center">{{resourceService.frmelmnts.lbl.school}} :</div>
          <div class="fmedium ml-5 font-w-bold text-center">
            {{userLocation.school.name}} </div>
        </div>
        
        <div class="d-flex flex-dc flex-jcc-center flex-ai-center">
          <button appTelemetryInteract appOnlineOnly
            [telemetryInteractEdata]="editProfileInteractEdata"
            class="sb-btn sb-btn-primary sb-btn-normal sb-btn-border my-16" attr.aria-label="{{resourceService?.frmelmnts?.lbl?.editPersonalDetails}}" tabindex="0"
            (click)="showEditUserDetailsPopup=true" tabindex="0">{{resourceService.frmelmnts.lbl.edit}}</button>
          <button appTelemetryInteract appOnlineOnly tabindex="0"
                  [telemetryInteractEdata]="submitTeacherDetailsInteractEdata"
                  *ngIf="!declarationDetails && isCustodianOrgUser && !userProfile.isMinor"
                  (click)="navigate('/profile/submit-declaration','submit')" tabindex="0"
                  class="no-text-transform sb-btn sb-btn-normal sb-btn-secondary sb-right-icon-btn mx-8 mb-8 px-24" type="submit">
          {{resourceService?.frmelmnts?.lbl?.iAmStateTeacher}} </button>
        </div>
      </div>
  </section>
  
  <section class="d-flex flex-ai-center flex-dc pt-30 pb-30 profile-bg-c-4 content-preference">
    <!-- User info computer view starts-->
    <div class="ui container">
      <div class="d-flex flex-jc-center flex-ai-center flex-dc" *ngIf="userProfile && userProfile.framework ">
        <div class="max-w-400 computer only">
          <div class="mb-15 d-flex flex-jc-center" *ngIf="convertToString(userProfile.framework.board)">
            <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.boards | transposeTerms: 'frmelmnts.lbl.boards' : resourceService?.selectedLang}} :</span>
            <span class="fmedium font-w-bold pl-4"
              *ngIf="userProfile.framework">{{convertToString(userProfile.framework.board)}}</span>
          </div>
          <div class="mb-15 d-flex flex-jc-center" *ngIf="convertToString(userProfile.framework.medium)">
            <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.medium | transposeTerms: 'frmelmnts.lbl.medium' : resourceService?.selectedLang}} :</span>
            <span class="fmedium font-w-bold pl-4"
              *ngIf="userProfile.framework">{{convertToString(userProfile.framework.medium)}}</span>
          </div>
          <div class="mb-15 d-flex flex-jc-center" *ngIf="convertToString(userProfile.framework.gradeLevel)">
            <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.classes | transposeTerms: 'frmelmnts.lbl.classes' : resourceService?.selectedLang}} :</span>
            <span class="fmedium font-w-bold pl-4"
              *ngIf="userProfile.framework">{{convertToString(userProfile.framework.gradeLevel)}}</span>
          </div>
          <div class="d-flex flex-jc-center" *ngIf="convertToString(userProfile.framework.subject)">
            <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.subjects | transposeTerms: 'frmelmnts.lbl.subjects' : resourceService?.selectedLang}} :</span>
            <span class="fmedium font-w-bold pl-4"
              *ngIf="userProfile.framework">{{convertToString(userProfile.framework.subject)}}</span>
          </div>
        </div>
        <button class="sb-btn sb-btn-primary sb-btn-normal my-16 sb-btn-border computer only"
          appTelemetryInteract appOnlineOnly
          [telemetryInteractEdata]="myFrameworkEditEdata" attr.aria-label="{{resourceService.frmelmnts.lbl.edit}} {{resourceService.frmelmnts.lbl.boards}},{{resourceService.frmelmnts.lbl.medium}},{{resourceService.frmelmnts.lbl.classes}},{{convertToString(userProfile.framework.gradeLevel)}},{{resourceService.frmelmnts.lbl.subjects}}"
          (click)="showEdit = !showEdit" tabindex="0">{{resourceService.frmelmnts.lbl.edit}}</button>
      </div>
    </div>
    <!-- User info computer view ends-->

    <!-- User info mobile view starts-->
    <div class="max-w-300 mobile only">
      <div class="mb-15 d-flex flex-ai-center flex-dc">
        <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.boards | transposeTerms: 'frmelmnts.lbl.boards' : resourceService?.selectedLang}}:</span>
        <span class="fmedium font-w-bold text-center"
          *ngIf="userProfile.framework">{{convertToString(userProfile.framework.board)}}</span>
      </div>
      <div class="mb-15 d-flex flex-ai-center flex-dc">
        <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.medium | transposeTerms: 'frmelmnts.lbl.medium' : resourceService?.selectedLang}} :</span>
        <span class="fmedium font-w-bold text-center"
          *ngIf="userProfile.framework">{{convertToString(userProfile.framework.medium)}}</span>
      </div>
      <div class="mb-15 d-flex flex-ai-center flex-dc">
        <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.classes | transposeTerms: 'frmelmnts.lbl.classes' : resourceService?.selectedLang}} :</span>
        <span class="fmedium font-w-bold text-center"
          *ngIf="userProfile.framework">{{convertToString(userProfile.framework.gradeLevel)}}</span>
      </div>
      <div class="mb-15 d-flex flex-ai-center flex-dc">
        <span class="fmedium white-space-nowrap">{{resourceService.frmelmnts.lbl.subjects | transposeTerms: 'frmelmnts.lbl.subjects' : resourceService?.selectedLang}} :</span>
        <span class="fmedium font-w-bold text-center"
          *ngIf="userProfile.framework">{{convertToString(userProfile.framework.subject)}}</span>
      </div>
      <div class="d-flex flex-ai-center flex-jc-center" appTelemetryInteract
        [telemetryInteractEdata]="myFrameworkEditEdata" tabindex="0"
        (click)="showEdit = !showEdit" attr.aria-label="{{resourceService?.frmelmnts?.lbl?.editPersonalDetails}}">
        <button appOnlineOnly class="sb-btn sb-btn-primary sb-btn-xs mt-30">{{resourceService.frmelmnts.lbl.edit}}</button>
      </div>
    </div>
    <!-- User info mobile view ends-->
  </section>

  <section class="pt-30 pb-30 d-flex flex-jc-center profile-bg-c-3" *ngIf="userProfile.email || userProfile.phone">
    <div class="d-flex flex-dc">
      <div class="d-flex flex-jc-center">
        <div role="button" appOnlineOnly (click)="showContactPopup=true;contactType='phone'" tabindex="0"
          class="ui semi-circular dodger-blue basic label mb-15 cursor-pointer" *ngIf="userProfile.phone"
          appTelemetryInteract
          [telemetryInteractEdata]="editMobileInteractEdata">
          <i class="phone blue icon mr-5"></i> &#x200E;+91 {{userProfile.phone}}
        </div>
        <div appOnlineOnly (click)="showContactPopup=true;contactType='phone'" attr.aria-label=“{{resourceService?.frmelmnts?.lbl?.addPhoneNo}}” tabindex="0"
          class="ui semi-circular update basic label mb-15 cursor-pointer font-weight-normal" *ngIf="!userProfile.phone"
          appTelemetryInteract
          [telemetryInteractEdata]="editMobileInteractEdata">
          <i class="phone icon mr-5"></i> {{resourceService?.frmelmnts?.lbl?.addPhoneNo}}
        </div>
      </div>
     <div class="d-flex flex-jc-center">
      <div appOnlineOnly (click)="showContactPopup=true;contactType='email'" tabindex="0"
      class="ui semi-circular dodger-blue basic label cursor-pointer mb-15" attr.aria-label=“{{userProfile.email}}” *ngIf="userProfile.email" appTelemetryInteract
      [telemetryInteractEdata]="editEmailInteractEdata">
      <i class="mail blue icon mr-5"></i> {{userProfile.email}}
    </div>
    <div appOnlineOnly (click)="showContactPopup=true;contactType='email'" tabindex="0" attr.aria-label=“{{resourceService?.frmelmnts?.lbl?.addEmailID}}”
      class="ui semi-circular update basic label mb-15 cursor-pointer font-weight-normal" *ngIf="!userProfile.email"
      appTelemetryInteract
      [telemetryInteractEdata]="editEmailInteractEdata">
      <i class="mail icon mr-5"></i> {{resourceService?.frmelmnts?.lbl?.addEmailID}}
    </div>
     </div>

      <!-- Add/edit recovery email/phone-->
    <div class="d-flex flex-jc-center">
      <div appOnlineOnly *ngIf="userProfile.recoveryEmail || userProfile.recoveryPhone" tabindex="0" (click)="showRecoveryId=true; mode='edit'" attr.aria-label=“{{userProfile.recoveryEmail}}” class="ui semi-circular dodger-blue basic label cursor-pointer mb-15 d-flex"
      appTelemetryInteract
      [telemetryInteractEdata]="editRecoveryIdInteractEdata">
        <div class="recovery-img mr-5"></div>
        <span *ngIf="userProfile.recoveryEmail">{{userProfile.recoveryEmail}}</span>
        <span *ngIf="userProfile.recoveryPhone">{{userProfile.recoveryPhone}}</span>
       </div>
       <div appOnlineOnly *ngIf="!(userProfile.recoveryEmail || userProfile.recoveryPhone)" attr.aria-label=“{{resourceService?.frmelmnts?.lbl?.addRecoveryAccount}}” tabindex="0" (click)="showRecoveryId=true; mode='add'" class="ui semi-circular update basic label mb-15 cursor-pointer font-weight-normal d-flex"
      appTelemetryInteract
      [telemetryInteractEdata]="addRecoveryIdInteractEdata">
        <div class="recovery-img mr-5"></div>
       <span>{{resourceService?.frmelmnts?.lbl?.addRecoveryAccount}}</span>
       </div>
     </div>
    </div>
  </section>

  

  <!-- 4 section start teacher profile-->
  <section class="pt-30 pb-30 d-flex flex-jc-center profile-bg-c-3" *ngIf="declarationDetails && !userProfile.stateValidated">
  <div class="flex-ai-jc-center flex-dc text-center school-id-section">
    <div class="self-declared-title">{{resourceService.frmelmnts?.lbl?.selfDeclaredInfo}}</div>
      <div>
        {{resourceService?.frmelmnts?.lbl?.wishToShareDataWith}} : <span>{{ tenantInfo?.label }}</span>
      </div>

      <div *ngFor="let item of selfDeclaredInfo">
        <div class="fnormal white-space-nowrap">{{ item.label }}:</div>
        <div class="fnormal font-w-bold mt-4 mb-8">{{ item.code === 'declared-phone' ? '+91' : '' }} {{ item.value }}</div>
      </div>
      <div class="my-8">
        <button appTelemetryInteract appOnlineOnly
        [telemetryInteractEdata]="updateTeacherDetailsInteractEdata" tabindex="0" type="button" class="sb-btn sb-btn-normal sb-btn-outline-primary sb-btn-border"
        (click)="navigate('/profile/submit-declaration','update')">{{resourceService.frmelmnts?.btn?.update}}</button>
      </div>

    </div>
  </section>
  <!-- 4 section end -->

  <!-- my badges section starts -->
  <!-- <extension-point *ngIf="userProfile.badgeAssertions && userProfile.badgeAssertions.length > 0"
    [name]="'profile-widget'"></extension-point> -->
  <app-profile-badge *ngIf="userProfile.badgeAssertions && userProfile.badgeAssertions.length > 0"></app-profile-badge>
  <!-- my badges section ends -->

  <div class="pt-30">
    <div class="sb-profile-page-container" [ngClass]="layoutConfiguration ? 'sbt-center-container' : 'ui container'">

      <!--contributions view starts-->
      <div class="fs-1-7 font-w-bold pl-20 mobile only" *ngIf="contributions && contributions.length > 0">
        {{resourceService.frmelmnts.scttl.contributions}}
        ({{totalContributions}})&#x200E;</div>
      <div class="ui divider my-5 mobile only"></div>
      <!--contributions computer view starts-->
      <div class="ui segments" *ngIf="contributions && contributions.length > 0">
        <div class="ui segment computer only">
          <div class="fs-1-7 pl-10 font-w-bold">{{resourceService.frmelmnts.scttl.contributions}}
            ({{totalContributions}})&#x200E;</div>
        </div>
        <div class="ui segment">
          <div class="regular slider pt-10">
            <app-page-section [section]="{ contents: contributions}" (visits)="prepareVisits($event)"
              (playEvent)="openContent($event)" [layoutConfiguration]="layoutConfiguration"></app-page-section>
          </div>
        </div>
      </div>
      <!--contributions computer view ends-->
      <!--contributions view ends-->

      <!-- tarainings attended computer view strats-->
      <div class="container my-16 sb-certificate-trained" *ngIf="attendedTraining && attendedTraining.length">
          <div class="list-heading">
            <label class="mb-0">{{resourceService?.frmelmnts?.lbl?.myLearning}}({{attendedTraining.length}})&#x200E;</label>
            <span class="fsmall mt-4 font-weight-bold">&nbsp;({{resourceService?.frmelmnts?.lbl?.refreshedDaily}})</span>
          </div>
          <div class="list-item-parent">
            <div class="list-items sb-course-progress-status-label">
              <div class="list-items__item"><span class="sb__ellipsis mr-auto mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.course}}</span></div>
              <div class="list-items__item"><span class="sb__ellipsis mr-auto mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.batch}}</span></div>
              <div class="list-items__item"><span class="sb__ellipsis mr-auto mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.coursecompletiondate}}</span></div>
              <div class="list-items__item"><span class="sb__ellipsis mr-auto mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.status}}</span></div>
              <div class="list-items__item"><span class="sb__ellipsis mr-auto mb-0 text-left"></span></div>
            </div>
          </div>
          <div class="list-item-parent" *ngFor="let data of attendedTraining | slice:0:courseLimit">
            <div class="list-items" *ngIf="data.courseName">
              <div class="list-items__item"><a tabindex="0" (click)="navigateToCourse(data)" class="sb__ellipsis mr-auto mb-0 text-left">{{data.courseName}}</a></div>
              <div class="list-items__item"><span class="sb__ellipsis mr-auto mb-0 text-left">{{data.batch.name}}</span></div>
              <div class="list-items__item list-date" *ngIf="data.completedOn">{{data.completedOn | date :'MMMM yyy' }}</div>
              <div class="list-items__item list-items__bar computer only" *ngIf="!data.completedOn">
                  <span class="bar mr-4"></span>
                  <span class="bar"></span>
              </div>
              <div class="list-items__item status-progress fsmall font-weight-bold text-left" *ngIf="(data.status === 0 || data.status === 1) && (data.batch.status !== 2)" >{{resourceService?.frmelmnts?.lbl?.ongoing}}</div>
              <div class="list-items__item status-progress fsmall font-weight-bold text-left" *ngIf="(data.status === 0 || data.status === 1) && (data.batch.status === 2)" >{{resourceService?.frmelmnts?.lbl?.expiredbatch}}</div>
              <div class="list-items__item status-completed fsmall font-weight-bold text-left" *ngIf="data.status === 2 " >{{resourceService?.frmelmnts?.lbl?.completed}}</div>
              <div class="list-items__item" *ngIf="data?.certificates?.length || data?.issuedCertificates?.length">
                <button appTelemetryInteract
                 [telemetryInteractEdata]="downloadCertificateEData"
                [telemetryInteractCdata]="[{id: 'course:download:cert', type: 'Feature'},{id: 'SB-14120', type: 'Task'}]"
                class="sb-btn sb-btn-normal sb-btn-link sb-btn-link-primary sb-left-icon-btn fnormal" (click)="downloadCert(data)" tabindex="0">
                <i class="download icon"></i>{{resourceService?.frmelmnts?.btn?.downloadCertificate}}</button>
              </div>
              <div class="list-items__item list-items__bar computer only" *ngIf="!data?.certificates?.length && !data?.issuedCertificates?.length">
                  <span class="bar mr-4"></span>
                  <span class="bar"></span>
              </div>
            </div>
          </div>
          <div class="flex-ai-jc-center sb-ct-list" *ngIf="attendedTraining.length > 3">
            <button class="sb-btn sb-btn-normal sb-btn-primary sb-right-icon-btn" appTelemetryInteract
              [telemetryInteractEdata]="{id:'view-more' , type:'click' , pageid:'profile-read'}" *ngIf="showMoreTrainings"
              (click)="toggleCourse(true, attendedTraining.length)" tabindex="0"> +{{attendedTraining.length - 3}} {{resourceService.frmelmnts.lbl.viewmore}}<i
                class="chevron down icon"></i></button>
            <button class="sb-btn sb-btn-normal sb-btn-primary sb-right-icon-btn" appTelemetryInteract
              [telemetryInteractEdata]="{id:'view-less' , type:'click' , pageid:'profile-read'}"
              (click)="toggleCourse(false, attendedTraining.length)" tabindex="0" *ngIf="!showMoreTrainings">{{resourceService.frmelmnts.lbl.viewless}}<i
                class="chevron up icon"></i></button>
          </div>
        </div>
         <!-- trainings attended computer view ends-->

         <!-- certificates - old layout-->
        <!-- <div class="container my-16 sb-certificate-trained" id="learner-passbook" *ngIf="otherCertificates && otherCertificates.length">
          <div class="list-heading">
            <label class="mb-0">{{resourceService.frmelmnts?.lbl?.learnerPassbook }}&#x200E;</label>
          </div>
          <div class="list-item-parent">
            <div class="list-items sb-course-progress-status-label">
              <label class="list-items__item mr-auto mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.course}}</label>
              <label class="list-items__item mr-auto mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.certgivenby}}</label>
              <label class="list-items__item mr-auto mb-0 last-date">{{resourceService?.frmelmnts?.lbl?.certissuedon}}</label>
              <label class="list-items__item mr-auto mb-0 text-left"></label>
            </div>
          </div>
          <div class="list-item-parent" *ngFor="let data of otherCertificates | slice:0:otherCertificateLimit">
            <div class="list-items" *ngIf="data.issuingAuthority">
              <label class="list-items__item mr-auto mb-0 text-left">{{data.courseName}}</label>
              <label class="list-items__item mr-auto mb-0 text-left">{{data.issuingAuthority}}</label>
              <label class="list-items__item list-date" *ngIf="data.issuedOn">{{data.issuedOn | date :'dd MMMM yyy' }}</label>
              <div class="list-items__item" *ngIf="data?.certificates?.length">
                <button appTelemetryInteract [telemetryInteractEdata]="downloadOthersCertificateEData"
                class="sb-btn sb-btn-normal sb-btn-link sb-btn-link-primary sb-left-icon-btn fnormal" (click)="downloadCert(data)" tabindex="0">
                <i class="download icon" ></i>{{resourceService?.frmelmnts?.btn?.downloadCertificate}}</button>
              </div>
              <div class="list-items__item list-items__bar computer only" *ngIf="!data?.certificates?.length">
                  <span class="bar"></span>
                  <span class="bar"></span>
                </div>
            </div>
          </div>
          <div class="flex-ai-jc-center sb-ct-list" *ngIf="otherCertificates.length > 3 ">
            <button class="sb-btn sb-btn-normal sb-btn-primary sb-right-icon-btn" appTelemetryInteract
              [telemetryInteractEdata]="{id:'view-more' , type:'click' , pageid:'profile-read'}" *ngIf="showMoreCertificates"
              (click)="toggleOtherCertific(true)" tabindex="0">{{resourceService.frmelmnts.lbl.viewmore}}<i
                class="chevron down icon"></i></button>
            <button class="sb-btn sb-btn-normal sb-btn-primary sb-right-icon-btn" appTelemetryInteract
              [telemetryInteractEdata]="{id:'view-less' , type:'click' , pageid:'profile-read'}"
              (click)="toggleOtherCertific(false)" tabindex="0" *ngIf="!showMoreCertificates">{{resourceService.frmelmnts.lbl.viewless}}<i
                class="chevron up icon"></i></button>
          </div>
        </div> -->
        <!-- certificates - old layout-->

        <!-- RC Certificates -->
        <div class="container my-16 sb-certificate-trained" id="learner-passbook" *ngIf="otherCertificates && otherCertificates.length">
          <div class="list-heading">
            <label class="mb-0">{{resourceService.frmelmnts?.lbl?.learnerPassbook }}&#x200E;</label>
          </div>
          <div class="list-item-parent">
            <div class="list-items sb-course-progress-status-label">
              <label class="list-items__item mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.course}}</label>
              <label class="list-items__item mb-0 text-left">{{resourceService?.frmelmnts?.lbl?.certgivenby}}</label>
              <label class="list-items__item mb-0 last-date">{{resourceService?.frmelmnts?.lbl?.certissuedon}}</label>
              <label class="list-items__item mb-0 text-left"></label>
              <label class="list-items__item mb-0 text-left"></label>
            </div>
          </div>
          <div class="list-item-parent" *ngFor="let data of otherCertificates | slice:0:otherCertificateLimit">
            <div class="list-items" *ngIf="data?.issuerName">
              <label class="list-items__item mb-0 text-left">{{data.trainingName}}</label>
              <label class="list-items__item mb-0 text-left">{{data?.issuerName}}</label>
              <label class="list-items__item list-date" *ngIf="data.issuedOn">{{data.issuedOn | date :'dd MMMM yyy' }}</label>
              <div class="list-items__item" *ngIf="data?.id">
                <button appOnlineOnly appTelemetryInteract [telemetryInteractEdata]="downloadOthersCertificateEData"
                  class="sb-btn sb-btn-normal sb-btn-link sb-btn-link-primary sb-left-icon-btn"
                  (click)="downloadOldAndRCCert(data)" tabindex="0" >
                  <i class="download icon"></i>{{resourceService?.frmelmnts?.btn?.downloadCertificate}}</button>
              </div>
              <div class="list-items__item list-items__bar computer only" *ngIf="!data?.length">
                <span class="bar"></span>
                <span class="bar"></span>
              </div>
            </div>
          </div>
          <div class="flex-ai-jc-center sb-ct-list" *ngIf="otherCertificates.length > 3 ">
            <button class="sb-btn sb-btn-normal sb-btn-primary sb-right-icon-btn" appTelemetryInteract
              [telemetryInteractEdata]="{id:'view-more' , type:'click' , pageid:'profile-read'}" *ngIf="showMoreCertificates"
              (click)="toggleOtherCertific(true)" tabindex="0">{{resourceService.frmelmnts.lbl.viewmore}}<i
                class="chevron down icon"></i></button>
            <button class="sb-btn sb-btn-normal sb-btn-primary sb-right-icon-btn" appTelemetryInteract
              [telemetryInteractEdata]="{id:'view-less' , type:'click' , pageid:'profile-read'}"
              (click)="toggleOtherCertific(false)" tabindex="0"
              *ngIf="!showMoreCertificates">{{resourceService.frmelmnts.lbl.viewless}}<i class="chevron up icon"></i></button>
          </div>
        </div>
        <!-- RC Certificates -->
      </div>
  </div>
</div>
</div>
</div>
<app-modal-wrapper #profileModal *ngIf="showEdit" [config]="{disableClose: false, panelClass: ['overflow-visible', 'material-modal']}" (dismiss)="showEdit = !showEdit">
  <ng-template sbModalContent let-data>
    <app-popup [dialogProps]="data" [formInput]="userFrameWork" [showCloseIcon]="true"
      [buttonLabel]="resourceService?.frmelmnts?.btn?.submit" (submit)="updateProfile($event)">
    </app-popup>
  </ng-template>
</app-modal-wrapper>

<app-modal-wrapper *ngIf="showContactPopup" [config]="{disableClose: false, panelClass: ['overflow-visible', 'material-modal']}" (dismiss)="showContactPopup = !showContactPopup">
  <ng-template sbModalContent let-data>
    <app-update-contact-details [dialogProps]="data" (close)="showContactPopup = !showContactPopup" [contactType]="contactType" [userProfile]="userProfile">
    </app-update-contact-details>
  </ng-template>
</app-modal-wrapper>

  <app-location-selection
    (close)="onLocationModalClose($event)"
    *ngIf="showEditUserDetailsPopup">

    <div slot="popup-sub-header">
      <p class="subtitle">{{resourceService?.frmelmnts?.lbl?.editPersonalDetails}}&lrm;</p>
    </div>
  </app-location-selection>
  <app-full-page-loader *ngIf="showFullScreenLoader"></app-full-page-loader>

  <app-modal-wrapper *ngIf="showRecoveryId" [config]="{disableClose: false, panelClass: 'material-modal'}" (dismiss)="showRecoveryId = !showRecoveryId">
    <ng-template sbModalContent let-data>
      <app-account-recovery-info [dialogProps]="data" [mode]="mode" (close)="showRecoveryId = !showRecoveryId"
      [userProfile]="userProfile"></app-account-recovery-info>
    </ng-template>
  </app-modal-wrapper>
<router-outlet></router-outlet>

./profile-page.component.scss

@use "@project-sunbird/sb-styles/assets/mixins/mixins" as *;
@use 'pages/content-header' as *;
/* fonts */
.font-w-bold {
  font-weight: bold !important;
}

/* colors */
.color-2 {
  color: var(--rc-007AFF) !important;
}

/* profile page color palate */
.profile-bg-c-3 {
  background: var(--sbt-page-header-bg) !important;
}

.profile-bg-c-4 {
  background: var(--sb-profile-bg-c-4) !important;
  color:var(--black);
}

.profile-bg-c-4 {
  @include respond-below(md) {
    margin: 0 2% calculateRem(24px) 2%;
    border-radius: calculateRem(24px);
  }
}

/* width */
.max-w-300 {
  max-width: calculateRem(300px) !important;
}

.max-w-400 {
  max-width: calculateRem(400px) !important;
}

.profile-label-container {
  max-width: calculateRem(600px) !important;

  .ui.basic.label:hover {
    border: calculateRem(1px) solid var(--rc-f9f9f9) !important;
  }
}

@media only screen and (max-width: 767px) {
  .profile-label-container {
    max-width: calculateRem(200px) !important;
  }

  .m-responsive-flex-dc {
    flex-direction: column;
  }

  .m-responsive-mt-15 {
    margin-top: calculateRem(15px);
  }
}

.text-warm-grey {
  color: var(--gray-300);
}

.name-info {
  background-color: var(--gray-400);
  -webkit-mask-image: url(../../../../../assets/images/info-icon.svg);
  mask-image: url(../../../../../assets/images/info-icon.svg);
  -webkit-mask-size: contain;
  -webkit-mask-position: 50% 50%;
  -webkit-mask-repeat: no-repeat;
  mask-size: contain;
  mask-position: 50% 50%;
  mask-repeat: no-repeat;
  width: calculateRem(20px);
  height: calculateRem(20px);
  margin-top: calculateRem(3px);
  margin-left: calculateRem(5px);
  display: inline-block;
}

::ng-deep {
  .ui.popup {
    .arrow {
      display: none;
    }
  }
}

// TODO::need to move this to styles component(right now this is done to avoid shadow DOM)

.ui.semi-circular.dodger-blue.basic.label {
  border-radius: calculateRem(18.5px);
  font-size: 1.16rem;
  padding: calculateRem(8px) calculateRem(16px);
  color: var(--primary-color);

  &:hover {
    border: 0;
  }

  .icon {
    margin: 0;
  }
}

.ui.semi-circular.update.basic.label,
.ui.semi-circular.basic.label {
  border: calculateRem(1px) solid var(--primary-color);
  border-radius: calculateRem(18.5px);
  font-size: 1.16rem;
  padding: calculateRem(8px) calculateRem(16px);
  color: var(--gray-300);
  background: var(--sb-profile-page-basic-label-bg);
}

.ui.label>.recovery-img {
  background-color: var(--gray-300);
  -webkit-mask-image: url(/assets/images/Recovery.svg) no-repeat 50% 50%;
  -webkit-mask: url(/assets/images/Recovery.svg) no-repeat 50% 50%;
  mask: url(/assets/images/Recovery.svg) no-repeat 50% 50%;
  -webkit-mask-size: cover;
  mask-size: cover;
  height: calculateRem(16px);
  width: calculateRem(16px);
}

.avatar-container {
  width: calculateRem(98px);
  height: calculateRem(98px);
  margin: 0 auto;

  .avatar-tickmark {
    width: calculateRem(32px);
    height: calculateRem(32px);
    position: absolute;
    left: 67%;
  }
}

.my-avatar.verified ::ng-deep .avatar-content {
  border: calculateRem(1px) solid var(--secondary-color) !important;
}

@include respond-below(sm) {
  .avatar-tickmark {
    left: 67%;
  }
}

.ui.label.dodger-blue>.recovery-img {
  background-color: var(--primary-color);
}

.school-id-section {
  color: var(--white);
}

.sb-btn-border {
  border-radius: calculateRem(40px);
  text-transform: none;
}

.profile-user-label {
  font-size: calculateRem(32px);
}

.status-progress {
  color: var(--primary-color);
}

.status-completed {
  color: var(--secondary-color);
}

.no-text-transform {
  text-transform: unset;
}

.self-declared-title{
  font-size: calculateRem(12px);
  font-weight: bold;
}

.sb-certificate-trained {
  border: calculateRem(0.5px) solid var(--gray-100);
  border-radius: calculateRem(4px);
  background-color: var(--sb-profile-certificate-bg);
  margin: 0 auto;

  .sb-ct-list {
    padding: calculateRem(16px);
    display: flex;
    flex-direction: row;
    align-items: center;

    @include respond-below(md) {
      position: relative;
      padding-right: calculateRem(8px);
      flex-direction: column;
    }
  }
}
.sb-course-progress-status-label{
  width: 100%;
  border-radius:calculateRem(8px) calculateRem(8px) 0 0;
  justify-content: space-between;
  display: flex;
  padding: calculateRem(8px) calculateRem(16px);
}
.sb-profile-page-container{
  .ui.segment{
    background: var(--sb-profile-page-container);
  }
}

.content-preference {
  @include respond-below(md) {
    padding: 0 2%;
    &__info {
      background: var(--sb-profile-bg-c-4);
      padding: calculateRem(16px) 0;
      border-radius: calculateRem(24px);
      width: 100%;
      color: var(--black);
    }
  }
}

::ng-deep {
  .avatar-container {
     .my-avatar.verified .sb-avatar-list-item .sb-avatar__img {
      border: 1px solid  !important;
      border-color: var(--secondary-color) !important;
    }
     .avatar-tickmark {
      width: 2rem;
      height: 2rem;
      position: absolute;
      right: 0%;
      z-index: 9;
      top: 0.2rem; 

    }

  }

}
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""