// tslint:disable:max-classes-per-file import * as React from 'react'; import { Tab, Tabs } from 'react-bootstrap'; import { Observable } from 'rxjs'; import { BaseView, BaseViewProps } from '../../React'; import { TabsViewModel } from './TabsViewModel'; export class TabRenderTemplate { public static displayName = 'TabViewTemplate'; protected readonly renderTemplateContainer: ( content: () => any, item: T, index: number, viewModel: Readonly>, view: TabsView, ) => any; constructor( protected readonly titleSelector: ( item: T, index: number, viewModel: Readonly>, view: TabsView, ) => string, protected readonly renderItem: ( item: T, index: number, viewModel: Readonly>, view: TabsView, ) => any = x => x.toString(), protected readonly keySelector: ( item: T, index: number, viewModel: Readonly>, view: TabsView, ) => any = (x, i) => i, renderTemplateContainer?: ( content: () => any, item: T, index: number, viewModel: Readonly>, view: TabsView, ) => any, ) { this.renderTemplateContainer = renderTemplateContainer || this.renderDefaultTemplateContainer; } protected renderDefaultTemplateContainer( content: () => any, item: T, index: number, viewModel: Readonly>, view: TabsView, ) { return ( {TabsView.wxr.renderConditional( index === viewModel.selectedIndex.value, content, )} ); } public render(viewModel: Readonly>, view: TabsView) { return viewModel.tabs.value.map((x, i) => { return this.renderTemplateContainer( () => this.renderItem(x, i, viewModel, view), x, i, viewModel, view, ); }); } } export interface TabsProps { template?: TabRenderTemplate; } export interface TabsViewProps extends BaseViewProps>, TabsProps {} export class TabsView extends BaseView> { public static displayName = 'TabsView'; updateOn(viewModel: Readonly>) { return [viewModel.tabs.changed, viewModel.selectedIndex.changed]; } render() { const { className, rest } = this.restProps(x => { const { template, children } = x; return { template, children }; }); return (
{this.renderTabs()}
); } private renderTabs() { return ( (this.props.template && this.renderDynamicTabs(this.props.template)) || this.renderStaticTabs() ); } private renderStaticTabs() { return ( x.selectIndex)} > {React.Children.map(this.props.children, (x: any, i: number) => { return React.cloneElement(x, { eventKey: i }); })} ); } private renderDynamicTabs(template: TabRenderTemplate) { return ( x.selectIndex)} > {template.render(this.viewModel, this)} ); } }