From e9bc54426f07ac074187e9e421e5ebb535946183 Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Sat, 14 Jan 2017 17:57:44 +0900 Subject: [PATCH] Call Utils.convertDates when loading and sorting data to convert any date field stored as a string into an actual date object --- .../nova-core/lib/containers/withDocument.js | 2 +- packages/nova-core/lib/containers/withList.js | 15 +++++------- packages/nova-lib/lib/utils.js | 24 +++++++++++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/nova-core/lib/containers/withDocument.js b/packages/nova-core/lib/containers/withDocument.js index a5741348c..63c3c7f2b 100644 --- a/packages/nova-core/lib/containers/withDocument.js +++ b/packages/nova-core/lib/containers/withDocument.js @@ -28,7 +28,7 @@ export default function withDocument (options) { const { ownProps, data } = returnedProps; return { loading: data.networkStatus === 1, - document: data[singleResolverName], + document: Utils.convertDates(collection, data[singleResolverName]), fragmentName, fragment, }; diff --git a/packages/nova-core/lib/containers/withList.js b/packages/nova-core/lib/containers/withList.js index 8317ac974..21015bf8c 100644 --- a/packages/nova-core/lib/containers/withList.js +++ b/packages/nova-core/lib/containers/withList.js @@ -36,7 +36,7 @@ import React, { PropTypes, Component } from 'react'; import { graphql } from 'react-apollo'; import gql from 'graphql-tag'; import update from 'immutability-helper'; -import { getSetting } from 'meteor/nova:core'; +import { getSetting, Utils } from 'meteor/nova:core'; import Mingo from 'mingo'; import { compose, withState } from 'recompose'; @@ -80,11 +80,7 @@ const withList = (options) => { // graphql query options options({terms, paginationTerms}) { - console.log('terms', terms); - console.log('paginationTerms', paginationTerms); const mergedTerms = {...terms, ...paginationTerms}; - console.log(mergedTerms); - // console.log(ownProps) return { variables: { terms: mergedTerms, @@ -104,7 +100,7 @@ const withList = (options) => { props(props) { const refetch = props.data.refetch, - results = props.data[listResolverName], + results = Utils.convertDates(collection, props.data[listResolverName]), totalCount = props.data[totalResolverName], networkStatus = props.data.networkStatus; @@ -193,16 +189,17 @@ const queryReducer = (previousResults, action, collection, mergedTerms, listReso // reorder results according to a sort const reorderResults = (results, sort) => { - const cursor = mingoQuery.find(results[listResolverName]); + const list = results[listResolverName]; + const convertedList = Utils.convertDates(collection, list); // convert date strings to date objects + const cursor = mingoQuery.find(convertedList); const sortedList = cursor.sort(sort).all(); - // console.log('sortedList: ', sortedList) results[listResolverName] = sortedList; return results; } // console.log('// withList reducer'); // console.log('queryName: ', queryName); - // console.log('terms: ', ownProps.terms); + // console.log('terms: ', mergedTerms); // console.log('selector: ', selector); // console.log('options: ', options); // console.log('previousResults: ', previousResults); diff --git a/packages/nova-lib/lib/utils.js b/packages/nova-lib/lib/utils.js index 7103257b3..623e3e7d0 100644 --- a/packages/nova-lib/lib/utils.js +++ b/packages/nova-lib/lib/utils.js @@ -410,3 +410,27 @@ Utils.arrayToFields = (fieldsArray) => { Utils.getComponentDisplayName = (WrappedComponent) => { return WrappedComponent.displayName || WrappedComponent.name || 'Component'; }; + + +/** + * Take a collection and a list of documents, and convert all their date fields to date objects + * This is necessary because Apollo doesn't support custom scalars, and stores dates as strings + * @param {Object} collection + * @param {Array} list + */ +Utils.convertDates = (collection, list) => { + if (!list || !list.length) return list; + + const schema = collection.simpleSchema()._schema; + const dateFields = _.filter(_.keys(schema), fieldName => schema[fieldName].type === Date); + const convertedList = list.map(result => { + dateFields.forEach(fieldName => { + if (result[fieldName] && typeof result[fieldName] === 'string') { + result[fieldName] = new Date(result[fieldName]); + } + }); + return result; + }); + + return convertedList; +} \ No newline at end of file