File

src/app/cursos/dashboard/dashboard.component.ts

Implements

OnInit OnDestroy

Metadata

selector app-dashboard
styleUrls dashboard.component.scss
templateUrl ./dashboard.component.html

Constructor

constructor(_cursosSource: CursosSourceService, elementRef: ElementRef)

Methods

ngOnInit
ngOnInit()
Returns : void
Static suscribir
suscribir(type: string, event: any)

Método para suscribir o desuscribirse a un subject


Parameters :
  • type
  • event
Returns : void
Protected _suscribirseSubject
_suscribirseSubject()

Se suscribe a un subject, a partir de ese momento empezará a recibir los cursos emitidos


Returns : void
Protected _suscribirseBehaviorSubject
_suscribirseBehaviorSubject()

Se suscribe a un behavior, recibirá el último curso emitido y posteriores los cursos emitidos


Returns : void
Protected _suscribirseReplaySubject
_suscribirseReplaySubject()

Se suscribe a un Replay, recibirá todos los cursos emitidos y posteriores los cursos emitidos


Returns : void
Static dragStart
dragStart(event: any, curso: Curso, index: any)

handler para el comienzo del drag


Parameters :
  • event
  • curso
  • index
Returns : void
Static dragEnd
dragEnd(event: any)

Handler para el final de drag


Parameters :
  • event
Returns : void
Static drop
drop(event: any)

Handler para el drop cuando se suelta el cursor sobre el contenedor destino


Parameters :
  • event
Returns : void
Protected _addItem
_addItem(array: Curso[], item: any)

Devuelve un nuevo array con el item recibido, inmutable


Parameters :
  • array : Array
  • item
Returns : void
ngOnDestroy
ngOnDestroy()

Cancela las suscripciones al destruirse el componente


Returns : void

Properties

_cursosSource
_cursosSource: CursosSourceService
Static catalogoCursos
catalogoCursos: Curso[]
Protected catalogoCursos$
catalogoCursos$: Observable<Curso>
Static containerDragDrop
containerDragDrop: string
Default value : containerCursos
Static CURSOS_TYPE
CURSOS_TYPE: any
Static cursosPublicados
cursosPublicados: Curso[]
Static cursosSuscritos
cursosSuscritos: Curso[]
Static draggedCurso
draggedCurso: Curso
Static existeSuscripcion
existeSuscripcion: boolean
Default value : false
Static indexDraggedCurso
indexDraggedCurso: number
Static lblBehvNoSubs
lblBehvNoSubs: boolean
Default value : true
Static lblReplayNoSubs
lblReplayNoSubs: boolean
Default value : true
Static lblSubjNoSubs
lblSubjNoSubs: boolean
Default value : true
Static msgs
msgs: Message[]
Static SUSCRIP_TYPE
SUSCRIP_TYPE: any
Protected suscripcion
suscripcion: Subscription
import { Observable } from 'rxjs/Observable';
import {Subscription } from 'rxjs/Subscription';
import { CursosSourceService } from './../cursos-source.service';
import { Component, OnInit, OnDestroy, ElementRef } from '@angular/core';
import {Message} from 'primeng/primeng';
import { CURSOS_TYPE, SUSCRIPTION_TYPE, Curso } from './../../util/cursos';


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

  public catalogoCursos: Array<Curso>;
  private catalogoCursos$: Observable<Curso>;
  public cursosPublicados: Array<Curso> = [];
  public cursosSuscritos: Array<Curso> = [];
  public draggedCurso: Curso;
  public containerDragDrop = 'containerCursos';
  public indexDraggedCurso: number;
  public msgs: Array<Message> = [];
  public lblSubjNoSubs= true;
  public lblBehvNoSubs = true;
  public lblReplayNoSubs = true;
  private suscripcion = new Subscription ();
  public existeSuscripcion = false;
  public CURSOS_TYPE;
  public SUSCRIP_TYPE;


 constructor(public _cursosSource: CursosSourceService,  private elementRef: ElementRef) {
  }

ngOnInit() {
  this.CURSOS_TYPE = CURSOS_TYPE;
  this.SUSCRIP_TYPE = SUSCRIPTION_TYPE;
  // se suscribe al CC de los cursos
  this._cursosSource.catalogoCursos$.subscribe(v => this.catalogoCursos = v );
  // se suscribe a los cursos publicados
  this._cursosSource.cursosPublicadosSubject$
  .subscribe(c => this.cursosPublicados = this._addItem(this.cursosPublicados, c) );
 }

/**
 * Método para suscribir o desuscribirse a un subject
 * @param {string} type
 * @param {any} event
 * @memberOf DashboardComponent
 */
