@flexem/fc-gui 3.0.0-alpha.12 → 3.0.0-alpha.120

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 (142) hide show
  1. package/CHANGELOG.md +444 -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/bundles/@flexem/fc-gui.umd.js +19506 -17220
  7. package/bundles/@flexem/fc-gui.umd.js.map +1 -1
  8. package/bundles/@flexem/fc-gui.umd.min.js +5 -5
  9. package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
  10. package/communication/variable/variable-communicator.d.ts +2 -0
  11. package/communication/variable/variable-value.d.ts +4 -1
  12. package/communication/variable/variable-value.js +4 -1
  13. package/communication/variable/variable-value.metadata.json +1 -1
  14. package/config/alarm/alarm.store.d.ts +6 -0
  15. package/config/alarm/alarm.store.js +0 -0
  16. package/config/alarm/alarm.store.metadata.json +1 -0
  17. package/config/alarm/get-alarms-args.d.ts +9 -0
  18. package/config/alarm/get-alarms-args.js +9 -0
  19. package/config/alarm/get-alarms-args.metadata.json +1 -0
  20. package/config/alarm/index.d.ts +2 -0
  21. package/config/alarm/index.js +1 -0
  22. package/config/alarm/index.metadata.json +1 -0
  23. package/config/config-store.d.ts +2 -0
  24. package/config/index.d.ts +1 -0
  25. package/config/index.js +1 -0
  26. package/config/index.metadata.json +1 -1
  27. package/elements/air-quality/air-quality-element.d.ts +31 -0
  28. package/elements/air-quality/air-quality-element.js +194 -0
  29. package/elements/air-quality/air-quality-element.metadata.json +1 -0
  30. package/elements/alarm/alarm-element.d.ts +44 -0
  31. package/elements/alarm/alarm-element.js +386 -0
  32. package/elements/alarm/alarm-element.metadata.json +1 -0
  33. package/elements/bar-graph-element.d.ts +10 -2
  34. package/elements/bar-graph-element.js +135 -5
  35. package/elements/bar-graph-element.metadata.json +1 -1
  36. package/elements/base/readable-element.d.ts +6 -1
  37. package/elements/base/readable-element.js +55 -2
  38. package/elements/base/readable-element.metadata.json +1 -1
  39. package/elements/base/state-control-element.d.ts +3 -1
  40. package/elements/base/state-control-element.js +3 -0
  41. package/elements/datetime-display/datetime-display-element.d.ts +1 -0
  42. package/elements/datetime-display/datetime-display-element.js +10 -2
  43. package/elements/datetime-display/datetime-display-element.metadata.json +1 -1
  44. package/elements/datetime-display/time-zone-select-json.d.ts +8 -0
  45. package/elements/datetime-display/time-zone-select-json.js +558 -0
  46. package/elements/historical-curve/historical-curve.element.d.ts +9 -0
  47. package/elements/historical-curve/historical-curve.element.js +252 -13
  48. package/elements/historical-curve/historical-curve.element.metadata.json +1 -1
  49. package/elements/main-element.d.ts +1 -0
  50. package/elements/main-element.js +50 -4
  51. package/elements/main-element.metadata.json +1 -1
  52. package/elements/meter-element.d.ts +7 -1
  53. package/elements/meter-element.js +76 -7
  54. package/elements/meter-element.metadata.json +1 -1
  55. package/elements/numerical-display/numerical-display-element.d.ts +8 -2
  56. package/elements/numerical-display/numerical-display-element.js +55 -11
  57. package/elements/numerical-display/numerical-display-element.metadata.json +1 -1
  58. package/elements/per-view-variable-communicator.d.ts +3 -0
  59. package/elements/per-view-variable-communicator.js +11 -0
  60. package/elements/per-view-variable-communicator.metadata.json +1 -1
  61. package/elements/ring-graph/ring-graph-element.d.ts +13 -1
  62. package/elements/ring-graph/ring-graph-element.js +164 -3
  63. package/elements/ring-graph/ring-graph-element.metadata.json +1 -1
  64. package/elements/shared/graph/graph-state-element.js +0 -3
  65. package/elements/shared/text/text-element.js +13 -2
  66. package/elements/shared/text/text-state-element.d.ts +0 -1
  67. package/elements/shared/text/text-state-element.js +39 -61
  68. package/elements/shared/text/text-state-element.metadata.json +1 -1
  69. package/elements/switch-indicator-light/bit-switch-operator.d.ts +1 -0
  70. package/elements/switch-indicator-light/bit-switch-operator.js +19 -0
  71. package/elements/switch-indicator-light/bit-switch-operator.metadata.json +1 -1
  72. package/elements/switch-indicator-light/switch-indicator-light-element.d.ts +8 -0
  73. package/elements/switch-indicator-light/switch-indicator-light-element.js +93 -23
  74. package/elements/switch-indicator-light/switch-indicator-light-element.metadata.json +1 -1
  75. package/elements/switch-indicator-light/switch-operator.d.ts +1 -0
  76. package/elements/switch-indicator-light/word-switch-operator.d.ts +1 -0
  77. package/elements/switch-indicator-light/word-switch-operator.js +6 -0
  78. package/elements/switch-indicator-light/word-switch-operator.metadata.json +1 -1
  79. package/elements/video/video-element.d.ts +4 -0
  80. package/elements/video/video-element.js +81 -21
  81. package/elements/video/video-element.metadata.json +1 -1
  82. package/elements/view-operation/view-operation.element.js +8 -0
  83. package/elements/weather/weater-element.js +0 -1
  84. package/gui/gui-context.d.ts +2 -1
  85. package/gui/gui-host.d.ts +1 -1
  86. package/gui/gui-view.d.ts +2 -0
  87. package/gui/gui-view.js +20 -0
  88. package/gui/gui-view.metadata.json +1 -1
  89. package/gui/gui.component.d.ts +3 -0
  90. package/gui/gui.component.js +15 -2
  91. package/gui/gui.component.metadata.json +1 -1
  92. package/localization/localization.service.d.ts +7 -0
  93. package/localization/localization.service.js +10 -3
  94. package/localization/localization.service.metadata.json +1 -1
  95. package/localization/localization.service.zh_CN.js +8 -1
  96. package/localization/localization.service.zh_CN.metadata.json +1 -1
  97. package/modal/write-value/write-value-modal-args.d.ts +3 -1
  98. package/modal/write-value/write-value-modal-args.js +2 -1
  99. package/modal/write-value/write-value-modal-args.metadata.json +1 -1
  100. package/modal/write-value/write-value-modal.component.d.ts +8 -7
  101. package/modal/write-value/write-value-modal.component.html +9 -4
  102. package/modal/write-value/write-value-modal.component.js +42 -15
  103. package/modal/write-value/write-value-modal.component.metadata.json +1 -1
  104. package/model/air-quality/air-quality-info.d.ts +23 -0
  105. package/model/air-quality/air-quality-info.js +4 -0
  106. package/model/air-quality/air-quality-info.metadata.json +1 -0
  107. package/model/air-quality/air-quality.model.d.ts +7 -0
  108. package/model/air-quality/air-quality.model.js +0 -0
  109. package/model/air-quality/air-quality.model.metadata.json +1 -0
  110. package/model/alarm/alarm.model.d.ts +13 -0
  111. package/model/alarm/alarm.model.js +0 -0
  112. package/model/alarm/alarm.model.metadata.json +1 -0
  113. package/model/bar-graph/bar-graph.d.ts +4 -0
  114. package/model/base/readable-model.d.ts +4 -0
  115. package/model/datetime-display/datetime-display.d.ts +1 -0
  116. package/model/historical-curve/historical-curve-axis-settings.d.ts +11 -0
  117. package/model/historical-curve/historical-curve-axis-settings.js +5 -0
  118. package/model/historical-curve/historical-curve-axis-settings.metadata.json +1 -1
  119. package/model/historical-curve/historical-curve-chanel.model.d.ts +8 -0
  120. package/model/meter/meter.d.ts +4 -0
  121. package/model/ring-graph/ring-graph.model.d.ts +8 -0
  122. package/model/switch-indicator-light/bit-switch-operation.d.ts +2 -1
  123. package/model/switch-indicator-light/bit-switch-operation.js +1 -0
  124. package/model/switch-indicator-light/bit-switch-operation.metadata.json +1 -1
  125. package/package.json +1 -1
  126. package/remote/communication/variable/remote-variable-communicator.d.ts +7 -0
  127. package/remote/communication/variable/remote-variable-communicator.js +47 -1
  128. package/remote/communication/variable/remote-variable-communicator.metadata.json +1 -1
  129. package/remote/communication/variable/remote-variable-protocol.d.ts +5 -0
  130. package/service/index.d.ts +1 -0
  131. package/service/index.metadata.json +1 -1
  132. package/service/released-variable/index.d.ts +1 -0
  133. package/service/released-variable/index.js +0 -0
  134. package/service/released-variable/index.metadata.json +1 -0
  135. package/service/released-variable/released-variable.service.d.ts +4 -0
  136. package/service/released-variable/released-variable.service.js +0 -0
  137. package/service/released-variable/released-variable.service.metadata.json +1 -0
  138. package/service/weather.service.d.ts +1 -0
  139. package/shared/gui-consts.d.ts +2 -0
  140. package/shared/gui-consts.js +2 -0
  141. package/shared/gui-consts.metadata.json +1 -1
  142. package/utils/data-type/fbox-data-type.service.js +40 -0
