/** * @author Martin Karkowski * @email m.karkowski@zema.de * @create date 2019-02-20 09:19:06 * @modify date 2020-07-22 22:06:39 * @desc [description] */ import React from 'react'; import { Col, Container, Modal, Nav, Row } from 'react-bootstrap'; import { FaTimesCircle } from 'react-icons/fa'; import DefaultNavbar from '../defaultNavbar'; import DynamicRenderer from '../dynamic/dynamicRenderer' import { DynamicRendererProps } from '../dynamic/dynamicRenderer'; import Selection, { SelecitonProps } from './selection'; const mainStyle = { minHeight: '90vh', } const sidebarStyle = { padding: '10px', background: "primary" } const contentStyle = { padding: '10px', } export interface ITab { label: string, id: string, delteable: boolean } export interface LayoutProps extends SelecitonProps { onResize?: () => void; onMount?: (ref: React.RefObject, layout: Layout) => void; onUnmount?: () => void; onNewTab?: () => Promise; onTabSelect?: (oldTabId: string, newTabId: string) => Promise; onTabDelete?: (tabId: string) => Promise; onNoTabSelected?: () => Promise; tabs?: { allowNewTabs?: boolean; active: string, items: ITab[] } } export interface ModalSettings { content: DynamicRendererProps; header: string; size?: 'sm' | 'lg' | 'xl' } export interface LayoutState { update: null } class Layout extends React.Component, LayoutState> { protected _ref: React.RefObject; protected _handleResize: () => void; componentDidMount() { const _this = this; function handleResize() { if (typeof _this.props.onResize === 'function') { _this.props.onResize(); } } if (typeof this.props.onMount === 'function') { this.props.onMount(this._ref, this); } this._handleResize = handleResize; window.addEventListener('resize', this._handleResize); } componentWillUnmount() { window.removeEventListener('resize', this._handleResize); // Call the unmount if (typeof this.props.onUnmount === 'function') { this.props.onUnmount(); } } constructor(props) { super(props); this._ref = React.createRef(); } public requestRerender() { this.setState({ update: null }) } public openPopup(settings: ModalSettings){ this._modalSettings = settings; this._modalVisible = true; this.requestRerender(); const _this = this; return () => { _this._modalVisible = false; _this.requestRerender(); } } protected _modalVisible = false; protected _modalSettings: ModalSettings; public render() { const _this = this; // Define a Select Tab Function. const selectTab = async (id: string) => { if (typeof this.props.onTabSelect === 'function') { // Call the Async Function to select a Tab. if (await this.props.onTabSelect(this.props.tabs.active, id)) { this.props.tabs.active = id; this.requestRerender(); return true; } return false; } else { // Assign the Tab ID this.props.tabs.active = id; this.requestRerender(); return true; } } const delteTab = async (id: string, idx: number) => { let removed = false; if (typeof _this.props.onTabDelete === 'function') { // Call the Async Function to select a Tab. if (await _this.props.onTabDelete(id)) { removed = true; } } else { removed = true; } if (removed) { // Remove the Items. _this.props.tabs.items.splice(idx, 1); // Check if the active element has been removed: if (id == _this.props.tabs.active) { // Assign the ID of the Element. const _idx = _this.props.tabs.items.length > idx ? idx : _this.props.tabs.items.length - 1; if (_idx !== -1){ // Assign the First ID. const _newTabId = _this.props.tabs.items.length > _idx ? _this.props.tabs.items[_idx].id : null; if (_newTabId !== null) { if (!selectTab(_newTabId) && typeof _this.props.onNoTabSelected === 'function') { // Send a Warning, that no Tabs has been selected await _this.props.onNoTabSelected(); } } else if (typeof _this.props.onNoTabSelected === 'function') { // Send a Warning, that no Tabs has been selected await _this.props.onNoTabSelected(); } } else if (typeof _this.props.onNoTabSelected === 'function') { // Send a Warning, that no Tabs has been selected await _this.props.onNoTabSelected(); } } _this.requestRerender(); } } return (<> {this.props.tabs ? : '' } {/* style={{height: '100%'}} */}
{/* Render a Modal dynamically. */} {this._modalSettings != undefined? {this._modalSettings.header} {/* Render the dynamic Component */} : ''} ); } } export default Layout;