public suscribir(type: string, event) {
  // event.checked=false cuando usuario clica para suscribirse, si no se entiende que quiere desuscribirse
  const suscribir = !event.checked;
  // siempre cancelamos suscripción y vaciamos array de suscritos
  this.suscripcion.unsubscribe();
  this.cursosSuscritos = [];
  this.existeSuscripcion = suscribir;
  if (suscribir) {
      switch (type) {
        case this.SUSCRIP_TYPE.SUBJECT :
          this._suscribirseSubject();
          break;
        case  this.SUSCRIP_TYPE.BEHAVIOR:
          this._suscribirseBehaviorSubject();
          break;
        case  this.SUSCRIP_TYPE.REPLAY:
          this._suscribirseReplaySubject();
          break;
      }
   }
}

/**
 * Se suscribe a un subject, a partir de ese momento empezará a recibir los cursos emitidos
 * @private
 * @memberOf DashboardComponent
 */
private _suscribirseSubject () {
  // controladores para labels de suscripción. Se utiliza desestructuración
  [this.lblSubjNoSubs, this.lblBehvNoSubs, this.lblReplayNoSubs] = [false, true, true];
  this.suscripcion = this._cursosSource.cursosSuscritosSubject$
     .subscribe(c => this.cursosSuscritos = this._addItem(this.cursosSuscritos, c));
}

/**
 * Se suscribe a un behavior, recibirá el último curso emitido y posteriores los cursos emitidos
 * @private
 * @memberOf DashboardComponent
 */
private _suscribirseBehaviorSubject () {
  // controladores para labels de suscripción. Se utiliza desestructuración
  [this.lblSubjNoSubs, this.lblBehvNoSubs, this.lblReplayNoSubs] = [true, false, true];
  // caso particular el de behavior-> siempre viene un valor, al menos el inicial, si viene el inicial, no lo añadimos
  this.suscripcion = this._cursosSource.cursosSuscritosBehaviorSubject$
      .subscribe(c => {if (c) {this.cursosSuscritos = this._addItem(this.cursosSuscritos, c); }});
}

/**
 * Se suscribe a un Replay, recibirá todos los cursos emitidos y posteriores los cursos emitidos
 * @private
 * @memberOf DashboardComponent
 */
private _suscribirseReplaySubject () {
  // controladores para labels de suscripción. Se utiliza desestructuración
  [this.lblSubjNoSubs, this.lblBehvNoSubs, this.lblReplayNoSubs] = [true, true, false];
  this.suscripcion = this._cursosSource.cursosSuscritosReplaySubject$
    .subscribe(c => this.cursosSuscritos = this._addItem(this.cursosSuscritos, c));
}

/****** Eventos para el Drag&Drop ********/

/**
 * handler para el comienzo del drag
 * @param {any} event
 * @param {any} curso
 * @param {any} index
 * @memberOf DashboardComponent
 */
public dragStart(event, curso: Curso, index) {
  this.draggedCurso = curso;
  this.indexDraggedCurso = index;
}

/**
 * Handler para el final de drag
 * @param {any} event
 * @memberOf DashboardComponent
 */
public dragEnd(event) {
  this.draggedCurso = null;
  }

/**
 * Handler para el drop cuando se suelta el cursor sobre el contenedor destino
 * @param {any} event
 * @memberOf DashboardComponent
 */
public drop(event) {
  if (this.draggedCurso) {
   this._cursosSource.publicarCurso(this.draggedCurso);
   this.catalogoCursos = this.catalogoCursos.filter((valor, i ) => {return i !== this.indexDraggedCurso; });
   this.msgs = [{severity: 'success', summary: 'Publicado', detail: this.draggedCurso.nombre}];
   this.draggedCurso = null;
  }
}

/**
 * Devuelve un nuevo array con el item recibido, inmutable
 * @private
 * @param {Array<Curso>} array
 * @param {any} item
 * @returns
 * @memberOf DashboardComponent
 */
private _addItem (array: Array<Curso>, item) {
  return [...array, item];
}

/**
 * Cancela las suscripciones al destruirse el componente
 * @memberOf DashboardComponent
 */
ngOnDestroy () {
  this.suscripcion.unsubscribe();
 }
}
<p-growl [(value)]="msgs" sticky="sticky">
</p-growl>
<div class="header">
    <a class="avatar" href="https://github.com/migueluvieu" title="My Repository"> <span><img src="./../../../assets/images/avatar.png" /></span></a>
    <h1 class="title"> Suscripciones virtuales a Cursos</h1>
