demodate.lpr 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. program demodate;
  2. {$MODE OBJFPC}
  3. {$MODESWITCH EXTERNALCLASS}
  4. uses
  5. JS,
  6. Web,
  7. Types,
  8. SysUtils,
  9. Math,
  10. ChartJS;
  11. type
  12. TChartColors = class external name 'Object' (TJSObject)
  13. public
  14. red: string;
  15. orange: string;
  16. yellow: string;
  17. green: string;
  18. blue: string;
  19. purple: string;
  20. grey: string;
  21. end;
  22. const
  23. timeFormat = 'MM/DD/YYYY HH:mm';
  24. function newDateString(const days: NativeUInt): string; assembler;
  25. asm
  26. return moment().add(days, 'd').format(pas.program.timeFormat);
  27. end;
  28. function randomScalingFactor: NativeUInt;
  29. begin
  30. Result := RandomRange(-100, 100);
  31. end;
  32. var
  33. chart: TChart;
  34. config: TChartConfiguration;
  35. barDataset: TChartBarDataset;
  36. lineDataset: TChartLineDataset;
  37. axis: TChartScaleCartesianTime;
  38. chartColors: TChartColors;
  39. colorNames: TStringDynArray;
  40. begin
  41. config := TChartConfiguration.new;
  42. config.data := TChartData.new;
  43. config.type_ := 'bar';
  44. config.data.labels := [newDateString(0), newDateString(1), newDateString(2),
  45. newDateString(3), newDateString(4), newDateString(5), newDateString(6)];
  46. config.data.datasets_ := TJSArray.new;
  47. barDataset := TChartBarDataset.new;
  48. barDataset.type_ := 'bar';
  49. barDataset.label_ := 'Dataset 1';
  50. barDataset.backgroundColor := 'rgba(255, 99, 132, 0.5)';
  51. barDataset.borderColor := 'rgb(255, 99, 132)';
  52. barDataset.data := [randomScalingFactor, randomScalingFactor,
  53. randomScalingFactor, randomScalingFactor, randomScalingFactor,
  54. randomScalingFactor, randomScalingFactor];
  55. config.data.datasets_.push(barDataset);
  56. barDataset := TChartBarDataset.new;
  57. barDataset.type_ := 'bar';
  58. barDataset.label_ := 'Dataset 2';
  59. barDataset.backgroundColor := 'rgba(54, 162, 235, 0.5)';
  60. barDataset.borderColor := 'rgb(54, 162, 235)';
  61. barDataset.data := [randomScalingFactor, randomScalingFactor,
  62. randomScalingFactor, randomScalingFactor, randomScalingFactor,
  63. randomScalingFactor, randomScalingFactor];
  64. config.data.datasets_.push(barDataset);
  65. lineDataset := TChartLineDataset.new;
  66. lineDataset.type_ := 'line';
  67. lineDataset.label_ := 'Dataset 3';
  68. lineDataset.backgroundColor := 'rgba(75, 192, 192, 0.5)';
  69. lineDataset.borderColor := 'rgb(75, 192, 192)';
  70. lineDataset.fill := False;
  71. lineDataset.data := [randomScalingFactor, randomScalingFactor,
  72. randomScalingFactor, randomScalingFactor, randomScalingFactor,
  73. randomScalingFactor, randomScalingFactor];
  74. config.data.datasets_.push(lineDataset);
  75. config.options := TChartOptions.new;
  76. config.options.title := TChartTitleConfiguration.new;
  77. config.options.title.text := 'Chart.js Combo Time Scale';
  78. config.options.scales := TChartScalesConfiguration.new;
  79. axis := TChartScaleCartesianTime.new;
  80. axis.type_ := 'time';
  81. axis.display := True;
  82. axis.time := TChartMoment.new;
  83. axis.time.parser := timeFormat;
  84. //axis.time.round := 'day';
  85. config.options.scales.xAxes := [axis];
  86. chart := TChart.new('myChart', config);
  87. chartColors := TChartColors.new;
  88. chartColors.red := 'rgb(255, 99, 132)';
  89. chartColors.orange := 'rgb(255, 159, 64)';
  90. chartColors.yellow := 'rgb(255, 205, 86)';
  91. chartColors.green := 'rgb(75, 192, 192)';
  92. chartColors.blue := 'rgb(54, 162, 235)';
  93. chartColors.purple := 'rgb(153, 102, 255)';
  94. chartColors.grey := 'rgb(201, 203, 207)';
  95. colorNames := TJSObject.keys(chartColors);
  96. document.getElementById('randomizeData').addEventListener('click',
  97. procedure
  98. begin
  99. config.data.datasets_.forEach(
  100. function(element: JSValue; index: NativeInt; array_: TJSArray): Boolean
  101. var
  102. dataset: TChartBarDataset;
  103. begin
  104. dataset := TChartBarDataset(element);
  105. dataset.data_ := dataset.data_.map(
  106. function(element: JSValue; index: NativeInt; array_: TJSArray): JSValue
  107. begin
  108. Result := randomScalingFactor;
  109. end);
  110. end);
  111. chart.update;
  112. end);
  113. document.getElementById('addDataset').addEventListener('click',
  114. procedure
  115. var
  116. newDataset: TChartBarDataset;
  117. colorName, newColor: string;
  118. index: NativeUInt;
  119. begin
  120. colorName := colorNames[config.data.datasets_.length mod Length(colorNames)];
  121. newColor := string(chartColors[colorName]);
  122. newDataset := TChartBarDataset.new;
  123. newDataset.label_ := 'Dataset ' + IntToStr(config.data.datasets_.length);
  124. newDataset.borderColor := newColor;
  125. asm
  126. newDataset.backgroundColor = Chart.helpers.color(newColor).alpha(0.5).rgbString();
  127. end;
  128. newDataset.data_ := TJSArray.new;
  129. for index := 0 to Pred(config.data.labels_.Length) do
  130. newDataset.data_.push(randomScalingFactor);
  131. config.data.datasets_.push(newDataset);
  132. chart.update;
  133. end);
  134. document.getElementById('addData').addEventListener('click',
  135. procedure
  136. var
  137. index: NativeUInt;
  138. begin
  139. if config.data.datasets_.length > 0 then
  140. config.data.labels_.push(newDateString(config.data.labels_.length));
  141. for index := 0 to Pred(config.data.datasets_.length) do
  142. TChartBarDataset(config.data.datasets[index]).data_.push(randomScalingFactor);
  143. chart.update;
  144. end);
  145. document.getElementById('removeDataset').addEventListener('click',
  146. procedure
  147. begin
  148. config.data.datasets_.splice(0, 1);
  149. chart.update;
  150. end);
  151. document.getElementById('removeData').addEventListener('click',
  152. procedure
  153. begin
  154. config.data.labels_.splice(-1, 1); // remove the label first
  155. config.data.datasets_.forEach(
  156. function(el: JSValue; datasetIndex: NativeInt; arr: TJSArray): Boolean
  157. begin
  158. TChartBarDataset(config.data.datasets_[datasetIndex]).data_.pop;
  159. Result := True;
  160. end);
  161. chart.update;
  162. end);
  163. end.