diff --git a/.github/ISSUE_TEMPLATE/5.priority-support.yml b/.github/ISSUE_TEMPLATE/5.priority-support.yml index 15643579fc14..b015f08c4c6f 100644 --- a/.github/ISSUE_TEMPLATE/5.priority-support.yml +++ b/.github/ISSUE_TEMPLATE/5.priority-support.yml @@ -1,5 +1,5 @@ name: 'Priority support: SLA ⏰' -description: I'm a Premium plan user and I have the priority support add-on, I can't find a solution to my problem with MUI X. +description: I'm an MUI X Premium user and we have purchased the Priority Support add-on. I can't find a solution to my problem with MUI X. title: '[question] ' labels: ['status: needs triage', 'support: commercial', 'support: unknown'] body: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index b1a4fa91f4e3..67251c73a064 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0 + uses: github/codeql-action/init@489225d82a57396c6f426a40e66d461b16b3461d # v2.20.4 with: languages: typescript # If you wish to specify custom queries, you can do so here or in a config file. @@ -29,4 +29,4 @@ jobs: # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0 + uses: github/codeql-action/analyze@489225d82a57396c6f426a40e66d461b16b3461d # v2.20.4 diff --git a/.github/workflows/l10n.yml b/.github/workflows/l10n.yml index 9c22b8c2169e..abdbbda69e16 100644 --- a/.github/workflows/l10n.yml +++ b/.github/workflows/l10n.yml @@ -19,7 +19,7 @@ jobs: - run: echo "${{ github.actor }}" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Use Node.js 18.x - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3.7.0 with: node-version: 18 cache: 'yarn' # https://github.com/actions/setup-node/blob/main/docs/advanced-usage.md#caching-packages-dependencies diff --git a/.github/workflows/priority-support-validation-prompt.yml b/.github/workflows/priority-support-validation-prompt.yml index 8b3e6cf250d2..e8198db8aadb 100644 --- a/.github/workflows/priority-support-validation-prompt.yml +++ b/.github/workflows/priority-support-validation-prompt.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Find Comment - uses: peter-evans/find-comment@v2 # v2.4.0 + uses: peter-evans/find-comment@a54c31d7fa095754bfef525c0c8e5e5674c4b4b1 # v2.4.0 id: findComment with: issue-number: ${{ github.event.issue.number }} @@ -25,11 +25,11 @@ jobs: - name: Create comment if: ${{ steps.findComment.outputs.comment-id == '' && contains(github.event.label.name, 'unknown') }} - uses: peter-evans/create-or-update-comment@5f728c3dae25f329afbe34ee4d08eef25569d79f # v3.0.2 + uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.2 with: issue-number: ${{ github.event.issue.number }} body: | - You have created a priority support request ⏰. Please validate your support key using the link below: + You have created a support request under the ["Priority Support"](https://mui.com/legal/technical-support-sla/#priority-support) terms, which is a paid add-on to MUI X Premium ⏰. Please validate your support key using the link below: https://tools-public.mui.com/prod/pages/jyhs86t?repo=mui-x&issueId=${{ github.event.issue.number }} @@ -39,7 +39,7 @@ jobs: - name: Update comment if: ${{ steps.findComment.outputs.comment-id != '' && contains(github.event.label.name, 'priority') }} - uses: peter-evans/create-or-update-comment@5f728c3dae25f329afbe34ee4d08eef25569d79f # v3.0.2 + uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.2 with: comment-id: ${{ steps.findComment.outputs.comment-id }} body: | diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index a30600020a8e..0024beed88f3 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -28,7 +28,7 @@ jobs: persist-credentials: false - name: Run analysis - uses: ossf/scorecard-action@80e868c13c90f172d68d1f4501dee99e2479f7af # v2.1.3 + uses: ossf/scorecard-action@08b4669551908b1024bb425080c797723083c031 # v2.2.0 with: results_file: results.sarif results_format: sarif @@ -44,6 +44,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0 + uses: github/codeql-action/upload-sarif@489225d82a57396c6f426a40e66d461b16b3461d # v2.20.4 with: sarif_file: results.sarif diff --git a/CHANGELOG.md b/CHANGELOG.md index f0680d5e9ab5..1726178258dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,65 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 6.10.0 + +_Jul 13, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- ⚡ Improve data grid filtering performance +- 🎁 Include column groups in the CSV export +- 🌍 Improve Polish (pl-PL) locale for the data grid +- 🌍 Improve Norwegian (nb-NO) locale for the pickers + +### Data Grid + +#### `@mui/x-data-grid@6.10.0` + +- [DataGrid] Allow to exclude hidden columns from the quick filter (#9610) @cherniavskii +- [DataGrid] Filtering performance: remove indirection (#9334) @romgrk +- [DataGrid] Fix props propagation on `GridToolbarQuickFilter` component (#9633) @giladappsforce +- [DataGrid] Fix quick filter input lag (#9630) @cherniavskii +- [DataGrid] Include column groups in the CSV export (#9585) @cherniavskii +- [DataGrid] Make `rowExpansionChange` event public (#9611) @MBilalShafi +- [l10n] Improve Polish (pl-PL) locale (#9625) @ch1llysense + +#### `@mui/x-data-grid-pro@6.10.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link) + +Same changes as in `@mui/x-data-grid@6.10.0`. + +#### `@mui/x-data-grid-premium@6.10.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link) + +Same changes as in `@mui/x-data-grid-pro@6.10.0`. + +### Date Pickers + +#### `@mui/x-date-pickers@6.10.0` + +- [pickers] Fix date calendar issues (#9652) @LukasTy +- [l10n] Improve Norwegian (nb-NO) locale (#9608) @JosteinBrevik + +#### `@mui/x-date-pickers-pro@6.10.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link) + +Same changes as in `@mui/x-date-pickers@6.10.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.3` + +- [charts] Allow configuring bar size (#9632) @alexfauquette +- [charts] Simplify custom components creation (#9561) @alexfauquette + +### Docs + +- [docs] Add slot components usage alert (#9660) @LukasTy +- [docs] Fix casing Cell selection @oliviertassinari + +### Core + +- [core] Disambiguate eslint plugin name @oliviertassinari +- [core] Update priority support issue template and prompt (#9574) @DanailH +- [CHANGELOG] Clarify each plan (#9446) @oliviertassinari +- [license] Fix error terminology (#9614) @oliviertassinari + ## 6.9.2 _Jul 6, 2023_ diff --git a/benchmark/package.json b/benchmark/package.json index 7d627bde842b..d222eb5cba31 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -10,7 +10,7 @@ "@emotion/styled": "^11.11.0", "@material-ui/core": "^5.0.0-beta.5", "@material-ui/icons": "^5.0.0-beta.5", - "@mui/material": "^5.13.6", + "@mui/material": "^5.14.0", "@mui/x-data-grid": "^4.0.0", "ag-grid-community": "^29.3.5", "ag-grid-react": "^29.3.5", diff --git a/docs/data/charts/bars/BarGapNoSnap.js b/docs/data/charts/bars/BarGapNoSnap.js new file mode 100644 index 000000000000..82d68c5e43b4 --- /dev/null +++ b/docs/data/charts/bars/BarGapNoSnap.js @@ -0,0 +1,68 @@ +import * as React from 'react'; +import ChartsUsageDemo from 'docsx/src/modules/components/ChartsUsageDemo'; +import { BarChart } from '@mui/x-charts/BarChart'; + +const series = [ + { data: [1, 5, 2], stack: 'a' }, + { data: [2, 3, 4], stack: 'a' }, + { data: [3, 2, 3], stack: 'b' }, + { data: [8, 3, 6], stack: 'b' }, + { data: [11, 6, 9] }, +]; +export default function BarGapNoSnap() { + return ( + ( + + )} + getCode={({ props }) => { + return [ + `import { BarChart } from '@mui/x-charts/BarChart';`, + '', + `', + ].join('\n'); + }} + /> + ); +} diff --git a/docs/data/charts/bars/bars.md b/docs/data/charts/bars/bars.md index ade470e11408..8e05b209124b 100644 --- a/docs/data/charts/bars/bars.md +++ b/docs/data/charts/bars/bars.md @@ -15,6 +15,20 @@ This axis might have `scaleType='band'` and its `data` should have the same leng {{"demo": "BasicBars.js"}} +## Bar size + +You can define bar dimensions with `categoryGapRatio` and `barGapRatio` properties. + +The `categoryGapRatio` defines the gap between two categories. +The ratio is obtained by dividing the size of the gap by the size of the category (the space used by bars). + +The `barGapRatio` defines the gap between two bars of the same category. +It's the size of the gap divided by the size of the bar. +So a value of `1` will result in a gap between bars equal to the bar width. +And a value of `-1` will make bars overlap on top of each over. + +{{"demo": "BarGapNoSnap.js"}} + ## Stacking Each bar series can get a `stack` property expecting a string value. diff --git a/docs/data/charts/components/BasicScaleDemo.js b/docs/data/charts/components/BasicScaleDemo.js new file mode 100644 index 000000000000..901a9e8359a7 --- /dev/null +++ b/docs/data/charts/components/BasicScaleDemo.js @@ -0,0 +1,64 @@ +import * as React from 'react'; +import { styled } from '@mui/material/styles'; +import { ResponsiveChartContainer, LinePlot, useDrawingArea } from '@mui/x-charts'; + +const StyledPath = styled('path')(({ theme }) => ({ + fill: 'none', + stroke: theme.palette.text.primary, + shapeRendering: 'crispEdges', + strokeWidth: 1, + pointerEvents: 'none', +})); + +const StyledText = styled('text')(({ theme }) => ({ + stroke: 'none', + fill: theme.palette.text.primary, + shapeRendering: 'crispEdges', +})); + +function DrawingAreaBox() { + const { left, top, width, height } = useDrawingArea(); + return ( + + + + + + ({left},{top}) + + + ({left + width},{top + height}) + + + ); +} +export default function BasicScaleDemo() { + return ( + + + + + ); +} diff --git a/docs/data/charts/components/BasicScaleDemo.tsx b/docs/data/charts/components/BasicScaleDemo.tsx new file mode 100644 index 000000000000..901a9e8359a7 --- /dev/null +++ b/docs/data/charts/components/BasicScaleDemo.tsx @@ -0,0 +1,64 @@ +import * as React from 'react'; +import { styled } from '@mui/material/styles'; +import { ResponsiveChartContainer, LinePlot, useDrawingArea } from '@mui/x-charts'; + +const StyledPath = styled('path')(({ theme }) => ({ + fill: 'none', + stroke: theme.palette.text.primary, + shapeRendering: 'crispEdges', + strokeWidth: 1, + pointerEvents: 'none', +})); + +const StyledText = styled('text')(({ theme }) => ({ + stroke: 'none', + fill: theme.palette.text.primary, + shapeRendering: 'crispEdges', +})); + +function DrawingAreaBox() { + const { left, top, width, height } = useDrawingArea(); + return ( + + + + + + ({left},{top}) + + + ({left + width},{top + height}) + + + ); +} +export default function BasicScaleDemo() { + return ( + + + + + ); +} diff --git a/docs/data/charts/components/BasicScaleDemo.tsx.preview b/docs/data/charts/components/BasicScaleDemo.tsx.preview new file mode 100644 index 000000000000..8c5b1d2d2023 --- /dev/null +++ b/docs/data/charts/components/BasicScaleDemo.tsx.preview @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/docs/data/charts/components/OriginDemo.js b/docs/data/charts/components/OriginDemo.js new file mode 100644 index 000000000000..9578b34e59d8 --- /dev/null +++ b/docs/data/charts/components/OriginDemo.js @@ -0,0 +1,81 @@ +import * as React from 'react'; +import { styled } from '@mui/material/styles'; + +import { + ResponsiveChartContainer, + LinePlot, + useDrawingArea, + useYScale, + useXScale, +} from '@mui/x-charts'; + +const x = Array.from({ length: 21 }, (_, index) => -1 + 0.2 * index); +const linear = x.map((v) => -1 + v); +const poly = x.map((v) => -1 + v ** 2 - v); + +const StyledPath = styled('path')(({ theme, color }) => ({ + fill: 'none', + stroke: theme.palette.text[color], + shapeRendering: 'crispEdges', + strokeWidth: 1, + pointerEvents: 'none', +})); + +function CartesianAxis() { + // Get the drawing area bounding box + const { left, top, width, height } = useDrawingArea(); + + // Get the two scale + const yAxisScale = useYScale(); + const xAxisScale = useXScale(); + + const yOrigin = yAxisScale(0); + const xOrigin = xAxisScale(0); + + const xTicks = [-2, -1, 1, 2, 3]; + const yTicks = [-2, -1, 1, 2, 3, 4, 5]; + + return ( + + {yTicks.map((value) => ( + + ))} + {xTicks.map((value) => ( + + ))} + + + + ); +} +export default function OriginDemo() { + return ( + + + + + ); +} diff --git a/docs/data/charts/components/OriginDemo.tsx b/docs/data/charts/components/OriginDemo.tsx new file mode 100644 index 000000000000..1ac5c0b295d0 --- /dev/null +++ b/docs/data/charts/components/OriginDemo.tsx @@ -0,0 +1,84 @@ +import * as React from 'react'; +import { styled } from '@mui/material/styles'; +import { ScaleLinear } from 'd3-scale'; +import { + ResponsiveChartContainer, + LinePlot, + useDrawingArea, + useYScale, + useXScale, +} from '@mui/x-charts'; + +const x = Array.from({ length: 21 }, (_, index) => -1 + 0.2 * index); +const linear = x.map((v) => -1 + v); +const poly = x.map((v) => -1 + v ** 2 - v); + +const StyledPath = styled('path')<{ color: 'primary' | 'secondary' }>( + ({ theme, color }) => ({ + fill: 'none', + stroke: theme.palette.text[color], + shapeRendering: 'crispEdges', + strokeWidth: 1, + pointerEvents: 'none', + }), +); + +function CartesianAxis() { + // Get the drawing area bounding box + const { left, top, width, height } = useDrawingArea(); + + // Get the two scale + const yAxisScale = useYScale() as ScaleLinear; + const xAxisScale = useXScale() as ScaleLinear; + + const yOrigin = yAxisScale(0); + const xOrigin = xAxisScale(0); + + const xTicks = [-2, -1, 1, 2, 3]; + const yTicks = [-2, -1, 1, 2, 3, 4, 5]; + + return ( + + {yTicks.map((value) => ( + + ))} + {xTicks.map((value) => ( + + ))} + + + + ); +} +export default function OriginDemo() { + return ( + + + + + ); +} diff --git a/docs/data/charts/components/ScaleDemo.js b/docs/data/charts/components/ScaleDemo.js new file mode 100644 index 000000000000..3f6d476bfe33 --- /dev/null +++ b/docs/data/charts/components/ScaleDemo.js @@ -0,0 +1,135 @@ +import * as React from 'react'; + +import { styled } from '@mui/material/styles'; +import { + ResponsiveChartContainer, + LinePlot, + ChartsYAxis, + useDrawingArea, + useYScale, +} from '@mui/x-charts'; + +const StyledPath = styled('path')(({ theme }) => ({ + fill: 'none', + stroke: theme.palette.text.primary, + shapeRendering: 'crispEdges', + strokeWidth: 1, + pointerEvents: 'none', + strokeDasharray: '5 2', +})); + +const StyledText = styled('text')(({ theme }) => ({ + stroke: 'none', + fill: theme.palette.text.primary, + shapeRendering: 'crispEdges', +})); + +function ValueHighlight(props) { + const { svgRef } = props; + + // Get the drawing area bounding box + const { left, top, width, height } = useDrawingArea(); + + // Get the two scale + const leftAxisScale = useYScale('left_axis_id'); + const rightAxisScale = useYScale('right_axis_id'); + + const [mouseY, setMouseY] = React.useState(null); + + React.useEffect(() => { + const element = svgRef.current; + if (element === null) { + return () => {}; + } + + const handleMouseOut = () => { + setMouseY(null); + }; + + const handleMouseMove = (event) => { + const x = event.offsetX; + const y = event.offsetY; + if (x < left || x > left + width) { + setMouseY(null); + return; + } + if (y < top - 10 || y > top + height + 10) { + // Allows some margin if slightly on top/bottom of the drawing area + setMouseY(null); + return; + } + setMouseY(Math.max(Math.min(top + height, y), top)); // clamp to the drawing area + }; + + element.addEventListener('mouseout', handleMouseOut); + element.addEventListener('mousemove', handleMouseMove); + return () => { + element.removeEventListener('mouseout', handleMouseOut); + element.removeEventListener('mousemove', handleMouseMove); + }; + }, [height, left, top, width, svgRef]); + + if (mouseY === null) { + return null; + } + return ( + + + + {leftAxisScale.invert(mouseY).toFixed(0)} + + + + {rightAxisScale.invert(mouseY).toFixed(0)} + + + ); +} +export default function ScaleDemo() { + const svgRef = React.useRef(null); + return ( + + + + + + + ); +} diff --git a/docs/data/charts/components/ScaleDemo.tsx b/docs/data/charts/components/ScaleDemo.tsx new file mode 100644 index 000000000000..7507e6a85e90 --- /dev/null +++ b/docs/data/charts/components/ScaleDemo.tsx @@ -0,0 +1,135 @@ +import * as React from 'react'; +import { ScaleLinear } from 'd3-scale'; +import { styled } from '@mui/material/styles'; +import { + ResponsiveChartContainer, + LinePlot, + ChartsYAxis, + useDrawingArea, + useYScale, +} from '@mui/x-charts'; + +const StyledPath = styled('path')(({ theme }) => ({ + fill: 'none', + stroke: theme.palette.text.primary, + shapeRendering: 'crispEdges', + strokeWidth: 1, + pointerEvents: 'none', + strokeDasharray: '5 2', +})); + +const StyledText = styled('text')(({ theme }) => ({ + stroke: 'none', + fill: theme.palette.text.primary, + shapeRendering: 'crispEdges', +})); + +function ValueHighlight(props: { svgRef: React.RefObject }) { + const { svgRef } = props; + + // Get the drawing area bounding box + const { left, top, width, height } = useDrawingArea(); + + // Get the two scale + const leftAxisScale = useYScale('left_axis_id') as ScaleLinear; + const rightAxisScale = useYScale('right_axis_id') as ScaleLinear; + + const [mouseY, setMouseY] = React.useState(null); + + React.useEffect(() => { + const element = svgRef.current; + if (element === null) { + return () => {}; + } + + const handleMouseOut = () => { + setMouseY(null); + }; + + const handleMouseMove = (event: MouseEvent) => { + const x = event.offsetX; + const y = event.offsetY; + if (x < left || x > left + width) { + setMouseY(null); + return; + } + if (y < top - 10 || y > top + height + 10) { + // Allows some margin if slightly on top/bottom of the drawing area + setMouseY(null); + return; + } + setMouseY(Math.max(Math.min(top + height, y), top)); // clamp to the drawing area + }; + + element.addEventListener('mouseout', handleMouseOut); + element.addEventListener('mousemove', handleMouseMove); + return () => { + element.removeEventListener('mouseout', handleMouseOut); + element.removeEventListener('mousemove', handleMouseMove); + }; + }, [height, left, top, width, svgRef]); + + if (mouseY === null) { + return null; + } + return ( + + + + {leftAxisScale.invert(mouseY).toFixed(0)} + + + + {rightAxisScale.invert(mouseY).toFixed(0)} + + + ); +} +export default function ScaleDemo() { + const svgRef = React.useRef(null); + return ( + + + + + + + ); +} diff --git a/docs/data/charts/components/components.md b/docs/data/charts/components/components.md new file mode 100644 index 000000000000..aaf107791dee --- /dev/null +++ b/docs/data/charts/components/components.md @@ -0,0 +1,76 @@ +--- +title: Charts - Custom components +--- + +# Charts - Custom components + +

Creating custom chart components is made easier by hooks.

+ +## Interact with dimensions + +### Drawing area + +Charts dimensions are defined by a few props: + +- `height` and `width` for the `` size. If not provided those values are derived from the container. +- `margin` for adding space between the `` border and the **drawing area**. + +The term **drawing area** refers to the space available to plot data (scatter points, lines, or pie arcs). +The `margin` is used to leave some space for extra elements, such as the axes, the legend, or the title. + +You can use the `useDrawingArea` hook in the charts subcomponents to get the coordinates of the **drawing area**. + +```jsx +import { useDrawingArea } from '@mui/x-charts'; + +const { left, top, width, height } = useDrawingArea(); +``` + +{{"demo": "BasicScaleDemo.js"}} + +### Scales + +Some charts, such as line, bar, and scatter do a mapping between their series' data and the SVG coordinates. + +For example, a line chart series with a value of 36,725$ on the 6th of December 2022 could be mapped to coordinates (628, 514). +This operation can be reversed. +Coordinate with x=628 would be associated with the 6th of December 2022 and y=514 would be associated with value 36,725$. + +Those mappings depend on the dimensions of the SVG and the drawing area. +It also depends on the [axes' properties](/x/react-charts/axis/) such as the scale (linear, log, square root) and min/max values. + +All that data is available in the [`d3-scale` objects](https://github.com/d3/d3-scale). + +You can use `useXScale()` and `useYScale()` to access those scales. +Both accept either: + +- a number to select the index of the axis to select. +- a string to select an axis by its id. + +The scale object is generated such that it maps values to SVG coordinates. +You don't need extra work to take into account the drawing area. + +#### Value to coordinate + +The `d3-scale` default method maps from values to coordinates. +For example, you can get the `x=0` coordinate as follow: + +```jsx +const xAxisScale = useXScale(); // get the default X scale +const xOrigin = xAxisScale(0); +``` + +{{"demo": "OriginDemo.js"}} + +#### Coordinate to value + +The `d3-scale` object allows you to convert a coordinate to a data value with the `invert` method. + +The next example contains two lines drawn using different y-axes. +By using `invert`, the value associated with the current mouse coordinate `y` can be resolved as follows: + +```jsx +{leftAxisScale.invert(yCoordinate).toFixed(0)} +``` + +{{"demo": "ScaleDemo.js"}} diff --git a/docs/data/charts/legend/legend.md b/docs/data/charts/legend/legend.md index c9af9e8d6df8..3f686306aa4d 100644 --- a/docs/data/charts/legend/legend.md +++ b/docs/data/charts/legend/legend.md @@ -25,7 +25,7 @@ The `position` places the legend just next to the drawing area, and offset value Defaults are such that the legend is placed on top of the charts. -{{"demo": "LegendCustomizationNoSnap.js", "hideToolbar": true, "bg": "inline", "disableAd": true}} +{{"demo": "LegendCustomizationNoSnap.js", "hideToolbar": true, "bg": "inline"}} ## Dimensions @@ -36,4 +36,4 @@ The dimension of the legend is defined by some CSS variables: - `--ChartsLegend-labelSpacing`: The space between the mark and the label. - `--ChartsLegend-rootSpacing`: The space between two series. -{{"demo": "DimensionsNoSnap.js", "hideToolbar": true, "bg": "inline", "disableAd": true}} +{{"demo": "DimensionsNoSnap.js", "hideToolbar": true, "bg": "inline"}} diff --git a/docs/data/charts/lines/lines.md b/docs/data/charts/lines/lines.md index 7ddb18f3751c..105c83ec6d2f 100644 --- a/docs/data/charts/lines/lines.md +++ b/docs/data/charts/lines/lines.md @@ -46,7 +46,7 @@ For more information, see [stacking docs](/x/react-charts/stacking/). The interpolation between data points can be customized by the `curve` property. This property expects one of the following string values, corresponding to the interpolation method: `'catmullRom'`, `'linear'`, `'monotoneX'`, `'monotoneY'`, `'natural'`, `'step'`, `'stepBefore'`, `'stepAfter'`. -{{"demo": "InterpolationDemo.js", "hideToolbar": true, "bg": "inline", "disableAd": true}} +{{"demo": "InterpolationDemo.js", "hideToolbar": true, "bg": "inline"}} ### CSS diff --git a/docs/data/charts/pie-demo/pie-demo.md b/docs/data/charts/pie-demo/pie-demo.md index ce97c2637cc2..e2b94d314eab 100644 --- a/docs/data/charts/pie-demo/pie-demo.md +++ b/docs/data/charts/pie-demo/pie-demo.md @@ -1,5 +1,4 @@ --- -product: charts title: Charts - Pie demonstration --- diff --git a/docs/data/charts/pie/pie.md b/docs/data/charts/pie/pie.md index 475446bdd984..a647573112d0 100644 --- a/docs/data/charts/pie/pie.md +++ b/docs/data/charts/pie/pie.md @@ -2,7 +2,7 @@ title: Charts - Pie --- -# Charts - Pie 🚧 +# Charts - Pie

Pie charts express portions of a whole, using arcs or angles within a circle.

@@ -50,7 +50,7 @@ Pie series shape is described by multiple properties: - `startAngle`/`endAngle` The angle range of the pie chart. Values are given in degrees. - `cx`/`cy` The center of the pie charts. By default the middle of the drawing area. -{{"demo": "PieShapeNoSnap.js", "hideToolbar": true, "bg": "inline", "disableAd": true}} +{{"demo": "PieShapeNoSnap.js", "hideToolbar": true, "bg": "inline"}} ## Labels diff --git a/docs/data/charts/tree-map/tree-map.md b/docs/data/charts/tree-map/tree-map.md index 5d15f147491a..f20788b542cd 100644 --- a/docs/data/charts/tree-map/tree-map.md +++ b/docs/data/charts/tree-map/tree-map.md @@ -2,7 +2,7 @@ title: Charts - Tree map --- -# Charts - Tree map +# Charts - Tree map 🚧

Tree map allows to display data with a hierarchical structure.