@@ -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,13 +22,19 @@ 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,
28
29
  operationButtonMargin: 4
29
30
  };
30
31
  this.elementStatus = HistoricalCurveElementStatus.Loading;
32
+ this.data = [];
33
+ this.needResize = true;
34
+ this.setNeedResize = () => {
35
+ this.needResize = false;
36
+ setTimeout(() => this.needResize = true, 500);
37
+ };
31
38
  this.logger = injector.get(LOGGER_SERVICE_TOKEN);
32
39
  this.localization = injector.get(LOCALIZATION);
33
40
  this.timePeriods = this.getValidTimePeriods();
@@ -38,7 +45,7 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
38
45
  }, this.model.displaySetting.refreshInterval * 1000);
39
46
  this.isMobileMode = DisplayMode.Mobile === injector.get(GlobalSettings).displayMode;
40
47
  if (this.isMobileMode) {
41
- this.displayOption.operationAreaMarginTop = 20;
48
+ this.displayOption.operationAreaMarginTop = 35;
42
49
  if (this.model.displaySetting.size.width >= this.displayOption.mobileMinWidth) {
43
50
  this.displayOption.operationAreaHeight = 68;
44
51
  this.displayOption.operationSelectFontSize = '24px';
@@ -48,17 +55,34 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
48
55
  }
49
56
  }
