File

src/app/modules/shared-feature/components/batch-info/batch-info.component.ts

Implements

OnInit OnDestroy

Metadata

Index

Properties
Methods
Inputs
Outputs

Constructor

constructor(resourceService: ResourceService, playerService: PlayerService, configService: ConfigService, learnerService: LearnerService, userService: UserService, toasterService: ToasterService, coursesService: CoursesService, router: Router, generaliseLabelService: GeneraliseLabelService, activatedRoute: ActivatedRoute)
Parameters :
Name Type Optional
resourceService ResourceService No
playerService PlayerService No
configService ConfigService No
learnerService LearnerService No
userService UserService No
toasterService ToasterService No
coursesService CoursesService No
router Router No
generaliseLabelService GeneraliseLabelService No
activatedRoute ActivatedRoute No

Inputs

enrolledBatchInfo
Type : any

Outputs

modelClose
Type : EventEmitter
routeChanged
Type : EventEmitter

Methods

Private fetchUserDetails
fetchUserDetails(userIds: [])
Parameters :
Name Type Optional Default value
userIds [] No []
Returns : void
Private getAllOpenBatchForCourse
getAllOpenBatchForCourse()
Returns : any
Public handleEnrollEvent
handleEnrollEvent(event)
Parameters :
Name Optional
event No
Returns : void
Public handleEnrollmentEndDate
handleEnrollmentEndDate(batchDetails)
Parameters :
Name Optional
batchDetails No
Returns : any
Public handleResumeEvent
handleResumeEvent(event)
Parameters :
Name Optional
event No
Returns : void
Public handleStartDate
handleStartDate(batchDetails)
Parameters :
Name Optional
batchDetails No
Returns : any
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void

Properties

Public activatedRoute
Type : ActivatedRoute
Public configService
Type : ConfigService
Public coursesService
Type : CoursesService
Public disableEnrollBtn
Default value : false
Public enrolledBatches
Type : Array<any>
Default value : []
Public enrollInteractEdata
Public generaliseLabelService
Type : GeneraliseLabelService
Public hasOngoingBatches
Default value : false
Public learnerService
Type : LearnerService
Public openForEnrollBatches
Type : Array<any>
Default value : []
Public playerService
Type : PlayerService
Public resourceService
Type : ResourceService
Public resumeInteractEdata
Public router
Type : Router
Public toasterService
Type : ToasterService
Public unsubscribe
Default value : new Subject<void>()
Public userDetails
Type : object
Default value : {}
Public userService
Type : UserService
import { Component, OnInit, Output, EventEmitter, Input, OnDestroy } from '@angular/core';
import { ResourceService, ToasterService, ConfigService } from '@sunbird/shared';
import { PlayerService, LearnerService, UserService, CoursesService, GeneraliseLabelService } from '@sunbird/core';
import * as _ from 'lodash-es';
import { ActivatedRoute, Router } from '@angular/router';
import { takeUntil, mergeMap, tap, delay } from 'rxjs/operators';
import { Subject } from 'rxjs';
import dayjs from 'dayjs';

@Component({
  selector: 'app-batch-info',
  templateUrl: './batch-info.component.html',
  styleUrls: ['./batch-info.component.scss']
})
export class BatchInfoComponent implements OnInit, OnDestroy {

  @Input() enrolledBatchInfo: any;
  @Output() modelClose = new EventEmitter;
  @Output() routeChanged = new EventEmitter();
  public userDetails = {};
  public hasOngoingBatches = false;
  public enrolledBatches: Array<any> = [];
  public openForEnrollBatches: Array<any> = [];
  public disableEnrollBtn = false;
  public unsubscribe = new Subject<void>();
  public enrollInteractEdata;
  public resumeInteractEdata;

  constructor(public resourceService: ResourceService, public playerService: PlayerService, public configService: ConfigService,
    public learnerService: LearnerService, public userService: UserService, public toasterService: ToasterService,
    public coursesService: CoursesService, public router: Router, public generaliseLabelService: GeneraliseLabelService,
    public activatedRoute: ActivatedRoute) {
      this.resumeInteractEdata = {
        id: 'resume',
        type: 'click',
        pageid: 'batch-info'
      };
      this.enrollInteractEdata = {
        id: 'enroll',
        type: 'click',
        pageid: 'batch-info'
      };
    }

