@flexem/fc-gui 3.0.0-alpha.17 → 3.0.0-alpha.171

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 (193) hide show
  1. package/CHANGELOG.md +424 -1
  2. package/assets/img/black_first_page.png +0 -0
  3. package/assets/img/black_last_page.png +0 -0
  4. package/assets/img/black_next_page.png +0 -0
  5. package/assets/img/black_previous_page.png +0 -0
  6. package/assets/img/exclamation-outline-circle.png +0 -0
  7. package/bundles/@flexem/fc-gui.umd.js +39304 -34437
  8. package/bundles/@flexem/fc-gui.umd.js.map +1 -1
  9. package/bundles/@flexem/fc-gui.umd.min.js +5 -5
  10. package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
  11. package/communication/variable/variable-communicator.d.ts +5 -0
  12. package/communication/variable/variable-state-enum.d.ts +1 -0
  13. package/communication/variable/variable-state-enum.js +1 -0
  14. package/communication/variable/variable-state-enum.metadata.json +1 -1
  15. package/communication/variable/variable-value.d.ts +4 -1
  16. package/communication/variable/variable-value.js +4 -1
  17. package/communication/variable/variable-value.metadata.json +1 -1
  18. package/config/alarm/alarm.store.d.ts +6 -0
  19. package/config/alarm/alarm.store.js +0 -0
  20. package/config/alarm/alarm.store.metadata.json +1 -0
  21. package/config/alarm/get-alarms-args.d.ts +12 -0
  22. package/config/alarm/get-alarms-args.js +13 -0
  23. package/config/alarm/get-alarms-args.metadata.json +1 -0
  24. package/config/alarm/index.d.ts +2 -0
  25. package/config/alarm/index.js +1 -0
  26. package/config/alarm/index.metadata.json +1 -0
  27. package/config/config-store.d.ts +2 -0
  28. package/config/gui-feature-config.d.ts +3 -0
  29. package/config/gui-feature-config.js +3 -0
  30. package/config/gui-feature-config.metadata.json +1 -0
  31. package/config/index.d.ts +2 -0
  32. package/config/index.js +2 -0
  33. package/config/index.metadata.json +1 -1
  34. package/config/variable/variable-store.d.ts +1 -0
  35. package/elements/air-quality/air-quality-element.d.ts +31 -0
  36. package/elements/air-quality/air-quality-element.js +194 -0
  37. package/elements/air-quality/air-quality-element.metadata.json +1 -0
  38. package/elements/alarm/alarm-element.d.ts +69 -0
  39. package/elements/alarm/alarm-element.js +497 -0
  40. package/elements/alarm/alarm-element.metadata.json +1 -0
  41. package/elements/bar-graph-element.d.ts +10 -2
  42. package/elements/bar-graph-element.js +135 -5
  43. package/elements/bar-graph-element.metadata.json +1 -1
  44. package/elements/base/readable-element.d.ts +6 -1
  45. package/elements/base/readable-element.js +66 -2
  46. package/elements/base/readable-element.metadata.json +1 -1
  47. package/elements/base/state-control-element.d.ts +3 -1
  48. package/elements/base/state-control-element.js +21 -5
  49. package/elements/character-display/character-display-element.js +3 -2
  50. package/elements/character-display/character-display-element.metadata.json +1 -1
  51. package/elements/datetime-display/datetime-display-element.d.ts +1 -0
  52. package/elements/datetime-display/datetime-display-element.js +10 -2
  53. package/elements/datetime-display/datetime-display-element.metadata.json +1 -1
  54. package/elements/datetime-display/time-zone-select-json.d.ts +8 -0
  55. package/elements/datetime-display/time-zone-select-json.js +558 -0
  56. package/elements/historical-curve/historical-curve.element.d.ts +41 -3
  57. package/elements/historical-curve/historical-curve.element.js +662 -32
  58. package/elements/historical-curve/historical-curve.element.metadata.json +1 -1
  59. package/elements/main-element.d.ts +1 -0
  60. package/elements/main-element.js +75 -9
  61. package/elements/main-element.metadata.json +1 -1
  62. package/elements/meter-element.d.ts +7 -1
  63. package/elements/meter-element.js +76 -7
  64. package/elements/meter-element.metadata.json +1 -1
  65. package/elements/numerical-display/numerical-display-element.d.ts +22 -3
  66. package/elements/numerical-display/numerical-display-element.js +145 -12
  67. package/elements/numerical-display/numerical-display-element.metadata.json +1 -1
  68. package/elements/per-view-variable-communicator.d.ts +4 -0
  69. package/elements/per-view-variable-communicator.js +21 -1
  70. package/elements/per-view-variable-communicator.metadata.json +1 -1
  71. package/elements/ring-graph/ring-graph-element.d.ts +13 -1
  72. package/elements/ring-graph/ring-graph-element.js +164 -3
  73. package/elements/ring-graph/ring-graph-element.metadata.json +1 -1
  74. package/elements/scroll-alarm/scroll-alarm-element.d.ts +78 -0
  75. package/elements/scroll-alarm/scroll-alarm-element.js +843 -0
  76. package/elements/scroll-alarm/scroll-alarm-element.metadata.json +1 -0
  77. package/elements/shared/graph/graph-state-element.d.ts +1 -0
  78. package/elements/shared/graph/graph-state-element.js +30 -1
  79. package/elements/shared/graph/graph-state-element.metadata.json +1 -1
  80. package/elements/shared/text/text-element.d.ts +14 -0
  81. package/elements/shared/text/text-element.js +42 -4
  82. package/elements/shared/text/text-element.metadata.json +1 -1
  83. package/elements/shared/text/text-state-element.d.ts +39 -2
  84. package/elements/shared/text/text-state-element.js +242 -67
  85. package/elements/shared/text/text-state-element.metadata.json +1 -1
  86. package/elements/static-elements/hyperlink-element.d.ts +28 -2
  87. package/elements/static-elements/hyperlink-element.js +153 -4
  88. package/elements/static-elements/hyperlink-element.metadata.json +1 -1
  89. package/elements/static-elements/text-element.d.ts +28 -2
  90. package/elements/static-elements/text-element.js +162 -12
  91. package/elements/static-elements/text-element.metadata.json +1 -1
  92. package/elements/switch-indicator-light/bit-indicator-light-operator.d.ts +1 -0
  93. package/elements/switch-indicator-light/bit-indicator-light-operator.js +10 -3
  94. package/elements/switch-indicator-light/bit-indicator-light-operator.metadata.json +1 -1
  95. package/elements/switch-indicator-light/switch-indicator-light-element.d.ts +11 -2
  96. package/elements/switch-indicator-light/switch-indicator-light-element.js +70 -12
  97. package/elements/switch-indicator-light/switch-indicator-light-element.metadata.json +1 -1
  98. package/elements/switch-indicator-light/word-indicator-light-operator.d.ts +1 -0
  99. package/elements/switch-indicator-light/word-indicator-light-operator.js +10 -3
  100. package/elements/switch-indicator-light/word-indicator-light-operator.metadata.json +1 -1
  101. package/elements/video/video-element.d.ts +10 -0
  102. package/elements/video/video-element.js +119 -21
  103. package/elements/video/video-element.metadata.json +1 -1
  104. package/elements/view-operation/view-operation.element.d.ts +28 -2
  105. package/elements/view-operation/view-operation.element.js +163 -4
  106. package/elements/view-operation/view-operation.element.metadata.json +1 -1
  107. package/elements/weather/weater-element.js +0 -1
  108. package/gui/gui-context.d.ts +25 -2
  109. package/gui/gui-host.d.ts +1 -1
  110. package/gui/gui-view.d.ts +4 -1
  111. package/gui/gui-view.js +69 -8
  112. package/gui/gui-view.metadata.json +1 -1
  113. package/gui/gui.component.d.ts +3 -0
  114. package/gui/gui.component.js +15 -2
  115. package/gui/gui.component.metadata.json +1 -1
  116. package/localization/localization.service.d.ts +12 -0
  117. package/localization/localization.service.js +16 -4
  118. package/localization/localization.service.metadata.json +1 -1
  119. package/localization/localization.service.zh_CN.js +14 -2
  120. package/localization/localization.service.zh_CN.metadata.json +1 -1
  121. package/modal/write-character/write-character-modal.component.html +4 -4
  122. package/modal/write-character/write-character-modal.component.js +2 -2
  123. package/modal/write-character/write-character-modal.component.less +15 -0
  124. package/modal/write-character/write-character-modal.component.metadata.json +1 -1
  125. package/modal/write-value/write-value-modal-args.d.ts +5 -1
  126. package/modal/write-value/write-value-modal-args.js +3 -1
  127. package/modal/write-value/write-value-modal-args.metadata.json +1 -1
  128. package/modal/write-value/write-value-modal.component.d.ts +13 -7
  129. package/modal/write-value/write-value-modal.component.html +10 -5
  130. package/modal/write-value/write-value-modal.component.js +95 -20
  131. package/modal/write-value/write-value-modal.component.less +16 -1
  132. package/modal/write-value/write-value-modal.component.metadata.json +1 -1
  133. package/model/air-quality/air-quality-info.d.ts +23 -0
  134. package/model/air-quality/air-quality-info.js +4 -0
  135. package/model/air-quality/air-quality-info.metadata.json +1 -0
  136. package/model/air-quality/air-quality.model.d.ts +7 -0
  137. package/model/air-quality/air-quality.model.js +0 -0
  138. package/model/air-quality/air-quality.model.metadata.json +1 -0
  139. package/model/alarm/alarm.model.d.ts +13 -0
  140. package/model/alarm/alarm.model.js +0 -0
  141. package/model/alarm/alarm.model.metadata.json +1 -0
  142. package/model/bar-graph/bar-graph.d.ts +4 -0
  143. package/model/base/font-setting-model.d.ts +22 -1
  144. package/model/base/font-setting-model.metadata.json +1 -1
  145. package/model/base/readable-model.d.ts +4 -0
  146. package/model/datetime-display/datetime-display.d.ts +1 -0
  147. package/model/historical-curve/historical-curve-axis-settings.d.ts +11 -0
  148. package/model/historical-curve/historical-curve-axis-settings.js +5 -0
  149. package/model/historical-curve/historical-curve-axis-settings.metadata.json +1 -1
  150. package/model/historical-curve/historical-curve-chanel.model.d.ts +8 -0
  151. package/model/meter/meter.d.ts +4 -0
  152. package/model/numerical-display/numerical-operation.d.ts +10 -2
  153. package/model/ring-graph/ring-graph.model.d.ts +8 -0
  154. package/model/scroll-alarm/scroll-alarm.model.d.ts +21 -0
  155. package/model/scroll-alarm/scroll-alarm.model.js +0 -0
  156. package/model/scroll-alarm/scroll-alarm.model.metadata.json +1 -0
  157. package/model/shared/state/state.d.ts +1 -0
  158. package/model/shared/state/state.js +1 -0
  159. package/model/shared/state/state.metadata.json +1 -1
  160. package/model/shared/text/font.d.ts +1 -1
  161. package/model/shared/text/text.d.ts +3 -0
  162. package/model/switch-indicator-light/switch-indicator-light.d.ts +2 -0
  163. package/model/view-operation/view-operation-element.model.d.ts +7 -1
  164. package/package.json +1 -1
  165. package/public_api.js +1 -0
  166. package/remote/communication/variable/remote-variable-communicator.d.ts +30 -0
  167. package/remote/communication/variable/remote-variable-communicator.js +193 -3
  168. package/remote/communication/variable/remote-variable-communicator.metadata.json +1 -1
  169. package/remote/communication/variable/remote-variable-protocol.d.ts +8 -0
  170. package/service/index.d.ts +4 -0
  171. package/service/index.js +1 -0
  172. package/service/index.metadata.json +1 -1
  173. package/service/language.service.d.ts +37 -0
  174. package/service/language.service.js +0 -0
  175. package/service/language.service.metadata.json +1 -0
  176. package/service/released-variable/index.d.ts +1 -0
  177. package/service/released-variable/index.js +0 -0
  178. package/service/released-variable/index.metadata.json +1 -0
  179. package/service/released-variable/released-variable.service.d.ts +4 -0
  180. package/service/released-variable/released-variable.service.js +0 -0
  181. package/service/released-variable/released-variable.service.metadata.json +1 -0
  182. package/service/system-text-library.service.d.ts +77 -0
  183. package/service/system-text-library.service.js +29 -0
  184. package/service/system-text-library.service.metadata.json +1 -0
  185. package/service/text-library.service.d.ts +49 -0
  186. package/service/text-library.service.js +0 -0
  187. package/service/text-library.service.metadata.json +1 -0
  188. package/service/weather.service.d.ts +1 -0
  189. package/shared/gui-consts.d.ts +3 -0
  190. package/shared/gui-consts.js +3 -0
  191. package/shared/gui-consts.metadata.json +1 -1
  192. package/utils/data-type/fbox-data-type.service.js +40 -0
  193. package/utils/numerical-operation.service.js +28 -4
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"HistoricalCurveElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":20,"character":44},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":62,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":63,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":64,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":65,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":66,"character":23},{"__symbolic":"reference","module":"../../config","name":"HistoryDataStore","line":67,"character":43},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"getValidTimePeriods":[{"__symbolic":"method"}],"updateTimeRange":[{"__symbolic":"method"}],"updateQueryTimeRange":[{"__symbolic":"method"}],"reRenderElement":[{"__symbolic":"method"}],"renderElement":[{"__symbolic":"method"}],"renderChart":[{"__symbolic":"method"}],"getLineChart":[{"__symbolic":"method"}],"getMultiBarWithFocusChart":[{"__symbolic":"method"}],"renderCommonProperty":[{"__symbolic":"method"}],"renderOperationArea":[{"__symbolic":"method"}],"timeFormat":[{"__symbolic":"method"}],"loadFirstPage":[{"__symbolic":"method"}],"loadNextPage":[{"__symbolic":"method"}],"loadPreviousPage":[{"__symbolic":"method"}],"loadLastPage":[{"__symbolic":"method"}],"initElementStatus":[{"__symbolic":"method"}],"updateElementStatus":[{"__symbolic":"method"}],"setStatusAsUnbound":[{"__symbolic":"method"}],"setStatusAsLoading":[{"__symbolic":"method"}],"setStatusAsLoadFailed":[{"__symbolic":"method"}],"renderStatus":[{"__symbolic":"method"}],"clearStatus":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"HistoricalCurveElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":23,"character":44},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":75,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":76,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":77,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":78,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":79,"character":23},{"__symbolic":"reference","module":"../../config","name":"HistoryDataStore","line":80,"character":43},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../service","name":"SystemTextLibraryService","line":82,"character":52},{"__symbolic":"reference","module":"../../service","name":"LanguageService","line":83,"character":43},{"__symbolic":"reference","module":"../../gui/gui-context","name":"GuiContext","line":84,"character":38},{"__symbolic":"reference","module":"../../service","name":"ReleasedVariableService","line":85,"character":51}]}],"dispose":[{"__symbolic":"method"}],"initKeyboardListener":[{"__symbolic":"method"}],"subscribeLanguageChange":[{"__symbolic":"method"}],"updateLanguageTexts":[{"__symbolic":"method"}],"getCurrentCulture":[{"__symbolic":"method"}],"getValidTimePeriods":[{"__symbolic":"method"}],"getTimePeriodText":[{"__symbolic":"method"}],"updateTimeRange":[{"__symbolic":"method"}],"updateQueryTimeRange":[{"__symbolic":"method"}],"reRenderElement":[{"__symbolic":"method"}],"renderElement":[{"__symbolic":"method"}],"setupTooltipAutoHide":[{"__symbolic":"method"}],"renderChart":[{"__symbolic":"method"}],"initPoint":[{"__symbolic":"method"}],"getLineChart":[{"__symbolic":"method"}],"getMultiBarWithFocusChart":[{"__symbolic":"method"}],"renderCommonProperty":[{"__symbolic":"method"}],"renderOperationArea":[{"__symbolic":"method"}],"timeFormat":[{"__symbolic":"method"}],"fmtDatetimeLocal":[{"__symbolic":"method"}],"showCustomTimeRangeModal":[{"__symbolic":"method"}],"showCustomTimeRangeModalFallback":[{"__symbolic":"method"}],"loadFirstPage":[{"__symbolic":"method"}],"loadNextPage":[{"__symbolic":"method"}],"loadPreviousPage":[{"__symbolic":"method"}],"loadLastPage":[{"__symbolic":"method"}],"initElementStatus":[{"__symbolic":"method"}],"updateElementStatus":[{"__symbolic":"method"}],"setStatusAsUnbound":[{"__symbolic":"method"}],"setStatusAsLoading":[{"__symbolic":"method"}],"setStatusAsLoadFailed":[{"__symbolic":"method"}],"renderStatus":[{"__symbolic":"method"}],"clearStatus":[{"__symbolic":"method"}]}}}}]
@@ -37,6 +37,7 @@ export declare class MainElement {
37
37
  initElementState(): void;
38
38
  getVariableNames(): Array<string>;
39
39
  reportVariableStates(states: VariableState[]): void;
40
+ getVirtualDeviceIdFromRect(rectElement: any): any;
40
41
  reportVariableValues(values: VariableValue[]): void;
41
42
  dispose(): void;
42
43
  private checkIsLoaded;
@@ -27,6 +27,9 @@ import { PolygonElement } from './vector-graphics/polygon-element';
27
27
  import { HyperlinkElement } from './static-elements/hyperlink-element';
28
28
  import { VideoElement } from './video/video-element';
29
29
  import { WeatherElement } from './weather/weater-element';
30
+ import { AirQualityElement } from './air-quality/air-quality-element';
31
+ import { AlarmElement } from './alarm/alarm-element';
32
+ import { ScrollAlarmElement } from './scroll-alarm/scroll-alarm-element';
30
33
  export class MainElement {
31
34
  constructor(injector, bsModalService, context, variableCommunicator, popupViewService, signalRAppId) {
32
35
  this.injector = injector;
@@ -58,7 +61,7 @@ export class MainElement {
58
61
  const category = $(element).data('model').category;
59
62
  switch (category) {
60
63
  case GuiConsts.components.numericalDisplayKey:
61
- const numericalDisplayElement = new NumericalDisplayElement(element, this.injector, this.bsModalService, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.graphStore, this.context.operationRecordService, this.context.securityChecker, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId);
64
+ const numericalDisplayElement = new NumericalDisplayElement(element, this.injector, this.bsModalService, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.graphStore, this.context.operationRecordService, this.context.releasedVariableService, this.context.securityChecker, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId, this.context);
62
65
  this.elements.push(numericalDisplayElement);
63
66
  break;
64
67
  case GuiConsts.components.imageKey:
@@ -71,23 +74,23 @@ export class MainElement {
71
74
  this.elements.push(new PipeElement(element, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId));
72
75
  break;
73
76
  case GuiConsts.components.switchIndicatorLightKey:
74
- this.elements.push(new SwitchIndicatorLightElement(element, this.injector, this.bsModalService, this.variableCommunicator, this.context.configStore.graphStore, this.context.permissionChecker, this.context.operationRecordService, this.context.securityChecker, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId));
77
+ this.elements.push(new SwitchIndicatorLightElement(element, this.injector, this.bsModalService, this.variableCommunicator, this.context.configStore.graphStore, this.context.permissionChecker, this.context.operationRecordService, this.context.securityChecker, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId, this.context.textLibraryService, this.context.languageService, this.context));
75
78
  break;
76
79
  case GuiConsts.components.barGraphKey:
77
80
  this.elements.push(new BarGraphElement(element, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId));
78
81
  break;
79
82
  case GuiConsts.components.toggleViewKey:
80
83
  case GuiConsts.components.viewOperationElement:
81
- this.elements.push(new ViewOperationElement(element, this.injector, this.bsModalService, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.graphStore, this.context.permissionChecker, this.context.operationRecordService, this.context.securityChecker, this.injector.get(LOCALIZATION), this.popupViewService, guiOptions.hostContainerId, guiOptions.el, this.signalRAppId));
84
+ this.elements.push(new ViewOperationElement(element, this.injector, this.bsModalService, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.graphStore, this.context.permissionChecker, this.context.operationRecordService, this.context.securityChecker, this.injector.get(LOCALIZATION), this.popupViewService, guiOptions.hostContainerId, guiOptions.el, this.signalRAppId, this.context.textLibraryService, this.context.languageService, this.context));
82
85
  break;
83
86
  case GuiConsts.components.characterKey:
84
87
  this.elements.push(new CharacterDisplayElement(element, this.injector, this.bsModalService, this.variableCommunicator, this.context.configStore.graphStore, this.context.permissionChecker, this.context.operationRecordService, this.context.securityChecker, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId));
85
88
  break;
86
89
  case GuiConsts.components.textKey:
87
- this.elements.push(new TextElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.graphStore, this.signalRAppId));
90
+ this.elements.push(new TextElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.graphStore, this.signalRAppId, this.context.textLibraryService, this.context.languageService, this.context));
88
91
  break;
89
92
  case GuiConsts.components.hyperlinkKey:
90
- this.elements.push(new HyperlinkElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.graphStore, this.signalRAppId));
93
+ this.elements.push(new HyperlinkElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.graphStore, this.signalRAppId, this.context.textLibraryService, this.context.languageService, this.context));
91
94
  break;
92
95
  case GuiConsts.components.straightLineKey:
93
96
  this.elements.push(new StraightLineElement(element, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.signalRAppId));
@@ -108,7 +111,7 @@ export class MainElement {
108
111
  this.elements.push(new DatetimeDisplayElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.graphStore, this.signalRAppId));
109
112
  break;
110
113
  case GuiConsts.components.historicalCurveKey:
111
- this.elements.push(new HistoricalCurveElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.historyDataStore, this.signalRAppId));
114
+ this.elements.push(new HistoricalCurveElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.historyDataStore, this.signalRAppId, this.context.systemTextLibraryService, this.context.languageService, this.context, this.context.releasedVariableService));
112
115
  break;
