Skip to content
Snippets Groups Projects
helpers.js 7.48 KiB
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
  }
}