@itwin/imodel-components-react 4.0.0-dev.12 → 4.0.0-dev.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/lib/cjs/imodel-components-react/UiIModelComponents.d.ts +28 -28
  2. package/lib/cjs/imodel-components-react/UiIModelComponents.js +75 -77
  3. package/lib/cjs/imodel-components-react/UiIModelComponents.js.map +1 -1
  4. package/lib/cjs/imodel-components-react/color/AlphaSlider.d.ts +36 -36
  5. package/lib/cjs/imodel-components-react/color/AlphaSlider.js +190 -186
  6. package/lib/cjs/imodel-components-react/color/AlphaSlider.js.map +1 -1
  7. package/lib/cjs/imodel-components-react/color/AlphaSlider.scss +63 -63
  8. package/lib/cjs/imodel-components-react/color/ColorPickerButton.d.ts +37 -37
  9. package/lib/cjs/imodel-components-react/color/ColorPickerButton.js +112 -108
  10. package/lib/cjs/imodel-components-react/color/ColorPickerButton.js.map +1 -1
  11. package/lib/cjs/imodel-components-react/color/ColorPickerButton.scss +90 -90
  12. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.d.ts +23 -23
  13. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.js +78 -74
  14. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.js.map +1 -1
  15. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.d.ts +21 -21
  16. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.js +149 -145
  17. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.js.map +1 -1
  18. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.scss +93 -93
  19. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.d.ts +44 -44
  20. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.js +143 -139
  21. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.js.map +1 -1
  22. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.scss +62 -62
  23. package/lib/cjs/imodel-components-react/color/HueSlider.d.ts +22 -22
  24. package/lib/cjs/imodel-components-react/color/HueSlider.js +203 -199
  25. package/lib/cjs/imodel-components-react/color/HueSlider.js.map +1 -1
  26. package/lib/cjs/imodel-components-react/color/HueSlider.scss +61 -61
  27. package/lib/cjs/imodel-components-react/color/SaturationPicker.d.ts +20 -20
  28. package/lib/cjs/imodel-components-react/color/SaturationPicker.js +217 -213
  29. package/lib/cjs/imodel-components-react/color/SaturationPicker.js.map +1 -1
  30. package/lib/cjs/imodel-components-react/color/SaturationPicker.scss +35 -35
  31. package/lib/cjs/imodel-components-react/color/Swatch.d.ts +22 -22
  32. package/lib/cjs/imodel-components-react/color/Swatch.js +64 -60
  33. package/lib/cjs/imodel-components-react/color/Swatch.js.map +1 -1
  34. package/lib/cjs/imodel-components-react/color/Swatch.scss +22 -22
  35. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.d.ts +6 -6
  36. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.js +23 -23
  37. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.js.map +1 -1
  38. package/lib/cjs/imodel-components-react/editors/ColorEditor.d.ts +44 -44
  39. package/lib/cjs/imodel-components-react/editors/ColorEditor.js +155 -151
  40. package/lib/cjs/imodel-components-react/editors/ColorEditor.js.map +1 -1
  41. package/lib/cjs/imodel-components-react/editors/ColorEditor.scss +18 -18
  42. package/lib/cjs/imodel-components-react/editors/WeightEditor.d.ts +47 -47
  43. package/lib/cjs/imodel-components-react/editors/WeightEditor.js +164 -160
  44. package/lib/cjs/imodel-components-react/editors/WeightEditor.js.map +1 -1
  45. package/lib/cjs/imodel-components-react/editors/WeightEditor.scss +16 -16
  46. package/lib/cjs/imodel-components-react/inputs/QuantityInput.d.ts +25 -25
  47. package/lib/cjs/imodel-components-react/inputs/QuantityInput.js +100 -96
  48. package/lib/cjs/imodel-components-react/inputs/QuantityInput.js.map +1 -1
  49. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.d.ts +44 -44
  50. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.d.ts.map +1 -1
  51. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js +272 -268
  52. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
  53. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.scss +106 -106
  54. package/lib/cjs/imodel-components-react/lineweight/Swatch.d.ts +33 -33
  55. package/lib/cjs/imodel-components-react/lineweight/Swatch.js +89 -85
  56. package/lib/cjs/imodel-components-react/lineweight/Swatch.js.map +1 -1
  57. package/lib/cjs/imodel-components-react/lineweight/Swatch.scss +48 -48
  58. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.d.ts +60 -60
  59. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.js +163 -159
  60. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.js.map +1 -1
  61. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.scss +51 -52
  62. package/lib/cjs/imodel-components-react/navigationaids/Cube.d.ts +45 -45
  63. package/lib/cjs/imodel-components-react/navigationaids/Cube.js +131 -127
  64. package/lib/cjs/imodel-components-react/navigationaids/Cube.js.map +1 -1
  65. package/lib/cjs/imodel-components-react/navigationaids/Cube.scss +19 -19
  66. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.d.ts +175 -174
  67. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.d.ts.map +1 -1
  68. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js +650 -638
  69. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
  70. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.scss +178 -178
  71. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts +145 -145
  72. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.js +657 -653
  73. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.js.map +1 -1
  74. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.scss +135 -135
  75. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.d.ts +26 -26
  76. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js +103 -99
  77. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
  78. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.scss +59 -63
  79. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.d.ts +17 -17
  80. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js +56 -53
  81. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  82. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.d.ts +18 -18
  83. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js +88 -84
  84. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
  85. package/lib/cjs/imodel-components-react/quantityformat/FormatType.d.ts +17 -17
  86. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js +89 -86
  87. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  88. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.d.ts +17 -17
  89. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js +112 -109
  90. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  91. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.d.ts +19 -19
  92. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js +133 -133
  93. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
  94. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.d.ts +21 -21
  95. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js +187 -184
  96. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  97. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.d.ts +22 -22
  98. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.js +149 -145
  99. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.js.map +1 -1
  100. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.d.ts +17 -17
  101. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.js +63 -59
  102. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.js.map +1 -1
  103. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.d.ts +17 -17
  104. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.js +51 -47
  105. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.js.map +1 -1
  106. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.d.ts +16 -16
  107. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.js +58 -54
  108. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.js.map +1 -1
  109. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.d.ts +18 -18
  110. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.js +52 -48
  111. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.js.map +1 -1
  112. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.d.ts +17 -17
  113. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.js +54 -50
  114. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.js.map +1 -1
  115. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.d.ts +17 -17
  116. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js +62 -58
  117. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js.map +1 -1
  118. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.d.ts +17 -17
  119. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.js +51 -47
  120. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.js.map +1 -1
  121. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.d.ts +17 -17
  122. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.js +60 -56
  123. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.js.map +1 -1
  124. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts +17 -17
  125. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +98 -95
  126. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  127. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.d.ts +23 -23
  128. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.js +123 -119
  129. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.js.map +1 -1
  130. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.d.ts +52 -52
  131. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.js +143 -143
  132. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.js.map +1 -1
  133. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.d.ts +31 -31
  134. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.js +69 -69
  135. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.js.map +1 -1
  136. package/lib/cjs/imodel-components-react/timeline/InlineEdit.d.ts +27 -27
  137. package/lib/cjs/imodel-components-react/timeline/InlineEdit.js +85 -81
  138. package/lib/cjs/imodel-components-react/timeline/InlineEdit.js.map +1 -1
  139. package/lib/cjs/imodel-components-react/timeline/InlineEdit.scss +26 -26
  140. package/lib/cjs/imodel-components-react/timeline/PlayerButton.d.ts +33 -33
  141. package/lib/cjs/imodel-components-react/timeline/PlayerButton.js +99 -95
  142. package/lib/cjs/imodel-components-react/timeline/PlayerButton.js.map +1 -1
  143. package/lib/cjs/imodel-components-react/timeline/PlayerButton.scss +28 -28
  144. package/lib/cjs/imodel-components-react/timeline/Scrubber.d.ts +54 -54
  145. package/lib/cjs/imodel-components-react/timeline/Scrubber.js +195 -191
  146. package/lib/cjs/imodel-components-react/timeline/Scrubber.js.map +1 -1
  147. package/lib/cjs/imodel-components-react/timeline/Scrubber.scss +105 -105
  148. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.d.ts +77 -77
  149. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.js +432 -428
  150. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.js.map +1 -1
  151. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.scss +359 -359
  152. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.d.ts +15 -15
  153. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.js +58 -54
  154. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.js.map +1 -1
  155. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.scss +39 -39
  156. package/lib/cjs/imodel-components-react/timeline/Timeline.scss +164 -164
  157. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts +130 -133
  158. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  159. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js +398 -365
  160. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  161. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.scss +178 -161
  162. package/lib/cjs/imodel-components-react/timeline/interfaces.d.ts +174 -174
  163. package/lib/cjs/imodel-components-react/timeline/interfaces.d.ts.map +1 -1
  164. package/lib/cjs/imodel-components-react/timeline/interfaces.js +45 -45
  165. package/lib/cjs/imodel-components-react/timeline/interfaces.js.map +1 -1
  166. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.d.ts +42 -42
  167. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  168. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js +276 -274
  169. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  170. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.d.ts +106 -106
  171. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js +105 -105
  172. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  173. package/lib/cjs/imodel-components-react.d.ts +82 -82
  174. package/lib/cjs/imodel-components-react.js +105 -101
  175. package/lib/cjs/imodel-components-react.js.map +1 -1
  176. package/lib/esm/imodel-components-react/UiIModelComponents.d.ts +28 -28
  177. package/lib/esm/imodel-components-react/UiIModelComponents.js +72 -73
  178. package/lib/esm/imodel-components-react/UiIModelComponents.js.map +1 -1
  179. package/lib/esm/imodel-components-react/color/AlphaSlider.d.ts +36 -36
  180. package/lib/esm/imodel-components-react/color/AlphaSlider.js +160 -160
  181. package/lib/esm/imodel-components-react/color/AlphaSlider.js.map +1 -1
  182. package/lib/esm/imodel-components-react/color/AlphaSlider.scss +63 -63
  183. package/lib/esm/imodel-components-react/color/ColorPickerButton.d.ts +37 -37
  184. package/lib/esm/imodel-components-react/color/ColorPickerButton.js +83 -83
  185. package/lib/esm/imodel-components-react/color/ColorPickerButton.js.map +1 -1
  186. package/lib/esm/imodel-components-react/color/ColorPickerButton.scss +90 -90
  187. package/lib/esm/imodel-components-react/color/ColorPickerDialog.d.ts +23 -23
  188. package/lib/esm/imodel-components-react/color/ColorPickerDialog.js +51 -51
  189. package/lib/esm/imodel-components-react/color/ColorPickerDialog.js.map +1 -1
  190. package/lib/esm/imodel-components-react/color/ColorPickerPanel.d.ts +21 -21
  191. package/lib/esm/imodel-components-react/color/ColorPickerPanel.js +122 -122
  192. package/lib/esm/imodel-components-react/color/ColorPickerPanel.js.map +1 -1
  193. package/lib/esm/imodel-components-react/color/ColorPickerPanel.scss +93 -93
  194. package/lib/esm/imodel-components-react/color/ColorPickerPopup.d.ts +44 -44
  195. package/lib/esm/imodel-components-react/color/ColorPickerPopup.js +114 -114
  196. package/lib/esm/imodel-components-react/color/ColorPickerPopup.js.map +1 -1
  197. package/lib/esm/imodel-components-react/color/ColorPickerPopup.scss +62 -62
  198. package/lib/esm/imodel-components-react/color/HueSlider.d.ts +22 -22
  199. package/lib/esm/imodel-components-react/color/HueSlider.js +173 -173
  200. package/lib/esm/imodel-components-react/color/HueSlider.js.map +1 -1
  201. package/lib/esm/imodel-components-react/color/HueSlider.scss +61 -61
  202. package/lib/esm/imodel-components-react/color/SaturationPicker.d.ts +20 -20
  203. package/lib/esm/imodel-components-react/color/SaturationPicker.js +187 -187
  204. package/lib/esm/imodel-components-react/color/SaturationPicker.js.map +1 -1
  205. package/lib/esm/imodel-components-react/color/SaturationPicker.scss +35 -35
  206. package/lib/esm/imodel-components-react/color/Swatch.d.ts +22 -22
  207. package/lib/esm/imodel-components-react/color/Swatch.js +34 -34
  208. package/lib/esm/imodel-components-react/color/Swatch.js.map +1 -1
  209. package/lib/esm/imodel-components-react/color/Swatch.scss +22 -22
  210. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.d.ts +6 -6
  211. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.js +19 -19
  212. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.js.map +1 -1
  213. package/lib/esm/imodel-components-react/editors/ColorEditor.d.ts +44 -44
  214. package/lib/esm/imodel-components-react/editors/ColorEditor.js +124 -124
  215. package/lib/esm/imodel-components-react/editors/ColorEditor.js.map +1 -1
  216. package/lib/esm/imodel-components-react/editors/ColorEditor.scss +18 -18
  217. package/lib/esm/imodel-components-react/editors/WeightEditor.d.ts +47 -47
  218. package/lib/esm/imodel-components-react/editors/WeightEditor.js +133 -133
  219. package/lib/esm/imodel-components-react/editors/WeightEditor.js.map +1 -1
  220. package/lib/esm/imodel-components-react/editors/WeightEditor.scss +16 -16
  221. package/lib/esm/imodel-components-react/inputs/QuantityInput.d.ts +25 -25
  222. package/lib/esm/imodel-components-react/inputs/QuantityInput.js +70 -70
  223. package/lib/esm/imodel-components-react/inputs/QuantityInput.js.map +1 -1
  224. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.d.ts +44 -44
  225. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.d.ts.map +1 -1
  226. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js +243 -243
  227. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
  228. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.scss +106 -106
  229. package/lib/esm/imodel-components-react/lineweight/Swatch.d.ts +33 -33
  230. package/lib/esm/imodel-components-react/lineweight/Swatch.js +59 -59
  231. package/lib/esm/imodel-components-react/lineweight/Swatch.js.map +1 -1
  232. package/lib/esm/imodel-components-react/lineweight/Swatch.scss +48 -48
  233. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.d.ts +60 -60
  234. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.js +134 -133
  235. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.js.map +1 -1
  236. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.scss +51 -52
  237. package/lib/esm/imodel-components-react/navigationaids/Cube.d.ts +45 -45
  238. package/lib/esm/imodel-components-react/navigationaids/Cube.js +100 -100
  239. package/lib/esm/imodel-components-react/navigationaids/Cube.js.map +1 -1
  240. package/lib/esm/imodel-components-react/navigationaids/Cube.scss +19 -19
  241. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.d.ts +175 -174
  242. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.d.ts.map +1 -1
  243. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js +620 -610
  244. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
  245. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.scss +178 -178
  246. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts +145 -145
  247. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.js +627 -626
  248. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.js.map +1 -1
  249. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.scss +135 -135
  250. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.d.ts +26 -26
  251. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js +76 -76
  252. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
  253. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.scss +59 -63
  254. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.d.ts +17 -17
  255. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js +29 -30
  256. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  257. package/lib/esm/imodel-components-react/quantityformat/FormatSample.d.ts +18 -18
  258. package/lib/esm/imodel-components-react/quantityformat/FormatSample.js +61 -61
  259. package/lib/esm/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
  260. package/lib/esm/imodel-components-react/quantityformat/FormatType.d.ts +17 -17
  261. package/lib/esm/imodel-components-react/quantityformat/FormatType.js +62 -63
  262. package/lib/esm/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  263. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.d.ts +17 -17
  264. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js +82 -83
  265. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  266. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.d.ts +19 -19
  267. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js +106 -110
  268. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
  269. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.d.ts +21 -21
  270. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js +157 -158
  271. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  272. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.d.ts +22 -22
  273. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.js +122 -122
  274. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.js.map +1 -1
  275. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.d.ts +17 -17
  276. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.js +36 -36
  277. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.js.map +1 -1
  278. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.d.ts +17 -17
  279. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.js +24 -24
  280. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.js.map +1 -1
  281. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.d.ts +16 -16
  282. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.js +31 -31
  283. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.js.map +1 -1
  284. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.d.ts +18 -18
  285. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.js +25 -25
  286. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.js.map +1 -1
  287. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.d.ts +17 -17
  288. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.js +27 -27
  289. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.js.map +1 -1
  290. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.d.ts +17 -17
  291. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js +35 -35
  292. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js.map +1 -1
  293. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.d.ts +17 -17
  294. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.js +24 -24
  295. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.js.map +1 -1
  296. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.d.ts +17 -17
  297. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.js +33 -33
  298. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.js.map +1 -1
  299. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts +17 -17
  300. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +68 -69
  301. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  302. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.d.ts +23 -23
  303. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.js +96 -96
  304. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.js.map +1 -1
  305. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.d.ts +52 -52
  306. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.js +139 -139
  307. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.js.map +1 -1
  308. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.d.ts +31 -31
  309. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.js +65 -65
  310. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.js.map +1 -1
  311. package/lib/esm/imodel-components-react/timeline/InlineEdit.d.ts +27 -27
  312. package/lib/esm/imodel-components-react/timeline/InlineEdit.js +55 -55
  313. package/lib/esm/imodel-components-react/timeline/InlineEdit.js.map +1 -1
  314. package/lib/esm/imodel-components-react/timeline/InlineEdit.scss +26 -26
  315. package/lib/esm/imodel-components-react/timeline/PlayerButton.d.ts +33 -33
  316. package/lib/esm/imodel-components-react/timeline/PlayerButton.js +68 -68
  317. package/lib/esm/imodel-components-react/timeline/PlayerButton.js.map +1 -1
  318. package/lib/esm/imodel-components-react/timeline/PlayerButton.scss +28 -28
  319. package/lib/esm/imodel-components-react/timeline/Scrubber.d.ts +54 -54
  320. package/lib/esm/imodel-components-react/timeline/Scrubber.js +164 -164
  321. package/lib/esm/imodel-components-react/timeline/Scrubber.js.map +1 -1
  322. package/lib/esm/imodel-components-react/timeline/Scrubber.scss +105 -105
  323. package/lib/esm/imodel-components-react/timeline/SolarTimeline.d.ts +77 -77
  324. package/lib/esm/imodel-components-react/timeline/SolarTimeline.js +402 -402
  325. package/lib/esm/imodel-components-react/timeline/SolarTimeline.js.map +1 -1
  326. package/lib/esm/imodel-components-react/timeline/SolarTimeline.scss +359 -359
  327. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.d.ts +15 -15
  328. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.js +28 -28
  329. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.js.map +1 -1
  330. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.scss +39 -39
  331. package/lib/esm/imodel-components-react/timeline/Timeline.scss +164 -164
  332. package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts +130 -133
  333. package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  334. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js +368 -339
  335. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  336. package/lib/esm/imodel-components-react/timeline/TimelineComponent.scss +178 -161
  337. package/lib/esm/imodel-components-react/timeline/interfaces.d.ts +174 -174
  338. package/lib/esm/imodel-components-react/timeline/interfaces.d.ts.map +1 -1
  339. package/lib/esm/imodel-components-react/timeline/interfaces.js +42 -42
  340. package/lib/esm/imodel-components-react/timeline/interfaces.js.map +1 -1
  341. package/lib/esm/imodel-components-react/viewport/ViewportComponent.d.ts +42 -42
  342. package/lib/esm/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  343. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js +249 -251
  344. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  345. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.d.ts +106 -106
  346. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js +96 -95
  347. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  348. package/lib/esm/imodel-components-react.d.ts +82 -82
  349. package/lib/esm/imodel-components-react.js +87 -87
  350. package/lib/esm/imodel-components-react.js.map +1 -1
  351. package/lib/public/locales/en/UiIModelComponents.json +139 -139
  352. package/package.json +21 -21