113
116
  case GuiConsts.components.ringGraphKey:
114
117
  this.elements.push(new RingGraphElement(element, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.injector.get(LOCALIZATION), this.signalRAppId));
@@ -125,6 +128,15 @@ export class MainElement {
125
128
  case GuiConsts.components.weatherKey:
126
129
  this.elements.push(new WeatherElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.weatherService, this.signalRAppId));
127
130
  break;
131
+ case GuiConsts.components.airQualityKey:
132
+ this.elements.push(new AirQualityElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.weatherService, this.signalRAppId));
133
+ break;
134
+ case GuiConsts.components.alarmKey:
135
+ this.elements.push(new AlarmElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.alarmsStore, this.signalRAppId, this.context.systemTextLibraryService, this.context.languageService, this.context));
136
+ break;
137
+ case GuiConsts.components.scrollAlarmKey:
138
+ this.elements.push(new ScrollAlarmElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.alarmsStore, this.signalRAppId));
139
+ break;
128
140
  }
129
141
  });
130
142
  this.initBackground();
@@ -204,7 +216,7 @@ export class MainElement {
204
216
  initElementState() {
205
217
  forEach(this.elements, element => {
206
218
  if (element instanceof ReadableElement) {
207
- element.init(element.readVariableName);
219
+ element.init(element.readVariableName || element.maxVariableName || element.minVariableName);
208
220
  }
209
221
  else if (element instanceof HistoricalCurveElement) {
210
222
  element.initElementStatus();
@@ -215,11 +227,34 @@ export class MainElement {
215
227
  getVariableNames() {
216
228
  const variableNames = new Array();
217
229
  forEach(this.elements, element => {
230
+ var _a, _b;
218
231
  if (element instanceof ReadableElement) {
232
+ const maxVariableName = (_a = element) === null || _a === void 0 ? void 0 : _a.maxVariableName;
233
+ const maxValueType = element.maxValueType;
234
+ const minVariableName = (_b = element) === null || _b === void 0 ? void 0 : _b.minVariableName;
235
+ const minValueType = element.minValueType;
219
236
  const variableName = element.readVariableName;
237
+ // 最大最小值选择变量类型时,其中一个未绑定变量不进行开点操作 - FLEXCLOUD-1817
238
+ if (maxValueType && maxVariableName && !variableNames.find(v => isEqual(maxVariableName, v))) {
239
+ variableNames.push(maxVariableName);
240
+ }
241
+ if (minValueType && minVariableName && !variableNames.find(v => isEqual(minVariableName, v))) {
242
+ variableNames.push(minVariableName);
243
+ }
220
244
  if (variableName && !variableNames.find(v => isEqual(variableName, v))) {
221
245
  variableNames.push(element.readVariableName);
222
246
  }
247
+ // 数值显示元件:上下限变量类型时,将上下限变量名也加入订阅
248
+ if (element instanceof NumericalDisplayElement) {
249
+ const upperLimitVarName = element.upperLimitVariableName;
250
+ if (upperLimitVarName && !variableNames.find(v => isEqual(upperLimitVarName, v))) {
251
+ variableNames.push(upperLimitVarName);
252
+ }
253
+ const lowerLimitVarName = element.lowerLimitVariableName;
254
+ if (lowerLimitVarName && !variableNames.find(v => isEqual(lowerLimitVarName, v))) {
255
+ variableNames.push(lowerLimitVarName);
256
+ }
257
+ }
223
258
  }
224
259
  });
225
260
  return variableNames;
@@ -237,14 +272,44 @@ export class MainElement {
237
272
  });
238
273
  });
239
274
  }
275
+ getVirtualDeviceIdFromRect(rectElement) {
276
+ let current = rectElement;
277
+ while (current) {
278
+ if (current.tagName === 'FC-GUI') {
279
+ const virtualDeviceId = current.getAttribute('data-virtual-device-id');
280
+ return virtualDeviceId || null;
281
+ }
282
+ current = current.parentElement;
283
+ }
284
+ return null;
285
+ }
240
286
  reportVariableValues(values) {
241
287
  this.checkIsLoaded();
242
288
  each(values, value => {
243
289
  each(this.elements, e => {
290
+ var _a;
244
291
  if (e instanceof ReadableElement) {
245
- if (e.readVariableName === value.variableName) {
292
+ if ((value.variableName && (e.readVariableName === value.variableName ||
293
+ e.minVariableName === value.variableName || e.maxVariableName === value.variableName))) {
246
294
  e.reportValueChanged(value);
247
295
  }
296
+ // 数值显示元件:上下限变量推送分发
297
+ if (e instanceof NumericalDisplayElement && value.variableName && (e.upperLimitVariableName === value.variableName ||
298
+ e.lowerLimitVariableName === value.variableName)) {
299
+ e.reportValueChanged(value);
300
+ }
301
+ if (e.readVariableName === value.systemName) {
302
+ const rect = (_a = e.currentRect) === null || _a === void 0 ? void 0 : _a[0];
303
+ const deviceId = this.getVirtualDeviceIdFromRect(rect);
304
+ if (deviceId) {
305
+ if (+deviceId === value.virtualDeviceId) {
306
+ e.reportValueChanged(value);
307
+ }
308
+ }
309
+ else {
310
+ e.reportValueChanged(value);
311
+ }
312
+ }
248
313
  }
249
314
  });
250
315
  });
@@ -252,7 +317,8 @@ export class MainElement {
252
317
  dispose() {
253
318
  each(this.elements, e => {
254
319
  if (e instanceof HistoricalCurveElement || e instanceof VideoElement
255
- || e instanceof WeatherElement || e instanceof NumericalDisplayElement || e instanceof TextElement) {
320
+ || e instanceof WeatherElement || e instanceof NumericalDisplayElement || e instanceof TextElement
321
+ || e instanceof AirQualityElement || e instanceof SwitchIndicatorLightElement || e instanceof ScrollAlarmElement) {
256
322
  e.dispose();
257
323
  }
258
324
  });
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"MainElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":53,"character":43},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":54,"character":41},{"__symbolic":"reference","module":"../gui/gui-context","name":"GuiContext","line":55,"character":34},{"__symbolic":"reference","module":"../communication","name":"VariableCommunicator","line":56,"character":47},{"__symbolic":"reference","module":"../view/popup-view.service","name":"PopupViewService","line":57,"character":43},null]}],"load":[{"__symbolic":"method"}],"uniformStretch":[{"__symbolic":"method"}],"changeVideoStyle":[{"__symbolic":"method"}],"horizontalStretch":[{"__symbolic":"method"}],"initElementState":[{"__symbolic":"method"}],"getVariableNames":[{"__symbolic":"method"}],"reportVariableStates":[{"__symbolic":"method"}],"reportVariableValues":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method"}],"checkIsLoaded":[{"__symbolic":"method"}],"initBackground":[{"__symbolic":"method"}],"getImageEl":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"MainElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":56,"character":43},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":57,"character":41},{"__symbolic":"reference","module":"../gui/gui-context","name":"GuiContext","line":58,"character":34},{"__symbolic":"reference","module":"../communication","name":"VariableCommunicator","line":59,"character":47},{"__symbolic":"reference","module":"../view/popup-view.service","name":"PopupViewService","line":60,"character":43},null]}],"load":[{"__symbolic":"method"}],"uniformStretch":[{"__symbolic":"method"}],"changeVideoStyle":[{"__symbolic":"method"}],"horizontalStretch":[{"__symbolic":"method"}],"initElementState":[{"__symbolic":"method"}],"getVariableNames":[{"__symbolic":"method"}],"reportVariableStates":[{"__symbolic":"method"}],"getVirtualDeviceIdFromRect":[{"__symbolic":"method"}],"reportVariableValues":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method"}],"checkIsLoaded":[{"__symbolic":"method"}],"initBackground":[{"__symbolic":"method"}],"getImageEl":[{"__symbolic":"method"}]}}}}]
@@ -5,16 +5,22 @@ import { ReadableElement } from './base';
5
5
  import { VariableStore } from '../config';
