File
Implements
Metadata
selector |
app-dashboard |
styleUrls |
dashboard.component.scss |
templateUrl |
./dashboard.component.html |
Methods
ngOnInit
|
ngOnInit()
|
|
Returns : void
|
Static suscribir
|
suscribir(type: string, event: any)
|
|
Método para suscribir o desuscribirse a un subject
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
Returns : void
|
Static dragEnd
|
dragEnd(event: any)
|
|
Handler para el final de drag
Returns : void
|
Static drop
|
drop(event: any)
|
|
Handler para el drop cuando se suelta el cursor sobre el contenedor destino
Returns : void
|
Protected _addItem
|
_addItem(array: Curso[], item: any)
|
|
Devuelve un nuevo array con el item recibido, inmutable
Returns : void
|
ngOnDestroy
|
ngOnDestroy()
|
|
Cancela las suscripciones al destruirse el componente
Returns : void
|
Static catalogoCursos
|
catalogoCursos: 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 with directive