  ngOnInit() {
    if (this.enrolledBatchInfo.onGoingBatchCount) {
      this.hasOngoingBatches = true;
      this.enrolledBatches = _.concat(this.enrolledBatchInfo.inviteOnlyBatch.ongoing, this.enrolledBatchInfo.openBatch.ongoing);
    } else {
      this.enrolledBatches = _.concat(this.enrolledBatchInfo.inviteOnlyBatch.expired, this.enrolledBatchInfo.openBatch.expired);
      this.getAllOpenBatchForCourse().pipe(takeUntil(this.unsubscribe))
      .subscribe(data => {
        this.openForEnrollBatches = _.get(data, 'result.response.content') || [];
        this.fetchUserDetails(_.map(this.openForEnrollBatches, batch => batch.createdBy));
      });
    }
    this.fetchUserDetails(_.map(this.enrolledBatches, batch => batch.batch.createdBy));
  }
  private getAllOpenBatchForCourse() {
    const option = {
      url: this.configService.urlConFig.URLS.BATCH.GET_BATCHS,
      data: {
        request: {
          filters: {
            status: [ '1' ],
            enrollmentType: 'open',
            courseId: this.enrolledBatchInfo.courseId
          },
          offset: 0,
          sort_by: { createdDate: 'desc' }
        }
      }
    };
    return this.learnerService.post(option);
  }
  public handleResumeEvent(event) {
    this.routeChanged.emit(false);
    event.mimeType = 'application/vnd.ekstep.content-collection'; // to route to course page
    event.contentType = 'Course'; // route to course page
    event.primaryCategory = 'Course';
    this.playerService.playContent(event);
  }
  public handleEnrollmentEndDate(batchDetails) {
    const enrollmentEndDate = dayjs(_.get(batchDetails, 'enrollmentEndDate')).format('YYYY-MM-DD');
    const systemDate = dayjs();
    const disableEnrollBtn = enrollmentEndDate ? dayjs(enrollmentEndDate).isBefore(systemDate) : false;
    return disableEnrollBtn;
  }
  public handleStartDate(batchDetails) {
    const batchStartDate = dayjs(_.get(batchDetails, 'startDate')).format('YYYY-MM-DD');
    const systemDate = dayjs();
    const isJoinNotEnabled = batchStartDate ? dayjs(batchStartDate).isAfter(systemDate) : false;
    return isJoinNotEnabled;
  }
  public handleEnrollEvent(event) {
    this.disableEnrollBtn = true;
    const options = {
      url: this.configService.urlConFig.URLS.COURSE.ENROLL_USER_COURSE,
      data: {
        request: {
          courseId: event.courseId,
          userId: this.userService.userid,
          batchId: event.identifier
        }
      }
    };
    this.learnerService.post(options).pipe(
      tap(data => {
        this.toasterService.success(this.resourceService.messages.smsg.m0036);
      }),
      delay(2000), // wait for data to sync
      mergeMap(data => this.coursesService.getEnrolledCourses()), // fetch enrolled course
    ).subscribe(data => {
      const textbook = _.get(this.activatedRoute, 'snapshot.queryParams.textbook');
      const queryParams = textbook ? { textbook } : {};
      this.router.navigate(['/learn/course', event.courseId, 'batch', event.identifier], { queryParams }).then(res => {
        this.routeChanged.emit(true);
      });
    }, (err) => {
      this.disableEnrollBtn = false;
      this.toasterService.error(this.resourceService.messages.emsg.m0001);
    });
  }
  private fetchUserDetails(userIds = []) {
    if (!userIds.length) {
      return;
    }
    const option = {
      url: this.configService.urlConFig.URLS.ADMIN.USER_SEARCH,
      data: {
        request: {
          filters: { identifier: _.compact(_.uniq(userIds)) }
        }
      }
    };
    this.learnerService.post(option).pipe(takeUntil(this.unsubscribe))
    .subscribe(({result}) => _.forEach(_.get(result, 'response.content'), user => this.userDetails[user.identifier] = user));
  }
  ngOnDestroy() {
    this.unsubscribe.next();
    this.unsubscribe.complete();
  }
}
<app-modal-wrapper (dismiss)="modelClose.emit()" [config]="{disableClose: false}">
  <ng-template sbModalContent>
    <div class="sb-modal">
      <div class="transition ui dimmer page modals active visible">
        <div class="ui modal transition active visible normal">
          <button aria-label="close dialog" mat-dialog-close class="mat-close-btn">
            <span>&times;</span>
          </button>
          <!--Header-->
          <div class="sb-modal-header">
            {{resourceService.frmelmnts?.lbl?.sltBtch}}
          </div>
          <!--/Header-->
          <!--Content-->
          <div class="sb-modal-content">
            <div *ngIf="!hasOngoingBatches" class="h4-title font-weight-bold mb-15">
              {{resourceService.frmelmnts?.lbl?.exprdbtch}}</div>
            <div *ngFor="let batchDetails of enrolledBatches" class="batch-row mb-15">
              <div class="batch-name font-weight-bold d-block mb-15">{{batchDetails.batch.name}}</div>
              <div class="d-flex">
                <div class="column px-10"><i class="calendar outline icon"></i></div>
                <div class="column">
                  <div class="date batch-date">
                    <span class="d-block mb-5">
                      <b class="font-weight-bold">
                        {{resourceService.frmelmnts?.lbl?.startdate}} :
                      </b>
                      {{batchDetails.batch.startDate | dateFormat}}
                    </span>
                    <span class="d-block mb-5"><b class="font-weight-bold">{{resourceService.frmelmnts?.lbl?.enddate}}
                        : </b>
                      {{batchDetails.batch.endDate | dateFormat}}</span>
                    <span
                      *ngIf="userDetails[batchDetails.batch.createdBy] && userDetails[batchDetails.batch.createdBy].firstName"
                      class="d-block">{{resourceService.frmelmnts?.lbl?.courseCreatedBy}}: {{
                      userDetails[batchDetails.batch.createdBy].firstName}}</span>
                  </div>
                </div>
                <div class="column ml-auto">
                  <button appTelemetryInteract [telemetryInteractEdata]="resumeInteractEdata"
                    [telemetryInteractObject]="{id: batchDetails.identifier, type:'CourseBatch', ver:'1.0'}"
                    [telemetryInteractCdata]="[{ type: 'course', id: batchDetails.courseId}]" tabindex="0"
                    (click)="handleResumeEvent(batchDetails)"
                    class="sb-btn sb-btn-normal sb-btn-outline-primary">{{resourceService.frmelmnts?.btn?.resume}}</button>
                </div>
              </div>
            </div>
            <div *ngIf="!hasOngoingBatches && openForEnrollBatches.length" class="ui divider"></div>
            <div *ngIf="!hasOngoingBatches && openForEnrollBatches.length" class="h4-title font-weight-bold mb-15">
              {{resourceService.frmelmnts?.lbl?.opndbtch}}
            </div>
            <div *ngIf="!hasOngoingBatches && openForEnrollBatches.length">
              <div *ngFor="let batchDetails of openForEnrollBatches" class="batch-row mb-15">
                <div class="batch-name font-weight-bold d-block mb-15">{{batchDetails.name}}</div>
                <div class="d-flex">
                  <div class="column px-10"><i class="calendar outline icon"></i></div>
                  <div class="column">
                    <div class="date batch-date">
                      <span class="d-block mb-5"><b
                          class="font-weight-bold">{{resourceService.frmelmnts?.lbl?.startdate}} :
                        </b>
                        {{batchDetails.startDate | dateFormat}}</span>
                      <span class="d-block mb-5"><b class="font-weight-bold">{{resourceService.frmelmnts?.lbl?.enddate}}
                          :
                        </b>
                        {{batchDetails.endDate | dateFormat}}</span>
                      <span *ngIf="userDetails[batchDetails.createdBy] && userDetails[batchDetails.createdBy].firstName"
                        class="d-block">{{resourceService.frmelmnts?.lbl?.courseCreatedBy}}:
                        {{ userDetails[batchDetails.createdBy].firstName}}</span>
                    </div>
                  </div>
                  <div class="column ml-auto">
                    <button appTelemetryInteract [telemetryInteractEdata]="enrollInteractEdata"
                      [telemetryInteractObject]="{id: batchDetails.identifier, type:'CourseBatch', ver:'1.0', rollup:{l1: batchDetails.courseId,l2: batchDetails.identifier}}"
                      [telemetryInteractCdata]="[{ type: 'course', id: batchDetails.courseId}]"
                      [disabled]="(handleEnrollmentEndDate(batchDetails) || handleStartDate(batchDetails) || disableEnrollBtn)"
                      [ngClass]="{'sb-btn-disabled': (handleEnrollmentEndDate(batchDetails) || handleStartDate(batchDetails) || disableEnrollBtn)}"
                      tabindex="0" (click)="handleEnrollEvent(batchDetails)"
                      class="sb-btn sb-btn-normal sb-btn-outline-primary">{{resourceService?.frmelmnts?.btn?.enroll}}</button>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </ng-template>
</app-modal-wrapper>

./batch-info.component.scss

@use "@project-sunbird/sb-styles/assets/mixins/mixins" as *;

.batch-row {
  max-height: calculateRem(200px);

  .batch-name {
    color: var(--gray-400);
  }
  .batch-date{
      span {
          font-size: var(--h5-font-size);
      }
  }

}

.ui {
  &.divider {
    margin-left: calculateRem(-16px);
    margin-right: calculateRem(-16px);
  }
}

.h4-title {
  color: var(--primary-color);
}


Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""