diff --git a/src/public/modules/forms/helpers/CsvMergedHeadersGenerator.js b/src/public/modules/forms/helpers/CsvMergedHeadersGenerator.js index 9026cf3412..622e95af67 100644 --- a/src/public/modules/forms/helpers/CsvMergedHeadersGenerator.js +++ b/src/public/modules/forms/helpers/CsvMergedHeadersGenerator.js @@ -19,6 +19,7 @@ class CsvMergedHeadersGenerator extends CsvGenerator { super(expectedNumberOfRecords, numOfMetaDataRows) this.hasBeenProcessed = false + this.hasBeenSorted = false this.fieldIdToQuestion = new Map() this.fieldIdToNumCols = {} this.unprocessed = [] @@ -121,10 +122,18 @@ class CsvMergedHeadersGenerator extends CsvGenerator { } this.addLine(row) }) - this.hasBeenProcessed = true } + /** + * Sorts unprocessed records from oldest to newest + */ + sort() { + if (this.hasBeenSorted) return + this.unprocessed.sort((a, b) => this._dateComparator(a.created, b.created)) + this.hasBeenSorted = true + } + /** * Add meta-data as first three rows of the CSV. If there is already meta-data * added, it will be replaced by the latest counts. @@ -145,9 +154,29 @@ class CsvMergedHeadersGenerator extends CsvGenerator { * @param {string} filename */ downloadCsv(filename) { + this.sort() this.process() this.triggerFileDownload(filename) } + + /** + * Comparator for dates + * @param string firstDate + * @param string secondDate + */ + _dateComparator(firstDate, secondDate) { + // cast to Asia/Singapore to ensure both dates are of the same timezone + const first = moment(firstDate).tz('Asia/Singapore') + const second = moment(secondDate).tz('Asia/Singapore') + if (first.isBefore(second)) { + return -1 + } else if (first.isAfter(second)) { + return 1 + } else { + // dates are the same + return 0 + } + } } module.exports = CsvMergedHeadersGenerator