@flexem/fc-gui 3.0.0-alpha.16 → 3.0.0-alpha.160

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 (567) hide show
  1. package/CHANGELOG.md +492 -69
  2. package/README.md +4 -4
  3. package/assets/img/alert.svg +18 -18
  4. package/assets/img/black_first_page.png +0 -0
  5. package/assets/img/black_last_page.png +0 -0
  6. package/assets/img/black_next_page.png +0 -0
  7. package/assets/img/black_previous_page.png +0 -0
  8. package/assets/img/first_page.svg +19 -19
  9. package/assets/img/last_page.svg +19 -19
  10. package/assets/img/next_page.svg +14 -14
  11. package/assets/img/previous_page.svg +14 -14
  12. package/bundles/@flexem/fc-gui.umd.js +25472 -20764
  13. package/bundles/@flexem/fc-gui.umd.js.map +1 -1
  14. package/bundles/@flexem/fc-gui.umd.min.js +5 -5
  15. package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
  16. package/communication/index.d.ts +1 -1
  17. package/communication/index.js +1 -1
  18. package/communication/variable/index.d.ts +5 -5
  19. package/communication/variable/index.js +4 -4
  20. package/communication/variable/variable-communicator.d.ts +16 -12
  21. package/communication/variable/variable-definition.d.ts +10 -10
  22. package/communication/variable/variable-definition.js +14 -14
  23. package/communication/variable/variable-state-enum.d.ts +8 -7
  24. package/communication/variable/variable-state-enum.js +9 -8
  25. package/communication/variable/variable-state-enum.metadata.json +1 -1
  26. package/communication/variable/variable-state.d.ts +6 -6
  27. package/communication/variable/variable-state.js +6 -6
  28. package/communication/variable/variable-value.d.ts +11 -8
  29. package/communication/variable/variable-value.js +11 -8
  30. package/communication/variable/variable-value.metadata.json +1 -1
  31. package/config/alarm/alarm.store.d.ts +6 -0
  32. package/config/alarm/alarm.store.js +0 -0
  33. package/config/alarm/alarm.store.metadata.json +1 -0
  34. package/config/alarm/get-alarms-args.d.ts +12 -0
  35. package/config/alarm/get-alarms-args.js +13 -0
  36. package/config/alarm/get-alarms-args.metadata.json +1 -0
  37. package/config/alarm/index.d.ts +2 -0
  38. package/config/alarm/index.js +1 -0
  39. package/config/alarm/index.metadata.json +1 -0
  40. package/config/config-store.d.ts +17 -15
  41. package/config/graph/graph-result.d.ts +9 -9
  42. package/config/graph/graph-result.js +13 -13
  43. package/config/graph/graph-store.d.ts +9 -9
  44. package/config/graph/graph-type.d.ts +4 -4
  45. package/config/graph/graph-type.js +5 -5
  46. package/config/graph/graph.d.ts +6 -6
  47. package/config/graph/graph.js +6 -6
  48. package/config/gui-feature-config.d.ts +3 -0
  49. package/config/gui-feature-config.js +3 -0
  50. package/config/gui-feature-config.metadata.json +1 -0
  51. package/config/history-data/get-history-data-args.d.ts +22 -22
  52. package/config/history-data/get-history-data-args.js +21 -21
  53. package/config/history-data/historical-curve.time-range.d.ts +18 -18
  54. package/config/history-data/historical-curve.time-range.js +19 -19
  55. package/config/history-data/history-data-value.d.ts +6 -6
  56. package/config/history-data/history-data-value.js +6 -6
  57. package/config/history-data/history-data.model.d.ts +7 -7
  58. package/config/history-data/history-data.model.js +7 -7
  59. package/config/history-data/history-data.store.d.ts +10 -10
  60. package/config/history-data/index.d.ts +4 -4
  61. package/config/history-data/index.js +3 -3
  62. package/config/image/image-store.d.ts +6 -6
  63. package/config/index.d.ts +12 -10
  64. package/config/index.js +8 -6
  65. package/config/index.metadata.json +1 -1
  66. package/config/variable/get-variable-name-args.d.ts +6 -6
  67. package/config/variable/get-variable-name-args.js +7 -7
  68. package/config/variable/index.d.ts +2 -2
  69. package/config/variable/index.js +1 -1
  70. package/config/variable/variable-store.d.ts +8 -7
  71. package/config/view/view-store.d.ts +20 -20
  72. package/config/view/view.model.d.ts +4 -4
  73. package/config/view/view.model.js +5 -5
  74. package/core/index.d.ts +1 -1
  75. package/core/index.js +1 -1
  76. package/core/stringifying-map.d.ts +11 -11
  77. package/core/stringifying-map.js +24 -24
  78. package/core/stringifying-set.d.ts +10 -10
  79. package/core/stringifying-set.js +21 -21
  80. package/elements/air-quality/air-quality-element.d.ts +31 -0
  81. package/elements/air-quality/air-quality-element.js +194 -0
  82. package/elements/air-quality/air-quality-element.metadata.json +1 -0
  83. package/elements/alarm/alarm-element.d.ts +69 -0
  84. package/elements/alarm/alarm-element.js +497 -0
  85. package/elements/alarm/alarm-element.metadata.json +1 -0
  86. package/elements/bar-graph-element.d.ts +29 -21
  87. package/elements/bar-graph-element.js +244 -114
  88. package/elements/bar-graph-element.metadata.json +1 -1
  89. package/elements/base/base-element.d.ts +11 -11
  90. package/elements/base/base-element.js +9 -9
  91. package/elements/base/conditional-control-element.d.ts +16 -16
  92. package/elements/base/conditional-control-element.js +87 -87
  93. package/elements/base/conditional-display-element.d.ts +24 -24
  94. package/elements/base/conditional-display-element.js +86 -86
  95. package/elements/base/conditional-dynamic-display-element.d.ts +26 -26
  96. package/elements/base/conditional-dynamic-display-element.js +142 -142
  97. package/elements/base/conditional-enable-element.d.ts +21 -21
  98. package/elements/base/conditional-enable-element.js +100 -100
  99. package/elements/base/index.d.ts +3 -3
  100. package/elements/base/index.js +3 -3
  101. package/elements/base/readable-element.d.ts +20 -15
  102. package/elements/base/readable-element.js +122 -58
  103. package/elements/base/readable-element.metadata.json +1 -1
  104. package/elements/base/state-control-element.d.ts +26 -24
  105. package/elements/base/state-control-element.js +196 -180
  106. package/elements/character-display/character-display-element.d.ts +35 -35
  107. package/elements/character-display/character-display-element.js +312 -311
  108. package/elements/character-display/character-display-element.metadata.json +1 -1
  109. package/elements/datetime-display/datetime-display-element.d.ts +22 -21
  110. package/elements/datetime-display/datetime-display-element.js +140 -132
  111. package/elements/datetime-display/datetime-display-element.metadata.json +1 -1
  112. package/elements/datetime-display/time-zone-select-json.d.ts +8 -0
  113. package/elements/datetime-display/time-zone-select-json.js +558 -0
  114. package/elements/historical-curve/historical-curve-element-status.d.ts +6 -6
  115. package/elements/historical-curve/historical-curve-element-status.js +7 -7
  116. package/elements/historical-curve/historical-curve.element.d.ts +96 -59
  117. package/elements/historical-curve/historical-curve.element.js +990 -364
  118. package/elements/historical-curve/historical-curve.element.metadata.json +1 -1
  119. package/elements/historical-curve/historical-curve.element.option.d.ts +13 -13
  120. package/elements/historical-curve/historical-curve.time-period.d.ts +4 -4
  121. package/elements/main-element.d.ts +46 -45
  122. package/elements/main-element.js +373 -307
  123. package/elements/main-element.metadata.json +1 -1
  124. package/elements/meter-element.d.ts +26 -20
  125. package/elements/meter-element.js +139 -70
  126. package/elements/meter-element.metadata.json +1 -1
  127. package/elements/numerical-display/numerical-display-element.d.ts +60 -41
  128. package/elements/numerical-display/numerical-display-element.js +476 -361
  129. package/elements/numerical-display/numerical-display-element.metadata.json +1 -1
  130. package/elements/per-view-variable-communicator.d.ts +20 -17
  131. package/elements/per-view-variable-communicator.js +59 -45
  132. package/elements/per-view-variable-communicator.metadata.json +1 -1
  133. package/elements/pipe/pipe-element.d.ts +19 -19
  134. package/elements/pipe/pipe-element.js +141 -141
  135. package/elements/ring-graph/ring-graph-element.d.ts +31 -19
  136. package/elements/ring-graph/ring-graph-element.js +250 -89
  137. package/elements/ring-graph/ring-graph-element.metadata.json +1 -1
  138. package/elements/scroll-alarm/scroll-alarm-element.d.ts +74 -0
  139. package/elements/scroll-alarm/scroll-alarm-element.js +761 -0
  140. package/elements/scroll-alarm/scroll-alarm-element.metadata.json +1 -0
  141. package/elements/shared/graph/graph-state-element.d.ts +28 -27
  142. package/elements/shared/graph/graph-state-element.js +139 -110
  143. package/elements/shared/graph/graph-state-element.metadata.json +1 -1
  144. package/elements/shared/math-utils.d.ts +2 -2
  145. package/elements/shared/math-utils.js +14 -14
  146. package/elements/shared/text/text-element.d.ts +22 -8
  147. package/elements/shared/text/text-element.js +106 -68
  148. package/elements/shared/text/text-element.metadata.json +1 -1
  149. package/elements/shared/text/text-state-element.d.ts +58 -23
  150. package/elements/shared/text/text-state-element.js +286 -136
  151. package/elements/shared/text/text-state-element.metadata.json +1 -1
  152. package/elements/shared/text/text-state.model.d.ts +5 -5
  153. package/elements/shared/text/text-utils.d.ts +5 -5
  154. package/elements/shared/text/text-utils.js +45 -45
  155. package/elements/static-elements/hyperlink-element.d.ts +40 -14
  156. package/elements/static-elements/hyperlink-element.js +197 -48
  157. package/elements/static-elements/hyperlink-element.metadata.json +1 -1
  158. package/elements/static-elements/image-element.d.ts +14 -14
  159. package/elements/static-elements/image-element.js +41 -41
  160. package/elements/static-elements/text-element.d.ts +42 -16
  161. package/elements/static-elements/text-element.js +205 -55
  162. package/elements/static-elements/text-element.metadata.json +1 -1
  163. package/elements/switch-indicator-light/bit-indicator-light-operator.d.ts +21 -20
  164. package/elements/switch-indicator-light/bit-indicator-light-operator.js +85 -78
  165. package/elements/switch-indicator-light/bit-indicator-light-operator.metadata.json +1 -1
  166. package/elements/switch-indicator-light/bit-switch-operator.d.ts +19 -19
  167. package/elements/switch-indicator-light/bit-switch-operator.js +107 -107
  168. package/elements/switch-indicator-light/current-stateId-value.d.ts +6 -6
  169. package/elements/switch-indicator-light/current-stateId-value.js +8 -8
  170. package/elements/switch-indicator-light/indicator-light-operator.d.ts +8 -8
  171. package/elements/switch-indicator-light/switch-indicator-light-element.d.ts +48 -39
  172. package/elements/switch-indicator-light/switch-indicator-light-element.js +302 -251
  173. package/elements/switch-indicator-light/switch-indicator-light-element.metadata.json +1 -1
  174. package/elements/switch-indicator-light/switch-operator.d.ts +6 -6
  175. package/elements/switch-indicator-light/word-indicator-light-operator.d.ts +19 -18
  176. package/elements/switch-indicator-light/word-indicator-light-operator.js +72 -65
  177. package/elements/switch-indicator-light/word-indicator-light-operator.metadata.json +1 -1
  178. package/elements/switch-indicator-light/word-switch-operator.d.ts +18 -18
  179. package/elements/switch-indicator-light/word-switch-operator.js +75 -75
  180. package/elements/table/table-element.d.ts +9 -9
  181. package/elements/table/table-element.js +6 -6
  182. package/elements/vector-graphics/ellipse-element.d.ts +9 -9
  183. package/elements/vector-graphics/ellipse-element.js +6 -6
  184. package/elements/vector-graphics/poly-line-element.d.ts +12 -12
  185. package/elements/vector-graphics/poly-line-element.js +19 -19
  186. package/elements/vector-graphics/polygon-element.d.ts +12 -12
  187. package/elements/vector-graphics/polygon-element.js +19 -19
  188. package/elements/vector-graphics/rectangle-element.d.ts +9 -9
  189. package/elements/vector-graphics/rectangle-element.js +6 -6
  190. package/elements/vector-graphics/sector-element.d.ts +9 -9
  191. package/elements/vector-graphics/sector-element.js +6 -6
  192. package/elements/vector-graphics/straight-line-element.d.ts +12 -12
  193. package/elements/vector-graphics/straight-line-element.js +19 -19
  194. package/elements/video/video-element.d.ts +37 -27
  195. package/elements/video/video-element.js +258 -160
  196. package/elements/video/video-element.metadata.json +1 -1
  197. package/elements/view-operation/view-operation.element.d.ts +62 -36
  198. package/elements/view-operation/view-operation.element.js +348 -194
  199. package/elements/view-operation/view-operation.element.metadata.json +1 -1
  200. package/elements/weather/weater-element.d.ts +38 -38
  201. package/elements/weather/weater-element.js +237 -238
  202. package/gui/gui-context.d.ts +33 -16
  203. package/gui/gui-host.d.ts +50 -50
  204. package/gui/gui-host.js +173 -173
  205. package/gui/gui-view.d.ts +45 -42
  206. package/gui/gui-view.js +265 -204
  207. package/gui/gui-view.metadata.json +1 -1
  208. package/gui/gui.component.d.ts +45 -42
  209. package/gui/gui.component.html +3 -3
  210. package/gui/gui.component.js +240 -227
  211. package/gui/gui.component.metadata.json +1 -1
  212. package/gui/interfaces/gui-options.d.ts +6 -6
  213. package/gui.module.d.ts +2 -2
  214. package/gui.module.js +78 -78
  215. package/localization/index.d.ts +2 -2
  216. package/localization/index.js +2 -2
  217. package/localization/localization.service.d.ts +62 -51
  218. package/localization/localization.service.js +61 -50
  219. package/localization/localization.service.metadata.json +1 -1
  220. package/localization/localization.service.zh_CN.d.ts +2 -2
  221. package/localization/localization.service.zh_CN.js +59 -48
  222. package/localization/localization.service.zh_CN.metadata.json +1 -1
  223. package/logger/console-logger.service.d.ts +13 -13
  224. package/logger/console-logger.service.js +38 -38
  225. package/logger/index.d.ts +2 -2
  226. package/logger/index.js +2 -2
  227. package/logger/logger.service.d.ts +14 -14
  228. package/logger/logger.service.js +2 -2
  229. package/modal/alert/alert-modal.component.d.ts +10 -10
  230. package/modal/alert/alert-modal.component.html +11 -11
  231. package/modal/alert/alert-modal.component.js +38 -38
  232. package/modal/alert/alert-modal.component.less +59 -59
  233. package/modal/confirm-operation/confirm-operation-modal.component.d.ts +10 -10
  234. package/modal/confirm-operation/confirm-operation-modal.component.html +16 -16
  235. package/modal/confirm-operation/confirm-operation-modal.component.js +41 -41
  236. package/modal/confirm-operation/confirm-operation-modal.component.less +58 -58
  237. package/modal/verify-password/verify-password-modal.component.d.ts +18 -18
  238. package/modal/verify-password/verify-password-modal.component.html +22 -22
  239. package/modal/verify-password/verify-password-modal.component.js +66 -66
  240. package/modal/verify-password/verify-password-modal.component.less +65 -65
  241. package/modal/write-character/write-character-modal-args.d.ts +7 -7
  242. package/modal/write-character/write-character-modal-args.js +8 -8
  243. package/modal/write-character/write-character-modal.component.d.ts +25 -25
  244. package/modal/write-character/write-character-modal.component.html +21 -21
  245. package/modal/write-character/write-character-modal.component.js +74 -74
  246. package/modal/write-character/write-character-modal.component.less +49 -49
  247. package/modal/write-value/write-value-modal-args.d.ts +16 -12
  248. package/modal/write-value/write-value-modal-args.js +14 -12
  249. package/modal/write-value/write-value-modal-args.metadata.json +1 -1
  250. package/modal/write-value/write-value-modal.component.d.ts +60 -54
  251. package/modal/write-value/write-value-modal.component.html +26 -21
  252. package/modal/write-value/write-value-modal.component.js +279 -204
  253. package/modal/write-value/write-value-modal.component.less +56 -56
  254. package/modal/write-value/write-value-modal.component.metadata.json +1 -1
  255. package/modal/write-value/write-value-model-result.d.ts +3 -3
  256. package/model/air-quality/air-quality-info.d.ts +23 -0
  257. package/model/air-quality/air-quality-info.js +4 -0
  258. package/model/air-quality/air-quality-info.metadata.json +1 -0
  259. package/model/air-quality/air-quality.model.d.ts +7 -0
  260. package/model/air-quality/air-quality.model.js +0 -0
  261. package/model/air-quality/air-quality.model.metadata.json +1 -0
  262. package/model/alarm/alarm.model.d.ts +13 -0
  263. package/model/alarm/alarm.model.js +0 -0
  264. package/model/alarm/alarm.model.metadata.json +1 -0
  265. package/model/bar-graph/FontStyleData.d.ts +7 -7
  266. package/model/bar-graph/bar-graph-direction.d.ts +6 -6
  267. package/model/bar-graph/bar-graph-direction.js +7 -7
  268. package/model/bar-graph/bar-graph.d.ts +26 -22
  269. package/model/base/base-element-model.d.ts +5 -5
  270. package/model/base/base-element-model.js +2 -2
  271. package/model/base/conditional-control-model.d.ts +6 -6
  272. package/model/base/conditional-display-model.d.ts +9 -9
  273. package/model/base/conditional-dynamic-display-model.d.ts +13 -13
  274. package/model/base/conditional-enable-model.d.ts +9 -9
  275. package/model/base/font-setting-model.d.ts +29 -8
  276. package/model/base/font-setting-model.metadata.json +1 -1
  277. package/model/base/index.d.ts +7 -7
  278. package/model/base/index.js +1 -1
  279. package/model/base/readable-model.d.ts +14 -10
  280. package/model/base/security-model.d.ts +6 -6
  281. package/model/character-display/character-display.d.ts +19 -19
  282. package/model/datetime-display/date-format-type.d.ts +5 -5
  283. package/model/datetime-display/date-format-type.js +6 -6
  284. package/model/datetime-display/datetime-display-settings.d.ts +17 -17
  285. package/model/datetime-display/datetime-display.d.ts +21 -20
  286. package/model/datetime-display/datetime-separator-type.d.ts +6 -6
  287. package/model/datetime-display/datetime-separator-type.js +7 -7
  288. package/model/datetime-display/time-format-type.d.ts +4 -4
  289. package/model/datetime-display/time-format-type.js +5 -5
  290. package/model/historical-curve/curve-type.d.ts +5 -5
  291. package/model/historical-curve/curve-type.js +6 -6
  292. package/model/historical-curve/historical-curve-axis-settings.d.ts +17 -6
  293. package/model/historical-curve/historical-curve-axis-settings.js +5 -0
  294. package/model/historical-curve/historical-curve-axis-settings.metadata.json +1 -1
  295. package/model/historical-curve/historical-curve-chanel.model.d.ts +22 -14
  296. package/model/historical-curve/historical-curve.data-settings.d.ts +9 -9
  297. package/model/historical-curve/historical-curve.display-settings.d.ts +19 -19
  298. package/model/historical-curve/historical-curve.model.d.ts +8 -8
  299. package/model/historical-curve/index.d.ts +4 -4
  300. package/model/hyperlink/hyperlink.model.d.ts +8 -8
  301. package/model/image/image-fill-type.d.ts +4 -4
  302. package/model/image/image-fill-type.js +5 -5
  303. package/model/image/image.d.ts +9 -9
  304. package/model/index.d.ts +15 -15
  305. package/model/index.js +8 -8
  306. package/model/meter/meter.d.ts +17 -13
  307. package/model/numerical-display/index.d.ts +8 -8
  308. package/model/numerical-display/index.js +2 -2
  309. package/model/numerical-display/numerical-display.d.ts +29 -29
  310. package/model/numerical-display/numerical-operation-settings.d.ts +6 -6
  311. package/model/numerical-display/numerical-operation-type.d.ts +4 -4
  312. package/model/numerical-display/numerical-operation-type.js +5 -5
  313. package/model/numerical-display/numerical-operation.d.ts +19 -11
  314. package/model/numerical-display/proportional-conversion.d.ts +4 -4
  315. package/model/numerical-display/type-settings.d.ts +6 -6
  316. package/model/numerical-display/zoom.d.ts +4 -4
  317. package/model/pipe/flow-direction-type.d.ts +4 -4
  318. package/model/pipe/flow-direction-type.js +5 -5
  319. package/model/pipe/index.d.ts +2 -2
  320. package/model/pipe/index.js +1 -1
  321. package/model/pipe/pipe.d.ts +17 -17
  322. package/model/poly-line/poly-line-model.d.ts +4 -4
  323. package/model/polygon/polygon-model.d.ts +4 -4
  324. package/model/ring-graph/ring-graph.model.d.ts +33 -25
  325. package/model/scroll-alarm/scroll-alarm.model.d.ts +21 -0
  326. package/model/scroll-alarm/scroll-alarm.model.js +0 -0
  327. package/model/scroll-alarm/scroll-alarm.model.metadata.json +1 -0
  328. package/model/settings/background/view-background-fill-type.d.ts +5 -5
  329. package/model/settings/background/view-background-fill-type.js +6 -6
  330. package/model/settings/background/view-background.model.d.ts +8 -8
  331. package/model/settings/index.d.ts +3 -3
  332. package/model/settings/index.js +2 -2
  333. package/model/settings/popup/view-popup-backdrop-type.d.ts +4 -4
  334. package/model/settings/popup/view-popup-backdrop-type.js +5 -5
  335. package/model/settings/popup/view-popup-location-type.d.ts +4 -4
  336. package/model/settings/popup/view-popup-location-type.js +5 -5
  337. package/model/settings/popup/view-popup-setting.model.d.ts +17 -17
  338. package/model/settings/popup/view-popup-setting.model.js +2 -2
  339. package/model/settings/view-settings.model.d.ts +6 -6
  340. package/model/shared/alarm/alarm-range.model.d.ts +6 -6
  341. package/model/shared/arc.model.d.ts +4 -4
  342. package/model/shared/binary.d.ts +7 -7
  343. package/model/shared/binary.js +37 -37
  344. package/model/shared/condition/bit-condition-item-observer.d.ts +14 -14
  345. package/model/shared/condition/bit-condition-item-observer.js +53 -53
  346. package/model/shared/condition/bit-condition-logic.d.ts +4 -4
  347. package/model/shared/condition/bit-condition-logic.js +5 -5
  348. package/model/shared/condition/bit-condition-model.d.ts +8 -8
  349. package/model/shared/condition/bit-condition.d.ts +4 -4
  350. package/model/shared/condition/condition-control-result-value.d.ts +5 -5
  351. package/model/shared/condition/condition-helper.d.ts +4 -4
  352. package/model/shared/condition/condition-helper.js +22 -22
  353. package/model/shared/condition/condition-item-model.d.ts +10 -10
  354. package/model/shared/condition/condition-item-observer.d.ts +12 -12
  355. package/model/shared/condition/condition-item-observer.js +14 -14
  356. package/model/shared/condition/condition-items-observer.d.ts +5 -5
  357. package/model/shared/condition/condition-items-result-observer.d.ts +16 -16
  358. package/model/shared/condition/condition-items-result-observer.js +87 -87
  359. package/model/shared/condition/condition-model.d.ts +6 -6
  360. package/model/shared/condition/condition-type.d.ts +4 -4
  361. package/model/shared/condition/condition-type.js +5 -5
  362. package/model/shared/condition/convert-condition-model.d.ts +5 -5
  363. package/model/shared/condition/index.d.ts +11 -11
  364. package/model/shared/condition/index.js +4 -4
  365. package/model/shared/condition/relation-condition-result-state.d.ts +6 -6
  366. package/model/shared/condition/relation-condition-result-state.js +8 -8
  367. package/model/shared/condition/relation-condition-result.d.ts +8 -8
  368. package/model/shared/condition/relation-condition-result.js +7 -7
  369. package/model/shared/condition/relation-type.d.ts +5 -5
  370. package/model/shared/condition/relation-type.js +6 -6
  371. package/model/shared/condition/relational-operator.d.ts +8 -8
  372. package/model/shared/condition/relational-operator.js +9 -9
  373. package/model/shared/condition/variable-value-logic-model.d.ts +11 -11
  374. package/model/shared/condition/variable-value-type.d.ts +4 -4
  375. package/model/shared/condition/variable-value-type.js +5 -5
  376. package/model/shared/condition/word-condition-item-observer.d.ts +21 -21
  377. package/model/shared/condition/word-condition-item-observer.js +165 -165
  378. package/model/shared/condition/word-condition-model.d.ts +8 -8
  379. package/model/shared/condition/word-condition.d.ts +5 -5
  380. package/model/shared/data-type/display-data-type.d.ts +5 -5
  381. package/model/shared/data-type/display-data-type.js +6 -6
  382. package/model/shared/data-type/fbox-data-type.d.ts +15 -15
  383. package/model/shared/data-type/fbox-data-type.js +16 -16
  384. package/model/shared/data-type/fcloud-data-Type.d.ts +8 -8
  385. package/model/shared/data-type/fcloud-data-Type.js +9 -9
  386. package/model/shared/dynamic-display/dynamic-behavior-type.d.ts +5 -5
  387. package/model/shared/dynamic-display/dynamic-behavior-type.js +6 -6
  388. package/model/shared/dynamic-display/dynamic-display-behavior-model.d.ts +5 -5
  389. package/model/shared/dynamic-display/dynamic-display-model.d.ts +10 -10
  390. package/model/shared/dynamic-display/dynamic-display-result-model.d.ts +7 -7
  391. package/model/shared/dynamic-display/dynamic-display-result-model.js +7 -7
  392. package/model/shared/dynamic-display/dynamic-display.d.ts +11 -11
  393. package/model/shared/dynamic-display/dynamic-display.js +35 -35
  394. package/model/shared/graph/custom-style.d.ts +14 -14
  395. package/model/shared/graph/graph-setting.d.ts +10 -10
  396. package/model/shared/index.d.ts +8 -8
  397. package/model/shared/index.js +3 -3
  398. package/model/shared/point.model.d.ts +4 -4
  399. package/model/shared/rotation/rotation-behavior-model.d.ts +4 -4
  400. package/model/shared/rotation/rotation-behavior.d.ts +9 -9
  401. package/model/shared/rotation/rotation-behavior.js +101 -101
  402. package/model/shared/rotation/rotation-direction-type.d.ts +4 -4
  403. package/model/shared/rotation/rotation-direction-type.js +5 -5
  404. package/model/shared/rotation/rotation-model.d.ts +14 -14
  405. package/model/shared/rotation/rotation-observer-model.d.ts +4 -4
  406. package/model/shared/rotation/rotation-observer.d.ts +11 -11
  407. package/model/shared/rotation/rotation-observer.js +28 -28
  408. package/model/shared/scale/scale-mark.model.d.ts +6 -6
  409. package/model/shared/scale/scale-model.d.ts +20 -20
  410. package/model/shared/size.model.d.ts +7 -7
  411. package/model/shared/size.model.js +12 -12
  412. package/model/shared/state/index.d.ts +1 -1
  413. package/model/shared/state/index.js +1 -1
  414. package/model/shared/state/state.d.ts +9 -8
  415. package/model/shared/state/state.js +10 -9
  416. package/model/shared/state/state.metadata.json +1 -1
  417. package/model/shared/text/font.d.ts +10 -10
  418. package/model/shared/text/index.d.ts +2 -2
  419. package/model/shared/text/text.d.ts +8 -5
  420. package/model/shared/translation/translation-behavior-model.d.ts +4 -4
  421. package/model/shared/translation/translation-behavior.d.ts +12 -12
  422. package/model/shared/translation/translation-behavior.js +63 -63
  423. package/model/shared/translation/translation-direction-type.d.ts +4 -4
  424. package/model/shared/translation/translation-direction-type.js +5 -5
  425. package/model/shared/translation/translation-model.d.ts +12 -12
  426. package/model/shared/translation/translation-observer-model.d.ts +4 -4
  427. package/model/shared/translation/translation-observer.d.ts +10 -10
  428. package/model/shared/translation/translation-observer.js +27 -27
  429. package/model/shared/variable/variable-identifier.model.d.ts +5 -5
  430. package/model/shared/variable/variable-name.model.d.ts +5 -5
  431. package/model/straight-line/straight-line-model.d.ts +4 -4
  432. package/model/switch-indicator-light/bit-indicator-light-settings.d.ts +8 -8
  433. package/model/switch-indicator-light/bit-switch-operation.d.ts +6 -6
  434. package/model/switch-indicator-light/bit-switch-operation.js +7 -7
  435. package/model/switch-indicator-light/bit-switch-settings.d.ts +11 -11
  436. package/model/switch-indicator-light/fault-flicker.d.ts +5 -5
  437. package/model/switch-indicator-light/flicker.d.ts +5 -5
  438. package/model/switch-indicator-light/flicker.js +6 -6
  439. package/model/switch-indicator-light/index.d.ts +14 -14
  440. package/model/switch-indicator-light/index.js +5 -5
  441. package/model/switch-indicator-light/indicator-light-fault-flicker.d.ts +5 -5
  442. package/model/switch-indicator-light/indicator-light-settings.d.ts +7 -7
  443. package/model/switch-indicator-light/indicator-light-type.d.ts +4 -4
  444. package/model/switch-indicator-light/indicator-light-type.js +5 -5
  445. package/model/switch-indicator-light/switch-indicator-light.d.ts +35 -33
  446. package/model/switch-indicator-light/switch-indicator-state.d.ts +8 -8
  447. package/model/switch-indicator-light/switch-settings.d.ts +7 -7
  448. package/model/switch-indicator-light/switch-type.d.ts +4 -4
  449. package/model/switch-indicator-light/switch-type.js +5 -5
  450. package/model/switch-indicator-light/word-indicator-light-settings.d.ts +6 -6
  451. package/model/switch-indicator-light/word-switch-operation.d.ts +5 -5
  452. package/model/switch-indicator-light/word-switch-operation.js +6 -6
  453. package/model/switch-indicator-light/word-switch-settings.d.ts +13 -13
  454. package/model/table/table-model.d.ts +9 -9
  455. package/model/text/text.model.d.ts +7 -7
  456. package/model/video/video.model.d.ts +8 -8
  457. package/model/view-operation/index.d.ts +2 -2
  458. package/model/view-operation/index.js +1 -1
  459. package/model/view-operation/view-operation-element.model.d.ts +25 -19
  460. package/model/view-operation/view-operation-type.d.ts +18 -18
  461. package/model/view-operation/view-operation-type.js +19 -19
  462. package/model/weather/weather-info.d.ts +11 -11
  463. package/model/weather/weather-info.js +2 -2
  464. package/model/weather/weather.model.d.ts +7 -7
  465. package/package.json +1 -1
  466. package/public_api.d.ts +14 -14
  467. package/public_api.js +12 -11
  468. package/remote/communication/variable/remote-variable-communicator.d.ts +59 -30
  469. package/remote/communication/variable/remote-variable-communicator.js +395 -215
  470. package/remote/communication/variable/remote-variable-communicator.metadata.json +1 -1
  471. package/remote/communication/variable/remote-variable-protocol.d.ts +18 -13
  472. package/remote/config/graph/get-released-graph-state-result.d.ts +6 -6
  473. package/remote/config/graph/get-released-graph-states.d.ts +4 -4
  474. package/remote/config/graph/graph-state-key.d.ts +6 -6
  475. package/remote/config/graph/graph-state-result.d.ts +5 -5
  476. package/remote/config/graph/graph-state.d.ts +4 -4
  477. package/remote/config/graph/remote-graph-protocol.d.ts +11 -11
  478. package/remote/config/graph/remote-graph-store.d.ts +16 -16
  479. package/remote/config/graph/remote-graph-store.js +101 -101
  480. package/remote/config/image/remote-image-protocol.d.ts +4 -4
  481. package/remote/config/image/remote-image-store.d.ts +8 -8
  482. package/remote/config/image/remote-image-store.js +19 -19
  483. package/remote/config/view/remote-view-protocol.d.ts +8 -8
  484. package/remote/config/view/remote-view-store.d.ts +13 -13
  485. package/remote/config/view/remote-view-store.js +39 -39
  486. package/remote/config/view/view-result.d.ts +4 -4
  487. package/remote/index.d.ts +14 -14
  488. package/remote/index.js +4 -4
  489. package/security/index.d.ts +1 -1
  490. package/security/security-checker.d.ts +3 -3
  491. package/service/index.d.ts +8 -4
  492. package/service/index.js +1 -0
  493. package/service/index.metadata.json +1 -1
  494. package/service/language.service.d.ts +37 -0
  495. package/service/language.service.js +0 -0
  496. package/service/language.service.metadata.json +1 -0
  497. package/service/operation-record/create-operation-record-args.d.ts +5 -5
  498. package/service/operation-record/index.d.ts +3 -3
  499. package/service/operation-record/operation-record.service.d.ts +4 -4
  500. package/service/operation-record/variable-option.model.d.ts +5 -5
  501. package/service/permission-checker.d.ts +3 -3
  502. package/service/released-variable/index.d.ts +1 -0
  503. package/service/released-variable/index.js +0 -0
  504. package/service/released-variable/index.metadata.json +1 -0
  505. package/service/released-variable/released-variable.service.d.ts +4 -0
  506. package/service/released-variable/released-variable.service.js +0 -0
  507. package/service/released-variable/released-variable.service.metadata.json +1 -0
  508. package/service/system-text-library.service.d.ts +77 -0
  509. package/service/system-text-library.service.js +29 -0
  510. package/service/system-text-library.service.metadata.json +1 -0
  511. package/service/text-library.service.d.ts +49 -0
  512. package/service/text-library.service.js +0 -0
  513. package/service/text-library.service.metadata.json +1 -0
  514. package/service/video/index.d.ts +2 -2
  515. package/service/video/video-url.d.ts +4 -4
  516. package/service/video/video.service.d.ts +4 -4
  517. package/service/weather.service.d.ts +4 -3
  518. package/settings/display-mode.d.ts +10 -10
  519. package/settings/display-mode.js +11 -11
  520. package/settings/global-settings.d.ts +7 -7
  521. package/settings/global-settings.js +13 -13
  522. package/settings/index.d.ts +3 -3
  523. package/settings/index.js +3 -3
  524. package/settings/view-resize-mode.d.ts +10 -10
  525. package/settings/view-resize-mode.js +11 -11
  526. package/shared/config-is-empty-error.d.ts +3 -3
  527. package/shared/config-is-empty-error.js +7 -7
  528. package/shared/disposable.d.ts +3 -3
  529. package/shared/graph-extended-style.d.ts +4 -4
  530. package/shared/gui-consts.d.ts +33 -30
  531. package/shared/gui-consts.js +33 -30
  532. package/shared/gui-consts.metadata.json +1 -1
  533. package/shared/index.d.ts +5 -5
  534. package/shared/index.js +3 -3
  535. package/shared/operation-helper.d.ts +6 -6
  536. package/shared/operation-helper.js +38 -38
  537. package/utils/access-permission.d.ts +5 -5
  538. package/utils/access-permission.js +6 -6
  539. package/utils/access-permission.service.d.ts +11 -11
  540. package/utils/access-permission.service.js +30 -30
  541. package/utils/auto-focus.directive.d.ts +6 -6
  542. package/utils/auto-focus.directive.js +27 -27
  543. package/utils/bs-modal-drag.directive.d.ts +7 -7
  544. package/utils/bs-modal-drag.directive.js +38 -38
  545. package/utils/data-type/data-type.service.d.ts +57 -57
  546. package/utils/data-type/data-type.service.js +155 -155
  547. package/utils/data-type/fbox-data-type.service.d.ts +54 -54
  548. package/utils/data-type/fbox-data-type.service.js +300 -260
  549. package/utils/data-type/fcloud-data-type.service.d.ts +55 -55
  550. package/utils/data-type/fcloud-data-type.service.js +203 -203
  551. package/utils/fraction-digit.service.d.ts +41 -41
  552. package/utils/fraction-digit.service.js +133 -133
  553. package/utils/graph-util.d.ts +5 -5
  554. package/utils/graph-util.js +19 -19
  555. package/utils/guid.d.ts +6 -6
  556. package/utils/guid.js +27 -27
  557. package/utils/index.d.ts +7 -7
  558. package/utils/index.js +7 -7
  559. package/utils/numerical-operation-type.d.ts +4 -4
  560. package/utils/numerical-operation-type.js +5 -5
  561. package/utils/numerical-operation.service.d.ts +17 -17
  562. package/utils/numerical-operation.service.js +201 -177
  563. package/utils/variable-util.d.ts +5 -5
  564. package/utils/variable-util.js +11 -11
  565. package/view/popup-view.service.d.ts +7 -7
  566. package/view/view.service.d.ts +6 -6
  567. package/view/view.service.js +20 -20
