import * as React from 'react'; import { withStyles } from '@material-ui/core/styles'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { WithTranslation, withTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; import * as _ from 'lodash'; // Actions import { loadInstitute } from 'institutes/actions/public'; import { applyFiltersAsync as applyFilters, applyOverviewFiltersAsync as applyOverviewFilters } from 'accessions/actions/public'; import { showSnackbar } from 'actions/snackbar'; // Models import FaoInstituteDetails from '@genesys/client/model/genesys/InstituteDetails'; import MapLayer from '@genesys/client/model/genesys/MapTileLayer'; // UI import PageLayout, { MainSection, PageContents, PageSection } from 'ui/layout/PageLayout'; import GridContainer from 'ui/layout/GridContainer'; import ContentHeader from 'ui/common/heading/ContentHeader'; import LocationMap from 'ui/common/LocationMap'; import Loading from 'ui/common/Loading'; import Number from 'ui/common/Number'; import { ScrollToTopOnMount } from 'ui/common/page/scrollers'; import { Properties, PropertiesItem } from 'ui/common/Properties'; import PieChartCard from 'ui/common/pie-chart/PieChartCard'; import PrettyDate from 'ui/common/time/PrettyDate'; import {CountryLink, InstituteCodeLink, SubsetLink} from 'ui/genesys/Links'; import BarChart from 'ui/common/bar-chart'; import Button from '@material-ui/core/Button'; import Permissions from 'ui/common/permission/Permissions'; import FaoInstitute from '@genesys/client/model/genesys/FaoInstitute'; import ButtonBar from 'ui/common/buttons/ButtonBar'; import DownloadDialog, { DOWNLOAD_AUTH_SLUG, DOWNLOAD_ANON_SLUG } from 'ui/common/download-dialog'; import PageTitle from 'ui/common/PageTitle'; import BlurbText from 'cms/ui/c/BlurbText'; import AccessionFilter from '@genesys/client/model/accession/AccessionFilter'; import { IPageRequest } from '@genesys/client/model/Page'; import ErrorMessage from 'ui/common/error/ErrorMessage'; import { PartnerLink } from 'ui/catalog/Links'; import PropertiesCard from 'ui/common/PropertiesCard'; import { Grid } from '@material-ui/core'; import { ExternalInstituteLink, FaoWiewsLink } from 'ui/common/Links'; /* eslint-disable*/ const styles = (theme) => ({ italicProperties: { fontStyle: 'italic' as 'italic', }, hasNewVersionPropLink: { '& > div': { backgroundColor: '#ffe2e2 !important', }, }, hasNewVersion: { backgroundColor: '#ffe2e2 !important', }, pdciSubHeader: { fontSize: '1rem', color: 'black', marginTop: '15px', }, }); /* eslint-enable */ interface IDisplayPageProps extends React.ClassAttributes, WithTranslation { t: any; classes: any; code: string; institute: FaoInstituteDetails; error: any; loading: boolean; loadInstitute: any; applyFilters: (filters: string | AccessionFilter, page?: IPageRequest) => any; applyOverviewFilters: (filters: string | AccessionFilter) => any; userRoles: string[]; mapLayers: MapLayer[]; apiUrl: string; showSnackbar: (snack: string) => void; lang: string; } class DisplayPage extends React.Component { protected static needs = [ ({ params: { wiewsCode } }) => loadInstitute(wiewsCode), ]; public constructor(props: IDisplayPageProps, context: any) { super(props, context); } public state = { authenticated: false, }; private applyInstituteCodeFilter = () => { const { institute, applyFilters} = this.props; const filter = { institute: { code: [institute.details.code] } }; applyFilters(filter); } private applyFilterForOverview = () => { const { institute, applyOverviewFilters } = this.props; const filter = { institute: { code: [institute.details.code] } }; applyOverviewFilters(filter); } private applyLastModifyDateFilter = (lastUpdateDate) => { const { institute, applyFilters} = this.props; const startOfDay = new Date(`${lastUpdateDate[0]}-${lastUpdateDate[1]}-${lastUpdateDate[2]}`); const endOfDay = new Date(`${lastUpdateDate[0]}-${lastUpdateDate[1]}-${lastUpdateDate[2]}`); startOfDay.setHours(0); endOfDay.setHours(23, 59, 59); const filter = { historic: null, institute: { code: [institute.details.code] }, lastModifiedDate: { ge: startOfDay, le: endOfDay, }, }; applyFilters(filter); } public componentDidMount() { const { code, loadInstitute, institute, userRoles } = this.props; if (code && (! institute || code !== institute.details.code)) { loadInstitute(code); } const authenticated: boolean = userRoles.findIndex((role) => role === 'ROLE_USER') !== -1; this.setState({authenticated}); } private addTerm = (property, term) => { const { applyOverviewFilters, showSnackbar, institute } = this.props; const updatedFilter: AccessionFilter = { institute: { code: [institute.details.code] }, }; switch (property) { case 'crop': case 'taxonomy.genus': case 'taxonomy.genusSpecies': _.set(updatedFilter, property, _.concat(_.get(updatedFilter, property), term).filter((x) => x != null)); break; default: _.set(updatedFilter, property, term); } showSnackbar('common.snackbar.applyingFilters'); applyOverviewFilters(updatedFilter); } private renderLinkToOverview = (property) => (term) => { return ( this.addTerm(property, term.term) }> ); } public componentDidUpdate(prevProps: Readonly): void { const { code: oldCode } = prevProps; const { loading, code, loadInstitute, institute } = this.props; if (code && !loading && (!institute || code !== institute.details.code) || code !== oldCode) { loadInstitute(code); } } public render() { const { error, loading, institute, code, userRoles, mapLayers, classes, apiUrl, t, lang } = this.props; const slug: string = this.state.authenticated ? DOWNLOAD_AUTH_SLUG : DOWNLOAD_ANON_SLUG; let cropShortNameOverview; let cropNameOverview; let taxonomyGenusOverview; let taxonomyGenusSpeciesOverview; if (!loading && institute) { const cropShortNameKey = 'crop.shortName'; cropShortNameOverview = institute.overview[cropShortNameKey]; const cropNameKey = 'cropName'; cropNameOverview = institute.overview[cropNameKey]; const taxonomyGenusKey = 'taxonomy.genus'; taxonomyGenusOverview = institute.overview[taxonomyGenusKey]; const taxonomyGenusSpeciesKey = 'taxonomy.genusSpecies'; taxonomyGenusSpeciesOverview = institute.overview[taxonomyGenusSpeciesKey]; } const hasNewVersion = institute && institute.details && institute.details.vCode && institute.details.vCode !== code; return ( { loading ? :
{ error && } { institute && { (userRoles.findIndex((role) => role === 'ROLE_ADMINISTRATOR') !== -1 || institute.details._permissions.manage) && } { institute.details._permissions.manage && } { institute.details._permissions.manage && } } > { institute.blurb && institute.blurb.body &&
} { institute.details.code }
{ t('institutes.public.p.display.showWiewsPage') }
{ institute.details.type } { } {hasNewVersion && { t('institutes.public.p.display.hasNewVersion', {instCode: institute.details.vCode}) } } { institute.details.url && } { institute.details.owner && }
{ institute.details.latitude !== null && institute.details.longitude !== null && } { cropShortNameOverview && cropShortNameOverview.terms && cropShortNameOverview.terms.length > 0 && } { cropNameOverview && cropNameOverview.terms && cropNameOverview.terms.length > 0 && } { taxonomyGenusOverview && taxonomyGenusOverview.terms && taxonomyGenusOverview.terms.length > 0 && } { taxonomyGenusSpeciesOverview && taxonomyGenusSpeciesOverview.terms && taxonomyGenusSpeciesOverview.terms.length > 0 && } { institute.recentSubsets && institute.recentSubsets.length > 0 && a.title.localeCompare(b.title)) .map((subset) => ( { value: } )) } /> } { institute.lastUpdates && institute.lastUpdates.length > 0 && { institute.lastUpdates.map((lastUpdate) => ( }> this.applyLastModifyDateFilter(lastUpdate) }> )) } } { institute.pdciStats && institute.pdciStats.histogram && institute.pdciStats.histogram.length > 0 && { t('institutes.public.p.display.pdciDescription1') } { t('institutes.public.p.display.pdciDescriptionLink') } { t('institutes.public.p.display.pdciDescription2') }
} > ({key: i % 2 === 0 ? i / 2 : '', value: item })) } yLabel={ t('institutes.public.p.display.pdciYLabel') } xLabel={ t('institutes.public.p.display.pdciXLabel') } />
{ t('institutes.public.p.display.pdciScore', { count: institute.pdciStats.count, avg: institute.pdciStats.avg.toFixed(2), min: institute.pdciStats.min.toFixed(2), max: institute.pdciStats.max.toFixed(2), }) }
} } }
); } } const mapStateToProps = (state, ownProps) => ({ institute: state.institutes.public.institute ? state.institutes.public.institute.data : undefined, error: state.institutes.public.institute ? state.institutes.public.institute.error : undefined, loading: state.institutes.public.institute ? state.institutes.public.institute.loading : true, code: ownProps.match.params.wiewsCode, userRoles: state.login.authorities, apiUrl: state.applicationConfig.apiUrl, mapLayers: state.accessions.public.mapLayers, lang: state.applicationConfig.lang, }); const mapDispatchToProps = (dispatch) => bindActionCreators({ loadInstitute, applyFilters, applyOverviewFilters, showSnackbar, }, dispatch); export default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(withTranslation()(DisplayPage)));