6
6
  import { PermissionChecker } from '../service';
7
7
  export declare class MeterElement extends ReadableElement {
8
+ private static DEFAULT_MIN_VALUE;
9
+ private static DEFAULT_MAX_VALUE;
8
10
  private readonly $handEl;
9
11
  private readonly arcPath$;
10
12
  private cx;
11
13
  private cy;
12
14
  private offsetY;
13
15
  private mainElementTransform;
16
+ private valueObj;
17
+ private isNeedUpdateScale;
14
18
  readonly model: Meter;
15
19
  constructor(element: HTMLElement, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, localization: Localization, signalRAppId: string);
16
- updateVariableValue(value: number): void;
20
+ private updateValueObj;
21
+ updateVariableValue(value: number, variableName: any): void;
17
22
  private initFrameNode;
23
+ private updateScale;
18
24
  private getAngle;
19
25
  private directionPoint;
20
26
  }
@@ -1,10 +1,20 @@
1
1
  import { ReadableElement } from './base';
2
+ import { isNumber } from 'lodash';
3
+ import { VariableValueType } from '../model/shared/condition/variable-value-type';
2
4
  export class MeterElement extends ReadableElement {
3
5
  constructor(element, permissionChecker, variableCommunicator, variableStore, localization, signalRAppId) {
4
6
  super(element, permissionChecker, variableCommunicator, variableStore, localization, signalRAppId);
5
7
  this.cx = 0;
6
8
  this.cy = 0;
7
9
  this.offsetY = 0;
10
+ this.valueObj = {};
11
+ this.isNeedUpdateScale = false;
12
+ if ((this.model.minValueType === VariableValueType.Constant && this.model.maxValueType === VariableValueType.Variable)
13
+ || this.model.maxValueType === VariableValueType.Constant && this.model.minValueType === VariableValueType.Variable) {
14
+ this.isNeedUpdateScale = true;
15
+ this.updateScale();
16
+ this.isNeedUpdateScale = false;
17
+ }
8
18
  let mainEl$;
9
19
  if (this.model.version && this.model.version > 3) {
10
20
  mainEl$ = this.$element.find('[data-id="main"]');
@@ -31,18 +41,75 @@ export class MeterElement extends ReadableElement {
31
41
  this.changeStates();
32
42
  });
33
43
  }
34
- updateVariableValue(value) {
35
- const angle = this.getAngle(value);
36
- this.$handEl.attr('transform', this.mainElementTransform + ` translate(0,${this.offsetY}) rotate(${angle}, ${this.cx}, ${this.cy})`);
44
+ updateValueObj(value, variableName) {
45
+ var _a, _b, _c;
46
+ if (((_a = this.model.readVariable) === null || _a === void 0 ? void 0 : _a.name) === variableName) {
47
+ this.isNeedUpdateScale = false;
48
+ this.valueObj.value = value;
49
+ }
50
+ if (((_b = this.model.minVariable) === null || _b === void 0 ? void 0 : _b.name) === variableName) {
51
+ this.isNeedUpdateScale = true;
52
+ this.valueObj.min = value;
53
+ }
54
+ if (((_c = this.model.maxVariable) === null || _c === void 0 ? void 0 : _c.name) === variableName) {
55
+ this.isNeedUpdateScale = true;
56
+ this.valueObj.max = value;
57
+ }
58
+ }
59
+ updateVariableValue(value, variableName) {
60
+ this.updateValueObj(value, variableName);
61
+ this.updateScale();
62
+ const angle = this.getAngle();
63
+ if (isNumber(angle)) {
64
+ this.$handEl.attr('transform', this.mainElementTransform + ` translate(0,${this.offsetY}) rotate(${angle}, ${this.cx}, ${this.cy})`);
65
+ }
37
66
  }
38
67
  initFrameNode() {
39
68
  const b = Snap(this.$element[0]).getBBox();
40
69
  this.rootElement.append('rect').attr('id', 'StateFrame').attr('width', b.width).attr('height', b.height).attr('fill', 'transparent');
41
70
  }
42
- getAngle(value) {
43
- const min = this.model.min;
44
- const max = this.model.max;
45
- value = Math.min(Math.max(value, min), max);
71
+ updateScale() {
72
+ if (!this.isNeedUpdateScale) {
73
+ return;
74
+ }
75
+ let min = this.model.minValueType ? this.valueObj.min : this.model.min;
76
+ let max = this.model.maxValueType ? this.valueObj.max : this.model.max;
77
+ min = Number(min);
78
+ max = Number(max);
79
+ if (isNaN(min) || isNaN(max)) {
80
+ min = MeterElement.DEFAULT_MIN_VALUE;
81
+ max = MeterElement.DEFAULT_MAX_VALUE;
82
+ }
83
+ const avgSacle = ((max - min) / this.model.masterDivisionNumber).toFixed(5);
84
+ const textElements = this.$element.find('g:first > text');
85
+ for (let i = 0; i < textElements.length; i++) {
86
+ const text = textElements[i];
87
+ if (!text.innerHTML) {
88
+ continue;
89
+ }
90
+ let sacleValue = ((Number(avgSacle) * i) + min).toFixed(0);
91
+ // 整数位和小数位格式化;
92
+ if (this.model.fractionDigits > 0) {
93
+ sacleValue = (sacleValue / Math.pow(10, this.model.fractionDigits)).toFixed(this.model.fractionDigits);
94
+ }
95
+ if (!isNaN(sacleValue)) {
96
+ text.innerHTML = sacleValue;
97
+ }
98
+ }
99
+ }
100
+ getAngle() {
101
+ let min = this.model.minValueType ? this.valueObj.min : this.model.min;
102
+ let max = this.model.maxValueType ? this.valueObj.max : this.model.max;
103
+ min = Number(min);
104
+ max = Number(max);
105
+ if (isNaN(min) || isNaN(max)) {
106
+ min = MeterElement.DEFAULT_MIN_VALUE;
107
+ max = MeterElement.DEFAULT_MAX_VALUE;
108
+ }
109
+ if (!this.valueObj.value && isNaN(Number(this.valueObj.value))) {
110
+ return undefined;
111
+ }
112
+ const value = Math.min(Math.max(this.valueObj.value || 0, min), max);
46
113
  const len = (value - min) / (max - min);
47
114
  const arcPath = Snap(this.arcPath$[0]);
48
115
  const b = arcPath.getBBox(true);
@@ -68,3 +135,5 @@ export class MeterElement extends ReadableElement {
68
135
  return c;
69
136
  }
70
137
  }
138
+ MeterElement.DEFAULT_MIN_VALUE = 0;
139
+ MeterElement.DEFAULT_MAX_VALUE = 100;
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"MeterElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./base","name":"ReadableElement","line":7,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":18,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"../service","name":"PermissionChecker","line":18,"character":57},{"__symbolic":"reference","module":"../communication","name":"VariableCommunicator","line":19,"character":30},{"__symbolic":"reference","module":"../config","name":"VariableStore","line":19,"character":67},{"__symbolic":"reference","module":"../localization","name":"Localization","line":19,"character":96},{"__symbolic":"reference","name":"string"}]}],"updateVariableValue":[{"__symbolic":"method"}],"initFrameNode":[{"__symbolic":"method"}],"getAngle":[{"__symbolic":"method"}],"directionPoint":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"MeterElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./base","name":"ReadableElement","line":9,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":25,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"../service","name":"PermissionChecker","line":25,"character":57},{"__symbolic":"reference","module":"../communication","name":"VariableCommunicator","line":26,"character":30},{"__symbolic":"reference","module":"../config","name":"VariableStore","line":26,"character":67},{"__symbolic":"reference","module":"../localization","name":"Localization","line":26,"character":96},{"__symbolic":"reference","name":"string"}]}],"updateValueObj":[{"__symbolic":"method"}],"updateVariableValue":[{"__symbolic":"method"}],"initFrameNode":[{"__symbolic":"method"}],"updateScale":[{"__symbolic":"method"}],"getAngle":[{"__symbolic":"method"}],"directionPoint":[{"__symbolic":"method"}]},"statics":{"DEFAULT_MIN_VALUE":0,"DEFAULT_MAX_VALUE":100}}}}]
@@ -3,15 +3,18 @@ import { BsModalService } from 'ngx-bootstrap/modal';
3
3
  import { GraphStore, VariableStore } from '../../config';
