@itwin/imodel-components-react 3.7.11 → 3.7.12

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