@flexem/fc-gui 3.0.0-alpha.9 → 3.0.0-alpha.90

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 (123) hide show
  1. package/CHANGELOG.md +381 -0
  2. package/bundles/@flexem/fc-gui.umd.js +17578 -16210
  3. package/bundles/@flexem/fc-gui.umd.js.map +1 -1
  4. package/bundles/@flexem/fc-gui.umd.min.js +5 -5
  5. package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
  6. package/communication/variable/variable-communicator.d.ts +1 -0
  7. package/config/alarm/alarm.store.d.ts +6 -0
  8. package/config/alarm/alarm.store.js +0 -0
  9. package/config/alarm/alarm.store.metadata.json +1 -0
  10. package/config/alarm/get-alarms-args.d.ts +9 -0
  11. package/config/alarm/get-alarms-args.js +9 -0
  12. package/config/alarm/get-alarms-args.metadata.json +1 -0
  13. package/config/alarm/index.d.ts +2 -0
  14. package/config/alarm/index.js +1 -0
  15. package/config/alarm/index.metadata.json +1 -0
  16. package/config/config-store.d.ts +2 -0
  17. package/config/index.d.ts +1 -0
  18. package/config/index.js +1 -0
  19. package/config/index.metadata.json +1 -1
  20. package/elements/air-quality/air-quality-element.d.ts +31 -0
  21. package/elements/air-quality/air-quality-element.js +194 -0
  22. package/elements/air-quality/air-quality-element.metadata.json +1 -0
  23. package/elements/alarm/alarm-element.d.ts +44 -0
  24. package/elements/alarm/alarm-element.js +382 -0
  25. package/elements/alarm/alarm-element.metadata.json +1 -0
  26. package/elements/bar-graph-element.d.ts +7 -1
  27. package/elements/bar-graph-element.js +70 -4
  28. package/elements/bar-graph-element.metadata.json +1 -1
  29. package/elements/base/readable-element.d.ts +6 -1
  30. package/elements/base/readable-element.js +31 -2
  31. package/elements/base/readable-element.metadata.json +1 -1
  32. package/elements/historical-curve/historical-curve.element.js +116 -13
  33. package/elements/historical-curve/historical-curve.element.metadata.json +1 -1
  34. package/elements/main-element.js +25 -4
  35. package/elements/main-element.metadata.json +1 -1
  36. package/elements/meter-element.d.ts +7 -1
  37. package/elements/meter-element.js +76 -7
  38. package/elements/meter-element.metadata.json +1 -1
  39. package/elements/numerical-display/numerical-display-element.d.ts +8 -2
  40. package/elements/numerical-display/numerical-display-element.js +55 -11
  41. package/elements/numerical-display/numerical-display-element.metadata.json +1 -1
  42. package/elements/per-view-variable-communicator.d.ts +2 -0
  43. package/elements/per-view-variable-communicator.js +8 -0
  44. package/elements/per-view-variable-communicator.metadata.json +1 -1
  45. package/elements/ring-graph/ring-graph-element.d.ts +10 -1
  46. package/elements/ring-graph/ring-graph-element.js +106 -3
  47. package/elements/ring-graph/ring-graph-element.metadata.json +1 -1
  48. package/elements/shared/graph/graph-state-element.js +0 -3
  49. package/elements/shared/text/text-element.js +13 -2
  50. package/elements/shared/text/text-state-element.js +1 -1
  51. package/elements/switch-indicator-light/bit-switch-operator.d.ts +1 -0
  52. package/elements/switch-indicator-light/bit-switch-operator.js +19 -0
  53. package/elements/switch-indicator-light/bit-switch-operator.metadata.json +1 -1
  54. package/elements/switch-indicator-light/switch-indicator-light-element.d.ts +8 -0
  55. package/elements/switch-indicator-light/switch-indicator-light-element.js +93 -23
  56. package/elements/switch-indicator-light/switch-indicator-light-element.metadata.json +1 -1
  57. package/elements/switch-indicator-light/switch-operator.d.ts +1 -0
  58. package/elements/switch-indicator-light/word-switch-operator.d.ts +1 -0
  59. package/elements/switch-indicator-light/word-switch-operator.js +6 -0
  60. package/elements/switch-indicator-light/word-switch-operator.metadata.json +1 -1
  61. package/elements/video/video-element.d.ts +4 -0
  62. package/elements/video/video-element.js +69 -20
  63. package/elements/video/video-element.metadata.json +1 -1
  64. package/elements/view-operation/view-operation.element.js +8 -0
  65. package/elements/weather/weater-element.js +0 -1
  66. package/gui/gui-context.d.ts +2 -1
  67. package/gui/gui-host.d.ts +1 -1
  68. package/gui/gui.component.d.ts +3 -0
  69. package/gui/gui.component.js +15 -2
  70. package/gui/gui.component.metadata.json +1 -1
  71. package/localization/localization.service.d.ts +7 -0
  72. package/localization/localization.service.js +8 -1
  73. package/localization/localization.service.metadata.json +1 -1
  74. package/localization/localization.service.zh_CN.js +8 -1
  75. package/localization/localization.service.zh_CN.metadata.json +1 -1
  76. package/modal/write-value/write-value-modal-args.d.ts +4 -1
  77. package/modal/write-value/write-value-modal-args.js +3 -1
  78. package/modal/write-value/write-value-modal-args.metadata.json +1 -1
  79. package/modal/write-value/write-value-modal.component.d.ts +9 -7
  80. package/modal/write-value/write-value-modal.component.html +9 -4
  81. package/modal/write-value/write-value-modal.component.js +39 -22
  82. package/modal/write-value/write-value-modal.component.metadata.json +1 -1
  83. package/model/air-quality/air-quality-info.d.ts +23 -0
  84. package/model/air-quality/air-quality-info.js +4 -0
  85. package/model/air-quality/air-quality-info.metadata.json +1 -0
  86. package/model/air-quality/air-quality.model.d.ts +7 -0
  87. package/model/air-quality/air-quality.model.js +0 -0
  88. package/model/air-quality/air-quality.model.metadata.json +1 -0
  89. package/model/alarm/alarm.model.d.ts +13 -0
  90. package/model/alarm/alarm.model.js +0 -0
  91. package/model/alarm/alarm.model.metadata.json +1 -0
  92. package/model/bar-graph/bar-graph.d.ts +4 -0
  93. package/model/base/readable-model.d.ts +4 -0
  94. package/model/historical-curve/historical-curve-axis-settings.d.ts +10 -0
  95. package/model/historical-curve/historical-curve-axis-settings.js +5 -0
  96. package/model/historical-curve/historical-curve-axis-settings.metadata.json +1 -1
  97. package/model/meter/meter.d.ts +4 -0
  98. package/model/numerical-display/numerical-display.d.ts +1 -0
  99. package/model/ring-graph/ring-graph.model.d.ts +8 -0
  100. package/model/switch-indicator-light/bit-switch-operation.d.ts +2 -1
  101. package/model/switch-indicator-light/bit-switch-operation.js +1 -0
  102. package/model/switch-indicator-light/bit-switch-operation.metadata.json +1 -1
  103. package/package.json +1 -1
  104. package/remote/communication/variable/remote-variable-communicator.d.ts +4 -0
  105. package/remote/communication/variable/remote-variable-communicator.js +23 -1
  106. package/remote/communication/variable/remote-variable-communicator.metadata.json +1 -1
  107. package/remote/communication/variable/remote-variable-protocol.d.ts +3 -0
  108. package/service/index.d.ts +1 -0
  109. package/service/index.metadata.json +1 -1
  110. package/service/released-variable/index.d.ts +1 -0
  111. package/service/released-variable/index.js +0 -0
  112. package/service/released-variable/index.metadata.json +1 -0
  113. package/service/released-variable/released-variable.service.d.ts +4 -0
  114. package/service/released-variable/released-variable.service.js +0 -0
  115. package/service/released-variable/released-variable.service.metadata.json +1 -0
  116. package/service/weather.service.d.ts +1 -0
  117. package/shared/gui-consts.d.ts +2 -0
  118. package/shared/gui-consts.js +2 -0
  119. package/shared/gui-consts.metadata.json +1 -1
  120. package/utils/data-type/data-type.service.d.ts +4 -7
  121. package/utils/data-type/data-type.service.js +29 -17
  122. package/utils/data-type/fbox-data-type.service.js +40 -0
  123. package/utils/numerical-operation.service.js +2 -2