4
4
  import { Localization } from '../../localization';
5
5
  import { NumericalDisplay } from '../../model';
6
- import { PermissionChecker, OperationRecordService } from '../../service';
7
- import { VariableCommunicator } from '../../communication';
6
+ import { PermissionChecker, OperationRecordService, ReleasedVariableService } from '../../service';
7
+ import { VariableCommunicator, VariableValue } from '../../communication';
8
8
  import { ReadableElement } from '../base/readable-element';
9
9
  import { SecurityChecker } from '../../security';
10
+ import { GuiContext } from '../../gui/gui-context';
10
11
  export declare class NumericalDisplayElement extends ReadableElement {
11
12
  private readonly modalService;
12
13
  private readonly graphStore;
13
14
  private readonly operationRecordService;
15
+ private readonly releasedVariableService;
14
16
  private readonly securityChecker;
17
+ private readonly guiContext?;
15
18
  private readonly dataTypeService;
16
19
  private readonly fractionDigitService;
17
20
  private readonly accessPermissionService;
@@ -21,9 +24,25 @@ export declare class NumericalDisplayElement extends ReadableElement {
21
24
  private readonly logger;
22
25
  private displayForeignObject;
23
26
  private enableDataParsed;
27
+ private writeValueMmodalRef;
28
+ private recordValue;
29
+ private showValue;
30
+ private numericalOperation;
31
+ private restorationTimer;
32
+ private _resolvedUpperLimitValue;
33
+ private _resolvedLowerLimitValue;
34
+ /** 当数值上限配置为变量类型时,返回变量名;否则返回 undefined */
35
+ get upperLimitVariableName(): string | undefined;
36
+ /** 当数值下限配置为变量类型时,返回变量名;否则返回 undefined */
37
+ get lowerLimitVariableName(): string | undefined;
24
38
  get writeVariableName(): string;
25
- constructor(element: HTMLElement, injector: Injector, modalService: BsModalService, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, graphStore: GraphStore, operationRecordService: OperationRecordService, securityChecker: SecurityChecker, variableStore: VariableStore, localization: Localization, signalRAppId: string);
39
+ constructor(element: HTMLElement, injector: Injector, modalService: BsModalService, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, graphStore: GraphStore, operationRecordService: OperationRecordService, releasedVariableService: ReleasedVariableService, securityChecker: SecurityChecker, variableStore: VariableStore, localization: Localization, signalRAppId: string, guiContext?: GuiContext);
26
40
  dispose(): void;
41
+ /**
42
+ * 重写父类方法,处理"当前语种ID"系统变量
43
+ * 当值为null时,显示默认语种ID
44
+ */
45
+ reportValueChanged(value: VariableValue): void;
27
46
  initElement(): any;
28
47
  private checkElementPassword;
29
48
  private initVariableText;
@@ -11,15 +11,26 @@ import { ConfirmOperationModalComponent } from '../../modal/confirm-operation/co
11
11
  import { VerifyPasswordModalComponent } from '../../modal/verify-password/verify-password-modal.component';
12
12
  import { isNil } from 'lodash';
13
13
  import { FCloudDataType } from '../../model/shared/data-type/fcloud-data-Type';
14
+ var variableRwTypeEnum;
15
+ (function (variableRwTypeEnum) {
16
+ variableRwTypeEnum[variableRwTypeEnum["read"] = 4] = "read";
17
+ variableRwTypeEnum[variableRwTypeEnum["witer"] = 2] = "witer";
18
+ variableRwTypeEnum[variableRwTypeEnum["readWiter"] = 6] = "readWiter";
19
+ })(variableRwTypeEnum || (variableRwTypeEnum = {}));
14
20
  export class NumericalDisplayElement extends ReadableElement {
15
- constructor(element, injector, modalService, permissionChecker, variableCommunicator, graphStore, operationRecordService, securityChecker, variableStore, localization, signalRAppId) {
21
+ constructor(element, injector, modalService, permissionChecker, variableCommunicator, graphStore, operationRecordService, releasedVariableService, securityChecker, variableStore, localization, signalRAppId, guiContext) {
16
22
  super(element, permissionChecker, variableCommunicator, variableStore, localization, signalRAppId);
17
23
  this.modalService = modalService;
18
24
  this.graphStore = graphStore;
19
25
  this.operationRecordService = operationRecordService;
26
+ this.releasedVariableService = releasedVariableService;
20
27
  this.securityChecker = securityChecker;
28
+ this.guiContext = guiContext;
21
29
  this.displayText = '';
22
30
  this.enableDataParsed = false;
31
+ // 上下限变量的实时缓存值(仅当上下限配置为变量类型时使用)
32
+ this._resolvedUpperLimitValue = undefined;
33
+ this._resolvedLowerLimitValue = undefined;
23
34
  this.logger = injector.get(LOGGER_SERVICE_TOKEN);
24
35
  this.dataTypeService = injector.get(DataTypeService);
25
36
  this.fractionDigitService = injector.get(FractionDigitService);
@@ -39,6 +50,22 @@ export class NumericalDisplayElement extends ReadableElement {
39
50
  }
40
51
  this.initElement();
41
52
  }
53
+ /** 当数值上限配置为变量类型时,返回变量名;否则返回 undefined */
54
+ get upperLimitVariableName() {
55
+ const upper = this.model.numericalUpperLimit;
56
+ if (upper && typeof upper === 'object' && upper.type === 1 && upper.variableName) {
57
+ return upper.variableName;
58
+ }
59
+ return undefined;
60
+ }
61
+ /** 当数值下限配置为变量类型时,返回变量名;否则返回 undefined */
62
+ get lowerLimitVariableName() {
63
+ const lower = this.model.numericalLowerLimit;
64
+ if (lower && typeof lower === 'object' && lower.type === 1 && lower.variableName) {
65
+ return lower.variableName;
66
+ }
67
+ return undefined;
68
+ }
42
69
  get writeVariableName() {
43
70
  return this.readVariableName;
44
71
  }
@@ -50,6 +77,42 @@ export class NumericalDisplayElement extends ReadableElement {
50
77
  this.$element.remove();
51
78
  }
52
79
  }
80
+ /**
81
+ * 重写父类方法,处理"当前语种ID"系统变量
82
+ * 当值为null时,显示默认语种ID
83
+ */
84
+ reportValueChanged(value) {
85
+ var _a, _b, _c;
86
+ // 更新上下限变量缓存(不阻断后续处理)
87
+ if (this.upperLimitVariableName && value.variableName === this.upperLimitVariableName) {
88
+ const num = Number(value.value);
89
+ this._resolvedUpperLimitValue = (value.value != null && !isNaN(num)) ? num : undefined;
90
+ // 如果上限变量不是主显示变量,直接返回
91
+ if (value.variableName !== this.readVariableName) {
92
+ return;
93
+ }
94
+ }
95
+ if (this.lowerLimitVariableName && value.variableName === this.lowerLimitVariableName) {
96
+ const num = Number(value.value);
97
+ this._resolvedLowerLimitValue = (value.value != null && !isNaN(num)) ? num : undefined;
98
+ // 如果下限变量不是主显示变量,直接返回
99
+ if (value.variableName !== this.readVariableName) {
100
+ return;
101
+ }
102
+ }
103
+ // 处理系统变量"当前语种ID"
104
+ if (value.variableName === '当前语种ID') {
105
+ let displayValue = value.value;
106
+ // 如果值为null,使用默认语种ID
107
+ if (displayValue === null || displayValue === undefined) {
108
+ displayValue = (_c = (_b = (_a = this.guiContext) === null || _a === void 0 ? void 0 : _a.getDefaultLanguageId) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : 0;
109
+ }
110
+ this.updateVariableValue(displayValue);
111
+ return;
112
+ }
113
+ // 其他变量调用父类方法
114
+ super.reportValueChanged(value);
115
+ }
53
116
  initElement() {
54
117
  const { rootElement } = this;
55
118
  rootElement.selectAll('*').remove();
@@ -173,19 +236,75 @@ export class NumericalDisplayElement extends ReadableElement {
173
236
  if (null == this.writeVariableName) {
174
237
  return;
175
238
  }
176
- const args = new WriteValueModalArgs(this.writeVariableName, this.model.dataType, this.model.fBoxDataType, this.model.integerDigits, this.model.fractionDigits, this.numericalOperationService.getNumericalOperations(this.model), this.model.version, this.enableDataParsed);
177
- const modalRef = this.modalService.show(WriteValueModalComponent, {
178
- initialState: { args: args }, backdrop: 'static', class: 'gui-modal-dialog-position', animated: false
239
+ // 获取数值操作配置,上下限变量类型已在 reportValueChanged 中实时更新到缓存
240
+ const numericalOperation = this.numericalOperationService.getNumericalOperations(this.model);
241
+ // 用缓存的实时值替换变量类型上下限
242
+ // 模拟模式下(releasedVariableService 为空)变量无实时值,直接使用数据类型默认范围
243
+ const isSimulation = !this.releasedVariableService;
244
+ if (typeof numericalOperation.numericalUpperLimit === 'object' && numericalOperation.numericalUpperLimit.type === 1) {
245
+ if (isSimulation) {
246
+ numericalOperation.numericalUpperLimit = this.dataTypeService.getMaxValue(this.model.version || 0, this.model.dataType || 0, this.model.fBoxDataType || 0, this.model.integerDigits || undefined, this.model.fractionDigits || undefined);
247
+ }
248
+ else {
249
+ numericalOperation.numericalUpperLimit = this._resolvedUpperLimitValue != null
250
+ ? this._resolvedUpperLimitValue
251
+ : (this.dataTypeService.getMaxValue(this.model.version || 0, this.model.dataType || 0, this.model.fBoxDataType || 0) || 0);
252
+ }
253
+ }
254
+ if (typeof numericalOperation.numericalLowerLimit === 'object' && numericalOperation.numericalLowerLimit.type === 1) {
255
+ if (isSimulation) {
256
+ numericalOperation.numericalLowerLimit = this.dataTypeService.getMinValue(this.model.version || 0, this.model.dataType || 0, this.model.fBoxDataType || 0, this.model.integerDigits || undefined, this.model.fractionDigits || undefined);
257
+ }
258
+ else {
259
+ numericalOperation.numericalLowerLimit = this._resolvedLowerLimitValue != null
260
+ ? this._resolvedLowerLimitValue
261
+ : (this.dataTypeService.getMinValue(this.model.version || 0, this.model.dataType || 0, this.model.fBoxDataType || 0) || 0);
262
+ }
263
+ }
264
+ const args = new WriteValueModalArgs(this.writeVariableName, this.model.dataType, this.model.fBoxDataType, this.model.integerDigits, this.model.fractionDigits, numericalOperation, this.model.version, this.enableDataParsed, this.releasedVariableService, this.guiContext);
265
+ this.writeValueMmodalRef = this.modalService.show(WriteValueModalComponent, {
266
+ initialState: { args: args }, backdrop: 'static', class: 'gui-modal-dialog-position gui-modal-write', animated: false
179
267
  });
180
- const onClosedSub = modalRef.content.onClosed.subscribe(result => {
181
- modalRef.hide();
182
- onClosedSub.unsubscribe();
268
+ this.writeValueMmodalRef.content.onClosed = (result) => {
183
269
  if (result) {
270
+ if (this.restorationTimer) {
271
+ clearTimeout(this.restorationTimer);
272
+ this.restorationTimer = undefined;
273
+ }
274
+ this.recordValue = result.value;
184
275
  const writeValue = this.dataTypeService.formatToDecimal(this.model.version, result.value, this.model.dataType);
185
- this.variableCommunicator.write(this.writeVariableName, writeValue).subscribe();
186
- this.recordOperation(result.value);
276
+ this.showValue = result.showValue;
277
+ // 如果是系统变量"当前语种ID",只更新显示,不执行变量写入和操作记录
278
+ if (this.writeVariableName === '当前语种ID') {
279
+ // 直接更新显示值
280
+ this.displayText = this.showValue;
281
+ this.updateDisplayText(this.formatDisplayTextUnit(this.displayText));
282
+ this.writeValueMmodalRef.hide();
283
+ return;
284
+ }
285
+ if (this.displayText !== this.showValue || result.variableRwType === variableRwTypeEnum.witer) {
286
+ if (this.numericalOperation || result.enableNumericalOperation || result.isNumericalOperation || result.variableRwType === variableRwTypeEnum.witer) {
287
+ this.recordOperation(result.value);
288
+ this.writeValueMmodalRef.hide();
289
+ }
290
+ else {
291
+ this.restorationTimer = setTimeout(() => {
292
+ const isEquation = this.model.fractionDigits ?
293
+ parseFloat(this.displayText) === parseFloat(this.showValue) :
294
+ parseInt(this.displayText, 16) === parseInt(this.showValue, 16);
295
+ if (!isEquation) {
296
+ this.writeValueMmodalRef.content.isSubmitting = false;
297
+ this.writeValueMmodalRef.content.showValidationErrorInfo(this.localization.writeValueTimeout);
298
+ }
299
+ }, 30000);
300
+ }
301
+ this.variableCommunicator.write(this.writeVariableName, writeValue).subscribe();
302
+ }
303
+ else {
304
+ this.writeValueMmodalRef.hide();
305
+ }
187
306
  }
188
- });
307
+ };
189
308
  }
190
309
  recordOperation(newValue) {
191
310
  if (this.model.isRecordOperation || this.model.isRecordOperation === undefined) {
@@ -211,7 +330,21 @@ export class NumericalDisplayElement extends ReadableElement {
211
330
  }
212
331
  }
213
332
  updateVariableValue(value) {
214
- this.displayText = this.formatNumericalDisplayText(this.model.dataType, this.model.fractionDigits, value);
333
+ var _a;
334
+ const displayText = this.formatNumericalDisplayText(this.model.dataType, this.model.fractionDigits, value);
335
+ const isEquation = this.model.fractionDigits ?
336
+ parseFloat(displayText) === parseFloat(this.showValue) :
337
+ parseInt(displayText, 16) === parseInt(this.showValue, 16);
338
+ if (((_a = this.writeValueMmodalRef) === null || _a === void 0 ? void 0 : _a.content) && isEquation) {
339
+ if (this.restorationTimer) {
340
+ clearTimeout(this.restorationTimer);
341
+ this.restorationTimer = undefined;
342
+ this.recordOperation(this.recordValue);
343
+ }
344
+ this.writeValueMmodalRef.hide();
345
+ this.writeValueMmodalRef.content.hideValidationErrorInfo();
346
+ }
347
+ this.displayText = displayText;
215
348
  this.updateDisplayText(this.formatDisplayTextUnit(this.displayText));
216
349
  }
217
350
  updateDisplayText(text) {
@@ -354,7 +487,7 @@ export class NumericalDisplayElement extends ReadableElement {
354
487
  }
355
488
  formatDisplayTextUnit(displayText) {
356
489
  if (this.model.showUnit !== false && this.model.unit) {
357
- return `${displayText} ${this.model.unit}`;
490
+ return `${displayText || 0} ${this.model.unit}`;
358
491
  }
359
492
  return displayText;
360
493
  }