50
57
  this.loadFirstPage();
58
+ this.initKeyboardListener();
51
59
  }
52
60
  dispose() {
53
61
  clearInterval(this.refreshIntervalId);
54
62
  if (this.chartElement) {
55
63
  this.chartElement.tooltip.hidden(true);
56
64
  }
65
+ if (this.resizeEventListener) {
66
+ this.resizeEventListener.clear();
67
+ }
68
+ if (this.isAndroid) {
69
+ window.removeEventListener('native.keyboardshow', this.setNeedResize);
70
+ window.removeEventListener('native.keyboardhide', this.setNeedResize);
71
+ }
57
72
  this.logger.debug(`[GUI]Dispose Histoical Curve Refresh Interval:${d3.time.format('%x %X')(new Date())}`);
58
73
  }
74
+ initKeyboardListener() {
75
+ this.isAndroid = !!navigator.userAgent.match(/(Android)/i);
76
+ if (this.isAndroid) {
77
+ window.addEventListener('native.keyboardshow', this.setNeedResize);
78
+ window.addEventListener('native.keyboardhide', this.setNeedResize);
79
+ }
80
+ }
59
81
  getValidTimePeriods() {
60
82
  const timePeriods = new Array();
83
+ timePeriods.push({ key: 6, name: this.localization.lastThirtyMinutes });
61
84
  timePeriods.push({ key: 1, name: this.localization.lastOneHour });
85
+ timePeriods.push({ key: 7, name: this.localization.lastEightHour });
62
86
  timePeriods.push({ key: 2, name: this.localization.lastTwentyFourHours });
63
87
  timePeriods.push({ key: 3, name: this.localization.lastSevenDays });
64
88
  timePeriods.push({ key: 4, name: this.localization.lastThirtyDays });
@@ -84,6 +108,12 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
84
108
  case 5:
85
109
  this.startTime = moment().subtract(1, 'years');
86
110
  break;
111
+ case 6:
112
+ this.startTime = moment().subtract(30, 'minutes');
113
+ break;
114
+ case 7:
115
+ this.startTime = moment().subtract(8, 'hours');
116
+ break;
87
117
  default:
88
118
  this.startTime = moment().subtract(1, 'days');
89
119
  }
