Telerik Forums
KendoReact Forum
1 answer
100 views

I have the following component. The Events are not being displayed. If I try Event by itself, it does get displayed but when I try it with line chart, it doesn't display anything and the Events don't show up in the ledger as well.

import React, { useEffect, useState } from 'react';
import axios from 'axios';
import {
  Chart,
  ChartTitle,
  ChartLegend,
  ChartCategoryAxis,
  ChartCategoryAxisItem,
  ChartSeries,
  ChartSeriesItem,
  ChartTooltip,
  ChartValueAxis,
  ChartValueAxisItem,
  ChartPane,
  ChartPanes,
} from '@progress/kendo-react-charts';
const TelemetryChart = () => {
  const [temperatureSeries, setTemperatureSeries] = useState([]);
  const [humiditySeries, setHumiditySeries] = useState([]);
  const [statePlotBands, setStatePlotBands] = useState([]);
  const [eventSeries, setEventSeries] = useState([]);
  const [eventsVisible, setEventsVisible] = useState(true);
  const [statesVisible, setStatesVisible] = useState(true);
  const [temperatureVisible, setTemperatureVisible] = useState(true);
  const [humidityVisible, setHumidityVisible] = useState(true);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  useEffect(() => {
    const fetchData = async () => {
      const testStateData = [
        { category: new Date('2024-07-19T18:22:07.339Z'), value: 'Idle' },
        { category: new Date('2024-07-19T19:22:07.339Z'), value: 'Busy' },
        { category: new Date('2024-07-19T20:22:07.339Z'), value: 'Offline' },
        { category: new Date('2024-07-19T21:22:07.339Z'), value: 'Idle' },
        { category: new Date('2024-07-19T22:22:07.339Z'), value: 'Busy' },
        { category: new Date('2024-07-19T23:22:07.339Z'), value: 'Offline' },
        { category: new Date('2024-07-19T23:25:10.188Z'), value: 'Idle' },
      ];
      const testEventData = [
        { category: new Date('2024-07-19T18:22:07.339Z'), value: 1 },
        //{ category: new Date('2024-07-19T19:22:07.339Z'), value: 1 },
        //{ category: new Date('2024-07-19T20:22:07.339Z'), value: 1 },
        { category: new Date('2024-07-19T21:22:07.339Z'), value: 1 },
        //{ category: new Date('2024-07-19T22:22:07.339Z'), value: 1 },
        //{ category: new Date('2024-07-19T23:22:07.339Z'), value: 1 },
        { category: new Date('2024-07-19T23:25:10.188Z'), value: 1 },
      ];
      try {
        console.log('Fetching data...');
        const response = await axios.get('http://localhost:5000/telemetry');
        const fetchedData = response.data;
        console.log('Fetched Data:', fetchedData);
        if (Array.isArray(fetchedData) && fetchedData.length > 0) {
          const temperatureData = fetchedData.map(item => ({
            category: item.creationDateTime ? new Date(item.creationDateTime) : new Date(),
            value: item.temperature !== null && item.temperature !== undefined ? item.temperature : 0
          }));
          const humidityData = fetchedData.map(item => ({
            category: item.creationDateTime ? new Date(item.creationDateTime) : new Date(),
            value: item.humidity !== null && item.humidity !== undefined ? item.humidity : 0
          }));
          console.log('Temperature Data:', temperatureData);
          console.log('Humidity Data:', humidityData);
          setTemperatureSeries(temperatureData);
          setHumiditySeries(humidityData);
          setStatePlotBands(generatePlotBands(testStateData));
          setEventSeries(testEventData);
        } else {
          console.error("Fetched data is not an array or is empty.");
          setTemperatureSeries([]);
          setHumiditySeries([]);
        }
      } catch (error) {
        setError("Error fetching telemetry data");
        console.error("There was an error fetching the telemetry data!", error);
      } finally {
        console.log('Data fetching completed');
        setLoading(false);
      }
    };
    fetchData();
  }, []);
  const generatePlotBands = (stateData) => {
    const stateColors = {
      Idle: 'rgba(76, 205, 131)', // Green
      Busy: 'rgba(253, 185, 19)', // Yellow
      Offline: 'rgba(219, 61, 61)' // Red
    };
    return stateData.map((item, index) => {
      const nextItem = stateData[index + 1];
      if (nextItem) {
        return {
          from: item.category,
          to: nextItem.category,
          color: stateColors[item.value],
        };
      }
      return null;
    }).filter(item => item !== null);
  };
  const handleLegendItemClick = (e) => {
    if (e.series.name === "Temperature (°C)") {
      setTemperatureVisible(!temperatureVisible);
    } else if (e.series.name === "Humidity (%)") {
      setHumidityVisible(!humidityVisible);
    } else if (e.series.name === "State") {
      setStatesVisible(!statesVisible);
    } else if (e.series.name === "Events") {
      setEventsVisible(!eventsVisible);
    }
  };
  if (loading) {
    console.log('Loading...');
    return <div>Loading...</div>;
  }
  if (error) {
    console.log('Error:', error);
    return <div>{error}</div>;
  }
  console.log('Rendering Chart with:', { temperatureSeries, humiditySeries });
  if (!Array.isArray(temperatureSeries) || !Array.isArray(humiditySeries)) {
    console.error("Temperature or Humidity data is not an array");
    return <div>Error: Invalid data structure</div>;
  }
  console.log('Temperature Series:', temperatureSeries);
  console.log('Humidity Series:', humiditySeries);
  console.log('Event Series:', eventSeries);
  return (
    <div style={{ height: '1000px', width: '100%' }}>
      <Chart          
        zoomable={{
          mousewheel: {
            //allow zoom only for X axis
            lock: 'y',
            //rate of zoom
            rate: 0.1,
          },
          //disable selection
          selection: false,
        }}
        style={{ height: '100%' }}
        onLegendItemClick={handleLegendItemClick}
      >
        <ChartTitle text="Telemetry Data" />
        <ChartLegend position="left" />
        <ChartPanes>                  
          <ChartPane name="humidityPane" height="25%" />
          <ChartPane name="temperaturePane" height="25%" />  
          <ChartPane name="eventsPane" height="24%" />
          <ChartPane name="statePane" height="16%" />
        </ChartPanes>
        <ChartCategoryAxis>
          <ChartCategoryAxisItem
            title={{ text: 'Time' }}
            baseUnit="minutes"
            labels={{
              dateFormats: { minutes: "yyyy/dd/mm HH:mm:ss" },
              rotation: "45",
              step: 10,
            }}
            plotBands={statesVisible ? statePlotBands : []}
            pane="statePane"
          />
          <ChartCategoryAxisItem
            baseUnit="minutes"
            labels={{
              dateFormats: { minutes: "yyyy/dd/mm HH:mm:ss" },
              visible: false,
              step: 10,
            }}
            visible={false}
            pane="eventsPane"
          />          
          <ChartCategoryAxisItem
            baseUnit="minutes"
            labels={{
              dateFormats: { minutes: "yyyy/dd/mm HH:mm:ss" },
              visible: false,
              step: 10,
            }}
            visible={false}
            pane="temperaturePane"
          />
          <ChartCategoryAxisItem
            baseUnit="minutes"
            labels={{
              dateFormats: { minutes: "yyyy/dd/mm HH:mm:ss" },
              visible: false,
              step: 10,
            }}
            visible={false}
            pane="humidityPane"
          />
        </ChartCategoryAxis>
        <ChartValueAxis>
          <ChartValueAxisItem name="humidityAxis" title={{ text: 'Humidity (%)' }} min={0} max={1} pane="humidityPane" />
          <ChartValueAxisItem name="temperatureAxis" title={{ text: 'Temperature (°C)' }} min={0} max={40} pane="temperaturePane" />
          <ChartValueAxisItem name="eventsAxis" title={{ text: 'Events' }} min={0} max={2} pane="eventsPane" />
          <ChartValueAxisItem name="stateAxis" title={{ text: 'State' }} visible={false} pane="statePane"
            majorGridLines={{ visible: false }}
            minorGridLines={{ visible: false }} />
        </ChartValueAxis>
        <ChartSeries>
          <ChartSeriesItem
            type="line"
            data={humiditySeries}
            name="Humidity (%)"
            field="value"
            categoryField="category"
            axis="humidityAxis"
            markers={{ visible: false }}
            pane="humidityPane"
            visible={humidityVisible}
          />
          <ChartSeriesItem
            type="line"
            data={temperatureSeries}
            name="Temperature (°C)"
            field="value"
            categoryField="category"
            axis="temperatureAxis"
            markers={{ visible: false }}
            pane="temperaturePane"
            visible={temperatureVisible}
          />          
          <ChartSeriesItem
            type="scatter"
            data={eventSeries}
            name="Events"
            xField="category"
            yField="value"
            markers={{
              size: 20,
              background: "blue",
              border: { color: "blue", width: 2 }
            }}
            pane="eventsPane"
            visible={eventsVisible}
          />
          <ChartSeriesItem
            type="line"
            data={[]}
            name="State"
            color="rgba(40, 67, 135)"
            visible={statesVisible}
          />
        </ChartSeries>
        <ChartTooltip />
      </Chart>
    </div>
  );
};
export default TelemetryChart;
Vessy
Telerik team
 answered on 02 Aug 2024
