Skip to content

Commit 6281152

Browse files
author
weinStag
committed
Make the button from PR #2529 work parallel with the graphs
1 parent 61e5dae commit 6281152

File tree

2 files changed

+75
-32
lines changed

2 files changed

+75
-32
lines changed

src/components/ChartVisualization/ChartVisualization.react.js

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -60,47 +60,70 @@ const ChartVisualization = ({
6060
}
6161

6262
// Determinar se é time series de forma mais rigorosa
63-
// Time series só se: primeira coluna é data E temos múltiplas colunas E a primeira coluna É REALMENTE data
64-
const firstColumnName = order[colStart]?.name;
63+
// Time series se: temos múltiplas colunas E pelo menos uma coluna é data
6564
let isTimeSeries = false;
65+
let dateColumnName = null;
66+
let dateColumnIndex = -1;
6667

67-
// Só considerar time series se temos múltiplas colunas E a primeira coluna é explicitamente data/datetime
68-
if (colEnd > colStart && firstColumnName && columns) {
69-
// Verificar primeiro o tipo da coluna no schema
70-
const firstColumnType = columns[firstColumnName]?.type;
71-
const isDateColumn = firstColumnType === 'Date' ||
72-
/^(date|time|created|updated|when|at)$/i.test(firstColumnName) ||
73-
firstColumnName.toLowerCase().includes('date') ||
74-
firstColumnName.toLowerCase().includes('time');
75-
76-
if (isDateColumn) {
77-
// Verificar se a primeira coluna contém realmente datas válidas
78-
let dateCount = 0;
79-
const totalRows = Math.min(3, rowEnd - rowStart + 1); // Verificar até 3 linhas
80-
81-
for (let rowIndex = rowStart; rowIndex < rowStart + totalRows; rowIndex++) {
82-
const value = data[rowIndex]?.attributes[firstColumnName];
83-
if (value instanceof Date ||
84-
(typeof value === 'string' && !isNaN(Date.parse(value)) && new Date(value).getFullYear() > 1900)) {
85-
dateCount++;
86-
}
68+
// Procurar por qualquer coluna de data na seleção (não apenas a primeira)
69+
if (colEnd > colStart && columns) {
70+
for (let colIndex = colStart; colIndex <= colEnd; colIndex++) {
71+
const columnName = order[colIndex]?.name;
72+
if (!columnName) {
73+
continue;
8774
}
8875

89-
isTimeSeries = dateCount >= totalRows * 0.6; // 60% devem ser datas válidas (mais permissivo)
76+
// Verificar o tipo da coluna no schema
77+
const columnType = columns[columnName]?.type;
78+
const isDateColumn = columnType === 'Date' ||
79+
/^(date|time|created|updated|when|at)$/i.test(columnName) ||
80+
columnName.toLowerCase().includes('date') ||
81+
columnName.toLowerCase().includes('time');
82+
83+
if (isDateColumn) {
84+
// Verificar se a coluna contém realmente datas válidas
85+
let dateCount = 0;
86+
const totalRows = Math.min(3, rowEnd - rowStart + 1); // Verificar até 3 linhas
87+
88+
for (let rowIndex = rowStart; rowIndex < rowStart + totalRows; rowIndex++) {
89+
const value = data[rowIndex]?.attributes[columnName];
90+
if (value instanceof Date ||
91+
(typeof value === 'string' && !isNaN(Date.parse(value)) && new Date(value).getFullYear() > 1900)) {
92+
dateCount++;
93+
}
94+
}
95+
96+
if (dateCount >= totalRows * 0.6) { // 60% devem ser datas válidas
97+
isTimeSeries = true;
98+
dateColumnName = columnName;
99+
dateColumnIndex = colIndex;
100+
break; // Encontrou uma coluna de data válida
101+
}
102+
}
90103
}
91104
}
92105

93106
if (isTimeSeries && colEnd > colStart) {
94-
// Time Series: primeira coluna é data, outras são números
107+
// Time Series: usar a coluna de data encontrada, outras são números
95108
const datasets = [];
109+
let datasetIndex = 0;
110+
111+
// Criar um dataset para cada coluna numérica (exceto a coluna de data)
112+
for (let colIndex = colStart; colIndex <= colEnd; colIndex++) {
113+
// Pular a coluna de data
114+
if (colIndex === dateColumnIndex) {
115+
continue;
116+
}
96117

97-
// Criar um dataset para cada coluna numérica
98-
for (let colIndex = colStart + 1; colIndex <= colEnd; colIndex++) {
99118
const columnName = order[colIndex]?.name;
119+
if (!columnName) {
120+
continue;
121+
}
122+
100123
const dataPoints = [];
101124

102125
for (let rowIndex = rowStart; rowIndex <= rowEnd; rowIndex++) {
103-
const timeValue = data[rowIndex]?.attributes[firstColumnName];
126+
const timeValue = data[rowIndex]?.attributes[dateColumnName];
104127
const numericValue = data[rowIndex]?.attributes[columnName];
105128

106129
if (timeValue && typeof numericValue === 'number' && !isNaN(numericValue)) {
@@ -115,10 +138,11 @@ const ChartVisualization = ({
115138
datasets.push({
116139
label: columnName,
117140
data: dataPoints,
118-
borderColor: `hsl(${(colIndex - colStart) * 60}, 70%, 50%)`,
119-
backgroundColor: `hsla(${(colIndex - colStart) * 60}, 70%, 50%, 0.1)`,
141+
borderColor: `hsl(${datasetIndex * 60}, 70%, 50%)`,
142+
backgroundColor: `hsla(${datasetIndex * 60}, 70%, 50%, 0.1)`,
120143
tension: 0.1
121144
});
145+
datasetIndex++;
122146
}
123147
}
124148

@@ -139,7 +163,7 @@ const ChartVisualization = ({
139163
},
140164
title: {
141165
display: true,
142-
text: firstColumnName
166+
text: dateColumnName
143167
}
144168
},
145169
y: {
@@ -172,7 +196,9 @@ const ChartVisualization = ({
172196

173197
for (let colIndex = colStart; colIndex <= colEnd; colIndex++) {
174198
const columnName = order[colIndex]?.name;
175-
if (!columnName) continue;
199+
if (!columnName) {
200+
continue;
201+
}
176202

177203
// Coletar todos os valores desta coluna
178204
const columnValues = [];

src/dashboard/Data/Browser/DataBrowser.react.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export default class DataBrowser extends React.Component {
4545
selectedCells: { list: new Set(), rowStart: -1, rowEnd: -1, colStart: -1, colEnd: -1 },
4646
firstSelectedCell: null,
4747
selectedData: [],
48+
numericSelectedData: [], // Dados apenas numéricos para operações Sum
49+
hasDateInSelection: false, // Flag para detectar se há datas na seleção
4850
prevClassName: props.className,
4951
panelWidth: 300,
5052
isResizing: false,
@@ -92,6 +94,8 @@ export default class DataBrowser extends React.Component {
9294
selectedCells: { list: new Set(), rowStart: -1, rowEnd: -1, colStart: -1, colEnd: -1 },
9395
firstSelectedCell: null,
9496
selectedData: [],
97+
numericSelectedData: [],
98+
hasDateInSelection: false,
9599
});
96100
} else if (
97101
Object.keys(props.columns).length !== Object.keys(this.props.columns).length ||
@@ -581,6 +585,8 @@ export default class DataBrowser extends React.Component {
581585

582586
const newSelection = new Set();
583587
const selectedData = [];
588+
let hasDateColumns = false; // Flag para detectar se há colunas de data
589+
584590
for (let x = rowStart; x <= rowEnd; x++) {
585591
let rowData = null;
586592
if (validColumns) {
@@ -596,8 +602,10 @@ export default class DataBrowser extends React.Component {
596602
selectedData.push(value);
597603
} else if (columnType === 'Date' && value instanceof Date) {
598604
selectedData.push(value);
605+
hasDateColumns = true; // Marcar que há datas
599606
} else if (columnType === 'Date' && typeof value === 'string' && !isNaN(Date.parse(value))) {
600607
selectedData.push(new Date(value));
608+
hasDateColumns = true; // Marcar que há datas
601609
} else if (columnType === 'String' && typeof value === 'string') {
602610
// Para strings, incluir apenas se puderem ser interpretadas como números
603611
const numValue = parseFloat(value);
@@ -612,6 +620,11 @@ export default class DataBrowser extends React.Component {
612620
}
613621
}
614622

623+
// Criar array apenas com números para operações de soma (excluindo datas)
624+
const numericData = selectedData.filter(value =>
625+
typeof value === 'number' && !isNaN(value)
626+
);
627+
615628
if (newSelection.size > 1) {
616629
this.setCurrent(null);
617630
this.props.setLoadingInfoPanel(false);
@@ -625,6 +638,8 @@ export default class DataBrowser extends React.Component {
625638
},
626639
selectedObjectId: undefined,
627640
selectedData,
641+
numericSelectedData: numericData, // Dados apenas numéricos para Sum
642+
hasDateInSelection: hasDateColumns, // Flag para saber se há datas
628643
});
629644
} else {
630645
this.setCurrent({ row, col });
@@ -633,6 +648,8 @@ export default class DataBrowser extends React.Component {
633648
this.setState({
634649
selectedCells: { list: new Set(), rowStart: -1, rowEnd: -1, colStart: -1, colEnd: -1 },
635650
selectedData: [],
651+
numericSelectedData: [], // Limpar dados numéricos
652+
hasDateInSelection: false, // Limpar flag de datas
636653
current: { row, col },
637654
firstSelectedCell: clickedCellKey,
638655
});
@@ -757,7 +774,7 @@ export default class DataBrowser extends React.Component {
757774
editCloneRows={editCloneRows}
758775
onCancelPendingEditRows={onCancelPendingEditRows}
759776
order={this.state.order}
760-
selectedData={this.state.selectedData}
777+
selectedData={this.state.hasDateInSelection ? this.state.numericSelectedData : this.state.selectedData}
761778
allClasses={Object.keys(this.props.schema.data.get('classes').toObject())}
762779
allClassesSchema={this.state.allClassesSchema}
763780
togglePanel={this.togglePanelVisibility}

0 commit comments

Comments
 (0)