import {
AfterContentInit, ChangeDetectionStrategy, Component, ContentChild, Directive, ElementRef, EventEmitter,
forwardRef, Input, Output, Renderer2
} from '@angular/core';
import { HomeworksManager } from '../../core/manager';
const COMPONENT: string = 'tab';
@Component({
selector: 'works-tab',
template: ``,
changeDetection: ChangeDetectionStrategy.Default
})
export class WorksTab extends HomeworksManager {
@Output()
activeChange: EventEmitter = new EventEmitter();
@Output('move')
onMove: EventEmitter = new EventEmitter();
private $element: JQuery;
private wrapperElement?: Element = null;
private _active: number = 0;
constructor(
protected renderer: Renderer2,
private elementRef: ElementRef
) {
super(
renderer,
COMPONENT
);
this.wrapperElement = this.renderer.createElement('div');
this.renderer.appendChild(this.elementRef.nativeElement.parentNode, this.wrapperElement);
this.wrapperElement.setAttribute('class', 'works-step-wrapper');
this.wrapperElement.appendChild(this.elementRef.nativeElement);
}
@Input()
get active(): number {
return this._active;
}
set active(value: number) {
const oldValue: number = this._active;
this._active = value;
if (this.$element) {
if (oldValue !== value) {
this.$element.triggerHandler('step.set', value);
}
}
this.activeChange.emit(value);
};
@Input()
set class(value: string) {
this.setPropagateChildClass(this.elementRef.nativeElement, this.wrapperElement, value);
}
ngOnInit() {
this.$element = jQuery(this.elementRef.nativeElement);
};
ngAfterViewInit() {
this.$element.tab({
active: this.active
});
this.$element
.on('tab.move', (event: JQuery.Event, tabInfo: homeworks.TabEvent) => {
if (this.active !== tabInfo.index) {
this.active = tabInfo.index;
this.onMove.emit(tabInfo);
}
});
}
}
@Directive({
selector: 'works-tab-title'
})
export class WorksTabTitle extends HomeworksManager {
constructor(
protected renderer: Renderer2,
public elementRef: ElementRef
) {
super(
renderer,
COMPONENT
);
}
}
@Component({
selector: 'works-tab-item',
template: ``
})
export class WorksTabItem extends HomeworksManager implements AfterContentInit {
@ContentChild(forwardRef(() => WorksTabTitle)) titleChild: WorksTabTitle;
private $element: JQuery;
private titleElement: Element | null = null;
private contentElement: Element | null = null;
constructor(
protected renderer: Renderer2,
private elementRef: ElementRef
) {
super(
renderer,
COMPONENT
);
}
private _title: string;
@Input()
get title(): string {
return this._title;
}
set title(value: string) {
this._title = value;
if (this.titleElement !== null && !this.titleChild) {
this.titleElement.textContent = this.title;
}
}
ngOnInit() {
let container: Element[] | Element = this.elementRef.nativeElement.parentNode.parentNode.querySelector('.tab-container');
if (!container) {
const containerElement: Element = this.renderer.createElement('div');
this.renderer.appendChild(this.elementRef.nativeElement.parentNode.parentNode, containerElement);
this.renderer.addClass(containerElement, 'tab-container');
container = containerElement;
}
this.titleElement = this.renderer.createElement('a');
this.renderer.appendChild(this.elementRef.nativeElement.parentNode, this.titleElement);
this.titleElement.setAttribute('href', '#');
this.renderer.addClass(this.titleElement, 'tab-item');
this.titleElement.textContent = this.title;
this.contentElement = this.renderer.createElement('div');
this.renderer.appendChild(container, this.contentElement);
this.renderer.addClass(this.contentElement, 'tab-container-item');
this.contentElement.appendChild(this.elementRef.nativeElement);
(container as Element).parentElement.appendChild((container as Element));
}
ngOnDestroy() {
this.contentElement.remove();
this.titleElement.remove();
}
ngAfterContentInit() {
if (this.titleChild)
this.titleElement.appendChild(this.titleChild.elementRef.nativeElement);
}
}