1 answer
106 views

Hi there! We are using GridColumnMenuCheckboxFilter to filter a numeric column for a field called "fruits" in our data grid. The filtering works fine, but we would like to see the checkbox filter menu display a different label name, conditionally.

For example, if we have the checkbox filter menu showing the options(checkbox label) as numeric values -1, 0, 1. Please see attached image.

Is it possible to update the text for the checkbox label? like if the value for "fruits" = -1 then display the label as "Apples",  if the value for "fruits" = 0 then display the label as "Oranges",  or if the value for "fruits" = 1 display as "Bananas", etc?

Konstantin Dikov
Telerik team
 answered on 01 Aug 2024
1 answer
90 views
I am using combobox inside the kendo grid. the problem i am facing is when i select the combobox & if i click outside the grid or inside the empty space in the grid, the combo box is still in active state. i want to remove the active state of the combobox after clicking outside the grid or in the empty space of the grid 
Vessy
Telerik team
 answered on 01 Aug 2024
1 answer
84 views
If the filter is applied, it has found the elements and the number of elements does not exceed the visible area - the scrollbar disappears, it's ok. But if the filter is applied and it hasn't found the elements - the scrollbar doesn't disappear. The expected behavior in this case is to reset the scrollbar, since there are no found items and the grid list is empty.
Are there any planned changes to this case?
Konstantin Dikov
Telerik team
 answered on 01 Aug 2024