@@ -122,6 +152,28 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
122
152
  }
123
153
  });
124
154
  }
155
+ setupTooltipAutoHide(chart) {
156
+ const chartContainer = this.rootElement.select('.nv-focus').node();
157
+ if (!chartContainer || !chart)
158
+ return;
159
+ let timeoutId;
160
+ // 鼠标移入图表时显示 tooltip
161
+ chartContainer.addEventListener('mouseover', () => {
162
+ hideTooltipAfterDelay();
163
+ });
164
+ const clearTooltipTimeout = () => {
165
+ if (timeoutId) {
166
+ clearTimeout(timeoutId);
167
+ timeoutId = null;
168
+ }
169
+ };
170
+ const hideTooltipAfterDelay = () => {
171
+ clearTooltipTimeout();
172
+ timeoutId = setTimeout(() => {
173
+ chart.tooltip.hidden(true);
174
+ }, 2000); // 2秒延迟
175
+ };
176
+ }
125
177
  renderChart(result) {
126
178
  const chartWidth = this.model.displaySetting.size.width;
127
179
  const chartHeight = this.model.displaySetting.size.height - this.displayOption.operationAreaHeight - this.displayOption.operationAreaMarginTop;
@@ -131,19 +183,71 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
131
183
  each(result, v => values.push({ x: moment(v.time).local().toDate().valueOf(), y: v.values[key] }));
132
184
  data.push({ key: channel.name, area: channel.projectEnabled, values: values });
133
185
  });
186
+ this.data = data;
134
187
  nv.addGraph(() => {
188
+ let chart;
135
189
  if (this.model.displaySetting.curveType === CurveType.BarGroup || this.model.displaySetting.curveType === CurveType.BarStack) {
136
- return this.getMultiBarWithFocusChart(chartWidth, chartHeight, data);
190
+ chart = this.getMultiBarWithFocusChart(chartWidth, chartHeight, data);
137
191
  }
138
192
  else {
139
- return this.getLineChart(chartWidth, chartHeight, data);
193
+ chart = this.getLineChart(chartWidth, chartHeight, data);
140
194
  }
195
+ // 设置 tooltip 自动隐藏逻辑
196
+ this.setupTooltipAutoHide(chart);
197
+ return chart;
141
198
  });
142
199
  }