@@ -1,340 +1,369 @@
1
- /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
5
- /** @packageDocumentation
6
- * @module Timeline
7
- */
8
- import "./TimelineComponent.scss";
9
- import classnames from "classnames";
10
- import * as React from "react";
11
- import { UiAdmin } from "@itwin/appui-abstract";
12
- import { toDateString, toTimeString, UiComponents } from "@itwin/components-react";
13
- import { UiIModelComponents } from "../UiIModelComponents";
14
- import { InlineEdit } from "./InlineEdit";
15
- import { TimelinePausePlayAction } from "./interfaces";
16
- import { PlayButton, PlayerButton } from "./PlayerButton";
17
- import { Scrubber } from "./Scrubber";
18
- import { DropdownMenu, MenuDivider, MenuItem } from "@itwin/itwinui-react";
19
- import { Icon } from "@itwin/core-react";
20
- import { SvgCaretLeft, SvgCaretRight, SvgCheckmark, SvgMoreVertical, SvgPlayCircular } from "@itwin/itwinui-icons-react";
21
- // cspell:ignore millisec
22
- const slowSpeed = 60 * 1000;
23
- const mediumSpeed = 20 * 1000;
24
- const fastSpeed = 10 * 1000;
25
- /**
26
- * [[TimelineComponent]] is used to playback timeline data
27
- * @public
28
- */
29
- export class TimelineComponent extends React.Component {
30
- constructor(props) {
31
- super(props);
32
- this._timeLastCycle = 0;
33
- this._requestFrame = 0;
34
- this._unmounted = false;
35
- this._standardTimelineMenuItems = [
36
- { label: UiIModelComponents.translate("timeline.slow"), timelineDuration: slowSpeed },
37
- { label: UiIModelComponents.translate("timeline.medium"), timelineDuration: mediumSpeed },
38
- { label: UiIModelComponents.translate("timeline.fast"), timelineDuration: fastSpeed },
39
- ];
40
- this._handleTimelinePausePlayEvent = (args) => {
41
- const timelineArgs = args;
42
- // istanbul ignore else
43
- if (!timelineArgs || this.props.componentId !== timelineArgs.uiComponentId || timelineArgs.timelineAction === undefined)
44
- return;
45
- let startPlaying;
46
- switch (timelineArgs.timelineAction) {
47
- case TimelinePausePlayAction.Play:
48
- startPlaying = true;
49
- break;
50
- case TimelinePausePlayAction.Pause:
51
- startPlaying = false;
52
- break;
53
- case TimelinePausePlayAction.Toggle:
54
- startPlaying = !this.state.isPlaying;
55
- break;
56
- // istanbul ignore next
57
- default:
58
- return; // throw error?
59
- }
60
- if (startPlaying)
61
- this._onPlay();
62
- else
63
- this._onPause();
64
- };
65
- // user clicked backward button
66
- this._onBackward = () => {
67
- // istanbul ignore else
68
- if (this.props.onJump)
69
- this.props.onJump(false);
70
- };
71
- // user clicked forward button
72
- this._onForward = () => {
73
- // istanbul ignore else
74
- if (this.props.onJump)
75
- this.props.onJump(true);
76
- };
77
- // user clicked play button
78
- this._onPlay = () => {
79
- // istanbul ignore if
80
- if (this.state.isPlaying)
81
- return;
82
- // timeline was complete, restart from the beginning
83
- if (this.state.currentDuration >= this.state.totalDuration) {
84
- this._replay();
85
- }
86
- else
87
- this._play();
88
- // istanbul ignore else
89
- if (this.props.onPlayPause)
90
- this.props.onPlayPause(true);
91
- };
92
- // user clicked pause button
93
- this._onPause = () => {
94
- // istanbul ignore if
95
- if (!this.state.isPlaying)
96
- return;
97
- // stop requesting frames
98
- window.cancelAnimationFrame(this._requestFrame);
99
- // stop playing
100
- this.setState({ isPlaying: false });
101
- // istanbul ignore else
102
- if (this.props.onPlayPause)
103
- this.props.onPlayPause(false);
104
- };
105
- // user clicked on timeline rail or dragged scrubber handle
106
- this._onTimelineChange = (values) => {
107
- const currentDuration = values[0];
108
- this._setDuration(currentDuration);
109
- };
110
- // set the current duration, which will call the OnChange callback
111
- this._setDuration = (currentDuration) => {
112
- const actualDuration = Math.min(this.state.totalDuration, (Math.max(currentDuration, 0)));
113
- this._timeLastCycle = new Date().getTime();
114
- // istanbul ignore else
115
- if (!this._unmounted)
116
- this.setState({ currentDuration: actualDuration });
117
- // istanbul ignore else
118
- if (this.props.onChange) {
119
- const fraction = actualDuration / this.state.totalDuration;
120
- this.props.onChange(fraction);
121
- }
122
- };
123
- // recursively update the animation until we hit the end or the pause button is clicked
124
- this._updateAnimation = (_timestamp) => {
125
- // istanbul ignore else
126
- if (!this.state.isPlaying && !this._unmounted) {
127
- return;
128
- }
129
- // update duration
130
- const currentTime = new Date().getTime();
131
- const millisecondsElapsed = currentTime - this._timeLastCycle;
132
- const duration = this.state.currentDuration + millisecondsElapsed;
133
- this._setDuration(duration);
134
- // stop the animation!
135
- if (duration >= this.state.totalDuration) {
136
- window.cancelAnimationFrame(this._requestFrame);
137
- this.setState({ isPlaying: false });
138
- if (this.state.repeat)
139
- this._replay();
140
- else {
141
- // istanbul ignore else
142
- if (this.props.onPlayPause)
143
- this.props.onPlayPause(false);
144
- }
145
- return;
146
- }
147
- // continue the animation - request the next frame
148
- this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
149
- };
150
- this._replay = () => {
151
- // timeline was complete, restart from the beginning
152
- this.setState({ currentDuration: 0 }, (() => this._play()));
153
- };
154
- // user changed the total duration
155
- this._onTotalDurationChange = (value) => {
156
- // NOTE: we should reset the current duration to 0
157
- const milliseconds = this._getMilliseconds(value);
158
- this._onSetTotalDuration(milliseconds);
159
- };
160
- this._changeRepeatSetting = (newValue) => {
161
- // istanbul ignore else
162
- if (newValue !== undefined) {
163
- this.setState(() => ({ repeat: newValue }), () => {
164
- // istanbul ignore else
165
- if (this.props.onSettingsChange) {
166
- this.props.onSettingsChange({ loop: this.state.repeat });
167
- }
168
- });
169
- }
170
- };
171
- this._onRepeatChanged = () => {
172
- this.setState((prevState) => ({ repeat: !prevState.repeat }), () => {
173
- // istanbul ignore else
174
- if (this.props.onSettingsChange) {
175
- this.props.onSettingsChange({ loop: this.state.repeat });
176
- }
177
- });
178
- };
179
- this._currentDate = () => {
180
- const fraction = this.state.currentDuration / this.state.totalDuration;
181
- if (this.props.endDate && this.props.startDate) {
182
- const timeElapsed = (this.props.endDate.getTime() - this.props.startDate.getTime()) * fraction;
183
- return new Date(this.props.startDate.getTime() + timeElapsed);
184
- }
185
- return new Date();
186
- };
187
- this._onSetTotalDuration = (milliseconds) => {
188
- this.setState({ totalDuration: milliseconds }, () => {
189
- // istanbul ignore else
190
- if (this.props.onSettingsChange) {
191
- this.props.onSettingsChange({ duration: milliseconds });
192
- }
193
- });
194
- };
195
- this._renderSettings = () => {
196
- const createMenuItemNodes = (close) => {
197
- const { totalDuration } = this.state;
198
- let contextMenuItems = [];
199
- if (!this.props.appMenuItems) {
200
- contextMenuItems = this._standardTimelineMenuItems;
201
- }
202
- else {
203
- if (this.props.appMenuItemOption === "append") {
204
- contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);
205
- }
206
- else if (this.props.appMenuItemOption === "prefix") {
207
- contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);
208
- }
209
- else {
210
- contextMenuItems = this.props.appMenuItems;
211
- }
212
- }
213
- const itemNodes = [];
214
- let keyIndex = 0;
215
- if (this.state.includeRepeat) {
216
- const checked = this.state.repeat;
217
- const icon = checked ? React.createElement("span", { className: "icon" },
218
- React.createElement(Icon, { iconSpec: React.createElement(SvgCheckmark, null) }),
219
- " ") : React.createElement("span", null);
220
- itemNodes.push(React.createElement(MenuItem, { key: ++keyIndex, onClick: () => { this._onRepeatChanged(); close(); }, icon: icon }, this._repeatLabel));
221
- itemNodes.push(React.createElement(MenuDivider, { key: ++keyIndex }));
222
- }
223
- contextMenuItems.forEach((item, index) => {
224
- itemNodes.push(this._createMenuItemNode(item, index + keyIndex + 1, totalDuration, close));
225
- });
226
- return itemNodes;
227
- };
228
- return (React.createElement(DropdownMenu, { menuItems: createMenuItemNodes },
229
- React.createElement("span", { "data-testid": "timeline-settings", className: "timeline-settings icon", role: "button", tabIndex: -1, title: UiComponents.translate("button.label.settings") },
230
- React.createElement(Icon, { iconSpec: React.createElement(SvgMoreVertical, null) }))));
231
- };
232
- this.state = {
233
- isPlaying: false,
234
- minimized: true,
235
- currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,
236
- totalDuration: this.props.totalDuration,
237
- repeat: this.props.repeat ? true : false,
238
- includeRepeat: this.props.includeRepeat || this.props.includeRepeat === undefined ? true : false,
239
- };
240
- this._repeatLabel = UiIModelComponents.translate("timeline.repeat");
241
- // istanbul ignore else
242
- if (this.props.componentId) { // can't handle an event if we have no id
243
- this._removeListener = UiAdmin.onGenericUiEvent.addListener(this._handleTimelinePausePlayEvent);
244
- }
245
- }
246
- componentWillUnmount() {
247
- if (this._removeListener)
248
- this._removeListener();
249
- window.cancelAnimationFrame(this._requestFrame);
250
- this._unmounted = true;
251
- }
252
- shouldComponentUpdate(nextProps, nextState) {
253
- let result = false;
254
- // istanbul ignore next
255
- if (nextState !== this.state || nextProps !== this.props ||
256
- nextProps.startDate !== this.props.startDate ||
257
- nextProps.endDate !== this.props.endDate ||
258
- nextProps.initialDuration !== this.props.initialDuration ||
259
- nextProps.repeat !== this.props.repeat)
260
- result = true;
261
- return result;
262
- }
263
- componentDidUpdate(prevProps) {
264
- // istanbul ignore else
265
- if (this.props.initialDuration !== prevProps.initialDuration) {
266
- this._setDuration(this.props.initialDuration ? this.props.initialDuration : /* istanbul ignore next */ 0);
267
- }
268
- // istanbul ignore else
269
- if (this.props.repeat !== prevProps.repeat) {
270
- this._changeRepeatSetting(this.props.repeat);
271
- }
272
- // istanbul ignore else
273
- if (this.props.totalDuration !== prevProps.totalDuration) {
274
- this._onSetTotalDuration(this.props.totalDuration);
275
- }
276
- }
277
- _play() {
278
- // start playing
279
- this.setState({ isPlaying: true }, () => {
280
- // request the next frame
281
- this._timeLastCycle = new Date().getTime();
282
- this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
283
- });
284
- }
285
- _displayTime(millisec) {
286
- const addZero = (i) => {
287
- return (i < 10) ? `0${i}` : i;
288
- };
289
- const date = new Date(millisec);
290
- // const hours = date.getUTCHours();
291
- const minutes = date.getUTCMinutes();
292
- const seconds = date.getUTCSeconds();
293
- return `${addZero(minutes)}:${addZero(seconds)}`;
294
- }
295
- _getMilliseconds(time) {
296
- // istanbul ignore else - WIP
297
- if (time.indexOf(":") !== -1) {
298
- return (Number(time.split(":")[0]) * 60 + Number(time.split(":")[1])) * 1000;
299
- }
300
- else {
301
- return Number(time) * 1000;
302
- }
303
- }
304
- _createMenuItemNode(item, index, currentTimelineDuration, close) {
305
- const label = item.label;
306
- const checked = currentTimelineDuration === item.timelineDuration;
307
- const icon = checked ? React.createElement("span", { className: "icon" },
308
- React.createElement(Icon, { iconSpec: React.createElement(SvgCheckmark, null) }),
309
- " ") : React.createElement("span", null);
310
- return (React.createElement(MenuItem, { key: index, icon: icon, onClick: () => { this._onSetTotalDuration(item.timelineDuration); close(); } }, label));
311
- }
312
- render() {
313
- const { startDate, endDate, showDuration, timeZoneOffset, dateFormatOptions, timeFormatOptions } = this.props;
314
- const { currentDuration, totalDuration, minimized } = this.state;
315
- const currentDate = this._currentDate();
316
- const durationString = this._displayTime(currentDuration);
317
- const totalDurationString = this._displayTime(totalDuration);
318
- const hasDates = !!startDate && !!endDate;
319
- return (React.createElement("div", { "data-testid": "timeline-component", className: classnames("timeline-component", !!minimized && "minimized", hasDates && "has-dates") },
320
- React.createElement("div", { className: "header" },
321
- React.createElement(PlayButton, { className: "play-button", isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause, "data-testid": "timeline-play" }),
322
- React.createElement(PlayerButton, { className: "play-backward", icon: React.createElement(SvgCaretLeft, null), onClick: this._onBackward, title: UiIModelComponents.translate("timeline.backward") }),
323
- React.createElement(PlayerButton, { className: "play-button-step", icon: React.createElement(SvgPlayCircular, null), isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause, title: UiIModelComponents.translate("timeline.step") }),
324
- React.createElement(PlayerButton, { className: "play-forward", icon: React.createElement(SvgCaretRight, null), onClick: this._onForward, title: UiIModelComponents.translate("timeline.backward") }),
325
- React.createElement("span", { className: "current-date" }, toDateString(currentDate, timeZoneOffset, dateFormatOptions))),
326
- React.createElement("div", { className: "scrubber" },
327
- React.createElement(PlayButton, { className: "play-button", isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause }),
328
- React.createElement("div", { className: "start-time-container" },
329
- hasDates && React.createElement("span", { "data-testid": "test-start-date", className: "start-date" }, toDateString(startDate, timeZoneOffset, dateFormatOptions)),
330
- hasDates && !showDuration && React.createElement("span", { "data-testid": "test-start-time", className: "start-time" }, toTimeString(startDate, timeZoneOffset, timeFormatOptions)),
331
- showDuration && React.createElement("span", { className: "duration-start-time" }, durationString)),
332
- React.createElement(Scrubber, { className: "slider", currentDuration: this.state.currentDuration, totalDuration: totalDuration, startDate: startDate, endDate: endDate, isPlaying: this.state.isPlaying, inMiniMode: !!minimized, showTime: !showDuration, onChange: this._onTimelineChange, onUpdate: this._onTimelineChange, timeZoneOffset: this.props.timeZoneOffset, markDate: this.props.markDate }),
333
- React.createElement("div", { className: "end-time-container" },
334
- hasDates && React.createElement("span", { className: "end-date" }, toDateString(endDate, timeZoneOffset)),
335
- hasDates && !showDuration && React.createElement("span", { className: "end-time" }, toTimeString(endDate, timeZoneOffset, timeFormatOptions)),
336
- showDuration && React.createElement(InlineEdit, { className: "duration-end-time", defaultValue: totalDurationString, onChange: this._onTotalDurationChange })),
337
- minimized && this._renderSettings())));
338
- }
339
- }
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Timeline
7
+ */
8
+ import { UiAdmin } from "@itwin/appui-abstract";
9
+ import { toDateString, toTimeString, UiComponents } from "@itwin/components-react";
10
+ import { Icon } from "@itwin/core-react";
11
+ import { SvgCaretLeft, SvgCaretRight, SvgCheckmark, SvgMoreVertical, SvgPlayCircular } from "@itwin/itwinui-icons-react";
12
+ import { DropdownMenu, MenuDivider, MenuItem } from "@itwin/itwinui-react";
13
+ import classnames from "classnames";
14
+ import * as React from "react";
15
+ import { UiIModelComponents } from "../UiIModelComponents";
16
+ import { InlineEdit } from "./InlineEdit";
17
+ import { TimelinePausePlayAction } from "./interfaces";
18
+ import { PlayButton, PlayerButton } from "./PlayerButton";
19
+ import { Scrubber } from "./Scrubber";
20
+ import "./TimelineComponent.scss";
21
+ // cspell:ignore millisec
22
+ const slowSpeed = 60 * 1000;
23
+ const mediumSpeed = 20 * 1000;
24
+ const fastSpeed = 10 * 1000;
25
+ /**
26
+ * [[TimelineComponent]] is used to playback timeline data
27
+ * @public
28
+ */
29
+ export class TimelineComponent extends React.Component {
30
+ constructor(props) {
31
+ super(props);
32
+ this._timeLastCycle = 0;
33
+ this._requestFrame = 0;
34
+ this._unmounted = false;
35
+ this._standardTimelineMenuItems = [
36
+ { label: UiIModelComponents.translate("timeline.slow"), timelineDuration: slowSpeed },
37
+ { label: UiIModelComponents.translate("timeline.medium"), timelineDuration: mediumSpeed },
38
+ { label: UiIModelComponents.translate("timeline.fast"), timelineDuration: fastSpeed },
39
+ ];
40
+ this._handleTimelinePausePlayEvent = (args) => {
41
+ const timelineArgs = args;
42
+ // istanbul ignore else
43
+ if (!timelineArgs || this.props.componentId !== timelineArgs.uiComponentId || timelineArgs.timelineAction === undefined)
44
+ return;
45
+ let startPlaying;
46
+ switch (timelineArgs.timelineAction) {
47
+ case TimelinePausePlayAction.Play:
48
+ startPlaying = true;
49
+ break;
50
+ case TimelinePausePlayAction.Pause:
51
+ startPlaying = false;
52
+ break;
53
+ case TimelinePausePlayAction.Toggle:
54
+ startPlaying = !this.state.isPlaying;
55
+ break;
56
+ // istanbul ignore next
57
+ default:
58
+ return; // throw error?
59
+ }
60
+ if (startPlaying)
61
+ this._onPlay();
62
+ else
63
+ this._onPause();
64
+ };
65
+ // user clicked backward button
66
+ this._onBackward = () => {
67
+ // istanbul ignore else
68
+ if (this.props.onJump)
69
+ this.props.onJump(false);
70
+ };
71
+ // user clicked forward button
72
+ this._onForward = () => {
73
+ // istanbul ignore else
74
+ if (this.props.onJump)
75
+ this.props.onJump(true);
76
+ };
77
+ // user clicked play button
78
+ this._onPlay = () => {
79
+ // istanbul ignore if
80
+ if (this.state.isPlaying)
81
+ return;
82
+ // timeline was complete, restart from the beginning
83
+ if (this.state.currentDuration >= this.state.totalDuration) {
84
+ this._replay();
85
+ }
86
+ else
87
+ this._play();
88
+ // istanbul ignore else
89
+ if (this.props.onPlayPause)
90
+ this.props.onPlayPause(true);
91
+ };
92
+ // user clicked pause button
93
+ this._onPause = () => {
94
+ // istanbul ignore if
95
+ if (!this.state.isPlaying)
96
+ return;
97
+ // stop requesting frames
98
+ window.cancelAnimationFrame(this._requestFrame);
99
+ // stop playing
100
+ this.setState({ isPlaying: false });
101
+ // istanbul ignore else
102
+ if (this.props.onPlayPause)
103
+ this.props.onPlayPause(false);
104
+ };
105
+ // user clicked on timeline rail or dragged scrubber handle
106
+ this._onTimelineChange = (values) => {
107
+ const currentDuration = values[0];
108
+ this._setDuration(currentDuration);
109
+ };
110
+ // set the current duration, which will call the OnChange callback
111
+ this._setDuration = (currentDuration) => {
112
+ const actualDuration = Math.min(this.state.totalDuration, (Math.max(currentDuration, 0)));
113
+ this._timeLastCycle = new Date().getTime();
114
+ // istanbul ignore else
115
+ if (!this._unmounted)
116
+ this.setState({ currentDuration: actualDuration });
117
+ // istanbul ignore else
118
+ if (this.props.onChange) {
119
+ const fraction = actualDuration / this.state.totalDuration;
120
+ this.props.onChange(fraction);
121
+ }
122
+ };
123
+ // recursively update the animation until we hit the end or the pause button is clicked
124
+ this._updateAnimation = (_timestamp) => {
125
+ // istanbul ignore else
126
+ if (!this.state.isPlaying && !this._unmounted) {
127
+ return;
128
+ }
129
+ // update duration
130
+ const currentTime = new Date().getTime();
131
+ const millisecondsElapsed = currentTime - this._timeLastCycle;
132
+ const duration = this.state.currentDuration + millisecondsElapsed;
133
+ this._setDuration(duration);
134
+ // stop the animation!
135
+ if (duration >= this.state.totalDuration) {
136
+ window.cancelAnimationFrame(this._requestFrame);
137
+ this.setState({ isPlaying: false });
138
+ if (this.state.repeat)
139
+ this._replay();
140
+ else {
141
+ // istanbul ignore else
142
+ if (this.props.onPlayPause)
143
+ this.props.onPlayPause(false);
144
+ }
145
+ return;
146
+ }
147
+ // continue the animation - request the next frame
148
+ this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
149
+ };
150
+ this._replay = () => {
151
+ // timeline was complete, restart from the beginning
152
+ this.setState({ currentDuration: 0 }, (() => this._play()));
153
+ };
154
+ // user changed the total duration
155
+ this._onTotalDurationChange = (value) => {
156
+ // NOTE: we should reset the current duration to 0
157
+ const milliseconds = this._getMilliseconds(value);
158
+ this._onSetTotalDuration(milliseconds);
159
+ };
160
+ this._changeRepeatSetting = (newValue) => {
161
+ // istanbul ignore else
162
+ if (newValue !== undefined) {
163
+ this.setState(() => ({ repeat: newValue }), () => {
164
+ // istanbul ignore else
165
+ if (this.props.onSettingsChange) {
166
+ this.props.onSettingsChange({ loop: this.state.repeat });
167
+ }
168
+ });
169
+ }
170
+ };
171
+ this._onRepeatChanged = () => {
172
+ this.setState((prevState) => ({ repeat: !prevState.repeat }), () => {
173
+ // istanbul ignore else
174
+ if (this.props.onSettingsChange) {
175
+ this.props.onSettingsChange({ loop: this.state.repeat });
176
+ }
177
+ });
178
+ };
179
+ this._currentDate = () => {
180
+ const fraction = this.state.currentDuration / this.state.totalDuration;
181
+ if (this.props.endDate && this.props.startDate) {
182
+ const timeElapsed = (this.props.endDate.getTime() - this.props.startDate.getTime()) * fraction;
183
+ return new Date(this.props.startDate.getTime() + timeElapsed);
184
+ }
185
+ return new Date();
186
+ };
187
+ this._onSetTotalDuration = (milliseconds) => {
188
+ this.setState({ totalDuration: milliseconds }, () => {
189
+ // istanbul ignore else
190
+ if (this.props.onSettingsChange) {
191
+ this.props.onSettingsChange({ duration: milliseconds });
192
+ }
193
+ });
194
+ };
195
+ this._renderSettings = () => {
196
+ const createMenuItemNodes = (close) => {
197
+ const { totalDuration } = this.state;
198
+ let contextMenuItems = [];
199
+ if (!this.props.appMenuItems) {
200
+ contextMenuItems = this._standardTimelineMenuItems;
201
+ }
202
+ else {
203
+ if (this.props.appMenuItemOption === "append") {
204
+ contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);
205
+ }
206
+ else if (this.props.appMenuItemOption === "prefix") {
207
+ contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);
208
+ }
209
+ else {
210
+ contextMenuItems = this.props.appMenuItems;
211
+ }
212
+ }
213
+ const itemNodes = [];
214
+ let keyIndex = 0;
215
+ if (this.state.includeRepeat) {
216
+ const checked = this.state.repeat;
217
+ const icon = checked ? React.createElement("span", { className: "icon" },
218
+ React.createElement(Icon, { iconSpec: React.createElement(SvgCheckmark, null) }),
219
+ " ") : React.createElement("span", null);
220
+ itemNodes.push(React.createElement(MenuItem, { key: ++keyIndex, onClick: () => { this._onRepeatChanged(); close(); }, icon: icon }, this._repeatLabel));
221
+ itemNodes.push(React.createElement(MenuDivider, { key: ++keyIndex }));
222
+ }
223
+ contextMenuItems.forEach((item, index) => {
224
+ itemNodes.push(this._createMenuItemNode(item, index + keyIndex + 1, totalDuration, close));
225
+ });
226
+ return itemNodes;
227
+ };
228
+ return (React.createElement(DropdownMenu, { menuItems: createMenuItemNodes, placement: "top-start", popperOptions: {
229
+ modifiers: [
230
+ {
231
+ name: "hide", // When the timeline is no longer visible, hide the popper.
232
+ },
233
+ {
234
+ name: "preventOverflow",
235
+ options: {
236
+ altAxis: true, // Allow the popper to go below the reference element and use as much space as needed.
237
+ },
238
+ },
239
+ {
240
+ name: "computeStyles",
241
+ options: {
242
+ roundOffsets: ({ x, y }) => ({
243
+ x,
244
+ y: Math.max(y, 0), // Ensure that the top of the popper will not go over the top of the document.
245
+ }),
246
+ },
247
+ },
248
+ {
249
+ name: "setPopperClass",
250
+ enabled: true,
251
+ phase: "beforeWrite",
252
+ fn({ state }) {
253
+ state.attributes.popper.class = "timeline-component-max-sized-scrolling-menu";
254
+ },
255
+ },
256
+ ]
257
+ } },
258
+ React.createElement("span", { "data-testid": "timeline-settings", className: "timeline-settings icon", role: "button", tabIndex: -1, title: UiComponents.translate("button.label.settings") },
259
+ React.createElement(Icon, { iconSpec: React.createElement(SvgMoreVertical, null) }))));
260
+ };
261
+ this.state = {
262
+ isPlaying: false,
263
+ minimized: true,
264
+ currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,
265
+ totalDuration: this.props.totalDuration,
266
+ repeat: this.props.repeat ? true : false,
267
+ includeRepeat: this.props.includeRepeat || this.props.includeRepeat === undefined ? true : false,
268
+ };
269
+ this._repeatLabel = UiIModelComponents.translate("timeline.repeat");
270
+ // istanbul ignore else
271
+ if (this.props.componentId) { // can't handle an event if we have no id
272
+ this._removeListener = UiAdmin.onGenericUiEvent.addListener(this._handleTimelinePausePlayEvent);
273
+ }
274
+ }
275
+ componentWillUnmount() {
276
+ if (this._removeListener)
277
+ this._removeListener();
278
+ window.cancelAnimationFrame(this._requestFrame);
279
+ this._unmounted = true;
280
+ }
281
+ shouldComponentUpdate(nextProps, nextState) {
282
+ let result = false;
283
+ // istanbul ignore next
284
+ if (nextState !== this.state || nextProps !== this.props ||
285
+ nextProps.startDate !== this.props.startDate ||
286
+ nextProps.endDate !== this.props.endDate ||
287
+ nextProps.initialDuration !== this.props.initialDuration ||
288
+ nextProps.repeat !== this.props.repeat)
289
+ result = true;
290
+ return result;
291
+ }
292
+ componentDidUpdate(prevProps) {
293
+ // istanbul ignore else
294
+ if (this.props.initialDuration !== prevProps.initialDuration) {
295
+ this._setDuration(this.props.initialDuration ? this.props.initialDuration : /* istanbul ignore next */ 0);
296
+ }
297
+ // istanbul ignore else
298
+ if (this.props.repeat !== prevProps.repeat) {
299
+ this._changeRepeatSetting(this.props.repeat);
300
+ }
301
+ // istanbul ignore else
302
+ if (this.props.totalDuration !== prevProps.totalDuration) {
303
+ this._onSetTotalDuration(this.props.totalDuration);
304
+ }
305
+ }
306
+ _play() {
307
+ // start playing
308
+ this.setState({ isPlaying: true }, () => {
309
+ // request the next frame
310
+ this._timeLastCycle = new Date().getTime();
311
+ this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
312
+ });
313
+ }
314
+ _displayTime(millisec) {
315
+ const addZero = (i) => {
316
+ return (i < 10) ? `0${i}` : i;
317
+ };
318
+ const date = new Date(millisec);
319
+ // const hours = date.getUTCHours();
320
+ const minutes = date.getUTCMinutes();
321
+ const seconds = date.getUTCSeconds();
322
+ return `${addZero(minutes)}:${addZero(seconds)}`;
323
+ }
324
+ _getMilliseconds(time) {
325
+ // istanbul ignore else - WIP
326
+ if (time.indexOf(":") !== -1) {
327
+ return (Number(time.split(":")[0]) * 60 + Number(time.split(":")[1])) * 1000;
328
+ }
329
+ else {
330
+ return Number(time) * 1000;
331
+ }
332
+ }
333
+ _createMenuItemNode(item, index, currentTimelineDuration, close) {
334
+ const label = item.label;
335
+ const checked = currentTimelineDuration === item.timelineDuration;
336
+ const icon = checked ? React.createElement("span", { className: "icon" },
337
+ React.createElement(Icon, { iconSpec: React.createElement(SvgCheckmark, null) }),
338
+ " ") : React.createElement("span", null);
339
+ return (React.createElement(MenuItem, { key: index, icon: icon, onClick: () => { this._onSetTotalDuration(item.timelineDuration); close(); } }, label));
340
+ }
341
+ render() {
342
+ const { startDate, endDate, showDuration, timeZoneOffset, dateFormatOptions, timeFormatOptions } = this.props;
343
+ const { currentDuration, totalDuration, minimized } = this.state;
344
+ const currentDate = this._currentDate();
345
+ const durationString = this._displayTime(currentDuration);
346
+ const totalDurationString = this._displayTime(totalDuration);
347
+ const hasDates = !!startDate && !!endDate;
348
+ return (React.createElement("div", { "data-testid": "timeline-component", className: classnames("timeline-component", !!minimized && "minimized", hasDates && "has-dates") },
349
+ React.createElement("div", { className: "header" },
350
+ React.createElement(PlayButton, { className: "play-button", isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause, "data-testid": "timeline-play" }),
351
+ React.createElement(PlayerButton, { className: "play-backward", icon: React.createElement(SvgCaretLeft, null), onClick: this._onBackward, title: UiIModelComponents.translate("timeline.backward") }),
352
+ React.createElement(PlayerButton, { className: "play-button-step", icon: React.createElement(SvgPlayCircular, null), isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause, title: UiIModelComponents.translate("timeline.step") }),
353
+ React.createElement(PlayerButton, { className: "play-forward", icon: React.createElement(SvgCaretRight, null), onClick: this._onForward, title: UiIModelComponents.translate("timeline.backward") }),
354
+ React.createElement("span", { className: "current-date" }, toDateString(currentDate, timeZoneOffset, dateFormatOptions))),
355
+ React.createElement("div", { className: "scrubber" },
356
+ React.createElement(PlayButton, { className: "play-button", isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause }),
357
+ React.createElement("div", { className: "start-time-container" },
358
+ hasDates && React.createElement("span", { "data-testid": "test-start-date", className: "start-date" }, toDateString(startDate, timeZoneOffset, dateFormatOptions)),
359
+ hasDates && !showDuration && React.createElement("span", { "data-testid": "test-start-time", className: "start-time" }, toTimeString(startDate, timeZoneOffset, timeFormatOptions)),
360
+ showDuration && React.createElement("span", { className: "duration-start-time" }, durationString)),
361
+ React.createElement(Scrubber, { className: "slider", currentDuration: this.state.currentDuration, totalDuration: totalDuration, startDate: startDate, endDate: endDate, isPlaying: this.state.isPlaying, inMiniMode: !!minimized, showTime: !showDuration, onChange: this._onTimelineChange, onUpdate: this._onTimelineChange, timeZoneOffset: this.props.timeZoneOffset, markDate: this.props.markDate }),
362
+ React.createElement("div", { className: "end-time-container" },
363
+ hasDates && React.createElement("span", { className: "end-date" }, toDateString(endDate, timeZoneOffset)),
364
+ hasDates && !showDuration && React.createElement("span", { className: "end-time" }, toTimeString(endDate, timeZoneOffset, timeFormatOptions)),
365
+ showDuration && React.createElement(InlineEdit, { className: "duration-end-time", defaultValue: totalDurationString, onChange: this._onTotalDurationChange })),
366
+ minimized && this._renderSettings())));
367
+ }
368
+ }
340
369
  //# sourceMappingURL=TimelineComponent.js.map