1 answer
130 views

I am encountering an issue with saving and restoring the zoom state in the Kendo React Charts component. The problem arises when I attempt to save the zoom level and reapply it whenever the chart data updates. Although the zoom state values are captured correctly, the chart resets to its default zoom level after each zoom interaction.

This is the parent Component:

function Monitor () {
  const { chartDataByParameter, treshholdRangeData } = useTable()
  const [zoomState, setZoomState] = useState({})

  const handleZoomChange = (newZoomState) => {
    setZoomState(newZoomState)
  }

  return 
          <ChartComponent dataProps={chartDataByParameter} rangeData={treshholdRangeData} zoomState={zoomState} onZoomChange={handleZoomChange} />
}

export default Monitor


And this is the Chart Component. Note that i have two axis because is the only way I found to deal with negative values.

function ChartComponent ({ dataProps, rangeData, zoomState, onZoomChange }) {
  const chartRef = useRef(null)

  useEffect(() => {
    setIsChartLoading(false)
    if (chartRef.current && chartRef.current.kendoChart) {
      chartRef.current.kendoChart.setOptions({
        categoryAxis: {
          min: zoomState.xAxis.min,
          max: zoomState.xAxis.max
        },
        valueAxis: {
          min: zoomState.valueAxis.min,
          max: zoomState.valueAxis.max
        }
      })
    }
  }, [dataProps])

  const handleZoom = (event) => {
    const newZoomState = {
      xAxis: {
        min: event.axisRanges?.xAxis?.min,
        max: event.axisRanges?.xAxis?.max
      },
      valueAxis: {
        min: event.axisRanges?.valueAxis?.min,
        max: event.axisRanges?.valueAxis?.max
      }
    }
    onZoomChange(newZoomState)
  }

  const colors = ['#718ad5', '#424242', '#ffe162', '#4cd180', '#8634b7']
  const categoryAxisMaxDivisions = 10


  return (
<div style={{ height: '55vh, width: '100%' }}>
      {(dataProps && dataProps.length > 0) || (rangeData && rangeData.length > 0)
        ? (
        <Chart
          ref={chartRef}
          style={{ height: '100%', width: '100%' }}
          pannable={true}
          zoomable={true}
          transitions={false}
          className='custom-chart'
          onZoom={handleZoom}
        >
          <ChartLegend position="top" />
          <ChartCategoryAxis>
            <ChartCategoryAxisItem name="xAxis" maxDivisions={categoryAxisMaxDivisions} visible={false} />
            <ChartCategoryAxisItem name="xAxis2" maxDivisions={categoryAxisMaxDivisions} />
          </ChartCategoryAxis>
          <ChartSeries>
            {dataProps.map((item, index) => (
              <ChartSeriesItem
                key={index}
                type="line"
                data={item}
                field="value"
                categoryField="category"
                name={item[0].parameter}
                style="smooth"
                color={item[0].parameter === 'Anomalies' ? '#d75d5d' : colors[index]}
                width={item[0].parameter === 'Anomalies' ? 0 : 2}
                legendItem={item[0].parameter === 'Anomalies' ? customLegendItem : customLegendItem2}
                tooltip={{ visible: true, render: lineTooltipRender }}
              />
            ))}
            {rangeData.length > 0 && (
              <ChartSeriesItem
                type="rangeArea"
                data={rangeData}
                fromField="min"
                toField="max"
                categoryField="Datetime"
                name="Anomaly sensitivity"
                color='#80cf63'
              >
                <ChartTooltip render={rangeTooltipRender} />
              </ChartSeriesItem>
            )}
          </ChartSeries>
          <ChartValueAxis>
            <ChartValueAxisItem
              name="valueAxis"
              axisCrossingValue={[0, Number.NEGATIVE_INFINITY]}
              labels={{ format: (value) => value.toFixed(2) }}
            />
          </ChartValueAxis>
        </Chart>
          )
        : (
        <div style={{ height: chartHeight, width: '100%' }}></div>
          )}
    </div>
  )
}
}

const MemoizedChartComponent = React.memo(ChartComponent)
export default MemoizedChartComponent

Thank you in advance!

Xavier

Konstantin Dikov
Telerik team
 answered on 31 Jul 2024
2 answers
157 views

Hi all,

In the interest of being thorough, I'm watching Chapter 2: Getting Started, Video #3: Running the API and demo application. I've cloned the https://github.com/telerik/rpsapi.git repository to a local folder, run npm install, and then run npm run dev.

When I attempt to run the app on http://localhost:8080, I don't get a site - even though the ts-node-dev server software appears to be running.

Attempts to make Postman GET requests of http://localhost:8080 yield 404 errors.

What am I doing wrong?

Dianna Perry
Top achievements
Rank 2
Iron
 answered on 29 Jul 2024
1 answer
69 views

I need a chart with x-axis as time and multiple y-axis stacked. One temp which is a range from 0 to 10 and humidity which is from 0 to 1. 

When I try to use ChartPane, I keep getting exception in my react code.

Here is the error:

ErrorBoundary.js:16 ErrorBoundary caught an error TypeError: Cannot read properties of undefined (reading 'map')
    at Object.collectionConfigurationItem (reducer.mjs:41:1)
    at u (reducer.mjs:9:1)
    at Object.c [as dispatch] (store.mjs:13:1)
    at s.dispatch (ConfigurationComponent.mjs:29:1)
    at s.componentDidMount (ConfigurationComponent.mjs:22:1)
    at invokeLayoutEffectMountInDEV (react-dom.development.js:25172:1)
    at invokeEffectsInDev (react-dom.development.js:27390:1)
    at commitDoubleInvokeEffectsInDEV (react-dom.development.js:27366:1)
    at commitRootImpl (react-dom.development.js:26922:1)
    at commitRoot (react-dom.development.js:26721:1) Object

 

Here is my component 

import * as React from 'react';
import {
  Chart,
  ChartSeries,
  ChartSeriesItem,
  ChartValueAxis,
  ChartValueAxisItem,
  ChartCategoryAxis,
  ChartCategoryAxisItem,
  ChartPane
} from '@progress/kendo-react-charts';
// Sample data
const categories = ['04/01/2024', '05/01/2024', '06/01/2024', '07/01/2024'];
const temperatureData = [20, 25, 30, 35];
const humidityData = [0.5, 0.6, 0.7, 0.8];
const MultiPaneChart = () => {
  return (
    <Chart>
      <ChartCategoryAxis>
        <ChartCategoryAxisItem categories={categories} />
      </ChartCategoryAxis>
      <ChartPane name="temperaturePane" />
      <ChartPane name="humidityPane" />
      <ChartValueAxis>
        <ChartValueAxisItem
          name="temperature"
          pane="temperaturePane"
          min={0}
          max={40}
          title={{ text: 'Temperature' }}
        />
        <ChartValueAxisItem
          name="humidity"
          pane="humidityPane"
          min={0}
          max={1}
          title={{ text: 'Humidity' }}
        />
      </ChartValueAxis>
      <ChartSeries>
        <ChartSeriesItem
          type="line"
          data={temperatureData}
          name="Temperature"
          axis="temperature"
          pane="temperaturePane"
          color="red"
        />
        <ChartSeriesItem
          type="line"
          data={humidityData}
          name="Humidity"
          axis="humidity"
          pane="humidityPane"
          color="blue"
        />
      </ChartSeries>
    </Chart>
  );
};

exportdefaultMultiPaneChart;

Vessy
Telerik team
 answered on 25 Jul 2024
1 answer
102 views
Hi i'm using kendo react gantt chart in one of my project, and i make a few custom component like the edit form, the week view with custom header cell

in a single tab its working fine, however, as soon as its hooked up with websocket connection and someone open the same page/component, it will start saying its invalid date, any idea why its happening?
is it the websocket that changed the valid date into invalid or the gantt chart is not compatible for multi user?

thanks
Konstantin Dikov
Telerik team
 answered on 25 Jul 2024
1 answer
110 views

Hello,

Can I open an external URL in a dialog box using Kendo React controls?

Thanks!

 

Yanko
Telerik team
 answered on 25 Jul 2024
1 answer
396 views

I'm having a similar issue to https://www.telerik.com/forums/license-activation-failed-for-react-project

For my deployed app, I'm getting this error in the console:

License activation failed for @progress/kendo-react-intl
No license found.
See https://www.telerik.com/kendo-react-ui/components/my-license/ for more information.

I've tried to fix it by doing:

- remove node_modules and package.lock.json

- Make a new npm install and activation

but this hasn't fixed the issue. I don't see the warning locally, only after it has been deployed. I have the following in my azure pipeline:

stages:
- stage: Test
  displayName: Test
  jobs:
  - job: Test
    displayName: Perform tests
    steps:
    - task: NodeTool@0
      inputs:
        versionSpec: '18.x'
      displayName: 'Install Node.js'

    - script: |
        npm ci
      displayName: 'Install dependencies'
...
    
    - script: |
        npx kendo-ui-license activate
      displayName: "Activate Kendo UI License"

    - script: |
        npm run build
      displayName: 'Build'

and can see the activation working when running the pipeline:

(INFO) Kendo UI: KENDO_UI_LICENSE environment variable not set
(INFO) Kendo UI: Reading license from "/agent/_work/2/s/kendo-ui-license.txt"...
(INFO) Kendo UI: License imported successfully.
Any idea what could be wrong?
Vessy
Telerik team
 answered on 24 Jul 2024
Narrow your results
Selected tags
Tags
+? more
Top users last month
Top achievements
Rank 1
Iron
Iron
Iron
Rob
Top achievements
Rank 3
Bronze
Bronze
Iron
ivory
Top achievements
Rank 1
Iron
Nurik
Top achievements
Rank 2
Iron
Iron
YF
Top achievements
Rank 1
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Top achievements
Rank 1
Iron
Iron
Iron
Rob
Top achievements
Rank 3
Bronze
Bronze
Iron
ivory
Top achievements
Rank 1
Iron
Nurik
Top achievements
Rank 2
Iron
Iron
YF
Top achievements
Rank 1
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?