200
+ initPoint() {
201
+ try {
202
+ const legendList = this.$element
203
+ .find('.nv-legend')
204
+ .find('.nv-series');
205
+ let hiddenCount = 0;
206
+ for (let i = 0; i < this.data.length; i++) {
207
+ const channel = this.model.dataSetting.channels[i];
208
+ if (legendList.eq(i).children().eq(0).css('fill-opacity') === '1') {
209
+ const pointList = this.$element
210
+ .find('.nv-scatterWrap')
211
+ .find('.nv-series-' + (i - hiddenCount))
212
+ .find('.nv-point');
213
+ if (pointList && pointList.length) {
214
+ for (let j = 0; j < pointList.length; j++) {
215
+ const point = pointList.eq(j);
216
+ const previousPoint = pointList.eq(j - 1);
217
+ if (j && point.attr('transform').split(',')[1] !== previousPoint.attr('transform').split(',')[1]) {
218
+ if (channel.enablePoint && channel.pointColor) {
219
+ const pointStyle = {
220
+ 'stroke-opacity': 1,
221
+ 'stroke-width': '2px',
222
+ 'stroke': channel.pointColor,
223
+ 'fill-opacity': 1,
224
+ 'fill': channel.pointColor
225
+ };
226
+ point.addClass('nv-mark-point');
227
+ point.css(pointStyle);
228
+ previousPoint.addClass('nv-mark-point');
229
+ previousPoint.css(pointStyle);
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ else {
236
+ hiddenCount++;
237
+ }
238
+ }
239
+ }
240
+ catch (e) {
241
+ console.log(e);
242
+ }
243
+ }
143
244
  getLineChart(chartWidth, chartHeight, data) {
144
245
  const chart = nv.models.lineChart().showLegend(true)
145
246
  .margin({ top: 0, bottom: 0, left: this.displayOption.marginLeft, right: this.displayOption.marginRight })
146
247
  .noData(this.localization.chartNoData);
248
+ if (this.model.displaySetting.axisSetting.yAxisRangeType === AxisRangeType.Custom) {
249
+ chart.yDomain([this.model.displaySetting.axisSetting.yAxisMin, this.model.displaySetting.axisSetting.yAxisMax]);
250
+ }
147
251
  if (!this.isMobileMode) {
148
252
  chart.focusEnable(true);
149
253
  chart.focus.margin({ top: 10, right: 0, bottom: 0, left: 0 });
@@ -152,6 +256,19 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
152
256
  }
153
257
  this.renderCommonProperty(chart, chartWidth, chartHeight, data);
154
258
  this.renderOperationArea(chartWidth, chartHeight);
259
+ this.initPoint();
260
+ chart.legend.dispatch.on('legendClick', () => {
261
+ setTimeout(() => {
262
+ this.$element.find('.nv-mark-point').css({
263
+ 'stroke-opacity': 0,
264
+ 'stroke-width': 0,
265
+ 'stroke': 'unset',
266
+ 'fill-opacity': 0,
267
+ 'fill': 'unset'
268
+ }).removeClass('nv-mark-point');
269
+ this.initPoint();
270
+ }, 1);
271
+ });
155
272
  return chart;
156
273
  }
157
274
  getMultiBarWithFocusChart(chartWidth, chartHeight, data) {
@@ -168,6 +285,9 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
168
285
  chart.multibar.stacked(true);
169
286
  chart.multibar2.stacked(true);
170
287
  }
288
+ if (this.model.displaySetting.axisSetting.yAxisRangeType === AxisRangeType.Custom) {
289
+ chart.yDomain([this.model.displaySetting.axisSetting.yAxisMin, this.model.displaySetting.axisSetting.yAxisMax]);
290
+ }
171
291
  if (!this.isMobileMode) {
172
292
  chart.focusEnable(true);
173
293
  chart.focusShowAxisX(false);
@@ -188,9 +308,27 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
188
308
  return chart;
189
309
  }
190
310
  renderCommonProperty(chart, chartWidth, chartHeight, data) {
311
+ var _a, _b;
191
312
  chart.tooltip.headerFormatter(d => this.timeFormat(d, '%x %X'));
192
313
  if (this.model.displaySetting.showAxis) {
193
- chart.xAxis.showMaxMin(true).tickFormat(d => this.timeFormat(d, '%X'));
314
+ chart.xAxis.showMaxMin(true).tickFormat(d => {
315
+ this.$element.find('.nv-mark-point').css({
316
+ 'stroke-opacity': 0,
317
+ 'stroke-width': 0,
318
+ 'stroke': 'unset',
319
+ 'fill-opacity': 0,
320
+ 'fill': 'unset'
321
+ }).removeClass('nv-mark-point');
322
+ clearTimeout(this.timer);
323
+ this.timer = undefined;
324
+ this.timer = setTimeout(() => {
325
+ this.initPoint();
326
+ }, 100);
327
+ if (this.currentTimePeriod === 3 || this.currentTimePeriod === 4 || this.currentTimePeriod === 5) {
328
+ return this.timeFormat(d, '%y-%m-%d');
329
+ }
330
+ return this.timeFormat(Number(d), '%X');
331
+ });
194
332
  if (this.model.displaySetting.axisSetting) {
195
333
  if (this.model.displaySetting.axisSetting.showAxisLabel && this.model.displaySetting.axisSetting.axisLabelFont) {
196
334
  chart.xAxis.fontSize(this.model.displaySetting.axisSetting.axisLabelFont.fontSize);
@@ -211,47 +349,148 @@ export class HistoricalCurveElement extends ConditionalDisplayElement {
211
349
  chart.color(this.model.dataSetting.channels.map(c => c.connectorColor));
212
350
  this.rootElement.append('g').datum(data).call(chart);
213
351
  this.rootElement.selectAll('.nv-noData').attr('x', chartWidth / 2).attr('y', chartHeight / 2 + this.displayOption.operationAreaHeight);
214
- nv.utils.windowResize(() => {
352
+ this.resizeEventListener = nv.utils.windowResize(() => {
353
+ if (!this.needResize)
354
+ return;
215
355
  chart.update();
216
356
  this.rootElement.selectAll('.nv-noData').attr('x', chartWidth / 2).attr('y', chartHeight / 2 + this.displayOption.operationAreaHeight);
217
357
  });
358
+ const fontSize = (_b = (_a = this.model.displaySetting.axisSetting) === null || _a === void 0 ? void 0 : _a.axisLabelFont) === null || _b === void 0 ? void 0 : _b.fontSize;
218
359
  this.rootElement.selectAll('.domain').style('stroke-opacity', 1);
219
360
  if (this.model.displaySetting.showAxis && this.model.displaySetting.axisSetting) {
220
361
  const axisColor = this.model.displaySetting.axisSetting.axisColor;
221
362
  this.rootElement.selectAll('.domain').style('stroke', axisColor);
222
- if (this.model.displaySetting.axisSetting.showAxisLabel) {
223
- const fontSize = this.model.displaySetting.axisSetting.axisLabelFont.fontSize;
363
+ if (fontSize && this.model.displaySetting.axisSetting.showAxisLabel) {
224
364
  this.rootElement.selectAll('.nv-axisMaxMin').select('text').style('font-size', fontSize);
225
365
  }
226
366
  }
367
+ let strokeWidth = 0;
368
+ if (this.model.displaySetting.axisSetting.showTick !== false) {
369
+ strokeWidth = 1;
370
+ }
371
+ this.rootElement
372
+ .selectAll('.nv-x')
373
+ .selectAll('.tick')
374
+ .selectAll('line')
375
+ .attr('style', `stroke:${this.model.displaySetting.axisSetting.xAxisTickColor || 'rgb(127, 147, 159)'};stroke-width:${strokeWidth};`);
376
+ this.rootElement
377
+ .selectAll('.nv-y')
378
+ .selectAll('.tick')
379
+ .selectAll('line')
380
+ .attr('style', `stroke:${this.model.displaySetting.axisSetting.yAxisTickColor || 'rgb(127, 147, 159)'};stroke-width:${strokeWidth};`);
381
+ if (fontSize && this.currentTimePeriod === 3 || this.currentTimePeriod === 4 || this.currentTimePeriod === 5) {
382
+ const self = this;
383
+ this.rootElement
384
+ .selectAll('.nv-x')
385
+ .selectAll('.tick')
386
+ .selectAll('text')
387
+ .data(function (d) {
388
+ return [self.timeFormat(Number(d), '%y-%m-%d'), self.timeFormat(Number(d), '%H:%M:%S')];
389
+ })
390
+ .enter()
391
+ .append('text')
392
+ .attr('class', 'full-date')
393
+ .attr('x', 0)
394
+ .attr('y', 0)
395
+ .attr('dy', '2.3em')
396
+ .style('text-anchor', 'middle')
397
+ .style('font-size', fontSize)
398
+ .text((d) => d);
399
+ this.rootElement
400
+ .selectAll('.nv-axisMaxMin-x')
401
+ .selectAll('text')
402
+ .data(function (d) {
403
+ return [self.timeFormat(Number(d), '%y-%m-%d'), self.timeFormat(Number(d), '%H:%M:%S')];
404
+ })
405
+ .enter()
406
+ .append('text')
407
+ .attr('class', 'full-date')
408
+ .attr('x', 0)
409
+ .attr('y', 0)
410
+ .attr('dy', '2.3em')
411
+ .style('text-anchor', 'middle')
412
+ .style('font-size', fontSize)
413
+ .text((d) => d);
414
+ const focusWrap = this.rootElement.selectAll('.nv-focusWrap');
415
+ if (focusWrap.size()) {
416
+ let h = focusWrap.attr('transform');
417
+ if (h && h.length && h.indexOf(',') !== -1) {
418
+ h = h.slice(0, -1).split(',')[1];
419
+ this.rootElement
420
+ .selectAll('.nv-focusWrap')
421
+ .attr('transform', `translate(0,${Number(h) + 15})`);
422
+ }
423
+ }
424
+ const resizeObserver = new window.MutationObserver(() => {
425
+ this.rootElement
426
+ .selectAll('.nv-x')
427
+ .selectAll('.tick')
428
+ .selectAll('.full-date')
429
+ .remove();
430
+ this.rootElement
431
+ .selectAll('.nv-x')
432
+ .selectAll('.tick')
433
+ .selectAll('text')
434
+ .data(function (d) {
435
+ return [self.timeFormat(Number(d), '%y-%m-%d'), self.timeFormat(Number(d), '%H:%M:%S')];
436
+ })
437
+ .enter()
438
+ .append('text')
439
+ .attr('class', 'full-date')
440
+ .attr('x', 0)
441
+ .attr('y', 0)
442
+ .attr('dy', '2.3em')
443
+ .style('text-anchor', 'middle')
444
+ .style('font-size', fontSize)
445
+ .text((d) => d);
446
+ });
447
+ const extent = document.getElementsByClassName('extent');
448
+ if (extent.length) {
449
+ resizeObserver.observe(extent[0], { attributes: true });
450
+ }
451
+ }
452
+ else {
453
+ this.rootElement
454
+ .selectAll('.full-date')
455
+ .remove();
456
+ }
227
457
  }
228
458
  renderOperationArea(chartWidth, chartHeight) {
459
+ const backgroundColor = this.model.displaySetting.axisSetting.filterBackgroudColor || 'inherit';
229
460
  const operationArea = this.rootElement.append('g').attr('transform', `translate(0,${chartHeight + this.displayOption.operationAreaMarginTop})`)
230
461
  .append('foreignObject').attr('width', chartWidth).attr('height', this.displayOption.operationAreaHeight).attr('fill', 'none')
231
462
  .append('xhtml:div').style('height', (this.displayOption.operationAreaHeight - 4) + 'px').style('overflow', 'hidden').style('margin-top', '4px');
232
463
  const selectElement = operationArea.append('select').style('margin-left', this.displayOption.marginLeft + 'px')
464
+ .style('background-color', backgroundColor)
233
465
  .style('font-size', this.displayOption.operationSelectFontSize).on('change', () => {
234
466
  const displayTimePeriod = this.rootElement.select('select').property('value');
235
467
  this.updateTimeRange(displayTimePeriod);
236
468
  this.reRenderElement(this.startTime, this.endTime, this.displayOption.dataLimit, HistoricalCurveTimeRange.BeginOpenEndOpen);
237
469
  });
470
+ const rect = this.$element.parent().parent().find('rect');
471
+ const fillColor = rect.attr('fill');
238
472
  const options = selectElement.selectAll('option').data(this.timePeriods).enter().append('option');
239
- options.text(d => d.name).attr('value', d => d.key).property('selected', d => d.key === Number(this.currentTimePeriod));
473
+ options.text(d => d.name).attr('value', d => d.key).property('selected', d => d.key === Number(this.currentTimePeriod))
474
+ .style('background-color', this.model.displaySetting.axisSetting.filterBackgroudColor || fillColor);
240
475
  const buttonWidth = this.displayOption.operationButtonWidth + 'px', buttonHeight = this.displayOption.operationButtonHeight + 'px';
241
476
  operationArea.append('button').style('width', buttonWidth).style('height', buttonHeight).style('border', 'none')
242
- .style('float', 'right').style('background', 'white').style('background-image', 'url(assets/img/last_page.svg)')
477
+ .style('float', 'right').style('background-image', 'url(assets/img/black_last_page.png)')
478
+ .style('background-color', backgroundColor).style('background-size', 'cover')
243
479
  .on('click', () => { this.loadLastPage(); });
244
480
  operationArea.append('button').style('width', buttonWidth).style('height', buttonHeight).style('border', 'none')
245
- .style('float', 'right').style('background', 'white').style('background-image', 'url(assets/img/next_page.svg)')
481
+ .style('float', 'right').style('background-image', 'url(assets/img/black_next_page.png)')
246
482
  .style('margin', `0 ${this.displayOption.operationButtonMargin}px 0 0`)
483
+ .style('background-color', backgroundColor).style('background-size', 'cover')
247
484
  .on('click', () => { this.loadNextPage(); });
248
485
  operationArea.append('button').style('width', buttonWidth).style('height', buttonHeight).style('border', 'none')
249
- .style('float', 'right').style('background', 'white').style('background-image', 'url(assets/img/previous_page.svg)')
486
+ .style('float', 'right').style('background-image', 'url(assets/img/black_previous_page.png)')
250
487
  .style('margin', `0 ${this.displayOption.operationButtonMargin}px 0 0`)
488
+ .style('background-color', backgroundColor).style('background-size', 'cover')
251
489
  .on('click', () => { this.loadPreviousPage(); });
252
490
  operationArea.append('button').style('width', buttonWidth).style('height', buttonHeight).style('border', 'none')
253
- .style('float', 'right').style('background', 'white').style('background-image', 'url(assets/img/first_page.svg)')
491
+ .style('float', 'right').style('background-image', 'url(assets/img/black_first_page.png)')
254
492
  .style('margin', `0 ${this.displayOption.operationButtonMargin}px 0 0`)
493
+ .style('background-color', backgroundColor).style('background-size', 'cover')
255
494
  .on('click', () => { this.loadFirstPage(); });
256
495
  }
257
496
  timeFormat(datetime, specifier) {
@@ -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":68,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":69,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":70,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":71,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":72,"character":23},{"__symbolic":"reference","module":"../../config","name":"HistoryDataStore","line":73,"character":43},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"initKeyboardListener":[{"__symbolic":"method"}],"getValidTimePeriods":[{"__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"}],"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,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
  }
@@ -237,14 +257,39 @@ export class MainElement {
237
257
  });
238
258
  });
239
259
  }
260
+ getVirtualDeviceIdFromRect(rectElement) {
261
+ let current = rectElement;
262
+ while (current) {
263
+ if (current.tagName === 'FC-GUI') {
264
+ const virtualDeviceId = current.getAttribute('data-virtual-device-id');
265
+ return virtualDeviceId || null;
266
+ }
267
+ current = current.parentElement;
268
+ }
269
+ return null;
270
+ }
240
271
  reportVariableValues(values) {
241
272
  this.checkIsLoaded();
242
273
  each(values, value => {
243
274
  each(this.elements, e => {
275
+ var _a;
244
276
  if (e instanceof ReadableElement) {
245
- if (e.readVariableName === value.variableName) {
277
+ if ((value.variableName && (e.readVariableName === value.variableName ||
278
+ e.minVariableName === value.variableName || e.maxVariableName === value.variableName))) {
246
279
  e.reportValueChanged(value);
247
280
  }
281
+ if (e.readVariableName === value.systemName) {
282
+ const rect = (_a = e.currentRect) === null || _a === void 0 ? void 0 : _a[0];
283
+ const deviceId = this.getVirtualDeviceIdFromRect(rect);
284
+ if (deviceId) {
285
+ if (+deviceId === value.virtualDeviceId) {
286
+ e.reportValueChanged(value);
287
+ }
288
+ }
289
+ else {
290
+ e.reportValueChanged(value);
291
+ }
292
+ }
248
293
  }
249
294
  });
250
295
  });
@@ -252,7 +297,8 @@ export class MainElement {
252
297
  dispose() {
253
298
  each(this.elements, e => {
254
299
  if (e instanceof HistoricalCurveElement || e instanceof VideoElement
255
- || e instanceof WeatherElement || e instanceof NumericalDisplayElement || e instanceof TextElement) {
300
+ || e instanceof WeatherElement || e instanceof NumericalDisplayElement || e instanceof TextElement
301
+ || e instanceof AirQualityElement) {
256
302
  e.dispose();
257
303
  }
258
304
  });
@@ -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"}],"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
  }