diff --git a/front/package.json b/front/package.json index 6b9ab78d75a..2a352331ff1 100644 --- a/front/package.json +++ b/front/package.json @@ -8,12 +8,12 @@ "@nivo/line": "^0.80.0", "@openapi-contrib/openapi-schema-to-json-schema": "^5.1.0", "@osrd-project/netzgrafik-frontend": "0.0.0-snapshot.6d049b7244241254c33afc3818f40ec57ab57217", - "@osrd-project/ui-core": "^0.0.52", - "@osrd-project/ui-icons": "^0.0.52", - "@osrd-project/ui-manchette": "^0.0.52", - "@osrd-project/ui-manchette-with-spacetimechart": "^0.0.52", - "@osrd-project/ui-spacetimechart": "^0.0.52", - "@osrd-project/ui-speedspacechart": "^0.0.52", + "@osrd-project/ui-core": "^0.0.53", + "@osrd-project/ui-icons": "^0.0.53", + "@osrd-project/ui-manchette": "^0.0.53", + "@osrd-project/ui-manchette-with-spacetimechart": "^0.0.53", + "@osrd-project/ui-spacetimechart": "^0.0.53", + "@osrd-project/ui-speedspacechart": "^0.0.53", "@react-pdf/renderer": "^3.4.2", "@redux-devtools/extension": "^3.3.0", "@reduxjs/toolkit": "^2.1.0", diff --git a/front/src/applications/operationalStudies/helpers/upsertNewProjectedTrains.ts b/front/src/applications/operationalStudies/helpers/upsertNewProjectedTrains.ts index 474fbb1bad8..82f91cade1c 100644 --- a/front/src/applications/operationalStudies/helpers/upsertNewProjectedTrains.ts +++ b/front/src/applications/operationalStudies/helpers/upsertNewProjectedTrains.ts @@ -18,10 +18,11 @@ const upsertNewProjectedTrains = ( const matchingTrain = trainSchedulesById.get(trainId); const projectedTrain = { - ...trainData, id: +trainId, name: matchingTrain?.train_name || 'Train name not found', - departure_time: trainData.departure_time, + departureTime: new Date(trainData.departure_time), + spaceTimeCurves: trainData.space_time_curves, + signalUpdates: trainData.signal_updates, }; newProjectedTrains.set(trainId, projectedTrain); diff --git a/front/src/applications/operationalStudies/types.ts b/front/src/applications/operationalStudies/types.ts index e38b222031b..3c2e57ff552 100644 --- a/front/src/applications/operationalStudies/types.ts +++ b/front/src/applications/operationalStudies/types.ts @@ -71,10 +71,16 @@ export type ManageTrainSchedulePathProperties = { /** * Properties signal_updates time_end and time_start are in seconds taking count of the departure time */ +// TODO: reuse the type from osrd-ui/ui-manchette export type TrainSpaceTimeData = { id: number; name: string; -} & ProjectPathTrainResult; + spaceTimeCurves: { + positions: number[]; + times: number[]; + }[]; + departureTime: Date; +} & { signalUpdates: ProjectPathTrainResult['signal_updates'] }; export type PositionData = { [key in T]: number; diff --git a/front/src/applications/stdcm/hooks/useProjectedTrainsForStdcm.ts b/front/src/applications/stdcm/hooks/useProjectedTrainsForStdcm.ts index 03f30dc8467..30605a96f23 100644 --- a/front/src/applications/stdcm/hooks/useProjectedTrainsForStdcm.ts +++ b/front/src/applications/stdcm/hooks/useProjectedTrainsForStdcm.ts @@ -51,10 +51,7 @@ const useProjectedTrainsForStdcm = (stdcmResponse?: StdcmSuccessResponse) => { }); useEffect(() => { - const projectedTimetableTrains = Array.from(projectedTimetableTrainsById.values()); - const newSpaceTimeData = projectedTimetableTrains.filter( - (projectedTrain) => projectedTrain.space_time_curves.length > 0 - ); + const newSpaceTimeData = Array.from(projectedTimetableTrainsById.values()); if (stdcmProjectedTrain) { newSpaceTimeData.push(stdcmProjectedTrain); diff --git a/front/src/applications/stdcm/utils/formatStdcmIntoSpaceTimeData.ts b/front/src/applications/stdcm/utils/formatStdcmIntoSpaceTimeData.ts index d8a13602185..aed6f339733 100644 --- a/front/src/applications/stdcm/utils/formatStdcmIntoSpaceTimeData.ts +++ b/front/src/applications/stdcm/utils/formatStdcmIntoSpaceTimeData.ts @@ -1,24 +1,23 @@ -import type { ProjectPathTrainResult } from 'common/api/osrdEditoastApi'; +import type { TrainSpaceTimeData } from 'applications/operationalStudies/types'; import { STDCM_TRAIN_ID } from '../consts'; import type { StdcmSuccessResponse } from '../types'; const formatStdcmTrainIntoSpaceTimeData = ( stdcmResponse: StdcmSuccessResponse -): ProjectPathTrainResult & { id: number; name: string } => { - const { simulation, rollingStock, departure_time } = stdcmResponse; +): TrainSpaceTimeData => { + const { simulation, departure_time } = stdcmResponse; return { id: STDCM_TRAIN_ID, name: 'stdcm', - space_time_curves: [ + spaceTimeCurves: [ { times: simulation.final_output.times, positions: simulation.final_output.positions, }, ], - signal_updates: [], - rolling_stock_length: rollingStock.length, - departure_time, + signalUpdates: [], + departureTime: new Date(departure_time), }; }; diff --git a/front/src/modules/simulationResult/components/ManchetteWithSpaceTimeChart/ManchetteWithSpaceTimeChart.tsx b/front/src/modules/simulationResult/components/ManchetteWithSpaceTimeChart/ManchetteWithSpaceTimeChart.tsx index 770394e2801..27593b048c0 100644 --- a/front/src/modules/simulationResult/components/ManchetteWithSpaceTimeChart/ManchetteWithSpaceTimeChart.tsx +++ b/front/src/modules/simulationResult/components/ManchetteWithSpaceTimeChart/ManchetteWithSpaceTimeChart.tsx @@ -52,90 +52,101 @@ const ManchetteWithSpaceTimeChartWrapper = ({ const [waypointsPanelIsOpen, setWaypointsPanelIsOpen] = useState(false); // Cut the space time chart curves if the first or last waypoints are hidden - const spaceTimeChartLayersData = useMemo(() => { - let filteredProjectPathTrainResult = projectPathTrainResult; - let filteredConflicts = conflicts; - - if (!waypointsPanelData || waypointsPanelData.filteredWaypoints.length < 2) - return { filteredProjectPathTrainResult, filteredConflicts }; - - const { filteredWaypoints } = waypointsPanelData; - const firstPosition = filteredWaypoints.at(0)!.position; - const lastPosition = filteredWaypoints.at(-1)!.position; - - if (firstPosition !== 0 || lastPosition !== operationalPoints.at(-1)!.position) { - filteredProjectPathTrainResult = projectPathTrainResult.map((train) => ({ - ...train, - space_time_curves: train.space_time_curves.map(({ positions, times }) => { - const cutPositions: number[] = []; - const cutTimes: number[] = []; - - for (let i = 1; i < positions.length; i += 1) { - const currentRange: LayerRangeData = { - spaceStart: positions[i - 1], - spaceEnd: positions[i], - timeStart: times[i - 1], - timeEnd: times[i], - }; - - const interpolatedRange = cutSpaceTimeRect(currentRange, firstPosition, lastPosition); - - // TODO : remove reformatting the datas when /~https://github.com/OpenRailAssociation/osrd-ui/issues/694 is merged - if (!interpolatedRange) continue; - - if (i === 1 || cutPositions.length === 0) { - cutPositions.push(interpolatedRange.spaceStart); - cutTimes.push(interpolatedRange.timeStart); + const { filteredProjectPathTrainResult: cutProjectedTrains, filteredConflicts: cutConflicts } = + useMemo(() => { + let filteredProjectPathTrainResult = projectPathTrainResult; + let filteredConflicts = conflicts; + + if (!waypointsPanelData || waypointsPanelData.filteredWaypoints.length < 2) + return { filteredProjectPathTrainResult, filteredConflicts }; + + const { filteredWaypoints } = waypointsPanelData; + const firstPosition = filteredWaypoints.at(0)!.position; + const lastPosition = filteredWaypoints.at(-1)!.position; + + if (firstPosition !== 0 || lastPosition !== operationalPoints.at(-1)!.position) { + filteredProjectPathTrainResult = projectPathTrainResult.map((train) => ({ + ...train, + spaceTimeCurves: train.spaceTimeCurves.map(({ positions, times }) => { + const cutPositions: number[] = []; + const cutTimes: number[] = []; + + for (let i = 1; i < positions.length; i += 1) { + const currentRange: LayerRangeData = { + spaceStart: positions[i - 1], + spaceEnd: positions[i], + timeStart: times[i - 1], + timeEnd: times[i], + }; + + const interpolatedRange = cutSpaceTimeRect(currentRange, firstPosition, lastPosition); + + // TODO : remove reformatting the datas when /~https://github.com/OpenRailAssociation/osrd-ui/issues/694 is merged + if (!interpolatedRange) continue; + + if (i === 1 || cutPositions.length === 0) { + cutPositions.push(interpolatedRange.spaceStart); + cutTimes.push(interpolatedRange.timeStart); + } + cutPositions.push(interpolatedRange.spaceEnd); + cutTimes.push(interpolatedRange.timeEnd); } - cutPositions.push(interpolatedRange.spaceEnd); - cutTimes.push(interpolatedRange.timeEnd); - } - - return { - positions: cutPositions, - times: cutTimes, - }; - }), - signal_updates: compact( - train.signal_updates.map((signal) => { - const updatedSignalRange = cutSpaceTimeRect( - { - spaceStart: signal.position_start, - spaceEnd: signal.position_end, - timeStart: signal.time_start, - timeEnd: signal.time_end, - }, - firstPosition, - lastPosition - ); - - if (!updatedSignalRange) return null; - - // TODO : remove reformatting the datas when /~https://github.com/OpenRailAssociation/osrd-ui/issues/694 is merged + return { - ...signal, - position_start: updatedSignalRange.spaceStart, - position_end: updatedSignalRange.spaceEnd, - time_start: updatedSignalRange.timeStart, - time_end: updatedSignalRange.timeEnd, + positions: cutPositions, + times: cutTimes, }; - }) - ), - })); - - filteredConflicts = compact( - conflicts.map((conflict) => cutSpaceTimeRect(conflict, firstPosition, lastPosition)) - ); + }), + signalUpdates: compact( + train.signalUpdates.map((signal) => { + const updatedSignalRange = cutSpaceTimeRect( + { + spaceStart: signal.position_start, + spaceEnd: signal.position_end, + timeStart: signal.time_start, + timeEnd: signal.time_end, + }, + firstPosition, + lastPosition + ); + + if (!updatedSignalRange) return null; + + // TODO : remove reformatting the datas when /~https://github.com/OpenRailAssociation/osrd-ui/issues/694 is merged + return { + ...signal, + position_start: updatedSignalRange.spaceStart, + position_end: updatedSignalRange.spaceEnd, + time_start: updatedSignalRange.timeStart, + time_end: updatedSignalRange.timeEnd, + }; + }) + ), + })); + + filteredConflicts = compact( + conflicts.map((conflict) => cutSpaceTimeRect(conflict, firstPosition, lastPosition)) + ); + + return { filteredProjectPathTrainResult, filteredConflicts }; + } return { filteredProjectPathTrainResult, filteredConflicts }; - } - - return { filteredProjectPathTrainResult, filteredConflicts }; - }, [waypointsPanelData?.filteredWaypoints, projectPathTrainResult, conflicts]); + }, [waypointsPanelData?.filteredWaypoints, projectPathTrainResult, conflicts]); + + const manchetteWaypoints = useMemo(() => { + const rawWaypoints = waypointsPanelData?.filteredWaypoints ?? operationalPoints; + return rawWaypoints.map((waypoint) => ({ + id: waypoint.id, + position: waypoint.position, + name: waypoint.extensions?.identifier?.name, + secondaryCode: waypoint.extensions?.sncf?.ch, + })); + }, [waypointsPanelData, operationalPoints]); const { manchetteProps, spaceTimeChartProps, handleScroll } = useManchettesWithSpaceTimeChart( - waypointsPanelData?.filteredWaypoints ?? operationalPoints, - spaceTimeChartLayersData.filteredProjectPathTrainResult, + manchetteWaypoints, + cutProjectedTrains, manchetteWithSpaceTimeChartRef, selectedTrainScheduleId ); @@ -146,19 +157,17 @@ const ManchetteWithSpaceTimeChartWrapper = ({ showSignalsStates: false, }); - const occupancyBlocks = spaceTimeChartLayersData.filteredProjectPathTrainResult.flatMap( - (train) => { - const departureTime = new Date(train.departure_time).getTime(); - - return train.signal_updates.map((block) => ({ - timeStart: departureTime + block.time_start, - timeEnd: departureTime + block.time_end, - spaceStart: block.position_start, - spaceEnd: block.position_end, - color: ASPECT_LABELS_COLORS[block.aspect_label as AspectLabel], - })); - } - ); + const occupancyBlocks = cutProjectedTrains.flatMap((train) => { + const departureTime = train.departureTime.getTime(); + + return train.signalUpdates.map((block) => ({ + timeStart: departureTime + block.time_start, + timeEnd: departureTime + block.time_end, + spaceStart: block.position_start, + spaceEnd: block.position_end, + color: ASPECT_LABELS_COLORS[block.aspect_label as AspectLabel], + })); + }); return (
@@ -207,7 +216,7 @@ const ManchetteWithSpaceTimeChartWrapper = ({ spaceOrigin={ (waypointsPanelData?.filteredWaypoints ?? operationalPoints).at(0)?.position || 0 } - timeOrigin={Math.min(...projectPathTrainResult.map((p) => +new Date(p.departure_time)))} + timeOrigin={Math.min(...projectPathTrainResult.map((p) => +p.departureTime))} {...spaceTimeChartProps} > {spaceTimeChartProps.paths.map((path) => ( @@ -224,9 +233,7 @@ const ManchetteWithSpaceTimeChartWrapper = ({ imageUrl={upward} /> )} - {settings.showConflicts && ( - - )} + {settings.showConflicts && } {settings.showSignalsStates && ( )} diff --git a/front/src/modules/simulationResult/components/TrainDetails.tsx b/front/src/modules/simulationResult/components/TrainDetails.tsx index ac4220691d4..ba90c6c10c3 100644 --- a/front/src/modules/simulationResult/components/TrainDetails.tsx +++ b/front/src/modules/simulationResult/components/TrainDetails.tsx @@ -18,7 +18,7 @@ import { useChartSynchronizer } from './ChartSynchronizer'; * @TODO do not work with colors as string as soon as possible */ const getOccupancyBounds = ( - routeAspects: TrainSpaceTimeData['signal_updates'], + routeAspects: TrainSpaceTimeData['signalUpdates'], timePosition: Date ): [number, number] => { // TODO GET v2 : probably remove this conversion as trains will travel on several days @@ -59,8 +59,8 @@ const TrainDetails = ({ projectedTrain }: TrainDetailsProps) => { const { t } = useTranslation(['simulation']); const occupancyBounds = useMemo( - () => getOccupancyBounds(projectedTrain.signal_updates, new Date(headPosition?.time)), - [projectedTrain.signal_updates, headPosition, tailPosition, speed] + () => getOccupancyBounds(projectedTrain.signalUpdates, new Date(headPosition?.time)), + [projectedTrain.signalUpdates, headPosition, tailPosition, speed] ); return ( diff --git a/front/yarn.lock b/front/yarn.lock index 63a79f81fce..740f73e7367 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -1147,59 +1147,62 @@ resolved "https://registry.yarnpkg.com/@osrd-project/netzgrafik-frontend/-/netzgrafik-frontend-0.0.0-snapshot.6d049b7244241254c33afc3818f40ec57ab57217.tgz#40e507bb3e05be9c6dc07f6ed5533c3db5426d24" integrity sha512-lK/r4qYPeibUtoumN/oaj1spoL7S7lK0J3ZLIf2pm/xCjbK/Gx+8QLNDz6PMoKlG19RUbFc765qybzADo3e3pg== -"@osrd-project/ui-core@^0.0.52": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@osrd-project/ui-core/-/ui-core-0.0.52.tgz#c32aedfd1a9cc6f4651de8420c3d916596621c7d" - integrity sha512-9OZ01/L3/A5ADZzeFoI9sBF7pZc8xex6D1TSds3xE353zy3man29qwncdL9aTwy4AVfzv3aeub5a3y74UwcFLQ== +"@osrd-project/ui-core@^0.0.53": + version "0.0.53" + resolved "https://registry.yarnpkg.com/@osrd-project/ui-core/-/ui-core-0.0.53.tgz#c5113da770fb16b37992447d0b7ea0e7202da302" + integrity sha512-MtuuuQyW1Ol2J0/PyglsaPMpL4mQTLmhyMroIBoAdCe/NHBc9uRsTUiySbaYq9sd/lNZVmDR/0wfeGtvNXipww== dependencies: classnames "^2.5.1" tailwindcss "^3.4.1" -"@osrd-project/ui-icons@^0.0.52": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@osrd-project/ui-icons/-/ui-icons-0.0.52.tgz#90221c4a2f3ef3c8c77304a34cf960e2693964da" - integrity sha512-VvtmcAmum4NForLqhc4xSKtwmuv+jKrG2kzKtAsqX/5khcxQqlJLOQ1vQyvgkA00Axcu+xIAOfmryOr+ie6BmA== +"@osrd-project/ui-icons@^0.0.53": + version "0.0.53" + resolved "https://registry.yarnpkg.com/@osrd-project/ui-icons/-/ui-icons-0.0.53.tgz#bb346b7b3cd9bc4823a986e4c91ca2b374e2f1bd" + integrity sha512-K8EjMHIK1kyTk5rTmkejYjGIjv54YJ5peR5lgcVImdGyd0P77MsgTFWeC5r+RUXKohlErYFqEkMTwt59TzdlZg== -"@osrd-project/ui-manchette-with-spacetimechart@^0.0.52": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@osrd-project/ui-manchette-with-spacetimechart/-/ui-manchette-with-spacetimechart-0.0.52.tgz#66095f745f94c1785bce46ca0e004c45361eaf61" - integrity sha512-ghItdaPaQbWPrfITkJP6+ILVjQeKdB6iaQJtLSyGt4pDXI6As5Xwxo1KY/7dmDCnejxJsTDDBvHUs6cVimF70A== +"@osrd-project/ui-manchette-with-spacetimechart@^0.0.53": + version "0.0.53" + resolved "https://registry.yarnpkg.com/@osrd-project/ui-manchette-with-spacetimechart/-/ui-manchette-with-spacetimechart-0.0.53.tgz#957544c02acc2190a13bb319e3c7397df46ac325" + integrity sha512-1vjwDaYIq5QRbqKiHM8FKgq6NhcBS35ipT9FvD0E6JCLVRWC2v+1AIIXIwIqtPWP3aIzdddSYwwTRUVghIhhyw== dependencies: - "@osrd-project/ui-manchette" "^0.0.52" - "@osrd-project/ui-spacetimechart" "^0.0.52" + "@osrd-project/ui-manchette" "^0.0.53" + "@osrd-project/ui-spacetimechart" "^0.0.53" classnames "^2.5.1" lodash.isequal "^4.5.0" vitest "^2.1.1" -"@osrd-project/ui-manchette@^0.0.52": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@osrd-project/ui-manchette/-/ui-manchette-0.0.52.tgz#df1d27b7cc8d330ff6aa04c318df4bd9fb5827c6" - integrity sha512-nCkCDy8I52E9emTZFlkn+RusFbEcTTo4x+0Ef+Ty+QlVMyFjRQiq71dhfe9Axm9Bja44CgrvrnWnOuubT20JZQ== +"@osrd-project/ui-manchette@^0.0.53": + version "0.0.53" + resolved "https://registry.yarnpkg.com/@osrd-project/ui-manchette/-/ui-manchette-0.0.53.tgz#0300632ce5b03f4ec215b26b1c6b4d25c32b4725" + integrity sha512-xOISp8moVRnHQqjzE/r4gcxues0zQ2VvpaE5auY3iHE+GHf1qCwZEwcUtEc3rONnmYjQoqSkOxhZoxlA76LYVA== dependencies: classnames "^2.5.1" lodash.isequal "^4.5.0" -"@osrd-project/ui-spacetimechart@^0.0.52": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@osrd-project/ui-spacetimechart/-/ui-spacetimechart-0.0.52.tgz#92b3ba264a44f413b84dbbfe67bbd8aaaa2dadfe" - integrity sha512-WHSCiGkios/qnymlCOfPg5j0tzAQeW394zXEiOOMeVbB+weSfnsfUILxA0+dGMHgIAUPC9lrJy2Wff9fwChg7Q== +"@osrd-project/ui-spacetimechart@^0.0.53": + version "0.0.53" + resolved "https://registry.yarnpkg.com/@osrd-project/ui-spacetimechart/-/ui-spacetimechart-0.0.53.tgz#172c8734bbf406d428ac7ba8d2e476644d85b697" + integrity sha512-Q+4S+DjdJt69obwoKjM+aYWtLDgEAsbmBvy68WbUNMZ55mrMBKat/q8kijURJS4Neu6fMVuRT+h1wkpOLoqtlQ== dependencies: "@types/chroma-js" "^2.4.4" chroma-js "^3.1.1" lodash "^4.17.21" vitest "^2.1.1" -"@osrd-project/ui-speedspacechart@^0.0.52": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@osrd-project/ui-speedspacechart/-/ui-speedspacechart-0.0.52.tgz#0499eb4d4bf1045be3e21a2217ca97ce9818db4b" - integrity sha512-ankWgmHbHiR2/kMQm3f86GlcHL3JwjD989/rYGXZj+ClrLuDoQE+l9j5deZihol+qE/ODy+l8x8CS6FtHvd/Jg== +"@osrd-project/ui-speedspacechart@^0.0.53": + version "0.0.53" + resolved "https://registry.yarnpkg.com/@osrd-project/ui-speedspacechart/-/ui-speedspacechart-0.0.53.tgz#32b5fb5d6fceef5163ed997859cd60d6da134387" + integrity sha512-bRQZj3XYmcGkX7hToUsyXsIrC6J7BuzEAUjp4v5xeYn5C22JMC/+wv8wJoNn8yI4+gVVd0Aj0Jx4YZnpwvWaEA== dependencies: - "@osrd-project/ui-core" "^0.0.52" - "@osrd-project/ui-icons" "^0.0.52" - "@types/d3" "^7.4.3" + "@osrd-project/ui-core" "^0.0.53" + "@osrd-project/ui-icons" "^0.0.53" + "@types/chroma-js" "^2.4.4" + "@types/d3-selection" "^3.0.0" + "@types/d3-zoom" "^3.0.0" chroma-js "^3.1.1" classnames "^2.5.1" - d3 "^7.9.0" + d3-selection "^3.0.0" + d3-zoom "^3.0.0" tailwindcss "^3.4.1" "@pkgjs/parseargs@^0.11.0": @@ -2227,6 +2230,11 @@ resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.10.tgz#98cdcf986d0986de6912b5892e7c015a95ca27fe" integrity sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg== +"@types/d3-selection@^3.0.0": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== + "@types/d3-shape@*": version "3.1.6" resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72" @@ -2256,7 +2264,7 @@ dependencies: "@types/d3-selection" "*" -"@types/d3-zoom@*": +"@types/d3-zoom@*", "@types/d3-zoom@^3.0.0": version "3.0.8" resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== @@ -4232,7 +4240,7 @@ d3-scale@^3.2.3: d3-time "^2.1.1" d3-time-format "2 - 3" -"d3-selection@2 - 3", d3-selection@3: +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== @@ -4300,7 +4308,7 @@ d3-time@^1.0.11: d3-interpolate "1 - 3" d3-timer "1 - 3" -d3-zoom@3: +d3-zoom@3, d3-zoom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== @@ -4311,7 +4319,7 @@ d3-zoom@3: d3-selection "2 - 3" d3-transition "2 - 3" -d3@^7.8.5, d3@^7.9.0: +d3@^7.8.5: version "7.9.0" resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==