</div>
<section class="principal">

    <p> (*) Arrastra Cursos Disponibles en Cursos Publicados, elige Suscripción y recíbelos en Cursos Suscritos</p>
    <div class="ui-grid ui-grid-pad ui-grid-responsive principal">

        <div class="ui-grid-row">
            <div class="ui-grid-col-4 ui-widget-content cursos-disponibles">
                <h2>Cursos Disponibles</h2>
                <p>(*) Solo puedes ver el temario de cada curso</p>
                <ul style="margin:0;padding:0.1rem">
                    <li *ngFor="let curso of catalogoCursos; let i = index" class="ui-state-default ui-helper-clearfix" [pDraggable]="containerDragDrop" (onDragStart)="dragStart($event,curso, i)" (onDragEnd)="dragEnd($event)">
                        <app-curso-info [curso]="curso" [type]="CURSOS_TYPE.DISPONIBLES"></app-curso-info>
                    </li>
                </ul>
            </div>

            <div class="ui-grid-col-4 ui-widget-content " [pDroppable]="containerDragDrop" (onDrop)="drop($event)" [ngClass]="{'ui-state-highlight':draggedCurso}">
                <h2>Cursos Publicados</h2>
                <p>(*) Solo puedes ver el temario de cada curso</p>
                <div *ngIf="cursosPublicados.length===0; else cursosPublicadostpl">

                    <div class="arrastrar-aqui">
                        Arrastra aquí los cursos para publicarlos
                    </div>
                </div>
                <ng-template #cursosPublicadostpl>
                    <ul style="margin:0;padding:0.1rem">
                        <li *ngFor="let curso of cursosPublicados; let i = index" class="ui-state-default ui-helper-clearfix">
                            <app-curso-info [curso]="curso" [type]="CURSOS_TYPE.PUBLICADOS"></app-curso-info>
                        </li>
                    </ul>
                </ng-template>

            </div>


            <div class="ui-grid-col-4 ui-widget-content cursos-suscritos">
                <h2>Cursos Suscritos</h2>
                <p>(*) Ya puedes ver los videos de los cursos!!!</p>
                <div *ngIf="!existeSuscripcion ; else cursosSuscritostpl"> ...pero aún no estás suscrito a ninguno </div>

                <ng-template #cursosSuscritostpl>
                    <div *ngIf="cursosSuscritos.length===0"> Debes publicar algún curso a partir de este momento para que aparezca aquí </div>
                    <ul style="margin:0;padding:0.1rem">
                        <li *ngFor="let curso of cursosSuscritos; let i = index" class="ui-state-default ui-helper-clearfix">
                            <app-curso-info [curso]="curso" [type]="CURSOS_TYPE.SUSCRITOS"></app-curso-info>
                        </li>
                    </ul>
                </ng-template>
            </div>
        </div>
    </div>
</section>

<section>

    <div class="ui-g">

        <p-fieldset class="ui-g-12 ui-lg-4 ui-state-active" legend="Suscripción (Subject)" [toggleable]="true">
            <p>Suscríbete ahora y recibirás todos los cursos PUBLICADOS a partir de este momento.</p>
            <p-toggleButton class="ui-button-success" [(ngModel)]="lblSubjNoSubs" onLabel="¡¡Quiero suscribirme!!" offLabel="Cancelar suscripción..." onIcon="fa-hand-peace-o" offIcon="fa-hand-scissors-o" (onChange)="suscribir(SUSCRIP_TYPE.SUBJECT,$event)"></p-toggleButton>
        </p-fieldset>
        <p-fieldset class="ui-g-12 ui-lg-4 ui-state-active" legend="Suscripción (Behavior)" [toggleable]="true">
            <p>Suscríbete ahora y recibirás los cursos PUBLICADOS desde ahora Y EL ACTUAL.</p>
            <p-toggleButton class="ui-button-success" [(ngModel)]="lblBehvNoSubs" onLabel="¡¡Quiero suscribirme!!" offLabel="Cancelar suscripción..." onIcon="fa-hand-peace-o" offIcon="fa-hand-scissors-o" (onChange)="suscribir(SUSCRIP_TYPE.BEHAVIOR,$event)"></p-toggleButton>
        </p-fieldset>
        <p-fieldset class="ui-g-12 ui-lg-4 ui-state-active" legend="Suscripción (Replay)" [toggleable]="true">
            <p>Suscríbete ahora y recibirás todos los cursos PUBLICADOS y los que se PUBLICARÁN.</p>
            <p-toggleButton class="ui-button-success" [(ngModel)]="lblReplayNoSubs" onLabel="¡¡Quiero suscribirme!!" offLabel="Cancelar suscripción..." onIcon="fa-hand-peace-o" offIcon="fa-hand-scissors-o" (onChange)="suscribir(SUSCRIP_TYPE.REPLAY,$event)"></p-toggleButton>
        </p-fieldset>
    </div>

</section>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""