139 lines
4.7 KiB
TypeScript
Raw Normal View History

// (C) Copyright 2015 Martin Dougiamas
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { Component, Input, Output, OnInit, OnDestroy, ElementRef, EventEmitter, ContentChild, TemplateRef } from '@angular/core';
import { CoreTabsComponent } from './tabs';
2018-01-24 11:35:49 +01:00
import { Content } from 'ionic-angular';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreNavBarButtonsComponent } from '../navbar-buttons/navbar-buttons';
/**
* A tab to use inside core-tabs. The content of this tab will be displayed when the tab is selected.
*
* You must provide either a title or an icon for the tab.
*
* The tab content MUST be surrounded by ng-template. This component uses ngTemplateOutlet instead of ng-content because the
* latter executes all the code immediately. This means that all the tabs would be initialized as soon as your view is
* loaded, leading to performance issues.
*
* Example usage:
*
* <core-tabs selectedIndex="1">
* <core-tab [title]="'core.courses.timeline' | translate" (ionSelect)="switchTab('timeline')">
* <ng-template> <!-- This ng-template is required. -->
* <!-- Tab contents. -->
* </ng-template>
* </core-tab>
* </core-tabs>
*/
@Component({
selector: 'core-tab',
template: '<ng-container *ngIf="loaded" [ngTemplateOutlet]="template"></ng-container>'
})
export class CoreTabComponent implements OnInit, OnDestroy {
@Input() title?: string; // The tab title.
@Input() icon?: string; // The tab icon.
@Input() badge?: string; // A badge to add in the tab.
@Input() badgeStyle?: string; // The badge color.
2018-03-15 15:24:22 +01:00
@Input() enabled = true; // Whether the tab is enabled.
@Input() show = true; // Whether the tab should be shown.
@Input() id?: string; // An ID to identify the tab.
@Output() ionSelect: EventEmitter<CoreTabComponent> = new EventEmitter<CoreTabComponent>();
2018-01-29 10:05:20 +01:00
@ContentChild(TemplateRef) template: TemplateRef<any>; // Template defined by the content.
2018-01-24 11:35:49 +01:00
@ContentChild(Content) scroll: Content;
element: HTMLElement; // The core-tab element.
loaded = false;
constructor(protected tabs: CoreTabsComponent, element: ElementRef, protected domUtils: CoreDomUtilsProvider) {
this.element = element.nativeElement;
}
/**
* Component being initialized.
*/
2018-01-29 10:05:20 +01:00
ngOnInit(): void {
this.tabs.addTab(this);
}
/**
* Component destroyed.
*/
2018-01-29 10:05:20 +01:00
ngOnDestroy(): void {
this.tabs.removeTab(this);
}
/**
* Select tab.
*/
2018-01-29 10:05:20 +01:00
selectTab(): void {
this.element.classList.add('selected');
2018-01-24 11:35:49 +01:00
this.loaded = true;
this.ionSelect.emit(this);
this.showHideNavBarButtons(true);
2018-01-24 11:35:49 +01:00
// Setup tab scrolling.
setTimeout(() => {
if (this.scroll) {
2018-01-29 10:05:20 +01:00
this.scroll.getScrollElement().onscroll = (e): void => {
2018-01-24 11:35:49 +01:00
this.tabs.showHideTabs(e);
2018-01-29 10:05:20 +01:00
};
2018-01-24 11:35:49 +01:00
}
}, 1);
}
/**
* Unselect tab.
*/
2018-01-29 10:05:20 +01:00
unselectTab(): void {
this.element.classList.remove('selected');
this.showHideNavBarButtons(false);
}
/**
* Get all child core-navbar-buttons. We need to use querySelectorAll because ContentChildren doesn't work with ng-template.
* https://github.com/angular/angular/issues/14842
*
* @return {CoreNavBarButtonsComponent[]} List of component instances.
*/
protected getChildrenNavBarButtons(): CoreNavBarButtonsComponent[] {
const elements = this.element.querySelectorAll('core-navbar-buttons'),
instances: CoreNavBarButtonsComponent[] = [];
for (let i = 0; i < elements.length; i++) {
const instance = this.domUtils.getInstanceByElement(elements[i]);
if (instance) {
instances.push(instance);
}
}
return instances;
}
/**
* Show all hide all children navbar buttons.
*
* @param {boolean} show Whether to show or hide the buttons.
*/
protected showHideNavBarButtons(show: boolean): void {
const instances = this.getChildrenNavBarButtons();
for (const i in instances) {
instances[i].forceHide(!show);
}
}
}