UNPKG

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.

284 lines (251 loc) • 11.9 kB
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 ) ;