From 3511091b0fe9e68b23c68da047ccb4d7e4d36aac Mon Sep 17 00:00:00 2001 From: esikkala <esko.ikkala@aalto.fi> Date: Tue, 12 Mar 2019 18:42:25 +0200 Subject: [PATCH] Harmonize facet state updating --- src/client/actions/index.js | 21 ++-- src/client/components/facet_bar/FacetBar.js | 4 +- src/client/components/facet_bar/Tree.js | 18 ++- .../components/facet_results/LeafletMap.js | 72 ++++++------ .../components/perspectives/Manuscripts.js | 4 +- src/client/components/perspectives/Places.js | 2 +- src/client/containers/SemanticPortal.js | 15 +-- src/client/epics/index.js | 103 +++++++++++------- src/client/reducers/helpers.js | 50 ++++----- src/client/reducers/manuscriptsFacets.js | 18 +-- src/client/reducers/organizationsFacets.js | 17 +-- src/client/reducers/peopleFacets.js | 19 ++-- src/client/reducers/placesFacets.js | 35 ++---- src/client/reducers/worksFacets.js | 14 ++- src/server/index.js | 4 +- src/server/sparql/FacetValues.js | 10 +- src/server/sparql/SparqlQueriesGeneral.js | 3 +- 17 files changed, 210 insertions(+), 199 deletions(-) diff --git a/src/client/actions/index.js b/src/client/actions/index.js index ba23a7fd..9002a21f 100644 --- a/src/client/actions/index.js +++ b/src/client/actions/index.js @@ -13,7 +13,6 @@ export const FETCH_FACET = 'FETCH_FACET'; export const FETCH_FACET_FAILED = 'FETCH_FACET_FAILED'; export const UPDATE_FACET = 'UPDATE_FACET'; export const UPDATE_FILTER = 'UPDATE_FILTER'; -export const UPDATE_SPATIAL_FILTER = 'UPDATE_SPATIAL_FILTER'; export const OPEN_MARKER_POPUP = 'OPEN_MARKER_POPUP'; export const SHOW_ERROR = 'SHOW_ERROR'; @@ -61,25 +60,21 @@ export const updateInstance = ({ resultClass, instance }) => ({ type: UPDATE_INSTANCE, resultClass, instance }); -export const fetchFacet = (resultClass, id, sortBy, sortDirection) => ({ +export const fetchFacet = ({ facetClass, id, sortBy, sortDirection }) => ({ type: FETCH_FACET, - resultClass, id, sortBy, sortDirection + facetClass, id, sortBy, sortDirection }); -export const fetchFacetFailed = (resultClass, id, error, message) => ({ +export const fetchFacetFailed = (facetClass, id, error, message) => ({ type: FETCH_FACET_FAILED, - resultClass, id, error, message + facetClass, id, error, message }); -export const updateFacet = ({ resultClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection }) => ({ +export const updateFacet = ({ facetClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection }) => ({ type: UPDATE_FACET, - resultClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection + facetClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection }); -export const updateFilter = ({ resultClass, property, value }) => ({ +export const updateFilter = ({ facetClass, property, value }) => ({ type: UPDATE_FILTER, - resultClass, property, value -}); -export const updateSpatialFilter = ({ resultClass, property, filter }) => ({ - type: UPDATE_SPATIAL_FILTER, - resultClass, property, filter + facetClass, property, value }); export const openMarkerPopup = uri => ({ type: OPEN_MARKER_POPUP, diff --git a/src/client/components/facet_bar/FacetBar.js b/src/client/components/facet_bar/FacetBar.js index 668be244..19c7b10d 100644 --- a/src/client/components/facet_bar/FacetBar.js +++ b/src/client/components/facet_bar/FacetBar.js @@ -65,7 +65,7 @@ class FacetBar extends React.Component { facetFunctionality={true} property={id} data={facets[id].values} - resultClass={this.props.resultClass} + facetClass={this.props.facetClass} sortBy={facets[id].sortBy} sortDirection={facets[id].sortDirection} fetchFacet={this.props.fetchFacet} @@ -87,7 +87,7 @@ class FacetBar extends React.Component { FacetBar.propTypes = { classes: PropTypes.object.isRequired, facetData: PropTypes.object.isRequired, - resultClass: PropTypes.string.isRequired, + facetClass: PropTypes.string.isRequired, fetchFacet: PropTypes.func.isRequired, updateFilter: PropTypes.func.isRequired }; diff --git a/src/client/components/facet_bar/Tree.js b/src/client/components/facet_bar/Tree.js index 07d38e76..cb3b06fc 100644 --- a/src/client/components/facet_bar/Tree.js +++ b/src/client/components/facet_bar/Tree.js @@ -75,7 +75,12 @@ class Tree extends Component { componentDidMount = () => { if (this.props.facetFunctionality) { - this.props.fetchFacet(this.props.resultClass, this.props.property, this.props.sortBy, this.props.sortDirection); + this.props.fetchFacet({ + facetClass: this.props.facetClass, + id: this.props.property, + sortBy: this.props.sortBy, + sortDirection: this.props.sortDirection + }); } else { this.props.fetchData(); } @@ -91,7 +96,12 @@ class Tree extends Component { } if (this.props.updatedFacet !== null && this.props.updatedFacet !== this.props.property && prevProps.facetFilters != this.props.facetFilters) { // console.log(`fetching new values for ${this.props.property}`) - this.props.fetchFacet(this.props.resultClass, this.props.property, this.props.sortBy, this.props.sortDirection); + this.props.fetchFacet({ + facetClass: this.props.facetClass, + id: this.props.property, + sortBy: this.props.sortBy, + sortDirection: this.props.sortDirection + }); } } @@ -107,7 +117,7 @@ class Tree extends Component { }); this.setState({ treeData: newTreeData }); this.props.updateFilter({ - resultClass: this.props.resultClass, + facetClass: this.props.facetClass, property: this.props.property, value: treeObj.node.id }); @@ -287,7 +297,7 @@ Tree.propTypes = { facetFunctionality: PropTypes.bool.isRequired, searchField: PropTypes.bool.isRequired, data: PropTypes.array.isRequired, - resultClass: PropTypes.string.isRequired, + facetClass: PropTypes.string.isRequired, fetchData: PropTypes.func, fetchFacet: PropTypes.func, property: PropTypes.string, diff --git a/src/client/components/facet_results/LeafletMap.js b/src/client/components/facet_results/LeafletMap.js index 236c8020..5f84561d 100644 --- a/src/client/components/facet_results/LeafletMap.js +++ b/src/client/components/facet_results/LeafletMap.js @@ -114,41 +114,41 @@ class LeafletMap extends React.Component { }); // add Leaflet Draw toolbar - const editableLayers = new L.FeatureGroup(); - this.leafletMap.addLayer(editableLayers); - const drawOptions = { - draw: { - polyline: false, - rectangle: { - allowIntersection: false, // Restricts shapes to simple polygons - drawError: { - color: '#e1e100', // Color the shape will turn when intersects - message: '<strong>Oh snap!<strong> you can\'t draw that!' // Message that will show when intersect - }, - shapeOptions: { - color: '#bada55' - } - }, - circle: false, - polygon: false, - marker: false, - circlemarker: false - }, - edit: { - featureGroup: editableLayers, - } - }; - const drawControl = new L.Control.Draw(drawOptions); - this.leafletMap.addControl(drawControl); - this.leafletMap.on(L.Draw.Event.CREATED, e => { - editableLayers.addLayer(e.layer); - const filterObj = this.boundsToValues(e.layer._bounds); - this.props.updateSpatialFilter({ - resultClass: this.props.resultClass, - property: this.props.property, - filter: filterObj - }); - }); + // const editableLayers = new L.FeatureGroup(); + // this.leafletMap.addLayer(editableLayers); + // const drawOptions = { + // draw: { + // polyline: false, + // rectangle: { + // allowIntersection: false, // Restricts shapes to simple polygons + // drawError: { + // color: '#e1e100', // Color the shape will turn when intersects + // message: '<strong>Oh snap!<strong> you can\'t draw that!' // Message that will show when intersect + // }, + // shapeOptions: { + // color: '#bada55' + // } + // }, + // circle: false, + // polygon: false, + // marker: false, + // circlemarker: false + // }, + // edit: { + // featureGroup: editableLayers, + // } + // }; + // const drawControl = new L.Control.Draw(drawOptions); + // this.leafletMap.addControl(drawControl); + // this.leafletMap.on(L.Draw.Event.CREATED, e => { + // editableLayers.addLayer(e.layer); + // const filterObj = this.boundsToValues(e.layer._bounds); + // this.props.updateFilter({ + // resultClass: this.props.resultClass, + // property: this.props.property, + // value: filterObj + // }); + // }); // layer controls // const baseMaps = { @@ -421,7 +421,7 @@ LeafletMap.propTypes = { mapMode: PropTypes.string.isRequired, variant: PropTypes.string.isRequired, showInstanceCountInClusters: PropTypes.bool, - updateSpatialFilter: PropTypes.func, + updateFilter: PropTypes.func, property: PropTypes.string }; diff --git a/src/client/components/perspectives/Manuscripts.js b/src/client/components/perspectives/Manuscripts.js index 510fe3b5..eb84ae0f 100644 --- a/src/client/components/perspectives/Manuscripts.js +++ b/src/client/components/perspectives/Manuscripts.js @@ -63,7 +63,7 @@ let Manuscripts = props => { mapMode={'cluster'} variant='productionPlaces' showInstanceCountInClusters={true} - updateSpatialFilter={props.updateSpatialFilter} + updateFilter={props.updateFilter} property={'productionPlace'} />} /> @@ -98,7 +98,7 @@ Manuscripts.propTypes = { updatePage: PropTypes.func.isRequired, sortResults: PropTypes.func.isRequired, routeProps: PropTypes.object.isRequired, - updateSpatialFilter: PropTypes.func.isRequired + updateFilter: PropTypes.func.isRequired }; export default Manuscripts; diff --git a/src/client/components/perspectives/Places.js b/src/client/components/perspectives/Places.js index 4a6f8b02..807d3fc6 100644 --- a/src/client/components/perspectives/Places.js +++ b/src/client/components/perspectives/Places.js @@ -61,7 +61,7 @@ let Places = props => { render={() => <LeafletMap results={props.places.results} - filters={props.facetData.filters} + facetUpdateID={props.facetData.facetUpdateID} resultClass='places' facetClass='places' instance={props.places.instance} diff --git a/src/client/containers/SemanticPortal.js b/src/client/containers/SemanticPortal.js index d2d6f1f5..9b2c4c70 100644 --- a/src/client/containers/SemanticPortal.js +++ b/src/client/containers/SemanticPortal.js @@ -25,7 +25,6 @@ import { fetchFacet, sortResults, updateFilter, - updateSpatialFilter, updatePage, showError } from '../actions'; @@ -93,7 +92,7 @@ let SemanticPortal = (props) => { <Grid item sm={12} md={3} className={classes.facetBarContainer}> <FacetBar facetData={props.manuscriptsFacets} - resultClass='manuscripts' + facetClass='manuscripts' fetchFacet={props.fetchFacet} updateFilter={props.updateFilter} /> @@ -108,7 +107,7 @@ let SemanticPortal = (props) => { fetchResults={props.fetchResults} fetchByURI={props.fetchByURI} updatePage={props.updatePage} - updateSpatialFilter={props.updateSpatialFilter} + updateFilter={props.updateFilter} sortResults={props.sortResults} routeProps={routeProps} /> @@ -124,7 +123,7 @@ let SemanticPortal = (props) => { <Grid item sm={12} md={3} className={classes.facetBarContainer}> <FacetBar facetData={props.worksFacets} - resultClass='works' + facetClass='works' fetchFacet={props.fetchFacet} updateFilter={props.updateFilter} /> @@ -154,7 +153,7 @@ let SemanticPortal = (props) => { <Grid item sm={12} md={3} className={classes.facetBarContainer}> <FacetBar facetData={props.peopleFacets} - resultClass='people' + facetClass='people' fetchFacet={props.fetchFacet} updateFilter={props.updateFilter} /> @@ -185,7 +184,7 @@ let SemanticPortal = (props) => { <Grid item sm={12} md={3} className={classes.facetBarContainer}> <FacetBar facetData={props.organizationsFacets} - resultClass='organizations' + facetClass='organizations' fetchFacet={props.fetchFacet} updateFilter={props.updateFilter} /> @@ -216,7 +215,7 @@ let SemanticPortal = (props) => { <Grid item sm={12} md={3} className={classes.facetBarContainer}> <FacetBar facetData={props.placesFacets} - resultClass='places' + facetClass='places' fetchFacet={props.fetchFacet} updateFilter={props.updateFilter} /> @@ -274,7 +273,6 @@ const mapDispatchToProps = ({ fetchFacet, sortResults, updateFilter, - updateSpatialFilter, updatePage, showError }); @@ -300,7 +298,6 @@ SemanticPortal.propTypes = { sortResults: PropTypes.func.isRequired, updatePage: PropTypes.func.isRequired, updateFilter: PropTypes.func.isRequired, - updateSpatialFilter: PropTypes.func.isRequired, fetchFacet: PropTypes.func.isRequired, showError: PropTypes.func.isRequired }; diff --git a/src/client/epics/index.js b/src/client/epics/index.js index 03e8ecca..93879335 100644 --- a/src/client/epics/index.js +++ b/src/client/epics/index.js @@ -30,7 +30,16 @@ const fetchPaginatedResultsEpic = (action$, state$) => action$.pipe( withLatestFrom(state$), mergeMap(([action, state]) => { const { resultClass, facetClass, sortBy, variant } = action; - const params = stateSlicesToUrl(state[resultClass], state[`${facetClass}Facets`], sortBy, variant, null); + const { page, pagesize, sortDirection } = state[resultClass]; + const params = stateToUrl({ + facets: state[`${facetClass}Facets`].facets, + facetClass: null, + page: page, + pagesize: pagesize, + sortBy: sortBy, + sortDirection: sortDirection, + variant: variant + }); const requestUrl = `${apiUrl}${resultClass}/paginated?${params}`; // https://rxjs-dev.firebaseapp.com/api/ajax/ajax return ajax.getJSON(requestUrl).pipe( @@ -54,7 +63,15 @@ const fetchResultsEpic = (action$, state$) => action$.pipe( withLatestFrom(state$), mergeMap(([action, state]) => { const { resultClass, facetClass, variant } = action; - const params = stateSlicesToUrl(null, state[`${facetClass}Facets`], null, variant, facetClass); + const params = stateToUrl({ + facets: state[`${facetClass}Facets`].facets, + facetClass: facetClass, + page: null, + pagesize: null, + sortBy: null, + sortDirection: null, + variant: variant + }); const requestUrl = `${apiUrl}${resultClass}/all?${params}`; return ajax.getJSON(requestUrl).pipe( map(response => updateResults({ resultClass: resultClass, data: response })), @@ -76,7 +93,15 @@ const fetchByURIEpic = (action$, state$) => action$.pipe( withLatestFrom(state$), mergeMap(([action, state]) => { const { resultClass, facetClass, variant, uri } = action; - const params = stateSlicesToUrl(null, state[`${facetClass}Facets`], null, variant, facetClass); + const params = stateToUrl({ + facets: state[`${facetClass}Facets`].facets, + facetClass: facetClass, + page: null, + pagesize: null, + sortBy: null, + sortDirection: null, + variant: variant + }); const requestUrl = `${apiUrl}${resultClass}/instance/${encodeURIComponent(uri)}?${params}`; return ajax.getJSON(requestUrl).pipe( map(response => updateInstance({ resultClass: resultClass, instance: response })), @@ -97,31 +122,26 @@ const fetchFacetEpic = (action$, state$) => action$.pipe( ofType(FETCH_FACET), withLatestFrom(state$), mergeMap(([action, state]) => { - let params = { - sortBy: action.sortBy, - sortDirection: action.sortDirection - }; - let filters = {}; - let activeFilters = false; - for (const [key, value] of Object.entries(state[`${action.resultClass}Facets`].filters)) { - if (value.size != 0) { - activeFilters = true; - filters[key] = Array.from(value); - } - } - if (activeFilters) { - params.filters = JSON.stringify(filters); - } - const requestUrl = `${apiUrl}${action.resultClass}/facet/${action.id}?${stringify(params)}`; + const { facetClass, id, sortBy, sortDirection } = action; + const params = stateToUrl({ + facets: state[`${facetClass}Facets`].facets, + facetClass: null, + page: null, + pagesize: null, + sortBy: sortBy, + sortDirection: sortDirection, + variant: null + }); + const requestUrl = `${apiUrl}${action.facetClass}/facet/${id}?${params}`; return ajax.getJSON(requestUrl).pipe( map(res => updateFacet({ - resultClass: action.resultClass, - id: action.id, + facetClass: facetClass, + id: id, distinctValueCount: res.distinctValueCount, values: res.values, flatValues: res.flatValues, - sortBy: action.sortBy, - sortDirection: action.sortDirection + sortBy: sortBy, + sortDirection: sortDirection })), catchError(error => of({ type: FETCH_FACET_FAILED, @@ -137,29 +157,28 @@ const fetchFacetEpic = (action$, state$) => action$.pipe( }) ); -export const stateSlicesToUrl = (pagination, facets, sortBy, variant, facetClass) => { - //console.log(facets.spatialFilters) +export const stateToUrl = ({ + facets, + facetClass, + page, + pagesize, + sortBy, + sortDirection, + variant +}) => { let params = {}; - if (pagination != null) { - params.page = pagination.page; - params.pagesize = pagination.pagesize; - params.sortDirection = pagination.sortDirection; - } - if (sortBy !== null) { - params.sortBy = sortBy; - } - if (variant !== null) { - params.variant = variant; - } - if (facetClass !== null) { - params.facetClass = facetClass; - } + if (facetClass !== null) { params.facetClass = facetClass; } + if (page !== null) { params.page = page; } + if (pagesize !== null) { params.pagesize = pagesize; } + if (sortBy !== null) { params.sortBy = sortBy; } + if (sortDirection !== null) { params.sortDirection = sortDirection; } + if (variant !== null) { params.variant = variant; } let filters = {}; let activeFilters = false; - for (const [key, value] of Object.entries(facets.filters)) { - if (value.size != 0) { + for (const [key, value] of Object.entries(facets)) { + if (value.uriFilter.size != 0) { activeFilters = true; - filters[key] = Array.from(value); + filters[key] = Array.from(value.uriFilter); } } if (activeFilters) { diff --git a/src/client/reducers/helpers.js b/src/client/reducers/helpers.js index 848a794f..77f06fb2 100644 --- a/src/client/reducers/helpers.js +++ b/src/client/reducers/helpers.js @@ -43,36 +43,34 @@ export const updateSortBy = (state, action) => { }; export const updateFilter = (state, action) => { - const { property, value } = action; - let valueSet = state.filters[property]; - if (valueSet.has(value)) { - valueSet.delete(value); - } else { - valueSet.add(value); + let { property, value } = action; + const oldFacet = state.facets[property]; + let newFacet = {}; + if (oldFacet.filterType === 'uri') { + let newUriFilter = oldFacet.uriFilter; + if (newUriFilter.has(value)) { + newUriFilter.delete(value); + } else { + newUriFilter.add(value); + } + newFacet = { + ...state.facets[property], + uriFilter: newUriFilter + }; + } else if (oldFacet.filterType === 'spatial') { + newFacet = { + ...state.facets[property], + spatialFilter: value + }; } - const newFacetFilters = { - ...state.filters, - [ property ] : valueSet - }; return { ...state, - filters: newFacetFilters, updatedFacet: property, - facetUpdateID: ++state.facetUpdateID - }; -}; - -export const updateSpatialFilter = (state, action) => { - const { property, filter } = action; - const newFacetFilters = { - ...state.spatialFilters, - [ property ] : filter - }; - return { - ...state, - spatialFilters: newFacetFilters, - updatedFacet: property, - facetUpdateID: ++state.facetUpdateID + facetUpdateID: ++state.facetUpdateID, + facets: { + ...state.facets, + [ property ]: newFacet + } }; }; diff --git a/src/client/reducers/manuscriptsFacets.js b/src/client/reducers/manuscriptsFacets.js index 8fcc4935..30911a92 100644 --- a/src/client/reducers/manuscriptsFacets.js +++ b/src/client/reducers/manuscriptsFacets.js @@ -28,6 +28,8 @@ export const INITIAL_STATE = { isFetching: false, searchField: false, containerClass: 'three', + filterType: 'uri', + uriFilter: new Set() }, productionPlace: { id: 'productionPlace', @@ -42,7 +44,9 @@ export const INITIAL_STATE = { isFetching: false, searchField: true, containerClass: 'ten', - filterType: 'spatial' + filterType: 'uri', + uriFilter: new Set(), + spatialFilter: {} }, author: { id: 'author', @@ -57,6 +61,8 @@ export const INITIAL_STATE = { isFetching: false, searchField: true, containerClass: 'ten', + filterType: 'uri', + uriFilter: new Set() }, // language: { // id: 'language', @@ -68,17 +74,11 @@ export const INITIAL_STATE = { // sortDirection: 'asc', // isFetching: false, // }, - }, - filters: { - productionPlace: new Set(), - author: new Set(), - source: new Set(), - language: new Set(), - }, + } }; const manuscriptsFacets = (state = INITIAL_STATE, action) => { - if (action.resultClass === 'manuscripts') { + if (action.facetClass === 'manuscripts') { switch (action.type) { case FETCH_FACET: return fetchFacet(state, action); diff --git a/src/client/reducers/organizationsFacets.js b/src/client/reducers/organizationsFacets.js index d31e0b82..613bc431 100644 --- a/src/client/reducers/organizationsFacets.js +++ b/src/client/reducers/organizationsFacets.js @@ -4,7 +4,12 @@ import { UPDATE_FACET, UPDATE_FILTER, } from '../actions'; -import { updateFilter, fetchFacet, fetchFacetFailed, updateFacet } from './helpers'; +import { + updateFilter, + fetchFacet, + fetchFacetFailed, + updateFacet +} from './helpers'; export const INITIAL_STATE = { updatedFacet: null, @@ -23,16 +28,14 @@ export const INITIAL_STATE = { isFetching: false, searchField: false, containerClass: 'five', + filterType: 'uri', + uriFilter: new Set() }, - }, - filters: { - source: new Set(), - place: new Set(), - }, + } }; const organizationsFacets = (state = INITIAL_STATE, action) => { - if (action.resultClass === 'organizations') { + if (action.facetClass === 'organizations') { switch (action.type) { case FETCH_FACET: return fetchFacet(state, action); diff --git a/src/client/reducers/peopleFacets.js b/src/client/reducers/peopleFacets.js index c4d7a063..cfcf04cd 100644 --- a/src/client/reducers/peopleFacets.js +++ b/src/client/reducers/peopleFacets.js @@ -4,7 +4,12 @@ import { UPDATE_FACET, UPDATE_FILTER, } from '../actions'; -import { updateFilter, fetchFacet, fetchFacetFailed, updateFacet } from './helpers'; +import { + updateFilter, + fetchFacet, + fetchFacetFailed, + updateFacet +} from './helpers'; export const INITIAL_STATE = { updatedFacet: null, @@ -23,6 +28,8 @@ export const INITIAL_STATE = { isFetching: false, searchField: false, containerClass: 'five', + filterType: 'uri', + uriFilter: new Set() }, place: { id: 'place', @@ -37,16 +44,14 @@ export const INITIAL_STATE = { isFetching: false, searchField: true, containerClass: 'ten', + filterType: 'uri', + uriFilter: new Set() }, - }, - filters: { - source: new Set(), - place: new Set(), - }, + } }; const peopleFacets = (state = INITIAL_STATE, action) => { - if (action.resultClass === 'people') { + if (action.facetClass === 'people') { switch (action.type) { case FETCH_FACET: return fetchFacet(state, action); diff --git a/src/client/reducers/placesFacets.js b/src/client/reducers/placesFacets.js index cb2e1360..a164e003 100644 --- a/src/client/reducers/placesFacets.js +++ b/src/client/reducers/placesFacets.js @@ -3,11 +3,9 @@ import { FETCH_FACET_FAILED, UPDATE_FACET, UPDATE_FILTER, - UPDATE_SPATIAL_FILTER, } from '../actions'; import { updateFilter, - updateSpatialFilter, fetchFacet, fetchFacetFailed, updateFacet @@ -30,6 +28,8 @@ export const INITIAL_STATE = { isFetching: false, searchField: false, containerClass: 'five', + filterType: 'uri', + uriFilter: new Set() }, area: { id: 'area', @@ -42,36 +42,17 @@ export const INITIAL_STATE = { sortDirection: 'asc', sortButton: false, isFetching: false, - searchField: false, + searchField: true, containerClass: 'ten', + filterType: 'uri', + uriFilter: new Set(), + spatialFilter: {} }, - // type: { - // id: 'type', - // label: 'Type', - // // predicate: defined in backend - // distinctValueCount: 0, - // values: [], - // flatValues: [], - // sortBy: 'instanceCount', - // sortDirection: 'desc', - // sortButton: false, - // isFetching: false, - // searchField: false, - // containerSize: 'large', - //} , - }, - filters: { - source: new Set(), - area: new Set(), - type: new Set(), - }, - spatialFilters: { - productionPlace: {} } }; const placesFacets = (state = INITIAL_STATE, action) => { - if (action.resultClass === 'places') { + if (action.facetClass === 'places') { switch (action.type) { case FETCH_FACET: return fetchFacet(state, action); @@ -81,8 +62,6 @@ const placesFacets = (state = INITIAL_STATE, action) => { return updateFacet(state, action); case UPDATE_FILTER: return updateFilter(state, action); - case UPDATE_SPATIAL_FILTER: - return updateSpatialFilter(state, action); default: return state; } diff --git a/src/client/reducers/worksFacets.js b/src/client/reducers/worksFacets.js index 5684f913..ba3df8d7 100644 --- a/src/client/reducers/worksFacets.js +++ b/src/client/reducers/worksFacets.js @@ -4,7 +4,12 @@ import { UPDATE_FACET, UPDATE_FILTER, } from '../actions'; -import { updateFilter, fetchFacet, fetchFacetFailed, updateFacet } from './helpers'; +import { + updateFilter, + fetchFacet, + fetchFacetFailed, + updateFacet +} from './helpers'; export const INITIAL_STATE = { updatedFacet: null, @@ -23,15 +28,14 @@ export const INITIAL_STATE = { isFetching: false, searchField: false, containerClass: 'five', + filterType: 'uri', + uriFilter: new Set() }, }, - filters: { - source: new Set(), - } }; const worksFacets = (state = INITIAL_STATE, action) => { - if (action.resultClass === 'works') { + if (action.facetClass === 'works') { switch (action.type) { case FETCH_FACET: return fetchFacet(state, action); diff --git a/src/server/index.js b/src/server/index.js index d740903d..733af853 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -55,9 +55,9 @@ app.get(`${apiPath}/:resultClass/instance/:uri`, (req, res, next) => { }).catch(next); }); -app.get(`${apiPath}/:resultClass/facet/:id`, (req, res, next) => { +app.get(`${apiPath}/:facetClass/facet/:id`, (req, res, next) => { const filters = req.query.filters == null ? null : JSON.parse(req.query.filters); - return getFacet(req.params.resultClass, req.params.id, req.query.sortBy, req.query.sortDirection, filters).then(data => { + return getFacet(req.params.facetClass, req.params.id, req.query.sortBy, req.query.sortDirection, filters).then(data => { res.json(data); }).catch(next); }); diff --git a/src/server/sparql/FacetValues.js b/src/server/sparql/FacetValues.js index 4888fcf8..9fc87ae1 100644 --- a/src/server/sparql/FacetValues.js +++ b/src/server/sparql/FacetValues.js @@ -11,15 +11,15 @@ import { const sparqlSearchEngine = new SparqlSearchEngine(); -export const getFacet = (resultClass, facetID, sortBy, sortDirection, filters) => { +export const getFacet = (facetClass, facetID, sortBy, sortDirection, filters) => { let q = facetValuesQuery; - const facetConfig = facetConfigs[resultClass][facetID]; + const facetConfig = facetConfigs[facetClass][facetID]; let selectedBlock = '# no selections'; let filterBlock = '# no filters'; let parentBlock = '# no parents'; let mapper = mapFacet; if (filters !== null) { - filterBlock = generateFilter(resultClass, resultClass, filters, 'instance', facetID); + filterBlock = generateFilter(facetClass, facetClass, filters, 'instance', facetID); if (has(filters, facetID)) { selectedBlock = ` OPTIONAL { @@ -34,7 +34,7 @@ export const getFacet = (resultClass, facetID, sortBy, sortDirection, filters) = parentBlock = ` UNION { - ${generateFilter(resultClass, resultClass, filters, 'different_instance', facetID)} + ${generateFilter(facetClass, facetClass, filters, 'different_instance', facetID)} ?different_instance ${facetConfig.parentPredicate} ?id . BIND(COALESCE(?selected_, false) as ?selected) OPTIONAL { ?id skos:prefLabel ?prefLabel_ } @@ -47,7 +47,7 @@ export const getFacet = (resultClass, facetID, sortBy, sortDirection, filters) = } `; } - q = q.replace(/<RDF_TYPE>/g, facetConfigs[resultClass].rdfType); + q = q.replace(/<RDF_TYPE>/g, facetConfigs[facetClass].rdfType); q = q.replace(/<FILTER>/g, filterBlock ); q = q.replace(/<PREDICATE>/g, facetConfig.predicate); q = q.replace('<SELECTED_VALUES>', selectedBlock); diff --git a/src/server/sparql/SparqlQueriesGeneral.js b/src/server/sparql/SparqlQueriesGeneral.js index 630494bb..0c06c28d 100644 --- a/src/server/sparql/SparqlQueriesGeneral.js +++ b/src/server/sparql/SparqlQueriesGeneral.js @@ -1,4 +1,5 @@ -export const endpoint = 'http://ldf.fi/mmm-cidoc/sparql'; +// export const endpoint = 'http://ldf.fi/mmm-cidoc/sparql'; +export const endpoint = 'http://localhost:3050/ds/sparql'; export const countQuery = ` SELECT (COUNT(DISTINCT ?id) as ?count) -- GitLab