@@ -10,6 +10,7 @@ import { HistoricalCurveElementStatus } from './historical-curve-element-status'
10
10
  import { LOGGER_SERVICE_TOKEN } from '../../logger';
11
11
  import { GlobalSettings, DisplayMode } from '../../settings';
12
12
  import { CurveType } from '../../model/historical-curve/curve-type';
13
+ import { AxisRangeType } from '../../model/historical-curve/historical-curve-axis-settings';
13
14
  export class HistoricalCurveElement extends ConditionalDisplayElement {
14
15
  constructor(element, injector, permissionChecker, variableCommunicator, variableStore, historyDataStore, signalRAppId) {
15
16
  super(element, permissionChecker, variableCommunicator, variableStore, signalRAppId);
@@ -21,7 +22,7 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
21
22
  marginRight: 20,
22
23
  mobileMinWidth: 450,
23
24
  operationAreaHeight: 32,
24
- operationAreaMarginTop: 10,
25
+ operationAreaMarginTop: 25,
25
26
  operationSelectFontSize: '16px',
26
27
  operationButtonWidth: 24,
27
28
  operationButtonHeight: 24,
@@ -38,7 +39,7 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
38
39
  }, this.model.displaySetting.refreshInterval * 1000);
39
40
  this.isMobileMode = DisplayMode.Mobile === injector.get(GlobalSettings).displayMode;
