Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/dashboard/Data/Browser/GraphDialog.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,21 @@ export default class GraphDialog extends React.Component {
}

valid() {
const { chartType, xColumn, yColumn, valueColumn } = this.state;
const { chartType, xColumn, yColumn, valueColumn, calculatedValues } = this.state;
const hasValueColumn = Array.isArray(valueColumn) && valueColumn.length > 0;
const hasCalculatedValues = Array.isArray(calculatedValues) && calculatedValues.length > 0;
const hasValuesToDisplay = hasValueColumn || hasCalculatedValues;

switch (chartType) {
case 'pie':
case 'doughnut':
return hasValueColumn;
return hasValuesToDisplay;
case 'scatter':
return !!xColumn && !!yColumn;
case 'bar':
case 'line':
case 'radar':
return !!xColumn && hasValueColumn;
return !!xColumn && hasValuesToDisplay;
default:
return false;
}
Expand Down
54 changes: 33 additions & 21 deletions src/lib/GraphDataUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -363,14 +363,16 @@ export function processScatterData(data, xColumn, yColumn, maxPoints = 1000) {
* @returns {Object} Chart.js compatible data
*/
export function processPieData(data, valueColumn, groupByColumn, aggregationType = 'count', calculatedValues = null) {
if (!valueColumn || !Array.isArray(data)) {
if (!Array.isArray(data)) {
return null;
}

// Convert single valueColumn to array for uniform handling
const valueColumns = Array.isArray(valueColumn) ? valueColumn : [valueColumn];
const valueColumns = Array.isArray(valueColumn) ? valueColumn : (valueColumn ? [valueColumn] : []);
const hasCalculatedValues = calculatedValues && Array.isArray(calculatedValues) && calculatedValues.length > 0;

if (valueColumns.length === 0) {
// Must have at least one value column or calculated value
if (valueColumns.length === 0 && !hasCalculatedValues) {
return null;
}

Expand Down Expand Up @@ -512,14 +514,16 @@ export function processPieData(data, valueColumn, groupByColumn, aggregationType
* @returns {Object} Chart.js compatible data
*/
export function processBarLineData(data, xColumn, valueColumn, groupByColumn, aggregationType = 'count', calculatedValues = null) {
if (!xColumn || !valueColumn || !Array.isArray(data)) {
if (!xColumn || !Array.isArray(data)) {
return null;
}

// Convert single valueColumn to array for uniform handling
const valueColumns = Array.isArray(valueColumn) ? valueColumn : [valueColumn];
const valueColumns = Array.isArray(valueColumn) ? valueColumn : (valueColumn ? [valueColumn] : []);
const hasCalculatedValues = calculatedValues && Array.isArray(calculatedValues) && calculatedValues.length > 0;

if (valueColumns.length === 0) {
// Must have at least one value column or calculated value
if (valueColumns.length === 0 && !hasCalculatedValues) {
return null;
}

Expand Down Expand Up @@ -757,12 +761,16 @@ export function validateGraphConfig(config, columns) {
return { isValid: false, error: 'No configuration provided' };
}

const { chartType, xColumn, yColumn, valueColumn } = config;
const { chartType, xColumn, yColumn, valueColumn, calculatedValues } = config;

if (!chartType) {
return { isValid: false, error: 'Chart type is required' };
}

const hasValueColumn = valueColumn && (!Array.isArray(valueColumn) || valueColumn.length > 0);
const hasCalculatedValues = calculatedValues && Array.isArray(calculatedValues) && calculatedValues.length > 0;
const hasValuesToDisplay = hasValueColumn || hasCalculatedValues;

// Check required columns based on chart type
switch (chartType) {
case 'scatter':
Expand All @@ -776,14 +784,16 @@ export function validateGraphConfig(config, columns) {

case 'pie':
case 'doughnut': {
if (!valueColumn || (Array.isArray(valueColumn) && valueColumn.length === 0)) {
return { isValid: false, error: 'Pie charts require at least one value column' };
if (!hasValuesToDisplay) {
return { isValid: false, error: 'Pie charts require at least one value column or calculated value' };
}
// Validate all value columns exist
const pieValueCols = Array.isArray(valueColumn) ? valueColumn : [valueColumn];
for (const col of pieValueCols) {
if (!columns || !columns[col]) {
return { isValid: false, error: `Value column '${col}' does not exist` };
// Validate all value columns exist (only if valueColumn is specified)
if (hasValueColumn) {
const pieValueCols = Array.isArray(valueColumn) ? valueColumn : [valueColumn];
for (const col of pieValueCols) {
if (!columns || !columns[col]) {
return { isValid: false, error: `Value column '${col}' does not exist` };
}
}
}
break;
Expand All @@ -792,17 +802,19 @@ export function validateGraphConfig(config, columns) {
case 'bar':
case 'line':
case 'radar': {
if (!xColumn || !valueColumn || (Array.isArray(valueColumn) && valueColumn.length === 0)) {
return { isValid: false, error: 'Bar/line charts require both X axis and at least one value column' };
if (!xColumn || !hasValuesToDisplay) {
return { isValid: false, error: 'Bar/line charts require both X axis and at least one value column or calculated value' };
}
if (!columns || !columns[xColumn]) {
return { isValid: false, error: 'X column does not exist' };
}
// Validate all value columns exist
const barValueCols = Array.isArray(valueColumn) ? valueColumn : [valueColumn];
for (const col of barValueCols) {
if (!columns || !columns[col]) {
return { isValid: false, error: `Value column '${col}' does not exist` };
// Validate all value columns exist (only if valueColumn is specified)
if (hasValueColumn) {
const barValueCols = Array.isArray(valueColumn) ? valueColumn : [valueColumn];
for (const col of barValueCols) {
if (!columns || !columns[col]) {
return { isValid: false, error: `Value column '${col}' does not exist` };
}
}
}
break;
Expand Down
Loading