@@ -0,0 +1,761 @@
1
+ import * as d3 from 'd3';
2
+ import { ConditionalDynamicDisplayElement } from '../base/conditional-dynamic-display-element';
3
+ import { GetAlarmsArgs } from '../../config';
4
+ import * as moment from 'moment';
5
+ import { LOGGER_SERVICE_TOKEN } from '../../logger';
6
+ var ScrollAlarmElementStatus;
7
+ (function (ScrollAlarmElementStatus) {
8
+ ScrollAlarmElementStatus[ScrollAlarmElementStatus["Normal"] = 0] = "Normal";
9
+ ScrollAlarmElementStatus[ScrollAlarmElementStatus["Loading"] = 1] = "Loading"; // 加载中
10
+ })(ScrollAlarmElementStatus || (ScrollAlarmElementStatus = {}));
11
+ export class ScrollAlarmElement extends ConditionalDynamicDisplayElement {
12
+ constructor(element, injector, permissionChecker, variableCommunicator, variableStore, alarmsStore, signalRAppId) {
13
+ var _a, _b, _c, _d, _e, _f;
14
+ super(element, permissionChecker, variableCommunicator, variableStore, signalRAppId);
15
+ this.alarmsStore = alarmsStore;
16
+ this.elementStatus = ScrollAlarmElementStatus.Loading;
17
+ this.alarmNames = [];
18
+ this.isWaitingForAlarmRefresh = false; // 是否正在等待刷新(节流期间)
19
+ this.isScrolling = false;
20
+ this.isDisposed = false;
21
+ this.isRefreshingCurrentPage = false; // 标记是否正在刷新当前页(而不是加载新页)
22
+ // 新的分页和滚动逻辑变量
23
+ this.currentPage = 1;
24
+ this.maxResultCount = 500; // 每页数据量
25
+ this.displayedItems = []; // 当前显示的所有数据
26
+ this.pageWidths = []; // 存储每页的宽度
27
+ this.totalWidth = 0; // 所有显示数据的总宽度
28
+ this.currentLeft = 0;
29
+ this.autoCycle = true;
30
+ this.hasMoreData = true;
31
+ this.isLoadingNextPage = false;
32
+ this.hasTriedFirstPage = false; // 是否已经尝试加载过第一页
33
+ this.isSimulateMode = false; // 是否是模拟运行模式
34
+ this.rootElement.selectAll('*').remove();
35
+ this.setStatusAsLoading();
36
+ this.logger = injector.get(LOGGER_SERVICE_TOKEN);
37
+ this.variableCommunicator = variableCommunicator;
38
+ this.autoCycle = (_b = (_a = this.model.generalSetting) === null || _a === void 0 ? void 0 : _a.autoCycle) !== null && _b !== void 0 ? _b : true;
39
+ this.maxResultCount = (_d = (_c = this.model.generalSetting) === null || _c === void 0 ? void 0 : _c.pageSize) !== null && _d !== void 0 ? _d : 500;
40
+ // 检测是否是模拟运行模式(通过检查 alarmsStore 的标记属性,不受代码混淆影响)
41
+ this.isSimulateMode = alarmsStore && alarmsStore.isSimulationStore === true;
42
+ if (this.model.filterSetting && this.model.filterSetting.detailsData && this.model.filterSetting.detailsData.length > 0) {
43
+ this.alarmNames = this.model.filterSetting.detailsData.map(item => item.name);
44
+ // 如果是模拟运行模式,使用静态显示逻辑(类似设计态)
45
+ if (this.isSimulateMode) {
46
+ // 初始化显示容器
47
+ this.initDisplayContainer();
48
+ // 获取字体设置
49
+ this.headerFont = ((_e = this.model.generalSetting) === null || _e === void 0 ? void 0 : _e.headerFont) || {};
50
+ // 使用静态显示逻辑:只显示字段标签
51
+ this.renderStaticDisplay();
52
+ this.setStatusAsNormal();
53
+ }
54
+ else {
55
+ // 真实运行模式:使用原有的数据查询逻辑
56
+ this.updateQueryTimeRange();
57
+ // 监听告警更新 (带节流,1秒内只执行一次)
58
+ variableCommunicator.subscribeUserDeviceAlarms(signalRAppId).subscribe(alarms => {
59
+ alarms.forEach(alarm => {
60
+ if (this.alarmNames.indexOf(alarm.name) !== -1) {
61
+ // 如果已经在等待刷新,直接返回,避免重复清理和创建定时器
62
+ if (this.isWaitingForAlarmRefresh) {
63
+ return;
64
+ }
65
+ // 标记为等待刷新状态
66
+ this.isWaitingForAlarmRefresh = true;
67
+ // 设置节流定时器,1秒后执行
68
+ this.alarmRefreshThrottleId = setTimeout(() => {
69
+ // 收到新告警消息,实时替换当前滚动内容,不影响滚动
70
+ this.replaceCurrentScrollingContent();
71
+ // 重置等待刷新标志
72
+ this.isWaitingForAlarmRefresh = false;
73
+ }, 1000);
74
+ return;
75
+ }
76
+ });
77
+ });
78
+ // 初始化显示容器
79
+ this.initDisplayContainer();
80
+ // 获取字体设置 - 参考 text-element.ts 的实现方式
81
+ this.headerFont = ((_f = this.model.generalSetting) === null || _f === void 0 ? void 0 : _f.headerFont) || {};
82
+ this.getAlarmData();
83
+ }
84
+ }
85
+ else {
86
+ // 未配置告警(没有勾选过告警),不执行,直接展示空
87
+ this.displayedItems = [];
88
+ // 初始化显示容器以显示空内容
89
+ this.initDisplayContainer();
90
+ if (this.allAlarmsContainer) {
91
+ while (this.allAlarmsContainer.firstChild) {
92
+ this.allAlarmsContainer.removeChild(this.allAlarmsContainer.firstChild);
93
+ }
94
+ this.totalWidth = 0;
95
+ this.pageWidths = [];
96
+ }
97
+ this.setStatusAsNormal();
98
+ }
99
+ }
100
+ dispose() {
101
+ this.isDisposed = true;
102
+ clearInterval(this.scrollIntervalId);
103
+ clearTimeout(this.getAlarmDataId);
104
+ clearTimeout(this.alarmRefreshThrottleId);
105
+ if (this.element && this.element.tooltip) {
106
+ this.element.tooltip.hidden(true);
107
+ }
108
+ this.logger.debug(`[GUI]Dispose Scroll Alarm Refresh Interval:${d3.time.format('%x %X')(new Date())}`);
109
+ // 重置所有状态
110
+ this.isScrolling = false;
111
+ }
112
+ getAlarmData() {
113
+ if (this.isDisposed || this.isLoadingNextPage)
114
+ return;
115
+ this.isLoadingNextPage = true;
116
+ // Only show loading for the first page load
117
+ if (this.currentPage === 1 && this.displayedItems.length === 0) {
118
+ this.setStatusAsLoading();
119
+ }
120
+ clearTimeout(this.getAlarmDataId);
121
+ this.getAlarmDataId = setTimeout(() => {
122
+ var _a, _b;
123
+ this.updateQueryTimeRange();
124
+ const skipCount = (this.currentPage - 1) * this.maxResultCount;
125
+ // 从配置中获取状态和排序设置
126
+ const selectedStates = (_a = this.model.generalSetting) === null || _a === void 0 ? void 0 : _a.selectState; // 前端使用的字段名
127
+ const timeSort = (_b = this.model.generalSetting) === null || _b === void 0 ? void 0 : _b.timeSort; // 前端使用的字段名
128
+ // 构建排序字符串 - API 字段名是 sorting
129
+ let sorting;
130
+ if (timeSort === '0') {
131
+ sorting = 'TriggeredTime ASC'; // 升序
132
+ }
133
+ else if (timeSort === '1') {
134
+ sorting = 'TriggeredTime DESC'; // 降序
135
+ }
136
+ // 后端 API 的 state 参数现已支持数组,直接传递 selectedStates
137
+ // 兼容处理:如果 selectedStates 为空数组或 undefined,传 undefined(不过滤)
138
+ const stateFilter = (selectedStates && Array.isArray(selectedStates) && selectedStates.length > 0)
139
+ ? selectedStates
140
+ : undefined;
141
+ const input = new GetAlarmsArgs(this.alarmNames, this.startTime, this.endTime, this.maxResultCount, skipCount, stateFilter, // 传递状态数组到后端,后端已支持数组过滤
142
+ sorting // 传递排序参数
143
+ );
144
+ this.alarmsStore.getHistoryAlarms(input).subscribe(result => {
145
+ this.isLoadingNextPage = false;
146
+ if (!result.error && result.items && result.items.length > 0) {
147
+ const newPage = result.items;
148
+ // 检查是否还有更多数据
149
+ // 如果是第一页且数据量少于 maxResultCount,说明总数据不超过一页
150
+ if (this.currentPage === 1 && newPage.length < this.maxResultCount) {
151
+ // 总数据不超过一页,不需要加载更多数据
152
+ this.hasMoreData = false;
153
+ }
154
+ else if (!this.autoCycle && newPage.length < this.maxResultCount) {
155
+ // 非自动循环模式,且当前页数据不足,说明没有更多数据
156
+ this.hasMoreData = false;
157
+ }
158
+ else {
159
+ this.hasMoreData = true;
160
+ }
161
+ if (this.isRefreshingCurrentPage) {
162
+ // 刷新当前页模式:替换最后一页的数据,保持滚动位置
163
+ const itemsPerPage = this.maxResultCount;
164
+ const startIndex = (this.currentPage - 1) * itemsPerPage;
165
+ // 移除当前页的旧数据
166
+ this.displayedItems.splice(startIndex, itemsPerPage);
167
+ // 移除当前页的DOM元素
168
+ const oldPageWidth = this.pageWidths.pop() || 0;
169
+ this.totalWidth -= oldPageWidth;
170
+ const elementsToRemove = Array.from(this.allAlarmsContainer.children).slice(startIndex, startIndex + itemsPerPage);
171
+ elementsToRemove.forEach(el => {
172
+ this.allAlarmsContainer.removeChild(el);
173
+ });
174
+ // 插入新的当前页数据
175
+ this.displayedItems.splice(startIndex, 0, ...newPage);
176
+ // 渲染新页(会追加到末尾)
177
+ this.renderNewPage(newPage);
178
+ // 更新页码
179
+ this.currentPage++;
180
+ // 重置标志
181
+ this.isRefreshingCurrentPage = false;
182
+ }
183
+ else {
184
+ // 正常加载新页模式:追加数据
185
+ this.displayedItems = this.displayedItems.concat(newPage);
186
+ // 渲染新页
187
+ this.renderNewPage(newPage);
188
+ // 更新页码
189
+ this.currentPage++;
190
+ }
191
+ // 检查是否需要删除旧页(保持最多3页)
192
+ if (this.currentPage > 4) {
193
+ this.removeOldestPage();
194
+ }
195
+ // 如果是首次加载或还没有开始滚动,初始化滚动
196
+ if (!this.isScrolling && this.displayedItems.length > 0) {
197
+ this.initScrolling();
198
+ }
199
+ this.setStatusAsNormal();
200
+ this.hasTriedFirstPage = true;
201
+ }
202
+ else {
203
+ // 如果没有数据
204
+ if (this.currentPage === 1 && !this.hasTriedFirstPage) {
205
+ // 第一次加载就没有数据,设置为正常状态,停止加载
206
+ this.hasTriedFirstPage = true;
207
+ this.hasMoreData = false;
208
+ this.setStatusAsNormal();
209
+ // 清空显示
210
+ this.displayedItems = [];
211
+ if (this.allAlarmsContainer) {
212
+ while (this.allAlarmsContainer.firstChild) {
213
+ this.allAlarmsContainer.removeChild(this.allAlarmsContainer.firstChild);
214
+ }
215
+ this.totalWidth = 0;
216
+ this.pageWidths = [];
217
+ }
218
+ }
219
+ else if (this.autoCycle && this.hasTriedFirstPage && this.displayedItems.length > 0) {
220
+ // 不是第一页,且之前有数据,自动循环开启,循环回到第一页
221
+ this.currentPage = 1;
222
+ this.getAlarmData();
223
+ }
224
+ else {
225
+ // 其他情况:停止加载
226
+ this.hasMoreData = false;
227
+ this.setStatusAsNormal();
228
+ }
229
+ }
230
+ }, error => {
231
+ this.isLoadingNextPage = false;
232
+ this.setStatusAsNormal();
233
+ this.logger.error('Failed to get alarm data:', error);
234
+ });
235
+ }, 500);
236
+ }
237
+ initDisplayContainer() {
238
+ var _a;
239
+ const elementHeight = this.model.size.height;
240
+ const elementWidth = this.model.size.width;
241
+ const bgColor = ((_a = this.model.generalSetting) === null || _a === void 0 ? void 0 : _a.headerFillColor) || '#ffffff';
242
+ const clipId = 'scroll-alarm-clip-' + Math.random().toString(36).slice(2);
243
+ // 背景矩形
244
+ this.bgRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
245
+ this.bgRect.setAttribute('x', '0');
246
+ this.bgRect.setAttribute('y', '0');
247
+ this.bgRect.setAttribute('width', elementWidth.toString());
248
+ this.bgRect.setAttribute('height', elementHeight.toString());
249
+ this.bgRect.setAttribute('fill', bgColor);
250
+ this.bgRect.setAttribute('stroke', '#8ea0aa');
251
+ this.bgRect.setAttribute('stroke-width', '1');
252
+ this.$element[0].appendChild(this.bgRect);
253
+ // clipPath 限制文字滚动区域
254
+ const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
255
+ const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
256
+ clipPath.setAttribute('id', clipId);
257
+ const clipRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
258
+ clipRect.setAttribute('x', '2');
259
+ clipRect.setAttribute('y', '1');
260
+ clipRect.setAttribute('width', (elementWidth - 4).toString());
261
+ clipRect.setAttribute('height', (elementHeight - 2).toString());
262
+ clipPath.appendChild(clipRect);
263
+ defs.appendChild(clipPath);
264
+ this.$element[0].appendChild(defs);
265
+ // 滚动内容的 g 容器,套上 clipPath
266
+ this.scrollGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
267
+ this.scrollGroup.setAttribute('clip-path', `url(#${clipId})`);
268
+ this.$element[0].appendChild(this.scrollGroup);
269
+ // 内部 g 用于整体平移(滚动动画改这个的 transform)
270
+ this.allAlarmsContainer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
271
+ this.scrollGroup.appendChild(this.allAlarmsContainer);
272
+ // 初始位置在右侧屏幕外
273
+ this.currentLeft = elementWidth;
274
+ this.allAlarmsContainer.setAttribute('transform', `translate(${elementWidth}, 0)`);
275
+ }
276
+ _buildFontAttrs() {
277
+ const f = this.headerFont || {};
278
+ const fontSize = parseInt((f.fontSize || '16px'), 10);
279
+ return {
280
+ fontSize,
281
+ fontFamily: f.fontFamily || 'Microsoft YaHei',
282
+ color: f.color || '#e33c39',
283
+ isBold: !!f.isBold,
284
+ isItalic: !!f.isItalic,
285
+ isUnderline: !!f.isUnderline
286
+ };
287
+ }
288
+ _createSvgTextNode(textContent) {
289
+ const elementHeight = this.model.size.height;
290
+ const fa = this._buildFontAttrs();
291
+ const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
292
+ const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
293
+ const textY = elementHeight / 2;
294
+ text.setAttribute('y', textY.toString());
295
+ text.setAttribute('dominant-baseline', 'central');
296
+ text.setAttribute('fill', fa.color);
297
+ text.setAttribute('font-size', fa.fontSize.toString());
298
+ text.setAttribute('font-family', fa.fontFamily);
299
+ if (fa.isBold) {
300
+ text.setAttribute('font-weight', 'bold');
301
+ }
302
+ if (fa.isItalic) {
303
+ text.setAttribute('font-style', 'italic');
304
+ }
305
+ // 不使用 SVG text-decoration,避免跨平台下划线位置不一致(Chrome/Android 与 iOS Safari 渲染差异)
306
+ text.textContent = textContent;
307
+ g.appendChild(text);
308
+ if (fa.isUnderline) {
309
+ // dominant-baseline: central 下,基线约在 textY + fontSize*0.35
310
+ // 下划线紧贴文字底部(基线下 fontSize*0.1),再加 2px 间距避免与字形粘连
311
+ // stroke-width 随字号缩放,参照浏览器标准约 fontSize/14,最小 1px
312
+ const lineY = textY + Math.round(fa.fontSize * 0.35) + Math.round(fa.fontSize * 0.1) + 2;
313
+ const strokeWidth = Math.max(1, Math.round(fa.fontSize / 14));
314
+ const underline = document.createElementNS('http://www.w3.org/2000/svg', 'line');
315
+ underline.setAttribute('y1', lineY.toString());
316
+ underline.setAttribute('y2', lineY.toString());
317
+ underline.setAttribute('x1', '0');
318
+ underline.setAttribute('x2', '0'); // 宽度在 append 后由 _updateUnderlineWidth 设置
319
+ underline.setAttribute('stroke', fa.color);
320
+ underline.setAttribute('stroke-width', strokeWidth.toString());
321
+ underline.setAttribute('class', 'text-underline');
322
+ g.appendChild(underline);
323
+ }
324
+ return g;
325
+ }
326
+ _getSvgTextWidth(g) {
327
+ const text = g.querySelector('text');
328
+ if (!text) {
329
+ return 100;
330
+ }
331
+ return text.getComputedTextLength
332
+ ? text.getComputedTextLength()
333
+ : (text.getBBox ? text.getBBox().width : 100);
334
+ }
335
+ _updateUnderlineWidth(g, width) {
336
+ const underline = g.querySelector('line.text-underline');
337
+ if (underline) {
338
+ underline.setAttribute('x2', width.toString());
339
+ }
340
+ }
341
+ renderNewPage(pageData) {
342
+ const GAP = 80;
343
+ let pageWidth = 0;
344
+ // 新页的起始 x = 已有总宽度 + gap(如果已有内容)
345
+ let xOffset = this.totalWidth > 0 ? this.totalWidth + GAP : 0;
346
+ pageData.forEach((alarm) => {
347
+ var _a, _b, _c, _d, _e, _f, _g, _h;
348
+ const contentParts = [];
349
+ if (((_a = this.model.generalSetting) === null || _a === void 0 ? void 0 : _a.showTriggerTime) && alarm.triggeredTime) {
350
+ contentParts.push(moment(alarm.triggeredTime).format('YYYY/MM/DD HH:mm:ss'));
351
+ }
352
+ const language = ((_d = (_c = (_b = window.abp) === null || _b === void 0 ? void 0 : _b.localization) === null || _c === void 0 ? void 0 : _c.currentLanguage) === null || _d === void 0 ? void 0 : _d.name) || 'zh-Hans';
353
+ const isChinese = language === 'zh-Hans' || language === 'zh';
354
+ if (((_e = this.model.generalSetting) === null || _e === void 0 ? void 0 : _e.showAlarmLevel) && alarm.alarmLevel !== undefined) {
355
+ const levelMap = isChinese ? ['警告', '次要', '主要', '严重'] : ['Warning', 'Minor', 'Major', 'Critical'];
356
+ contentParts.push(levelMap[alarm.alarmLevel] || (isChinese ? '警告' : 'Warning'));
357
+ }
358
+ if (((_f = this.model.generalSetting) === null || _f === void 0 ? void 0 : _f.showAlarmName) && alarm.name) {
359
+ contentParts.push(alarm.name);
360
+ }
361
+ if (((_g = this.model.generalSetting) === null || _g === void 0 ? void 0 : _g.showAlarmContent) && alarm.message) {
362
+ contentParts.push(alarm.message);
363
+ }
364
+ if (((_h = this.model.generalSetting) === null || _h === void 0 ? void 0 : _h.showAlarmState) && alarm.state !== undefined) {
365
+ const stateMap = isChinese
366
+ ? ['触发/未确认', '触发/已确认', '恢复/未确认', '恢复/已确认']
367
+ : ['Triggered/Unconfirmed', 'Triggered/Confirmed', 'Restored/Unconfirmed', 'Restored/Confirmed'];
368
+ contentParts.push(stateMap[alarm.state] || (isChinese ? '触发/未确认' : 'Triggered/Unconfirmed'));
369
+ }
370
+ const textNode = this._createSvgTextNode(contentParts.join(' '));
371
+ textNode.setAttribute('transform', `translate(${xOffset}, 0)`);
372
+ this.allAlarmsContainer.appendChild(textNode);
373
+ const textWidth = this._getSvgTextWidth(textNode);
374
+ this._updateUnderlineWidth(textNode, textWidth);
375
+ xOffset += textWidth + GAP;
376
+ pageWidth += (pageWidth > 0 ? GAP : 0) + textWidth;
377
+ });
378
+ this.pageWidths.push(pageWidth);
379
+ this.totalWidth += (this.totalWidth > 0 && pageWidth > 0 ? GAP : 0) + pageWidth;
380
+ }
381
+ _rebaseTextNodes() {
382
+ const GAP = 80;
383
+ let x = 0;
384
+ Array.from(this.allAlarmsContainer.children).forEach(node => {
385
+ node.setAttribute('transform', `translate(${x}, 0)`);
386
+ const w = this._getSvgTextWidth(node);
387
+ this._updateUnderlineWidth(node, w);
388
+ x += w + GAP;
389
+ });
390
+ const newTotal = x > 0 ? x - GAP : 0;
391
+ this.totalWidth = newTotal;
392
+ this.pageWidths = [newTotal];
393
+ }
394
+ removeOldestPage() {
395
+ // 移除最旧的一页数据
396
+ this.displayedItems.splice(0, this.maxResultCount);
397
+ const oldPageWidth = this.pageWidths.shift() || 0;
398
+ this.totalWidth -= oldPageWidth + (this.pageWidths.length > 0 ? 80 : 0);
399
+ // 从DOM中移除最旧的元素
400
+ const elementsToRemove = Array.from(this.allAlarmsContainer.children).slice(0, this.maxResultCount);
401
+ elementsToRemove.forEach(el => {
402
+ this.allAlarmsContainer.removeChild(el);
403
+ });
404
+ // g 元素的 transform 从 0 重排(DOM删除后剩余节点要重新编排位置)
405
+ const GAP = 80;
406
+ let x = 0;
407
+ Array.from(this.allAlarmsContainer.children).forEach(node => {
408
+ node.setAttribute('transform', `translate(${x}, 0)`);
409
+ const w = this._getSvgTextWidth(node);
410
+ this._updateUnderlineWidth(node, w);
411
+ x += w + GAP;
412
+ });
413
+ // currentLeft 补偿被移除页的宽度(含 gap),保持视觉位置不变
414
+ requestAnimationFrame(() => {
415
+ this.currentLeft += oldPageWidth + 80;
416
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
417
+ });
418
+ }
419
+ scrollContent() {
420
+ if (this.displayedItems.length <= 0)
421
+ return;
422
+ // 每次滚动的距离
423
+ const scrollStep = 2; // 减小滚动步长,使滚动更平滑
424
+ // 更新位置 - 从右往左滚动
425
+ this.currentLeft -= scrollStep;
426
+ // 检查是否需要加载下一页(只有在自动循环模式下才需要预加载)
427
+ if (this.autoCycle && this.hasMoreData && !this.isLoadingNextPage) {
428
+ const currentPosition = Math.abs(this.currentLeft);
429
+ const loadedWidth = this.totalWidth - (this.pageWidths[this.pageWidths.length - 1] || 0);
430
+ // 当滚动到已加载内容的60%时,加载下一页(提前预加载,确保无缝衔接)
431
+ if (currentPosition > loadedWidth * 0.6) {
432
+ this.getAlarmData();
433
+ }
434
+ }
435
+ // 当内容完全滚出容器左侧时(currentLeft + totalWidth < -50)
436
+ // 说明所有内容都已经滚出视图(不开启自动循环时多滚动50px确保最后一个字完全滚出)
437
+ if (this.currentLeft + this.totalWidth < -50) {
438
+ if (this.autoCycle) {
439
+ if (this.hasMoreData) {
440
+ // 有更多数据:重置到容器宽度,让内容从右侧重新滚入
441
+ this.currentLeft = this.model.size.width;
442
+ }
443
+ else {
444
+ if (this.currentPage > 2) {
445
+ // 数据总数超过一页:重置到第一页并重新查询
446
+ this.resetToFirstPage();
447
+ }
448
+ else {
449
+ // 单页循环:重排 x 从 0 开始,currentLeft 重置到右侧
450
+ this._rebaseTextNodes();
451
+ this.currentLeft = this.model.size.width;
452
+ }
453
+ }
454
+ }
455
+ else {
456
+ // 非循环滚动:停止滚动
457
+ clearInterval(this.scrollIntervalId);
458
+ this.isScrolling = false;
459
+ return; // 提前返回,不再更新位置
460
+ }
461
+ }
462
+ // 更新显示位置
463
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
464
+ }
465
+ initScrolling() {
466
+ clearInterval(this.scrollIntervalId);
467
+ // 如果没有数据,则不启动滚动
468
+ if (this.displayedItems.length === 0) {
469
+ return;
470
+ }
471
+ // 确保初始位置在容器右侧(从右边滚入)
472
+ if (this.currentPage === 1 && this.displayedItems.length <= this.maxResultCount) {
473
+ // 第一页初始加载时,确保从右侧开始
474
+ this.currentLeft = this.model.size.width;
475
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
476
+ }
477
+ const scrollInterval = 100; // 默认100ms,滚动更流畅
478
+ // 延迟启动滚动确保内容渲染完成
479
+ setTimeout(() => {
480
+ this.isScrolling = true;
481
+ this.scrollIntervalId = setInterval(() => {
482
+ if (this.isScrolling) {
483
+ this.scrollContent();
484
+ }
485
+ }, scrollInterval);
486
+ }, 500);
487
+ }
488
+ resetToFirstPage() {
489
+ // 重置到第一页并重新查询数据
490
+ this.currentPage = 1;
491
+ this.hasMoreData = true;
492
+ this.hasTriedFirstPage = false;
493
+ this.displayedItems = [];
494
+ if (this.allAlarmsContainer) {
495
+ while (this.allAlarmsContainer.firstChild) {
496
+ this.allAlarmsContainer.removeChild(this.allAlarmsContainer.firstChild);
497
+ }
498
+ this.totalWidth = 0;
499
+ this.pageWidths = [];
500
+ }
501
+ // 重置到容器右侧,让内容从右边滚入
502
+ this.currentLeft = this.model.size.width;
503
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
504
+ this.getAlarmData();
505
+ }
506
+ updateQueryTimeRange() {
507
+ this.endTime = moment();
508
+ switch (this.model.generalSetting.displayPeriod) {
509
+ case 1:
510
+ this.startTime = moment().subtract(1, 'hours');
511
+ break;
512
+ case 3:
513
+ this.startTime = moment().subtract(7, 'days');
514
+ break;
515
+ case 4:
516
+ this.startTime = moment().subtract(30, 'days');
517
+ break;
518
+ case 5:
519
+ this.startTime = moment().subtract(6, 'months');
520
+ break;
521
+ case 6:
522
+ this.startTime = moment().subtract(30, 'minutes');
523
+ break;
524
+ case 7:
525
+ this.startTime = moment().subtract(8, 'hours');
526
+ break;
527
+ default:
528
+ this.startTime = moment().subtract(1, 'days');
529
+ }
530
+ }
531
+ setStatusAsNormal() {
532
+ this.elementStatus = ScrollAlarmElementStatus.Normal;
533
+ this.clearStatus();
534
+ }
535
+ setStatusAsLoading() {
536
+ this.elementStatus = ScrollAlarmElementStatus.Loading;
537
+ this.renderStatus('assets/img/loading.svg', '#226abc');
538
+ }
539
+ renderStatus(icon, stroke) {
540
+ if (this.elementStatus === ScrollAlarmElementStatus.Normal) {
541
+ this.clearStatus();
542
+ return;
543
+ }
544
+ // 确保宽度和高度为正值,避免 SVG 错误
545
+ const width = Math.max(this.model.size.width || 100, 0);
546
+ const height = Math.max(this.model.size.height || 50, 0);
547
+ // 先移除旧的 StateFrame,避免重复追加
548
+ this.$element.find('rect#StateFrame').remove();
549
+ this.rootElement.append('rect').attr('id', 'StateFrame').attr('fill', 'transparent')
550
+ .attr('width', width)
551
+ .attr('height', height);
552
+ const doc = this.$element[0].ownerDocument;
553
+ const currentRect = this.$element.find('rect#StateFrame').first();
554
+ if (!currentRect.length) {
555
+ return;
556
+ }
557
+ this.$element.find('image#StateImage').remove();
558
+ const imgObj = doc.createElementNS('http://www.w3.org/2000/svg', 'image');
559
+ if (imgObj) {
560
+ let x = Number(currentRect[0].getAttribute('width')) - 20;
561
+ const currentRectX = currentRect[0].getAttribute('x');
562
+ if (currentRectX !== null) {
563
+ x += Number(currentRectX);
564
+ }
565
+ currentRect[0].setAttribute('stroke', stroke);
566
+ currentRect[0].setAttribute('stroke-opacity', '0.5');
567
+ imgObj.href.baseVal = icon;
568
+ imgObj.setAttributeNS(null, 'id', 'StateImage');
569
+ imgObj.setAttributeNS(null, 'x', x.toString());
570
+ imgObj.setAttributeNS(null, 'y', '0');
571
+ imgObj.setAttributeNS(null, 'height', '20px');
572
+ imgObj.setAttributeNS(null, 'width', '20px');
573
+ const titleElement = doc.createElementNS('http://www.w3.org/2000/svg', 'title');
574
+ imgObj.appendChild(titleElement);
575
+ this.$element.append(imgObj);
576
+ }
577
+ }
578
+ clearStatus() {
579
+ this.$element.find('rect#StateFrame').remove();
580
+ this.$element.find('image#StateImage').remove();
581
+ }
582
+ /**
583
+ * 模拟运行时的静态显示逻辑:只显示字段标签,不查询数据
584
+ */
585
+ renderStaticDisplay() {
586
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
587
+ // 根据配置构建显示的字段标签
588
+ const textParts = [];
589
+ if (((_a = this.model.generalSetting) === null || _a === void 0 ? void 0 : _a.showTriggerTime) !== false) {
590
+ // 使用moment.format方法格式化日期时间
591
+ const timeStr = moment().format('YYYY/MM/DD HH:mm:ss');
592
+ textParts.push(timeStr);
593
+ }
594
+ if (((_b = this.model.generalSetting) === null || _b === void 0 ? void 0 : _b.showAlarmLevel) !== false) {
595
+ // 获取当前语言环境
596
+ const language = ((_e = (_d = (_c = window.abp) === null || _c === void 0 ? void 0 : _c.localization) === null || _d === void 0 ? void 0 : _d.currentLanguage) === null || _e === void 0 ? void 0 : _e.name) || 'zh-Hans';
597
+ const isChinese = language === 'zh-Hans' || language === 'zh';
598
+ textParts.push(isChinese ? '严重' : 'Critical');
599
+ }
600
+ if (((_f = this.model.generalSetting) === null || _f === void 0 ? void 0 : _f.showAlarmName) === true) {
601
+ // 获取当前语言环境
602
+ const language = ((_j = (_h = (_g = window.abp) === null || _g === void 0 ? void 0 : _g.localization) === null || _h === void 0 ? void 0 : _h.currentLanguage) === null || _j === void 0 ? void 0 : _j.name) || 'zh-Hans';
603
+ const isChinese = language === 'zh-Hans' || language === 'zh';
604
+ textParts.push(isChinese ? '室内温度' : 'Indoor Temperature');
605
+ }
606
+ if (((_k = this.model.generalSetting) === null || _k === void 0 ? void 0 : _k.showAlarmContent) !== false) {
607
+ // 获取当前语言环境
608
+ const language = ((_o = (_m = (_l = window.abp) === null || _l === void 0 ? void 0 : _l.localization) === null || _m === void 0 ? void 0 : _m.currentLanguage) === null || _o === void 0 ? void 0 : _o.name) || 'zh-Hans';
609
+ const isChinese = language === 'zh-Hans' || language === 'zh';
610
+ textParts.push(isChinese ? '室内温度高于30°C或小于10°C' : 'Indoor temperature is higher than 30℃ or lower than 10℃');
611
+ }
612
+ if (((_p = this.model.generalSetting) === null || _p === void 0 ? void 0 : _p.showAlarmState) === true) {
613
+ // 获取当前语言环境
614
+ const language = ((_s = (_r = (_q = window.abp) === null || _q === void 0 ? void 0 : _q.localization) === null || _r === void 0 ? void 0 : _r.currentLanguage) === null || _s === void 0 ? void 0 : _s.name) || 'zh-Hans';
615
+ const isChinese = language === 'zh-Hans' || language === 'zh';
616
+ textParts.push(isChinese ? '触发/未确认' : 'Triggered/Unconfirmed');
617
+ }
618
+ // 创建 SVG text 节点(与真实运行模式一致,不依赖 foreignObject)
619
+ const textNode = this._createSvgTextNode(textParts.join(' '));
620
+ textNode.setAttribute('transform', 'translate(0, 0)');
621
+ this.currentLeft = this.model.size.width;
622
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
623
+ this.allAlarmsContainer.appendChild(textNode);
624
+ // SVG text 宽度通过内部 text 元素的 getComputedTextLength 获取
625
+ const textWidth = this._getSvgTextWidth(textNode);
626
+ this._updateUnderlineWidth(textNode, textWidth);
627
+ this.totalWidth = textWidth;
628
+ this.pageWidths.push(textWidth);
629
+ // 启动滚动(autoCycle 只控制是否循环,不控制是否滚动)
630
+ this.initStaticScrolling();
631
+ }
632
+ /**
633
+ * 模拟运行时的静态滚动逻辑
634
+ */
635
+ initStaticScrolling() {
636
+ clearInterval(this.scrollIntervalId);
637
+ const scrollInterval = 100;
638
+ // 延迟启动滚动确保内容渲染完成
639
+ setTimeout(() => {
640
+ this.isScrolling = true;
641
+ this.scrollIntervalId = setInterval(() => {
642
+ if (this.isScrolling) {
643
+ this.scrollStaticContent();
644
+ }
645
+ }, scrollInterval);
646
+ }, 500);
647
+ }
648
+ /**
649
+ * 模拟运行时的静态内容滚动
650
+ */
651
+ scrollStaticContent() {
652
+ // 每次滚动的距离
653
+ const scrollStep = 2;
654
+ // 更新位置 - 从右往左滚动
655
+ this.currentLeft -= scrollStep;
656
+ // 更新显示位置
657
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
658
+ // 当内容完全滚出容器左侧时(内容右边缘完全移出容器左边缘)
659
+ // currentLeft + totalWidth 表示内容右边缘的位置
660
+ // 当这个值 <= -50 时,表示内容完全不可见(不开启自动循环时多滚动50px确保最后一个字完全滚出)
661
+ const rightEdge = this.currentLeft + this.totalWidth;
662
+ if (rightEdge <= -50) {
663
+ if (this.autoCycle) {
664
+ // 自动循环模式:重置到容器右侧(使用配置宽度)
665
+ this.currentLeft = this.model.size.width;
666
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
667
+ }
668
+ else {
669
+ // 非循环模式:停止滚动
670
+ clearInterval(this.scrollIntervalId);
671
+ this.isScrolling = false;
672
+ return;
673
+ }
674
+ }
675
+ }
676
+ /**
677
+ * 实时替换当前滚动内容(用于告警数据变化时)
678
+ */
679
+ replaceCurrentScrollingContent() {
680
+ var _a, _b;
681
+ // 更新查询时间范围
682
+ this.updateQueryTimeRange();
683
+ // 查询所有当前应该显示的数据(查询足够多的数据以确保包含所有新增/删除)
684
+ const selectedStates = (_a = this.model.generalSetting) === null || _a === void 0 ? void 0 : _a.selectState;
685
+ const timeSort = (_b = this.model.generalSetting) === null || _b === void 0 ? void 0 : _b.timeSort;
686
+ // 使用一个较大的值确保能查询到所有数据,避免因新增数据导致查询不全
687
+ const queryCount = Math.max(this.displayedItems.length || this.maxResultCount, 100);
688
+ // 确定排序参数
689
+ let sorting = 'TriggeredTime ASC'; // 默认升序
690
+ if (timeSort === 0 || timeSort === '0') {
691
+ sorting = 'TriggeredTime ASC'; // 升序
692
+ }
693
+ else if (timeSort === 1 || timeSort === '1') {
694
+ sorting = 'TriggeredTime DESC'; // 降序
695
+ }
696
+ // 兼容处理:如果 selectedStates 为空数组或 undefined,传 undefined(不过滤)
697
+ const stateFilter = (selectedStates && Array.isArray(selectedStates) && selectedStates.length > 0)
698
+ ? selectedStates
699
+ : undefined;
700
+ const input = new GetAlarmsArgs(this.alarmNames, this.startTime, this.endTime, queryCount, 0, // skipCount
701
+ stateFilter, sorting);
702
+ this.alarmsStore.getHistoryAlarms(input).subscribe(result => {
703
+ if (!result.error && result.items) {
704
+ const newItems = result.items;
705
+ // 如果没有数据,清空显示
706
+ if (newItems.length === 0) {
707
+ this.displayedItems = [];
708
+ this.totalWidth = 0;
709
+ this.pageWidths = [];
710
+ this.currentPage = 1;
711
+ this.hasTriedFirstPage = false;
712
+ this.hasMoreData = true;
713
+ // 清空DOM
714
+ if (this.allAlarmsContainer) {
715
+ while (this.allAlarmsContainer.firstChild) {
716
+ this.allAlarmsContainer.removeChild(this.allAlarmsContainer.firstChild);
717
+ }
718
+ this.currentLeft = this.model.size.width;
719
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
720
+ }
721
+ return;
722
+ }
723
+ // 如果是首次加载或当前没有数据,直接渲染并启动滚动
724
+ if (this.displayedItems.length === 0) {
725
+ this.displayedItems = newItems;
726
+ while (this.allAlarmsContainer.firstChild) {
727
+ this.allAlarmsContainer.removeChild(this.allAlarmsContainer.firstChild);
728
+ }
729
+ this.totalWidth = 0;
730
+ this.pageWidths = [];
731
+ // 设置 hasMoreData 状态,防止滚动时误触发 getAlarmData
732
+ this.hasMoreData = result.totalCount > newItems.length;
733
+ // 设置初始位置到容器右侧
734
+ this.currentLeft = this.model.size.width;
735
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
736
+ this.renderNewPage(newItems);
737
+ // 启动滚动
738
+ if (!this.isScrolling) {
739
+ this.initScrolling();
740
+ }
741
+ return;
742
+ }
743
+ // 保存当前的滚动位置
744
+ const currentScrollPosition = this.currentLeft;
745
+ // 清空所有SVG text节点,重新用 renderNewPage 渲染
746
+ while (this.allAlarmsContainer.firstChild) {
747
+ this.allAlarmsContainer.removeChild(this.allAlarmsContainer.firstChild);
748
+ }
749
+ this.totalWidth = 0;
750
+ this.pageWidths = [];
751
+ this.renderNewPage(newItems);
752
+ // 更新状态
753
+ this.displayedItems = newItems;
754
+ this.hasMoreData = result.totalCount > newItems.length;
755
+ // 保持滚动位置不变,继续滚动
756
+ this.currentLeft = currentScrollPosition;
757
+ this.allAlarmsContainer.setAttribute('transform', `translate(${this.currentLeft}, 0)`);
758
+ }
759
+ });
760
+ }
761
+ }