import { Iterable } from 'ix'; import * as React from 'react'; import { Alert, Col, DropdownButton, Grid, MenuItem, PageHeader, Row, } from 'react-bootstrap'; import { Observable } from 'rxjs'; import { BaseView, BaseViewProps } from '../React'; import { ComponentDemoViewModel } from './ComponentDemoViewModel'; import './ComponentDemo.less'; export type ViewActivator = ( component: any, componentRoute: string | undefined, responsive: boolean | undefined, ) => any; export interface ViewActivatorMap { [key: string]: ViewActivator; } export interface ComponentDemoProps { viewMap: ViewActivatorMap; responsive?: boolean; } export interface ComponentDemoViewProps extends BaseViewProps, ComponentDemoProps {} export class ComponentDemoView extends BaseView< ComponentDemoViewProps, ComponentDemoViewModel > { public static displayName = 'ComponentDemoView'; updateOn(viewModel: Readonly) { return [viewModel.columns.changed, viewModel.component.changed]; } render() { const { className, rest } = this.restProps(x => { const { viewMap, responsive } = x; return { viewMap, responsive }; }); const cols = this.viewModel.columns.value; return (
{this.renderHeader()} {this.wxr.renderConditional( this.viewModel.componentRoute.value === 'help', () => this.renderComponentView(), () => (
{this.renderComponentView()}
), )}
{this.renderDropdown(cols)}
); } private getComponentName() { return this.viewModel.component.value == null ? 'Invalid Component' : Object.getName(this.viewModel.component.value); } private renderHeader() { return this.wxr.renderConditional( this.viewModel.componentRoute.value !== 'help', () => ( {`${this.getComponentName()} Demo`} ), ); } private renderComponentView() { let view: any; const componentName = this.getComponentName(); const component = this.viewModel.component.value; if (component != null) { this.logger.debug(`Loading View for "${componentName}"...`); const activator = this.props.viewMap[componentName]; if (activator != null) { view = activator( component, this.viewModel.componentRoute.value, this.props.responsive, ); } } if (view == null) { view = ( {component == null ? `No Component for ${this.viewModel.componentRoute.value}` : `No View Mapped for ${componentName}`} ); } else { this.logger.debug(`Rendering View...`, view); } return view; } private renderDropdown(cols: number) { return ( x.setColumns)} > {Iterable.range(1, 13) .reverse() .map(x => x % 13) .map(x => ( {x === 0 ? 'Full Width' : x} )) .toArray()} ); } }