@@ -3,15 +3,21 @@ import { groupBy, orderBy } from 'lodash'
33import moment from 'moment-timezone'
44import { TZ } from '../constants'
55
6- export function filterByDateGroups < T extends ValidityRange > ( items : T [ ] , date : string ) : T [ ] {
7- let groupedItems = groupBy < T > ( items , ( item : T ) => `${ item . date_begin } _${ item . date_end } ` )
8- let hasModifiedDate = ! ! items [ 0 ] ?. date_modified
9- let validOnDate = moment . tz ( date , TZ )
6+ type ValidityRangeWithImport = ValidityRange & {
7+ date_imported ?: string
8+ }
9+
10+ export function filterByDateGroups < T extends ValidityRangeWithImport > (
11+ items : T [ ] ,
12+ date : string
13+ ) : T [ ] {
14+ const groupedItems = groupBy ( items , ( item ) => `${ item . date_begin } _${ item . date_end } ` )
15+ const validOnDate = moment . tz ( date , TZ )
1016
11- let validGroupEntries = Object . entries < T [ ] > ( groupedItems ) . filter ( ( [ validityRange ] ) => {
12- let range = validityRange . split ( '_' )
13- let rangeStart = moment . tz ( range [ 0 ] , TZ )
14- let rangeEnd = moment . tz ( range [ 1 ] , TZ )
17+ const validGroupEntries = Object . entries ( groupedItems ) . filter ( ( [ validityRange ] ) => {
18+ const [ start , end ] = validityRange . split ( '_' )
19+ const rangeStart = moment . tz ( start , TZ )
20+ const rangeEnd = moment . tz ( end , TZ )
1521
1622 return validOnDate . isBetween ( rangeStart , rangeEnd , 'day' , '[]' )
1723 } )
@@ -27,16 +33,38 @@ export function filterByDateGroups<T extends ValidityRange>(items: T[], date: st
2733 return validGroupEntries [ 0 ] [ 1 ]
2834 }
2935
30- let orderedGroups = orderBy (
36+ const getLatestAllowedImportUnix = ( groupItems : T [ ] ) => {
37+ const allowedImports = groupItems
38+ . map ( ( item ) => item . date_imported )
39+ . filter ( ( d ) : d is string => ! ! d )
40+ . map ( ( d ) => moment . tz ( d , TZ ) )
41+ . filter ( ( importDate ) => importDate . isSameOrBefore ( validOnDate , 'day' ) )
42+
43+ if ( allowedImports . length === 0 ) {
44+ return null
45+ }
46+
47+ return Math . max ( ...allowedImports . map ( ( d ) => d . unix ( ) ) )
48+ }
49+
50+ const hasAnyAllowedImports = validGroupEntries . some ( ( [ , groupItems ] ) => {
51+ return getLatestAllowedImportUnix ( groupItems ) !== null
52+ } )
53+
54+ const orderedGroups = orderBy (
3155 validGroupEntries ,
32- ( [ , items ] ) => {
33- // if (hasModifiedDate) {
34- // return moment(items[0].date_modified).unix()
35- // }
36-
37- return moment ( items [ 0 ] . date_begin ) . unix ( )
38- } ,
39- 'desc'
56+ hasAnyAllowedImports
57+ ? [
58+ // First order by the latest allowed date_imported, so that groups with more recent imports that are still valid on the UI date come first.
59+ ( [ , groupItems ] ) => getLatestAllowedImportUnix ( groupItems ) ?? 0 ,
60+ // If there are multiple groups with the same latest allowed import date order those groups by date_begin.
61+ ( [ , groupItems ] ) => moment . tz ( groupItems [ 0 ] . date_begin , TZ ) . unix ( ) ,
62+ ]
63+ : [
64+ // If there are no allowed date_importeds just order by date_begin.
65+ ( [ , groupItems ] ) => moment . tz ( groupItems [ 0 ] . date_begin , TZ ) . unix ( ) ,
66+ ] ,
67+ hasAnyAllowedImports ? [ 'desc' , 'desc' ] : [ 'desc' ]
4068 )
4169
4270 return orderedGroups [ 0 ] [ 1 ] // Select the items from the first, ie most valid, group.
0 commit comments