import { has, isEmpty } from 'lodash'
import { UPDATE_FACET_VALUES_CONSTRAIN_SELF } from '../../actions'
export const fetchResults = state => {
return {
...state,
instance: null,
instanceTableData: null,
instanceTableExternalData: null,
fetching: true
}
}
export const fetchResultCount = state => {
return {
...state,
resultCount: null,
fetchingResultCount: true
}
}
export const fetchInstanceAnalysisData = state => {
return {
...state,
instanceAnalysisData: null,
fetchingInstanceAnalysisData: true
}
}
export const fetchResultsFailed = state => {
return {
...state,
fetching: false
}
}
export const updateInstanceTableData = (state, action) => {
return {
...state,
instanceTableData: action.data.length === 1 ? action.data[0] : {},
instanceSparqlQuery: action.sparqlQuery,
fetching: false
}
}
export const updateInstanceTableExternalData = (state, action) => {
return {
...state,
instanceTableExternalData: action.data,
fetching: false
}
}
export const updateInstanceAnalysisData = (state, action) => {
return {
...state,
instanceAnalysisData: action.data,
instanceAnalysisDataUpdateID: ++state.instanceAnalysisDataUpdateID,
instanceSparqlQuery: action.sparqlQuery,
fetchingInstanceAnalysisData: false
}
}
export const updatePage = (state, action) => {
if (isNaN(action.page)) {
return state
} else {
return {
...state,
page: action.page
}
}
}
export const updateRowsPerPage = (state, action) => {
return {
...state,
pagesize: action.rowsPerPage
}
}
export const updateSortBy = (state, action) => {
if (state.sortBy === action.sortBy) {
return {
...state,
sortDirection: state.sortDirection === 'asc' ? 'desc' : 'asc'
}
} else {
return {
...state,
sortBy: action.sortBy,
sortDirection: 'asc'
}
}
}
export const updateFacetOption = (state, action) => {
const { facetID, option, value } = action
const filterTypes = [
'uriFilter',
'spatialFilter',
'textFilter',
'timespanFilter',
'integerFilter',
'dateFilter',
'integerFilterRange'
]
if (filterTypes.includes(action.option)) {
return updateFacetFilter(state, action)
} else {
return {
...state,
facets: {
...state.facets,
[facetID]: {
...state.facets[facetID],
[option]: value
}
}
}
}
}
const updateFacetFilter = (state, action) => {
const { facetID, value } = action
const oldFacet = state.facets[facetID]
let newFacet = {}
if (oldFacet.filterType === 'uriFilter') {
let newUriFilter = oldFacet.uriFilter == null ? {} : oldFacet.uriFilter
// 'value' is a react sortable tree object
if (has(newUriFilter, value.node.id)) {
value.added = false
delete newUriFilter[value.node.id]
if (isEmpty(newUriFilter)) {
newUriFilter = null
}
} else {
value.added = true
newUriFilter[value.node.id] = value
}
newFacet = {
...state.facets[facetID],
uriFilter: newUriFilter
}
} else if (oldFacet.filterType === 'spatialFilter') {
newFacet = {
...state.facets[facetID],
spatialFilter: value
}
} else if (oldFacet.filterType === 'textFilter') {
newFacet = {
...state.facets[facetID],
textFilter: value
}
} else if (oldFacet.filterType === 'timespanFilter' || oldFacet.filterType === 'dateFilter') {
if (value == null) {
newFacet = {
...state.facets[facetID],
timespanFilter: null
}
} else {
newFacet = {
...state.facets[facetID],
timespanFilter: {
start: value[0],
end: value[1]
}
}
}
} else if (oldFacet.filterType === 'integerFilter' ||
oldFacet.filterType === 'integerFilterRange') {
if (value == null) {
newFacet = {
...state.facets[facetID],
integerFilter: null
}
} else {
newFacet = {
...state.facets[facetID],
integerFilter: {
start: value[0],
end: value[1]
}
}
}
}
return {
...state,
updatedFacet: facetID,
facetUpdateID: ++state.facetUpdateID,
updatedFilter: value, // a react sortable tree object, latlngbounds or text filter
facets: {
...state.facets,
[facetID]: newFacet
}
}
}
export const updateResultCount = (state, action) => {
return {
...state,
resultCount: parseInt(action.data),
fetchingResultCount: false
}
}
export const updateResults = (state, action) => {
return {
...state,
results: action.data,
resultsSparqlQuery: action.sparqlQuery,
fetching: false,
resultUpdateID: ++state.resultUpdateID
}
}
export const updatePaginatedResults = (state, action) => {
return {
...state,
paginatedResults: action.data || [],
paginatedResultsSparqlQuery: action.sparqlQuery,
fetching: false
}
}
export const fetchFacet = (state, action) => {
return {
...state,
facets: {
...state.facets,
[action.facetID]: {
...state.facets[action.facetID],
isFetching: true
}
}
}
}
export const clearFacet = (state, action) => {
return {
...state,
updatedFacet: '', // force all facets to fetch new falues
facetUpdateID: ++state.facetUpdateID,
// updatedFilter: action.value, // a react sortable tree object, latlngbounds or text filter
facets: {
...state.facets,
[action.facetID]: {
...state.facets[action.facetID],
uriFilter: null
}
}
}
}
export const fetchFacetFailed = (state, action) => {
return {
...state,
facets: {
...state.facets,
[action.facetID]: {
...state.facets[action.facetID],
isFetching: false
}
},
updatedFacet: ''
}
}
export const updateFacetValues = (state, action) => {
if (state.facets[action.id].type === 'timespan' ||
state.facets[action.id].type === 'integer') {
return {
...state,
// with normal facets the 'facetUpdateID' is handled with the 'updateFacetFilter' function
...(action.type === UPDATE_FACET_VALUES_CONSTRAIN_SELF) && { facetUpdateID: ++state.facetUpdateID },
facets: {
...state.facets,
[action.id]: {
...state.facets[action.id],
min: action.data.min || null,
max: action.data.max || null,
isFetching: false
}
}
}
} else {
return {
...state,
// with normal facets the 'facetUpdateID' is handled with the 'updateFacetFilter' function
...(action.type === UPDATE_FACET_VALUES_CONSTRAIN_SELF) && { facetUpdateID: ++state.facetUpdateID },
facets: {
...state.facets,
[action.id]: {
...state.facets[action.id],
distinctValueCount: state.facets[action.id].type === 'hierarchical'
? action.flatData.length : action.data.length,
values: action.data || [],
flatValues: action.flatData || [],
isFetching: false
}
}
}
}
}
export const updateHeaderExpanded = (state, action) => {
if (action.pageType === 'instancePage') {
return {
...state,
instancePageHeaderExpanded: !state.instancePageHeaderExpanded
}
} else {
return {
...state,
facetedSearchHeaderExpanded: !state.facetedSearchHeaderExpanded
}
}
}
export const updateKnowledgeGraphMetadata = (state, action) => {
return {
...state,
knowledgeGraphMetadata: action.data,
fetching: false
}
}