diff --git a/docs/data/data-grid/demo/PopularFeaturesDemo.js b/docs/data/data-grid/demo/PopularFeaturesDemo.js index c6e0f8ee25a5..5934c43a7132 100644 --- a/docs/data/data-grid/demo/PopularFeaturesDemo.js +++ b/docs/data/data-grid/demo/PopularFeaturesDemo.js @@ -170,7 +170,7 @@ export const featuresSet = [ }, { id: 17, - name: 'Cell Selection', + name: 'Cell selection', description: 'Allow users to select individual and multiple cells with mouse dragging and/or keyboard (using shift key)', plan: 'Premium', diff --git a/docs/data/data-grid/demo/PopularFeaturesDemo.tsx b/docs/data/data-grid/demo/PopularFeaturesDemo.tsx index 63d8fc0589e0..52d9f93f32ce 100644 --- a/docs/data/data-grid/demo/PopularFeaturesDemo.tsx +++ b/docs/data/data-grid/demo/PopularFeaturesDemo.tsx @@ -185,7 +185,7 @@ export const featuresSet: Row[] = [ }, { id: 17, - name: 'Cell Selection', + name: 'Cell selection', description: 'Allow users to select individual and multiple cells with mouse dragging and/or keyboard (using shift key)', plan: 'Premium', diff --git a/docs/data/data-grid/editing/CustomEditComponent.js b/docs/data/data-grid/editing/CustomEditComponent.js index 92c4832ac8a7..8762b22fec6d 100644 --- a/docs/data/data-grid/editing/CustomEditComponent.js +++ b/docs/data/data-grid/editing/CustomEditComponent.js @@ -1,6 +1,7 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import Rating from '@mui/material/Rating'; +import { unstable_useEnhancedEffect as useEnhancedEffect } from '@mui/utils'; import { DataGrid, useGridApiContext } from '@mui/x-data-grid'; function renderRating(params) { @@ -8,24 +9,25 @@ function renderRating(params) { } function RatingEditInputCell(props) { - const { id, value, field } = props; + const { id, value, field, hasFocus } = props; const apiRef = useGridApiContext(); + const ref = React.useRef(); const handleChange = (event, newValue) => { apiRef.current.setEditCellValue({ id, field, value: newValue }); }; - const handleRef = (element) => { - if (element) { - const input = element.querySelector(`input[value="${value}"]`); + useEnhancedEffect(() => { + if (hasFocus && ref.current) { + const input = ref.current.querySelector(`input[value="${value}"]`); input?.focus(); } - }; + }, [hasFocus, value]); return ( ) { } function RatingEditInputCell(props: GridRenderCellParams) { - const { id, value, field } = props; + const { id, value, field, hasFocus } = props; const apiRef = useGridApiContext(); + const ref = React.useRef(); const handleChange = (event: React.SyntheticEvent, newValue: number | null) => { apiRef.current.setEditCellValue({ id, field, value: newValue }); }; - const handleRef = (element: HTMLSpanElement) => { - if (element) { - const input = element.querySelector( + useEnhancedEffect(() => { + if (hasFocus && ref.current) { + const input = ref.current.querySelector( `input[value="${value}"]`, ); input?.focus(); } - }; + }, [hasFocus, value]); return ( { + if (hasFocus) { + ref.current.focus(); + } + }, [hasFocus]); const handleValueChange = (event: React.ChangeEvent) => { const newValue = event.target.value; // The new value entered by the user apiRef.current.setEditCellValue({ id, field, value: newValue }); }; - return ; + return ; } ``` diff --git a/docs/data/data-grid/events/events.json b/docs/data/data-grid/events/events.json index 0c2be9611d48..bcdbe8b3731f 100644 --- a/docs/data/data-grid/events/events.json +++ b/docs/data/data-grid/events/events.json @@ -324,6 +324,13 @@ "event": "MuiEvent", "componentProp": "onRowEditStop" }, + { + "projects": ["x-data-grid", "x-data-grid-pro", "x-data-grid-premium"], + "name": "rowExpansionChange", + "description": "Fired when the expansion of a row is changed. Called with a GridGroupNode object.", + "params": "GridGroupNode", + "event": "MuiEvent<{}>" + }, { "projects": ["x-data-grid-premium"], "name": "rowGroupingModelChange", diff --git a/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js new file mode 100644 index 000000000000..f49a7c71784d --- /dev/null +++ b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js @@ -0,0 +1,76 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { DataGrid, GridToolbar } from '@mui/x-data-grid'; +import { randomTraderName, randomEmail } from '@mui/x-data-grid-generator'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; + +const columns = [ + { field: 'id', headerName: 'ID', width: 80 }, + { field: 'name', headerName: 'Name', width: 150 }, + { field: 'email', headerName: 'Email', width: 150 }, + { field: 'age', headerName: 'Age', type: 'number' }, +]; + +const rows = [ + { id: 1, name: randomTraderName(), email: randomEmail(), age: 25 }, + { id: 2, name: randomTraderName(), email: randomEmail(), age: 36 }, + { id: 3, name: randomTraderName(), email: randomEmail(), age: 19 }, + { id: 4, name: randomTraderName(), email: randomEmail(), age: 28 }, + { id: 5, name: randomTraderName(), email: randomEmail(), age: 23 }, + { id: 6, name: randomTraderName(), email: randomEmail(), age: 27 }, + { id: 7, name: randomTraderName(), email: randomEmail(), age: 18 }, + { id: 8, name: randomTraderName(), email: randomEmail(), age: 31 }, + { id: 9, name: randomTraderName(), email: randomEmail(), age: 24 }, + { id: 10, name: randomTraderName(), email: randomEmail(), age: 35 }, +]; + +export default function QuickFilteringExcludeHiddenColumns() { + const [filterModel, setFilterModel] = React.useState({ + items: [], + quickFilterExcludeHiddenColumns: true, + quickFilterValues: ['1'], + }); + + const [columnVisibilityModel, setColumnVisibilityModel] = React.useState({}); + + return ( + + + setColumnVisibilityModel(() => ({ id: event.target.checked })) + } + control={} + label="Show ID column" + /> + + setFilterModel((model) => ({ + ...model, + quickFilterExcludeHiddenColumns: event.target.checked, + })) + } + control={} + label="Exclude hidden columns" + /> + + setFilterModel(newModel)} + slotProps={{ toolbar: { showQuickFilter: true } }} + columnVisibilityModel={columnVisibilityModel} + onColumnVisibilityModelChange={(newModel) => + setColumnVisibilityModel(newModel) + } + /> + + + ); +} diff --git a/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.tsx b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.tsx new file mode 100644 index 000000000000..0c193459cc6f --- /dev/null +++ b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.tsx @@ -0,0 +1,84 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { + DataGrid, + GridToolbar, + GridRowsProp, + GridColDef, + GridFilterModel, + GridColumnVisibilityModel, +} from '@mui/x-data-grid'; +import { randomTraderName, randomEmail } from '@mui/x-data-grid-generator'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; + +const columns: GridColDef[] = [ + { field: 'id', headerName: 'ID', width: 80 }, + { field: 'name', headerName: 'Name', width: 150 }, + { field: 'email', headerName: 'Email', width: 150 }, + { field: 'age', headerName: 'Age', type: 'number' }, +]; + +const rows: GridRowsProp = [ + { id: 1, name: randomTraderName(), email: randomEmail(), age: 25 }, + { id: 2, name: randomTraderName(), email: randomEmail(), age: 36 }, + { id: 3, name: randomTraderName(), email: randomEmail(), age: 19 }, + { id: 4, name: randomTraderName(), email: randomEmail(), age: 28 }, + { id: 5, name: randomTraderName(), email: randomEmail(), age: 23 }, + { id: 6, name: randomTraderName(), email: randomEmail(), age: 27 }, + { id: 7, name: randomTraderName(), email: randomEmail(), age: 18 }, + { id: 8, name: randomTraderName(), email: randomEmail(), age: 31 }, + { id: 9, name: randomTraderName(), email: randomEmail(), age: 24 }, + { id: 10, name: randomTraderName(), email: randomEmail(), age: 35 }, +]; + +export default function QuickFilteringExcludeHiddenColumns() { + const [filterModel, setFilterModel] = React.useState({ + items: [], + quickFilterExcludeHiddenColumns: true, + quickFilterValues: ['1'], + }); + + const [columnVisibilityModel, setColumnVisibilityModel] = + React.useState({}); + + return ( + + + setColumnVisibilityModel(() => ({ id: (event.target as any).checked })) + } + control={} + label="Show ID column" + /> + + setFilterModel((model) => ({ + ...model, + quickFilterExcludeHiddenColumns: (event.target as any).checked, + })) + } + control={} + label="Exclude hidden columns" + /> + + setFilterModel(newModel)} + slotProps={{ toolbar: { showQuickFilter: true } }} + columnVisibilityModel={columnVisibilityModel} + onColumnVisibilityModelChange={(newModel) => + setColumnVisibilityModel(newModel) + } + /> + + + ); +} diff --git a/docs/data/data-grid/filtering/quick-filter.md b/docs/data/data-grid/filtering/quick-filter.md index fc998d976316..8102be104abd 100644 --- a/docs/data/data-grid/filtering/quick-filter.md +++ b/docs/data/data-grid/filtering/quick-filter.md @@ -28,6 +28,29 @@ The quick filter values can be initialized by setting the `filter.filterModel.qu {{"demo": "QuickFilteringInitialize.js", "bg": "inline", "defaultCodeOpen": false}} +## Excluding hidden columns + +By default, the quick filter searches all the columns, including those that are hidden. + +To exclude the hidden columns from the quick filter, set `filterModel.quickFilterExcludeHiddenColumns` to `true`: + +```tsx + +``` + +In the demo below, try hiding the `ID` column. You will see no results, because there are no visible columns that contain `1`: + +{{"demo": "QuickFilteringExcludeHiddenColumns.js", "bg": "inline", "defaultCodeOpen": false}} + ## Custom filtering logic The logic used for quick filter can be switched to filter rows that contain _at least_ one of the values specified instead of testing if it contains all of them. diff --git a/docs/data/data-grid/localization/data.json b/docs/data/data-grid/localization/data.json index bdae5f10562b..efd086d881c4 100644 --- a/docs/data/data-grid/localization/data.json +++ b/docs/data/data-grid/localization/data.json @@ -155,7 +155,7 @@ "languageTag": "pl-PL", "importName": "plPL", "localeName": "Polish", - "missingKeysCount": 34, + "missingKeysCount": 27, "totalKeysCount": 119, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/grid/x-data-grid/src/locales/plPL.ts" }, diff --git a/docs/data/data-grid/localization/localization.md b/docs/data/data-grid/localization/localization.md index 3ebc8b059f67..063131023fda 100644 --- a/docs/data/data-grid/localization/localization.md +++ b/docs/data/data-grid/localization/localization.md @@ -101,7 +101,7 @@ You can [find the source](https://github.com/mui/mui-x/tree/HEAD/packages/grid/x To create your own translation or to customize the English text, copy this file to your project, make any changes needed and import the locale from there. Note that these translations of the Data Grid component depend on the [Localization strategy](/material-ui/guides/localization/) of the whole library. -## 🚧 RTL Support +## RTL Support 🚧 :::warning RTL is not fully supported in the Data Grid. diff --git a/docs/data/data-grid/overview/overview.md b/docs/data/data-grid/overview/overview.md index 6c80a377306c..75668a64f4fe 100644 --- a/docs/data/data-grid/overview/overview.md +++ b/docs/data/data-grid/overview/overview.md @@ -93,7 +93,7 @@ Please see [the Licensing page](/x/introduction/licensing/) for details. - [Accessible](/x/react-data-grid/accessibility/) - [Localization](/x/react-data-grid/localization/) -### 🚧 Upcoming features +### Upcoming features 🚧 While development of the data grid component is moving fast, there are still many additional features that we plan to implement. Some of them: diff --git a/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.js b/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.js index 8c3184d9c5d5..b823e8af8c78 100644 --- a/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.js +++ b/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.js @@ -9,10 +9,16 @@ import { useMovieData } from '@mui/x-data-grid-generator'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; +const debug = (params) => console.info('Row expansion changed for row ', params.id); + export default function RowGroupingSetChildrenExpansion() { const data = useMovieData(); const apiRef = useGridApiRef(); + React.useEffect(() => { + apiRef.current.subscribeEvent('rowExpansionChange', debug); + }, [apiRef]); + const initialState = useKeepGroupedColumnsHidden({ apiRef, initialState: { diff --git a/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.tsx b/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.tsx index 08e47cd2c63f..5212054412dc 100644 --- a/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.tsx +++ b/docs/data/data-grid/row-grouping/RowGroupingSetChildrenExpansion.tsx @@ -10,10 +10,17 @@ import { useMovieData } from '@mui/x-data-grid-generator'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; +const debug = (params: GridGroupNode) => + console.info('Row expansion changed for row ', params.id); + export default function RowGroupingSetChildrenExpansion() { const data = useMovieData(); const apiRef = useGridApiRef(); + React.useEffect(() => { + apiRef.current.subscribeEvent('rowExpansionChange', debug); + }, [apiRef]); + const initialState = useKeepGroupedColumnsHidden({ apiRef, initialState: { diff --git a/docs/data/data-grid/row-grouping/row-grouping.md b/docs/data/data-grid/row-grouping/row-grouping.md index 8341c84600e6..011e89d1ee31 100644 --- a/docs/data/data-grid/row-grouping/row-grouping.md +++ b/docs/data/data-grid/row-grouping/row-grouping.md @@ -236,7 +236,7 @@ isGroupExpandedByDefault={ {{"demo": "RowGroupingIsGroupExpandedByDefault.js", "bg": "inline", "defaultCodeOpen": false}} -Use the `setRowChildrenExpansion` method on `apiRef` to programmatically set the expansion of a row. +Use the `setRowChildrenExpansion` method on `apiRef` to programmatically set the expansion of a row. Changing the expansion of a row emits a `rowExpansionChange` event, listen to it to react to the expansion change. {{"demo": "RowGroupingSetChildrenExpansion.js", "bg": "inline", "defaultCodeOpen": false}} diff --git a/docs/data/date-pickers/custom-components/custom-components.md b/docs/data/date-pickers/custom-components/custom-components.md index 14e075881650..2941b67e1db0 100644 --- a/docs/data/date-pickers/custom-components/custom-components.md +++ b/docs/data/date-pickers/custom-components/custom-components.md @@ -37,6 +37,58 @@ As an example, you could override the `ActionBar` and pass additional props to t To modify components position, have a look at the [custom layout](/x/react-date-pickers/custom-layout/) docs page. +### Recommended usage + +:::success +Remember to pass a reference to the component instead of an inline render function and define it outside of the main component. +This ensures that the component is not re-rendered on every update. +::: + +This code is buggy because it will render a new input after each keystroke, leading to a loss of focus. + +```jsx +function MyApp() { + const [name, setName] = React.useState(''); + + // This component gets redefined each time `name` is updated ❌ + const CustomActionBar = () => ( + setName(event.target.value)} /> + ); + return ( + , + }} + /> + ); +} +``` + +This one is correct since it's always the same input with different props. + +```jsx +// These components are defined only once ✅ +const CustomActionBar = ({ name, setName }) => ( + setName(event.target.value)} /> +); +const CustomToolbar = () => ; + +function MyApp() { + const [name, setName] = React.useState(''); + return ( + + ); +} +``` + ## Action bar ### Component props diff --git a/docs/data/date-pickers/custom-field/custom-field.md b/docs/data/date-pickers/custom-field/custom-field.md index 1c28017b1de8..81e791768ef1 100644 --- a/docs/data/date-pickers/custom-field/custom-field.md +++ b/docs/data/date-pickers/custom-field/custom-field.md @@ -53,9 +53,9 @@ Setting `formatDensity` to `"spacious"` will add a space before and after each ` ### Using another input -#### With the Joy input +#### With the Joy UI input -You can use the [_Joy UI_](https://mui.com/joy-ui/getting-started/overview/) components instead of the _Material UI_ ones: +You can use the [Joy UI](https://mui.com/joy-ui/getting-started/) components instead of the Material UI ones: :::info A higher-level solution for _Joy UI_ will be provided in the near future for even simpler usage. diff --git a/docs/data/date-pickers/date-range-picker/date-range-picker.md b/docs/data/date-pickers/date-range-picker/date-range-picker.md index ecde5f529b3e..22716442a9be 100644 --- a/docs/data/date-pickers/date-range-picker/date-range-picker.md +++ b/docs/data/date-pickers/date-range-picker/date-range-picker.md @@ -99,7 +99,9 @@ To simplify range selection, you can add [shortcuts](/x/react-date-pickers/short You can find the documentation in the [Validation page](/x/react-date-pickers/validation/) -## 🚧 Month Range Picker +## Month Range Picker 🚧 + +The Month Range Picker allows setting a range of months. :::warning This feature isn't implemented yet. It's coming. @@ -108,5 +110,3 @@ This feature isn't implemented yet. It's coming. Don't hesitate to leave a comment on the same issue to influence what gets built. Especially if you already have a use case for this component, or if you are facing a pain point with your current solution. ::: - -The Month Range Picker allows setting a range of months. diff --git a/docs/data/pages.ts b/docs/data/pages.ts index bfdcd2ee88f7..21dfd7b807e2 100644 --- a/docs/data/pages.ts +++ b/docs/data/pages.ts @@ -360,21 +360,22 @@ const pages: MuiPage[] = [ ], }, { pathname: '/x/react-charts/axis', title: 'Axis' }, - { pathname: '/x/react-charts/tooltip', title: 'Tooltip' }, + { pathname: '/x/react-charts/components', title: 'Custom components' }, { pathname: '/x/react-charts/legend', title: 'Legend' }, - { pathname: '/x/react-charts/styling', title: 'Styling' }, { pathname: '/x/react-charts/stacking', title: 'Stacking' }, + { pathname: '/x/react-charts/styling', title: 'Styling' }, + { pathname: '/x/react-charts/tooltip', title: 'Tooltip' }, { pathname: '/x/api/charts-group', title: 'API Reference', children: [...chartsComponentApi], }, - { pathname: '/x/react-charts/heat-map', title: '🚧 Heat map' }, - { pathname: '/x/react-charts/funnel', title: '🚧 Funnel' }, - { pathname: '/x/react-charts/gantt', title: '🚧 Gantt' }, - { pathname: '/x/react-charts/radar', title: '🚧 Radar' }, - { pathname: '/x/react-charts/sankey', title: '🚧 Sankey' }, - { pathname: '/x/react-charts/tree-map', title: '🚧 Tree map' }, + { pathname: '/x/react-charts/heat-map', title: 'Heat map 🚧' }, + { pathname: '/x/react-charts/funnel', title: 'Funnel 🚧' }, + { pathname: '/x/react-charts/gantt', title: 'Gantt 🚧' }, + { pathname: '/x/react-charts/radar', title: 'Radar 🚧' }, + { pathname: '/x/react-charts/sankey', title: 'Sankey 🚧' }, + { pathname: '/x/react-charts/tree-map', title: 'Tree map 🚧' }, ], }, { diff --git a/docs/package.json b/docs/package.json index 5ac44af9d729..f7966bf8d797 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,15 +28,15 @@ "@emotion/react": "^11.11.1", "@emotion/server": "^11.11.0", "@emotion/styled": "^11.11.0", - "@mui/icons-material": "^5.11.16", - "@mui/joy": "^5.0.0-alpha.85", - "@mui/material": "^5.13.6", - "@mui/styles": "^5.13.2", - "@mui/utils": "^5.13.6", + "@mui/icons-material": "^5.14.0", + "@mui/joy": "^5.0.0-alpha.87", + "@mui/material": "^5.14.0", + "@mui/styles": "^5.14.0", + "@mui/utils": "^5.13.7", "@trendmicro/react-interpolate": "^0.5.5", "@types/lodash": "^4.14.195", "@types/moment-hijri": "^2.1.0", - "@types/react-dom": "^18.2.6", + "@types/react-dom": "^18.2.7", "@types/react-router-dom": "^5.3.3", "ast-types": "^0.14.2", "autoprefixer": "^10.4.14", @@ -62,13 +62,13 @@ "luxon": "^3.3.0", "lz-string": "^1.5.0", "markdown-to-jsx": "^7.2.1", - "marked": "^5.1.0", + "marked": "^5.1.1", "moment": "^2.29.4", "moment-hijri": "^2.1.2", "moment-timezone": "^0.5.43", "next": "^13.4.6", "nprogress": "^0.2.0", - "postcss": "^8.4.24", + "postcss": "^8.4.26", "prismjs": "^1.29.0", "prop-types": "^15.8.1", "raw-loader": "^1.0.0", @@ -81,7 +81,7 @@ "react-router-dom": "^6.11.2", "react-runner": "^1.0.3", "react-simple-code-editor": "^0.13.1", - "recast": "^0.23.2", + "recast": "^0.23.3", "rimraf": "^5.0.1", "styled-components": "^5.3.11", "stylis": "^4.2.0", @@ -93,7 +93,7 @@ "@babel/plugin-transform-react-constant-elements": "^7.22.5", "@babel/preset-typescript": "^7.22.5", "@types/doctrine": "^0.0.5", - "cpy-cli": "^4.2.0", + "cpy-cli": "^5.0.0", "gm": "^1.25.0", "typescript-to-proptypes": "^2.2.1" } diff --git a/docs/pages/x/api/data-grid/data-grid-premium.json b/docs/pages/x/api/data-grid/data-grid-premium.json index 08c34ec952bb..8569313b7d0f 100644 --- a/docs/pages/x/api/data-grid/data-grid-premium.json +++ b/docs/pages/x/api/data-grid/data-grid-premium.json @@ -89,7 +89,7 @@ "filterModel": { "type": { "name": "shape", - "description": "{ items: Array<{ field: string, id?: number
| string, operator: string, value?: any }>, logicOperator?: 'and'
| 'or', quickFilterLogicOperator?: 'and'
| 'or', quickFilterValues?: array }" + "description": "{ items: Array<{ field: string, id?: number
| string, operator: string, value?: any }>, logicOperator?: 'and'
| 'or', quickFilterExcludeHiddenColumns?: bool, quickFilterLogicOperator?: 'and'
| 'or', quickFilterValues?: array }" } }, "getAggregationPosition": { diff --git a/docs/pages/x/api/data-grid/data-grid-pro.json b/docs/pages/x/api/data-grid/data-grid-pro.json index 61d648bdb156..b2b4a60f930d 100644 --- a/docs/pages/x/api/data-grid/data-grid-pro.json +++ b/docs/pages/x/api/data-grid/data-grid-pro.json @@ -77,7 +77,7 @@ "filterModel": { "type": { "name": "shape", - "description": "{ items: Array<{ field: string, id?: number
| string, operator: string, value?: any }>, logicOperator?: 'and'
| 'or', quickFilterLogicOperator?: 'and'
| 'or', quickFilterValues?: array }" + "description": "{ items: Array<{ field: string, id?: number
| string, operator: string, value?: any }>, logicOperator?: 'and'
| 'or', quickFilterExcludeHiddenColumns?: bool, quickFilterLogicOperator?: 'and'
| 'or', quickFilterValues?: array }" } }, "getCellClassName": { "type": { "name": "func" } }, diff --git a/docs/pages/x/api/data-grid/data-grid.json b/docs/pages/x/api/data-grid/data-grid.json index 5c8e6fc1de33..e6a0ab828ef3 100644 --- a/docs/pages/x/api/data-grid/data-grid.json +++ b/docs/pages/x/api/data-grid/data-grid.json @@ -58,7 +58,7 @@ "filterModel": { "type": { "name": "shape", - "description": "{ items: Array<{ field: string, id?: number
| string, operator: string, value?: any }>, logicOperator?: 'and'
| 'or', quickFilterLogicOperator?: 'and'
| 'or', quickFilterValues?: array }" + "description": "{ items: Array<{ field: string, id?: number
| string, operator: string, value?: any }>, logicOperator?: 'and'
| 'or', quickFilterExcludeHiddenColumns?: bool, quickFilterLogicOperator?: 'and'
| 'or', quickFilterValues?: array }" } }, "getCellClassName": { "type": { "name": "func" } }, diff --git a/docs/pages/x/api/data-grid/grid-filter-model.md b/docs/pages/x/api/data-grid/grid-filter-model.md index 6d6c9e1bac48..c8683632ee23 100644 --- a/docs/pages/x/api/data-grid/grid-filter-model.md +++ b/docs/pages/x/api/data-grid/grid-filter-model.md @@ -23,9 +23,10 @@ import { GridFilterModel } from '@mui/x-data-grid'; ## Properties -| Name | Type | Default | Description | -| :--------------------------------------------------------------------------------------------------------- | :----------------------------------------------- | :-------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- | -| items | GridFilterItem[] | [] | | -| logicOperator? | GridLogicOperator | `GridLogicOperator.Or` | - `GridLogicOperator.And`: the row must pass all the filter items.
- `GridLogicOperator.Or`: the row must pass at least on filter item. | -| quickFilterLogicOperator? | GridLogicOperator | `GridLogicOperator.And` | - `GridLogicOperator.And`: the row must pass all the values.
- `GridLogicOperator.Or`: the row must pass at least one value. | -| quickFilterValues? | any[] | `[]` | values used to quick filter rows | +| Name | Type | Default | Description | +| :---------------------------------------------------------------------------------------------------------------- | :----------------------------------------------- | :-------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- | +| items | GridFilterItem[] | [] | | +| logicOperator? | GridLogicOperator | `GridLogicOperator.Or` | - `GridLogicOperator.And`: the row must pass all the filter items.
- `GridLogicOperator.Or`: the row must pass at least on filter item. | +| quickFilterExcludeHiddenColumns? | boolean | false | If `true`, the quick filter will skip cell values from hidden columns. | +| quickFilterLogicOperator? | GridLogicOperator | `GridLogicOperator.And` | - `GridLogicOperator.And`: the row must pass all the values.
- `GridLogicOperator.Or`: the row must pass at least one value. | +| quickFilterValues? | any[] | `[]` | values used to quick filter rows | diff --git a/docs/pages/x/react-charts/components.js b/docs/pages/x/react-charts/components.js new file mode 100644 index 000000000000..7f74333487c2 --- /dev/null +++ b/docs/pages/x/react-charts/components.js @@ -0,0 +1,7 @@ +import * as React from 'react'; +import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; +import * as pageProps from 'docsx/data/charts/components/components.md?@mui/markdown'; + +export default function Page() { + return ; +} diff --git a/docs/src/modules/components/DemoPropsForm.tsx b/docs/src/modules/components/DemoPropsForm.tsx index 214910b2963d..665f0c988c18 100644 --- a/docs/src/modules/components/DemoPropsForm.tsx +++ b/docs/src/modules/components/DemoPropsForm.tsx @@ -64,6 +64,18 @@ type DataType = { * If `false`, the prop does not display in the code block. */ codeBlockDisplay?: boolean; + /** + * Option for knobs: `number` + */ + step?: number; + /** + * Option for knobs: `number` + */ + min?: number; + /** + * Option for knobs: `number` + */ + max?: number; }[]; interface ChartDemoPropsFormProps { @@ -181,7 +193,7 @@ export default function ChartDemoPropsForm( }, }} > - {data.map(({ propName, knob, options = [], defaultValue, labels }) => { + {data.map(({ propName, knob, options = [], defaultValue, labels, step, min, max }) => { const resolvedValue = props[propName] ?? defaultValue; if (!knob) { return null; @@ -345,7 +357,7 @@ export default function ChartDemoPropsForm( ...latestProps, [propName]: Number.isNaN(event.target.value) ? undefined - : Number.parseInt(event.target.value, 10), + : Number.parseFloat(event.target.value), })) } sx={{ @@ -354,6 +366,13 @@ export default function ChartDemoPropsForm( bgcolor: 'background.body', }, }} + slotProps={{ + input: { + step, + min, + max, + }, + }} /> ); diff --git a/docs/src/modules/components/InstallationInstructions.tsx b/docs/src/modules/components/InstallationInstructions.tsx index 1f3fd737d2df..9c96269703e4 100644 --- a/docs/src/modules/components/InstallationInstructions.tsx +++ b/docs/src/modules/components/InstallationInstructions.tsx @@ -1,15 +1,13 @@ import * as React from 'react'; // @ts-expect-error -import HighlightedCode from 'docs/src/modules/components/HighlightedCode'; +import HighlightedCodeWithTabs from 'docs/src/modules/components/HighlightedCodeWithTabs'; import Stack from '@mui/material/Stack'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; -import MenuItem from '@mui/material/MenuItem'; -import TextField from '@mui/material/TextField'; +import Box from '@mui/material/Box'; +import ToggleOptions from './ToggleOptions'; const defaultPackageManagers: Record = { - yarn: 'yarn add', npm: 'npm install', + yarn: 'yarn add', }; export default function InstallationInstructions(props: { @@ -23,88 +21,50 @@ export default function InstallationInstructions(props: { }) { const { packages, packageManagers = defaultPackageManagers, peerDependency = null } = props; const packagesTypes = Object.keys(packages); - const packageManagersNames = Object.keys(packageManagers); - const [licenseType, setLicenseType] = React.useState(packagesTypes[0]); - const [packageManger, setPackageManger] = React.useState(packageManagersNames[0]); + const [licenceType, setLicenceType] = React.useState(packagesTypes[0]); const [libraryUsed, setLibraryUsed] = React.useState( - peerDependency ? peerDependency.packages[0] : null, + peerDependency ? peerDependency.packages[0] : '', ); - const handlePackageMangerChange = ( - event: React.MouseEvent, - nextPackageManager: string, - ) => { - if (nextPackageManager !== null) { - setPackageManger(nextPackageManager); - } - }; + const tabs = Object.entries(packageManagers).map(([packageManger, installInstruction]) => { + const code = [`${installInstruction} ${packages[licenceType]}`]; - const handleLicenseTypeChange = ( - event: React.MouseEvent, - nextLicenseType: string, - ) => { - if (nextLicenseType !== null) { - setLicenseType(nextLicenseType); + if (peerDependency) { + code.push(''); + if (peerDependency.installationComment) { + code.push(peerDependency.installationComment); + } + code.push(`${installInstruction} ${libraryUsed}`); } - }; - - const commands = [`${packageManagers[packageManger]} ${packages[licenseType]}`]; - - if (peerDependency) { - commands.push(''); - if (peerDependency.installationComment) { - commands.push(peerDependency.installationComment); - } - commands.push(`${packageManagers[packageManger]} ${libraryUsed}`); - } + return { + code: code.join('\n'), + language: 'bash', + tab: packageManger, + }; + }); return ( - - - {packageManagersNames.map((key) => ( - - {key} - - ))} - - - {packagesTypes.map((key) => ( - - {key} - - ))} - - {peerDependency ? ( - { - setLibraryUsed(event.target.value); - }} - select - > - {peerDependency.packages.map((packageName) => ( - - {packageName} - - ))} - - ) : null} - - + + + {peerDependency && ( + + )} + + + ); } diff --git a/docs/src/modules/components/LocalizationTable.js b/docs/src/modules/components/LocalizationTable.js index 205650f33544..a3319d7b5fcc 100644 --- a/docs/src/modules/components/LocalizationTable.js +++ b/docs/src/modules/components/LocalizationTable.js @@ -3,7 +3,6 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; import { styled } from '@mui/material/styles'; -import { green } from '@mui/material/colors'; import Link from 'docs/src/modules/components/Link'; import MarkdownElement from 'docs/src/modules/components/MarkdownElement'; @@ -13,55 +12,50 @@ const Root = styled('div')(({ theme }) => ({ minWidth: '100%', display: 'flex', justifyContent: 'center', - paddingLeft: theme.spacing(1), - paddingRight: theme.spacing(1), + padding: theme.spacing(0, 1), borderRadius: 5, fontWeight: 600, color: (theme.vars || theme).palette.text.secondary, - '&.low': { color: - (theme.vars || theme).palette.mode === 'dark' + theme.palette.mode === 'dark' ? (theme.vars || theme).palette.text.primary : (theme.vars || theme).palette.error.dark, - '& .progress-bar': { backgroundColor: (theme.vars || theme).palette.error.main, opacity: 0.3, }, '& .progress-background': { - border: `1.5px solid ${(theme.vars || theme).palette.error.dark}`, + border: `1px solid`, + borderColor: (theme.vars || theme).palette.error.light, }, }, '&.medium': { color: - (theme.vars || theme).palette.mode === 'dark' + theme.palette.mode === 'dark' ? (theme.vars || theme).palette.text.primary : (theme.vars || theme).palette.warning.dark, - '& .progress-bar': { backgroundColor: (theme.vars || theme).palette.warning.main, - opacity: 0.3, + opacity: theme.palette.mode === 'dark' ? 0.4 : 0.25, }, '& .progress-background': { - border: `1.5px solid ${(theme.vars || theme).palette.warning.dark}`, + border: `1px solid`, + borderColor: (theme.vars || theme).palette.warning.light, }, }, '&.high': { color: - (theme.vars || theme).palette.mode === 'dark' + theme.palette.mode === 'dark' ? (theme.vars || theme).palette.text.primary : (theme.vars || theme).palette.success.dark, - '& .progress-bar': { backgroundColor: (theme.vars || theme).palette.success.main, opacity: 0.3, }, '& .progress-background': { - border: `1.5px solid ${green[200]}`, - '&.completed': { - border: `1.5px solid ${(theme.vars || theme).palette.success.dark}`, - }, + border: `1px solid`, + borderColor: (theme.vars || theme).palette.success.light, }, }, })); @@ -87,7 +81,7 @@ const Background = styled('div')({ borderRadius: 5, }); -const ProgressBar = React.memo(function ProgressBar(props) { +function ProgressBar(props) { const { numerator, denumerator } = props; const valueInPercent = numerator === denumerator ? 100 : Math.floor((numerator / denumerator) * 95); @@ -100,23 +94,19 @@ const ProgressBar = React.memo(function ProgressBar(props) { high: valueInPercent > 80, })} > - + - {numerator === denumerator ? 'Done! 🎉' : `${numerator}/${denumerator}`} + {numerator === denumerator ? 'Done 🎉' : `${numerator}/${denumerator}`} ); -}); +} ProgressBar.propTypes = { denumerator: PropTypes.number.isRequired, numerator: PropTypes.number.isRequired, }; -function LocalisationTable(props) { +export default function LocalisationTable(props) { const { data } = props; return ( BCP 47 language tag Import name Completion - Related file + Source file @@ -174,5 +164,3 @@ function LocalisationTable(props) { LocalisationTable.propTypes = { data: PropTypes.array.isRequired, }; - -export default LocalisationTable; diff --git a/docs/src/modules/components/PickersRenderingInstructions.js b/docs/src/modules/components/PickersRenderingInstructions.js index 61845bd8a851..c5fe8c848b3d 100644 --- a/docs/src/modules/components/PickersRenderingInstructions.js +++ b/docs/src/modules/components/PickersRenderingInstructions.js @@ -1,11 +1,7 @@ -/* eslint-disable material-ui/no-hardcoded-labels */ import * as React from 'react'; import HighlightedCode from 'docs/src/modules/components/HighlightedCode'; import Stack from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; -import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; -import ToggleButton from '@mui/material/ToggleButton'; +import ToggleOptions from './ToggleOptions'; const libraries = { dayjs: 'AdapterDayjs', @@ -18,16 +14,6 @@ export default function PickersRenderingInstructions() { const [licenceType, setLicenceType] = React.useState('community'); const [libraryUsed, setLibraryUsed] = React.useState('dayjs'); - const handleLicenceTypeChange = (event, nextLicenseType) => { - if (nextLicenseType !== null) { - setLicenceType(nextLicenseType); - } - }; - - const handleLibraryUsedChange = (event) => { - setLibraryUsed(event.target.value); - }; - const componentPackage = licenceType === 'pro' ? '@mui/x-date-pickers-pro' : '@mui/x-date-pickers'; @@ -49,28 +35,20 @@ export default function PickersRenderingInstructions() { return ( - - community - pro - - + + - {Object.keys(libraries).map((lib) => ( - - {lib} - - ))} - + setValue={setLibraryUsed} + options={Object.keys(libraries)} + label="Date library" + autoColapse + /> diff --git a/docs/src/modules/components/ToggleOptions.tsx b/docs/src/modules/components/ToggleOptions.tsx new file mode 100644 index 000000000000..e7468b0d0773 --- /dev/null +++ b/docs/src/modules/components/ToggleOptions.tsx @@ -0,0 +1,100 @@ +import * as React from 'react'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import ToggleButton from '@mui/material/ToggleButton'; +import MenuItem from '@mui/material/MenuItem'; +import Select from '@mui/material/Select'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; + +export default function ToggleOptions(props: { + options: string[]; + label: string; + value: string; + setValue: (arg: React.SetStateAction) => void; + autoColapse?: boolean; +}) { + const { options, label, value, setValue, autoColapse } = props; + + return ( + + + {label} + + (autoColapse ? { [theme.breakpoints.down('md')]: { display: 'none' } } : {})} + size="small" + fullWidth + color="primary" + value={value} + exclusive + onChange={(event, newValue) => { + if (newValue) { + setValue(newValue); + } + }} + aria-label={label} + > + {options.map((option) => { + return ( + + {option} + + ); + })} + + + + ); +} diff --git a/package.json b/package.json index 850bc3f79f90..88eb30d31a99 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "6.9.2", + "version": "6.10.0", "private": true, "scripts": { "start": "yarn && yarn docs:dev", @@ -67,7 +67,7 @@ "release:tag": "node scripts/releaseTag.mjs" }, "devDependencies": { - "@argos-ci/core": "^0.8.0", + "@argos-ci/core": "^0.9.0", "@babel/cli": "^7.22.5", "@babel/core": "^7.22.5", "@babel/node": "^7.22.5", @@ -88,11 +88,11 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@mnajdova/enzyme-adapter-react-18": "^0.2.0", - "@mui/icons-material": "^5.11.16", - "@mui/material": "^5.13.6", + "@mui/icons-material": "^5.14.0", + "@mui/material": "^5.14.0", "@mui/monorepo": "https://github.com/mui/material-ui.git#master", - "@mui/utils": "^5.13.6", - "@octokit/plugin-retry": "^5.0.4", + "@mui/utils": "^5.13.7", + "@octokit/plugin-retry": "^6.0.0", "@octokit/rest": "^19.0.13", "@playwright/test": "1.35.1", "@testing-library/react": "^14.0.0", @@ -103,14 +103,14 @@ "@types/mocha": "^10.0.1", "@types/node": "^18.16.19", "@types/prettier": "^2.7.3", - "@types/react": "^18.2.14", - "@types/react-dom": "^18.2.6", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", "@types/react-test-renderer": "^18.0.0", "@types/requestidlecallback": "^0.3.5", "@types/sinon": "^10.0.15", "@types/yargs": "^17.0.24", - "@typescript-eslint/eslint-plugin": "^5.61.0", - "@typescript-eslint/parser": "^5.61.0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", "axe-core": "4.7.2", "babel-loader": "^9.1.2", "babel-plugin-istanbul": "^6.1.1", @@ -128,14 +128,14 @@ "cross-env": "^7.0.3", "danger": "^11.2.6", "enzyme": "^3.11.0", - "eslint": "^8.44.0", + "eslint": "^8.45.0", "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", "eslint-config-prettier": "^8.8.0", "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsdoc": "^46.4.3", + "eslint-plugin-jsdoc": "^46.4.4", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-mocha": "^10.1.0", "eslint-plugin-prettier": "^4.2.1", @@ -154,7 +154,7 @@ "karma-mocha": "^2.0.1", "karma-sourcemap-loader": "^0.4.0", "karma-webpack": "^5.0.0", - "lerna": "^7.1.1", + "lerna": "^7.1.4", "markdownlint-cli2": "^0.8.1", "mocha": "^10.2.0", "nyc": "^15.1.0", diff --git a/packages/eslint-plugin-material-ui/package.json b/packages/eslint-plugin-material-ui/package.json index 9c6eeb35885e..0092abca6fe1 100644 --- a/packages/eslint-plugin-material-ui/package.json +++ b/packages/eslint-plugin-material-ui/package.json @@ -5,9 +5,9 @@ "description": "Custom eslint rules for MUI X.", "main": "src/index.js", "devDependencies": { - "@types/eslint": "^8.40.2", - "@typescript-eslint/experimental-utils": "^5.61.0", - "@typescript-eslint/parser": "^5.61.0" + "@types/eslint": "^8.44.0", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0" }, "scripts": { "test": "cd ../../ && cross-env NODE_ENV=test mocha 'packages/eslint-plugin-material-ui/**/*.test.js' --timeout 3000" diff --git a/packages/grid/x-data-grid-generator/package.json b/packages/grid/x-data-grid-generator/package.json index 210f69dc17bd..9bb1f1201259 100644 --- a/packages/grid/x-data-grid-generator/package.json +++ b/packages/grid/x-data-grid-generator/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid-generator", - "version": "6.9.2", + "version": "6.10.0", "description": "Generate fake data for demo purposes only.", "author": "MUI Team", "main": "src/index.ts", @@ -31,8 +31,8 @@ }, "dependencies": { "@babel/runtime": "^7.22.5", - "@mui/base": "^5.0.0-beta.5", - "@mui/x-data-grid-premium": "6.9.2", + "@mui/base": "^5.0.0-beta.7", + "@mui/x-data-grid-premium": "6.10.0", "chance": "^1.1.11", "clsx": "^1.2.1", "lru-cache": "^7.18.3" diff --git a/packages/grid/x-data-grid-premium/package.json b/packages/grid/x-data-grid-premium/package.json index 323387b95379..65a49708ccc8 100644 --- a/packages/grid/x-data-grid-premium/package.json +++ b/packages/grid/x-data-grid-premium/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid-premium", - "version": "6.9.2", + "version": "6.10.0", "description": "The Premium plan edition of the data grid component (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -43,10 +43,10 @@ }, "dependencies": { "@babel/runtime": "^7.22.5", - "@mui/utils": "^5.13.6", - "@mui/x-data-grid": "6.9.2", - "@mui/x-data-grid-pro": "6.9.2", - "@mui/x-license-pro": "6.9.0", + "@mui/utils": "^5.13.7", + "@mui/x-data-grid": "6.10.0", + "@mui/x-data-grid-pro": "6.10.0", + "@mui/x-license-pro": "6.10.0", "@types/format-util": "^1.0.2", "clsx": "^1.2.1", "exceljs": "^4.3.0", diff --git a/packages/grid/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx b/packages/grid/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx index df756e17d860..1ae2d642a242 100644 --- a/packages/grid/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx +++ b/packages/grid/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx @@ -316,6 +316,7 @@ DataGridPremiumRaw.propTypes = { }), ).isRequired, logicOperator: PropTypes.oneOf(['and', 'or']), + quickFilterExcludeHiddenColumns: PropTypes.bool, quickFilterLogicOperator: PropTypes.oneOf(['and', 'or']), quickFilterValues: PropTypes.array, }), diff --git a/packages/grid/x-data-grid-premium/src/hooks/features/aggregation/wrapColumnWithAggregation.tsx b/packages/grid/x-data-grid-premium/src/hooks/features/aggregation/wrapColumnWithAggregation.tsx index f08849fca532..48b097531a47 100644 --- a/packages/grid/x-data-grid-premium/src/hooks/features/aggregation/wrapColumnWithAggregation.tsx +++ b/packages/grid/x-data-grid-premium/src/hooks/features/aggregation/wrapColumnWithAggregation.tsx @@ -1,10 +1,9 @@ import * as React from 'react'; -import { GridFilterOperator, GridRowId } from '@mui/x-data-grid-pro'; +import { GridColDef, GridFilterOperator, GridRowId } from '@mui/x-data-grid-pro'; import { GridBaseColDef, tagInternalFilter } from '@mui/x-data-grid-pro/internals'; import { GridApiPremium } from '../../../models/gridApiPremium'; import { GridAggregationCellMeta, - GridAggregationHeaderMeta, GridAggregationLookup, GridAggregationPosition, GridAggregationRule, @@ -24,9 +23,7 @@ const AGGREGATION_WRAPPABLE_PROPERTIES = [ type WrappableColumnProperty = (typeof AGGREGATION_WRAPPABLE_PROPERTIES)[number]; interface GridColDefWithAggregationWrappers extends GridBaseColDef { - aggregationWrappedProperties?: { - [P in WrappableColumnProperty]?: { original: GridBaseColDef[P]; wrapped: GridBaseColDef[P] }; - }; + aggregationWrappedColumn: GridBaseColDef; } type ColumnPropertyWrapper

= (params: { @@ -178,19 +175,15 @@ const getWrappedRenderHeader: ColumnPropertyWrapper<'renderHeader'> = ({ value: renderHeader, aggregationRule, }) => { - const wrappedRenderCell: GridBaseColDef['renderHeader'] = (params) => { - const aggregationMeta: GridAggregationHeaderMeta = { - aggregationRule, - }; - - if (!renderHeader) { - return ; + const wrappedRenderHeader: GridBaseColDef['renderHeader'] = (params) => { + const aggregation = { aggregationRule }; + if (renderHeader) { + return renderHeader({ ...params, aggregation }); } - - return renderHeader({ ...params, aggregation: aggregationMeta }); + return ; }; - return wrappedRenderCell; + return wrappedRenderHeader; }; /** @@ -233,11 +226,10 @@ export const wrapColumnWithAggregationValue = ({ return aggregationResult; }; - const aggregationWrappedProperties: GridColDefWithAggregationWrappers['aggregationWrappedProperties'] = - {}; + let didWrapSomeProperty = false; const wrappedColumn: GridColDefWithAggregationWrappers = { ...column, - aggregationWrappedProperties, + aggregationWrappedColumn: column, }; const wrapColumnProperty =

( @@ -254,11 +246,8 @@ export const wrapColumnWithAggregationValue = ({ }); if (wrappedProperty !== originalValue) { - aggregationWrappedProperties[property] = { - original: originalValue, - wrapped: wrappedProperty, - } as any; - wrappedColumn[property] = wrappedProperty; + didWrapSomeProperty = true; + wrappedColumn[property] = wrappedProperty as any; } }; @@ -268,7 +257,7 @@ export const wrapColumnWithAggregationValue = ({ wrapColumnProperty('renderHeader', getWrappedRenderHeader); wrapColumnProperty('filterOperators', getWrappedFilterOperators); - if (Object.keys(aggregationWrappedProperties).length === 0) { + if (!didWrapSomeProperty) { return column; } @@ -281,27 +270,7 @@ export const wrapColumnWithAggregationValue = ({ export const unwrapColumnFromAggregation = ({ column, }: { - column: GridColDefWithAggregationWrappers; + column: GridColDef | GridColDefWithAggregationWrappers; }) => { - if (!column.aggregationWrappedProperties) { - return column; - } - - const originalProperties = Object.entries(column.aggregationWrappedProperties); - if (originalProperties.length === 0) { - return column; - } - - const unwrappedColumn: GridBaseColDef = { ...column }; - - originalProperties.forEach(([propertyName, { original, wrapped }]) => { - // The value changed since we wrapped it - if (wrapped !== column[propertyName as WrappableColumnProperty]) { - return; - } - - unwrappedColumn[propertyName as WrappableColumnProperty] = original as any; - }); - - return unwrappedColumn; + return (column as GridColDefWithAggregationWrappers).aggregationWrappedColumn ?? column; }; diff --git a/packages/grid/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx b/packages/grid/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx index ed622870dcdd..d7d05dbbacd2 100644 --- a/packages/grid/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx +++ b/packages/grid/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; -import { spy, stub, SinonStub } from 'sinon'; +import { stub, SinonStub } from 'sinon'; import { expect } from 'chai'; -import { getCell } from 'test/utils/helperFn'; +import { spyApi, getCell } from 'test/utils/helperFn'; import { createRenderer, fireEvent, act, userEvent } from '@mui/monorepo/test/utils'; import { DataGridPremium, @@ -12,7 +12,7 @@ import { } from '@mui/x-data-grid-premium'; import { getBasicGridData } from '@mui/x-data-grid-generator'; -describe(' - Cell Selection', () => { +describe(' - Cell selection', () => { const { render } = createRenderer(); let apiRef: React.MutableRefObject; @@ -104,7 +104,8 @@ describe(' - Cell Selection', () => { it('should call selectCellRange', () => { render(); - const spiedSelectCellsBetweenRange = spy(apiRef.current, 'unstable_selectCellRange'); + const spiedSelectCellsBetweenRange = spyApi(apiRef.current, 'unstable_selectCellRange'); + const cell = getCell(0, 0); cell.focus(); userEvent.mousePress(cell); @@ -155,7 +156,7 @@ describe(' - Cell Selection', () => { describe('Shift + arrow keys', () => { it('should call selectCellRange when ArrowDown is pressed', () => { render(); - const spiedSelectCellsBetweenRange = spy(apiRef.current, 'unstable_selectCellRange'); + const spiedSelectCellsBetweenRange = spyApi(apiRef.current, 'unstable_selectCellRange'); const cell = getCell(0, 0); cell.focus(); userEvent.mousePress(cell); @@ -167,7 +168,7 @@ describe(' - Cell Selection', () => { it('should call selectCellRange when ArrowUp is pressed', () => { render(); - const spiedSelectCellsBetweenRange = spy(apiRef.current, 'unstable_selectCellRange'); + const spiedSelectCellsBetweenRange = spyApi(apiRef.current, 'unstable_selectCellRange'); const cell = getCell(1, 0); cell.focus(); userEvent.mousePress(cell); @@ -179,7 +180,7 @@ describe(' - Cell Selection', () => { it('should call selectCellRange when ArrowLeft is pressed', () => { render(); - const spiedSelectCellsBetweenRange = spy(apiRef.current, 'unstable_selectCellRange'); + const spiedSelectCellsBetweenRange = spyApi(apiRef.current, 'unstable_selectCellRange'); const cell = getCell(0, 1); cell.focus(); userEvent.mousePress(cell); @@ -194,7 +195,7 @@ describe(' - Cell Selection', () => { it('should call selectCellRange when ArrowRight is pressed', () => { render(); - const spiedSelectCellsBetweenRange = spy(apiRef.current, 'unstable_selectCellRange'); + const spiedSelectCellsBetweenRange = spyApi(apiRef.current, 'unstable_selectCellRange'); const cell = getCell(0, 0); cell.focus(); userEvent.mousePress(cell); diff --git a/packages/grid/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx b/packages/grid/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx index 795fd66a3d0c..404c90c23749 100644 --- a/packages/grid/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx +++ b/packages/grid/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx @@ -12,6 +12,7 @@ import { createRenderer, screen, fireEvent, act } from '@mui/monorepo/test/utils import { spy, SinonSpy } from 'sinon'; import { expect } from 'chai'; import Excel from 'exceljs'; +import { spyApi } from 'test/utils/helperFn'; const isJSDOM = /jsdom/.test(window.navigator.userAgent); @@ -365,7 +366,7 @@ describe(' - Export Excel', () => { it('should not call getDataAsExcel', async () => { render(); - const getDataAsExcelSpy = spy(apiRef.current, 'getDataAsExcel'); + const getDataAsExcelSpy = spyApi(apiRef.current, 'getDataAsExcel'); await act(() => apiRef.current.exportDataAsExcel({ worker: () => workerMock as any })); expect(getDataAsExcelSpy.calledOnce).to.equal(false); }); diff --git a/packages/grid/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx b/packages/grid/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx index 7003adcc5a89..d99d0d1ee93f 100644 --- a/packages/grid/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx +++ b/packages/grid/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx @@ -13,6 +13,7 @@ describe(' - License', () => { generateLicense({ expiryDate: addYears(new Date(), 1), orderNumber: 'Test', + licensingModel: 'subscription', scope: 'pro', }), ); diff --git a/packages/grid/x-data-grid-pro/package.json b/packages/grid/x-data-grid-pro/package.json index b720f649b97f..82c8080a7205 100644 --- a/packages/grid/x-data-grid-pro/package.json +++ b/packages/grid/x-data-grid-pro/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid-pro", - "version": "6.9.2", + "version": "6.10.0", "description": "The Pro plan edition of the data grid component (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -43,9 +43,9 @@ }, "dependencies": { "@babel/runtime": "^7.22.5", - "@mui/utils": "^5.13.6", - "@mui/x-data-grid": "6.9.2", - "@mui/x-license-pro": "6.9.0", + "@mui/utils": "^5.13.7", + "@mui/x-data-grid": "6.10.0", + "@mui/x-license-pro": "6.10.0", "@types/format-util": "^1.0.2", "clsx": "^1.2.1", "prop-types": "^15.8.1", diff --git a/packages/grid/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx b/packages/grid/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx index a8ef1c771758..2044cd537b00 100644 --- a/packages/grid/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx +++ b/packages/grid/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx @@ -283,6 +283,7 @@ DataGridProRaw.propTypes = { }), ).isRequired, logicOperator: PropTypes.oneOf(['and', 'or']), + quickFilterExcludeHiddenColumns: PropTypes.bool, quickFilterLogicOperator: PropTypes.oneOf(['and', 'or']), quickFilterValues: PropTypes.array, }), diff --git a/packages/grid/x-data-grid-pro/src/hooks/features/columnPinning/useGridColumnPinningPreProcessors.ts b/packages/grid/x-data-grid-pro/src/hooks/features/columnPinning/useGridColumnPinningPreProcessors.ts index 3cf16ed9833b..ce2b6d6c1e54 100644 --- a/packages/grid/x-data-grid-pro/src/hooks/features/columnPinning/useGridColumnPinningPreProcessors.ts +++ b/packages/grid/x-data-grid-pro/src/hooks/features/columnPinning/useGridColumnPinningPreProcessors.ts @@ -25,7 +25,7 @@ export const useGridColumnPinningPreProcessors = ( pinnedColumns = gridPinnedColumnsSelector(initializedState); } - const prevAllPinnedColumns = React.useRef(); + const prevAllPinnedColumns = React.useRef([]); const reorderPinnedColumns = React.useCallback>( (columnsState) => { @@ -53,7 +53,7 @@ export const useGridColumnPinningPreProcessors = ( // First, we check if the column was unpinned since the last processing. // If yes and it still exists, we move it back to the same position it was before pinning - prevAllPinnedColumns.current!.forEach((field) => { + prevAllPinnedColumns.current.forEach((field) => { if (!allPinnedColumns.includes(field) && columnsState.lookup[field]) { // Get the position before pinning const index = orderedFieldsBeforePinningColumns.indexOf(field); diff --git a/packages/grid/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx b/packages/grid/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx index 9d3a9157412b..5336b9e2f83e 100644 --- a/packages/grid/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx +++ b/packages/grid/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx @@ -14,7 +14,7 @@ import { } from '@mui/x-data-grid-pro'; import { getBasicGridData } from '@mui/x-data-grid-generator'; import { createRenderer, fireEvent, act, userEvent } from '@mui/monorepo/test/utils'; -import { getCell } from 'test/utils/helperFn'; +import { getCell, spyApi } from 'test/utils/helperFn'; describe(' - Cell Editing', () => { const { render, clock } = createRenderer({ clock: 'fake' }); @@ -718,7 +718,7 @@ describe(' - Cell Editing', () => { it('should call startCellEditMode', () => { render(); - const spiedStartCellEditMode = spy(apiRef.current, 'startCellEditMode'); + const spiedStartCellEditMode = spyApi(apiRef.current, 'startCellEditMode'); const cell = getCell(0, 1); fireEvent.doubleClick(cell); expect(spiedStartCellEditMode.callCount).to.equal(1); @@ -782,7 +782,7 @@ describe(' - Cell Editing', () => { it('should call startCellEditMode', () => { render(); - const spiedStartCellEditMode = spy(apiRef.current, 'startCellEditMode'); + const spiedStartCellEditMode = spyApi(apiRef.current, 'startCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'Enter' }); @@ -813,7 +813,7 @@ describe(' - Cell Editing', () => { it('should call startCellEditMode', () => { render(); - const spiedStartCellEditMode = spy(apiRef.current, 'startCellEditMode'); + const spiedStartCellEditMode = spyApi(apiRef.current, 'startCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'Delete' }); @@ -822,7 +822,7 @@ describe(' - Cell Editing', () => { it('should empty the cell', () => { render(); - const spiedStartCellEditMode = spy(apiRef.current, 'startCellEditMode'); + const spiedStartCellEditMode = spyApi(apiRef.current, 'startCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'Delete' }); @@ -838,7 +838,7 @@ describe(' - Cell Editing', () => { describe('by pressing a printable character', () => { it('should call startCellEditMode', () => { render(); - const spiedStartCellEditMode = spy(apiRef.current, 'startCellEditMode'); + const spiedStartCellEditMode = spyApi(apiRef.current, 'startCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'a' }); // A @@ -909,7 +909,7 @@ describe(' - Cell Editing', () => { it('should empty the cell', () => { render(); - const spiedStartCellEditMode = spy(apiRef.current, 'startCellEditMode'); + const spiedStartCellEditMode = spyApi(apiRef.current, 'startCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'a' }); @@ -969,7 +969,7 @@ describe(' - Cell Editing', () => { it('should call stopCellEditMode with ignoreModifications=false and cellToFocusAfter=undefined', () => { render(); - const spiedStopCellEditMode = spy(apiRef.current, 'stopCellEditMode'); + const spiedStopCellEditMode = spyApi(apiRef.current, 'stopCellEditMode'); fireEvent.doubleClick(getCell(0, 1)); userEvent.mousePress(getCell(1, 1)); expect(spiedStopCellEditMode.callCount).to.equal(1); @@ -984,7 +984,7 @@ describe(' - Cell Editing', () => { it('should call stopCellEditMode with ignoreModifications=false if the props are being processed', async () => { columnProps.preProcessEditCellProps = () => new Promise(() => {}); render(); - const spiedStopCellEditMode = spy(apiRef.current, 'stopCellEditMode'); + const spiedStopCellEditMode = spyApi(apiRef.current, 'stopCellEditMode'); fireEvent.doubleClick(getCell(0, 1)); await act( () => @@ -1014,7 +1014,7 @@ describe(' - Cell Editing', () => { it('should call stopCellEditMode with ignoreModifications=true and cellToFocusAfter=undefined', () => { render(); - const spiedStopCellEditMode = spy(apiRef.current, 'stopCellEditMode'); + const spiedStopCellEditMode = spyApi(apiRef.current, 'stopCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1044,7 +1044,7 @@ describe(' - Cell Editing', () => { it('should call stopCellEditMode with ignoreModifications=false and cellToFocusAfter=below', () => { render(); - const spiedStopCellEditMode = spy(apiRef.current, 'stopCellEditMode'); + const spiedStopCellEditMode = spyApi(apiRef.current, 'stopCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1061,7 +1061,7 @@ describe(' - Cell Editing', () => { it('should call stopCellEditMode with ignoreModifications=false if the props are being processed', async () => { columnProps.preProcessEditCellProps = () => new Promise(() => {}); render(); - const spiedStopCellEditMode = spy(apiRef.current, 'stopCellEditMode'); + const spiedStopCellEditMode = spyApi(apiRef.current, 'stopCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1093,7 +1093,7 @@ describe(' - Cell Editing', () => { it('should call stopCellEditMode with ignoreModifications=false and cellToFocusAfter=right', () => { render(); - const spiedStopCellEditMode = spy(apiRef.current, 'stopCellEditMode'); + const spiedStopCellEditMode = spyApi(apiRef.current, 'stopCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1110,7 +1110,7 @@ describe(' - Cell Editing', () => { it('should call stopCellEditMode with ignoreModifications=false if the props are being processed', async () => { columnProps.preProcessEditCellProps = () => new Promise(() => {}); render(); - const spiedStopCellEditMode = spy(apiRef.current, 'stopCellEditMode'); + const spiedStopCellEditMode = spyApi(apiRef.current, 'stopCellEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); diff --git a/packages/grid/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx b/packages/grid/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx index cf971f4c1935..85017686850e 100644 --- a/packages/grid/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx +++ b/packages/grid/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx @@ -149,6 +149,34 @@ describe(' - Columns', () => { expect(onColumnWidthChange.args[0][0].width).to.equal(120); }); + it('should not affect other cell elements that are not part of the main DataGrid instance', () => { + render( + ( +

+
+
+ ), + }, + ]} + />, + ); + const separator = document.querySelector(`.${gridClasses['columnSeparator--resizable']}`)!; + fireEvent.mouseDown(separator, { clientX: 100 }); + fireEvent.mouseMove(separator, { clientX: 110, buttons: 1 }); + fireEvent.mouseUp(separator); + expect(getColumnHeaderCell(0)).toHaveInlineStyle({ width: '110px' }); + expect(getCell(0, 0)).toHaveInlineStyle({ width: '110px' }); + expect(screen.getByTestId('dummy-row').firstElementChild).toHaveInlineStyle({ + width: '90px', + }); + }); + describe('flex resizing', () => { before(function beforeHook() { if (isJSDOM) { diff --git a/packages/grid/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx b/packages/grid/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx index 294edd67c4eb..62b77df7e944 100644 --- a/packages/grid/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx +++ b/packages/grid/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx @@ -12,7 +12,7 @@ import { } from '@mui/x-data-grid-pro'; import { act, createRenderer, fireEvent, screen, userEvent } from '@mui/monorepo/test/utils'; import { expect } from 'chai'; -import { getCell } from 'test/utils/helperFn'; +import { getCell, spyApi } from 'test/utils/helperFn'; import { spy, SinonSpy } from 'sinon'; /** @@ -61,7 +61,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue with debounce', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -147,7 +147,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue with debounce', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -230,7 +230,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue with the value converted to Date', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -250,7 +250,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue when entering the edit mode by pressing a digit', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); userEvent.mousePress(cell); @@ -264,7 +264,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue with null when entered an empty value', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -294,7 +294,7 @@ describe(' - Edit Components', () => { it('should handle correctly dates with partial years', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue') as SinonSpy< + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue') as SinonSpy< [GridEditCellValueParams & { value: Date }] >; @@ -365,7 +365,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue with the value converted to Date', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -385,7 +385,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue with null when entered an empty value', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -415,7 +415,7 @@ describe(' - Edit Components', () => { it('should handle correctly dates with partial years', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue') as SinonSpy< + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue') as SinonSpy< [GridEditCellValueParams & { value: Date }] >; @@ -482,7 +482,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue with the correct value when valueOptions is an array of strings', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -509,7 +509,7 @@ describe(' - Edit Components', () => { }, ]; render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -532,7 +532,7 @@ describe(' - Edit Components', () => { }, ]; render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); @@ -639,7 +639,7 @@ describe(' - Edit Components', () => { it('should call setEditCellValue', () => { render(); - const spiedSetEditCellValue = spy(apiRef.current, 'setEditCellValue'); + const spiedSetEditCellValue = spyApi(apiRef.current, 'setEditCellValue'); const cell = getCell(0, 0); fireEvent.doubleClick(cell); diff --git a/packages/grid/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx b/packages/grid/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx index cd7361ff0898..dbd563bbc9f6 100644 --- a/packages/grid/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx +++ b/packages/grid/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx @@ -14,7 +14,7 @@ import { import Portal from '@mui/material/Portal'; import { getBasicGridData } from '@mui/x-data-grid-generator'; import { createRenderer, fireEvent, act, userEvent, screen } from '@mui/monorepo/test/utils'; -import { getCell, getRow } from 'test/utils/helperFn'; +import { getCell, getRow, spyApi } from 'test/utils/helperFn'; describe(' - Row Editing', () => { const { render, clock } = createRenderer(); @@ -760,7 +760,7 @@ describe(' - Row Editing', () => { it('should call startRowEditMode', () => { render(); - const spiedStartRowEditMode = spy(apiRef.current, 'startRowEditMode'); + const spiedStartRowEditMode = spyApi(apiRef.current, 'startRowEditMode'); const cell = getCell(0, 1); fireEvent.doubleClick(cell); expect(spiedStartRowEditMode.callCount).to.equal(1); @@ -790,7 +790,7 @@ describe(' - Row Editing', () => { it('should call startRowEditMode passing fieldToFocus', () => { render(); - const spiedStartRowEditMode = spy(apiRef.current, 'startRowEditMode'); + const spiedStartRowEditMode = spyApi(apiRef.current, 'startRowEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'Enter' }); @@ -825,7 +825,7 @@ describe(' - Row Editing', () => { it('should call startRowEditMode passing fieldToFocus and deleteValue', () => { render(); - const spiedStartRowEditMode = spy(apiRef.current, 'startRowEditMode'); + const spiedStartRowEditMode = spyApi(apiRef.current, 'startRowEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'Delete' }); @@ -903,7 +903,7 @@ describe(' - Row Editing', () => { it('should call startRowEditMode passing fieldToFocus and deleteValue', () => { render(); - const spiedStartRowEditMode = spy(apiRef.current, 'startRowEditMode'); + const spiedStartRowEditMode = spyApi(apiRef.current, 'startRowEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.keyDown(cell, { key: 'a' }); @@ -966,7 +966,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=false and no cellToFocusAfter', () => { render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); fireEvent.doubleClick(getCell(0, 1)); userEvent.mousePress(getCell(1, 1)); clock.runToLast(); @@ -982,7 +982,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=false if the props are being processed', async () => { column1Props.preProcessEditCellProps = () => new Promise(() => {}); render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); fireEvent.doubleClick(getCell(0, 1)); act(() => { apiRef.current.setEditCellValue({ id: 0, field: 'currencyPair', value: 'USD GBP' }); @@ -1009,7 +1009,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=true', () => { render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1039,7 +1039,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=false and cellToFocusAfter=below', () => { render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1056,7 +1056,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=false if the props are being processed', async () => { column1Props.preProcessEditCellProps = () => new Promise(() => {}); render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1096,7 +1096,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=false and cellToFocusAfter=right', () => { render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); const cell = getCell(0, 2); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1112,7 +1112,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=false and cellToFocusAfter=left if Shift is pressed', () => { render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); const cell = getCell(0, 1); userEvent.mousePress(cell); fireEvent.doubleClick(cell); @@ -1129,7 +1129,7 @@ describe(' - Row Editing', () => { it('should call stopRowEditMode with ignoreModifications=false if the props are being processed', async () => { column1Props.preProcessEditCellProps = () => new Promise(() => {}); render(); - const spiedStopRowEditMode = spy(apiRef.current, 'stopRowEditMode'); + const spiedStopRowEditMode = spyApi(apiRef.current, 'stopRowEditMode'); const cell = getCell(0, 2); userEvent.mousePress(cell); fireEvent.doubleClick(cell); diff --git a/packages/grid/x-data-grid-pro/src/utils/domUtils.ts b/packages/grid/x-data-grid-pro/src/utils/domUtils.ts index 1ea9168c03e3..cc668475c4f6 100644 --- a/packages/grid/x-data-grid-pro/src/utils/domUtils.ts +++ b/packages/grid/x-data-grid-pro/src/utils/domUtils.ts @@ -1,6 +1,6 @@ import { gridClasses } from '@mui/x-data-grid'; import { findParentElementFromClassName } from '@mui/x-data-grid/internals'; -import { GridApiPro } from '../models/gridApiPro'; +import { GridPrivateApiPro } from '../models/gridApiPro'; export function getFieldFromHeaderElem(colCellEl: Element): string { return colCellEl.getAttribute('data-field')!; @@ -14,7 +14,7 @@ export function findGroupHeaderElementsFromField(elem: Element, field: string): return Array.from(elem.querySelectorAll(`[data-fields*="|-${field}-|"]`) ?? []); } -export function findGridCellElementsFromCol(col: HTMLElement, api: GridApiPro) { +export function findGridCellElementsFromCol(col: HTMLElement, api: GridPrivateApiPro) { const root = findParentElementFromClassName(col, gridClasses.root); if (!root) { throw new Error('MUI: The root element is not found.'); @@ -28,7 +28,14 @@ export function findGridCellElementsFromCol(col: HTMLElement, api: GridApiPro) { const colIndex = Number(ariaColIndex) - 1; const cells: Element[] = []; - const renderedRowElements = root.querySelectorAll(`.${gridClasses.row}`); + const virtualScrollerContent = api.virtualScrollerRef?.current?.firstElementChild; + if (!virtualScrollerContent) { + return []; + } + + const renderedRowElements = virtualScrollerContent.querySelectorAll( + `:scope > div > .${gridClasses.row}`, // Use > to ignore rows from detail panels + ); renderedRowElements.forEach((rowElement) => { const rowId = rowElement.getAttribute('data-id'); diff --git a/packages/grid/x-data-grid/package.json b/packages/grid/x-data-grid/package.json index 082808b5a638..097df10bb155 100644 --- a/packages/grid/x-data-grid/package.json +++ b/packages/grid/x-data-grid/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid", - "version": "6.9.2", + "version": "6.10.0", "description": "The community edition of the data grid component (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -47,7 +47,7 @@ }, "dependencies": { "@babel/runtime": "^7.22.5", - "@mui/utils": "^5.13.6", + "@mui/utils": "^5.13.7", "clsx": "^1.2.1", "prop-types": "^15.8.1", "reselect": "^4.1.8" diff --git a/packages/grid/x-data-grid/src/DataGrid/DataGrid.tsx b/packages/grid/x-data-grid/src/DataGrid/DataGrid.tsx index c3be8dd12870..99f00c3decfc 100644 --- a/packages/grid/x-data-grid/src/DataGrid/DataGrid.tsx +++ b/packages/grid/x-data-grid/src/DataGrid/DataGrid.tsx @@ -204,6 +204,7 @@ DataGridRaw.propTypes = { }), ).isRequired, logicOperator: PropTypes.oneOf(['and', 'or']), + quickFilterExcludeHiddenColumns: PropTypes.bool, quickFilterLogicOperator: PropTypes.oneOf(['and', 'or']), quickFilterValues: PropTypes.array, }), diff --git a/packages/grid/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx b/packages/grid/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx index ef1513e19e10..70977a70b246 100644 --- a/packages/grid/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx +++ b/packages/grid/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx @@ -59,7 +59,7 @@ export type GridToolbarQuickFilterProps = TextFieldProps & { * @param {any[]} values The new values passed to the quick filter model * @returns {string} The string to display in the text field */ - quickFilterFormatter?: (values: GridFilterModel['quickFilterValues']) => string; + quickFilterFormatter?: (values: NonNullable) => string; /** * The debounce time in milliseconds. * @default 500 @@ -83,12 +83,12 @@ function GridToolbarQuickFilter(props: GridToolbarQuickFilterProps) { quickFilterFormatter(quickFilterValues ?? []), ); - const [prevQuickFilterValues, setPrevQuickFilterValues] = React.useState(quickFilterValues); + const prevQuickFilterValuesRef = React.useRef(quickFilterValues); React.useEffect(() => { - if (!isDeepEqual(prevQuickFilterValues, quickFilterValues)) { + if (!isDeepEqual(prevQuickFilterValuesRef.current, quickFilterValues)) { // The model of quick filter value has been updated - setPrevQuickFilterValues(quickFilterValues); + prevQuickFilterValuesRef.current = quickFilterValues; // Update the input value if needed to match the new model setSearchValue((prevSearchValue) => @@ -97,11 +97,13 @@ function GridToolbarQuickFilter(props: GridToolbarQuickFilterProps) { : quickFilterFormatter(quickFilterValues ?? []), ); } - }, [prevQuickFilterValues, quickFilterValues, quickFilterFormatter, quickFilterParser]); + }, [quickFilterValues, quickFilterFormatter, quickFilterParser]); const updateSearchValue = React.useCallback( (newSearchValue: string) => { - apiRef.current.setQuickFilterValues(quickFilterParser(newSearchValue)); + const newQuickFilterValues = quickFilterParser(newSearchValue); + prevQuickFilterValuesRef.current = newQuickFilterValues; + apiRef.current.setQuickFilterValues(newQuickFilterValues); }, [apiRef, quickFilterParser], ); @@ -135,6 +137,7 @@ function GridToolbarQuickFilter(props: GridToolbarQuickFilterProps) { placeholder={apiRef.current.getLocaleText('toolbarQuickFilterPlaceholder')} aria-label={apiRef.current.getLocaleText('toolbarQuickFilterLabel')} type="search" + {...other} InputProps={{ startAdornment: , endAdornment: ( @@ -148,8 +151,8 @@ function GridToolbarQuickFilter(props: GridToolbarQuickFilterProps) { ), + ...other.InputProps, }} - {...other} {...rootProps.slotProps?.baseTextField} /> ); diff --git a/packages/grid/x-data-grid/src/hooks/core/pipeProcessing/useGridPipeProcessing.ts b/packages/grid/x-data-grid/src/hooks/core/pipeProcessing/useGridPipeProcessing.ts index 149c3831991a..200d3ec8f0f6 100644 --- a/packages/grid/x-data-grid/src/hooks/core/pipeProcessing/useGridPipeProcessing.ts +++ b/packages/grid/x-data-grid/src/hooks/core/pipeProcessing/useGridPipeProcessing.ts @@ -49,14 +49,16 @@ export const useGridPipeProcessing = (apiRef: React.MutableRefObject({}); + const isRunning = React.useRef(false); const runAppliers = React.useCallback((groupCache: GridPipeGroupCache | undefined) => { - if (!groupCache) { + if (isRunning.current || !groupCache) { return; } - + isRunning.current = true; Object.values(groupCache.appliers).forEach((callback) => { callback(); }); + isRunning.current = false; }, []); const registerPipeProcessor = React.useCallback< diff --git a/packages/grid/x-data-grid/src/hooks/core/useGridApiInitialization.ts b/packages/grid/x-data-grid/src/hooks/core/useGridApiInitialization.ts index ddcb9ef60e86..f1174749d1bf 100644 --- a/packages/grid/x-data-grid/src/hooks/core/useGridApiInitialization.ts +++ b/packages/grid/x-data-grid/src/hooks/core/useGridApiInitialization.ts @@ -4,52 +4,93 @@ import { useGridApiMethod } from '../utils/useGridApiMethod'; import { GridSignature } from '../utils/useGridApiEventHandler'; import { DataGridProcessedProps } from '../../models/props/DataGridProps'; import type { GridCoreApi } from '../../models'; -import type { - GridApiCommon, - GridPrivateApiCommon, - GridPrivateOnlyApiCommon, -} from '../../models/api/gridApiCommon'; +import type { GridApiCommon, GridPrivateApiCommon } from '../../models/api/gridApiCommon'; import { EventManager } from '../../utils/EventManager'; +const SYMBOL_API_PRIVATE = Symbol('mui.api_private'); + const isSyntheticEvent = (event: any): event is React.SyntheticEvent => { return event.isPropagationStopped !== undefined; }; +export function unwrapPrivateAPI< + PrivateApi extends GridPrivateApiCommon, + Api extends GridApiCommon, +>(publicApi: Api): PrivateApi { + return (publicApi as any)[SYMBOL_API_PRIVATE]; +} + let globalId = 0; -const wrapPublicApi = ( - publicApi: PublicApi, -) => { - type PrivateOnlyApi = GridPrivateOnlyApiCommon; - const privateOnlyApi = {} as PrivateOnlyApi; +function createPrivateAPI( + publicApiRef: React.MutableRefObject, +): PrivateApi { + const existingPrivateApi = (publicApiRef.current as any)?.[SYMBOL_API_PRIVATE]; + if (existingPrivateApi) { + return existingPrivateApi; + } + + const state = {} as Api['state']; + const privateApi = { + state, + store: Store.create(state), + instanceId: { id: globalId }, + } as any as PrivateApi; - privateOnlyApi.getPublicApi = () => publicApi; + globalId += 1; - privateOnlyApi.register = (visibility, methods) => { + privateApi.getPublicApi = () => publicApiRef.current; + + privateApi.register = (visibility, methods) => { Object.keys(methods).forEach((methodName) => { - if (visibility === 'public') { - publicApi[methodName as keyof PublicApi] = (methods as any)[methodName]; + const method = (methods as any)[methodName]; + + const currentPrivateMethod = privateApi[methodName as keyof typeof privateApi] as any; + if (currentPrivateMethod?.spying === true) { + currentPrivateMethod.target = method; } else { - privateOnlyApi[methodName as keyof PrivateOnlyApi] = (methods as any)[methodName]; + privateApi[methodName as keyof typeof privateApi] = method; + } + + if (visibility === 'public') { + const publicApi = publicApiRef.current; + + const currentPublicMethod = publicApi[methodName as keyof typeof publicApi] as any; + if (currentPublicMethod?.spying === true) { + currentPublicMethod.target = method; + } else { + publicApi[methodName as keyof typeof publicApi] = method; + } } }); }; - const handler: ProxyHandler = { - get: (obj, prop) => { - if (prop in obj) { - return obj[prop as keyof typeof obj]; - } - return privateOnlyApi[prop as keyof PrivateOnlyApi]; + privateApi.register('private', { + caches: {} as any, + eventManager: new EventManager(), + }); + + return privateApi; +} + +function createPublicAPI( + privateApiRef: React.MutableRefObject, +): Api { + const publicApi = { + get state() { + return privateApiRef.current.state; }, - set: (obj, prop, value) => { - obj[prop as keyof typeof obj] = value; - return true; + get store() { + return privateApiRef.current.store; }, - }; + get instanceId() { + return privateApiRef.current.instanceId; + }, + [SYMBOL_API_PRIVATE]: privateApiRef.current, + } as any as Api; - return new Proxy(publicApi, handler) as PrivateApi; -}; + return publicApi; +} export function useGridApiInitialization< PrivateApi extends GridPrivateApiCommon, @@ -59,30 +100,15 @@ export function useGridApiInitialization< props: Pick, ): React.MutableRefObject { const publicApiRef = React.useRef() as React.MutableRefObject; - - if (!publicApiRef.current) { - const state = {} as Api['state']; - - publicApiRef.current = { - state, - store: Store.create(state), - instanceId: { id: globalId }, - } as Api; - - globalId += 1; - } - const privateApiRef = React.useRef() as React.MutableRefObject; - if (!privateApiRef.current) { - privateApiRef.current = wrapPublicApi(publicApiRef.current); - privateApiRef.current.register('private', { - caches: {} as PrivateApi['caches'], - eventManager: new EventManager(), - }); + if (!privateApiRef.current) { + privateApiRef.current = createPrivateAPI(publicApiRef) as PrivateApi; } - React.useImperativeHandle(inputApiRef, () => publicApiRef.current, [publicApiRef]); + if (!publicApiRef.current) { + publicApiRef.current = createPublicAPI(privateApiRef); + } const publishEvent = React.useCallback( (...args: any[]) => { @@ -115,6 +141,8 @@ export function useGridApiInitialization< useGridApiMethod(privateApiRef, { subscribeEvent, publishEvent } as any, 'public'); + React.useImperativeHandle(inputApiRef, () => publicApiRef.current, [publicApiRef]); + React.useEffect(() => { const api = privateApiRef.current; diff --git a/packages/grid/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts b/packages/grid/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts index c714d17b8945..356d11678b8b 100644 --- a/packages/grid/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts +++ b/packages/grid/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts @@ -273,6 +273,14 @@ export const applyInitialState = ( return newColumnsState; }; +function getDefaultColTypeDef(columnTypes: GridColumnTypesRecord, type: GridColDef['type']) { + let colDef = columnTypes[DEFAULT_GRID_COL_TYPE_KEY]; + if (type && columnTypes[type]) { + colDef = columnTypes[type]; + } + return colDef; +} + export const createColumnsState = ({ apiRef, columnsToUpsert, @@ -324,14 +332,8 @@ export const createColumnsState = ({ let existingState = columnsState.lookup[field]; if (existingState == null) { - let colDef = columnTypes[DEFAULT_GRID_COL_TYPE_KEY]; - - if (newColumn.type && columnTypes[newColumn.type]) { - colDef = columnTypes[newColumn.type]; - } - existingState = { - ...colDef, + ...getDefaultColTypeDef(columnTypes, newColumn.type), field, hasBeenResized: false, }; @@ -340,6 +342,15 @@ export const createColumnsState = ({ columnsState.orderedFields.push(field); } + // If the column type has changed - merge the existing state with the default column type definition + if (existingState && existingState.type !== newColumn.type) { + existingState = { + ...existingState, + ...getDefaultColTypeDef(columnTypes, newColumn.type), + field, + }; + } + let hasBeenResized = existingState.hasBeenResized; COLUMNS_DIMENSION_PROPERTIES.forEach((key) => { if (newColumn[key] !== undefined) { diff --git a/packages/grid/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts b/packages/grid/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts index 40543d469edf..cf2b102192b9 100644 --- a/packages/grid/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts +++ b/packages/grid/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts @@ -118,7 +118,7 @@ export function useGridDimensions( } else { viewportOuterSize = { width: rootDimensionsRef.current.width, - height: rootDimensionsRef.current.height - totalHeaderHeight, + height: Math.max(rootDimensionsRef.current.height - totalHeaderHeight, 0), }; const scrollInformation = hasScroll({ diff --git a/packages/grid/x-data-grid/src/hooks/features/filter/gridFilterUtils.ts b/packages/grid/x-data-grid/src/hooks/features/filter/gridFilterUtils.ts index 2c636e0a06c1..bfda49fc0ada 100644 --- a/packages/grid/x-data-grid/src/hooks/features/filter/gridFilterUtils.ts +++ b/packages/grid/x-data-grid/src/hooks/features/filter/gridFilterUtils.ts @@ -19,7 +19,11 @@ import { GridQuickFilterValueResult, } from './gridFilterState'; import { buildWarning } from '../../../utils/warning'; -import { gridColumnFieldsSelector, gridColumnLookupSelector } from '../columns'; +import { + gridColumnFieldsSelector, + gridColumnLookupSelector, + gridVisibleColumnFieldsSelector, +} from '../columns'; type GridFilterItemApplier = | { @@ -267,7 +271,11 @@ export const buildAggregatedQuickFilterApplier = ( return null; } - const columnFields = gridColumnFieldsSelector(apiRef); + const quickFilterExcludeHiddenColumns = filterModel.quickFilterExcludeHiddenColumns ?? false; + + const columnFields = quickFilterExcludeHiddenColumns + ? gridVisibleColumnFieldsSelector(apiRef) + : gridColumnFieldsSelector(apiRef); const appliersPerField = [] as { column: GridColDef; diff --git a/packages/grid/x-data-grid/src/hooks/features/filter/useGridFilter.tsx b/packages/grid/x-data-grid/src/hooks/features/filter/useGridFilter.tsx index 5897020a5dce..653a289f3487 100644 --- a/packages/grid/x-data-grid/src/hooks/features/filter/useGridFilter.tsx +++ b/packages/grid/x-data-grid/src/hooks/features/filter/useGridFilter.tsx @@ -42,6 +42,7 @@ export const filterStateInitializer: GridStateInitializer< ...state, filter: { filterModel: sanitizeFilterModel(filterModel, props.disableMultipleColumnsFiltering, apiRef), + filteredRowsLookup: {}, filteredDescendantCountLookup: {}, }, visibleRowsLookup: {}, @@ -496,6 +497,13 @@ export const useGridFilter = ( useGridApiEventHandler(apiRef, 'columnsChange', handleColumnsChange); useGridApiEventHandler(apiRef, 'activeStrategyProcessorChange', handleStrategyProcessorChange); useGridApiEventHandler(apiRef, 'rowExpansionChange', updateVisibleRowsLookupState); + useGridApiEventHandler(apiRef, 'columnVisibilityModelChange', () => { + const filterModel = gridFilterModelSelector(apiRef); + if (filterModel.quickFilterValues && filterModel.quickFilterExcludeHiddenColumns) { + // re-apply filters because the quick filter results may have changed + apiRef.current.unstable_applyFilters(); + } + }); /** * 1ST RENDER diff --git a/packages/grid/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts b/packages/grid/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts index e7b9e6d967c4..0ea3b5781f3d 100644 --- a/packages/grid/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts +++ b/packages/grid/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts @@ -28,7 +28,7 @@ import { gridPinnedRowsSelector } from './gridRowsSelector'; import { gridDensityFactorSelector } from '../density/densitySelector'; export const GRID_ROOT_GROUP_ID: GridRowId = `auto-generated-group-node-root`; -export const GRID_ID_AUTOGENERATED = Symbol('mui-autogenerated-id'); +export const GRID_ID_AUTOGENERATED = Symbol('mui.id_autogenerated'); export const buildRootGroup = (): GridGroupNode => ({ type: 'group', diff --git a/packages/grid/x-data-grid/src/hooks/utils/useGridApiMethod.ts b/packages/grid/x-data-grid/src/hooks/utils/useGridApiMethod.ts index 14289014837d..fb7935e9d913 100644 --- a/packages/grid/x-data-grid/src/hooks/utils/useGridApiMethod.ts +++ b/packages/grid/x-data-grid/src/hooks/utils/useGridApiMethod.ts @@ -12,32 +12,14 @@ export function useGridApiMethod< V extends 'public' | 'private', T extends V extends 'public' ? Partial : Partial, >(privateApiRef: React.MutableRefObject, apiMethods: T, visibility: V) { - const apiMethodsRef = React.useRef(apiMethods); - const [apiMethodsNames] = React.useState(Object.keys(apiMethods) as Array); - - const installMethods = React.useCallback(() => { - if (!privateApiRef.current) { - return; - } - apiMethodsNames.forEach((methodName) => { - if (!privateApiRef.current.hasOwnProperty(methodName)) { - privateApiRef.current.register(visibility, { - [methodName]: (...args: any[]) => { - const fn = apiMethodsRef.current[methodName] as Function; - return fn(...args); - }, - }); - } - }); - }, [apiMethodsNames, privateApiRef, visibility]); - - React.useEffect(() => { - apiMethodsRef.current = apiMethods; - }, [apiMethods]); + const isFirstRender = React.useRef(true); React.useEffect(() => { - installMethods(); - }, [installMethods]); + isFirstRender.current = false; + privateApiRef.current.register(visibility, apiMethods); + }, [privateApiRef, visibility, apiMethods]); - installMethods(); + if (isFirstRender.current) { + privateApiRef.current.register(visibility, apiMethods); + } } diff --git a/packages/grid/x-data-grid/src/internals/index.ts b/packages/grid/x-data-grid/src/internals/index.ts index e8b3a08de287..3da2ef7ee53e 100644 --- a/packages/grid/x-data-grid/src/internals/index.ts +++ b/packages/grid/x-data-grid/src/internals/index.ts @@ -19,6 +19,7 @@ export { } from '../hooks/core/strategyProcessing'; export type { GridStrategyProcessor } from '../hooks/core/strategyProcessing'; export { useGridInitialization } from '../hooks/core/useGridInitialization'; +export { unwrapPrivateAPI } from '../hooks/core/useGridApiInitialization'; export { useGridClipboard } from '../hooks/features/clipboard/useGridClipboard'; export { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridColumnHeaders'; diff --git a/packages/grid/x-data-grid/src/locales/plPL.ts b/packages/grid/x-data-grid/src/locales/plPL.ts index 74aaf00f0bf3..e0871112636d 100644 --- a/packages/grid/x-data-grid/src/locales/plPL.ts +++ b/packages/grid/x-data-grid/src/locales/plPL.ts @@ -46,7 +46,7 @@ const plPLGrid: Partial = { // Filter panel text filterPanelAddFilter: 'Dodaj filtr', - // filterPanelRemoveAll: 'Remove all', + filterPanelRemoveAll: 'Usuń wszystkie', filterPanelDeleteIconLabel: 'Usuń', filterPanelLogicOperator: 'Operator logiczny', filterPanelOperator: 'Operator', @@ -78,12 +78,12 @@ const plPLGrid: Partial = { // 'filterOperator<=': '<=', // Header filter operators text - // headerFilterOperatorContains: 'Contains', - // headerFilterOperatorEquals: 'Equals', - // headerFilterOperatorStartsWith: 'Starts with', - // headerFilterOperatorEndsWith: 'Ends with', + headerFilterOperatorContains: 'Zawiera', + headerFilterOperatorEquals: 'Równa się', + headerFilterOperatorStartsWith: 'Zaczyna się od', + headerFilterOperatorEndsWith: 'Kończy się na', // headerFilterOperatorIs: 'Is', - // headerFilterOperatorNot: 'Is not', + headerFilterOperatorNot: 'Niepuste', // headerFilterOperatorAfter: 'Is after', // headerFilterOperatorOnOrAfter: 'Is on or after', // headerFilterOperatorBefore: 'Is before', @@ -106,7 +106,7 @@ const plPLGrid: Partial = { // Column menu text columnMenuLabel: 'Menu', columnMenuShowColumns: 'Pokaż wszystkie kolumny', - // columnMenuManageColumns: 'Manage columns', + columnMenuManageColumns: 'Zarządzaj kolumnami', columnMenuFilter: 'Filtr', columnMenuHideColumn: 'Ukryj', columnMenuUnsort: 'Anuluj sortowanie', diff --git a/packages/grid/x-data-grid/src/models/events/gridEventLookup.ts b/packages/grid/x-data-grid/src/models/events/gridEventLookup.ts index aa74a022cbec..294cba7f29c5 100644 --- a/packages/grid/x-data-grid/src/models/events/gridEventLookup.ts +++ b/packages/grid/x-data-grid/src/models/events/gridEventLookup.ts @@ -441,7 +441,6 @@ export interface GridEventLookup sortedRowsSet: {}; /** * Fired when the expansion of a row is changed. Called with a [[GridGroupNode]] object. - * @ignore - do not document. */ rowExpansionChange: { params: GridGroupNode }; /** diff --git a/packages/grid/x-data-grid/src/models/gridFilterModel.ts b/packages/grid/x-data-grid/src/models/gridFilterModel.ts index 67a284de2cde..f9e6d12ee7ec 100644 --- a/packages/grid/x-data-grid/src/models/gridFilterModel.ts +++ b/packages/grid/x-data-grid/src/models/gridFilterModel.ts @@ -27,4 +27,9 @@ export interface GridFilterModel { * @default `GridLogicOperator.And` */ quickFilterLogicOperator?: GridLogicOperator; + /** + * If `true`, the quick filter will skip cell values from hidden columns. + * @default false + */ + quickFilterExcludeHiddenColumns?: boolean; } diff --git a/packages/grid/x-data-grid/src/tests/columns.DataGrid.test.tsx b/packages/grid/x-data-grid/src/tests/columns.DataGrid.test.tsx index ed190096f1a0..cdea896e8698 100644 --- a/packages/grid/x-data-grid/src/tests/columns.DataGrid.test.tsx +++ b/packages/grid/x-data-grid/src/tests/columns.DataGrid.test.tsx @@ -3,6 +3,7 @@ import { expect } from 'chai'; import { createRenderer } from '@mui/monorepo/test/utils'; import { DataGrid, DataGridProps, GridRowsProp, GridColDef } from '@mui/x-data-grid'; import { + getCell, getColumnHeaderCell, getColumnHeadersTextContent, } from '../../../../../test/utils/helperFn'; @@ -13,7 +14,7 @@ const rows: GridRowsProp = [{ id: 1, idBis: 1 }]; const columns: GridColDef[] = [{ field: 'id' }, { field: 'idBis' }]; -describe(' - Columns', () => { +describe(' - Columns', () => { const { render } = createRenderer(); function TestDataGrid( @@ -64,4 +65,51 @@ describe(' - Columns', () => { expect(getColumnHeaderCell(0)).toHaveInlineStyle({ width: '100px' }); }); }); + + it('should allow to change the column type', () => { + const { setProps } = render( + , + ); + expect(getColumnHeaderCell(0)).not.to.have.class('MuiDataGrid-columnHeader--numeric'); + + setProps({ columns: [{ field: 'id', type: 'number' }, { field: 'idBis' }] }); + expect(getColumnHeaderCell(0)).to.have.class('MuiDataGrid-columnHeader--numeric'); + }); + + it('should not override column properties when changing column type', () => { + const { setProps } = render( + { + return `formatted: ${params.value}`; + }, + }, + { field: 'idBis' }, + ]} + />, + ); + expect(getColumnHeaderCell(0)).not.to.have.class('MuiDataGrid-columnHeader--numeric'); + expect(getCell(0, 0).textContent).to.equal('formatted: 1'); + + setProps({ + columns: [ + { + field: 'id', + type: 'number', + width: 200, + valueFormatter: (params) => { + return `formatted: ${params.value}`; + }, + }, + { field: 'idBis' }, + ], + } as Partial); + expect(getColumnHeaderCell(0)).to.have.class('MuiDataGrid-columnHeader--numeric'); + // should not override valueFormatter with the default numeric one + expect(getCell(0, 0).textContent).to.equal('formatted: 1'); + }); }); diff --git a/packages/grid/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx b/packages/grid/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx index cd7a929be7f9..41abb81c0e7a 100644 --- a/packages/grid/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx +++ b/packages/grid/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx @@ -7,14 +7,15 @@ import { DataGridProps, GridFilterModel, GridLogicOperator, - GridToolbarQuickFilter, + GridToolbar, + getGridStringQuickFilterFn, } from '@mui/x-data-grid'; -import { getColumnValues } from 'test/utils/helperFn'; +import { getColumnValues, sleep } from 'test/utils/helperFn'; const isJSDOM = /jsdom/.test(window.navigator.userAgent); describe(' - Quick Filter', () => { - const { render, clock } = createRenderer({ clock: 'fake' }); + const { render, clock } = createRenderer(); const baselineProps = { autoHeight: isJSDOM, @@ -39,12 +40,28 @@ describe(' - Quick Filter', () => { function TestCase(props: Partial) { return (
- +
); } describe('component', () => { + clock.withFakeTimers(); + it('should apply filter', () => { render(); @@ -57,16 +74,18 @@ describe(' - Quick Filter', () => { expect(getColumnValues(0)).to.deep.equal(['Adidas', 'Puma']); }); - it('should allows to customize input splitting', () => { + it('should allow to customize input splitting', () => { const onFilterModelChange = spy(); render( - searchInput.split(',').map((value) => value.trim()), + quickFilterProps: { + quickFilterParser: (searchInput: string) => + searchInput.split(',').map((value) => value.trim()), + }, }, }} />, @@ -122,9 +141,11 @@ describe(' - Quick Filter', () => { it('should allow to customize input formatting', () => { const { setProps } = render( quickFilterValues.join(', '), + quickFilterProps: { + quickFilterFormatter: (quickFilterValues: string[]) => quickFilterValues.join(', '), + }, }, }} />, @@ -142,6 +163,8 @@ describe(' - Quick Filter', () => { }); describe('quick filter logic', () => { + clock.withFakeTimers(); + it('should return rows that match all values by default', () => { render(); @@ -179,9 +202,181 @@ describe(' - Quick Filter', () => { clock.runToLast(); expect(getColumnValues(0)).to.deep.equal(['Nike', 'Adidas']); }); + + it('should search hidden columns when quickFilterExcludeHiddenColumns=false', () => { + render( + , + ); + + fireEvent.change(screen.getByRole('searchbox'), { target: { value: '1' } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal(['Adidas']); + + fireEvent.change(screen.getByRole('searchbox'), { target: { value: '2' } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal(['Puma']); + }); + + it('should ignore hidden columns when quickFilterExcludeHiddenColumns=true', () => { + render( + , + ); + + fireEvent.change(screen.getByRole('searchbox'), { target: { value: '1' } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal([]); + + fireEvent.change(screen.getByRole('searchbox'), { target: { value: '2' } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal([]); + }); + + it('should apply filters on quickFilterExcludeHiddenColumns value change', () => { + const { setProps } = render( + , + ); + + expect(getColumnValues(0)).to.deep.equal(['1']); + + setProps({ + filterModel: { + items: [], + quickFilterValues: ['adid'], + quickFilterExcludeHiddenColumns: true, + }, + }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal([]); + }); + + it('should apply filters on column visibility change when quickFilterExcludeHiddenColumns=true', () => { + const getApplyQuickFilterFnV7Spy = spy(getGridStringQuickFilterFn); + const { setProps } = render( + , + ); + + expect(getColumnValues(0)).to.deep.equal(['1']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(2); + + setProps({ columnVisibilityModel: { brand: false } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal([]); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(3); + + setProps({ columnVisibilityModel: { brand: true } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal(['1']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(4); + }); + + it('should not apply filters on column visibility change when quickFilterExcludeHiddenColumns=true but no quick filter values', () => { + const getApplyQuickFilterFnV7Spy = spy(getGridStringQuickFilterFn); + const { setProps } = render( + , + ); + + expect(getColumnValues(0)).to.deep.equal(['0', '1', '2']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(0); + + setProps({ columnVisibilityModel: { brand: false } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal(['0', '1', '2']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(0); + + setProps({ columnVisibilityModel: { brand: true } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal(['0', '1', '2']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(0); + }); + + it('should not apply filters on column visibility change when quickFilterExcludeHiddenColumns=false', () => { + const getApplyQuickFilterFnV7Spy = spy(getGridStringQuickFilterFn); + const { setProps } = render( + , + ); + + expect(getColumnValues(0)).to.deep.equal(['1']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(2); + + setProps({ columnVisibilityModel: { brand: false } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal(['1']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(2); + + setProps({ columnVisibilityModel: { brand: true } }); + clock.runToLast(); + expect(getColumnValues(0)).to.deep.equal(['1']); + expect(getApplyQuickFilterFnV7Spy.callCount).to.equal(2); + }); }); describe('column type: string', () => { + clock.withFakeTimers(); + const getRows = ({ quickFilterValues }: Pick) => { const { unmount } = render( - Quick Filter', () => { }); describe('column type: number', () => { + clock.withFakeTimers(); + const getRows = ({ quickFilterValues }: Pick) => { const { unmount } = render( - Quick Filter', () => { }); describe('column type: singleSelect', () => { + clock.withFakeTimers(); + const getRows = ({ quickFilterValues }: Pick) => { const { unmount } = render( - Quick Filter', () => { expect(getRows({ quickFilterValues: [''] }).year).to.deep.equal(ALL_ROWS_YEAR); }); }); + + // See https://github.com/mui/mui-x/issues/6783 + it('should not override user input when typing', async function test() { + if (isJSDOM) { + this.skip(); + } + // Warning: this test doesn't fail consistently as it is timing-sensitive. + const debounceMs = 50; + + render( + , + ); + + const searchBox = screen.getByRole('searchbox'); + let searchBoxValue = searchBox.value; + + expect(searchBox.value).to.equal(''); + + fireEvent.change(searchBox, { target: { value: `${searchBoxValue}a` } }); + await sleep(debounceMs - 2); + searchBoxValue = searchBox.value; + + fireEvent.change(searchBox, { target: { value: `${searchBoxValue}b` } }); + await sleep(10); + searchBoxValue = searchBox.value; + + fireEvent.change(searchBox, { target: { value: `${searchBoxValue}c` } }); + await sleep(debounceMs * 2); + expect(searchBox.value).to.equal('abc'); + }); }); diff --git a/packages/x-charts/package.json b/packages/x-charts/package.json index 9606ed277dcf..ebb16d35e851 100644 --- a/packages/x-charts/package.json +++ b/packages/x-charts/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-charts", - "version": "6.0.0-alpha.2", + "version": "6.0.0-alpha.3", "description": "The community edition of the charts components (MUI X).", "author": "MUI Team", "main": "./src/index.js", diff --git a/packages/x-charts/src/BarChart/BarChart.tsx b/packages/x-charts/src/BarChart/BarChart.tsx index 7cd95d0dc148..04db2ba4ec9e 100644 --- a/packages/x-charts/src/BarChart/BarChart.tsx +++ b/packages/x-charts/src/BarChart/BarChart.tsx @@ -24,7 +24,7 @@ export interface BarChartProps legend?: ChartsLegendProps; } -function BarChart(props: BarChartProps) { +const BarChart = React.forwardRef(function BarChart(props: BarChartProps, ref) { const { xAxis, yAxis, @@ -49,6 +49,7 @@ function BarChart(props: BarChartProps) { return ( ({ type: 'bar', ...s }))} width={width} height={height} @@ -88,7 +89,7 @@ function BarChart(props: BarChartProps) { {children} ); -} +}); BarChart.propTypes = { // ----------------------------- Warning -------------------------------- diff --git a/packages/x-charts/src/BarChart/BarPlot.tsx b/packages/x-charts/src/BarChart/BarPlot.tsx index 9a8392be7575..f9fd83148edf 100644 --- a/packages/x-charts/src/BarChart/BarPlot.tsx +++ b/packages/x-charts/src/BarChart/BarPlot.tsx @@ -1,9 +1,40 @@ import * as React from 'react'; import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; -import { isBandScale } from '../hooks/useScale'; import { BarElement } from './BarElement'; +import { isBandScaleConfig } from '../models/axis'; +/** + * Solution of the equations + * W = barWidth * N + offset * (N-1) + * offset / (offset + barWidth) = r + * @param bandWidth The width available to place bars. + * @param numberOfGroups The number of bars to place in that space. + * @param gapRatio The ratio of the gap between bars over the bar width. + * @returns The bar width and the offset between bars. + */ +function getBandSize({ + bandWidth: W, + numberOfGroups: N, + gapRatio: r, +}: { + bandWidth: number; + numberOfGroups: number; + gapRatio: number; +}) { + if (r === 0) { + return { + barWidth: W / N, + offset: 0, + }; + } + const barWidth = W / (N + (N - 1) * r); + const offset = r * barWidth; + return { + barWidth, + offset, + }; +} export function BarPlot() { const seriesData = React.useContext(SeriesContext).bar; const axisData = React.useContext(CartesianContext); @@ -23,12 +54,11 @@ export function BarPlot() { const xAxisKey = series[seriesId].xAxisKey ?? defaultXAxisId; const yAxisKey = series[seriesId].yAxisKey ?? defaultYAxisId; - const xScale = xAxis[xAxisKey].scale; - const yScale = yAxis[yAxisKey].scale; - - if (!isBandScale(xScale)) { + const xAxisConfig = xAxis[xAxisKey]; + const yAxisConfig = yAxis[yAxisKey]; + if (!isBandScaleConfig(xAxisConfig)) { throw new Error( - `Axis with id "${xAxisKey}" shoud be of type "band" to display the bar series ${stackingGroups}`, + `Axis with id "${xAxisKey}" shoud be of type "band" to display the bar series of id "${seriesId}"`, ); } @@ -36,10 +66,17 @@ export function BarPlot() { throw new Error(`Axis with id "${xAxisKey}" shoud have data property`); } + const xScale = xAxisConfig.scale; + const yScale = yAxisConfig.scale; + // Currently assuming all bars are vertical const bandWidth = xScale.bandwidth(); - const barWidth = (0.9 * bandWidth) / stackingGroups.length; - const offset = 0.05 * bandWidth; + + const { barWidth, offset } = getBandSize({ + bandWidth, + numberOfGroups: stackingGroups.length, + gapRatio: xAxisConfig.barGapRatio, + }); // @ts-ignore TODO: fix when adding a correct API for customisation const { stackedData, color } = series[seriesId]; @@ -52,7 +89,7 @@ export function BarPlot() { key={`${seriesId}-${dataIndex}`} id={seriesId} dataIndex={dataIndex} - x={xScale(xAxis[xAxisKey].data?.[dataIndex])! + groupIndex * barWidth + offset} + x={xScale(xAxis[xAxisKey].data?.[dataIndex])! + groupIndex * (barWidth + offset)} y={yScale(value)} height={yScale(baseline) - yScale(value)} width={barWidth} diff --git a/packages/x-charts/src/ChartContainer/index.tsx b/packages/x-charts/src/ChartContainer/index.tsx index dbb49d267666..f60fc476e90c 100644 --- a/packages/x-charts/src/ChartContainer/index.tsx +++ b/packages/x-charts/src/ChartContainer/index.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import useForkRef from '@mui/utils/useForkRef'; import { DrawingProvider, DrawingProviderProps } from '../context/DrawingProvider'; import { SeriesContextProvider, @@ -22,7 +23,10 @@ export type ChartContainerProps = Omit< children?: React.ReactNode; }; -export function ChartContainer(props: ChartContainerProps) { +export const ChartContainer = React.forwardRef(function ChartContainer( + props: ChartContainerProps, + ref, +) { const { width, height, @@ -37,10 +41,11 @@ export function ChartContainer(props: ChartContainerProps) { disableAxisListener, children, } = props; - const ref = React.useRef(null); + const svgRef = React.useRef(null); + const handleRef = useForkRef(ref, svgRef); return ( - + @@ -48,7 +53,7 @@ export function ChartContainer(props: ChartContainerProps) { ); -} +}); diff --git a/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx b/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx index ed52c7a51b54..dae3135bc807 100644 --- a/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx +++ b/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx @@ -2,7 +2,8 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import { InteractionContext } from '../context/InteractionProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; -import { getValueToPositionMapper, isBandScale } from '../hooks/useScale'; +import { getValueToPositionMapper } from '../hooks/useScale'; +import { isBandScale } from '../internals/isBandScale'; export type ChartsAxisHighlightProps = { x?: 'none' | 'line' | 'band'; @@ -26,11 +27,11 @@ function ChartsAxisHighlight(props: ChartsAxisHighlightProps) { {xAxisHighlight === 'band' && axis.x !== null && isBandScale(xScale) && ( ({ type: 'line', ...s }))} width={width} height={height} @@ -91,7 +92,7 @@ function LineChart(props: LineChartProps) { {children} ); -} +}); LineChart.propTypes = { // ----------------------------- Warning -------------------------------- diff --git a/packages/x-charts/src/ResponsiveChartContainer/index.tsx b/packages/x-charts/src/ResponsiveChartContainer/index.tsx index 972872707324..5651e0da075f 100644 --- a/packages/x-charts/src/ResponsiveChartContainer/index.tsx +++ b/packages/x-charts/src/ResponsiveChartContainer/index.tsx @@ -111,16 +111,16 @@ const ResizableContainer = styled('div', { }, })); -export function ResponsiveChartContainer(props: ResponsiveChartContainerProps) { - const { width: propsWidth, height: propsHeight, ...other } = props; - const [containerRef, width, height] = useChartDimensions(propsWidth, propsHeight); +export const ResponsiveChartContainer = React.forwardRef(function ResponsiveChartContainer( + props: ResponsiveChartContainerProps, + ref, +) { + const { width: inWidth, height: inHeight, ...other } = props; + const [containerRef, width, height] = useChartDimensions(inWidth, inHeight); return ( - - + + ); -} +}); diff --git a/packages/x-charts/src/ScatterChart/Scatter.tsx b/packages/x-charts/src/ScatterChart/Scatter.tsx index b9258eff3380..6c5abc13b84d 100644 --- a/packages/x-charts/src/ScatterChart/Scatter.tsx +++ b/packages/x-charts/src/ScatterChart/Scatter.tsx @@ -1,13 +1,14 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import { DefaultizedScatterSeriesType } from '../models/seriesType/scatter'; -import { D3Scale, getValueToPositionMapper } from '../hooks/useScale'; +import { getValueToPositionMapper } from '../hooks/useScale'; import { getIsFaded, getIsHighlighted, useInteractionItemProps, } from '../hooks/useInteractionItemProps'; import { InteractionContext } from '../context/InteractionProvider'; +import { D3Scale } from '../models/axis'; export interface ScatterProps { series: DefaultizedScatterSeriesType; diff --git a/packages/x-charts/src/ScatterChart/ScatterChart.tsx b/packages/x-charts/src/ScatterChart/ScatterChart.tsx index d39ebcb6d075..7f680fdfe16b 100644 --- a/packages/x-charts/src/ScatterChart/ScatterChart.tsx +++ b/packages/x-charts/src/ScatterChart/ScatterChart.tsx @@ -21,7 +21,7 @@ export interface ScatterChartProps legend?: ChartsLegendProps; } -function ScatterChart(props: ScatterChartProps) { +const ScatterChart = React.forwardRef(function ScatterChart(props: ScatterChartProps, ref) { const { xAxis, yAxis, @@ -43,6 +43,7 @@ function ScatterChart(props: ScatterChartProps) { return ( ({ type: 'scatter', ...s }))} width={width} height={height} @@ -65,7 +66,7 @@ function ScatterChart(props: ScatterChartProps) { {children} ); -} +}); ScatterChart.propTypes = { // ----------------------------- Warning -------------------------------- diff --git a/packages/x-charts/src/context/CartesianContextProvider.tsx b/packages/x-charts/src/context/CartesianContextProvider.tsx index 68f1e85758cb..aa208f961ccf 100644 --- a/packages/x-charts/src/context/CartesianContextProvider.tsx +++ b/packages/x-charts/src/context/CartesianContextProvider.tsx @@ -13,8 +13,8 @@ import { getExtremumX as getLineExtremumX, getExtremumY as getLineExtremumY, } from '../LineChart/extremums'; -import { getScale } from '../hooks/useScale'; -import { AxisConfig, AxisDefaultized, ScaleName } from '../models/axis'; +import { AxisConfig, AxisDefaultized, isBandScaleConfig, isPointScaleConfig } from '../models/axis'; +import { getScale } from '../internals/getScale'; import { DrawingContext } from './DrawingProvider'; import { SeriesContext } from './SeriesContextProvider'; import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants'; @@ -33,6 +33,8 @@ export type CartesianContextProviderProps = { children: React.ReactNode; }; +const DEFAULT_CATEGORY_GAP_RATIO = 0.1; + // TODO: those might be better placed in a distinct file const xExtremumGetters: { [T in CartesianChartSeriesType]: ExtremumGetter } = { bar: getBarExtremumX, @@ -125,27 +127,34 @@ function CartesianContextProvider({ xAxis, yAxis, children }: CartesianContextPr const isDefaultAxis = axisIndex === 0; const [minData, maxData] = getAxisExtremum(axis, xExtremumGetters, isDefaultAxis); - const scaleType = axis.scaleType ?? 'linear'; const range = [drawingArea.left, drawingArea.left + drawingArea.width]; - if (scaleType === 'band') { + if (isBandScaleConfig(axis)) { + const categoryGapRatio = axis.categoryGapRatio ?? DEFAULT_CATEGORY_GAP_RATIO; completedXAxis[axis.id] = { + categoryGapRatio, + barGapRatio: 0, ...axis, - scaleType, - scale: scaleBand(axis.data!, range), + scale: scaleBand(axis.data!, range) + .paddingInner(categoryGapRatio) + .paddingOuter(categoryGapRatio / 2), ticksNumber: axis.data!.length, }; - return; } - if (scaleType === 'point') { + if (isPointScaleConfig(axis)) { completedXAxis[axis.id] = { ...axis, - scaleType, scale: scalePoint(axis.data!, range), ticksNumber: axis.data!.length, }; + } + if (axis.scaleType === 'band' || axis.scaleType === 'point') { + // Could be merged with the two previous "if conditions" but then TS does not get that `axis.scaleType` can't be `band` or `point`. return; } + + const scaleType = axis.scaleType ?? 'linear'; + const extremums = [axis.min ?? minData, axis.max ?? maxData]; const ticksNumber = getTicksNumber({ ...axis, range }); @@ -174,25 +183,33 @@ function CartesianContextProvider({ xAxis, yAxis, children }: CartesianContextPr const [minData, maxData] = getAxisExtremum(axis, yExtremumGetters, isDefaultAxis); const range = [drawingArea.top + drawingArea.height, drawingArea.top]; - const scaleType: ScaleName = axis.scaleType ?? 'linear'; - if (scaleType === 'band') { - completedYAxis[axis.id] = { + if (isBandScaleConfig(axis)) { + const categoryGapRatio = axis.categoryGapRatio ?? DEFAULT_CATEGORY_GAP_RATIO; + + completedXAxis[axis.id] = { + categoryGapRatio, + barGapRatio: 0, ...axis, - scaleType, - scale: scaleBand(axis.data!, range), + scale: scaleBand(axis.data!, range) + .paddingInner(categoryGapRatio) + .paddingOuter(categoryGapRatio / 2), ticksNumber: axis.data!.length, }; - return; } - if (scaleType === 'point') { - completedYAxis[axis.id] = { + if (isPointScaleConfig(axis)) { + completedXAxis[axis.id] = { ...axis, - scaleType, scale: scalePoint(axis.data!, range), ticksNumber: axis.data!.length, }; + } + if (axis.scaleType === 'band' || axis.scaleType === 'point') { + // Could be merged with the two previous "if conditions" but then TS does not get that `axis.scaleType` can't be `band` or `point`. return; } + + const scaleType = axis.scaleType ?? 'linear'; + const extremums = [axis.min ?? minData, axis.max ?? maxData]; const ticksNumber = getTicksNumber({ ...axis, range }); diff --git a/packages/x-charts/src/context/SeriesContextProvider.tsx b/packages/x-charts/src/context/SeriesContextProvider.tsx index 02dd2e3ae421..efa27159bc07 100644 --- a/packages/x-charts/src/context/SeriesContextProvider.tsx +++ b/packages/x-charts/src/context/SeriesContextProvider.tsx @@ -29,8 +29,8 @@ const seriesTypeFormatter: { [type in ChartSeriesType]?: (series: any) => any } pie: pieSeriesFormatter, }; /** - * This methods is the interface between what the developper is providing and what compoenents receives - * To simplify the components behaviors, it groups series by type, such that LinePlots props are not updated if soe line data are modified + * This methods is the interface between what the developer is providing and what components receives + * To simplify the components behaviors, it groups series by type, such that LinePlots props are not updated if some line data are modified * It also add defaultized values such as the ids, colors * @param series The array of series provided by devs * @param colors The color palette used to defaultize series colors diff --git a/packages/x-charts/src/hooks/index.ts b/packages/x-charts/src/hooks/index.ts new file mode 100644 index 000000000000..36309a114c3b --- /dev/null +++ b/packages/x-charts/src/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './useDrawingArea'; +export * from './useScale'; diff --git a/packages/x-charts/src/hooks/useAxisEvents.ts b/packages/x-charts/src/hooks/useAxisEvents.ts index 8f8b8808daf5..908fe58c7e83 100644 --- a/packages/x-charts/src/hooks/useAxisEvents.ts +++ b/packages/x-charts/src/hooks/useAxisEvents.ts @@ -2,7 +2,7 @@ import * as React from 'react'; import { InteractionContext } from '../context/InteractionProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; import { SVGContext, DrawingContext } from '../context/DrawingProvider'; -import { isBandScale } from './useScale'; +import { isBandScale } from '../internals/isBandScale'; export const useAxisEvents = (disableAxisListener: boolean) => { const svgRef = React.useContext(SVGContext); @@ -98,18 +98,25 @@ export const useAxisEvents = (disableAxisListener: boolean) => { }; const handleMouseMove = (event: MouseEvent) => { + // Get mouse coordinate in global SVG space + const pt = svgRef.current!.createSVGPoint(); + pt.x = event.clientX; + pt.y = event.clientY; + const svgPt = pt.matrixTransform(svgRef.current!.getScreenCTM()!.inverse()); + mousePosition.current = { - x: event.offsetX, - y: event.offsetY, + x: svgPt.x, + y: svgPt.y, }; - const outsideX = event.offsetX < left || event.offsetX > left + width; - const outsideY = event.offsetY < top || event.offsetY > top + height; + + const outsideX = svgPt.x < left || svgPt.x > left + width; + const outsideY = svgPt.y < top || svgPt.y > top + height; if (outsideX || outsideY) { dispatch({ type: 'updateAxis', data: { x: null, y: null } }); return; } - const newStateX = getUpdateX(event.offsetX); - const newStateY = getUpdateY(event.offsetY); + const newStateX = getUpdateX(svgPt.x); + const newStateY = getUpdateY(svgPt.y); dispatch({ type: 'updateAxis', data: { x: newStateX, y: newStateY } }); }; diff --git a/packages/x-charts/src/hooks/useDrawingArea.ts b/packages/x-charts/src/hooks/useDrawingArea.ts new file mode 100644 index 000000000000..100db73ba227 --- /dev/null +++ b/packages/x-charts/src/hooks/useDrawingArea.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; +import { DrawingContext } from '../context/DrawingProvider'; + +export function useDrawingArea() { + const { left, top, width, height } = React.useContext(DrawingContext); + return React.useMemo(() => ({ left, top, width, height }), [height, left, top, width]); +} diff --git a/packages/x-charts/src/hooks/useScale.ts b/packages/x-charts/src/hooks/useScale.ts index 7905af820b67..c891a82d0af1 100644 --- a/packages/x-charts/src/hooks/useScale.ts +++ b/packages/x-charts/src/hooks/useScale.ts @@ -1,52 +1,7 @@ -import { scaleLog, scalePow, scaleSqrt, scaleTime, scaleUtc, scaleLinear } from 'd3-scale'; -import type { - ScaleBand, - ScaleLogarithmic, - ScalePoint, - ScalePower, - ScaleTime, - ScaleLinear, -} from 'd3-scale'; -import { ContinuouseScaleName } from '../models/axis'; - -export type D3Scale = - | ScaleBand - | ScaleLogarithmic - | ScalePoint - | ScalePower - | ScaleTime - | ScaleLinear; - -export type D3ContinuouseScale = - | ScaleLogarithmic - | ScalePower - | ScaleTime - | ScaleLinear; - -export function getScale( - scaleType: ContinuouseScaleName, - domain: any[], - range: any[], -): D3ContinuouseScale { - switch (scaleType) { - case 'log': - return scaleLog(domain, range); - case 'pow': - return scalePow(domain, range); - case 'sqrt': - return scaleSqrt(domain, range); - case 'time': - return scaleTime(domain, range); - case 'utc': - return scaleUtc(domain, range); - default: - return scaleLinear(domain, range); - } -} - -export function isBandScale(scale: D3Scale): scale is ScaleBand | ScalePoint { - return (scale as ScaleBand | ScalePoint).bandwidth !== undefined; -} +import * as React from 'react'; +import { CartesianContext } from '../context/CartesianContextProvider'; +import { isBandScale } from '../internals/isBandScale'; +import { D3Scale } from '../models/axis'; /** * For a given scale return a function that map value to their position. @@ -60,3 +15,19 @@ export function getValueToPositionMapper(scale: D3Scale) { } return (value: any) => scale(value) as number; } + +export function useXScale(identifier?: number | string) { + const { xAxis, xAxisIds } = React.useContext(CartesianContext); + + const id = typeof identifier === 'string' ? identifier : xAxisIds[identifier ?? 0]; + + return xAxis[id].scale; +} + +export function useYScale(identifier?: number | string) { + const { yAxis, yAxisIds } = React.useContext(CartesianContext); + + const id = typeof identifier === 'string' ? identifier : yAxisIds[identifier ?? 0]; + + return yAxis[id].scale; +} diff --git a/packages/x-charts/src/hooks/useTicks.ts b/packages/x-charts/src/hooks/useTicks.ts index 4ccb0ee59225..d5da6cc3172a 100644 --- a/packages/x-charts/src/hooks/useTicks.ts +++ b/packages/x-charts/src/hooks/useTicks.ts @@ -1,5 +1,6 @@ import * as React from 'react'; -import { D3Scale, isBandScale } from './useScale'; +import { D3Scale } from '../models/axis'; +import { isBandScale } from '../internals/isBandScale'; export type TickParams = { maxTicks?: number; @@ -29,22 +30,33 @@ function useTicks(options: { // band scale if (isBandScale(scale)) { const domain = scale.domain(); - return [ - ...domain.map((value) => ({ - formattedValue: valueFormatter?.(value) ?? value, - offset: scale(value) ?? 0, - labelOffset: scale.bandwidth() / 2, - })), - ...(scale.bandwidth() > 0 - ? [ - { - formattedValue: undefined, - offset: scale.range()[1], - labelOffset: 0, - }, - ] - : []), - ]; + + if (scale.bandwidth() > 0) { + // scale type = 'band' + return [ + ...domain.map((value, index) => ({ + formattedValue: valueFormatter?.(value) ?? value, + offset: + index === 0 + ? scale.range()[0] + : scale(value)! - (scale.step() - scale.bandwidth()) / 2, + labelOffset: scale.step() / 2, + })), + + { + formattedValue: undefined, + offset: scale.range()[1], + labelOffset: 0, + }, + ]; + } + + // scale type = 'point' + return domain.map((value) => ({ + formattedValue: valueFormatter?.(value) ?? value, + offset: scale(value)!, + labelOffset: 0, + })); } return scale.ticks(ticksNumber).map((value: any) => ({ diff --git a/packages/x-charts/src/index.ts b/packages/x-charts/src/index.ts index c828a1d2aaa5..fb39bcefc397 100644 --- a/packages/x-charts/src/index.ts +++ b/packages/x-charts/src/index.ts @@ -1,5 +1,6 @@ export * from './constants'; export * from './context'; +export * from './hooks'; export * from './colorPalettes'; export * from './models'; export * from './ChartsClipPath'; diff --git a/packages/x-charts/src/internals/getScale.ts b/packages/x-charts/src/internals/getScale.ts new file mode 100644 index 000000000000..16f9073e0233 --- /dev/null +++ b/packages/x-charts/src/internals/getScale.ts @@ -0,0 +1,23 @@ +import { scaleLog, scalePow, scaleSqrt, scaleTime, scaleUtc, scaleLinear } from 'd3-scale'; +import { ContinuouseScaleName, D3ContinuouseScale } from '../models/axis'; + +export function getScale( + scaleType: ContinuouseScaleName, + domain: any[], + range: any[], +): D3ContinuouseScale { + switch (scaleType) { + case 'log': + return scaleLog(domain, range); + case 'pow': + return scalePow(domain, range); + case 'sqrt': + return scaleSqrt(domain, range); + case 'time': + return scaleTime(domain, range); + case 'utc': + return scaleUtc(domain, range); + default: + return scaleLinear(domain, range); + } +} diff --git a/packages/x-charts/src/internals/isBandScale.ts b/packages/x-charts/src/internals/isBandScale.ts new file mode 100644 index 000000000000..3a828d8b9ecc --- /dev/null +++ b/packages/x-charts/src/internals/isBandScale.ts @@ -0,0 +1,6 @@ +import type { ScaleBand, ScalePoint } from 'd3-scale'; +import { D3Scale } from '../models/axis'; + +export function isBandScale(scale: D3Scale): scale is ScaleBand | ScalePoint { + return (scale as ScaleBand | ScalePoint).bandwidth !== undefined; +} diff --git a/packages/x-charts/src/models/axis.ts b/packages/x-charts/src/models/axis.ts index 8483b0106815..67534727df4d 100644 --- a/packages/x-charts/src/models/axis.ts +++ b/packages/x-charts/src/models/axis.ts @@ -9,6 +9,20 @@ import type { import { ChartsAxisClasses } from '../ChartsAxis/axisClasses'; import type { TickParams } from '../hooks/useTicks'; +export type D3Scale = + | ScaleBand + | ScaleLogarithmic + | ScalePoint + | ScalePower + | ScaleTime + | ScaleLinear; + +export type D3ContinuouseScale = + | ScaleLogarithmic + | ScalePower + | ScaleTime + | ScaleLinear; + export interface ChartsAxisProps { /** * Id of the axis to render. @@ -80,57 +94,75 @@ interface AxisScaleConfig { band: { scaleType: 'band'; scale: ScaleBand; - ticksNumber: number; + /** + * The ratio between the space allocated for padding between two categories and the category width. + * 0 means no gap, and 1 no data. + * @default 0.1 + */ + categoryGapRatio: number; + /** + * The ratio between the width of a bar, and the gap between two bars. + * 0 means no gap, and 1 no bar. + * @default 0 + */ + barGapRatio: number; }; point: { scaleType: 'point'; scale: ScalePoint; - ticksNumber: number; }; log: { scaleType: 'log'; scale: ScaleLogarithmic; - ticksNumber: number; }; pow: { scaleType: 'pow'; scale: ScalePower; - ticksNumber: number; }; sqrt: { scaleType: 'sqrt'; scale: ScalePower; - ticksNumber: number; }; time: { scaleType: 'time'; scale: ScaleTime; - ticksNumber: number; }; utc: { scaleType: 'utc'; scale: ScaleTime; - ticksNumber: number; }; linear: { scaleType: 'linear'; scale: ScaleLinear; - ticksNumber: number; }; } -export type AxisConfig = { +export type AxisConfig = { id: string; - scaleType?: S; min?: number; max?: number; data?: V[]; valueFormatter?: (value: V) => string; } & Partial & + Partial> & TickParams; export type AxisDefaultized = Omit< AxisConfig, 'scaleType' > & - AxisScaleConfig[S]; + AxisScaleConfig[S] & { + ticksNumber: number; + }; + +export function isBandScaleConfig( + scaleConfig: AxisConfig, +): scaleConfig is AxisConfig<'band'> & { scaleType: 'band' } { + return scaleConfig.scaleType === 'band'; +} + +export function isPointScaleConfig( + scaleConfig: AxisConfig, +): scaleConfig is AxisConfig<'point'> & { scaleType: 'point' } { + return scaleConfig.scaleType === 'point'; +} diff --git a/packages/x-charts/src/models/seriesType/pie.ts b/packages/x-charts/src/models/seriesType/pie.ts index f9dc6ebfc916..cf1f4fc87c19 100644 --- a/packages/x-charts/src/models/seriesType/pie.ts +++ b/packages/x-charts/src/models/seriesType/pie.ts @@ -67,7 +67,7 @@ export interface PieSeriesType extends CommonSeriesType extends CommonSeriesType styles.root, })<{ ownerState: DateRangePickerToolbarProps; -}>({ - [`& .${pickersToolbarClasses.penIconButton}`]: { - position: 'relative', - top: 4, - }, -}); +}>({}); const DateRangePickerToolbarContainer = styled('div', { name: 'MuiDateRangePickerToolbar', diff --git a/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx b/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx index b5618737f06f..cf7ba5a450a2 100644 --- a/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx +++ b/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx @@ -5,7 +5,7 @@ import { useLicenseVerifier } from '@mui/x-license-pro'; import { alpha, styled, useThemeProps } from '@mui/material/styles'; import { unstable_composeClasses as composeClasses } from '@mui/utils'; import { useUtils } from '@mui/x-date-pickers/internals'; -import { PickersDay, pickersDayClasses, PickersDayProps } from '@mui/x-date-pickers/PickersDay'; +import { PickersDay, PickersDayProps } from '@mui/x-date-pickers/PickersDay'; import { DateRangePickerDayClasses, getDateRangePickerDayUtilityClass, @@ -253,13 +253,6 @@ const DateRangePickerDayDay = styled(PickersDay, { '& > *': { transform: 'scale(0.9)', }, - ...(!ownerState.selected && - ownerState.isHighlighting && { - opacity: 0.7, - [`&.${pickersDayClasses.dayOutsideMonth}`]: { - opacity: 0.4, - }, - }), ...(ownerState.draggable && { cursor: 'grab', }), diff --git a/packages/x-date-pickers/package.json b/packages/x-date-pickers/package.json index e0a3d0fc877c..75718f851660 100644 --- a/packages/x-date-pickers/package.json +++ b/packages/x-date-pickers/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-date-pickers", - "version": "6.9.2", + "version": "6.10.0", "description": "The community edition of the date picker components (MUI X).", "author": "MUI Team", "main": "./src/index.js", @@ -45,7 +45,7 @@ }, "dependencies": { "@babel/runtime": "^7.22.5", - "@mui/utils": "^5.13.6", + "@mui/utils": "^5.13.7", "@types/react-transition-group": "^4.4.6", "clsx": "^1.2.1", "prop-types": "^15.8.1", diff --git a/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts b/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts index 0f6f73c6ba70..0607b28b43dd 100644 --- a/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts +++ b/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts @@ -23,7 +23,7 @@ type Constructor = (...args: Parameters) => Dayjs; const localeNotFoundWarning = buildWarning([ 'Your locale has not been found.', 'Either the locale key is not a supported one. Locales supported by dayjs are available here: https://github.com/iamkun/dayjs/tree/dev/src/locale', - "Or you forget to import the locale with `require('dayjs/locale/{localeUsed}')`", + "Or you forget to import the locale from 'dayjs/locale/{localeUsed}'", 'fallback on English locale', ]); diff --git a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx index 83bfd879d007..a664cc73845b 100644 --- a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx +++ b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx @@ -4,7 +4,6 @@ import { styled, useThemeProps, useTheme, Theme } from '@mui/material/styles'; import { unstable_composeClasses as composeClasses } from '@mui/utils'; import { PickersToolbarText } from '../internals/components/PickersToolbarText'; import { PickersToolbar } from '../internals/components/PickersToolbar'; -import { pickersToolbarClasses } from '../internals/components/pickersToolbarClasses'; import { PickersToolbarButton } from '../internals/components/PickersToolbarButton'; import { useLocaleText, useUtils } from '../internals/hooks/useUtils'; import { BaseToolbarProps, ExportedBaseToolbarProps } from '../internals/models/props/toolbar'; @@ -64,11 +63,6 @@ const DateTimePickerToolbarRoot = styled(PickersToolbar, { : undefined, justifyContent: 'space-around', position: 'relative', - [`& .${pickersToolbarClasses.penIconButton}`]: { - position: 'absolute', - top: 8, - ...(theme.direction === 'rtl' ? { left: 8 } : { right: 8 }), - }, })); DateTimePickerToolbarRoot.propTypes = { diff --git a/packages/x-date-pickers/src/PickersDay/PickersDay.tsx b/packages/x-date-pickers/src/PickersDay/PickersDay.tsx index 1b5000c5fece..2e38a37992ae 100644 --- a/packages/x-date-pickers/src/PickersDay/PickersDay.tsx +++ b/packages/x-date-pickers/src/PickersDay/PickersDay.tsx @@ -109,15 +109,16 @@ const useUtilityClasses = (ownerState: PickersDayProps) => { classes, } = ownerState; + const isHiddenDaySpacingFiller = outsideCurrentMonth && !showDaysOutsideCurrentMonth; const slots = { root: [ 'root', - selected && 'selected', + selected && !isHiddenDaySpacingFiller && 'selected', disabled && 'disabled', !disableMargin && 'dayWithMargin', !disableHighlightToday && today && 'today', outsideCurrentMonth && showDaysOutsideCurrentMonth && 'dayOutsideMonth', - outsideCurrentMonth && !showDaysOutsideCurrentMonth && 'hiddenDaySpacingFiller', + isHiddenDaySpacingFiller && 'hiddenDaySpacingFiller', ], hiddenDaySpacingFiller: ['hiddenDaySpacingFiller'], }; diff --git a/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx b/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx index 0c1bc44bbfa1..61e9eafa0bf5 100644 --- a/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx +++ b/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx @@ -5,7 +5,6 @@ import { unstable_composeClasses as composeClasses } from '@mui/utils'; import { PickersToolbarText } from '../internals/components/PickersToolbarText'; import { PickersToolbarButton } from '../internals/components/PickersToolbarButton'; import { PickersToolbar } from '../internals/components/PickersToolbar'; -import { pickersToolbarClasses } from '../internals/components/pickersToolbarClasses'; import { arrayIncludes } from '../internals/utils/utils'; import { useLocaleText, useUtils } from '../internals/hooks/useUtils'; import { useMeridiemMode } from '../internals/hooks/date-helpers-hooks'; @@ -53,11 +52,7 @@ const TimePickerToolbarRoot = styled(PickersToolbar, { overridesResolver: (props, styles) => styles.root, })<{ ownerState: TimePickerToolbarProps; -}>({ - [`& .${pickersToolbarClasses.penIconButtonLandscape}`]: { - marginTop: 'auto', - }, -}); +}>({}); const TimePickerToolbarSeparator = styled(PickersToolbarText, { name: 'MuiTimePickerToolbar', diff --git a/packages/x-date-pickers/src/internals/components/pickersToolbarClasses.ts b/packages/x-date-pickers/src/internals/components/pickersToolbarClasses.ts index f244e40cba97..09ecae7d30ce 100644 --- a/packages/x-date-pickers/src/internals/components/pickersToolbarClasses.ts +++ b/packages/x-date-pickers/src/internals/components/pickersToolbarClasses.ts @@ -8,10 +8,6 @@ export interface PickersToolbarClasses { root: string; /** Styles applied to the content element. */ content: string; - /** Styles applied to the pen icon button element. */ - penIconButton: string; - /** Styles applied to the pen icon button element in landscape mode. */ - penIconButtonLandscape: string; } export type PickersToolbarClassKey = keyof PickersToolbarClasses; @@ -23,6 +19,4 @@ export function getPickersToolbarUtilityClass(slot: string) { export const pickersToolbarClasses = generateUtilityClasses('MuiPickersToolbar', [ 'root', 'content', - 'penIconButton', - 'penIconButtonLandscape', ]); diff --git a/packages/x-date-pickers/src/themeAugmentation/themeAugmentation.spec.ts b/packages/x-date-pickers/src/themeAugmentation/themeAugmentation.spec.ts index 6f32a6967c7f..3fe257299475 100644 --- a/packages/x-date-pickers/src/themeAugmentation/themeAugmentation.spec.ts +++ b/packages/x-date-pickers/src/themeAugmentation/themeAugmentation.spec.ts @@ -14,11 +14,7 @@ import { } from '../TimeClock'; import { datePickerToolbarClasses } from '../DatePicker'; import { dateTimePickerToolbarClasses } from '../DateTimePicker'; -import { - pickersArrowSwitcherClasses, - pickersPopperClasses, - pickersToolbarClasses, -} from '../internals'; +import { pickersArrowSwitcherClasses, pickersPopperClasses } from '../internals'; import { pickersDayClasses } from '../PickersDay'; import { timePickerToolbarClasses } from '../TimePicker'; import { pickersMonthClasses } from '../MonthCalendar'; @@ -410,9 +406,6 @@ createTheme({ styleOverrides: { root: { backgroundColor: 'red', - [`.${pickersToolbarClasses.penIconButton}`]: { - backgroundColor: 'green', - }, }, // @ts-expect-error invalid MuiPickersToolbar class key contentWrapper: { diff --git a/packages/x-license-pro/package.json b/packages/x-license-pro/package.json index 586d44fa3f5c..7c72cf72749c 100644 --- a/packages/x-license-pro/package.json +++ b/packages/x-license-pro/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-license-pro", - "version": "6.9.0", + "version": "6.10.0", "description": "MUI X License verification", "author": "MUI Team", "main": "src/index.ts", @@ -36,7 +36,7 @@ }, "dependencies": { "@babel/runtime": "^7.22.5", - "@mui/utils": "^5.13.6" + "@mui/utils": "^5.13.7" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0" diff --git a/packages/x-license-pro/src/generateLicense/generateLicense.test.ts b/packages/x-license-pro/src/generateLicense/generateLicense.test.ts index a6a81bc261e7..5a27b7880364 100644 --- a/packages/x-license-pro/src/generateLicense/generateLicense.test.ts +++ b/packages/x-license-pro/src/generateLicense/generateLicense.test.ts @@ -2,19 +2,6 @@ import { expect } from 'chai'; import { generateLicense } from './generateLicense'; describe('License: generateLicense', () => { - // TODO: Remove - it('should generate pro license properly when "scope" is not provided', () => { - expect( - generateLicense({ - expiryDate: new Date(1591723879062), - orderNumber: 'MUI-123', - licensingModel: 'subscription', - }), - ).to.equal( - 'b2b2ea9c6fd846e11770da3c795d6f63Tz1NVUktMTIzLEU9MTU5MTcyMzg3OTA2MixTPXBybyxMTT1zdWJzY3JpcHRpb24sS1Y9Mg==', - ); - }); - it('should generate pro license properly when `scope: "pro"`', () => { expect( generateLicense({ @@ -41,20 +28,7 @@ describe('License: generateLicense', () => { ); }); - // TODO: Remove - it('should generate perpetual license when "licensingModel" is not provided', () => { - expect( - generateLicense({ - expiryDate: new Date(1591723879062), - orderNumber: 'MUI-123', - scope: 'pro', - }), - ).to.equal( - 'b16edd8e6bc83293a723779a259f520cTz1NVUktMTIzLEU9MTU5MTcyMzg3OTA2MixTPXBybyxMTT1wZXJwZXR1YWwsS1Y9Mg==', - ); - }); - - it('should generate subscription license when `licensingModel: "subscription"`', () => { + it('should generate annual license when `licensingModel: "subscription"`', () => { expect( generateLicense({ expiryDate: new Date(1591723879062), diff --git a/packages/x-license-pro/src/generateLicense/generateLicense.ts b/packages/x-license-pro/src/generateLicense/generateLicense.ts index b1c4b24334b2..169bc46bcdc5 100644 --- a/packages/x-license-pro/src/generateLicense/generateLicense.ts +++ b/packages/x-license-pro/src/generateLicense/generateLicense.ts @@ -8,10 +8,8 @@ const licenseVersion = '2'; export interface LicenseDetails { orderNumber: string; expiryDate: Date; - // TODO: to be made required once the store is updated - scope?: LicenseScope; - // TODO: to be made required once the store is updated - licensingModel?: LicensingModel; + scope: LicenseScope; + licensingModel: LicensingModel; } function getClearLicenseString(details: LicenseDetails) { @@ -20,12 +18,12 @@ function getClearLicenseString(details: LicenseDetails) { } if (details.licensingModel && !LICENSING_MODELS.includes(details.licensingModel)) { - throw new Error('MUI: Invalid sales model'); + throw new Error('MUI: Invalid licensing model'); } - return `O=${details.orderNumber},E=${details.expiryDate.getTime()},S=${ - details.scope ?? 'pro' - },LM=${details.licensingModel ?? 'perpetual'},KV=${licenseVersion}`; + return `O=${details.orderNumber},E=${details.expiryDate.getTime()},S=${details.scope},LM=${ + details.licensingModel + },KV=${licenseVersion}`; } export function generateLicense(details: LicenseDetails) { diff --git a/packages/x-license-pro/src/utils/licensingModel.ts b/packages/x-license-pro/src/utils/licensingModel.ts index cf4816500b29..5ba1d0394d32 100644 --- a/packages/x-license-pro/src/utils/licensingModel.ts +++ b/packages/x-license-pro/src/utils/licensingModel.ts @@ -8,6 +8,10 @@ export const LICENSING_MODELS = [ * On development, a license is outdated if the expiry date has been reached * On production, a license is outdated if the current version of the software was released after the expiry date of the license (see "perpetual") */ + 'annual', + /** + * TODO 2025 remove, legacy name of annual. + */ 'subscription', ] as const; diff --git a/packages/x-license-pro/src/verifyLicense/verifyLicense.test.ts b/packages/x-license-pro/src/verifyLicense/verifyLicense.test.ts index af02ef924261..5ee1f500c879 100644 --- a/packages/x-license-pro/src/verifyLicense/verifyLicense.test.ts +++ b/packages/x-license-pro/src/verifyLicense/verifyLicense.test.ts @@ -37,6 +37,8 @@ describe('License: verifyLicense', () => { it('should check expired license properly', () => { const expiredLicenseKey = generateLicense({ expiryDate: new Date(releaseDate.getTime() - oneDayInMS), + scope: 'pro', + licensingModel: 'perpetual', orderNumber: 'MUI-123', }); @@ -129,6 +131,7 @@ describe('License: verifyLicense', () => { const expiredLicenseKey = generateLicense({ expiryDate: new Date(releaseDate.getTime() + oneDayInMS), orderNumber: 'MUI-123', + scope: 'pro', licensingModel: 'subscription', }); @@ -146,6 +149,7 @@ describe('License: verifyLicense', () => { const expiredLicenseKey = generateLicense({ expiryDate: new Date(releaseDate.getTime() + oneDayInMS), orderNumber: 'MUI-123', + scope: 'pro', licensingModel: 'subscription', }); @@ -163,6 +167,7 @@ describe('License: verifyLicense', () => { const expiredLicenseKey = generateLicense({ expiryDate: new Date(releaseDate.getTime() + oneDayInMS), orderNumber: 'MUI-123', + scope: 'pro', licensingModel: 'perpetual', }); @@ -189,4 +194,24 @@ describe('License: verifyLicense', () => { ).to.equal(LicenseStatus.Invalid); }); }); + + describe('key version: 2.1', () => { + const licenseKeyPro = generateLicense({ + expiryDate: new Date(releaseDate.getTime() + oneDayInMS), + orderNumber: 'MUI-123', + scope: 'pro', + licensingModel: 'annual', + }); + + it('should accept licensingModel="annual"', () => { + expect( + verifyLicense({ + releaseInfo: RELEASE_INFO, + licenseKey: licenseKeyPro, + acceptedScopes: ['pro', 'premium'], + isProduction: true, + }), + ).to.equal(LicenseStatus.Valid); + }); + }); }); diff --git a/packages/x-license-pro/src/verifyLicense/verifyLicense.ts b/packages/x-license-pro/src/verifyLicense/verifyLicense.ts index 4ca75cbc7297..064fe854afef 100644 --- a/packages/x-license-pro/src/verifyLicense/verifyLicense.ts +++ b/packages/x-license-pro/src/verifyLicense/verifyLicense.ts @@ -129,7 +129,7 @@ export function verifyLicense({ } if (license.licensingModel == null || !LICENSING_MODELS.includes(license.licensingModel)) { - console.error('Error checking license. Sales model not found or invalid!'); + console.error('Error checking license. Licensing model not found or invalid!'); return LicenseStatus.Invalid; } @@ -147,7 +147,7 @@ export function verifyLicense({ if (license.expiryTimestamp < pkgTimestamp) { return LicenseStatus.ExpiredVersion; } - } else if (license.licensingModel === 'subscription') { + } else if (license.licensingModel === 'subscription' || license.licensingModel === 'annual') { if (license.expiryTimestamp < new Date().getTime()) { return LicenseStatus.ExpiredAnnual; } diff --git a/scripts/releaseChangelog.mjs b/scripts/releaseChangelog.mjs index c72c7bb4470c..0bd488abb28e 100644 --- a/scripts/releaseChangelog.mjs +++ b/scripts/releaseChangelog.mjs @@ -131,7 +131,10 @@ async function main(argv) { // Dispatch commits in different sections const dataGridCommits = []; + const dataGridProCommits = []; + const dataGridPremiumCommits = []; const pickersCommits = []; + const pickersProCommits = []; const chartsCommits = []; const coreCommits = []; const docsCommits = []; @@ -142,20 +145,26 @@ async function main(argv) { const tag = parseTags(commitItem.commit.message); switch (tag) { case 'DataGrid': - case 'DataGridPro': - case 'DataGridPremium': case 'l10n': case '118n': dataGridCommits.push(commitItem); break; + case 'DataGridPro': + dataGridProCommits.push(commitItem); + break; + case 'DataGridPremium': + dataGridPremiumCommits.push(commitItem); + break; case 'DatePicker': case 'TimePicker': case 'DateTimePicker': - case 'DateRangePicker': case 'pickers': case 'fields': pickersCommits.push(commitItem); break; + case 'DateRangePicker': + pickersProCommits.push(commitItem); + break; case 'charts': chartsCommits.push(commitItem); break; @@ -213,19 +222,45 @@ We'd like to offer a big thanks to the ${ TODO INSERT HIGHLIGHTS ${changeLogMessages.length > 0 ? '\n\n' : ''}${changeLogMessages.join('\n')} -### \`@mui/x-data-grid@v__VERSION__\` / \`@mui/x-data-grid-pro@v__VERSION__\` / \`@mui/x-data-grid-premium@v__VERSION__\` -${logChangelogSection(dataGridCommits, '#### Changes')} -### \`@mui/x-date-pickers@v__VERSION__\` / \`@mui/x-date-pickers-pro@v__VERSION__\` -${logChangelogSection(pickersCommits, '#### Changes')} +### Data Grid + +#### \`@mui/x-data-grid@v__VERSION__\` + +${logChangelogSection(dataGridCommits)} + +#### \`@mui/x-data-grid-pro@v__VERSION__\` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link) -### \`@mui/x-charts@v__CHARTS_VERSION__\` -${logChangelogSection(chartsCommits, '#### Changes')} +Same changes as in \`@mui/x-data-grid@v__VERSION__\`${ + dataGridProCommits.length > 0 ? ', plus:' : '.' + } +${logChangelogSection(dataGridProCommits)} + +#### \`@mui/x-data-grid-premium@v__VERSION__\` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link) + +Same changes as in \`@mui/x-data-grid-pro@v__VERSION__\`${ + dataGridPremiumCommits.length > 0 ? ', plus:' : '.' + } +${logChangelogSection(dataGridPremiumCommits)} +### Date Pickers + +#### \`@mui/x-date-pickers@v__VERSION__\` + +${logChangelogSection(pickersCommits)} + +#### \`@mui/x-date-pickers-pro@v__VERSION__\` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link) + +Same changes as in \`@mui/x-date-pickers@v__VERSION__\`${ + pickersProCommits.length > 0 ? ', plus:' : '.' + } +${logChangelogSection(pickersProCommits)} + +### Charts / \`@mui/x-charts@v__CHARTS_VERSION__\` + +${logChangelogSection(chartsCommits)} ${logChangelogSection( codemodCommits, - `### \`@mui/x-codemod@v__VERSION__\` - -#### Changes`, + `### \`@mui/x-codemod@v__VERSION__\``, )} ${logChangelogSection(docsCommits, '### Docs')} ${logChangelogSection(coreCommits, '### Core')} diff --git a/scripts/x-charts.exports.json b/scripts/x-charts.exports.json index 5182098981ef..590ba04f5f44 100644 --- a/scripts/x-charts.exports.json +++ b/scripts/x-charts.exports.json @@ -8,7 +8,7 @@ { "name": "AreaElementProps", "kind": "TypeAlias" }, { "name": "AreaPlot", "kind": "Function" }, { "name": "axisClasses", "kind": "Variable" }, - { "name": "BarChart", "kind": "Function" }, + { "name": "BarChart", "kind": "Variable" }, { "name": "BarItemIdentifier", "kind": "TypeAlias" }, { "name": "BarPlot", "kind": "Function" }, { "name": "BarSeriesType", "kind": "Interface" }, @@ -17,7 +17,7 @@ { "name": "blueberryTwilightPaletteLight", "kind": "Variable" }, { "name": "CartesianContextProvider", "kind": "Function" }, { "name": "CartesianSeriesType", "kind": "TypeAlias" }, - { "name": "ChartContainer", "kind": "Function" }, + { "name": "ChartContainer", "kind": "Variable" }, { "name": "ChartContainerProps", "kind": "TypeAlias" }, { "name": "ChartsAxis", "kind": "Function" }, { "name": "ChartsAxisClasses", "kind": "Interface" }, @@ -56,9 +56,10 @@ { "name": "getMarkElementUtilityClass", "kind": "Function" }, { "name": "getPieArcLabelUtilityClass", "kind": "Function" }, { "name": "getPieArcUtilityClass", "kind": "Function" }, + { "name": "getValueToPositionMapper", "kind": "Function" }, { "name": "HighlightOptions", "kind": "TypeAlias" }, { "name": "HighlightScope", "kind": "TypeAlias" }, - { "name": "LineChart", "kind": "Function" }, + { "name": "LineChart", "kind": "Variable" }, { "name": "LineElement", "kind": "Function" }, { "name": "lineElementClasses", "kind": "Variable" }, { "name": "LineElementClasses", "kind": "Interface" }, @@ -93,10 +94,10 @@ { "name": "PiePlot", "kind": "Function" }, { "name": "PieSeriesType", "kind": "Interface" }, { "name": "PieValueType", "kind": "TypeAlias" }, - { "name": "ResponsiveChartContainer", "kind": "Function" }, + { "name": "ResponsiveChartContainer", "kind": "Variable" }, { "name": "ResponsiveChartContainerProps", "kind": "TypeAlias" }, { "name": "Scatter", "kind": "Function" }, - { "name": "ScatterChart", "kind": "Function" }, + { "name": "ScatterChart", "kind": "Variable" }, { "name": "ScatterItemIdentifier", "kind": "TypeAlias" }, { "name": "ScatterPlot", "kind": "Function" }, { "name": "ScatterSeriesType", "kind": "Interface" }, @@ -104,5 +105,8 @@ { "name": "SeriesItemIdentifier", "kind": "TypeAlias" }, { "name": "StackableSeriesType", "kind": "TypeAlias" }, { "name": "StackOffsetType", "kind": "TypeAlias" }, - { "name": "StackOrderType", "kind": "TypeAlias" } + { "name": "StackOrderType", "kind": "TypeAlias" }, + { "name": "useDrawingArea", "kind": "Function" }, + { "name": "useXScale", "kind": "Function" }, + { "name": "useYScale", "kind": "Function" } ] diff --git a/test/regressions/index.test.js b/test/regressions/index.test.js index 710a4467b7c8..fd527ad09d53 100644 --- a/test/regressions/index.test.js +++ b/test/regressions/index.test.js @@ -111,6 +111,7 @@ async function main() { '/docs-data-grid-filtering/QuickFilteringInitialize', // No content rendered '/docs-data-grid-sorting/FullyCustomSortComparator', // No flag column '/docs-data-grid-sorting/ServerSortingGrid', // No flag column + '/docs-data-grid-filtering/QuickFilteringExcludeHiddenColumns', // No flag column ]; if ( diff --git a/test/utils/helperFn.ts b/test/utils/helperFn.ts index 6f1845ea9c06..15cb46047b0b 100644 --- a/test/utils/helperFn.ts +++ b/test/utils/helperFn.ts @@ -1,4 +1,36 @@ +import { spy } from 'sinon'; import { act } from '@mui/monorepo/test/utils'; +import { unwrapPrivateAPI } from '@mui/x-data-grid/internals'; +import type { GridApiCommon } from '@mui/x-data-grid/models/api/gridApiCommon'; + +export function sleep(duration: number) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, duration); + }); +} + +export function microtasks() { + return act(() => Promise.resolve()); +} + +export function spyApi(api: GridApiCommon, methodName: string) { + const methodKey = methodName as keyof GridApiCommon; + const privateApi = unwrapPrivateAPI(api); + const method = privateApi[methodKey]; + + const spyFn = spy((...args: any[]) => { + return spyFn.target(...args); + }) as any; + spyFn.spying = true; + spyFn.target = method; + + api[methodKey] = spyFn; + privateApi[methodKey] = spyFn; + + return spyFn; +} export async function raf() { return new Promise((resolve) => { @@ -52,18 +84,6 @@ export function getActiveColumnHeader() { return `${Number(activeElement.getAttribute('aria-colindex')) - 1}`; } -export function sleep(duration: number) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, duration); - }); -} - -export function microtasks() { - return act(() => Promise.resolve()); -} - export function getColumnValues(colIndex: number) { return Array.from(document.querySelectorAll(`[role="cell"][data-colindex="${colIndex}"]`)).map( (node) => node!.textContent, diff --git a/yarn.lock b/yarn.lock index 1a0cf8b65681..46c3f6ec64a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -146,10 +146,10 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@argos-ci/core@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@argos-ci/core/-/core-0.8.0.tgz#d739fa46d6742211ceaab41be0fd24588cf1f34d" - integrity sha512-MwCeTos8Fov5V+ybrkcFyMVWgsumDRHUokMOgyYt2gdJ5q0LdEp9wNz0VVIDAGSjyLTTbWqdkVCuaOkw5sz3LQ== +"@argos-ci/core@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@argos-ci/core/-/core-0.9.0.tgz#c92517e5968491a5a35370c4691ea3111396e06e" + integrity sha512-gq+vp30ZpaLzs0hhYcs/8dkmyT5DhrPALM/n7sPy62uFq6tFKgGDdCa2NUNPafjsU9Ksj4y3NCHphAAnovLzQg== dependencies: axios "1.1.2" convict "^6.2.3" @@ -1685,21 +1685,21 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@lerna/child-process@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.1.1.tgz#60eddd6dc4b6ba0fd51851c78b6dbdc4e1614220" - integrity sha512-mR8PaTkckYPLmEBG2VsVsJq2UuzEvjXevOB1rKLKUZ/dPCGcottVhbiEzTxickc+s7Y/1dTTLn/1BKj3B1a5BA== +"@lerna/child-process@7.1.4": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.1.4.tgz#5ab64540b01a339ecc6787f4f06d29aee99d71d5" + integrity sha512-cSiMDx9oI9vvVT+V/WHcbqrksNoc9PIPFiks1lPS7zrVWkEbgA6REQyYmRd2H71kihzqhX5TJ20f2dWv6oEPdA== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/create@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.1.1.tgz#2af94afb01971c1b594c06347b6998607aefe5c4" - integrity sha512-1PY2OgwGxp7b91JzLKEhONVl69mCt1IyYEc6pzKy3Sv+UOdeK2QFq1SX/85hNOR3iitiyZ75bNWUTcBly1ZlZg== +"@lerna/create@7.1.4": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.1.4.tgz#bfff377c36734ef9a95e3fe8cb030d6498844928" + integrity sha512-D5YWXsXIxWb1aGqcbtttczg86zMzkNhcs00/BleFNxdNYlTRdjLIReELOGBGrq3Hij05UN+7Dv9EKnPFJVbqAw== dependencies: - "@lerna/child-process" "7.1.1" + "@lerna/child-process" "7.1.4" dedent "0.7.0" fs-extra "^11.1.1" init-package-json "5.0.0" @@ -1815,59 +1815,59 @@ react-test-renderer "^18.0.0" semver "^5.7.0" -"@mui/base@5.0.0-beta.5", "@mui/base@^5.0.0-beta.5": - version "5.0.0-beta.5" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.5.tgz#b566f3beb1eb2823139eabaf52014cf7be900015" - integrity sha512-vy3TWLQYdGNecTaufR4wDNQFV2WEg6wRPi6BVbx6q1vP3K1mbxIn1+XOqOzfYBXjFHvMx0gZAo2TgWbaqfgvAA== +"@mui/base@5.0.0-beta.7", "@mui/base@^5.0.0-beta.7": + version "5.0.0-beta.7" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.7.tgz#01cb99ac098af0ba989c7abc1474e3291c29414f" + integrity sha512-Pjbwm6gjiS96kOMF7E5fjEJsenc0tZBesrLQ4rrdi3eT/c/yhSWnPbCUkHSz8bnS0l3/VQ8bA+oERSGSV2PK6A== dependencies: "@babel/runtime" "^7.22.5" "@emotion/is-prop-valid" "^1.2.1" "@mui/types" "^7.2.4" - "@mui/utils" "^5.13.6" + "@mui/utils" "^5.13.7" "@popperjs/core" "^2.11.8" clsx "^1.2.1" prop-types "^15.8.1" react-is "^18.2.0" -"@mui/core-downloads-tracker@^5.13.4": - version "5.13.4" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz#7e4b491d8081b6d45ae51556d82cb16b31315a19" - integrity sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw== +"@mui/core-downloads-tracker@^5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.0.tgz#ca394a1c53c215f4c6bf7f7460d8211298d7bbf6" + integrity sha512-SYBOVCatVDUf/lbrLGah09bHhX5WfUXg7kSskfLILr6SvKRni0NLp0aonxQ0SMALVVK3Qwa6cW4CdWuwS0gC1w== -"@mui/icons-material@^5.11.16": - version "5.11.16" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38" - integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A== +"@mui/icons-material@^5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.0.tgz#6452b00bc98dc407f20a927245e273113703166f" + integrity sha512-z7lYNteDi1GMkF9JP/m2RWuCYK1M/FlaeBSUK7/IhIYzIXNhAVjfD8jRq5vFBV31qkEi2aGBS2z5SfLXwH6U0A== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.22.5" -"@mui/joy@^5.0.0-alpha.85": - version "5.0.0-alpha.85" - resolved "https://registry.yarnpkg.com/@mui/joy/-/joy-5.0.0-alpha.85.tgz#7169a698250a0cdbc3c9b51b5468eb1fc986209b" - integrity sha512-IDQR5XzjFvPuS5cA2QIV7y4qxKh6/9xympglzlUphfb3xFQgHVgfjTbwAT8CSICXcbLH65NahPizJiv0yL3HhQ== +"@mui/joy@^5.0.0-alpha.87": + version "5.0.0-alpha.87" + resolved "https://registry.yarnpkg.com/@mui/joy/-/joy-5.0.0-alpha.87.tgz#9dfcb2a205f1491ab1051d0484359199cbf0cca8" + integrity sha512-LAJglgZHG97GYVEV9JRMO/K6Qu+EmaxZpkX2tUctLhP84fL58AifqSZpvwmLaQTfczi4WxIB5Sn9JTQCPjj1Pg== dependencies: "@babel/runtime" "^7.22.5" - "@mui/base" "5.0.0-beta.5" - "@mui/core-downloads-tracker" "^5.13.4" - "@mui/system" "^5.13.6" + "@mui/base" "5.0.0-beta.7" + "@mui/core-downloads-tracker" "^5.14.0" + "@mui/system" "^5.14.0" "@mui/types" "^7.2.4" - "@mui/utils" "^5.13.6" + "@mui/utils" "^5.13.7" clsx "^1.2.1" csstype "^3.1.2" prop-types "^15.8.1" react-is "^18.2.0" -"@mui/material@^5.13.6": - version "5.13.6" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.13.6.tgz#caaba1e071e394c415208404ce6964e6c14c16d6" - integrity sha512-/c2ZApeQm2sTYdQXjqEnldaBMBcUEiyu2VRS6bS39ZeNaAcCLBQbYocLR46R+f0S5dgpBzB0T4AsOABPOFYZ5Q== +"@mui/material@^5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.0.tgz#3d2afb4a3643774370cb5add873abcbbe8e7af27" + integrity sha512-HP7CP71NhMkui2HUIEKl2/JfuHMuoarSUWAKlNw6s17bl/Num9rN61EM6uUzc2A2zHjj/00A66GnvDnmixEJEw== dependencies: "@babel/runtime" "^7.22.5" - "@mui/base" "5.0.0-beta.5" - "@mui/core-downloads-tracker" "^5.13.4" - "@mui/system" "^5.13.6" + "@mui/base" "5.0.0-beta.7" + "@mui/core-downloads-tracker" "^5.14.0" + "@mui/system" "^5.14.0" "@mui/types" "^7.2.4" - "@mui/utils" "^5.13.6" + "@mui/utils" "^5.13.7" "@types/react-transition-group" "^4.4.6" clsx "^1.2.1" csstype "^3.1.2" @@ -1877,15 +1877,15 @@ "@mui/monorepo@https://github.com/mui/material-ui.git#master": version "5.13.7" - resolved "https://github.com/mui/material-ui.git#ab2cb8cf9614ccab02b62a22de5129a1c2774d96" + resolved "https://github.com/mui/material-ui.git#a4afa9ff2442589deb73a4b08c299913983967bd" -"@mui/private-theming@^5.13.1": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.13.1.tgz#c3e9a0b44f9c5a51b92cfcfb660536060cb61ed7" - integrity sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ== +"@mui/private-theming@^5.13.7": + version "5.13.7" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.13.7.tgz#2f8ef5da066f3c6c6423bd4260d003a28d10b099" + integrity sha512-qbSr+udcij5F9dKhGX7fEdx2drXchq7htLNr2Qg2Ma+WJ6q0ERlEqGSBiPiVDJkptcjeVL4DGmcf1wl5+vD4EA== dependencies: - "@babel/runtime" "^7.21.0" - "@mui/utils" "^5.13.1" + "@babel/runtime" "^7.22.5" + "@mui/utils" "^5.13.7" prop-types "^15.8.1" "@mui/styled-engine@^5.13.2": @@ -1898,16 +1898,16 @@ csstype "^3.1.2" prop-types "^15.8.1" -"@mui/styles@^5.13.2": - version "5.13.2" - resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.13.2.tgz#0d6c1b7c5437293cf4f0d98d1fd8c5cc02bb4138" - integrity sha512-gKNkVyk6azQ8wfCamh3yU/wLv1JscYrsQX9huQBwfwtE7kUTq2rgggdfJjRADjbcmT6IPX+oCHYjGfqqFgDIQQ== +"@mui/styles@^5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.14.0.tgz#21da486a114de0ada05c7bb8914e885f7c6626b9" + integrity sha512-+nXPk/7qhlJn2QGSBlB42gM9G4shLDEAfkTqjUoCDsS3qPo7ZlpM2X5SgnCNoYhXCn820R0YxaJYd19rmC3FSA== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.22.5" "@emotion/hash" "^0.9.1" - "@mui/private-theming" "^5.13.1" + "@mui/private-theming" "^5.13.7" "@mui/types" "^7.2.4" - "@mui/utils" "^5.13.1" + "@mui/utils" "^5.13.7" clsx "^1.2.1" csstype "^3.1.2" hoist-non-react-statics "^3.3.2" @@ -1921,16 +1921,16 @@ jss-plugin-vendor-prefixer "^10.10.0" prop-types "^15.8.1" -"@mui/system@^5.13.6": - version "5.13.6" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.13.6.tgz#5bf4f84fad0c9ed771458f821e384f61abfa33ca" - integrity sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ== +"@mui/system@^5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.0.tgz#b7eeb799ae67d27b887fec4917ebd5e2be5a2faa" + integrity sha512-0HZGkX8miJbiNw+rjlZ9l0Cfkz1bSqfSHQH0EH9J+nx0aAm5cBleg9piOlLdCNIWGgecCqsw4x62erGrGjjcJg== dependencies: "@babel/runtime" "^7.22.5" - "@mui/private-theming" "^5.13.1" + "@mui/private-theming" "^5.13.7" "@mui/styled-engine" "^5.13.2" "@mui/types" "^7.2.4" - "@mui/utils" "^5.13.6" + "@mui/utils" "^5.13.7" clsx "^1.2.1" csstype "^3.1.2" prop-types "^15.8.1" @@ -1940,14 +1940,14 @@ resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== -"@mui/utils@^5.13.1", "@mui/utils@^5.13.6": - version "5.13.6" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.13.6.tgz#aa29d75de59577585b9f23891b03592d40459ed7" - integrity sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ== +"@mui/utils@^5.13.7": + version "5.13.7" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.13.7.tgz#7e6a8336e05eb2642667a5c02eb605351e27ec20" + integrity sha512-/3BLptG/q0u36eYED7Nhf4fKXmcKb6LjjT7ZMwhZIZSdSxVqDqSTmATW3a56n3KEPQUXCU9TpxAfCBQhs6brVA== dependencies: "@babel/runtime" "^7.22.5" "@types/prop-types" "^15.7.5" - "@types/react-is" "^18.2.0" + "@types/react-is" "^18.2.1" prop-types "^15.8.1" react-is "^18.2.0" @@ -2105,81 +2105,81 @@ read-package-json-fast "^3.0.0" which "^3.0.0" -"@nrwl/devkit@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.4.0.tgz#0bd16834e09d1b01fadf5c68fd19410893e61ac8" - integrity sha512-KUu9oNrMB8DP78BAO8XWJC5HOSS6dO6ocMWj2DtuNVgMgABviy+ih/TmrGKxQQBH0Ib4cxTeMIQVRdAak5c1UA== +"@nrwl/devkit@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.5.2.tgz#eedcf4e546e2ebd3d01babcf5c97bc2b6bf08408" + integrity sha512-4L8cHD6cDTVWqylzM9vNbh8MuujsBpEP0yiTKQOBfAkTWpp/PcyFsnCMtYEiaWIQ5xSrruVbL5pb9KEL4ayLAg== dependencies: - "@nx/devkit" "16.4.0" + "@nx/devkit" "16.5.2" -"@nrwl/tao@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.4.0.tgz#81a844c8c707ff747b26ea7d23f6bed005b72967" - integrity sha512-6n4chOOv6jqact07NvIDRQfsnaiYYhi+mrqSuJKs6fL+c5kx/VCryndTP0MDTBbazfL6H7vwiQUkTja2sQDuwA== +"@nrwl/tao@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.5.2.tgz#6b46b880e36ff0af4cceaf2409fd2055bf2cf2b1" + integrity sha512-4vQt0Jj9xHc8SpNgM2TxkPZrkjf4ayNW7elgt5rlOT1yD3Q1Fn3/VHb3cWtm/RC2vSckB4qUEuFGpdEU8wEnCg== dependencies: - nx "16.4.0" + nx "16.5.2" -"@nx/devkit@16.4.0", "@nx/devkit@>=16.1.3 < 17": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.4.0.tgz#e8e5d6c6e4f6964387d418a4b48588528a021517" - integrity sha512-/Y+tC2IBxVEf3EKB80G9mF27ZBAFEBBmDMn1MPzfGX9AB2GGNCqgvSkSHT5DlkyxJOMqbE7DpMyHxubALyenEA== +"@nx/devkit@16.5.2", "@nx/devkit@>=16.5.1 < 17": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.5.2.tgz#0a30fc4e3beeea7d7bf16a0496d1ff3c5fa05299" + integrity sha512-QDOQeFzVhQCA65g+2RfoGKZBUnCb151+F7/PvwRESEM+jybXHoXwR9PSE3ClnnmO/d0LUKB2ohU3Z9WQrQDALQ== dependencies: - "@nrwl/devkit" "16.4.0" + "@nrwl/devkit" "16.5.2" ejs "^3.1.7" ignore "^5.0.4" semver "7.5.3" tmp "~0.2.1" tslib "^2.3.0" -"@nx/nx-darwin-arm64@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.4.0.tgz#72d5cbeb585aa05b4035f1de8f92ba562b180137" - integrity sha512-/ZXuF8M3u8DSNmjYstQKorzo7uIETNhnFinwWlO8mzz+SyR+Xs5G6penJ4+cB1ju3Hf3lZkXd5U6pEiW4OAAkA== - -"@nx/nx-darwin-x64@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.4.0.tgz#24f8b9946c77ec1d66e42ffe2f84623e4072167c" - integrity sha512-0Fo58qZzHgRs4SRVaAOBipdJQNew57YQbpFaLHKhCTyKc0Pe6THEYaaT/x9QVkcFO0x4AzNr9T7iJTrneNwcKg== - -"@nx/nx-freebsd-x64@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.4.0.tgz#a82954fe4bc6a74cd6b7e0cb89e1486ac4c06e27" - integrity sha512-Qoes/NifE4zb5Gb6ZdC32HvxZBzO0xo74j7EozUV5rZEm3bCtKbKqThPV9Uuu+8S4j718r5vlob/IMXqRcWK4g== - -"@nx/nx-linux-arm-gnueabihf@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.4.0.tgz#77911992e38c1aee51d4a075545ea2828d074c45" - integrity sha512-m8uklbettj8RnLtasjQPiYxqJotDSfO3LO1II8Bds53C7OT8TDnTkW68MEx+CxuSCQFy2Aa0Oih3jSvDzfnZzA== - -"@nx/nx-linux-arm64-gnu@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.4.0.tgz#ee2b7208083cf3fc63121ee079ab3e0c2bbe5fa4" - integrity sha512-bAs2T/zZQDTCzzhciE8kCrkwgXbeX3K83cGRacB7PDZZl/O4jr5TRO4zYHi6doytyLONjqhvWNLbIo4cEEcfZA== - -"@nx/nx-linux-arm64-musl@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.4.0.tgz#afaf514d3df0bc31c4a6545d254502c661e3d347" - integrity sha512-K1D8j4lRZDBVuW8iomeJjCznFz7rfP3qaB3RHjKZU5qrZBq1uYohhdfT7dzwWFNWEvt6WytfhGCl2S9PsQ37Wg== - -"@nx/nx-linux-x64-gnu@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.4.0.tgz#fba4991ac27f0c342157445259485c06fca686f2" - integrity sha512-v1NJ3ESaw5bdSeuh5Xslq1dXGWztf0mSLwZP510Rt9+ulr5LQ/X1Rri8zefU0gZNLcmJL0G2Qq7UTnppYGRTEg== - -"@nx/nx-linux-x64-musl@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.4.0.tgz#9bbdb590a49de9667e2e26dc173fe6d303e165be" - integrity sha512-+8YLVWZFq+k6YJ2ZDwR5sGaRnZhUVYtR8aPbGyonMnJ8VEQJNEqsm1KT6nt0gd3JJdxyphm3VsMQWBMo42jM+w== - -"@nx/nx-win32-arm64-msvc@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.4.0.tgz#a2e06890c70afdd339d0d95516ae8bbc222d9ce6" - integrity sha512-HwE6AxlrfWvODT49vVX6NGMYc3zdMVXETCdZb0jZ/oz28XXTAPvVb/8DJgKSyCs0DPirEeCHiPwbdcJA1Bqw8A== - -"@nx/nx-win32-x64-msvc@16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.4.0.tgz#d98b4087b696b524461fc142f656a337ed00a520" - integrity sha512-ISL3c6i/v+JOsUHEbngDHaobmbgu6oSY0htKas1RjLWGkWXDLgEXMRjQ/xDbNVYH00Mto7mmq+nrjkNNbqOrfQ== +"@nx/nx-darwin-arm64@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.2.tgz#0efcc62881eddd20e5bb8f881e6c8cc082c864f8" + integrity sha512-myiNbDJLhhVHRLo6z3TeiaUeYTWdvBR3RdHQq4szTgb82Bnn8ruzteRGGJwKZd551YlttRcieBysxzUzHkmVBg== + +"@nx/nx-darwin-x64@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.2.tgz#6b03c1f4569411db7f8f90df90c820b083bde65f" + integrity sha512-m354qmKrv7a5eD9Qv8bGEmrLCBEyCS6/y0PyOR32Dmi7qwlgHsQ4FfVkOnlWefC5ednhFLJQT6yxwhg8cFGDxw== + +"@nx/nx-freebsd-x64@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.2.tgz#931e8be5c70d87b87f17d8faf0b9089383df0505" + integrity sha512-qrR9yxcC2BLnw9JulecILmyp6Jco9unHHzQcfhLZTpw5c1PNHmZzHwJ3i3iNEf1o2kXEIa+SlOCis9ndvNQQVA== + +"@nx/nx-linux-arm-gnueabihf@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.2.tgz#d9d865f99ba1128f6aa5b6bf0887bb743590eeb6" + integrity sha512-+I1Oj54caDymMsQuRu/l4ULS4RVvwDUM1nXey5JhWulDOUF//09Ckz03Q9p0NCnvBvQd3SyE65++PMfZrrurbA== + +"@nx/nx-linux-arm64-gnu@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.2.tgz#c442df598108776cce297561555520ffbce251ea" + integrity sha512-4Q4jpgtNBTb4lMegFKS9hkzS/WttH3MxkgM//8qs1zhgUz/AsuXTitBo71E3xCnQl/i38p0eIpiKXXwBJeHgDw== + +"@nx/nx-linux-arm64-musl@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.2.tgz#e07c0031f60372e726d2272fac5f3743c4d9591c" + integrity sha512-VLukS/pfenr/Qw/EUn3GPAREDVXuSmfKeYBQKkALXEK6cRVQhXFXMLGHgMemCYbpoUJyFtFEO94PKV7VU7wZPg== + +"@nx/nx-linux-x64-gnu@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.2.tgz#0748beae6944b42276f4705bc41b9e06cefb1d55" + integrity sha512-TAGmY+MXbNl/aGg2KMvtg53rbmX0XHwnJRQtjhjqjAyvaOfFWI/WOqTU7xf/QCkXBUIK0D9xHWpALfA/fZFCBA== + +"@nx/nx-linux-x64-musl@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.2.tgz#7b150081e21ba7aa0da511f80aae1c5d230d1664" + integrity sha512-YyWmqcNbZgU76+LThAt+0arx9C2ewfI5UUI6kooZRniAd408EA2xl5fx2AWLLrISGH4nTb5p20HGmeWfGqjHPA== + +"@nx/nx-win32-arm64-msvc@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.2.tgz#f06f74b876c92d6b12cd351baff016b18bfd9a73" + integrity sha512-pl7LluCc/57kl9VZ1ES27ym16ps4zgfCIeJiF8Ne8C6ALgt7C3PEG6417sFqbQw5J7NhsZ1aTb3eJ9fa9hurhA== + +"@nx/nx-win32-x64-msvc@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.2.tgz#6ae96b6a90924daba81350863da4f9d12884fe8e" + integrity sha512-bKSMElhzP37MkzWQ/Y12pQlesZ6TxwOOqwoaK/vHe6ZtxPxvG2+U8tQ21Nw5L3KyrDCnU5MJHGFtQVHHHt5MwA== "@octokit/auth-token@^2.4.4": version "2.5.0" @@ -2313,13 +2313,13 @@ "@octokit/types" "^9.2.3" deprecation "^2.3.1" -"@octokit/plugin-retry@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-5.0.4.tgz#c726c0e4e3fcd3b34a010e709f2c8b92cce1915a" - integrity sha512-hw00fDIhOgijy4aSxS6weWF5uqZVeoiC/AptLLyjL8KFCJRGRaXfcfgj76h/Z3cSLTjRsEIQnNCTig8INttL/g== +"@octokit/plugin-retry@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-6.0.0.tgz#4a83ca5d531bbd56e0822a644ab0ba4a3215f87a" + integrity sha512-a1/A4A+PB1QoAHQfLJxGHhLfSAT03bR1jJz3GgQJZvty2ozawFWs93MiBQXO7SL2YbO7CIq0Goj4qLOBj8JeMQ== dependencies: - "@octokit/request-error" "^4.0.1" - "@octokit/types" "^10.0.0" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^11.0.0" bottleneck "^2.15.3" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -2340,12 +2340,12 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request-error@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-4.0.2.tgz#0e16802f3e688e1dd6807e81c7810f419b2c530d" - integrity sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w== +"@octokit/request-error@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.0.tgz#060c5770833f9d563ad9a49fec6650c41584bc40" + integrity sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ== dependencies: - "@octokit/types" "^10.0.0" + "@octokit/types" "^11.0.0" deprecation "^2.0.0" once "^1.4.0" @@ -2408,10 +2408,10 @@ resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== -"@octokit/types@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" - integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== +"@octokit/types@^11.0.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-11.1.0.tgz#9e5db741d582b05718a4d91bac8cc987def235ea" + integrity sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ== dependencies: "@octokit/openapi-types" "^18.0.0" @@ -2823,10 +2823,10 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@^8.40.2": - version "8.40.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.2.tgz#2833bc112d809677864a4b0e7d1de4f04d7dac2d" - integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ== +"@types/eslint@*", "@types/eslint@^8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" + integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2937,7 +2937,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== -"@types/normalize-package-data@^2.4.0": +"@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== @@ -2957,10 +2957,10 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.6": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.6.tgz#ad621fa71a8db29af7c31b41b2ea3d8a6f4144d1" - integrity sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.7": + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== dependencies: "@types/react" "*" @@ -2971,10 +2971,10 @@ dependencies: "@types/react" "*" -"@types/react-is@^18.2.0": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-18.2.0.tgz#2f5137853a46017b3d56447940fb3eb92bbf24a5" - integrity sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ== +"@types/react-is@^18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-18.2.1.tgz#61d01c2a6fc089a53520c0b66996d458fdc46863" + integrity sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw== dependencies: "@types/react" "*" @@ -3009,10 +3009,10 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.14": - version "18.2.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.14.tgz#fa7a6fecf1ce35ca94e74874f70c56ce88f7a127" - integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== +"@types/react@*", "@types/react@^18.2.15": + version "18.2.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.15.tgz#14792b35df676c20ec3cf595b262f8c615a73066" + integrity sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3064,15 +3064,15 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz#a1a5290cf33863b4db3fb79350b3c5275a7b1223" - integrity sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g== +"@typescript-eslint/eslint-plugin@^5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.61.0" - "@typescript-eslint/type-utils" "5.61.0" - "@typescript-eslint/utils" "5.61.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.0" @@ -3080,79 +3080,79 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@^5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.61.0.tgz#5ab9f8f1f7e7a43c68a48c450d972c7e400a2be4" - integrity sha512-r4RTnwTcaRRVUyKb7JO4DiOGmcMCat+uNs6HqJBfX7K2nlq5TagYZShhbhAw7hFT3bHaYgxMw6pKP0fhu05VMA== +"@typescript-eslint/experimental-utils@^5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" + integrity sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw== dependencies: - "@typescript-eslint/utils" "5.61.0" + "@typescript-eslint/utils" "5.62.0" -"@typescript-eslint/parser@^5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.61.0.tgz#7fbe3e2951904bb843f8932ebedd6e0635bffb70" - integrity sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg== +"@typescript-eslint/parser@^5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.61.0" - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/typescript-estree" "5.61.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz#b670006d069c9abe6415c41f754b1b5d949ef2b2" - integrity sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/visitor-keys" "5.61.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz#e90799eb2045c4435ea8378cb31cd8a9fddca47a" - integrity sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.61.0" - "@typescript-eslint/utils" "5.61.0" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.61.0.tgz#e99ff11b5792d791554abab0f0370936d8ca50c0" - integrity sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz#4c7caca84ce95bb41aa585d46a764bcc050b92f3" - integrity sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/visitor-keys" "5.61.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.61.0.tgz#5064838a53e91c754fffbddd306adcca3fe0af36" - integrity sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ== +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.61.0" - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/typescript-estree" "5.61.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.61.0": - version "5.61.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz#c79414fa42158fd23bd2bb70952dc5cdbb298140" - integrity sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.61.0" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": @@ -3306,10 +3306,10 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.24" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.24.tgz#508f9dd089c7b297d9dcc297aa0e8c89fb56267f" - integrity sha512-A5wXsIUOipZUGDly1SHBht1OjKKW4y+E9EzzJxR2tby0Pj3atgCta9RSYa4+aXLkFfIMX3onnykmJnwJWqJj5g== +"@yarnpkg/parsers@3.0.0-rc.46": + version "3.0.0-rc.46" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" + integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -4409,22 +4409,22 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase-keys@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252" - integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg== +camelcase-keys@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-8.0.2.tgz#a7140ba7c797aea32161d4ce5cdbda11d09eb414" + integrity sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA== dependencies: - camelcase "^6.3.0" - map-obj "^4.1.0" - quick-lru "^5.1.1" - type-fest "^1.2.1" + camelcase "^7.0.0" + map-obj "^4.3.0" + quick-lru "^6.1.1" + type-fest "^2.13.0" camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.3.0: +camelcase@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -5101,37 +5101,36 @@ cosmiconfig@^8.2.0: parse-json "^5.0.0" path-type "^4.0.0" -cp-file@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-9.1.0.tgz#e98e30db72d57d47b5b1d444deb70d05e5684921" - integrity sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA== +cp-file@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-10.0.0.tgz#bbae9ecb9f505951b862880d2901e1f56de7a4dc" + integrity sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg== dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" + graceful-fs "^4.2.10" + nested-error-stacks "^2.1.1" + p-event "^5.0.1" -cpy-cli@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-4.2.0.tgz#d60bf9ac776486af20aac2fa4fb95f8f10b35ce8" - integrity sha512-b04b+cbdr29CdpREPKw/itrfjO43Ty0Aj7wRM6M6LoE4GJxZJCk9Xp+Eu1IqztkKh3LxIBt1tDplENsa6KYprg== +cpy-cli@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-5.0.0.tgz#facd60da2e98d9a830f93162f9769d2a86667a16" + integrity sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ== dependencies: - cpy "^9.0.0" - meow "^10.1.2" + cpy "^10.1.0" + meow "^12.0.1" -cpy@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-9.0.0.tgz#02943474fd96ea122443f3bb2c5f26e6b9a66fe7" - integrity sha512-+yJuWIPnwcdBx+vBcZkb1jeAu05TZlPTAXdZf/fMrksyPQf2tTQr3/zpm1CeBJxeS3E9t4X0HQnr+CMsKSDIXA== +cpy@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-10.1.0.tgz#85517387036b9be480f6424e54089261fc6f4bab" + integrity sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ== dependencies: arrify "^3.0.0" - cp-file "^9.1.0" - globby "^13.1.1" - junk "^4.0.0" - micromatch "^4.0.4" - nested-error-stacks "^2.1.0" + cp-file "^10.0.0" + globby "^13.1.4" + junk "^4.0.1" + micromatch "^4.0.5" + nested-error-stacks "^2.1.1" p-filter "^3.0.0" - p-map "^5.3.0" + p-map "^6.0.0" crc-32@^1.2.0: version "1.2.1" @@ -5462,6 +5461,16 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" +decamelize-keys@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-2.0.1.tgz#32115e60cc5eeaea11d6692fd73de3b92e34502f" + integrity sha512-nrNeSCtU2gV3Apcmn/EZ+aR20zKDuNDStV67jPiupokD3sOAFeMzslLMCFdKv1sPqzwoe5ZUhsSW9IAVgKSL/Q== + dependencies: + decamelize "^6.0.0" + map-obj "^4.3.0" + quick-lru "^6.1.1" + type-fest "^3.1.0" + decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -5472,10 +5481,10 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decamelize@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9" - integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== +decamelize@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-6.0.0.tgz#8cad4d916fde5c41a264a43d0ecc56fe3d31749e" + integrity sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA== decimal.js@^10.4.3: version "10.4.3" @@ -6148,10 +6157,10 @@ eslint-config-airbnb-base@^15.0.0: object.entries "^1.1.5" semver "^6.3.0" -eslint-config-airbnb-typescript@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz#360dbcf810b26bbcf2ff716198465775f1c49a07" - integrity sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g== +eslint-config-airbnb-typescript@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz#fda960eee4a510f092a9a1c139035ac588937ddc" + integrity sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig== dependencies: eslint-config-airbnb-base "^15.0.0" @@ -6233,10 +6242,10 @@ eslint-plugin-import@^2.27.5: semver "^6.3.0" tsconfig-paths "^3.14.1" -eslint-plugin-jsdoc@^46.4.3: - version "46.4.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.3.tgz#4a2ad3a01d7ba723acaed3940f746a0a31d1e58e" - integrity sha512-Prc7ol+vCIghPeECpwZq5+P+VZfoi87suywvbYCiCnkI1kTmVSdcOC2M8mioglWxBbd28wbb1OVjg/8OzGzatA== +eslint-plugin-jsdoc@^46.4.4: + version "46.4.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.4.tgz#cdcf9f59238381e3ee57110ceccefdfef388455d" + integrity sha512-D8TGPOkq3bnzmYmA7Q6jdsW+Slx7CunhJk1tlouVq6wJjlP1p6eigZPvxFn7aufud/D66xBsNVMhkDQEuqumMg== dependencies: "@es-joy/jsdoccomment" "~0.39.4" are-docs-informative "^0.0.2" @@ -6344,10 +6353,10 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@^8.44.0: - version "8.44.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500" - integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== +eslint@^8.45.0: + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" @@ -6374,7 +6383,6 @@ eslint@^8.44.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -6386,7 +6394,6 @@ eslint@^8.44.0: natural-compare "^1.4.0" optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" espree@^9.6.0: @@ -6848,6 +6855,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + find-yarn-workspace-root@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" @@ -7349,7 +7364,7 @@ globby@11.1.0, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@13.1.4, globby@^13.1.1, globby@^13.1.4: +globby@13.1.4, globby@^13.1.4: version "13.1.4" resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== @@ -7764,7 +7779,7 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -8729,10 +8744,10 @@ jszip@^3.5.0: readable-stream "~2.3.6" setimmediate "^1.0.5" -junk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.0.tgz#9b1104ddf5281cd24ffa3c8a7443d19ce192b37f" - integrity sha512-ojtSU++zLJ3jQG9bAYjg94w+/DOJtRyD7nPaerMFrBhmdVmiV5/exYH5t4uHga4G/95nT6hr1OJoKIFbYbrW5w== +junk@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.1.tgz#7ee31f876388c05177fe36529ee714b07b50fbed" + integrity sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ== just-extend@^4.0.2: version "4.2.1" @@ -8873,15 +8888,15 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -lerna@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.1.1.tgz#6703062e6c4ddefdaf41e8890e9200690924fd71" - integrity sha512-rjivAl3bYu2+lWOi90vy0tYFgwBYPMiNkR/DuEWZC08wle5dsbOZ/SlXeLk9+kzbF89Bt5P6p+qF78A2tJsWPA== +lerna@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.1.4.tgz#0778732f4c77ead71a20ba1e9b0a77edc75cb383" + integrity sha512-/cabvmTTkmayyALIZx7OpHRex72i8xSOkiJchEkrKxAZHoLNaGSwqwKkj+x6WtmchhWl/gLlqwQXGRuxrJKiBw== dependencies: - "@lerna/child-process" "7.1.1" - "@lerna/create" "7.1.1" + "@lerna/child-process" "7.1.4" + "@lerna/create" "7.1.4" "@npmcli/run-script" "6.0.2" - "@nx/devkit" ">=16.1.3 < 17" + "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" "@octokit/rest" "19.0.11" byte-size "8.1.1" @@ -8915,6 +8930,7 @@ lerna@^7.1.1: libnpmaccess "7.0.2" libnpmpublish "7.3.0" load-json-file "6.2.0" + lodash "^4.17.21" make-dir "3.1.0" minimatch "3.0.5" multimatch "5.0.0" @@ -8923,7 +8939,7 @@ lerna@^7.1.1: npm-packlist "5.1.1" npm-registry-fetch "^14.0.5" npmlog "^6.0.2" - nx ">=16.1.3 < 17" + nx ">=16.5.1 < 17" p-map "4.0.0" p-map-series "2.1.0" p-pipe "3.1.0" @@ -9090,6 +9106,13 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash.camelcase@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -9420,7 +9443,7 @@ map-obj@^1.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-obj@^4.0.0, map-obj@^4.1.0: +map-obj@^4.0.0, map-obj@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== @@ -9478,10 +9501,10 @@ markdownlint@0.29.0: markdown-it "13.0.1" markdownlint-micromark "0.1.5" -marked@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-5.1.0.tgz#cf51f03ba04dfb3469774029fd0106d258658767" - integrity sha512-z3/nBe7aTI8JDszlYLk7dDVNpngjw0o1ZJtrA9kIfkkHcIF+xH7mO23aISl4WxP83elU+MFROgahqdpd05lMEQ== +marked@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-5.1.1.tgz#40b3963bb9da225314f746d5012ba7e34942f636" + integrity sha512-bTmmGdEINWmOMDjnPWDxGPQ4qkDLeYorpYbEtFOXzOruTwUE671q4Guiuchn4N8h/v6NGd7916kXsm3Iz4iUSg== mdurl@^1.0.1: version "1.0.1" @@ -9505,23 +9528,23 @@ memory-fs@^0.2.0: resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= -meow@^10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.2.tgz#62951cb69afa69594142c8250806bc30a3912e4d" - integrity sha512-zbuAlN+V/sXlbGchNS9WTWjUzeamwMt/BApKCJi7B0QyZstZaMx0n4Unll/fg0njGtMdC9UP5SAscvOCLYdM+Q== +meow@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.0.1.tgz#b158fee6e319da4c54835f4c6c98f193978199fd" + integrity sha512-/QOqMALNoKQcJAOOdIXjNLtfcCdLXbMFyB1fOOPdm6RzfBTlsuodOCTBDjVbeUSmgDQb8UI2oONqYGtq1PKKKA== dependencies: "@types/minimist" "^1.2.2" - camelcase-keys "^7.0.0" - decamelize "^5.0.0" - decamelize-keys "^1.1.0" + camelcase-keys "^8.0.2" + decamelize "^6.0.0" + decamelize-keys "^2.0.1" hard-rejection "^2.1.0" minimist-options "4.1.0" - normalize-package-data "^3.0.2" - read-pkg-up "^8.0.0" + normalize-package-data "^5.0.0" + read-pkg-up "^9.1.0" redent "^4.0.0" - trim-newlines "^4.0.2" - type-fest "^1.2.2" - yargs-parser "^20.2.9" + trim-newlines "^5.0.0" + type-fest "^3.9.0" + yargs-parser "^21.1.1" meow@^8.1.2: version "8.1.2" @@ -9560,7 +9583,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@4.0.5, micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@4.0.5, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -10016,10 +10039,10 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== +nested-error-stacks@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" + integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== next@^13.4.6: version "13.4.6" @@ -10336,15 +10359,15 @@ nwsapi@^2.2.4: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== -nx@16.4.0, "nx@>=16.1.3 < 17": - version "16.4.0" - resolved "https://registry.yarnpkg.com/nx/-/nx-16.4.0.tgz#cd136a3ebadf77138dce421b0c0e0944527fe9b3" - integrity sha512-HhJnOAm2wlaIVMmxK1HcdcKfX5DlnQc1RAHFf+QostvQQ/SmUg9f7LoStxpNm01JhQTehb01tH9zAsXKcKzO4A== +nx@16.5.2, "nx@>=16.5.1 < 17": + version "16.5.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.5.2.tgz#a271513abe73324fdf2924277d5f273d807a6f0e" + integrity sha512-3XAkVBhXuoFgD7r0lASOh2589XSmBUjioevZb13lDjKDN/FHFWedwMZWtmmbzxBGO3EAWjl+3owBS1RIPm1UHw== dependencies: - "@nrwl/tao" "16.4.0" + "@nrwl/tao" "16.5.2" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "^3.0.0-rc.18" + "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" axios "^1.0.0" chalk "^4.1.0" @@ -10376,16 +10399,16 @@ nx@16.4.0, "nx@>=16.1.3 < 17": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "16.4.0" - "@nx/nx-darwin-x64" "16.4.0" - "@nx/nx-freebsd-x64" "16.4.0" - "@nx/nx-linux-arm-gnueabihf" "16.4.0" - "@nx/nx-linux-arm64-gnu" "16.4.0" - "@nx/nx-linux-arm64-musl" "16.4.0" - "@nx/nx-linux-x64-gnu" "16.4.0" - "@nx/nx-linux-x64-musl" "16.4.0" - "@nx/nx-win32-arm64-msvc" "16.4.0" - "@nx/nx-win32-x64-msvc" "16.4.0" + "@nx/nx-darwin-arm64" "16.5.2" + "@nx/nx-darwin-x64" "16.5.2" + "@nx/nx-freebsd-x64" "16.5.2" + "@nx/nx-linux-arm-gnueabihf" "16.5.2" + "@nx/nx-linux-arm64-gnu" "16.5.2" + "@nx/nx-linux-arm64-musl" "16.5.2" + "@nx/nx-linux-x64-gnu" "16.5.2" + "@nx/nx-linux-x64-musl" "16.5.2" + "@nx/nx-win32-arm64-msvc" "16.5.2" + "@nx/nx-win32-x64-msvc" "16.5.2" nyc@^15.1.0: version "15.1.0" @@ -10635,12 +10658,12 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -p-event@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== dependencies: - p-timeout "^3.1.0" + p-timeout "^5.0.2" p-filter@^3.0.0: version "3.0.0" @@ -10675,6 +10698,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -10703,6 +10733,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map-series@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" @@ -10722,13 +10759,18 @@ p-map@^3.0.0: dependencies: aggregate-error "^3.0.0" -p-map@^5.1.0, p-map@^5.3.0: +p-map@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.3.0.tgz#2204823bc9f37f17ddc9e7f446293c4530b8a4cf" integrity sha512-SRbIQFoLYNezHkqZslqeg963HYUtqOrfMCxjNrFOpJ19WTYuq26rQoOXeX8QQiMLUlLqdYV/7PuDsdYJ7hLE1w== dependencies: aggregate-error "^4.0.0" +p-map@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-6.0.0.tgz#4d9c40d3171632f86c47601b709f4b4acd70fed4" + integrity sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw== + p-pipe@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" @@ -10747,13 +10789,18 @@ p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== -p-timeout@^3.1.0, p-timeout@^3.2.0: +p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -10950,6 +10997,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -11150,10 +11202,10 @@ postcss@8.4.14: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.21, postcss@^8.4.24: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== +postcss@^8.4.21, postcss@^8.4.26: + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -11403,6 +11455,11 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +quick-lru@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-6.1.1.tgz#f8e5bf9010376c126c80c1a62827a526c0e60adf" + integrity sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q== + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -11645,14 +11702,14 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg-up@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" - integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== +read-pkg-up@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-9.1.0.tgz#38ca48e0bc6c6b260464b14aad9bcd4e5b1fbdc3" + integrity sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg== dependencies: - find-up "^5.0.0" - read-pkg "^6.0.0" - type-fest "^1.0.1" + find-up "^6.3.0" + read-pkg "^7.1.0" + type-fest "^2.5.0" read-pkg@^3.0.0: version "3.0.0" @@ -11673,15 +11730,15 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read-pkg@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" - integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== +read-pkg@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-7.1.0.tgz#438b4caed1ad656ba359b3e00fd094f3c427a43e" + integrity sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg== dependencies: - "@types/normalize-package-data" "^2.4.0" + "@types/normalize-package-data" "^2.4.1" normalize-package-data "^3.0.2" parse-json "^5.2.0" - type-fest "^1.0.1" + type-fest "^2.0.0" read@^2.0.0: version "2.1.0" @@ -11751,10 +11808,10 @@ recast@^0.20.3, recast@^0.20.4: source-map "~0.6.1" tslib "^2.0.1" -recast@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.2.tgz#d3dda3e8f0a3366860d7508c00e34a338ac52b41" - integrity sha512-Qv6cPfVZyMOtPszK6PgW70pUgm7gPlFitAPf0Q69rlOA0zLw2XdDcNmPbVGYicFGT9O8I7TZ/0ryJD+6COvIPw== +recast@^0.23.3: + version "0.23.3" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.3.tgz#f205d1f46b2c6f730de413ab18f96c166263d85f" + integrity sha512-HbCVFh2ANP6a09nzD4lx7XthsxMOJWKX5pIcUwtLrmeEIl3I0DwjCoVXDE0Aobk+7k/mS3H50FK4iuYArpcT6Q== dependencies: assert "^2.0.0" ast-types "^0.16.1" @@ -12817,7 +12874,7 @@ strip-indent@^4.0.0: dependencies: min-indent "^1.0.1" -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -13129,9 +13186,9 @@ totalist@^1.0.0: integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -13165,10 +13222,10 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -trim-newlines@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.0.2.tgz#d6aaaf6a0df1b4b536d183879a6b939489808c7c" - integrity sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew== +trim-newlines@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-5.0.0.tgz#fbe350dc9d5fe15e80793b86c09bc7436a3da383" + integrity sha512-kstfs+hgwmdsOadN3KgA+C68wPJwnZq4DN6WMDCvZapDWEF34W2TyPKN2v2+BJnZgIz5QOfxFeldLyYvdgRAwg== ts-interface-checker@^0.1.9: version "0.1.13" @@ -13268,15 +13325,15 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +type-fest@^2.0.0, type-fest@^2.13.0, type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -type-fest@^2.13.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.18.0.tgz#fdef3a74e0a9e68ebe46054836650fb91ac3881e" - integrity sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw== +type-fest@^3.1.0, type-fest@^3.9.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.0.tgz#b088347ae73779a750c461694b264340c4c8c0d7" + integrity sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A== type-is@~1.6.18: version "1.6.18" @@ -14020,7 +14077,7 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.7, yargs-parser@^20.2.9: +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.7: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== @@ -14093,6 +14150,11 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + zip-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"