40
41
  if (this.isMobileMode) {
41
- this.displayOption.operationAreaMarginTop = 20;
42
+ this.displayOption.operationAreaMarginTop = 35;
42
43
  if (this.model.displaySetting.size.width >= this.displayOption.mobileMinWidth) {
43
44
  this.displayOption.operationAreaHeight = 68;
44
45
  this.displayOption.operationSelectFontSize = '24px';
@@ -58,7 +59,9 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
58
59
  }
59
60
  getValidTimePeriods() {
60
61
  const timePeriods = new Array();
62
+ timePeriods.push({ key: 6, name: this.localization.lastThirtyMinutes });
61
63
  timePeriods.push({ key: 1, name: this.localization.lastOneHour });
64
+ timePeriods.push({ key: 7, name: this.localization.lastEightHour });
62
65
  timePeriods.push({ key: 2, name: this.localization.lastTwentyFourHours });
63
66
  timePeriods.push({ key: 3, name: this.localization.lastSevenDays });
64
67
  timePeriods.push({ key: 4, name: this.localization.lastThirtyDays });
@@ -84,6 +87,12 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
84
87
  case 5:
85
88
  this.startTime = moment().subtract(1, 'years');
86
89
  break;
90
+ case 6:
91
+ this.startTime = moment().subtract(30, 'minutes');
92
+ break;
93
+ case 7:
94
+ this.startTime = moment().subtract(8, 'hours');
95
+ break;
87
96
  default:
88
97
  this.startTime = moment().subtract(1, 'days');
89
98
  }
@@ -144,6 +153,9 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
144
153
  const chart = nv.models.lineChart().showLegend(true)
145
154
  .margin({ top: 0, bottom: 0, left: this.displayOption.marginLeft, right: this.displayOption.marginRight })
146
155
  .noData(this.localization.chartNoData);
156
+ if (this.model.displaySetting.axisSetting.yAxisRangeType === AxisRangeType.Custom) {
157
+ chart.yDomain([this.model.displaySetting.axisSetting.yAxisMin, this.model.displaySetting.axisSetting.yAxisMax]);
158
+ }
147
159
  if (!this.isMobileMode) {
148
160
  chart.focusEnable(true);
149
161
  chart.focus.margin({ top: 10, right: 0, bottom: 0, left: 0 });
@@ -151,10 +163,6 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
151
163
  chart.focus.showXAxis(false);
152
164
  }
153
165
  this.renderCommonProperty(chart, chartWidth, chartHeight, data);
154
- // if in Mobile mode and width is less than the min width, then hide operation area
155
- if (this.isMobileMode && this.model.displaySetting.size.width < this.displayOption.mobileMinWidth) {
156
- return chart;
157
- }
158
166
  this.renderOperationArea(chartWidth, chartHeight);
159
167
  return chart;
160
168
  }
@@ -172,16 +180,15 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
172
180
  chart.multibar.stacked(true);
173
181
  chart.multibar2.stacked(true);
174
182
  }
