cluedin-widget
Version:
This project contains all the pages needed for browsing entities and searching them. The aim is to replace the CluedIn.Webapp project with this one when all the pages ( including the Admin page ) will be ported to REACT.
233 lines (180 loc) • 6.88 kB
JSX
import React, { Component } from 'react';
import wms from '../../../wms';
import ReactTabs from 'react-tabs';
import { getExcludedWidgets } from '../../userProfile';
import Grid from './Grid.jsx';
import Col from './Col.jsx';
import Row from './Row.jsx';
const defaultPlaceHolder = 'main';
const defaultGridSize = 4;
const Tab = ReactTabs.Tab;
const Tabs = ReactTabs.Tabs;
const TabList = ReactTabs.TabList;
const TabPanel = ReactTabs.TabPanel;
class CluedInLayout extends Component {
constructor(props) {
super(props);
this.excludeWidgets = getExcludedWidgets(props.type) || [];
}
renderWidgets(placeHolderName, widgets) {
const { entityId, type, isAdmin, lastVisitedDate } = this.props;
let filteredWidgets = this.filterWidgets(widgets, placeHolderName);
return (<Grid type={type} isAdmin={isAdmin} entityId={entityId} lastVisitedDate={lastVisitedDate} widgets={filteredWidgets}></Grid>);
}
renderWidget(widget) {
const { entityId, type, isAdmin, lastVisitedDate } = this.props;
return (<Grid type={type} isAdmin={isAdmin} entityId={entityId} lastVisitedDate={lastVisitedDate} widgets={[widget]}></Grid>);
}
buildTabMenu(tab, index) {
console.log('!!!----!!!');
console.log(tab);
return (<Tab key={index}>{tab.displayName}</Tab>);
}
getTabMenu(tabs) {
const result = tabs.map(this.buildTabMenu, this);
const { standAlone } = this.props;
let backStyle = { fontSize: '20px' };
if (standAlone) {
backStyle.display = 'none';
}
/*result.unshift(
<Tab key={-1}>
<i style={backStyle} className="fa fa-arrow-left">
</i>
</Tab>);*/
return result;
}
filterWidgets(widgets, placeHolderName) {
const { isAdmin } = this.props;
const excludeWidgets = this.excludeWidgets || [];
let filterByAdminFunc = (w)=> {
return (w.onlyAdmin) ? isAdmin : true;
};
let filterExcludedFunc = (w) => {
return excludeWidgets.indexOf(w.name) <= -1;
};
let filterByPlaceHolderFunc = (w) => {
if (w.place) {
return w.place.split('.')[0] === placeHolderName;
}
return defaultPlaceHolder === placeHolderName;
};
return widgets.filter(filterByAdminFunc).filter(filterExcludedFunc).filter(filterByPlaceHolderFunc);
}
getTabConfig(tab) {
const { widgetConfiguration } = this.props;
let widgetsWithSuggestedSearches = widgetConfiguration.widgets.slice(0);
let widgets = this.filterWidgets(widgetsWithSuggestedSearches, tab.name).map((w)=> {
let placeNames = w.place.split('.');
placeNames.shift();
return {
name: w.name,
place: placeNames.join('.'),
parameters: w.parameters,
};
});
return {
includeSuggestedSearches: tab.includeSuggestedSearches,
suggestedSearchFilter: tab.suggestedSearchFilter,
layout: {
name: tab.layout ? tab.layout.name : ''
},
widgets: widgets
};
}
buildTab(tab, tabIndex) {
const { type, entityId, entity, isFetchingEntity, isAdmin } = this.props;
let tabConfiguration = this.getTabConfig(tab);
return (<TabPanel key={tabIndex}>
<div className="cluedIn_container">
<CluedInLayout widgetConfiguration={tabConfiguration}
type={type}
entityId={entityId}
entity={entity}
isAdmin={isAdmin}
isFetchingEntity={isFetchingEntity}></CluedInLayout>
</div>
</TabPanel>);
}
getTabContent(tabs) {
let result = tabs.map(this.buildTab, this);
//result.unshift(<TabPanel key={-1}></TabPanel>);
return result;
}
render() {
const { widgetConfiguration, entityId, entity, isFetchingEntity, isAdmin } = this.props;
const layoutName = ( widgetConfiguration.layout && widgetConfiguration.layout.name) ? widgetConfiguration.layout.name : 'Default';
const layoutConfiguration = wms.getLayout(layoutName);
let letTabContent;
let tabContentPlaceholder;
let widgetsWithSuggestedSearches = widgetConfiguration.widgets.slice(0);
if (entityId && entity && !isFetchingEntity && widgetConfiguration.includeSuggestedSearches) {
entity.SuggestedSearches.filter((s)=> {
if (!widgetConfiguration.suggestedSearchFilter || widgetConfiguration.suggestedSearchFilter.length === 0) {
return true;
}
return (widgetConfiguration.suggestedSearchFilter.map((s)=> {
return s.key;
}).indexOf(s.DisplayName) > -1);
}).forEach((search) => {
var suggestedSearchWidget = {
name: 'EntitySuggestedSearch',
place: widgetConfiguration.placeSuggestedSearches || 'main',
parameters: {
search: search,
isAdmin: isAdmin
}
};
if (widgetConfiguration.includeSuggestedSearchesBefore) {
widgetsWithSuggestedSearches.shift(suggestedSearchWidget);
} else {
widgetsWithSuggestedSearches.push(suggestedSearchWidget);
}
});
}
if (widgetConfiguration.tabs && widgetConfiguration.tabs[0] && widgetConfiguration.tabs[0].children) {
tabContentPlaceholder = widgetConfiguration.tabs.place || 'main';
let tabMenuContent = this.getTabMenu(widgetConfiguration.tabs[0].children);
let tabListContent = this.getTabContent(widgetConfiguration.tabs[0].children);
if (tabListContent) {
letTabContent = (<Row>
<Col size={12} mobileSize={12}>
<Tabs selectedIndex={0}>
<TabList>
{tabMenuContent}
</TabList>
{tabListContent}
</Tabs>
</Col>
</Row>);
}
}
let layoutContent = layoutConfiguration.children.map((row, index) => {
if (row.type === 'row') {
return (<Row key={index}>
{row.columns.map((col, i) => {
return (<Col key={i} size={col.size} mobileSize={col.mobileSize}>
{this.renderWidgets(col.name, widgetsWithSuggestedSearches)}
{(letTabContent && col.name === tabContentPlaceholder) ? letTabContent : void 0 }
</Col>);
})}
</Row>);
} else {
let gridSize = row.size || defaultGridSize;
let gridPlaceHolderName = row.name || defaultPlaceHolder;
return (<Row key={index}>
{ this.filterWidgets(widgetsWithSuggestedSearches, gridPlaceHolderName).map((col, i)=> {
return (<Col key={i} size={(col.size || gridSize)} mobileSize={col.mobileSize}>
{this.renderWidget(col)}
</Col>);
})}
</Row>);
}
});
return <div style={{marginTop:'5px'}}>{layoutContent}</div>;
}
}
CluedInLayout.contextTypes = {
router: React.PropTypes.object
};
export default CluedInLayout ;