123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- program demodatalabelling;
- {$MODE OBJFPC}
- {$MODESWITCH EXTERNALCLASS}
- {$WARN 4501 OFF}
- uses
- JS,
- Web,
- SysUtils,
- Math,
- ChartJS;
- type
- TMyPlugin = class(TChartPluginsHook)
- public
- procedure afterDatasetsDraw(chart: TChartController;
- easingValue: NativeInt; options: TChartOptions); override;
- end;
- procedure TMyPlugin.afterDatasetsDraw(chart: TChartController;
- easingValue: NativeInt; options: TChartOptions);
- begin
- chart.data.datasets_.forEach(
- function (el: JSValue; i: NativeInt; arr: TJSArray): Boolean
- type
- TTooltipPositionFunc = reference to function: TChartTooltipItem;
- var
- ctx: TJSCanvasRenderingContext2D;
- dataset, meta: TChartBarDataset;
- position: TChartTooltipItem;
- fontSize: NativeUInt;
- begin
- meta := TChartBarDataset(chart.getDatasetMeta(i));
- if not meta.hidden then
- begin
- meta.data_.forEach(
- function (element: JSValue; index: NativeInt; arr: TJSArray): Boolean
- begin
- ctx := chart.ctx;
- ctx.fillStyle := 'rgb(0, 0, 0)';
- fontSize := 16;
- asm
- ctx.font = Chart.helpers.fontString(fontSize, 'normal',
- 'Helvetica Neue');
- end;
- ctx.textAlign := 'center';
- ctx.textBaseline := 'middle';
- position := TTooltipPositionFunc(TJSObject(element)['tooltipPosition'])();
- dataset := TChartBarDataset(el);
- ctx.fillText(IntToStr(dataset.data[index]),
- position.x, position.y - (fontSize / 2) - 5);
- Result := True;
- end);
- end;
- Result := True;
- end);
- end;
- function randomScalingFactor: NativeUInt;
- begin
- Result := RandomRange(-100, 100);
- end;
- var
- myBar: TChart;
- config: TChartConfiguration;
- barChartData: TChartData;
- dataset: TChartBarDataset;
- begin
- barChartData := TChartData.new;
- barChartData.datasets_ := TJSArray.new;
- barChartData.labels := ['January', 'February', 'March', 'April', 'May',
- 'June', 'July'];
- dataset := TChartBarDataset.new;
- dataset.type_ := 'bar';
- dataset.label_ := 'Dataset 1';
- dataset.backgroundColor := 'rgba(255, 99, 132, 0.2)';
- dataset.borderColor := 'rgb(255, 99, 132)';
- dataset.data := [randomScalingFactor, randomScalingFactor,
- randomScalingFactor, randomScalingFactor, randomScalingFactor,
- randomScalingFactor, randomScalingFactor];
- barChartData.datasets_.push(dataset);
- dataset := TChartBarDataset.new;
- dataset.type_ := 'line';
- dataset.label_ := 'Dataset 2';
- dataset.backgroundColor := 'rgba(54, 162, 235, 0.2)';
- dataset.borderColor := 'rgb(54, 162, 235)';
- dataset.data := [randomScalingFactor, randomScalingFactor,
- randomScalingFactor, randomScalingFactor, randomScalingFactor,
- randomScalingFactor, randomScalingFactor];
- barChartData.datasets_.push(dataset);
- dataset := TChartBarDataset.new;
- dataset.type_ := 'bar';
- dataset.label_ := 'Dataset 3';
- dataset.backgroundColor := 'rgba(75, 192, 192, 0.2)';
- dataset.borderColor := 'rgb(75, 192, 192)';
- dataset.data := [randomScalingFactor, randomScalingFactor,
- randomScalingFactor, randomScalingFactor, randomScalingFactor,
- randomScalingFactor, randomScalingFactor];
- barChartData.datasets_.push(dataset);
- config := TChartConfiguration.new;
- config.type_ := 'bar';
- config.data := barChartData;
- config.options := TChartOptions.new;
- config.options.responsive := True;
- config.options.title := TChartTitleConfiguration.new;
- config.options.title.display := True;
- config.options.title.text := 'Chart.js Combo Bar Line Chart';
- TChart.plugins.register(TMyPlugin.new);
- myBar := TChart.new('canvas', config);
- document.getElementById('randomizeData').addEventListener('click',
- procedure
- begin
- barChartData.datasets_.forEach(
- function (element: JSValue; index: NativeInt; arr: TJSArray): Boolean
- var
- dataset: TChartBarDataset;
- begin
- dataset := TChartBarDataset(element);
- dataset.data_ := dataset.data_.map(
- function (el: JSValue; i: NativeInt; a: TJSArray): JSValue
- begin
- Result := randomScalingFactor;
- end);
- end);
- myBar.update;
- end);
- end.
|