183
+ if (this.model.displaySetting.axisSetting.yAxisRangeType === AxisRangeType.Custom) {
184
+ chart.yDomain([this.model.displaySetting.axisSetting.yAxisMin, this.model.displaySetting.axisSetting.yAxisMax]);
185
+ }
175
186
  if (!this.isMobileMode) {
176
187
  chart.focusEnable(true);
177
188
  chart.focusShowAxisX(false);
178
189
  }
179
190
  chart.xAxis.tickFormat(d => this.timeFormat(d, '%x %X'));
180
191
  this.renderCommonProperty(chart, chartWidth, chartHeight, data);
181
- // if in Mobile mode and width is less than the min width, then hide operation area
182
- if (this.isMobileMode && this.model.displaySetting.size.width < this.displayOption.mobileMinWidth) {
183
- return chart;
184
- }
185
192
  this.renderOperationArea(chartWidth, chartHeight);
186
193
  const focusContext = this.rootElement.select('.nv-context');
187
194
  focusContext.select('.nv-barsWrap.nvd3-svg').attr('transform', 'translate(0,30)');
@@ -196,9 +203,15 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
196
203
  return chart;
197
204
  }
198
205
  renderCommonProperty(chart, chartWidth, chartHeight, data) {
206
+ var _a, _b;
199
207
  chart.tooltip.headerFormatter(d => this.timeFormat(d, '%x %X'));
200
208
  if (this.model.displaySetting.showAxis) {
201
- chart.xAxis.showMaxMin(true).tickFormat(d => this.timeFormat(d, '%X'));
209
+ chart.xAxis.showMaxMin(true).tickFormat(d => {
210
+ if (this.currentTimePeriod === 3 || this.currentTimePeriod === 4 || this.currentTimePeriod === 5) {
211
+ return this.timeFormat(d, '%y-%m-%d');
212
+ }
213
+ return this.timeFormat(Number(d), '%X');
214
+ });
202
215
  if (this.model.displaySetting.axisSetting) {
203
216
  if (this.model.displaySetting.axisSetting.showAxisLabel && this.model.displaySetting.axisSetting.axisLabelFont) {
204
217
  chart.xAxis.fontSize(this.model.displaySetting.axisSetting.axisLabelFont.fontSize);
@@ -223,15 +236,105 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
223
236
  chart.update();
224
237
  this.rootElement.selectAll('.nv-noData').attr('x', chartWidth / 2).attr('y', chartHeight / 2 + this.displayOption.operationAreaHeight);
225
238
  });
239
+ const fontSize = (_b = (_a = this.model.displaySetting.axisSetting) === null || _a === void 0 ? void 0 : _a.axisLabelFont) === null || _b === void 0 ? void 0 : _b.fontSize;
226
240
  this.rootElement.selectAll('.domain').style('stroke-opacity', 1);
227
241
  if (this.model.displaySetting.showAxis && this.model.displaySetting.axisSetting) {
228
242
  const axisColor = this.model.displaySetting.axisSetting.axisColor;
229
243
  this.rootElement.selectAll('.domain').style('stroke', axisColor);
230
- if (this.model.displaySetting.axisSetting.showAxisLabel) {
231
- const fontSize = this.model.displaySetting.axisSetting.axisLabelFont.fontSize;
244
+ if (fontSize && this.model.displaySetting.axisSetting.showAxisLabel) {
232
245
  this.rootElement.selectAll('.nv-axisMaxMin').select('text').style('font-size', fontSize);
233
246
  }
234
247
  }
248
+ let strokeWidth = 0;
249
+ if (this.model.displaySetting.axisSetting.showTick !== false) {
250
+ strokeWidth = 1;
251
+ }
252
+ this.rootElement
253
+ .selectAll('.nv-x')
254
+ .selectAll('.tick')
255
+ .selectAll('line')
256
+ .attr('style', `stroke:${this.model.displaySetting.axisSetting.xAxisTickColor || 'rgb(127, 147, 159)'};stroke-width:${strokeWidth};`);
257
+ this.rootElement
258
+ .selectAll('.nv-y')
259
+ .selectAll('.tick')
260
+ .selectAll('line')
261
+ .attr('style', `stroke:${this.model.displaySetting.axisSetting.yAxisTickColor || 'rgb(127, 147, 159)'};stroke-width:${strokeWidth};`);
262
+ if (fontSize && this.currentTimePeriod === 3 || this.currentTimePeriod === 4 || this.currentTimePeriod === 5) {
263
+ const self = this;
264
+ this.rootElement
265
+ .selectAll('.nv-x')
266
+ .selectAll('.tick')
267
+ .selectAll('text')
268
+ .data(function (d) {
269
+ return [self.timeFormat(Number(d), '%y-%m-%d'), self.timeFormat(Number(d), '%H:%M:%S')];
270
+ })
271
+ .enter()
272
+ .append('text')
273
+ .attr('class', 'full-date')
274
+ .attr('x', 0)
275
+ .attr('y', 0)
276
+ .attr('dy', '2.3em')
277
+ .style('text-anchor', 'middle')
278
+ .style('font-size', fontSize)
279
+ .text((d) => d);
280
+ this.rootElement
281
+ .selectAll('.nv-axisMaxMin-x')
282
+ .selectAll('text')
283
+ .data(function (d) {
284
+ return [self.timeFormat(Number(d), '%y-%m-%d'), self.timeFormat(Number(d), '%H:%M:%S')];
285
+ })
286
+ .enter()
287
+ .append('text')
288
+ .attr('class', 'full-date')
289
+ .attr('x', 0)
290
+ .attr('y', 0)
291
+ .attr('dy', '2.3em')
292
+ .style('text-anchor', 'middle')
293
+ .style('font-size', fontSize)
294
+ .text((d) => d);
295
+ const focusWrap = this.rootElement.selectAll('.nv-focusWrap');
296
+ if (focusWrap.size()) {
297
+ let h = focusWrap.attr('transform');
298
+ if (h && h.length && h.indexOf(',') !== -1) {
299
+ h = h.slice(0, -1).split(',')[1];
300
+ this.rootElement
301
+ .selectAll('.nv-focusWrap')
302
+ .attr('transform', `translate(0,${Number(h) + 15})`);
303
+ }
304
+ }
305
+ const resizeObserver = new window.MutationObserver(() => {
306
+ this.rootElement
307
+ .selectAll('.nv-x')
308
+ .selectAll('.tick')
309
+ .selectAll('.full-date')
310
+ .remove();
311
+ this.rootElement
312
+ .selectAll('.nv-x')
313
+ .selectAll('.tick')
314
+ .selectAll('text')
315
+ .data(function (d) {
316
+ return [self.timeFormat(Number(d), '%y-%m-%d'), self.timeFormat(Number(d), '%H:%M:%S')];
317
+ })
318
+ .enter()
319
+ .append('text')
320
+ .attr('class', 'full-date')
321
+ .attr('x', 0)
322
+ .attr('y', 0)
323
+ .attr('dy', '2.3em')
324
+ .style('text-anchor', 'middle')
325
+ .style('font-size', fontSize)
326
+ .text((d) => d);
327
+ });
328
+ const extent = document.getElementsByClassName('extent');
329
+ if (extent.length) {
330
+ resizeObserver.observe(extent[0], { attributes: true });
331
+ }
332
+ }
333
+ else {
334
+ this.rootElement
335
+ .selectAll('.full-date')
336
+ .remove();
337
+ }
235
338
  }
236
339
  renderOperationArea(chartWidth, chartHeight) {
237
340
  const operationArea = this.rootElement.append('g').attr('transform', `translate(0,${chartHeight + this.displayOption.operationAreaMarginTop})`)
@@ -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":21,"character":44},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":63,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":64,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":65,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":66,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":67,"character":23},{"__symbolic":"reference","module":"../../config","name":"HistoryDataStore","line":68,"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"}]}}}}]
@@ -27,6 +27,8 @@ 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';
30
32
  export class MainElement {
31
33
  constructor(injector, bsModalService, context, variableCommunicator, popupViewService, signalRAppId) {
32
34
  this.injector = injector;
@@ -58,7 +60,7 @@ export class MainElement {
58
60
  const category = $(element).data('model').category;
59
61
  switch (category) {
60
62
  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);
63
+ 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);
62
64
  this.elements.push(numericalDisplayElement);
63
65
  break;
64
66
  case GuiConsts.components.imageKey:
@@ -125,6 +127,12 @@ export class MainElement {
125
127
  case GuiConsts.components.weatherKey:
126
128
  this.elements.push(new WeatherElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.weatherService, this.signalRAppId));
127
129
  break;
130
+ case GuiConsts.components.airQualityKey:
131
+ this.elements.push(new AirQualityElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.weatherService, this.signalRAppId));
132
+ break;
133
+ case GuiConsts.components.alarmKey:
134
+ this.elements.push(new AlarmElement(element, this.injector, this.context.permissionChecker, this.variableCommunicator, this.context.configStore.variableStore, this.context.configStore.alarmsStore, this.signalRAppId));
135
+ break;
128
136
  }
