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.
285 lines (251 loc) • 9.96 kB
JSX
import React, { Component } from 'react';
import SearchResult from './searchResult.jsx';
import SearchFilter from './SearchFilter.jsx';
import SearchFilterOverview from './SearchFilterOverview.jsx';
import SearchActionBar from './SearchActionBar.jsx';
import iso from '../../../iso';
import RaisedButton from 'material-ui/RaisedButton';
import KeyArrowDown from 'material-ui/svg-icons/hardware/keyboard-arrow-down';
import KeyArrowUp from 'material-ui/svg-icons/hardware/keyboard-arrow-up';
import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';
import SearchExtraFilters from './SearchExtraFilters.jsx';
import Spacer from './../generics/Spacer.jsx';
import RefreshIndicator from 'material-ui/RefreshIndicator';
import AlertStandAlone from './../generics/AlertStandAlone.jsx';
import PageContent from './../generics/PageContent.jsx';
import CircularProgress from 'material-ui/CircularProgress';
import Radium from 'radium';
import { FormattedMessage } from 'react-intl';
var formatProviders = (initialFacets, currentFacets, selectedFilters) => {
let result = Object.assign({}, initialFacets);
for (var facetKey in result) {
if (result[facetKey]) {
var facet = result[facetKey];
if (facet.terms && facet.terms.length > 0) {
let currentFacetsByType = currentFacets[facetKey];
if (currentFacetsByType) {
var isAppliedFilter = iso.collection.find(selectedFilters, (filter) => {
return filter.filterType.toLowerCase() === facetKey.toLowerCase();
});
if (!isAppliedFilter) {
facet.terms.forEach((term)=> {
let hasFacets = iso.collection.find(currentFacetsByType.terms, (currentTerm) => {
return (term.term === currentTerm.term );
});
if (hasFacets) {
term.count = hasFacets.count;
} else {
term.count = 0;
}
});
}
}
}
}
}
return result;
};
class SearchContent extends Component {
constructor(props) {
super(props);
this.state = {
showFilter: false
}
}
handleChange(event, index, value) {
const {onSortingChange} = this.props;
onSortingChange(value);
}
showFilter() {
this.setState({
showFilter: !this.state.showFilter
});
}
onSelectFacetHandler(filterType, facet) {
const {onSelectFacet} = this.props;
onSelectFacet(filterType, facet);
this.setState({
showFilter: false
});
}
render() {
const {
searchResult,
initialFacets,
isFetchingInitialSearch,
isFetchingSearch,
onSelectFilter,
selectedFilters,
onRemoveFilter,
sortDirection,
onNextPageClick,
isFetchingNextPage,
hasSubscribed,
q,
onSubscribe,
onUnSubscribe
} = this.props;
let content;
let loadMoreButtonContent;
let KeppInTheLoopButton;
let unSubscribeMessage = <FormattedMessage id="SearchContent.Unsubscribe"></FormattedMessage>
let pinMessage = <FormattedMessage id="SearchContent.KeepMeInTheLoop"></FormattedMessage>
let loadMoreSearchResultMessage = <FormattedMessage id="SearchContent.LoadMore"></FormattedMessage>
let allDocumentMessage = <FormattedMessage id="SearchContent.AllDocumentMessage"></FormattedMessage>
let allIntegrationMessage = <FormattedMessage id="SearchContent.AllIntegrationMessage"></FormattedMessage>
let filterMessage = <FormattedMessage id="SearchContent.FilterMessage"></FormattedMessage>
let resultFoundMessage = <FormattedMessage id="SearchContent.ResultFoundMessage"></FormattedMessage>
if (hasSubscribed) {
KeppInTheLoopButton =
<RaisedButton style={SearchContentStyle.keepInTheLoopButton} onClick={onUnSubscribe} secondary={true}
label={unSubscribeMessage}></RaisedButton>
} else {
KeppInTheLoopButton =
<RaisedButton style={SearchContentStyle.keepInTheLoopButton} onClick={onSubscribe} secondary={true}
label={pinMessage}></RaisedButton>
}
let filterIcon = <KeyArrowDown></KeyArrowDown>;
if (this.state.showFilter) {
filterIcon = <KeyArrowUp></KeyArrowUp>
}
if (searchResult && searchResult.Hits && (searchResult.Hits.length % 27 === 0)) {
if (isFetchingNextPage) {
loadMoreButtonContent =
<RefreshIndicator style={SearchContentStyle.refresh} top={0} left={0}
status="loading"></RefreshIndicator>
} else {
loadMoreButtonContent = <RaisedButton onClick={onNextPageClick} style={{width:'100%'}}
label={loadMoreSearchResultMessage}></RaisedButton>;
}
}
let excludesFacets = ['entityType', 'providers'];
let leftStyle = {
float: 'left',
marginTop: '5px'
};
let leftFilterStyle = {
float: 'left',
marginTop: '11px',
marginLeft: '15px'
};
let rightStyle = {
float: 'right',
lineHeight: '36px'
};
let colorStyleDropdown = {
color: 'rgba(0, 0, 0, 0.87)',
fill: 'rgba(0, 0, 0, 0.87)',
borderColor: 'rgba(0, 0, 0, 0.87)'
};
let selectedEntityTypeFilter = iso.collection.find(selectedFilters, (f)=> {
return f.filterType.toLowerCase() === 'entityType'.toLowerCase();
});
let selectedProviderFilter = iso.collection.find(selectedFilters, (f)=> {
return f.filterType.toLowerCase() === 'providers'.toLowerCase();
});
if (isFetchingInitialSearch) {
content = (<div>
<PageContent>
<div style={{textAlign: 'center', marginTop:'50px'}}>
<CircularProgress></CircularProgress>
</div>
</PageContent>
</div>);
} else if (!searchResult || !searchResult.Hits || searchResult.Hits.length === 0) {
content = (<PageContent>
<div className="cluedIn_col offset-s2 s8">
<AlertStandAlone>
<p><FormattedMessage id="SearchContent.NoSearchResult"></FormattedMessage> '{q}'</p>
</AlertStandAlone>
</div>
</PageContent>)
} else {
let currentFacetsFormatted = formatProviders(initialFacets, searchResult.Facets || [], selectedFilters || []);
content = (
<PageContent>
<div className="cluedIn_col m2">
<div>
<SearchFilter type="entityType"
title={allDocumentMessage}
onSelectFilter={onSelectFilter}
selectedFilter={selectedEntityTypeFilter}
onRemoveFilter={onRemoveFilter}
facets={currentFacetsFormatted.entityType}></SearchFilter>
</div>
<div style={SearchContentStyle.filterProvider}>
<SearchFilter type="providers"
title={allIntegrationMessage}
onSelectFilter={onSelectFilter}
selectedFilter={selectedProviderFilter}
onRemoveFilter={onRemoveFilter}
facets={currentFacetsFormatted.providers}></SearchFilter>
</div>
</div>
<div className="cluedIn_col m10">
<SearchActionBar>
<div style={leftStyle}>
<RaisedButton label={filterMessage} onClick={this.showFilter.bind(this)}
labelPosition="before" icon={filterIcon}></RaisedButton>
</div>
<div style={leftFilterStyle}>
<SearchFilterOverview onRemoveFilter={onRemoveFilter}
selectedFilters={selectedFilters}></SearchFilterOverview>
</div>
<div style={[SearchContentStyle.searchResult, rightStyle]}>
<strong>{searchResult.Total}</strong> {resultFoundMessage}
{KeppInTheLoopButton}
<DropDownMenu underlineStyle={colorStyleDropdown}
labelStyle={colorStyleDropdown}
iconStyle={colorStyleDropdown}
value={sortDirection ? sortDirection : 'relevance'}
onChange={this.handleChange.bind(this)}>
<MenuItem value='relevance'
primaryText={<FormattedMessage id="SearchContent.SortByRelevance"></FormattedMessage>}/>
<MenuItem value='new'
primaryText={<FormattedMessage id="SearchContent.SortByNew"></FormattedMessage>}/>
<MenuItem value='old'
primaryText={<FormattedMessage id="SearchContent.SortByOld"></FormattedMessage>}/>
</DropDownMenu>
</div>
</SearchActionBar>
<Spacer show={this.state.showFilter}>
<SearchExtraFilters facets={searchResult.Facets}
onSelectFacet={this.onSelectFacetHandler.bind(this)}
excludesFacets={excludesFacets}></SearchExtraFilters>
</Spacer>
<SearchResult searchResult={searchResult}
isFetchingSearch={isFetchingSearch}></SearchResult>
<div style={SearchContentStyle.container}>
{loadMoreButtonContent}
</div>
</div>
</PageContent>
);
}
return (
<div>{ content }</div>
);
}
}
const SearchContentStyle = {
filterProvider: {
marginTop: '15px',
},
searchResult: {
fontSize: '18px',
},
container: {
position: 'relative',
textAlign: 'center',
},
refresh: {
display: 'inline-block',
position: 'relative',
},
keepInTheLoopButton: {
marginLeft: '15px',
marginRight: '5px',
},
};
export default Radium(SearchContent) ;