Skip to content

Commit 6df2593

Browse files
committed
ChangeHistory: Fix broken history on priority change
Always fetch all history items, and perform the priority filtering on UI side post fact, for the final list of items to display. This ensures we don't end up in a situation where we have a "missing" version, due to it having a wrong priority.
1 parent fff0b18 commit 6df2593

4 files changed

Lines changed: 48 additions & 37 deletions

File tree

ui/src/components/routes-and-lines/line-change-history/queries/useGetLineChangeHistory.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,9 @@ import {
2323
import { LineChangeHistoryItem, TgOperation } from '../types';
2424

2525
const GQL_GET_LINE_CHANGE_HISTORY = gql`
26-
query GetLineChangeHistory($label: String!, $priority: Int!) {
26+
query GetLineChangeHistory($label: String!) {
2727
historyItems: route_line_change_history(
28-
where: {
29-
_and: [
30-
{ line_label: { _eq: $label } }
31-
{ line_priority: { _eq: $priority } }
32-
]
33-
}
28+
where: { line_label: { _eq: $label } }
3429
) {
3530
...LineChangeHistoryItemDetails
3631
}
@@ -241,8 +236,12 @@ function filterHistoryItems(
241236
): (item: LineChangeHistoryItem) => boolean {
242237
const from = filters.from.startOf('day');
243238
const to = filters.to.endOf('day');
239+
const { priority } = filters;
244240

245-
return (item) => from <= item.changed && item.changed <= to;
241+
return (item) =>
242+
item.linePriority === priority &&
243+
from <= item.changed &&
244+
item.changed <= to;
246245
}
247246

248247
const noopGetUserNameById: GetUserNameById = () => null;
@@ -285,7 +284,7 @@ export function useGetLineChangeHistoryItems({
285284
sortingInfo,
286285
}: GetLineChangeHistoryOptions) {
287286
const { data, ...rest } = useGetLineChangeHistoryQuery({
288-
variables: { label, priority: filters.priority },
287+
variables: { label },
289288
});
290289

291290
const historyItems: ReadonlyArray<LineChangeHistoryItem> = useMemo(

ui/src/components/stop-registry/stops/change-history/queries/useGetStopChangeHistoryItems.ts

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,18 @@ import {
1212
ChangeHistoryFilters,
1313
ChangeHistorySortingInfo,
1414
} from '../../../../common/ChangeHistory';
15-
import { sortByVersion, useSortTiamatHistoryItems } from '../../../utils';
15+
import {
16+
historyItemIsDateRange,
17+
sortByVersion,
18+
useSortTiamatHistoryItems,
19+
} from '../../../utils';
1620
import { sortByChangedTime } from '../../../utils/sortTiamatChangeHistoryItems';
1721

1822
const GQL_GET_STOP_CHANGE_HISTORY = gql`
19-
query GetStopChangeHistory($publicCode: String!, $priority: String!) {
23+
query GetStopChangeHistory($publicCode: String!) {
2024
stopsDb: stops_database {
2125
historyItems: getQuayChangeHistory(
22-
where: {
23-
_and: [
24-
{ publicCode: { _eq: $publicCode } }
25-
{ priority: { _eq: $priority } }
26-
]
27-
}
26+
where: { publicCode: { _eq: $publicCode } }
2827
) {
2928
...QuayChangeHistoryItemDetails
3029
}
@@ -61,12 +60,9 @@ type GetStopChangeHistoryOptions = {
6160
readonly publicCode: string;
6261
};
6362

64-
function useGetStopChangeHistorySortedByVersion(
65-
publicCode: string,
66-
priority: Priority,
67-
) {
63+
function useGetStopChangeHistorySortedByVersion(publicCode: string) {
6864
const { data, ...rest } = useGetStopChangeHistoryQuery({
69-
variables: { publicCode, priority: String(priority) },
65+
variables: { publicCode },
7066
});
7167

7268
const rawHistoryItems = data?.stopsDb?.historyItems;
@@ -84,23 +80,30 @@ function useGetStopChangeHistorySortedByVersion(
8480
return { ...rest, historyItems };
8581
}
8682

83+
function filterQuayHistoryItems(
84+
filters: ChangeHistoryFilters,
85+
): (item: QuayChangeHistoryItem) => boolean {
86+
const priorityStr = String(filters.priority);
87+
const isInDateRange = historyItemIsDateRange(filters);
88+
89+
return (item) => item.priority === priorityStr && isInDateRange(item);
90+
}
91+
8792
export function useGetStopChangeHistoryItems({
8893
filters,
8994
getUserNameById,
9095
publicCode,
9196
sortingInfo,
9297
}: GetStopChangeHistoryOptions) {
93-
const base = useGetStopChangeHistorySortedByVersion(
94-
publicCode,
95-
filters.priority,
96-
);
98+
const base = useGetStopChangeHistorySortedByVersion(publicCode);
9799

98100
const sortedHistoryItems: ReadonlyArray<QuayChangeHistoryItem> =
99101
useSortTiamatHistoryItems(
100102
base.historyItems,
101103
filters,
102104
sortingInfo,
103105
getUserNameById,
106+
filterQuayHistoryItems,
104107
);
105108

106109
return { ...base, sortedHistoryItems };
@@ -112,15 +115,18 @@ export function useGetLatestStopChangeHistory(
112115
publicCode: string,
113116
priority: Priority,
114117
) {
115-
const base = useGetStopChangeHistorySortedByVersion(publicCode, priority);
118+
const priorityStr = String(priority);
119+
const base = useGetStopChangeHistorySortedByVersion(publicCode);
120+
116121
return {
117122
...base,
118123
latestHistoryItems: useMemo(
119124
() =>
120125
base.historyItems
126+
.filter((it) => it.priority === priorityStr)
121127
.toSorted(sortByChangedTime(SortOrder.DESCENDING))
122128
.slice(0, latestChangesLimit),
123-
[base.historyItems],
129+
[base.historyItems, priorityStr],
124130
),
125131
};
126132
}

ui/src/components/stop-registry/utils/useSortTiamatHistoryItems.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { sortBySortingInfo } from './sortTiamatChangeHistoryItems';
1111

1212
export const noopGetUserNameById: GetUserNameById = () => null;
1313

14-
function historyItemIsDateRange({
14+
export function historyItemIsDateRange({
1515
from,
1616
to,
1717
}: ChangeHistoryFilters): (item: BaseTiamatChangeHistoryItem) => boolean {
@@ -30,6 +30,9 @@ export function useSortTiamatHistoryItems<
3030
filters: ChangeHistoryFilters,
3131
sortingInfo: ChangeHistorySortingInfo,
3232
getUserNameByIdRealImpl: GetUserNameById,
33+
getFilterFn: (
34+
filters: ChangeHistoryFilters,
35+
) => (item: T) => boolean = historyItemIsDateRange,
3336
): ReadonlyArray<T> {
3437
const collator = useCollator({ numeric: true });
3538

@@ -43,8 +46,15 @@ export function useSortTiamatHistoryItems<
4346
return useMemo(
4447
() =>
4548
historyItems
46-
.filter(historyItemIsDateRange(filters))
49+
.filter(getFilterFn(filters))
4750
.sort(sortBySortingInfo(sortingInfo, collator, getUserNameById)),
48-
[historyItems, filters, sortingInfo, collator, getUserNameById],
51+
[
52+
historyItems,
53+
filters,
54+
sortingInfo,
55+
collator,
56+
getUserNameById,
57+
getFilterFn,
58+
],
4959
);
5060
}

ui/src/generated/graphql.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71955,7 +71955,6 @@ export type UpdateRouteJourneyPatternMutation = {
7195571955

7195671956
export type GetLineChangeHistoryQueryVariables = Exact<{
7195771957
label: Scalars['String']['input'];
71958-
priority: Scalars['Int']['input'];
7195971958
}>;
7196071959

7196171960

@@ -76808,7 +76807,6 @@ export type DetailsForHistoricalStopVersionFragment = {
7680876807

7680976808
export type GetStopChangeHistoryQueryVariables = Exact<{
7681076809
publicCode: Scalars['String']['input'];
76811-
priority: Scalars['String']['input'];
7681276810
}>;
7681376811

7681476812

@@ -85197,7 +85195,7 @@ export function useUpdateRouteJourneyPatternMutation(baseOptions?: Apollo.Mutati
8519785195
export type UpdateRouteJourneyPatternMutationHookResult = ReturnType<typeof useUpdateRouteJourneyPatternMutation>;
8519885196
export type UpdateRouteJourneyPatternMutationResult = Apollo.MutationResult<UpdateRouteJourneyPatternMutation>;
8519985197
export type UpdateRouteJourneyPatternMutationOptions = Apollo.BaseMutationOptions<UpdateRouteJourneyPatternMutation, UpdateRouteJourneyPatternMutationVariables>;
85200-
export const GetLineChangeHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetLineChangeHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"label"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"priority"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"historyItems"},"name":{"kind":"Name","value":"route_line_change_history"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_and"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"line_label"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"label"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"line_priority"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"priority"}}}]}}]}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LineChangeHistoryItemDetails"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LineChangeHistoryItemDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"route_line_change_history"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","alias":{"kind":"Name","value":"tgOperation"},"name":{"kind":"Name","value":"tg_operation"}},{"kind":"Field","alias":{"kind":"Name","value":"lineId"},"name":{"kind":"Name","value":"line_id"}},{"kind":"Field","alias":{"kind":"Name","value":"lineLabel"},"name":{"kind":"Name","value":"line_label"}},{"kind":"Field","alias":{"kind":"Name","value":"linePriority"},"name":{"kind":"Name","value":"line_priority"}},{"kind":"Field","alias":{"kind":"Name","value":"lineValidityStart"},"name":{"kind":"Name","value":"line_validity_start"}},{"kind":"Field","alias":{"kind":"Name","value":"lineValidityEnd"},"name":{"kind":"Name","value":"line_validity_end"}},{"kind":"Field","alias":{"kind":"Name","value":"routeId"},"name":{"kind":"Name","value":"route_id"}},{"kind":"Field","alias":{"kind":"Name","value":"routeLabel"},"name":{"kind":"Name","value":"route_label"}},{"kind":"Field","alias":{"kind":"Name","value":"routeDirection"},"name":{"kind":"Name","value":"route_direction"}},{"kind":"Field","alias":{"kind":"Name","value":"routeValidityStart"},"name":{"kind":"Name","value":"route_validity_start"}},{"kind":"Field","alias":{"kind":"Name","value":"routeValidityEnd"},"name":{"kind":"Name","value":"route_validity_end"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","alias":{"kind":"Name","value":"versionComment"},"name":{"kind":"Name","value":"version_comment"}},{"kind":"Field","name":{"kind":"Name","value":"changed"}},{"kind":"Field","alias":{"kind":"Name","value":"changedBy"},"name":{"kind":"Name","value":"changed_by"}}]}}]} as unknown as DocumentNode;
85198+
export const GetLineChangeHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetLineChangeHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"label"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"historyItems"},"name":{"kind":"Name","value":"route_line_change_history"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"line_label"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"label"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LineChangeHistoryItemDetails"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LineChangeHistoryItemDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"route_line_change_history"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","alias":{"kind":"Name","value":"tgOperation"},"name":{"kind":"Name","value":"tg_operation"}},{"kind":"Field","alias":{"kind":"Name","value":"lineId"},"name":{"kind":"Name","value":"line_id"}},{"kind":"Field","alias":{"kind":"Name","value":"lineLabel"},"name":{"kind":"Name","value":"line_label"}},{"kind":"Field","alias":{"kind":"Name","value":"linePriority"},"name":{"kind":"Name","value":"line_priority"}},{"kind":"Field","alias":{"kind":"Name","value":"lineValidityStart"},"name":{"kind":"Name","value":"line_validity_start"}},{"kind":"Field","alias":{"kind":"Name","value":"lineValidityEnd"},"name":{"kind":"Name","value":"line_validity_end"}},{"kind":"Field","alias":{"kind":"Name","value":"routeId"},"name":{"kind":"Name","value":"route_id"}},{"kind":"Field","alias":{"kind":"Name","value":"routeLabel"},"name":{"kind":"Name","value":"route_label"}},{"kind":"Field","alias":{"kind":"Name","value":"routeDirection"},"name":{"kind":"Name","value":"route_direction"}},{"kind":"Field","alias":{"kind":"Name","value":"routeValidityStart"},"name":{"kind":"Name","value":"route_validity_start"}},{"kind":"Field","alias":{"kind":"Name","value":"routeValidityEnd"},"name":{"kind":"Name","value":"route_validity_end"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","alias":{"kind":"Name","value":"versionComment"},"name":{"kind":"Name","value":"version_comment"}},{"kind":"Field","name":{"kind":"Name","value":"changed"}},{"kind":"Field","alias":{"kind":"Name","value":"changedBy"},"name":{"kind":"Name","value":"changed_by"}}]}}]} as unknown as DocumentNode;
8520185199

8520285200
/**
8520385201
* __useGetLineChangeHistoryQuery__
@@ -85212,7 +85210,6 @@ export const GetLineChangeHistoryDocument = {"kind":"Document","definitions":[{"
8521285210
* const { data, loading, error } = useGetLineChangeHistoryQuery({
8521385211
* variables: {
8521485212
* label: // value for 'label'
85215-
* priority: // value for 'priority'
8521685213
* },
8521785214
* });
8521885215
*/
@@ -86616,7 +86613,7 @@ export type GetVersionedStopPlaceAndQuaysQueryHookResult = ReturnType<typeof use
8661686613
export type GetVersionedStopPlaceAndQuaysLazyQueryHookResult = ReturnType<typeof useGetVersionedStopPlaceAndQuaysLazyQuery>;
8661786614
export type GetVersionedStopPlaceAndQuaysSuspenseQueryHookResult = ReturnType<typeof useGetVersionedStopPlaceAndQuaysSuspenseQuery>;
8661886615
export type GetVersionedStopPlaceAndQuaysQueryResult = Apollo.QueryResult<GetVersionedStopPlaceAndQuaysQuery, GetVersionedStopPlaceAndQuaysQueryVariables>;
86619-
export const GetStopChangeHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetStopChangeHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"publicCode"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"priority"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"stopsDb"},"name":{"kind":"Name","value":"stops_database"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"historyItems"},"name":{"kind":"Name","value":"getQuayChangeHistory"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_and"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"publicCode"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"publicCode"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"priority"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"priority"}}}]}}]}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"QuayChangeHistoryItemDetails"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuayChangeHistoryItemDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"QuayChangeHistoryItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"netexId"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"changed"}},{"kind":"Field","name":{"kind":"Name","value":"changedBy"}},{"kind":"Field","name":{"kind":"Name","value":"versionComment"}},{"kind":"Field","name":{"kind":"Name","value":"privateCodeType"}},{"kind":"Field","name":{"kind":"Name","value":"privateCodeValue"}},{"kind":"Field","name":{"kind":"Name","value":"publicCode"}},{"kind":"Field","name":{"kind":"Name","value":"importedId"}},{"kind":"Field","name":{"kind":"Name","value":"validityStart"}},{"kind":"Field","name":{"kind":"Name","value":"validityEnd"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"stopPlaceNetexId"}},{"kind":"Field","name":{"kind":"Name","value":"stopPlaceVersion"}}]}}]} as unknown as DocumentNode;
86616+
export const GetStopChangeHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetStopChangeHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"publicCode"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"stopsDb"},"name":{"kind":"Name","value":"stops_database"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"historyItems"},"name":{"kind":"Name","value":"getQuayChangeHistory"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"publicCode"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"publicCode"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"QuayChangeHistoryItemDetails"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuayChangeHistoryItemDetails"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"QuayChangeHistoryItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"netexId"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"changed"}},{"kind":"Field","name":{"kind":"Name","value":"changedBy"}},{"kind":"Field","name":{"kind":"Name","value":"versionComment"}},{"kind":"Field","name":{"kind":"Name","value":"privateCodeType"}},{"kind":"Field","name":{"kind":"Name","value":"privateCodeValue"}},{"kind":"Field","name":{"kind":"Name","value":"publicCode"}},{"kind":"Field","name":{"kind":"Name","value":"importedId"}},{"kind":"Field","name":{"kind":"Name","value":"validityStart"}},{"kind":"Field","name":{"kind":"Name","value":"validityEnd"}},{"kind":"Field","name":{"kind":"Name","value":"priority"}},{"kind":"Field","name":{"kind":"Name","value":"stopPlaceNetexId"}},{"kind":"Field","name":{"kind":"Name","value":"stopPlaceVersion"}}]}}]} as unknown as DocumentNode;
8662086617

8662186618
/**
8662286619
* __useGetStopChangeHistoryQuery__
@@ -86631,7 +86628,6 @@ export const GetStopChangeHistoryDocument = {"kind":"Document","definitions":[{"
8663186628
* const { data, loading, error } = useGetStopChangeHistoryQuery({
8663286629
* variables: {
8663386630
* publicCode: // value for 'publicCode'
86634-
* priority: // value for 'priority'
8663586631
* },
8663686632
* });
8663786633
*/

0 commit comments

Comments
 (0)