129
137
  });
130
138
  this.initBackground();
@@ -204,7 +212,7 @@ export class MainElement {
204
212
  initElementState() {
205
213
  forEach(this.elements, element => {
206
214
  if (element instanceof ReadableElement) {
207
- element.init(element.readVariableName);
215
+ element.init(element.readVariableName || element.maxVariableName || element.minVariableName);
208
216
  }
209
217
  else if (element instanceof HistoricalCurveElement) {
210
218
  element.initElementStatus();
@@ -215,8 +223,20 @@ export class MainElement {
215
223
  getVariableNames() {
216
224
  const variableNames = new Array();
217
225
  forEach(this.elements, element => {
226
+ var _a, _b;
218
227
  if (element instanceof ReadableElement) {
228
+ const maxVariableName = (_a = element) === null || _a === void 0 ? void 0 : _a.maxVariableName;
229
+ const maxValueType = element.maxValueType;
230
+ const minVariableName = (_b = element) === null || _b === void 0 ? void 0 : _b.minVariableName;
231
+ const minValueType = element.minValueType;
219
232
  const variableName = element.readVariableName;
233
+ // 最大最小值选择变量类型时,其中一个未绑定变量不进行开点操作 - FLEXCLOUD-1817
234
+ if (maxValueType && maxVariableName && !variableNames.find(v => isEqual(maxVariableName, v))) {
235
+ variableNames.push(maxVariableName);
236
+ }
237
+ if (minValueType && minVariableName && !variableNames.find(v => isEqual(minVariableName, v))) {
238
+ variableNames.push(minVariableName);
239
+ }
220
240
  if (variableName && !variableNames.find(v => isEqual(variableName, v))) {
221
241
  variableNames.push(element.readVariableName);
222
242
  }
@@ -242,7 +262,7 @@ export class MainElement {
242
262
  each(values, value => {
243
263
  each(this.elements, e => {
244
264
  if (e instanceof ReadableElement) {
245
- if (e.readVariableName === value.variableName) {
265
+ if (e.readVariableName === value.variableName || e.minVariableName === value.variableName || e.maxVariableName === value.variableName) {
246
266
  e.reportValueChanged(value);
247
267
  }
248
268
  }
@@ -252,7 +272,8 @@ export class MainElement {
252
272
  dispose() {
253
273
  each(this.elements, e => {
254
274
  if (e instanceof HistoricalCurveElement || e instanceof VideoElement
255
- || e instanceof WeatherElement || e instanceof NumericalDisplayElement || e instanceof TextElement) {
275
+ || e instanceof WeatherElement || e instanceof NumericalDisplayElement || e instanceof TextElement
276
+ || e instanceof AirQualityElement) {
256
277
  e.dispose();
257
278
  }
258
279
  });
@@ -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":55,"character":43},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":56,"character":41},{"__symbolic":"reference","module":"../gui/gui-context","name":"GuiContext","line":57,"character":34},{"__symbolic":"reference","module":"../communication","name":"VariableCommunicator","line":58,"character":47},{"__symbolic":"reference","module":"../view/popup-view.service","name":"PopupViewService","line":59,"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"}]}}}}]
@@ -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,7 +3,7 @@ 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';
6
+ import { PermissionChecker, OperationRecordService, ReleasedVariableService } from '../../service';
7
7
  import { VariableCommunicator } from '../../communication';
8
8
  import { ReadableElement } from '../base/readable-element';
9
9
  import { SecurityChecker } from '../../security';
@@ -11,6 +11,7 @@ export declare class NumericalDisplayElement extends ReadableElement {
11
11
  private readonly modalService;
12
12
  private readonly graphStore;
13
13
  private readonly operationRecordService;
14
+ private readonly releasedVariableService;
14
15
  private readonly securityChecker;
15
16
  private readonly dataTypeService;
16
17
  private readonly fractionDigitService;
@@ -21,8 +22,13 @@ export declare class NumericalDisplayElement extends ReadableElement {
21
22
  private readonly logger;
22
23
  private displayForeignObject;
23
24
  private enableDataParsed;
25
+ private writeValueMmodalRef;
26
+ private recordValue;
27
+ private showValue;
28
+ private numericalOperation;
29
+ private restorationTimer;
24
30
  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);
31
+ 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);
26
32
  dispose(): void;
27
33
  initElement(): any;
28
34
  private checkElementPassword;
@@ -11,12 +11,19 @@ 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) {
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;
21
28
  this.displayText = '';
22
29
  this.enableDataParsed = false;
@@ -173,19 +180,42 @@ export class NumericalDisplayElement extends ReadableElement {
173
180
  if (null == this.writeVariableName) {
174
181
  return;
175
182
  }
176
- const args = new WriteValueModalArgs(this.writeVariableName, this.model.dataType, this.model.integerDigits, this.model.fractionDigits, this.numericalOperationService.getNumericalOperations(this.model), this.model.version, this.enableDataParsed);
177
- const modalRef = this.modalService.show(WriteValueModalComponent, {
183
+ 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, this.releasedVariableService);
184
+ this.writeValueMmodalRef = this.modalService.show(WriteValueModalComponent, {
178
185
  initialState: { args: args }, backdrop: 'static', class: 'gui-modal-dialog-position', animated: false
179
186
  });
180
- const onClosedSub = modalRef.content.onClosed.subscribe(result => {
181
- modalRef.hide();
182
- onClosedSub.unsubscribe();
187
+ this.writeValueMmodalRef.content.onClosed = (result) => {
183
188
  if (result) {
189
+ if (this.restorationTimer) {
190
+ clearTimeout(this.restorationTimer);
191
+ this.restorationTimer = undefined;
192
+ }
193
+ this.recordValue = result.value;
184
194
  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);
195
+ this.showValue = result.showValue;
196
+ if (this.displayText !== this.showValue || result.variableRwType === variableRwTypeEnum.witer) {
197
+ if (this.numericalOperation || result.enableNumericalOperation || result.isNumericalOperation || result.variableRwType === variableRwTypeEnum.witer) {
198
+ this.recordOperation(result.value);
199
+ this.writeValueMmodalRef.hide();
200
+ }
201
+ else {
202
+ this.restorationTimer = setTimeout(() => {
203
+ const isEquation = this.model.fractionDigits ?
204
+ parseFloat(this.displayText) === parseFloat(this.showValue) :
205
+ parseInt(this.displayText, 16) === parseInt(this.showValue, 16);
206
+ if (!isEquation) {
207
+ this.writeValueMmodalRef.content.isSubmitting = false;
208
+ this.writeValueMmodalRef.content.showValidationErrorInfo(this.localization.writeValueTimeout);
209
+ }
210
+ }, 10000);
211
+ }
212
+ this.variableCommunicator.write(this.writeVariableName, writeValue).subscribe();
213
+ }
214
+ else {
215
+ this.writeValueMmodalRef.hide();
216
+ }
187
217
  }
188
- });
218
+ };
189
219
  }
190
220
  recordOperation(newValue) {
191
221
  if (this.model.isRecordOperation || this.model.isRecordOperation === undefined) {
@@ -211,7 +241,21 @@ export class NumericalDisplayElement extends ReadableElement {
211
241
  }
212
242
  }
213
243
  updateVariableValue(value) {
214
- this.displayText = this.formatNumericalDisplayText(this.model.dataType, this.model.fractionDigits, value);
244
+ var _a;
245
+ const displayText = this.formatNumericalDisplayText(this.model.dataType, this.model.fractionDigits, value);
246
+ const isEquation = this.model.fractionDigits ?
247
+ parseFloat(displayText) === parseFloat(this.showValue) :
248
+ parseInt(displayText, 16) === parseInt(this.showValue, 16);
249
+ if (((_a = this.writeValueMmodalRef) === null || _a === void 0 ? void 0 : _a.content) && isEquation) {
250
+ if (this.restorationTimer) {
251
+ clearTimeout(this.restorationTimer);
252
+ this.restorationTimer = undefined;
253
+ this.recordOperation(this.recordValue);
254
+ }
255
+ this.writeValueMmodalRef.hide();
256
+ this.writeValueMmodalRef.content.hideValidationErrorInfo();
257
+ }
258
+ this.displayText = displayText;
215
259
  this.updateDisplayText(this.formatDisplayTextUnit(this.displayText));
216
260
  }
217
261
  updateDisplayText(text) {
@@ -354,7 +398,7 @@ export class NumericalDisplayElement extends ReadableElement {
354
398
  }
355
399
  formatDisplayTextUnit(displayText) {
356
400
  if (this.model.showUnit !== false && this.model.unit) {
357
- return `${displayText} ${this.model.unit}`;
401
+ return `${displayText || 0} ${this.model.unit}`;
358
402
  }
359
403
  return displayText;
360
404
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"NumericalDisplayElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/readable-element","name":"ReadableElement","line":22,"character":45},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":39,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":40,"character":18},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":41,"character":39},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":42,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":43,"character":30},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":44,"character":37},{"__symbolic":"reference","module":"../../service","name":"OperationRecordService","line":45,"character":49},{"__symbolic":"reference","module":"../../security","name":"SecurityChecker","line":46,"character":42},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":47,"character":23},{"__symbolic":"reference","module":"../../localization","name":"Localization","line":48,"character":22},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"initElement":[{"__symbolic":"method"}],"checkElementPassword":[{"__symbolic":"method"}],"initVariableText":[{"__symbolic":"method"}],"initGraphAndText":[{"__symbolic":"method"}],"doWriteValue":[{"__symbolic":"method"}],"recordOperation":[{"__symbolic":"method"}],"changeStates":[{"__symbolic":"method"}],"updateVariableValue":[{"__symbolic":"method"}],"updateDisplayText":[{"__symbolic":"method"}],"rebuildTextElement":[{"__symbolic":"method"}],"formatNumericalDisplayText":[{"__symbolic":"method"}],"formatFloatDisplayText":[{"__symbolic":"method"}],"isNumeric":[{"__symbolic":"method"}],"formatDisplayTextUnit":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"NumericalDisplayElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/readable-element","name":"ReadableElement","line":28,"character":45},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":50,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":51,"character":18},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":52,"character":39},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":53,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":54,"character":30},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":55,"character":37},{"__symbolic":"reference","module":"../../service","name":"OperationRecordService","line":56,"character":49},{"__symbolic":"reference","module":"../../service","name":"ReleasedVariableService","line":57,"character":50},{"__symbolic":"reference","module":"../../security","name":"SecurityChecker","line":58,"character":42},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":59,"character":23},{"__symbolic":"reference","module":"../../localization","name":"Localization","line":60,"character":22},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"initElement":[{"__symbolic":"method"}],"checkElementPassword":[{"__symbolic":"method"}],"initVariableText":[{"__symbolic":"method"}],"initGraphAndText":[{"__symbolic":"method"}],"doWriteValue":[{"__symbolic":"method"}],"recordOperation":[{"__symbolic":"method"}],"changeStates":[{"__symbolic":"method"}],"updateVariableValue":[{"__symbolic":"method"}],"updateDisplayText":[{"__symbolic":"method"}],"rebuildTextElement":[{"__symbolic":"method"}],"formatNumericalDisplayText":[{"__symbolic":"method"}],"formatFloatDisplayText":[{"__symbolic":"method"}],"isNumeric":[{"__symbolic":"method"}],"formatDisplayTextUnit":[{"__symbolic":"method"}]}}}}]
@@ -6,6 +6,7 @@ export declare class PerViewVariableCommunicator implements VariableCommunicator
6
6
  private observers;
7
7
  private variableValuesChangedSubscriptions;
8
8
  private variableStatesChangedSubscription;
9
+ private alarmSubscription;
9
10
  constructor(variableCommunicator: VariableCommunicator);
10
11
  openVariable(variableName: string, appId: string): Observable<VariableValue>;
11
12
  openVariables(variableNames: Array<string>, appId?: string): Observable<Array<VariableValue>>;
@@ -13,5 +14,6 @@ export declare class PerViewVariableCommunicator implements VariableCommunicator
13
14
  writeWordByBit(variableName: string, index: number, value: number): Observable<VariableValue>;
14
15
  subscribeVariableState(variableName: string): Observable<VariableState>;
15
16
  subscribeVariableStates(variableNames: string[]): Observable<Array<VariableState>>;
17
+ subscribeUserDeviceAlarms(appId?: string): Observable<VariableState[]>;
16
18
  dispose(): void;
17
19
  }