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

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