Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
9e34f74
Remove some useless comments (for ex. function headers)
Jun 21, 2020
14144b9
Extract csv read from d3 to a react custom hook
Jun 22, 2020
c889bd2
display a spinner while data is loading
Jun 22, 2020
ff0f845
Merge branch 'master' of https://github.com/PolyCortex/polydodo into …
Jul 20, 2020
131a4c2
Merge branch 'master' of https://github.com/PolyCortex/polydodo into …
Jul 20, 2020
3ade5c0
Remove barchart from spectrogram
Jul 23, 2020
ceb5f5d
Extract methods and constant so code is executed in a more coherent o…
Jul 23, 2020
f1aa973
export less functions so d3 code is clearer
Jul 26, 2020
50bb0af
use the _ for files and folders
Jul 26, 2020
3e5c367
added fcts to set axes and domains
Jul 26, 2020
202600b
reviewed convertsources and removed all constants passed in parameters
Jul 27, 2020
5b33ab8
changed csv file sleep stages for labels instead of integers
Jul 27, 2020
30afd25
deleted stages & created preproc function
Jul 27, 2020
2f40963
changed annotations to have sleep stage labels instead of indexes
Jul 27, 2020
466d358
add use of moment js
Jul 27, 2020
ee4b8a1
fixed date & 3rd transition offset bug
Jul 28, 2020
6ea04e9
fixed wrong hour in spectrogram
Jul 28, 2020
7ab0a30
fixed tooltip and & first bar chart
Jul 28, 2020
d2ad76c
renamed bar chart to evolutive bar chart & fixed some bug transitions…
Aug 9, 2020
8e93519
moved linear x axis with other axes creation
Aug 9, 2020
809b9f6
Add a waypoint direction component
Aug 9, 2020
dfebaad
remove transitions
Aug 9, 2020
c15346e
transition from timeline to instance with onExit & onEnter callbacks …
Aug 9, 2020
bdddb46
fixed transition from instance chart to bar chart using onEnter & onE…
Aug 9, 2020
06a2961
bar chart callbacks changed data
Aug 9, 2020
90fca79
changed callbacks to considerate from which state and to which state …
Aug 9, 2020
88a4ae4
moved state callbacks creation to seperate file
Aug 9, 2020
1d828a8
reorganized parameters
Aug 9, 2020
f811f2e
cleaned stacked bar chart
Aug 9, 2020
e7232eb
fixed transition so that all rectangles add up (from and leave from b…
Aug 10, 2020
f600aeb
solved concurrency bug where no transition is loaded
Aug 16, 2020
81f055b
fixed broken visualisation when scrolling too fast
Aug 16, 2020
e88f03f
deleted console logs
Aug 16, 2020
1a93453
fixed constant names and calls with constant hypnogram
Aug 16, 2020
6c57d55
fixed constant names
Aug 16, 2020
704158c
used data from component
Aug 16, 2020
045e80f
added dimension & margin to constant fiel
Aug 16, 2020
f39bbe0
merged spectrogram and init spectrogram in same file
Aug 16, 2020
57b980c
deleted file and joined into spectrogram
Aug 16, 2020
3a7a402
created axes & scales functions
Aug 16, 2020
938612e
changed spectro data key to lower case & added for loop chart creation
Aug 16, 2020
3d56577
fixed name convention
Aug 17, 2020
051cf21
used canvas to display rectangles and removed bins
Aug 17, 2020
2b4cd3a
added refactoring of set domain on scales
Aug 17, 2020
135b19a
removed preproc file and rewrote preprocess function
Aug 17, 2020
2226fe2
reduced colorbar width
Aug 17, 2020
b8af7c9
added spectro titles
Aug 17, 2020
53d9f4b
fit visualizations to screen
conorato Aug 27, 2020
7c09911
refactored dimensions
conorato Aug 27, 2020
4e93c44
ensure spectrogram height fit to screen
conorato Aug 27, 2020
b5bb1fe
Remove some useless comments (for ex. function headers)
Jun 21, 2020
d75d2a7
Extract csv read from d3 to a react custom hook
Jun 22, 2020
9f13714
display a spinner while data is loading
Jun 22, 2020
bf6ba72
FIX: Add jsconfig to repair master branch
Jul 20, 2020
89c6690
Remove barchart from spectrogram
Jul 23, 2020
d54b5f0
Extract methods and constant so code is executed in a more coherent o…
Jul 23, 2020
38ce423
export less functions so d3 code is clearer
Jul 26, 2020
2f0bfe3
use the _ for files and folders
Jul 26, 2020
22b1173
added fcts to set axes and domains
Jul 26, 2020
66db716
reviewed convertsources and removed all constants passed in parameters
Jul 27, 2020
a18a50b
changed csv file sleep stages for labels instead of integers
Jul 27, 2020
c4c37b6
deleted stages & created preproc function
Jul 27, 2020
030a1c9
changed annotations to have sleep stage labels instead of indexes
Jul 27, 2020
819aef9
add use of moment js
Jul 27, 2020
2065bf4
fixed date & 3rd transition offset bug
Jul 28, 2020
2a21be6
fixed wrong hour in spectrogram
Jul 28, 2020
4466cf3
fixed tooltip and & first bar chart
Jul 28, 2020
0cb7bfc
renamed bar chart to evolutive bar chart & fixed some bug transitions…
Aug 9, 2020
8866aac
moved linear x axis with other axes creation
Aug 9, 2020
f13cac9
Add a waypoint direction component
Aug 9, 2020
2e88d51
remove transitions
Aug 9, 2020
4984b02
transition from timeline to instance with onExit & onEnter callbacks …
Aug 9, 2020
ed07d0c
fixed transition from instance chart to bar chart using onEnter & onE…
Aug 9, 2020
e80943f
bar chart callbacks changed data
Aug 9, 2020
ba2c42d
changed callbacks to considerate from which state and to which state …
Aug 9, 2020
7b7bfe2
moved state callbacks creation to seperate file
Aug 9, 2020
72265f9
reorganized parameters
Aug 9, 2020
ee98a44
cleaned stacked bar chart
Aug 9, 2020
58021ba
fixed transition so that all rectangles add up (from and leave from b…
Aug 10, 2020
1ab44df
solved concurrency bug where no transition is loaded
Aug 16, 2020
19152e0
fixed broken visualisation when scrolling too fast
Aug 16, 2020
593b4a8
deleted console logs
Aug 16, 2020
cc06212
fixed constant names and calls with constant hypnogram
Aug 16, 2020
f688656
fixed constant names
Aug 16, 2020
ac433dc
used data from component
Aug 16, 2020
6c1049d
added dimension & margin to constant fiel
Aug 16, 2020
5bd4ec5
merged spectrogram and init spectrogram in same file
Aug 16, 2020
a2aaa11
deleted file and joined into spectrogram
Aug 16, 2020
e8de645
created axes & scales functions
Aug 16, 2020
0c569c1
changed spectro data key to lower case & added for loop chart creation
Aug 16, 2020
d01c7e5
fixed name convention
Aug 17, 2020
4548de6
used canvas to display rectangles and removed bins
Aug 17, 2020
95275bf
added refactoring of set domain on scales
Aug 17, 2020
78b16c5
removed preproc file and rewrote preprocess function
Aug 17, 2020
9eb312b
reduced colorbar width
Aug 17, 2020
22b8fd9
added spectro titles
Aug 17, 2020
0d6bc75
fit visualizations to screen
conorato Aug 27, 2020
3c9e2a2
refactored dimensions
conorato Aug 27, 2020
43234d4
ensure spectrogram height fit to screen
conorato Aug 27, 2020
1d58898
Merge branch 'd3-refactoring' of github.com:PolyCortex/polydodo into …
conorato Aug 27, 2020
13f1640
Merge branch 'master' of github.com:PolyCortex/polydodo into d3-refac…
conorato Aug 27, 2020
8ddc67a
merge hypnogram
conorato Aug 27, 2020
9281c96
Change spectrogram height
conorato Aug 27, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion polydodo/src/d3/evolving_chart/evolving_chart.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ const createDrawingGroup = (svg) => svg.append('g').attr('transform', `translate
const bindAnnotationsToRects = (g, annotations) => g.selectAll('.rect').data(annotations).enter().append('rect').attr('class', 'rect-stacked');

const createEvolvingChart = (containerNode, data) => {
const svg = d3.select(containerNode).attr('width', CANVAS_DIMENSION.WIDTH).attr('height', CANVAS_DIMENSION.HEIGHT);
const svg = d3.select(containerNode).attr('viewBox', `0, 0, ${CANVAS_DIMENSION.WIDTH}, ${CANVAS_DIMENSION.HEIGHT}`);
const { xTime, xLinear, y, colors } = initializeScales();
const { xTimeAxis, xLinearAxis, yAxis } = initializeAxes(xTime, xLinear, y);
const g = createDrawingGroup(svg);
Expand Down
2 changes: 1 addition & 1 deletion polydodo/src/d3/hypnogram/hypnogram.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const setDomainOnScales = (x, y, colors, data) => {
};

const createHypnogram = (containerNode, data, chartTitle, hypnogramNames, comparativeColors) => {
const svg = d3.select(containerNode).attr('width', CANVAS_DIMENSION.WIDTH).attr('height', CANVAS_DIMENSION.HEIGHT);
const svg = d3.select(containerNode).attr('viewBox', `0, 0, ${CANVAS_DIMENSION.WIDTH}, ${CANVAS_DIMENSION.HEIGHT}`);
const { x, y, colors } = initializeScales(comparativeColors);
const { xAxis, yAxis } = initializeAxes(x, y);
const g = createDrawingGroup(svg);
Expand Down
25 changes: 3 additions & 22 deletions polydodo/src/d3/spectrogram/constants.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,13 @@
import _ from 'lodash';

const PADDING = 100;
export const PADDING = 100;
export const NB_SPECTROGRAM = 2;
export const FREQUENCY_KEY = 'frequencies';
export const NB_POINTS_COLOR_INTERPOLATION = 3;
export const TITLE_FONT_SIZE = '18px';

export const CANVAS_WIDTH_TO_HEIGHT_RATIO = 700 / 1000; // width to height ratio
export const CANVAS_HEIGHT_WINDOW_FACTOR = 0.8;
export const MARGIN = {
TOP: 50,
RIGHT: 120,
BOTTOM: 50,
LEFT: 70,
};
export const CANVAS_DIMENSION = {
WIDTH: 1000,
HEIGHT: 700,
};
export const DIMENSION = {
WIDTH: CANVAS_DIMENSION.WIDTH - MARGIN.LEFT - MARGIN.RIGHT,
HEIGHT: CANVAS_DIMENSION.HEIGHT - MARGIN.BOTTOM - MARGIN.TOP,
};
export const SPECTROGRAM_CANVAS_HEIGTH = _.range(NB_SPECTROGRAM).map((x) => {
let height = DIMENSION.HEIGHT / NB_SPECTROGRAM;
if (x === 0) {
height += MARGIN.TOP;
} else if (x === NB_SPECTROGRAM - 1) {
height += MARGIN.BOTTOM;
}
return height;
});
export const SPECTROGRAM_HEIGHT = (CANVAS_DIMENSION.HEIGHT - MARGIN.BOTTOM - MARGIN.TOP - PADDING) / NB_SPECTROGRAM;
9 changes: 4 additions & 5 deletions polydodo/src/d3/spectrogram/legend.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import * as d3 from 'd3';
import _ from 'lodash';
import { MARGIN, SPECTROGRAM_HEIGHT, NB_POINTS_COLOR_INTERPOLATION, TITLE_FONT_SIZE } from './constants';
import { MARGIN, NB_POINTS_COLOR_INTERPOLATION, TITLE_FONT_SIZE } from './constants';

export const createLegend = (svg, color, y) => {
export const createLegend = (svg, color, y, spectrogramHeight) => {
const interpolate = d3.interpolate(color.domain()[0], color.domain()[1]);

const colors = _.map(_.range(NB_POINTS_COLOR_INTERPOLATION + 1), (x) => color(interpolate(x / NB_POINTS_COLOR_INTERPOLATION)));
Expand All @@ -23,14 +23,13 @@ export const createLegend = (svg, color, y) => {
.append('stop')
.attr('stop-color', (d) => d)
.attr('offset', (_, i) => i / (colors.length - 1));

svg
.append('rect')
.attr('fill', `url(#${GRADIENT_ID})`)
.attr('x', MARGIN.RIGHT / 10)
.attr('y', 0)
.attr('width', MARGIN.RIGHT / 6)
.attr('height', SPECTROGRAM_HEIGHT);
.attr('height', spectrogramHeight);

const yAxis = d3.axisRight(y).ticks(5, 's');
svg
Expand All @@ -45,7 +44,7 @@ export const createLegend = (svg, color, y) => {
.attr('class', 'y axis')
.attr('transform', 'rotate(90)')
.attr('y', -MARGIN.RIGHT)
.attr('x', SPECTROGRAM_HEIGHT / 2)
.attr('x', spectrogramHeight / 2)
.attr('dy', '1em')
.attr('fill', 'currentColor')
.style('text-anchor', 'middle')
Expand Down
105 changes: 69 additions & 36 deletions polydodo/src/d3/spectrogram/spectrogram.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
import * as d3 from 'd3';
import _ from 'lodash';

import { DIMENSION, MARGIN, CANVAS_DIMENSION, SPECTROGRAM_CANVAS_HEIGTH, SPECTROGRAM_HEIGHT, FREQUENCY_KEY, TITLE_FONT_SIZE } from './constants';
import {
MARGIN,
CANVAS_WIDTH_TO_HEIGHT_RATIO,
FREQUENCY_KEY,
TITLE_FONT_SIZE,
NB_SPECTROGRAM,
PADDING,
CANVAS_HEIGHT_WINDOW_FACTOR,
} from './constants';
import { EPOCH_DURATION_SEC } from '../constants';
import { createLegend } from './legend';

const initializeScales = () =>
const initializeScales = ({ spectrogramWidth, singleSpectrogramHeight }) =>
Object({
x: d3.scaleLinear([0, DIMENSION.WIDTH]),
yLinear: d3.scaleLinear([SPECTROGRAM_HEIGHT, 0]),
yBand: d3.scaleBand([SPECTROGRAM_HEIGHT, 0]),
yColor: d3.scaleLinear([SPECTROGRAM_HEIGHT, 0]),
x: d3.scaleLinear([0, spectrogramWidth]),
yLinear: d3.scaleLinear([singleSpectrogramHeight, 0]),
yBand: d3.scaleBand([singleSpectrogramHeight, 0]),
yColor: d3.scaleLinear([singleSpectrogramHeight, 0]),
color: d3.scaleSequential().interpolator(d3.interpolatePlasma),
});

Expand Down Expand Up @@ -39,18 +47,16 @@ const preprocessData = (powerAmplitudesByTimestamp, frequencies) =>
),
);

const getHoursFromIndex = (idx) => {
return (idx * EPOCH_DURATION_SEC) / 60.0 / 60;
};
const getHoursFromIndex = (idx) => (idx * EPOCH_DURATION_SEC) / 3600;

const createDrawingGroups = (g) =>
const createDrawingGroups = (g, spectrogramWidth) =>
Object({
spectrogramDrawingGroup: g.append('g').attr('transform', `translate(${MARGIN.LEFT}, ${MARGIN.TOP})`),
legendDrawingGroup: g.append('g').attr('transform', `translate(${MARGIN.LEFT + DIMENSION.WIDTH}, ${MARGIN.TOP})`),
legendDrawingGroup: g.append('g').attr('transform', `translate(${MARGIN.LEFT + spectrogramWidth}, ${MARGIN.TOP})`),
});

const getScalesAndAxes = (data, channel) => {
const { x, yLinear, yBand, yColor, color } = initializeScales();
const getScalesAndAxes = (data, channel, dimensions) => {
const { x, yLinear, yBand, yColor, color } = initializeScales(dimensions);
const { xAxis, yAxis } = initializeAxes(x, yLinear);
const preprocessedData = preprocessData(data[channel], data.frequencies);

Expand All @@ -59,11 +65,11 @@ const getScalesAndAxes = (data, channel) => {
return { data: preprocessedData, x, yBand, yColor, color, xAxis, yAxis };
};

const createAxes = (g, xAxis, yAxis) => {
const createAxes = (g, xAxis, yAxis, singleSpectrogramHeight, spectrogramWidth) => {
g.append('text')
.attr('class', 'x axis')
.attr('y', SPECTROGRAM_HEIGHT + MARGIN.BOTTOM)
.attr('x', DIMENSION.WIDTH / 2)
.attr('y', singleSpectrogramHeight + MARGIN.BOTTOM)
.attr('x', spectrogramWidth / 2)
.attr('fill', 'currentColor')
.style('text-anchor', 'middle')
.text('Time');
Expand All @@ -72,37 +78,37 @@ const createAxes = (g, xAxis, yAxis) => {
.attr('class', 'y axis')
.attr('transform', 'rotate(-90)')
.attr('y', -MARGIN.LEFT)
.attr('x', -SPECTROGRAM_HEIGHT / 2)
.attr('x', -singleSpectrogramHeight / 2)
.attr('dy', '1em')
.attr('fill', 'currentColor')
.style('text-anchor', 'middle')
.text('Frequency (Hz)');

g.append('g')
.attr('class', 'x axis')
.attr('transform', `translate(0, ${SPECTROGRAM_HEIGHT})`)
.attr('transform', `translate(0, ${singleSpectrogramHeight})`)
.call(xAxis)
.selectAll('text')
.style('font-size', TITLE_FONT_SIZE);

g.append('g').attr('class', 'y axis').call(yAxis).selectAll('text').style('font-size', TITLE_FONT_SIZE);
};

const createTitle = (g, channelName) =>
const createTitle = (g, channelName, spectrogramWidth) =>
g
.append('text')
.attr('x', DIMENSION.WIDTH / 2)
.attr('x', spectrogramWidth / 2)
.attr('y', -MARGIN.TOP / 3)
.style('text-anchor', 'middle')
.style('font-size', TITLE_FONT_SIZE)
.text(`Spectrogram of channel ${channelName}`);

const createSpectrogramRectangles = (canvas, scalesAndAxesBySpectrogram) => {
const createSpectrogramRectangles = (canvas, scalesAndAxesBySpectrogram, { singleSpectrogramCanvasHeight }) => {
const context = canvas.node().getContext('2d');

_.each(scalesAndAxesBySpectrogram, ({ x, yBand, color, data }, index) => {
context.resetTransform();
context.translate(MARGIN.LEFT, MARGIN.TOP + index * SPECTROGRAM_CANVAS_HEIGTH[index]);
context.translate(MARGIN.LEFT, MARGIN.TOP + index * singleSpectrogramCanvasHeight[index]);

_.each(data, ({ Timestamp, Frequency, Intensity }) => {
context.beginPath();
Expand All @@ -114,19 +120,35 @@ const createSpectrogramRectangles = (canvas, scalesAndAxesBySpectrogram) => {
});
};

const createSpectrogramAxesAndLegend = (svg, scalesAndAxesBySpectrogram, channelNames) =>
const createSpectrogramAxesAndLegend = (
svg,
scalesAndAxesBySpectrogram,
channelNames,
{ canvasWidth, spectrogramWidth, singleSpectrogramCanvasHeight, singleSpectrogramHeight },
) =>
_.forEach(_.zip(scalesAndAxesBySpectrogram, channelNames), ([{ xAxis, yAxis, color, yColor }, channel], index) => {
const currentSpectrogramDrawingGroup = svg
.append('g')
.attr('transform', `translate(0, ${index * SPECTROGRAM_CANVAS_HEIGTH[index]})`)
.attr('width', CANVAS_DIMENSION.WIDTH)
.attr('height', SPECTROGRAM_CANVAS_HEIGTH[index]);
.attr('transform', `translate(0, ${index * singleSpectrogramCanvasHeight[index]})`)
.attr('width', canvasWidth)
.attr('height', singleSpectrogramCanvasHeight[index]);

const { spectrogramDrawingGroup, legendDrawingGroup } = createDrawingGroups(currentSpectrogramDrawingGroup, spectrogramWidth);

const { spectrogramDrawingGroup, legendDrawingGroup } = createDrawingGroups(currentSpectrogramDrawingGroup);
createTitle(spectrogramDrawingGroup, channel, spectrogramWidth);
createAxes(spectrogramDrawingGroup, xAxis, yAxis, singleSpectrogramHeight, spectrogramWidth);
createLegend(legendDrawingGroup, color, yColor, singleSpectrogramHeight);
});

createTitle(spectrogramDrawingGroup, channel);
createAxes(spectrogramDrawingGroup, xAxis, yAxis);
createLegend(legendDrawingGroup, color, yColor);
const getSpectrogramCanvasHeight = (spectrogramHeight) =>
_.range(NB_SPECTROGRAM).map((x) => {
let height = spectrogramHeight / NB_SPECTROGRAM;
if (x === 0) {
height += MARGIN.TOP;
} else if (x === NB_SPECTROGRAM - 1) {
height += MARGIN.BOTTOM;
}
return height;
});

const createSpectrogram = (containerNode, data) => {
Expand All @@ -140,18 +162,29 @@ const createSpectrogram = (containerNode, data) => {
setting the first element's position, in this case the canvas, to absolute.
*/
const parentDiv = d3.select(containerNode);
const canvasWidth = parentDiv.node().getBoundingClientRect().width;
const canvasHeight = Math.min(canvasWidth * CANVAS_WIDTH_TO_HEIGHT_RATIO, window.innerHeight * CANVAS_HEIGHT_WINDOW_FACTOR);
const dimensions = {
canvasWidth: canvasWidth,
canvasHeight: canvasHeight,
spectrogramWidth: canvasWidth - MARGIN.LEFT - MARGIN.RIGHT,
spectrogramsHeight: canvasHeight - MARGIN.TOP - MARGIN.BOTTOM,
singleSpectrogramCanvasHeight: getSpectrogramCanvasHeight(canvasHeight - MARGIN.TOP - MARGIN.BOTTOM),
singleSpectrogramHeight: (canvasHeight - MARGIN.BOTTOM - MARGIN.TOP - PADDING) / NB_SPECTROGRAM,
};

const channelNames = _.filter(_.keys(data), (keyName) => keyName !== FREQUENCY_KEY);
const scalesAndAxesBySpectrogram = _.map(channelNames, (name) => getScalesAndAxes(data, name));
const scalesAndAxesBySpectrogram = _.map(channelNames, (name) => getScalesAndAxes(data, name, dimensions));

const canvas = parentDiv
.append('canvas')
.attr('width', CANVAS_DIMENSION.WIDTH)
.attr('height', CANVAS_DIMENSION.HEIGHT)
.attr('width', dimensions.canvasWidth)
.attr('height', dimensions.canvasHeight)
.style('position', 'absolute');
const svg = parentDiv.append('svg').attr('width', CANVAS_DIMENSION.WIDTH).attr('height', CANVAS_DIMENSION.HEIGHT);
const svg = parentDiv.append('svg').attr('width', dimensions.canvasWidth).attr('height', dimensions.canvasHeight);

createSpectrogramRectangles(canvas, scalesAndAxesBySpectrogram);
createSpectrogramAxesAndLegend(svg, scalesAndAxesBySpectrogram, channelNames);
createSpectrogramRectangles(canvas, scalesAndAxesBySpectrogram, dimensions);
createSpectrogramAxesAndLegend(svg, scalesAndAxesBySpectrogram, channelNames, dimensions);
};

export default createSpectrogram;
1 change: 1 addition & 0 deletions polydodo/src/views/sleep_analysis/sleep_analysis.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ const SleepAnalysis = () => {
</li>
<li>Routine: going to sleep about at the same time, in a darkened and quiet environment.</li>
<li>Routine: going to sleep about at the same time, in a darkened and quiet environment.</li>
<li>Routine: going to sleep about at the same time, in a darkened and quiet environment.</li>
</ul>
<p>
Although we’ve looked at many aspects of your night’s sleep, we haven’t properly looked at your sleep dynamics, whereas how your sleep
Expand Down
8 changes: 4 additions & 4 deletions polydodo/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -7960,10 +7960,10 @@ mixin-object@^2.0.1:
dependencies:
minimist "^1.2.5"

moment@2.24.0:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
moment@^2.27.0:
version "2.27.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d"
integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==

moment@^2.27.0:
version "2.27.0"
Expand Down