angular/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts

98 lines
3 KiB
TypeScript
Raw Normal View History

/// <reference types="resize-observer-browser" />
import {AfterViewInit, Component, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';
import {MatSlideToggleChange} from '@angular/material/slide-toggle';
import {MatTabNav} from '@angular/material/tabs';
import {Events, MessageBus, Route} from 'protocol';
import {Subscription} from 'rxjs';
import {ApplicationEnvironment} from '../application-environment/index';
import {Theme, ThemeService} from '../theme-service';
import {DirectiveExplorerComponent} from './directive-explorer/directive-explorer.component';
import {TabUpdate} from './tab-update/index';
2020-01-27 18:40:18 +00:00
@Component({
selector: 'ng-devtools-tabs',
templateUrl: './devtools-tabs.component.html',
styleUrls: ['./devtools-tabs.component.scss'],
2020-01-27 18:40:18 +00:00
})
export class DevToolsTabsComponent implements OnInit, OnDestroy, AfterViewInit {
@Input() angularVersion: string|undefined = undefined;
@ViewChild(DirectiveExplorerComponent) directiveExplorer: DirectiveExplorerComponent;
@ViewChild('navBar', {static: true}) navbar: MatTabNav;
activeTab: 'Components'|'Profiler'|'Router Tree' = 'Components';
2020-01-27 18:40:18 +00:00
inspectorRunning = false;
2021-02-07 13:15:42 +00:00
routerTreeEnabled = false;
showCommentNodes = false;
private _currentThemeSubscription: Subscription;
currentTheme: Theme;
routes: Route[] = [];
constructor(
public tabUpdate: TabUpdate, public themeService: ThemeService,
private _messageBus: MessageBus<Events>,
private _applicationEnvironment: ApplicationEnvironment) {}
ngOnInit(): void {
this._currentThemeSubscription =
this.themeService.currentTheme.subscribe((theme) => (this.currentTheme = theme));
this._messageBus.on('updateRouterTree', (routes) => {
this.routes = routes || [];
});
}
get tabs(): string[] {
const alwaysShown = ['Components', 'Profiler'];
return this.routes.length === 0 ? alwaysShown : [...alwaysShown, 'Router Tree'];
}
ngAfterViewInit(): void {
this.navbar.disablePagination = true;
}
ngOnDestroy(): void {
this._currentThemeSubscription.unsubscribe();
}
get latestSHA(): string {
return this._applicationEnvironment.environment.LATEST_SHA.slice(0, 8);
}
changeTab(tab: 'Profiler'|'Components'|'Router Tree'): void {
this.activeTab = tab;
this.tabUpdate.notify();
2021-02-07 13:15:42 +00:00
if (tab === 'Router Tree') {
this._messageBus.emit('getRoutes');
2021-02-07 13:15:42 +00:00
}
}
toggleInspector(): void {
this.toggleInspectorState();
this.emitInspectorEvent();
}
emitInspectorEvent(): void {
2020-01-27 18:40:18 +00:00
if (this.inspectorRunning) {
this._messageBus.emit('inspectorStart');
this.changeTab('Components');
2020-01-27 18:40:18 +00:00
} else {
this._messageBus.emit('inspectorEnd');
this._messageBus.emit('removeHighlightOverlay');
2020-01-27 18:40:18 +00:00
}
}
toggleInspectorState(): void {
this.inspectorRunning = !this.inspectorRunning;
}
toggleTimingAPI(change: MatSlideToggleChange): void {
change.checked ? this._messageBus.emit('enableTimingAPI') :
this._messageBus.emit('disableTimingAPI');
}
2020-01-27 18:40:18 +00:00
}