diff --git a/src/client/components/NavTabs.js b/src/client/components/NavTabs.js deleted file mode 100644 index 7a0f03619c38d1c436f86a7154467302e76322ee..0000000000000000000000000000000000000000 --- a/src/client/components/NavTabs.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import Tabs from '@material-ui/core/Tabs'; -import Tab from '@material-ui/core/Tab'; - -const NavTabs = (props) => { - const handleChange = (event, value) => { - props.updateResultFormat(value); - }; - // <Tab value="migrationMap" label="migrations" /> - return ( - <Tabs value={props.resultFormat} onChange={handleChange}> - <Tab value="table" label="Table" /> - <Tab value="creationPlaces" label="creation places" /> - <Tab value="migrations" label="migrations" /> - <Tab value="statistics" label="Statistics" /> - </Tabs> - ); -}; - -NavTabs.propTypes = { - resultFormat: PropTypes.string.isRequired, - updateResultFormat: PropTypes.func.isRequired -}; - -export default NavTabs; diff --git a/src/client/components/Pie.js b/src/client/components/Pie.js index da1579256d542ced0fea863b0cb11d276c7715c9..2469d6e87967957139b665b0b2a43d584c2fba4e 100644 --- a/src/client/components/Pie.js +++ b/src/client/components/Pie.js @@ -64,7 +64,7 @@ const combineSmallGroups = (dataArray) => { class Pie extends React.Component { componentDidMount = () => { - this.props.fetchPlaces('creationPlaces'); + this.props.fetchPlaces('productionPlaces'); } render() { @@ -98,7 +98,7 @@ class Pie extends React.Component { const legendArray = dataArray.map(group => ({ name: group.x + ' (' + group.y + ')' })); const legendHeigth = legendArray.length * 33; - const pieTitle = placeLinks + ' creation place links in total'; + const pieTitle = placeLinks + ' production place links in total'; return ( <div className={classes.root}> @@ -124,7 +124,7 @@ class Pie extends React.Component { <Paper className={classes.legendPaper}> <VictoryLegend height={legendHeigth} - title={'Creation place (manuscript count)'} + title={'Production place (manuscript count)'} colorScale={'qualitative'} data={legendArray} style={{ diff --git a/src/client/components/ResultTableHead.js b/src/client/components/ResultTableHead.js index 48810a76b077796f273c82b7a4eb1b1ed2d4d5f9..640d2ad240d2dfed948a520b2c8a1aecc3845dcb 100644 --- a/src/client/components/ResultTableHead.js +++ b/src/client/components/ResultTableHead.js @@ -76,7 +76,7 @@ class ResultTableHead extends React.Component { state = { rowsPerPage: 5, order: 'asc', - orderBy: 'creationPlace', + orderBy: 'productionPlace', }; handleChangePage = (event, page) => { diff --git a/src/client/components/Tree.js b/src/client/components/Tree.js index f61196cb0a882eaf7a81a4b0ec7a87b9f3f739aa..6a38b2f655f72f7cdcc4ea8cb97bfedcc3d09816 100644 --- a/src/client/components/Tree.js +++ b/src/client/components/Tree.js @@ -55,7 +55,7 @@ class Tree extends Component { }); this.setState({ treeData: newTreeData }); this.props.updateFilter({ - property: 'creationPlace', + property: 'productionPlace', value: treeObj.node.id }); }; diff --git a/src/client/components/VirtualizedTable.js b/src/client/components/VirtualizedTable.js deleted file mode 100644 index 9862ebaedcfe7a5b3884c00c3547c13a8a37bc0b..0000000000000000000000000000000000000000 --- a/src/client/components/VirtualizedTable.js +++ /dev/null @@ -1,283 +0,0 @@ -import React from 'react'; -import Immutable from 'immutable'; -import PropTypes from 'prop-types'; -import Grid from '@material-ui/core/Grid'; -import { withStyles } from '@material-ui/core/styles'; -// import ResultFilterDialogSingle from './ResultFilterDialogSingle'; -// import IconButton from '@material-ui/core/IconButton'; -// import PlaceIcon from '@material-ui/icons/Place'; -import { - AutoSizer, - CellMeasurer, - CellMeasurerCache, - Column, - Table, - //SortIndicator -} from 'react-virtualized'; - -// https://github.com/bvaughn/react-virtualized/issues/650 -// https://github.com/bvaughn/react-virtualized/blob/master/docs/usingAutoSizer.md - -const styles = () => ({ - root: { - display: 'flex', - height: '100%', - flexGrow: 1, - }, - container: { - height: '100%', - width: '100%', - flexDirection: 'column', - }, - tableColumn: { - padding: '5px 15px 5px 0' - }, - valueList: { - marginTop: 0, - marginBottom: 0, - paddingLeft: 15 - } -}); - -const tableStyles = { - tableRoot: { - fontFamily: 'Roboto', - }, - headerRow: { - textTransform: 'none', - borderBottom: '1px solid rgba(224, 224, 224, 1)' - }, - tableRow: { - borderBottom: '1px solid rgba(224, 224, 224, 1)' - }, -}; - -class VirtualizedTable extends React.PureComponent { - - constructor(props) { - super(props); - } - - cache = new CellMeasurerCache({ - fixedWidth: true, - minHeight: 40, - }); - - columnCellRenderer = ({dataKey, parent, rowIndex}) => { - const {list} = this.props; - const rowData = list.get(rowIndex % list.size); - const cellData = rowData[dataKey]; - let cellContent = ''; - let columnIndex = 0; - if (cellData == null | cellData === '-') { - cellContent = '-'; - } else { - switch(dataKey) { - case 'prefLabel': - cellContent = this.stringListRenderer(cellData); - columnIndex = 0; - break; - case 'author': - cellContent = this.objectListRenderer(cellData); - columnIndex = 1; - break; - case 'creationPlace': - cellContent = this.objectListRenderer(cellData); - columnIndex = 2; - break; - case 'timespan': - cellContent = this.stringListRenderer(cellData); - columnIndex = 3; - break; - } - } - return ( - <CellMeasurer - cache={this.cache} - columnIndex={columnIndex} - key={dataKey} - parent={parent} - rowIndex={rowIndex}> - <div - className={this.props.classes.tableColumn} - style={{ - whiteSpace: 'normal', - }}> - {cellContent} - </div> - </CellMeasurer> - ); - }; - - idRenderer = ({dataKey, rowIndex}) => { - const {list} = this.props; - const rowData = list.get(rowIndex % list.size); - let cellData = rowData[dataKey]; - cellData = cellData.replace('http://ldf.fi/mmm/manifestation_singleton/', ''); - let sdbmUrl = ''; - let id = ''; - if (rowData.manuscriptRecord == '-') { - id = cellData.replace('orphan_', ''); - sdbmUrl = 'https://sdbm.library.upenn.edu/entries/' + id; - } else { - id = cellData; - sdbmUrl = rowData.manuscriptRecord; - } - id = id.replace('part_', ''); - return ( - <div className={this.props.classes.tableColumn}> - <a target='_blank' rel='noopener noreferrer' href={sdbmUrl}>{id}</a> - </div> - ); - }; - - objectListRenderer = (cellData) => { - if (cellData.length < 2) { - const item = cellData[0]; - return ( - <a - target='_blank' rel='noopener noreferrer' - href={'https://sdbm.library.upenn.edu/' + item.sdbmType + '/' + item.id} - > - {item.prefLabel} - </a> - ); - } else { - return ( - <ul className={this.props.classes.valueList}> - {cellData.map((item, i) => - <li key={i}> - <a - target='_blank' rel='noopener noreferrer' - href={'https://sdbm.library.upenn.edu/' + item.sdbmType + '/' + item.id} - > - {item.prefLabel} - </a> - </li> - )} - </ul> - ); - } - }; - - stringListRenderer = (cellData) => { - if (cellData.length < 2) { - return <span>{cellData[0]}</span>; - } else { - return ( - <ul className={this.props.classes.valueList}> - {cellData.map((item, i) => <li key={i}>{item}</li>)} - </ul> - ); - } - - }; - - rowGetter = ({index}) => this.getDatum(this.props.list, index); - - getDatum = (list, index) => { - return list.get(index % list.size); - } - - calculateRowStyle = ({ index }) => { - if (index < 0) { - return tableStyles.headerRow; - } else { - return tableStyles.tableRow; - } - }; - - onResize = () => { - this.cache.clearAll(); - } - - render() { - const { classes } = this.props; - - return ( - <div className={classes.root}> - <Grid container className={classes.container}> - <div className={classes.resultsInfo}> - </div> - {this.props.list.size > 0 && - <div style={{ flex: '1 1 auto' }}> - <AutoSizer - onResize={this.onResize} - > - {({ height, width }) => ( - <Table - deferredMeasurementCache={this.cache} - rowHeight={this.cache.rowHeight} - overscanRowCount={10} - rowClassName={'tableRow'} - rowGetter={this.rowGetter} - rowCount={this.props.list.size} - sortDirection={this.props.search.sortDirection.toUpperCase()} - width={width} - height={height} - headerHeight={50} - style={tableStyles.tableRoot} - rowStyle={this.calculateRowStyle} - > - <Column - label="ID" - dataKey="id" - cellRenderer={this.idRenderer} - minWidth={70} - width={70} - /> - <Column - label="Title" - dataKey="prefLabel" - cellRenderer={this.columnCellRenderer} - width={400} - /> - <Column - label="Author" - dataKey="author" - cellRenderer={this.columnCellRenderer} - width={400} - /> - <Column - label="Creation place" - dataKey="creationPlace" - cellRenderer={this.columnCellRenderer} - width={400} - /> - <Column - label="Creation date" - dataKey="timespan" - cellRenderer={this.columnCellRenderer} - width={400} - /> - </Table> - )} - </AutoSizer> - </div> - } - </Grid> - </div> - ); - } -} - -VirtualizedTable.propTypes = { - classes: PropTypes.object.isRequired, - list: PropTypes.instanceOf(Immutable.List).isRequired, - search: PropTypes.object.isRequired, - manuscriptsPropertyValues: PropTypes.object.isRequired, - sortResults: PropTypes.func.isRequired, - updateResultsFilter: PropTypes.func.isRequired, - updateQuery: PropTypes.func.isRequired, - fetchSuggestions: PropTypes.func.isRequired, - clearSuggestions: PropTypes.func.isRequired, - fetchManuscripts: PropTypes.func.isRequired, - fetchPlaces: PropTypes.func.isRequired, - clearManuscripts: PropTypes.func.isRequired, - clearPlaces: PropTypes.func.isRequired, - bounceMarker: PropTypes.func.isRequired, - openMarkerPopup: PropTypes.func.isRequired, - removeTempMarker: PropTypes.func.isRequired, -}; - -export default withStyles(styles)(VirtualizedTable); diff --git a/src/client/reducers/facet.js b/src/client/reducers/facet.js index 427c3425123a4ba9f848e051bfc872e97f73eb05..bcc6f3d0675ce76bdfd3e6e213837d169b2c447d 100644 --- a/src/client/reducers/facet.js +++ b/src/client/reducers/facet.js @@ -8,25 +8,25 @@ import { export const INITIAL_STATE = { facetOptions : { - creationPlace: { - id: 'creationPlace', - label: 'Creation place', - predicate: '^frbroo:R18_created/crm:P7_took_place_at', + productionPlace: { + id: 'productionPlace', + label: 'Production place', + predicate: '(^frbroo:R18_created|^crm:P108_has_produced)/crm:P7_took_place_at', hierarchical: true, }, author: { id: 'author', label: 'Author', - predicate: '^frbroo:R18_created/crm:P14_carried_out_by', + predicate: '(^frbroo:R18_created|^crm:P108_has_produced)/crm:P14_carried_out_by', hierarchical: false } }, facetValues : { - creationPlace: [], + productionPlace: [], author: [] }, facetFilters: { - creationPlace: new Set(), + productionPlace: new Set(), author: new Set(), }, fetchingFacet : false, diff --git a/src/server/sparql/Datasets.js b/src/server/sparql/Datasets.js index f00b483d2f787f5bf0c6ffbb21249434d28d8750..ecf488c560e1f456098bf5faa39ec377c37597a0 100644 --- a/src/server/sparql/Datasets.js +++ b/src/server/sparql/Datasets.js @@ -174,6 +174,7 @@ module.exports = { WHERE { # https://github.com/uber/deck.gl/blob/master/docs/layers/arc-layer.md ?manuscript__id ^frbroo:R18_created/crm:P7_took_place_at ?from__id . + ?manuscript__id mmm-schema:data_provider_url ?manuscript__url . ?from__id skos:prefLabel ?from__name . ?from__id wgs84:lat ?from__lat ; @@ -246,7 +247,8 @@ module.exports = { ?id a frbroo:F4_Manifestation_Singleton . <FILTER> ?id <PREDICATE> ?value . - OPTIONAL { ?value mmm-schema:parent ?parent } + OPTIONAL { ?value crm:P89_falls_within ?parent } + ?value dct:source mmm-schema:Bodley . } GROUP BY ?value ?parent } diff --git a/src/server/sparql/Manuscripts.js b/src/server/sparql/Manuscripts.js index c0447f5dc58f93d4d456097056ba0dde4db03219..00dbe4827b43b1c710e614fbbfbbe7f5d5dadf33 100644 --- a/src/server/sparql/Manuscripts.js +++ b/src/server/sparql/Manuscripts.js @@ -10,16 +10,18 @@ import { makeObjectList } from './SparqlObjectMapper'; const sparqlSearchEngine = new SparqlSearchEngine(); const facetConfigs = { - creationPlace: { - id: 'creationPlace', + productionPlace: { + id: 'productionPlace', + label: 'Production place', predicate: '^frbroo:R18_created/crm:P7_took_place_at', hierarchical: true, }, - author: { - id: 'author', - predicate: '^frbroo:R18_created/mmm-schema:carried_out_by_as_author', - hierarchical: false, - } + // author: { + // id: 'author', + // label: 'Author', + // predicate: '(^frbroo:R18_created|^crm:P108_has_produced)/crm:P14_carried_out_by', + // hierarchical: false + // } }; export const getManuscripts = (page, pagesize, filters) => { @@ -91,6 +93,7 @@ const getFacet = (facetConfig, filters) => { facetQuery = facetQuery.replace('<FILTER>', generateFacetFilter(facetConfig, filters)); } facetQuery = facetQuery.replace('<PREDICATE>', facetConfig.predicate); + console.log(facetQuery) let mapper = facetConfig.hierarchical ? mapHierarchicalFacet : mapFacet; return sparqlSearchEngine.doSearch(facetQuery, endpoint, mapper); };