-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
feat: Add chart visualization to data browser #2867
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: alpha
Are you sure you want to change the base?
feat: Add chart visualization to data browser #2867
Conversation
- Support for Bar, Line, and Pie charts - Responsive design with gradients and animations - Chart.js integration with all required components - Proper data processing for numeric values
🚀 Thanks for opening this pull request! We appreciate your effort in improving the project. Please let us know once your pull request is ready for review. |
📝 WalkthroughWalkthroughThis update introduces a chart visualization feature in the data browser, allowing users to visualize selected cells as graphs. It adds chart libraries, a new ChartVisualization component, a draggable and resizable chart panel, UI controls to toggle the panel, and supporting styles. Chart types and data handling support both numeric and time series. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant DataBrowser
participant Toolbar
participant ChartPanel
participant ChartVisualization
User->>DataBrowser: Selects multiple cells
DataBrowser->>DataBrowser: Updates selectedData state
DataBrowser->>Toolbar: Passes selectedData and controls
User->>Toolbar: Clicks "Show Chart" button
Toolbar->>DataBrowser: Calls toggleChartPanelVisibility()
DataBrowser->>ChartPanel: Renders DraggableResizablePanel with ChartVisualization
ChartPanel->>ChartVisualization: Passes selectedData and metadata
ChartVisualization->>ChartVisualization: Processes data, renders chart
User->>DataBrowser: Changes selection or closes panel
DataBrowser->>ChartPanel: Updates or hides ChartVisualization accordingly
Assessment against linked issues
Assessment against linked issues: Out-of-scope changesNo out-of-scope changes were found. Suggested reviewers
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
⛔ Snyk checks have failed. 2 issues have been found so far.
⛔ security/snyk check is complete. 2 issues have been found. (View Details) 💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 10
🧹 Nitpick comments (8)
src/components/DraggableResizablePanel/DraggableResizablePanel.scss (2)
12-12
: Remove non-English comments for better maintainability.The Portuguese comments should be translated to English or removed to maintain consistency with the codebase language standards.
- overflow: visible; // Mudança: permitir que os handles sejam visíveis fora da borda + overflow: visible; // Allow resize handles to be visible outside borders - // Mostrar handles quando hover na janela + // Show handles on window hoverAlso applies to: 21-21
34-36
: Clean up commented code.Multiple instances of commented background and border styles should be removed unless they serve a specific documentation purpose.
- //background: #1f8ce6; - //border: 2px solid white;Also applies to: 45-47, 56-58, 67-69, 78-80, 89-91, 101-103, 113-115
src/dashboard/Data/Browser/DataBrowser.react.js (2)
574-669
: Consider extracting complex chart data processing logic.The
handleCellClick
method has become quite complex with nested loops and multiple data type checks. Consider extracting the data processing logic into separate utility functions for better maintainability and testability.Example structure:
// utils/chartDataProcessor.js export const processSelectedCells = (data, order, columns, rowStart, rowEnd, colStart, colEnd) => { // Extract validation and data processing logic }; export const detectDateColumns = (columns, order, colStart, colEnd) => { // Extract date column detection logic };
157-167
: Consider optimizing chart panel state reset.When data changes, all chart-related state is reset. Consider preserving the panel visibility preference if the user intentionally opened it.
You could track whether the panel was manually closed vs automatically closed due to data changes:
- if (prevProps.data !== this.props.data && this.state.isChartPanelVisible) { + if (prevProps.data !== this.props.data && this.state.isChartPanelVisible && !this.state.chartPanelManuallyClosed) { this.setState({ isChartPanelVisible: false, selectedCells: { list: new Set(), rowStart: -1, rowEnd: -1, colStart: -1, colEnd: -1 },src/components/ChartVisualization/ChartVisualization.react.js (1)
154-163
: Reduce code duplication in dataset creation.The dataset creation logic is repeated multiple times with similar structure. Extract this into a reusable function.
const createDataset = (label, data, index, chartType = 'bar') => ({ label, data, borderColor: `hsl(${index * 60}, 70%, 50%)`, backgroundColor: chartType === 'line' ? `hsla(${index * 60}, 70%, 50%, 0.1)` : `hsla(${index * 60}, 70%, 60%, 0.8)`, borderWidth: 2, borderRadius: chartType === 'bar' ? 4 : 0, tension: chartType === 'line' ? 0.4 : 0 });Also applies to: 236-245
src/components/DraggableResizablePanel/DraggableResizablePanel.react.js (3)
30-48
: Replace Portuguese comments with English for consistency.The codebase uses English comments throughout, but this section contains Portuguese comments. Please translate them to maintain consistency.
- const handleMouseDown = (e) => { - // Verificar se o clique foi na barra de título ou seus filhos + const handleMouseDown = (e) => { + // Check if the click was on the title bar or its children if (titleBarRef.current && ( e.target === titleBarRef.current || titleBarRef.current.contains(e.target) )) { - - // Verificar se não clicou no botão fechar + // Check if the close button was not clicked if (!e.target.closest('[data-close-button="true"]')) {
49-64
: Replace Portuguese comments with English for consistency.const handleMouseMove = (e) => { if (isDragging) { const newX = e.clientX - dragStart.x; const newY = e.clientY - dragStart.y; - // Limitar a posição para não sair da tela + // Limit position to keep panel within screen bounds const maxX = window.innerWidth - size.width; const maxY = window.innerHeight - size.height;
115-141
: Replace Portuguese comments with English for consistency.<div className={styles.panelContainer}> - {/* Barra de título */} + {/* Title bar */} <div ref={titleBarRef} className={styles.titleBar} onMouseDown={handleMouseDown} > <div className={styles.title}> <Icon width={16} height={16} fill="currentColor" name="analytics-outline" /> <span>{title}</span> </div> <div className={styles.controls}> <button className={styles.closeButton} onClick={onClose} title="Close Panel" data-close-button="true" > <Icon width={14} height={14} fill="currentColor" name="x-outline" /> </button> </div> </div> - {/* Conteúdo do painel */} + {/* Panel content */} <div className={styles.content}> {children} </div>
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (11)
package.json
(2 hunks)src/components/ChartVisualization/ChartVisualization.react.js
(1 hunks)src/components/ChartVisualization/ChartVisualization.scss
(1 hunks)src/components/DraggableResizablePanel/DraggableResizablePanel.react.js
(1 hunks)src/components/DraggableResizablePanel/DraggableResizablePanel.scss
(1 hunks)src/components/Toolbar/Toolbar.react.js
(3 hunks)src/components/Toolbar/Toolbar.scss
(2 hunks)src/dashboard/Data/Browser/BrowserTable.react.js
(1 hunks)src/dashboard/Data/Browser/BrowserToolbar.react.js
(3 hunks)src/dashboard/Data/Browser/DataBrowser.react.js
(12 hunks)src/dashboard/Data/Browser/Databrowser.scss
(1 hunks)
🧰 Additional context used
🧠 Learnings (4)
package.json (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#0
File: :0-0
Timestamp: 2025-05-11T16:43:27.354Z
Learning: The bcryptjs library is used in Parse Dashboard for password encryption and validation in three files: Parse-Dashboard/Authentication.js (compareSync), Parse-Dashboard/CLI/mfa.js (genSaltSync, hashSync), and src/dashboard/Settings/DashboardSettings/DashboardSettings.react.js (genSaltSync, hashSync).
src/dashboard/Data/Browser/BrowserToolbar.react.js (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#2828
File: src/dashboard/Data/Browser/Browser.react.js:1605-1607
Timestamp: 2025-05-27T12:09:47.644Z
Learning: In script execution dialogs in Parse Dashboard (specifically the `confirmExecuteScriptRows` method in `src/dashboard/Data/Browser/Browser.react.js`), individual `setState` calls to update `processedScripts` counter should be kept as-is rather than batched, because this provides real-time progress feedback to users in the dialog UI.
src/dashboard/Data/Browser/DataBrowser.react.js (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#2828
File: src/dashboard/Data/Browser/Browser.react.js:1605-1607
Timestamp: 2025-05-27T12:09:47.644Z
Learning: In script execution dialogs in Parse Dashboard (specifically the `confirmExecuteScriptRows` method in `src/dashboard/Data/Browser/Browser.react.js`), individual `setState` calls to update `processedScripts` counter should be kept as-is rather than batched, because this provides real-time progress feedback to users in the dialog UI.
src/components/DraggableResizablePanel/DraggableResizablePanel.react.js (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#2726
File: src/components/ContextMenu/ContextMenu.react.js:56-74
Timestamp: 2025-05-24T18:24:15.988Z
Learning: In the Parse Dashboard ContextMenu component, the one-time positioning calculation using hasPositioned ref works well even with window resizing and movement, so additional window resize event listeners are not necessary for menu positioning.
🔇 Additional comments (9)
package.json (2)
42-43
: LGTM! Chart dependencies are well-chosen.The charting libraries (Chart.js, react-chartjs-2, chartjs-adapter-date-fns, date-fns) are appropriate choices for implementing chart visualization functionality in a React application.
Also applies to: 50-50, 70-70
51-51
: Good practice: Using caret range for express dependency.Changing from a fixed version ("4.21.2") to a caret range ("^4.21.2") allows automatic minor and patch updates while preventing breaking major version changes.
src/dashboard/Data/Browser/BrowserTable.react.js (1)
543-543
: Correct fix: React inline styles require camelCase properties.The change from
'overflow-x'
to'overflowX'
properly follows React's inline style naming convention.src/dashboard/Data/Browser/BrowserToolbar.react.js (2)
86-87
: LGTM! Chart panel integration follows existing patterns.The new props
toggleChartPanel
andisChartPanelVisible
are properly integrated and passed down to the Toolbar component, consistent with other panel management features.Also applies to: 286-287
433-442
: Good practice: Adding explicit keys to MenuItem arrays.Wrapping MenuItem components in arrays with explicit
key
props ensures proper React reconciliation during re-renders.Also applies to: 449-449
src/components/Toolbar/Toolbar.react.js (1)
150-168
: LGTM! Chart toggle button implementation is well-structured.The chart button properly:
- Conditionally renders only when there's more than one data item
- Includes accessibility attributes (title)
- Uses appropriate icons and text
- Integrates with the existing toolbar layout via the dataControls wrapper
src/components/DraggableResizablePanel/DraggableResizablePanel.react.js (3)
74-93
: LGTM! Excellent event handling and cleanup.The useEffect implementation properly manages event listeners and prevents memory leaks. The cursor and user-select style changes during dragging enhance the user experience.
105-114
: LGTM! Well-configured ResizableBox implementation.The ResizableBox configuration is excellent with:
- Proper constraint handling for min/max dimensions
- All 8 resize handles enabled for maximum flexibility
- Clean integration with the custom drag logic
32-47
: LGTM! Robust drag initiation logic.The drag detection logic is well-implemented:
- Properly checks if click originated from title bar or its children
- Excludes close button from drag initiation using
data-close-button
attribute- Prevents default behavior and stops propagation appropriately
- Calculates correct drag offset for smooth dragging
11b2df8
to
61570e8
Compare
- Add ResizableBox for chart panel - Fixed positioning to prevent UI collapse - Toggle functionality for chart visibility - Proper state management for panel width
61570e8
to
8b3cfac
Compare
This comment was marked as resolved.
This comment was marked as resolved.
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
src/components/ChartVisualization/ChartVisualization.react.js (1)
50-378
: Extract complex chart data processing logic into separate functions.The
chartData
useMemo hook is over 300 lines long and handles multiple responsibilities. This makes the code hard to maintain and test.Consider breaking it down into smaller, focused functions:
+// Separate utility functions +const validateInputData = (selectedData, selectedCells, data) => { + if (!selectedData || selectedData.length === 0 || !selectedCells || !data || !Array.isArray(data)) { + return false; + } + // Additional validation logic... + return true; +}; + +const detectTimeSeriesData = (selectedCells, data, order, columns) => { + // Time series detection logic + // Returns { isTimeSeries, dateColumnName, dateColumnIndex } +}; + +const processTimeSeriesData = (selectedCells, data, order, dateColumnName, dateColumnIndex) => { + // Time series data processing + // Returns { type: 'timeSeries', datasets, options } +}; + +const processNumericSeriesData = (selectedCells, data, order, columns, chartType) => { + // Numeric series data processing + // Returns { type: 'numberSeries', data, options } +}; const chartData = useMemo(() => { - // 300+ lines of code... + if (!validateInputData(selectedData, selectedCells, data)) { + return null; + } + + const timeSeriesInfo = detectTimeSeriesData(selectedCells, data, order, columns); + + if (timeSeriesInfo.isTimeSeries) { + return processTimeSeriesData(selectedCells, data, order, timeSeriesInfo.dateColumnName, timeSeriesInfo.dateColumnIndex); + } else { + return processNumericSeriesData(selectedCells, data, order, columns, chartType); + } }, [selectedData, selectedCells, data, order, columns]);This refactoring would:
- Improve code maintainability and readability
- Make individual functions testable
- Follow the Single Responsibility Principle
- Make the logic flow clearer
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/components/ChartVisualization/ChartVisualization.react.js
(1 hunks)
🔇 Additional comments (2)
src/components/ChartVisualization/ChartVisualization.react.js (2)
1-39
: LGTM!Imports and Chart.js component registration are properly structured.
400-415
: Good handling of pie chart constraints.Filtering out non-positive values for pie charts is correct, as pie charts cannot represent zero or negative values. The user feedback when no valid data exists is helpful.
Addresses CodeRabbit feedback by breaking down the complex chartData useMemo hook into smaller, focused functions: - validateInputData: Handles input validation - detectTimeSeriesData: Detects time series data patterns - processTimeSeriesData: Processes time series chart data - processNumericSeriesData: Processes numeric chart data This improves maintainability, testability, and follows Single Responsibility Principle.
|
Tip For best results, initiate chat on the files or code changes. @weinStag I'll provide a comprehensive review of your chart visualization feature implementation. This is an impressive addition to the Parse Dashboard! Let me analyze the key components and overall architecture. 🎉 Overall AssessmentThis is a well-architected feature that demonstrates excellent React practices and thoughtful integration with the existing codebase. The implementation is comprehensive and production-ready. 📊 Key Strengths1. Excellent Architecture & Modularity
2. Robust Data Handling// Smart data validation and type detection
const processedData = useMemo(() => {
// Comprehensive validation and processing logic
if (!selectedData || !Array.isArray(selectedData) || selectedData.length === 0) {
return null;
}
// ... intelligent time series and numeric data detection
}, [selectedData, selectedCells, data, order, columns]); 3. Performance Optimizations
4. User Experience
🔍 Technical ReviewChartVisualization Component✅ Strengths:
✅ Well-implemented features:
DraggableResizablePanel Component✅ Strengths:
DataBrowser Integration✅ Strengths:
🎯 Minor Suggestions1. Error Boundary ConsiderationConsider wrapping the chart component in an error boundary to gracefully handle Chart.js rendering errors: // Could add error boundary for more robust error handling
<ErrorBoundary fallback={<div>Chart rendering failed</div>}>
<ChartVisualization ... />
</ErrorBoundary> 2. Accessibility EnhancementsThe implementation is already quite accessible, but consider adding:
3. Performance MonitoringFor large datasets, consider adding:
🛡️ Security & Best Practices✅ Security:
✅ Best Practices:
📱 Responsive DesignThe CSS implementations show excellent responsive behavior:
🧪 Testing ConsiderationsWhile the implementation is robust, consider adding:
🚀 Deployment ReadinessThis feature appears ready for production:
🎖️ ConclusionThis is an exemplary implementation of a complex feature. The code quality is high, the architecture is sound, and the user experience is polished. The integration with existing components is seamless, and the performance optimizations show thoughtful consideration of real-world usage. Recommendation: ✅ Approve for merge The feature is well-tested, follows best practices, and adds significant value to the Parse Dashboard without introducing technical debt. Great work on this comprehensive chart visualization feature! 🎉
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
all recommended changes reviewed by me and rabbit 🐰
Thanks for this extensive PR, I've started the CI, so you can check whether the tests pass. You can also run the tests locally. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 9
🔭 Outside diff range comments (6)
.github/ISSUE_TEMPLATE/config.yml (1)
1-9
: CR-LF line endings break YAML toolingThe file now uses Windows CRLF instead of Unix LF, which triggers YAMLlint errors and can confuse other parsers in CI. Re-commit with LF line endings or add a
.gitattributes
rule to auto-normalize..github/dependabot.yml (1)
1-15
: Normalize line endings to LFThe CRLF conversion produces identical “wrong new line character” errors in YAMLlint. Keep workflow/config files on LF to stay platform-agnostic and pass existing linters.
.github/workflows/ci-automated-check-environment.yml (1)
1-57
: Restore LF line endingsThe CRLF switch fails YAMLlint and is inconsistent with other workflow files historically stored with LF. Revert or add
.gitattributes
..github/workflows/release-prepare-monthly.yml (1)
1-44
: CRLF + trailing-space issuesThe CRLF change introduces YAMLlint errors, and there’s trailing whitespace on line 41. Please normalize to LF and strip trailing spaces.
ci/uninstallDevDeps.sh (1)
1-23
: Convert CRLF to LF & enable strict modeEvery line still contains a literal carriage-return (
\r
), triggering SC1017 for all lines.
Adopt unix line-endings and addset -euo pipefail
to fail fast.-#!/bin/bash +#!/usr/bin/env bash +set -euo pipefailscripts/before_script.sh (1)
1-9
: Fix line ending issues in shell script.The script contains Windows-style CRLF line endings that will cause issues when executed on Unix systems. Shell scripts should use Unix-style LF line endings.
Fix the line endings by running:
#!/bin/bash # Convert CRLF to LF line endings tr -d '\r' < scripts/before_script.sh > scripts/before_script.sh.tmp && mv scripts/before_script.sh.tmp scripts/before_script.shAlternatively, configure your editor to use LF line endings for shell scripts, or add a
.gitattributes
entry:*.sh text eol=lf
🧹 Nitpick comments (9)
CODE_OF_CONDUCT.md (1)
1-1
: Separate cosmetic doc edits from feature workPure-formatting changes to repository-wide policy docs are easier to track when isolated in their own commit or PR instead of being bundled with a feature implementation. Consider splitting such changes next time to keep review history focused.
.github/pull_request_template.md (2)
8-10
: Tighten wording“in reference to” → “for” is shorter and clearer.
- - [ ] I am creating this PR in reference to an [issue](…). + - [ ] This PR is for an [issue](…).
25-27
: Hyphenate plural “to-dos”Grammar checker flags this.
- - [ ] Add TODOs before merging + - [ ] Add to-dos before mergingci/uninstallDevDeps.sh (1)
17-20
: Word-splitting when uninstalling multiple packages
npm uninstall $depsToUninstall
will break on spaces. Use an array.- npm uninstall $depsToUninstall + # shellcheck disable=SC2086 # we need word-splitting here + npm uninstall ${depsToUninstall}.github/workflows/ci.yml (1)
120-123
: Shellcheck SC2116/SC2086
echo "$(echo $node_major)"
is useless; also quote$node_major
.-node_major=$(echo "${{ matrix.NODE_VERSION }}" | cut -d'.' -f1) +node_major="${{ matrix.NODE_VERSION%%.* }}".github/ISSUE_TEMPLATE/---1-report-an-issue.md (1)
45-50
: Minor style – add period after “etc.”Maintain American-English punctuation consistency.
-... Digital Ocean, etc): +... Digital Ocean, etc.):src/components/DraggableResizablePanel/DraggableResizablePanel.react.js (2)
74-93
: Optimize useEffect dependencies to prevent unnecessary re-runs.The useEffect dependencies array includes
dragStart
,position
, andsize
which don't need to trigger re-execution of the effect. OnlyisDragging
state changes should add/remove event listeners.Apply this diff to optimize the effect:
- }, [isDragging, dragStart, position, size]); + }, [isDragging]);The effect only needs to re-run when
isDragging
changes to add/remove event listeners. ThehandleMouseMove
andhandleMouseUp
functions will capture the current values due to closure scope.
116-135
: Consider adding accessibility improvements.The draggable panel could benefit from accessibility enhancements for keyboard navigation and screen readers.
Consider adding these accessibility features:
<div ref={titleBarRef} className={styles.titleBar} onMouseDown={handleMouseDown} + role="button" + tabIndex={0} + aria-label={`Drag to move ${title} panel`} + onKeyDown={(e) => { + if (e.key === 'Escape' && onClose) { + onClose(); + } + }} ><button className={styles.closeButton} onClick={onClose} title="Close Panel" data-close-button="true" + aria-label={`Close ${title} panel`} >
src/components/ChartVisualization/ChartVisualization.react.js (1)
608-635
: Consider adding accessibility improvements.The component renders well but could benefit from accessibility enhancements such as:
- ARIA labels for the chart container
- Keyboard navigation support for chart type selector
- Screen reader descriptions for chart data
<div className={styles.chartVisualization}> <div className={styles.chartControls}> {chartData.type === 'numberSeries' && ( <div className={styles.chartTypeSelector}> - <label>Chart Type:</label> + <label htmlFor="chart-type-select">Chart Type:</label> <select + id="chart-type-select" value={chartType} onChange={(e) => setChartType(e.target.value)} className={styles.select} + aria-label="Select chart type" >- <div className={styles.chartContainer}> + <div className={styles.chartContainer} role="img" aria-label={`Chart showing ${selectedData.length} selected values`}> {renderChart()} </div>
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (23)
package-lock.json
is excluded by!**/package-lock.json
src/icons/android.svg
is excluded by!**/*.svg
src/icons/apple.svg
is excluded by!**/*.svg
src/icons/arduino.svg
is excluded by!**/*.svg
src/icons/chip-close.svg
is excluded by!**/*.svg
src/icons/clone-icon.svg
is excluded by!**/*.svg
src/icons/dotnet.svg
is excluded by!**/*.svg
src/icons/drag-indicator.svg
is excluded by!**/*.svg
src/icons/heroku.svg
is excluded by!**/*.svg
src/icons/javascript.svg
is excluded by!**/*.svg
src/icons/logout.svg
is excluded by!**/*.svg
src/icons/manage-columns.svg
is excluded by!**/*.svg
src/icons/php.svg
is excluded by!**/*.svg
src/icons/pin.svg
is excluded by!**/*.svg
src/icons/question-solid.svg
is excluded by!**/*.svg
src/icons/right-outline.svg
is excluded by!**/*.svg
src/icons/rpi.svg
is excluded by!**/*.svg
src/icons/rtos.svg
is excluded by!**/*.svg
src/icons/unity.svg
is excluded by!**/*.svg
src/icons/visibility.svg
is excluded by!**/*.svg
src/icons/visibility_off.svg
is excluded by!**/*.svg
src/icons/windows.svg
is excluded by!**/*.svg
src/icons/xamarin.svg
is excluded by!**/*.svg
📒 Files selected for processing (107)
.dockerignore
(1 hunks).editorconfig
(1 hunks).github/ISSUE_TEMPLATE/---1-report-an-issue.md
(1 hunks).github/ISSUE_TEMPLATE/---2-feature-request.md
(1 hunks).github/ISSUE_TEMPLATE/config.yml
(1 hunks).github/dependabot.yml
(1 hunks).github/pull_request_template.md
(1 hunks).github/workflows/ci-automated-check-environment.yml
(1 hunks).github/workflows/ci.yml
(1 hunks).github/workflows/release-automated.yml
(1 hunks).github/workflows/release-manual-docker.yml
(1 hunks).github/workflows/release-prepare-monthly.yml
(1 hunks).gitignore
(1 hunks).npmignore
(1 hunks).nvmrc
(1 hunks).prettierrc
(1 hunks).releaserc/commit.hbs
(1 hunks).releaserc/footer.hbs
(1 hunks).releaserc/header.hbs
(1 hunks).releaserc/template.hbs
(1 hunks)CHANGELOG.md
(1 hunks)CODE_OF_CONDUCT.md
(1 hunks)CONTRIBUTING.md
(1 hunks)Dockerfile
(1 hunks)LICENSE
(1 hunks)PIG/index.html
(1 hunks)Parse-Dashboard/parse-dashboard-config.json
(1 hunks)Procfile
(1 hunks)bin/parse-dashboard
(1 hunks)changelogs/CHANGELOG_beta.md
(1 hunks)ci/uninstallDevDeps.sh
(1 hunks)docker-compose.uffizzi.yml
(1 hunks)jsconfig.json
(1 hunks)nginx-uffizzi/html/index.html
(1 hunks)nginx-uffizzi/nginx.conf
(1 hunks)package.json
(1 hunks)scripts/before_script.sh
(1 hunks)src/components/AggregationPanel/AggregationPanel.scss
(1 hunks)src/components/AppBadge/AppBadge.scss
(1 hunks)src/components/Autocomplete/Autocomplete.scss
(1 hunks)src/components/BooleanEditor/BooleanEditor.scss
(1 hunks)src/components/BrowserCell/BrowserCell.scss
(1 hunks)src/components/BrowserFilter/BrowserFilter.scss
(1 hunks)src/components/BrowserMenu/BrowserMenu.scss
(1 hunks)src/components/Button/Button.scss
(1 hunks)src/components/Calendar/Calendar.scss
(1 hunks)src/components/CascadingView/CascadingView.scss
(1 hunks)src/components/CategoryList/CategoryList.scss
(1 hunks)src/components/Chart/Chart.scss
(1 hunks)src/components/ChartVisualization/ChartVisualization.react.js
(1 hunks)src/components/ChartVisualization/ChartVisualization.scss
(1 hunks)src/components/Checkbox/Checkbox.scss
(1 hunks)src/components/Chip/Chip.scss
(1 hunks)src/components/ChromeDatePicker/ChromeDatePicker.scss
(1 hunks)src/components/ChromeDropdown/ChromeDropdown.scss
(1 hunks)src/components/CodeSnippet/CodeSnippet.css
(1 hunks)src/components/ColumnsConfiguration/ColumnConfigurationItem.scss
(1 hunks)src/components/ColumnsConfiguration/ColumnsConfiguration.scss
(1 hunks)src/components/ContextMenu/ContextMenu.scss
(1 hunks)src/components/CreditCardInput/CreditCardInput.scss
(1 hunks)src/components/DataBrowserHeader/DataBrowserHeader.scss
(1 hunks)src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss
(1 hunks)src/components/DatePicker/DatePicker.scss
(1 hunks)src/components/DateRange/DateRange.scss
(1 hunks)src/components/DateTimeEditor/DateTimeEditor.scss
(1 hunks)src/components/DateTimeInput/DateTimeInput.scss
(1 hunks)src/components/DateTimePicker/DateTimePicker.scss
(1 hunks)src/components/DonutChart/DonutChart.scss
(1 hunks)src/components/DraggableResizablePanel/DraggableResizablePanel.react.js
(1 hunks)src/components/Dropdown/Dropdown.scss
(1 hunks)src/components/EmptyState/EmptyState.scss
(1 hunks)src/components/ExplorerActiveChartButton/ExplorerActiveChartButton.scss
(1 hunks)src/components/ExplorerMenuButton/ExplorerMenuButton.scss
(1 hunks)src/components/ExplorerQueryComposer/ExplorerQueryComposer.scss
(1 hunks)src/components/ExplorerQueryPicker/ExplorerQueryPicker.scss
(1 hunks)src/components/Field/Field.scss
(1 hunks)src/components/Fieldset/Fieldset.scss
(1 hunks)src/components/FileEditor/FileEditor.scss
(1 hunks)src/components/FileInput/FileInput.scss
(1 hunks)src/components/FileTree/FileTree.scss
(1 hunks)src/components/FlowFooter/FlowFooter.scss
(1 hunks)src/components/FormButton/FormButton.scss
(1 hunks)src/components/FormNote/FormNote.scss
(1 hunks)src/components/FormTable/FormTable.scss
(1 hunks)src/components/FourOhFour/FourOhFour.scss
(1 hunks)src/components/GeoPointEditor/GeoPointEditor.scss
(1 hunks)src/components/GeoPointInput/GeoPointInput.scss
(1 hunks)src/components/InlineSubmitInput/InlineSubmitInput.scss
(1 hunks)src/components/KeyField/KeyField.scss
(1 hunks)src/components/Label/Label.scss
(1 hunks)src/components/Loader/Loader.scss
(1 hunks)src/components/LoaderContainer/LoaderContainer.scss
(1 hunks)src/components/LoaderDots/LoaderDots.scss
(1 hunks)src/components/LogView/LogView.scss
(1 hunks)src/components/LogView/LogViewEntry.scss
(1 hunks)src/components/LoginForm/LoginForm.scss
(1 hunks)src/components/LoginRow/LoginRow.scss
(1 hunks)src/components/Modal/Modal.scss
(1 hunks)src/components/MoneyInput/MoneyInput.scss
(1 hunks)src/components/MultiSelect/MultiSelect.scss
(1 hunks)src/components/NumberEditor/NumberEditor.scss
(1 hunks)src/components/PasswordStrength/PasswordStrength.scss
(1 hunks)src/components/PermissionsDialog/PermissionsDialog.scss
(1 hunks)src/components/Pill/Pill.scss
(1 hunks)src/components/PlatformCard/PlatformCard.scss
(1 hunks)src/components/Popover/Popover.scss
(1 hunks)src/components/ProtectedFieldsDialog/ProtectedFieldsDialog.scss
(1 hunks)
⛔ Files not processed due to max files limit (31)
- src/components/PushAudienceDialog/InstallationCondition.scss
- src/components/PushAudienceDialog/PushAudienceDialog.scss
- src/components/PushAudiencesSelector/PushAudiencesOption.scss
- src/components/PushAudiencesSelector/PushAudiencesSelector.scss
- src/components/PushExperimentDropdown/PushExperimentDropdown.scss
- src/components/PushOpenRate/PushOpenRate.scss
- src/components/PushPreview/PushPreview.scss
- src/components/RadioButton/RadioButton.scss
- src/components/Range/Range.scss
- src/components/SaveButton/SaveButton.scss
- src/components/ScrollHint/ScrollHint.scss
- src/components/SegmentSelect/SegmentSelect.scss
- src/components/Sidebar/Sidebar.scss
- src/components/SliderWrap/SliderWrap.scss
- src/components/SlowQueriesFilter/SlowQueriesFilter.scss
- src/components/StatusIndicator/StatusIndicator.scss
- src/components/StringEditor/StringEditor.scss
- src/components/SuggestionsList/SuggestionsList.scss
- src/components/Table/Table.scss
- src/components/TextInput/TextInput.example.scss
- src/components/TextInput/TextInput.scss
- src/components/Toggle/Toggle.scss
- src/components/Tooltip/Tooltip.scss
- src/dashboard/Account/AccountOverview.react.js
- src/dashboard/Analytics/Explorer/Explorer.scss
- src/dashboard/Analytics/Overview/Overview.scss
- src/dashboard/Analytics/Performance/Performance.scss
- src/dashboard/Analytics/Retention/Retention.scss
- src/dashboard/Analytics/SlowQueries/SlowQueries.scss
- src/dashboard/Apps/AppsIndex.scss
- src/dashboard/Dashboard.scss
✅ Files skipped from review due to trivial changes (89)
- .npmignore
- src/components/DateTimePicker/DateTimePicker.scss
- src/components/LogView/LogViewEntry.scss
- .dockerignore
- src/components/FileEditor/FileEditor.scss
- .prettierrc
- .nvmrc
- src/components/GeoPointInput/GeoPointInput.scss
- src/components/FourOhFour/FourOhFour.scss
- src/components/LoginForm/LoginForm.scss
- src/components/ExplorerQueryPicker/ExplorerQueryPicker.scss
- src/components/BooleanEditor/BooleanEditor.scss
- bin/parse-dashboard
- src/components/ExplorerQueryComposer/ExplorerQueryComposer.scss
- src/components/ExplorerActiveChartButton/ExplorerActiveChartButton.scss
- src/components/CreditCardInput/CreditCardInput.scss
- .releaserc/header.hbs
- src/components/InlineSubmitInput/InlineSubmitInput.scss
- src/components/EmptyState/EmptyState.scss
- PIG/index.html
- src/components/FileInput/FileInput.scss
- Parse-Dashboard/parse-dashboard-config.json
- src/components/Checkbox/Checkbox.scss
- src/components/MoneyInput/MoneyInput.scss
- src/components/Fieldset/Fieldset.scss
- .gitignore
- src/components/DateTimeEditor/DateTimeEditor.scss
- src/components/Label/Label.scss
- .github/ISSUE_TEMPLATE/---2-feature-request.md
- Procfile
- src/components/NumberEditor/NumberEditor.scss
- src/components/Field/Field.scss
- src/components/Autocomplete/Autocomplete.scss
- src/components/AppBadge/AppBadge.scss
- src/components/ContextMenu/ContextMenu.scss
- src/components/Dropdown/Dropdown.scss
- src/components/Chart/Chart.scss
- src/components/DatePicker/DatePicker.scss
- src/components/PasswordStrength/PasswordStrength.scss
- src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss
- src/components/DataBrowserHeader/DataBrowserHeader.scss
- src/components/Popover/Popover.scss
- src/components/ColumnsConfiguration/ColumnConfigurationItem.scss
- jsconfig.json
- src/components/BrowserMenu/BrowserMenu.scss
- src/components/LogView/LogView.scss
- src/components/LoginRow/LoginRow.scss
- .releaserc/commit.hbs
- src/components/DateTimeInput/DateTimeInput.scss
- LICENSE
- src/components/ExplorerMenuButton/ExplorerMenuButton.scss
- src/components/Chip/Chip.scss
- .releaserc/template.hbs
- src/components/Loader/Loader.scss
- src/components/FormButton/FormButton.scss
- src/components/Calendar/Calendar.scss
- nginx-uffizzi/html/index.html
- src/components/LoaderContainer/LoaderContainer.scss
- src/components/GeoPointEditor/GeoPointEditor.scss
- src/components/CategoryList/CategoryList.scss
- src/components/CascadingView/CascadingView.scss
- src/components/FileTree/FileTree.scss
- src/components/KeyField/KeyField.scss
- .editorconfig
- Dockerfile
- src/components/FlowFooter/FlowFooter.scss
- src/components/DateRange/DateRange.scss
- src/components/Pill/Pill.scss
- src/components/DonutChart/DonutChart.scss
- src/components/MultiSelect/MultiSelect.scss
- src/components/PlatformCard/PlatformCard.scss
- src/components/PermissionsDialog/PermissionsDialog.scss
- src/components/BrowserFilter/BrowserFilter.scss
- src/components/Modal/Modal.scss
- src/components/AggregationPanel/AggregationPanel.scss
- src/components/FormTable/FormTable.scss
- nginx-uffizzi/nginx.conf
- src/components/ColumnsConfiguration/ColumnsConfiguration.scss
- src/components/ChromeDatePicker/ChromeDatePicker.scss
- src/components/FormNote/FormNote.scss
- src/components/BrowserCell/BrowserCell.scss
- src/components/CodeSnippet/CodeSnippet.css
- src/components/Button/Button.scss
- src/components/LoaderDots/LoaderDots.scss
- src/components/ProtectedFieldsDialog/ProtectedFieldsDialog.scss
- CHANGELOG.md
- .releaserc/footer.hbs
- src/components/ChartVisualization/ChartVisualization.scss
- src/components/ChromeDropdown/ChromeDropdown.scss
🚧 Files skipped from review as they are similar to previous changes (1)
- package.json
🧰 Additional context used
🧠 Learnings (4)
CONTRIBUTING.md (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#0
File: :0-0
Timestamp: 2025-05-11T16:43:27.354Z
Learning: The bcryptjs library is used in Parse Dashboard for password encryption and validation in three files: Parse-Dashboard/Authentication.js (compareSync), Parse-Dashboard/CLI/mfa.js (genSaltSync, hashSync), and src/dashboard/Settings/DashboardSettings/DashboardSettings.react.js (genSaltSync, hashSync).
changelogs/CHANGELOG_beta.md (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#2828
File: src/dashboard/Data/Browser/Browser.react.js:1605-1607
Timestamp: 2025-05-27T12:09:47.644Z
Learning: In script execution dialogs in Parse Dashboard (specifically the `confirmExecuteScriptRows` method in `src/dashboard/Data/Browser/Browser.react.js`), individual `setState` calls to update `processedScripts` counter should be kept as-is rather than batched, because this provides real-time progress feedback to users in the dialog UI.
scripts/before_script.sh (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#0
File: :0-0
Timestamp: 2025-05-11T16:43:27.354Z
Learning: The bcryptjs library is used in Parse Dashboard for password encryption and validation in three files: Parse-Dashboard/Authentication.js (compareSync), Parse-Dashboard/CLI/mfa.js (genSaltSync, hashSync), and src/dashboard/Settings/DashboardSettings/DashboardSettings.react.js (genSaltSync, hashSync).
src/components/DraggableResizablePanel/DraggableResizablePanel.react.js (1)
Learnt from: mtrezza
PR: parse-community/parse-dashboard#2726
File: src/components/ContextMenu/ContextMenu.react.js:56-74
Timestamp: 2025-05-24T18:24:15.988Z
Learning: In the Parse Dashboard ContextMenu component, the one-time positioning calculation using hasPositioned ref works well even with window resizing and movement, so additional window resize event listeners are not necessary for menu positioning.
🪛 actionlint (1.7.7)
.github/workflows/release-manual-docker.yml
25-25: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
27-27: the runner of "actions/checkout@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
32-32: the runner of "docker/setup-qemu-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
34-34: the runner of "docker/setup-buildx-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
39-39: the runner of "docker/login-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
45-45: the runner of "docker/metadata-action@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
54-54: the runner of "docker/build-push-action@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
.github/workflows/ci-automated-check-environment.yml
36-36: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
.github/workflows/ci.yml
78-78: the runner of "docker/setup-qemu-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
82-82: the runner of "docker/setup-buildx-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
86-86: the runner of "docker/build-push-action@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
120-120: shellcheck reported issue in this script: SC2116:style:2:37: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'
(shellcheck)
120-120: shellcheck reported issue in this script: SC2086:info:2:44: Double quote to prevent globbing and word splitting
(shellcheck)
120-120: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
.github/workflows/release-automated.yml
11-11: the runner of "actions/checkout@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
27-27: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
43-43: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
45-45: the runner of "actions/checkout@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
50-50: the runner of "docker/setup-qemu-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
52-52: the runner of "docker/setup-buildx-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
57-57: the runner of "docker/login-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
63-63: the runner of "docker/metadata-action@v4" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
71-71: the runner of "docker/build-push-action@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
.github/workflows/release-prepare-monthly.yml
22-22: shellcheck reported issue in this script: SC2086:info:1:55: Double quote to prevent globbing and word splitting
(shellcheck)
🪛 YAMLlint (1.37.1)
.github/workflows/release-manual-docker.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
.github/ISSUE_TEMPLATE/config.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
.github/dependabot.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
.github/workflows/ci-automated-check-environment.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
.github/workflows/ci.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
[warning] 43-43: wrong indentation: expected 4 but found 5
(indentation)
[warning] 47-47: wrong indentation: expected 7 but found 6
(indentation)
.github/workflows/release-automated.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
.github/workflows/release-prepare-monthly.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
[error] 41-41: trailing spaces
(trailing-spaces)
docker-compose.uffizzi.yml
[error] 1-1: wrong new line character: expected \n
(new-lines)
[error] 12-12: trailing spaces
(trailing-spaces)
[warning] 16-16: wrong indentation: expected 4 but found 6
(indentation)
[warning] 24-24: wrong indentation: expected 8 but found 12
(indentation)
[warning] 31-31: wrong indentation: expected 4 but found 8
(indentation)
[warning] 33-33: wrong indentation: expected 10 but found 8
(indentation)
[warning] 46-46: wrong indentation: expected 4 but found 8
(indentation)
[warning] 50-50: wrong indentation: expected 10 but found 12
(indentation)
[warning] 52-52: wrong indentation: expected 10 but found 8
(indentation)
[warning] 61-61: wrong indentation: expected 10 but found 9
(indentation)
🪛 ESLint
src/components/ChartVisualization/ChartVisualization.react.js
[error] 9-9: 'React' is defined but never used.
(no-unused-vars)
[error] 23-23: 'Pie' is defined but never used.
(no-unused-vars)
[error] 496-496: 'ChartComponent' is assigned a value but never used.
(no-unused-vars)
src/components/DraggableResizablePanel/DraggableResizablePanel.react.js
[error] 8-8: 'React' is defined but never used.
(no-unused-vars)
[error] 9-9: 'ResizableBox' is defined but never used.
(no-unused-vars)
[error] 10-10: 'Icon' is defined but never used.
(no-unused-vars)
🪛 LanguageTool
.github/ISSUE_TEMPLATE/---1-report-an-issue.md
[style] ~45-~45: In American English, abbreviations like “etc.” require a period.
Context: ...e, Google Cloud, Heroku, Digital Ocean, etc): FILL_THIS_OUT
Database
- System...
(ETC_PERIOD)
[style] ~50-~50: In American English, abbreviations like “etc.” require a period.
Context: ... Atlas, mLab, AWS, Azure, Google Cloud, etc): FILL_THIS_OUT
Logs
TODOs before merging
uses: actions/checkout@v4 | ||
- name: Compose branch name for PR | ||
id: branch | ||
run: echo "::set-output name=name::ci-bump-environment" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Replace deprecated set-output
command
set-output
was removed in October 2023. Use the new $GITHUB_OUTPUT
file-writer.
-run: echo "::set-output name=name::ci-bump-environment"
+run: echo "name=ci-bump-environment" >> "$GITHUB_OUTPUT"
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
run: echo "::set-output name=name::ci-bump-environment" | |
run: echo "name=ci-bump-environment" >> "$GITHUB_OUTPUT" |
🧰 Tools
🪛 actionlint (1.7.7)
36-36: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
🤖 Prompt for AI Agents
In .github/workflows/ci-automated-check-environment.yml at line 36, replace the
deprecated `echo "::set-output name=name::ci-bump-environment"` command with the
new method of setting outputs by appending `name=ci-bump-environment` to the
file specified by the `$GITHUB_OUTPUT` environment variable. This involves
changing the command to write the output in the format
`name=ci-bump-environment` to the file path stored in `$GITHUB_OUTPUT`.
with: | ||
fetch-depth: 0 | ||
- name: Compose branch name for PR | ||
run: echo "BRANCH_NAME=build/release-$(date +'%Y%m%d')" >> $GITHUB_ENV |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Quote env variable to avoid globbing
Shellcheck warns on $GITHUB_ENV
; always quote paths.
-run: echo "BRANCH_NAME=build/release-$(date +'%Y%m%d')" >> $GITHUB_ENV
+run: echo "BRANCH_NAME=build/release-$(date +'%Y%m%d')" >> "$GITHUB_ENV"
🧰 Tools
🪛 actionlint (1.7.7)
22-22: shellcheck reported issue in this script: SC2086:info:1:55: Double quote to prevent globbing and word splitting
(shellcheck)
🤖 Prompt for AI Agents
In .github/workflows/release-prepare-monthly.yml at line 22, the environment
variable $GITHUB_ENV is used without quotes, which can cause issues with
globbing or word splitting. To fix this, wrap $GITHUB_ENV in double quotes in
the echo command to ensure the path is correctly interpreted by the shell.
# Convert exclusion list to grep pattern | ||
exclusionPattern=$(printf "|%s" "${exclusionList[@]}") | ||
exclusionPattern=${exclusionPattern:1} | ||
|
||
# Get list of all dev dependencies | ||
devDeps=$(jq -r '.devDependencies | keys | .[]' package.json) | ||
|
||
# Filter out exclusion list | ||
depsToUninstall=$(echo "$devDeps" | grep -Ev "$exclusionPattern") | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Empty exclusion list disables uninstall – logic bug
If no exclusions are passed, exclusionPattern
is empty.
grep -Ev ""
matches nothing → nothing is uninstalled.
-# Filter out exclusion list
-depsToUninstall=$(echo "$devDeps" | grep -Ev "$exclusionPattern")
+if [[ ${#exclusionList[@]} -eq 0 ]]; then
+ depsToUninstall="$devDeps"
+else
+ depsToUninstall=$(echo "$devDeps" | grep -Ev "$exclusionPattern")
+fi
🧰 Tools
🪛 Shellcheck (0.10.0)
[error] 6-6: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 7-7: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 8-8: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 9-9: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 10-10: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 11-11: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 12-12: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 13-13: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 14-14: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
[error] 15-15: Literal carriage return. Run script through tr -d '\r' .
(SC1017)
🤖 Prompt for AI Agents
In ci/uninstallDevDeps.sh around lines 6 to 15, the exclusionPattern is empty
when the exclusion list is empty, causing grep -Ev "" to match nothing and skip
uninstalling all dev dependencies. Fix this by adding a conditional check: if
the exclusion list is empty, skip the grep filter and uninstall all dev
dependencies; otherwise, build the exclusionPattern and filter accordingly.
run: | | ||
node_major=$(echo "${{ matrix.NODE_VERSION }}" | cut -d'.' -f1) | ||
echo "::set-output name=node_major::$(echo $node_major)" | ||
- name: Fix usage of insecure GitHub protocol |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
set-output
is deprecated – switch to $GITHUB_OUTPUT
-echo "::set-output name=node_major::$(echo $node_major)"
+echo "node_major=$(echo "$node_major")" >> "$GITHUB_OUTPUT"
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
run: | | |
node_major=$(echo "${{ matrix.NODE_VERSION }}" | cut -d'.' -f1) | |
echo "::set-output name=node_major::$(echo $node_major)" | |
- name: Fix usage of insecure GitHub protocol | |
run: | | |
node_major=$(echo "${{ matrix.NODE_VERSION }}" | cut -d'.' -f1) | |
echo "node_major=$(echo "$node_major")" >> "$GITHUB_OUTPUT" | |
- name: Fix usage of insecure GitHub protocol |
🧰 Tools
🪛 actionlint (1.7.7)
120-120: shellcheck reported issue in this script: SC2116:style:2:37: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'
(shellcheck)
120-120: shellcheck reported issue in this script: SC2086:info:2:44: Double quote to prevent globbing and word splitting
(shellcheck)
120-120: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
🤖 Prompt for AI Agents
In .github/workflows/ci.yml around lines 120 to 123, the usage of the deprecated
`set-output` command should be replaced. Instead of using `echo "::set-output
name=node_major::$(echo $node_major)"`, write the output to the file specified
by the environment variable `$GITHUB_OUTPUT` by appending
`node_major=$node_major` to it. This change updates the workflow to use the
current recommended method for setting outputs.
uses: docker/setup-qemu-action@v2 | ||
# Only set up QEMU if not running on native arm | ||
if: ${{ matrix.DOCKER_PLATFORM != 'linux/amd64' && matrix.RUNNER_TYPE == 'ubuntu-latest' }} | ||
- name: Set up Docker Buildx | ||
uses: docker/setup-buildx-action@v2 | ||
with: | ||
install: true | ||
- name: Build docker image | ||
uses: docker/build-push-action@v3 | ||
with: | ||
platforms: ${{ matrix.DOCKER_PLATFORM }} | ||
cache-from: type=gha |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Upgrade deprecated Docker actions
docker/setup-qemu-action@v2
, docker/setup-buildx-action@v2
, and docker/build-push-action@v3
are no longer maintained.
GitHub recommends v3 / v4 / v5 respectively.
-uses: docker/setup-qemu-action@v2
+uses: docker/setup-qemu-action@v3
...
-uses: docker/setup-buildx-action@v2
+uses: docker/setup-buildx-action@v3
...
-uses: docker/build-push-action@v3
+uses: docker/build-push-action@v5
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
uses: docker/setup-qemu-action@v2 | |
# Only set up QEMU if not running on native arm | |
if: ${{ matrix.DOCKER_PLATFORM != 'linux/amd64' && matrix.RUNNER_TYPE == 'ubuntu-latest' }} | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
with: | |
install: true | |
- name: Build docker image | |
uses: docker/build-push-action@v3 | |
with: | |
platforms: ${{ matrix.DOCKER_PLATFORM }} | |
cache-from: type=gha | |
uses: docker/setup-qemu-action@v3 | |
# Only set up QEMU if not running on native arm | |
if: ${{ matrix.DOCKER_PLATFORM != 'linux/amd64' && matrix.RUNNER_TYPE == 'ubuntu-latest' }} | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
with: | |
install: true | |
- name: Build docker image | |
uses: docker/build-push-action@v5 | |
with: | |
platforms: ${{ matrix.DOCKER_PLATFORM }} | |
cache-from: type=gha |
🧰 Tools
🪛 actionlint (1.7.7)
78-78: the runner of "docker/setup-qemu-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
82-82: the runner of "docker/setup-buildx-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
86-86: the runner of "docker/build-push-action@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
🤖 Prompt for AI Agents
In .github/workflows/ci.yml around lines 78 to 89, the Docker actions used are
deprecated. Update the action versions to the latest recommended ones by GitHub:
change docker/setup-qemu-action@v2 to v3, docker/setup-buildx-action@v2 to v4,
and docker/build-push-action@v3 to v5 to ensure continued maintenance and
support.
run: echo "::set-output name=branch_name::${GITHUB_REF#refs/*/}" | ||
- name: Checkout repository | ||
uses: actions/checkout@v2 | ||
with: | ||
ref: ${{ github.event.inputs.ref }} | ||
- name: Set up QEMU | ||
id: qemu | ||
uses: docker/setup-qemu-action@v2 | ||
- name: Set up Docker Buildx | ||
uses: docker/setup-buildx-action@v2 | ||
with: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Deprecated set-output
& outdated actions
Apply the same two fixes here:
- Replace
::set-output
with$GITHUB_OUTPUT
. - Bump
actions/checkout@v2
→@v4
,docker/*@v2
→ latest v3/v5.
🧰 Tools
🪛 actionlint (1.7.7)
25-25: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
27-27: the runner of "actions/checkout@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
32-32: the runner of "docker/setup-qemu-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
34-34: the runner of "docker/setup-buildx-action@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
🤖 Prompt for AI Agents
In .github/workflows/release-manual-docker.yml around lines 25 to 35, replace
the deprecated '::set-output' command with the recommended usage of appending
output to the file specified by the GITHUB_OUTPUT environment variable. Also,
update the action versions by changing 'actions/checkout@v2' to
'actions/checkout@v4', 'docker/setup-qemu-action@v2' to
'docker/setup-qemu-action@v3', and 'docker/setup-buildx-action@v2' to
'docker/setup-buildx-action@v5' to use the latest stable versions.
- PARSE_SERVER_MASTER_KEY=parse@master123! | ||
- PARSE_SERVER_DATABASE_URI=postgresql://postgres:password@localhost:5432/postgres | ||
- PARSE_SERVER_MOUNT_PATH=/parse |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Hard-coded master key in version control
PARSE_SERVER_MASTER_KEY=parse@master123!
is a credential and should not be committed.
Load it from a secret or environment file instead.
[security]
🧰 Tools
🪛 Checkov (3.2.334)
[MEDIUM] 35-36: Basic Auth Credentials
(CKV_SECRET_4)
🤖 Prompt for AI Agents
In docker-compose.uffizzi.yml around lines 34 to 36, the master key is
hard-coded as an environment variable, which is a security risk. Remove the
hard-coded value for PARSE_SERVER_MASTER_KEY and instead load it from a secret
management system or an external environment file that is not committed to
version control. Update the docker-compose file to reference this external
source securely.
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | ||
- name: Determine tag on current commit | ||
id: tag | ||
run: echo "::set-output name=current_tag::$(git describe --tags --abbrev=0 --exact-match || echo '')" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Replace deprecated set-output
workflow commands.
The set-output
workflow command was deprecated and should be replaced with the modern $GITHUB_OUTPUT
environment file approach.
Apply these updates:
- run: echo "::set-output name=current_tag::$(git describe --tags --abbrev=0 --exact-match || echo '')"
+ run: echo "current_tag=$(git describe --tags --abbrev=0 --exact-match || echo '')" >> $GITHUB_OUTPUT
- run: echo "::set-output name=branch_name::${GITHUB_REF#refs/*/}"
+ run: echo "branch_name=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
Also applies to: 43-43
🧰 Tools
🪛 actionlint (1.7.7)
27-27: workflow command "set-output" was deprecated. use echo "{name}={value}" >> $GITHUB_OUTPUT
instead: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
(deprecated-commands)
🤖 Prompt for AI Agents
In .github/workflows/release-automated.yml at lines 27 and 43, the use of the
deprecated set-output command should be replaced. Instead of using echo
"::set-output name=...::...", write the output value to the file specified by
the GITHUB_OUTPUT environment variable using shell redirection. Update both
lines to use this new syntax to comply with the current GitHub Actions
standards.
outputs: | ||
current_tag: ${{ steps.tag.outputs.current_tag }} | ||
steps: | ||
- uses: actions/checkout@v2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Update outdated GitHub Actions to latest versions.
The workflow uses several outdated action versions that may have security vulnerabilities and deprecated features. Update to the latest versions for better security and functionality.
Apply these updates:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
Similar updates needed for other actions:
docker/setup-qemu-action@v3
docker/setup-buildx-action@v3
docker/login-action@v3
docker/metadata-action@v5
docker/build-push-action@v5
Also applies to: 45-45
🧰 Tools
🪛 actionlint (1.7.7)
11-11: the runner of "actions/checkout@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue
(action)
🤖 Prompt for AI Agents
In .github/workflows/release-automated.yml at lines 11 and 45, the GitHub
Actions versions are outdated. Update the actions/checkout action from v2 to the
latest stable version (e.g., v3). Similarly, update docker/setup-qemu-action,
docker/setup-buildx-action, docker/login-action, docker/metadata-action, and
docker/build-push-action to their latest major versions (v3, v3, v3, v5, and v5
respectively) to ensure improved security and functionality.
- Resolved conflicts in changelogs/CHANGELOG_alpha.md by preserving both version entries - Regenerated package-lock.json after resolving conflicts - Resolved conflicts in src/components/AggregationPanel/AggregationPanel.scss - Updated Node.js engine requirements to match upstream dependencies - All lint checks and engine requirements are passing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🧹 Nitpick comments (1)
changelogs/CHANGELOG_alpha.md (1)
1661-2836
: Massive duplication from older releasesLines 1661 – end replicate release notes that are already present above.
Apart from file size growth, this will:
- break automated generators/parsers,
- mislead users about release order,
- trigger hundreds of markdown-lint warnings.
Remove the entire duplicated tail or regenerate the changelog with your release tooling.
Need a script to detect/fix duplicates automatically? Let me know.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
package-lock.json
is excluded by!**/package-lock.json
📒 Files selected for processing (3)
changelogs/CHANGELOG_alpha.md
(1 hunks)package.json
(3 hunks)src/components/AggregationPanel/AggregationPanel.scss
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- src/components/AggregationPanel/AggregationPanel.scss
- package.json
🧰 Additional context used
🪛 markdownlint-cli2 (0.17.2)
changelogs/CHANGELOG_alpha.md
1425-1425: Multiple headings with the same content
(MD024, no-duplicate-heading)
1428-1428: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1439-1439: Multiple headings with the same content
(MD024, no-duplicate-heading)
1442-1442: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1446-1446: Multiple headings with the same content
(MD024, no-duplicate-heading)
1449-1449: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1453-1453: Multiple headings with the same content
(MD024, no-duplicate-heading)
1456-1456: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1460-1460: Multiple headings with the same content
(MD024, no-duplicate-heading)
1463-1463: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1467-1467: Multiple headings with the same content
(MD024, no-duplicate-heading)
1470-1470: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1474-1474: Multiple headings with the same content
(MD024, no-duplicate-heading)
1477-1477: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1481-1481: Multiple headings with the same content
(MD024, no-duplicate-heading)
1484-1484: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1488-1488: Multiple headings with the same content
(MD024, no-duplicate-heading)
1491-1491: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1495-1495: Multiple headings with the same content
(MD024, no-duplicate-heading)
1498-1498: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1523-1523: Multiple headings with the same content
(MD024, no-duplicate-heading)
1526-1526: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1530-1530: Multiple headings with the same content
(MD024, no-duplicate-heading)
1533-1533: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1537-1537: Multiple headings with the same content
(MD024, no-duplicate-heading)
1540-1540: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1544-1544: Multiple headings with the same content
(MD024, no-duplicate-heading)
1547-1547: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1551-1551: Multiple headings with the same content
(MD024, no-duplicate-heading)
1554-1554: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1558-1558: Multiple headings with the same content
(MD024, no-duplicate-heading)
1561-1561: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1565-1565: Multiple headings with the same content
(MD024, no-duplicate-heading)
1568-1568: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1572-1572: Multiple headings with the same content
(MD024, no-duplicate-heading)
1575-1575: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1579-1579: Multiple headings with the same content
(MD024, no-duplicate-heading)
1582-1582: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1586-1586: Multiple headings with the same content
(MD024, no-duplicate-heading)
1589-1589: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1593-1593: Multiple headings with the same content
(MD024, no-duplicate-heading)
1596-1596: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1600-1600: Multiple headings with the same content
(MD024, no-duplicate-heading)
1603-1603: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1614-1614: Multiple headings with the same content
(MD024, no-duplicate-heading)
1617-1617: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1621-1621: Multiple headings with the same content
(MD024, no-duplicate-heading)
1624-1624: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1640-1640: Multiple headings with the same content
(MD024, no-duplicate-heading)
1643-1643: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1647-1647: Multiple headings with the same content
(MD024, no-duplicate-heading)
1650-1650: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1654-1654: Multiple headings with the same content
(MD024, no-duplicate-heading)
1657-1657: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1668-1668: Multiple headings with the same content
(MD024, no-duplicate-heading)
1671-1671: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1675-1675: Multiple headings with the same content
(MD024, no-duplicate-heading)
1678-1678: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1682-1682: Multiple headings with the same content
(MD024, no-duplicate-heading)
1685-1685: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1689-1689: Multiple headings with the same content
(MD024, no-duplicate-heading)
1692-1692: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1696-1696: Multiple headings with the same content
(MD024, no-duplicate-heading)
1699-1699: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1703-1703: Multiple headings with the same content
(MD024, no-duplicate-heading)
1706-1706: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1710-1710: Multiple headings with the same content
(MD024, no-duplicate-heading)
1713-1713: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1717-1717: Multiple headings with the same content
(MD024, no-duplicate-heading)
1720-1720: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1724-1724: Multiple headings with the same content
(MD024, no-duplicate-heading)
1727-1727: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1731-1731: Multiple headings with the same content
(MD024, no-duplicate-heading)
1734-1734: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1738-1738: Multiple headings with the same content
(MD024, no-duplicate-heading)
1741-1741: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1745-1745: Multiple headings with the same content
(MD024, no-duplicate-heading)
1748-1748: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1752-1752: Multiple headings with the same content
(MD024, no-duplicate-heading)
1755-1755: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1759-1759: Multiple headings with the same content
(MD024, no-duplicate-heading)
1762-1762: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1766-1766: Multiple headings with the same content
(MD024, no-duplicate-heading)
1769-1769: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1773-1773: Multiple headings with the same content
(MD024, no-duplicate-heading)
1776-1776: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1780-1780: Multiple headings with the same content
(MD024, no-duplicate-heading)
1783-1783: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1787-1787: Multiple headings with the same content
(MD024, no-duplicate-heading)
1790-1790: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1794-1794: Multiple headings with the same content
(MD024, no-duplicate-heading)
1797-1797: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1801-1801: Multiple headings with the same content
(MD024, no-duplicate-heading)
1804-1804: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1808-1808: Multiple headings with the same content
(MD024, no-duplicate-heading)
1811-1811: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1815-1815: Multiple headings with the same content
(MD024, no-duplicate-heading)
1818-1818: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1822-1822: Multiple headings with the same content
(MD024, no-duplicate-heading)
1825-1825: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1829-1829: Multiple headings with the same content
(MD024, no-duplicate-heading)
1832-1832: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1836-1836: Multiple headings with the same content
(MD024, no-duplicate-heading)
1839-1839: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1843-1843: Multiple headings with the same content
(MD024, no-duplicate-heading)
1846-1846: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1850-1850: Multiple headings with the same content
(MD024, no-duplicate-heading)
1853-1853: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1857-1857: Multiple headings with the same content
(MD024, no-duplicate-heading)
1860-1860: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1864-1864: Multiple headings with the same content
(MD024, no-duplicate-heading)
1867-1867: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1871-1871: Multiple headings with the same content
(MD024, no-duplicate-heading)
1874-1874: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1884-1884: Multiple headings with the same content
(MD024, no-duplicate-heading)
1887-1887: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1891-1891: Multiple headings with the same content
(MD024, no-duplicate-heading)
1894-1894: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1898-1898: Multiple headings with the same content
(MD024, no-duplicate-heading)
1901-1901: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1905-1905: Multiple headings with the same content
(MD024, no-duplicate-heading)
1908-1908: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1912-1912: Multiple headings with the same content
(MD024, no-duplicate-heading)
1915-1915: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1919-1919: Multiple headings with the same content
(MD024, no-duplicate-heading)
1922-1922: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1926-1926: Multiple headings with the same content
(MD024, no-duplicate-heading)
1929-1929: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1933-1933: Multiple headings with the same content
(MD024, no-duplicate-heading)
1936-1936: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1940-1940: Multiple headings with the same content
(MD024, no-duplicate-heading)
1943-1943: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1947-1947: Multiple headings with the same content
(MD024, no-duplicate-heading)
1950-1950: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1973-1973: Multiple headings with the same content
(MD024, no-duplicate-heading)
1976-1976: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1980-1980: Multiple headings with the same content
(MD024, no-duplicate-heading)
1983-1983: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1987-1987: Multiple headings with the same content
(MD024, no-duplicate-heading)
1990-1990: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1994-1994: Multiple headings with the same content
(MD024, no-duplicate-heading)
1997-1997: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2001-2001: Multiple headings with the same content
(MD024, no-duplicate-heading)
2004-2004: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2008-2008: Multiple headings with the same content
(MD024, no-duplicate-heading)
2011-2011: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2015-2015: Multiple headings with the same content
(MD024, no-duplicate-heading)
2018-2018: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2022-2022: Multiple headings with the same content
(MD024, no-duplicate-heading)
2025-2025: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2029-2029: Multiple headings with the same content
(MD024, no-duplicate-heading)
2032-2032: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2036-2036: Multiple headings with the same content
(MD024, no-duplicate-heading)
2039-2039: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2043-2043: Multiple headings with the same content
(MD024, no-duplicate-heading)
2046-2046: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2050-2050: Multiple headings with the same content
(MD024, no-duplicate-heading)
2053-2053: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2057-2057: Multiple headings with the same content
(MD024, no-duplicate-heading)
2060-2060: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2064-2064: Multiple headings with the same content
(MD024, no-duplicate-heading)
2067-2067: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2071-2071: Multiple headings with the same content
(MD024, no-duplicate-heading)
2074-2074: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2078-2078: Multiple headings with the same content
(MD024, no-duplicate-heading)
2081-2081: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2085-2085: Multiple headings with the same content
(MD024, no-duplicate-heading)
2088-2088: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2092-2092: Multiple headings with the same content
(MD024, no-duplicate-heading)
2095-2095: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2099-2099: Multiple headings with the same content
(MD024, no-duplicate-heading)
2102-2102: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2106-2106: Multiple headings with the same content
(MD024, no-duplicate-heading)
2109-2109: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2113-2113: Multiple headings with the same content
(MD024, no-duplicate-heading)
2116-2116: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2120-2120: Multiple headings with the same content
(MD024, no-duplicate-heading)
2123-2123: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2127-2127: Multiple headings with the same content
(MD024, no-duplicate-heading)
2130-2130: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2134-2134: Multiple headings with the same content
(MD024, no-duplicate-heading)
2137-2137: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2141-2141: Multiple headings with the same content
(MD024, no-duplicate-heading)
2144-2144: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2148-2148: Multiple headings with the same content
(MD024, no-duplicate-heading)
2151-2151: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2155-2155: Multiple headings with the same content
(MD024, no-duplicate-heading)
2158-2158: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2162-2162: Multiple headings with the same content
(MD024, no-duplicate-heading)
2165-2165: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2175-2175: Multiple headings with the same content
(MD024, no-duplicate-heading)
2178-2178: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2182-2182: Multiple headings with the same content
(MD024, no-duplicate-heading)
2185-2185: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2189-2189: Multiple headings with the same content
(MD024, no-duplicate-heading)
2192-2192: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2196-2196: Multiple headings with the same content
(MD024, no-duplicate-heading)
2199-2199: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2203-2203: Multiple headings with the same content
(MD024, no-duplicate-heading)
2206-2206: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2210-2210: Multiple headings with the same content
(MD024, no-duplicate-heading)
2213-2213: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2217-2217: Multiple headings with the same content
(MD024, no-duplicate-heading)
2220-2220: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2224-2224: Multiple headings with the same content
(MD024, no-duplicate-heading)
2227-2227: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2231-2231: Multiple headings with the same content
(MD024, no-duplicate-heading)
2234-2234: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2238-2238: Multiple headings with the same content
(MD024, no-duplicate-heading)
2241-2241: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2245-2245: Multiple headings with the same content
(MD024, no-duplicate-heading)
2248-2248: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2252-2252: Multiple headings with the same content
(MD024, no-duplicate-heading)
2255-2255: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2259-2259: Multiple headings with the same content
(MD024, no-duplicate-heading)
2262-2262: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2270-2270: Multiple headings with the same content
(MD024, no-duplicate-heading)
2273-2273: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2281-2281: Multiple headings with the same content
(MD024, no-duplicate-heading)
2284-2284: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2288-2288: Multiple headings with the same content
(MD024, no-duplicate-heading)
2291-2291: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2295-2295: Multiple headings with the same content
(MD024, no-duplicate-heading)
2298-2298: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2302-2302: Multiple headings with the same content
(MD024, no-duplicate-heading)
2305-2305: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2309-2309: Multiple headings with the same content
(MD024, no-duplicate-heading)
2312-2312: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2316-2316: Multiple headings with the same content
(MD024, no-duplicate-heading)
2319-2319: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2323-2323: Multiple headings with the same content
(MD024, no-duplicate-heading)
2326-2326: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2335-2335: Multiple headings with the same content
(MD024, no-duplicate-heading)
2338-2338: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2342-2342: Multiple headings with the same content
(MD024, no-duplicate-heading)
2345-2345: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2349-2349: Multiple headings with the same content
(MD024, no-duplicate-heading)
2352-2352: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2356-2356: Multiple headings with the same content
(MD024, no-duplicate-heading)
2359-2359: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2363-2363: Multiple headings with the same content
(MD024, no-duplicate-heading)
2366-2366: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2370-2370: Multiple headings with the same content
(MD024, no-duplicate-heading)
2373-2373: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2377-2377: Multiple headings with the same content
(MD024, no-duplicate-heading)
2380-2380: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2384-2384: Multiple headings with the same content
(MD024, no-duplicate-heading)
2387-2387: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2391-2391: Multiple headings with the same content
(MD024, no-duplicate-heading)
2394-2394: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2398-2398: Multiple headings with the same content
(MD024, no-duplicate-heading)
2401-2401: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2405-2405: Multiple headings with the same content
(MD024, no-duplicate-heading)
2408-2408: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2412-2412: Multiple headings with the same content
(MD024, no-duplicate-heading)
2415-2415: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2419-2419: Multiple headings with the same content
(MD024, no-duplicate-heading)
2422-2422: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2427-2427: Multiple headings with the same content
(MD024, no-duplicate-heading)
2430-2430: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2434-2434: Multiple headings with the same content
(MD024, no-duplicate-heading)
2437-2437: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2441-2441: Multiple headings with the same content
(MD024, no-duplicate-heading)
2444-2444: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2448-2448: Multiple headings with the same content
(MD024, no-duplicate-heading)
2451-2451: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2525-2525: Multiple headings with the same content
(MD024, no-duplicate-heading)
2528-2528: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2532-2532: Multiple headings with the same content
(MD024, no-duplicate-heading)
2535-2535: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2539-2539: Multiple headings with the same content
(MD024, no-duplicate-heading)
2542-2542: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2554-2554: Multiple headings with the same content
(MD024, no-duplicate-heading)
2557-2557: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2561-2561: Multiple headings with the same content
(MD024, no-duplicate-heading)
2564-2564: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2568-2568: Multiple headings with the same content
(MD024, no-duplicate-heading)
2571-2571: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2575-2575: Multiple headings with the same content
(MD024, no-duplicate-heading)
2578-2578: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2582-2582: Multiple headings with the same content
(MD024, no-duplicate-heading)
2585-2585: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2589-2589: Multiple headings with the same content
(MD024, no-duplicate-heading)
2592-2592: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2596-2596: Multiple headings with the same content
(MD024, no-duplicate-heading)
2599-2599: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2603-2603: Multiple headings with the same content
(MD024, no-duplicate-heading)
2606-2606: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2610-2610: Multiple headings with the same content
(MD024, no-duplicate-heading)
2613-2613: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2617-2617: Multiple headings with the same content
(MD024, no-duplicate-heading)
2620-2620: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2624-2624: Multiple headings with the same content
(MD024, no-duplicate-heading)
2627-2627: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2631-2631: Multiple headings with the same content
(MD024, no-duplicate-heading)
2634-2634: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2638-2638: Multiple headings with the same content
(MD024, no-duplicate-heading)
2641-2641: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2645-2645: Multiple headings with the same content
(MD024, no-duplicate-heading)
2648-2648: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2652-2652: Multiple headings with the same content
(MD024, no-duplicate-heading)
2655-2655: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2659-2659: Multiple headings with the same content
(MD024, no-duplicate-heading)
2662-2662: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2666-2666: Multiple headings with the same content
(MD024, no-duplicate-heading)
2669-2669: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2673-2673: Multiple headings with the same content
(MD024, no-duplicate-heading)
2676-2676: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2685-2685: Multiple headings with the same content
(MD024, no-duplicate-heading)
2688-2688: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2692-2692: Multiple headings with the same content
(MD024, no-duplicate-heading)
2695-2695: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2699-2699: Multiple headings with the same content
(MD024, no-duplicate-heading)
2702-2702: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2711-2711: Multiple headings with the same content
(MD024, no-duplicate-heading)
2714-2714: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2718-2718: Multiple headings with the same content
(MD024, no-duplicate-heading)
2721-2721: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2725-2725: Multiple headings with the same content
(MD024, no-duplicate-heading)
2728-2728: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2732-2732: Multiple headings with the same content
(MD024, no-duplicate-heading)
2735-2735: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2739-2739: Multiple headings with the same content
(MD024, no-duplicate-heading)
2742-2742: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2746-2746: Multiple headings with the same content
(MD024, no-duplicate-heading)
2749-2749: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2753-2753: Multiple headings with the same content
(MD024, no-duplicate-heading)
2756-2756: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2760-2760: Multiple headings with the same content
(MD024, no-duplicate-heading)
2763-2763: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2767-2767: Multiple headings with the same content
(MD024, no-duplicate-heading)
2770-2770: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2774-2774: Multiple headings with the same content
(MD024, no-duplicate-heading)
2777-2777: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2781-2781: Multiple headings with the same content
(MD024, no-duplicate-heading)
2784-2784: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2788-2788: Multiple headings with the same content
(MD024, no-duplicate-heading)
2791-2791: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2795-2795: Multiple headings with the same content
(MD024, no-duplicate-heading)
2798-2798: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2802-2802: Multiple headings with the same content
(MD024, no-duplicate-heading)
2805-2805: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2809-2809: Multiple headings with the same content
(MD024, no-duplicate-heading)
2812-2812: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2816-2816: Multiple headings with the same content
(MD024, no-duplicate-heading)
2819-2819: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
2823-2823: Multiple headings with the same content
(MD024, no-duplicate-heading)
2826-2826: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
### Bug Fixes | ||
|
||
* enabling context menu for read-only cells ([#1844](https://github.com/ParsePlatform/parse-dashboard/issues/1844)) ([a38a885](https://github.com/ParsePlatform/parse-dashboard/commit/a38a885db23e3a76c1e24f880e061dc882e1d37f)) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Heading level jumps (###
under top-level #
) violate MD001
Inside a # [version]
section, sub-headings should start at ##
, not ###
.
All new “### Bug Fixes / ### Features” lines should be demoted one level:
-### Bug Fixes
+## Bug Fixes
Apply the same for “Features”, “BREAKING CHANGES”, etc., throughout the newly added hunk.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
### Bug Fixes | |
* enabling context menu for read-only cells ([#1844](https://github.com/ParsePlatform/parse-dashboard/issues/1844)) ([a38a885](https://github.com/ParsePlatform/parse-dashboard/commit/a38a885db23e3a76c1e24f880e061dc882e1d37f)) | |
## Bug Fixes | |
* enabling context menu for read-only cells ([#1844](https://github.com/ParsePlatform/parse-dashboard/issues/1844)) ([a38a885](https://github.com/ParsePlatform/parse-dashboard/commit/a38a885db23e3a76c1e24f880e061dc882e1d37f)) |
🤖 Prompt for AI Agents
In changelogs/CHANGELOG_alpha.md around lines 1416 to 1419, the heading level
for "Bug Fixes" is incorrectly set to ### under a top-level # version heading,
violating markdown style MD001. Change all ### headings like "Bug Fixes",
"Features", and "BREAKING CHANGES" in this section to ## to maintain proper
heading hierarchy.
|
||
|
||
### Bug Fixes | ||
|
||
* Data browser does not cancel obsolete long-loading request on sorting field change ([#2839](https://github.com/parse-community/parse-dashboard/issues/2839)) ([0f85376](https://github.com/parse-community/parse-dashboard/commit/0f85376b8ae1db7ae31626896b06fdc0bd8efd75)) | ||
|
||
# [7.2.0-alpha.9](https://github.com/parse-community/parse-dashboard/compare/7.2.0-alpha.8...7.2.0-alpha.9) (2025-05-27) | ||
|
||
|
||
### Features | ||
|
||
* Add script execution on parallel batches with option `script.executionBatchSize` ([#2828](https://github.com/parse-community/parse-dashboard/issues/2828)) ([cee8b8d](https://github.com/parse-community/parse-dashboard/commit/cee8b8dd12bc44a352e43073aed65782277841dd)) | ||
|
||
# [7.2.0-alpha.8](https://github.com/parse-community/parse-dashboard/compare/7.2.0-alpha.7...7.2.0-alpha.8) (2025-05-25) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Stale content accidentally re-inserted
The blocks for 7.2.1-alpha.1
, 7.2.0-alpha.9
… up to 6.2.1-alpha.1
already exist earlier in the file.
Re-inserting them bloats the changelog and creates duplicated entries.
Please delete the redundant chunks (1433-1657) to keep a single, authoritative entry per release.
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)
1439-1439: Multiple headings with the same content
(MD024, no-duplicate-heading)
1442-1442: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
1446-1446: Multiple headings with the same content
(MD024, no-duplicate-heading)
🤖 Prompt for AI Agents
In changelogs/CHANGELOG_alpha.md around lines 1433 to 1447, there are duplicated
changelog entries for versions 7.2.1-alpha.1 through 6.2.1-alpha.1 that already
exist earlier in the file. Remove these redundant blocks from lines 1433 to 1657
to avoid bloating the changelog and ensure only one authoritative entry per
release remains.
|
||
|
||
### Bug Fixes | ||
|
||
* enabling context menu for read-only cells ([#1844](https://github.com/ParsePlatform/parse-dashboard/issues/1844)) ([a38a885](https://github.com/ParsePlatform/parse-dashboard/commit/a38a885db23e3a76c1e24f880e061dc882e1d37f)) | ||
|
||
|
||
### Features | ||
|
||
* Add clipboard icon to copy value of key-value element in info panel ([#2871](https://github.com/parse-community/parse-dashboard/issues/2871)) ([7862c42](https://github.com/parse-community/parse-dashboard/commit/7862c42e58bb8296635f3df1036eb5348f8897fa)) | ||
|
||
# [7.3.0-alpha.1](https://github.com/parse-community/parse-dashboard/compare/7.2.1...7.3.0-alpha.1) (2025-07-07) | ||
|
||
|
||
### Features | ||
|
||
* Add quick-add button to array parameter in Cloud Config ([#2866](https://github.com/parse-community/parse-dashboard/issues/2866)) ([e98ccb2](https://github.com/parse-community/parse-dashboard/commit/e98ccb236459d891b60383fa3e040b212ac07044)) | ||
|
||
## [7.2.1-alpha.1](https://github.com/parse-community/parse-dashboard/compare/7.2.0...7.2.1-alpha.1) (2025-06-02) | ||
|
||
|
||
### Bug Fixes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate release blocks & invalid heading hierarchy introduced
[7.3.0-alpha.1]
and the accompanying “### Features” subsection already exist further up in this document (lines 8–15).
Re-adding the same release block in the middle of older releases breaks chronological order, produces a huge list of markdown-lint violations (MD001, MD024) and will confuse readers & tooling that parse the changelog.
Action:
-1421 # [7.3.0-alpha.1](https://github.com/parse-community/parse-dashboard/compare/7.2.1...7.3.0-alpha.1) (2025-07-07)
-1428 ### Features
-1430 * Add quick-add button to array parameter in Cloud Config ([#2866](https://github.com/parse-community/parse-dashboard/issues/2866)) ([e98ccb2](https://github.com/parse-community/parse-dashboard/commit/e98ccb236459d891b60383fa3e040b212ac07044))
Remove the duplicated block (or, if this is meant to be 7.3.0-alpha.0
, adjust the version tag accordingly and move it to the correct chronological position at the top of the file).
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
### Bug Fixes | |
* enabling context menu for read-only cells ([#1844](https://github.com/ParsePlatform/parse-dashboard/issues/1844)) ([a38a885](https://github.com/ParsePlatform/parse-dashboard/commit/a38a885db23e3a76c1e24f880e061dc882e1d37f)) | |
### Features | |
* Add clipboard icon to copy value of key-value element in info panel ([#2871](https://github.com/parse-community/parse-dashboard/issues/2871)) ([7862c42](https://github.com/parse-community/parse-dashboard/commit/7862c42e58bb8296635f3df1036eb5348f8897fa)) | |
# [7.3.0-alpha.1](https://github.com/parse-community/parse-dashboard/compare/7.2.1...7.3.0-alpha.1) (2025-07-07) | |
### Features | |
* Add quick-add button to array parameter in Cloud Config ([#2866](https://github.com/parse-community/parse-dashboard/issues/2866)) ([e98ccb2](https://github.com/parse-community/parse-dashboard/commit/e98ccb236459d891b60383fa3e040b212ac07044)) | |
## [7.2.1-alpha.1](https://github.com/parse-community/parse-dashboard/compare/7.2.0...7.2.1-alpha.1) (2025-06-02) | |
### Bug Fixes | |
### Bug Fixes | |
* enabling context menu for read-only cells ([#1844](https://github.com/ParsePlatform/parse-dashboard/issues/1844)) ([a38a885](https://github.com/ParsePlatform/parse-dashboard/commit/a38a885db23e3a76c1e24f880e061dc882e1d37f)) | |
### Features | |
* Add clipboard icon to copy value of key-value element in info panel ([#2871](https://github.com/parse-community/parse-dashboard/issues/2871)) ([7862c42](https://github.com/parse-community/parse-dashboard/commit/7862c42e58bb8296635f3df1036eb5348f8897fa)) | |
## [7.2.1-alpha.1](https://github.com/parse-community/parse-dashboard/compare/7.2.0...7.2.1-alpha.1) (2025-06-02) | |
### Bug Fixes |
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)
1425-1425: Multiple headings with the same content
(MD024, no-duplicate-heading)
1428-1428: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
🤖 Prompt for AI Agents
In changelogs/CHANGELOG_alpha.md around lines 1414 to 1435, there is a
duplicated release block for version 7.3.0-alpha.1 with a "### Features"
subsection that already exists earlier in the file. This duplication breaks
chronological order and causes markdown-lint errors. To fix this, remove the
duplicated release block entirely or, if this block is intended to represent a
different version such as 7.3.0-alpha.0, update the version tag accordingly and
reposition the block at the top of the file to maintain correct chronological
order.
New Pull Request Checklist
Issue Description
This PR implements a comprehensive chart visualization feature for the Parse Dashboard data browser, allowing users to visualize selected table cells as interactive charts in a draggable, resizable window. The implementation also enhances the existing Sum functionality from PR #2529 to work intelligently with mixed data types.
Closes: #2583
Problem Chosen
Selected issue requesting chart visualization functionality in the data browser to help users better understand their data through visual representation instead of just raw tabular data. Users needed a way to quickly generate charts from selected cells without exporting data to external tools.
Approach & Design Decisions
Core Architecture
ChartVisualization
componentKey Features Implemented
1. Multi-Cell Selection & Chart Generation
handleCellClick
to support Shift+Click selection across multiple cellsNumber
,Date
, andString
(numeric strings) column types2. Smart Chart Type Detection
3. Interactive Chart Visualization
4. Draggable/Resizable Chart Panel
5. Enhanced Sum Functionality Integration
selectedData
: All selected data for chart visualizationnumericSelectedData
: Only numeric values for Sum operations6. Robust Error Handling & Edge Cases
Technical Implementation Details
Chart Detection Logic:
State Management:
Performance Optimizations:
Integration with Existing Features
Evidence
A comprehensive demonstration video
Core Functionality:
Advanced Features:
User Experience:
Commit Structure
The implementation was organized into logical commits:
TODOs before merging
Note on Testing: Following existing codebase patterns where most data browser components lack comprehensive unit tests. The implementation includes extensive runtime validation and error handling to ensure stability.
Summary by CodeRabbit
Summary by CodeRabbit
New Features
Enhancements
Bug Fixes
Chores