@flexem/fc-gui 3.0.0-alpha.124 → 3.0.0-alpha.126

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 (48) hide show
  1. package/bundles/@flexem/fc-gui.umd.js +898 -316
  2. package/bundles/@flexem/fc-gui.umd.js.map +1 -1
  3. package/bundles/@flexem/fc-gui.umd.min.js +4 -4
  4. package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
  5. package/communication/variable/variable-communicator.d.ts +2 -0
  6. package/elements/alarm/alarm-element.d.ts +17 -2
  7. package/elements/alarm/alarm-element.js +74 -6
  8. package/elements/alarm/alarm-element.metadata.json +1 -1
  9. package/elements/base/readable-element.js +14 -5
  10. package/elements/base/state-control-element.js +2 -2
  11. package/elements/historical-curve/historical-curve.element.d.ts +17 -2
  12. package/elements/historical-curve/historical-curve.element.js +64 -4
  13. package/elements/historical-curve/historical-curve.element.metadata.json +1 -1
  14. package/elements/main-element.js +7 -7
  15. package/elements/numerical-display/numerical-display-element.d.ts +9 -2
  16. package/elements/numerical-display/numerical-display-element.js +22 -2
  17. package/elements/numerical-display/numerical-display-element.metadata.json +1 -1
  18. package/elements/shared/text/text-element.d.ts +9 -0
  19. package/elements/shared/text/text-element.js +20 -0
  20. package/elements/shared/text/text-element.metadata.json +1 -1
  21. package/elements/shared/text/text-state-element.d.ts +15 -2
  22. package/elements/shared/text/text-state-element.js +69 -10
  23. package/elements/shared/text/text-state-element.metadata.json +1 -1
  24. package/elements/static-elements/hyperlink-element.d.ts +15 -1
  25. package/elements/static-elements/hyperlink-element.js +69 -10
  26. package/elements/static-elements/hyperlink-element.metadata.json +1 -1
  27. package/elements/static-elements/text-element.d.ts +14 -1
  28. package/elements/static-elements/text-element.js +64 -10
  29. package/elements/static-elements/text-element.metadata.json +1 -1
  30. package/elements/switch-indicator-light/switch-indicator-light-element.d.ts +7 -1
  31. package/elements/switch-indicator-light/switch-indicator-light-element.js +25 -2
  32. package/elements/switch-indicator-light/switch-indicator-light-element.metadata.json +1 -1
  33. package/elements/view-operation/view-operation.element.d.ts +23 -2
  34. package/elements/view-operation/view-operation.element.js +95 -1
  35. package/elements/view-operation/view-operation.element.metadata.json +1 -1
  36. package/gui/gui-context.d.ts +7 -1
  37. package/gui/gui-view.js +20 -4
  38. package/modal/write-value/write-value-modal-args.d.ts +3 -1
  39. package/modal/write-value/write-value-modal-args.js +2 -1
  40. package/modal/write-value/write-value-modal-args.metadata.json +1 -1
  41. package/modal/write-value/write-value-modal.component.d.ts +4 -0
  42. package/modal/write-value/write-value-modal.component.js +25 -0
  43. package/modal/write-value/write-value-modal.component.metadata.json +1 -1
  44. package/model/view-operation/view-operation-element.model.d.ts +7 -1
  45. package/package.json +1 -1
  46. package/remote/communication/variable/remote-variable-communicator.d.ts +15 -0
  47. package/remote/communication/variable/remote-variable-communicator.js +76 -2
  48. package/remote/communication/variable/remote-variable-communicator.metadata.json +1 -1
@@ -1,6 +1,11 @@
1
1
  import { isNil } from 'lodash';
2
2
  export class TextElementModal {
3
3
  constructor(content, font, width, height, isVariableText) {
4
+ // 保存参数以便后续更新文本
5
+ this.font = font;
6
+ this.width = width;
7
+ this.height = height;
8
+ this.isVariableText = isVariableText;
4
9
  if (/iPhone|iPod/i.test(navigator.userAgent)) {
5
10
  width += 10;
6
11
  }
@@ -12,6 +17,21 @@ export class TextElementModal {
12
17
  get Element() {
13
18
  return this._element;
14
19
  }
20
+ /**
21
+ * 更新文本内容
22
+ * @param content 新的文本内容
23
+ */
24
+ updateText(content) {
25
+ // 清空现有内容
26
+ this._element.innerHTML = '';
27
+ // 创建新的文本元素
28
+ let width = this.width;
29
+ if (/iPhone|iPod/i.test(navigator.userAgent)) {
30
+ width += 10;
31
+ }
32
+ const text = this.createNewForeignObjectText(content, this.font, width, this.height, this.isVariableText);
33
+ this._element.appendChild(text);
34
+ }
15
35
  getforeignObjectElement(width, height) {
16
36
  const textElement = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
17
37
  textElement.setAttribute('width', width.toString());
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"TextElementModal":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../../model","name":"Font","line":11,"character":39},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"boolean"}]}],"getforeignObjectElement":[{"__symbolic":"method"}],"createNewForeignObjectText":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"TextElementModal":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../../model","name":"Font","line":15,"character":39},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"boolean"}]}],"updateText":[{"__symbolic":"method"}],"getforeignObjectElement":[{"__symbolic":"method"}],"createNewForeignObjectText":[{"__symbolic":"method"}]}}}}]
@@ -3,6 +3,7 @@ import { TextLibrarySetting } from '../../../model/base/font-setting-model';
3
3
  import { IndicatorLightFaultFlicker } from '../../../model/switch-indicator-light/indicator-light-fault-flicker';
4
4
  import { TextLibraryService, LanguageService } from '../../../service';
5
5
  import { TextState } from './text-state.model';
6
+ import { GuiContext } from '../../../gui/gui-context';
6
7
  export declare class TextStateElement {
7
8
  private readonly textStates;
8
9
  private width;
@@ -13,20 +14,32 @@ export declare class TextStateElement {
13
14
  private readonly textLibrarySetting?;
14
15
  private readonly textLibraryService?;
15
16
  private readonly languageService?;
17
+ private readonly guiContext?;
16
18
  private textElement;
17
19
  private _element;
18
20
  get Element(): SVGElement;
19
21
  private faultFlickerStatus;
20
22
  private faultFlickerInterval;
21
- constructor(textStates: TextState[], width: number, height: number, logger: LoggerService, version?: number, faultFlickers?: IndicatorLightFaultFlicker[], textLibrarySetting?: TextLibrarySetting, textLibraryService?: TextLibraryService, languageService?: LanguageService);
23
+ private currentStateId;
24
+ private languageChangeSubscription?;
25
+ constructor(textStates: TextState[], width: number, height: number, logger: LoggerService, version?: number, faultFlickers?: IndicatorLightFaultFlicker[], textLibrarySetting?: TextLibrarySetting, textLibraryService?: TextLibraryService, languageService?: LanguageService, guiContext?: GuiContext);
22
26
  switchToState(stateId: number): void;
27
+ /**
28
+ * 订阅语种变化事件
29
+ * 当设备的语种ID改变时,重新渲染当前状态的文本
30
+ */
31
+ private subscribeLanguageChange;
32
+ /**
33
+ * 释放资源
34
+ */
35
+ dispose(): void;
23
36
  private getforeignObjectElement;
24
37
  private removeForeignObjectlement;
25
38
  private doFaultFlicker;
26
39
  private clearFlickerInterval;
27
40
  /**
28
41
  * 获取显示文本
29
- * 如果配置了文本库,则根据状态ID从文本库中获取对应语种的文本
42
+ * 如果配置了文本库,则根据状态ID和当前语种ID从文本库中获取对应语种的文本
30
43
  * 否则返回默认文本
31
44
  */
32
45
  private getDisplayText;
@@ -1,6 +1,6 @@
1
1
  import { Flicker } from '../../../model';
2
2
  export class TextStateElement {
3
- constructor(textStates, width, height, logger, version, faultFlickers, textLibrarySetting, textLibraryService, languageService) {
3
+ constructor(textStates, width, height, logger, version, faultFlickers, textLibrarySetting, textLibraryService, languageService, guiContext) {
4
4
  this.textStates = textStates;
5
5
  this.width = width;
6
6
  this.height = height;
@@ -10,14 +10,19 @@ export class TextStateElement {
10
10
  this.textLibrarySetting = textLibrarySetting;
11
11
  this.textLibraryService = textLibraryService;
12
12
  this.languageService = languageService;
13
+ this.guiContext = guiContext;
13
14
  this.faultFlickerStatus = false;
14
15
  this.faultFlickerInterval = undefined;
15
16
  this._element = document.createElementNS('http://www.w3.org/2000/svg', 'g');
17
+ // 订阅语种变化事件
18
+ this.subscribeLanguageChange();
16
19
  }
17
20
  get Element() {
18
21
  return this._element;
19
22
  }
20
23
  switchToState(stateId) {
24
+ // 保存当前状态ID,用于语种切换时重新渲染
25
+ this.currentStateId = stateId;
21
26
  const textState = this.textStates.find(t => t.id === stateId);
22
27
  if (textState === undefined) {
23
28
  this.removeForeignObjectlement();
@@ -69,6 +74,39 @@ export class TextStateElement {
69
74
  }
70
75
  this.doFaultFlicker(textElement, stateId);
71
76
  }
77
+ /**
78
+ * 订阅语种变化事件
79
+ * 当设备的语种ID改变时,重新渲染当前状态的文本
80
+ */
81
+ subscribeLanguageChange() {
82
+ // 只有使用文本库时才需要订阅语种变化
83
+ if (!this.textLibrarySetting || this.textLibrarySetting.labelType !== 'textLibrary') {
84
+ return;
85
+ }
86
+ if (this.guiContext && this.guiContext.languageChanged$) {
87
+ this.languageChangeSubscription = this.guiContext.languageChanged$.subscribe(() => {
88
+ // 如果当前有状态,重新渲染
89
+ if (this.currentStateId !== undefined) {
90
+ this.switchToState(this.currentStateId);
91
+ }
92
+ });
93
+ }
94
+ }
95
+ /**
96
+ * 释放资源
97
+ */
98
+ dispose() {
99
+ // 取消语种变化订阅
100
+ if (this.languageChangeSubscription) {
101
+ this.languageChangeSubscription.unsubscribe();
102
+ this.languageChangeSubscription = undefined;
103
+ }
104
+ // 清除闪烁定时器
105
+ if (this.faultFlickerInterval) {
106
+ clearInterval(this.faultFlickerInterval);
107
+ this.faultFlickerInterval = undefined;
108
+ }
109
+ }
72
110
  getforeignObjectElement() {
73
111
  if (!this.textElement) {
74
112
  this.textElement = document.createElementNS('http://www.w3.org/2000/svg', 'text');
@@ -117,29 +155,50 @@ export class TextStateElement {
117
155
  }
118
156
  /**
119
157
  * 获取显示文本
120
- * 如果配置了文本库,则根据状态ID从文本库中获取对应语种的文本
158
+ * 如果配置了文本库,则根据状态ID和当前语种ID从文本库中获取对应语种的文本
121
159
  * 否则返回默认文本
122
160
  */
123
161
  getDisplayText(stateId, defaultContent) {
124
- var _a;
162
+ var _a, _b, _c, _d, _e, _f;
125
163
  // 检查是否使用文本库
126
164
  if (this.textLibrarySetting && this.textLibrarySetting.labelType === 'textLibrary') {
127
165
  const textLibraryId = this.textLibrarySetting.selectedTextLibraryItem;
128
166
  if (textLibraryId && this.textLibraryService) {
129
- // 获取当前默认语种
130
- const currentLanguage = ((_a = this.languageService) === null || _a === void 0 ? void 0 : _a.getDefaultLanguage()) || 'zh-CN';
131
167
  // 获取文本库数据
132
168
  const textLibraryData = this.textLibraryService.getTextLibraryById(typeof textLibraryId === 'string' ? parseInt(textLibraryId, 10) : textLibraryId);
133
169
  if (textLibraryData && textLibraryData.data) {
134
170
  // 使用状态ID作为value查找对应的文本条目
135
171
  const textEntry = textLibraryData.data.find(entry => entry.value === stateId.toString());
136
172
  if (textEntry) {
137
- // 优先返回对应语种的文本
138
- if (textEntry.cultures && textEntry.cultures[currentLanguage]) {
139
- return textEntry.cultures[currentLanguage];
173
+ // 获取当前语种ID
174
+ const currentLanguageId = (_c = (_b = (_a = this.guiContext) === null || _a === void 0 ? void 0 : _a.getCurrentLanguageId) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : null;
175
+ // 确定要使用的语种代码(culture)
176
+ let targetLanguage;
177
+ const defaultLanguage = ((_d = this.languageService) === null || _d === void 0 ? void 0 : _d.getDefaultLanguage()) || 'zh-CN';
178
+ if (currentLanguageId === null || currentLanguageId === undefined) {
179
+ // 设备未设置当前语种,使用默认语种
180
+ targetLanguage = defaultLanguage;
181
+ }
182
+ else {
183
+ // 设备已设置当前语种,获取对应的语种代码
184
+ const currentLanguage = (_f = (_e = this.guiContext) === null || _e === void 0 ? void 0 : _e.getLanguageCultureById) === null || _f === void 0 ? void 0 : _f.call(_e, currentLanguageId);
185
+ if (currentLanguage) {
186
+ // 直接使用设备设置的语种,不再fallback
187
+ targetLanguage = currentLanguage;
188
+ }
189
+ else {
190
+ targetLanguage = defaultLanguage;
191
+ }
192
+ }
193
+ // 返回对应语种的文本,如果没有则返回空字符串
194
+ if (textEntry.cultures && textEntry.cultures[targetLanguage]) {
195
+ const text = textEntry.cultures[targetLanguage];
196
+ return text;
197
+ }
198
+ else {
199
+ // 对应语种没有文本,返回空字符串
200
+ return '';
140
201
  }
141
- // 如果没有对应语种,返回key作为默认值
142
- return '';
143
202
  }
144
203
  }
145
204
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"TextStateElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"./text-state.model","name":"TextState","line":19,"character":45}]},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","module":"../../../logger","name":"LoggerService","line":22,"character":33},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../../model/switch-indicator-light/indicator-light-fault-flicker","name":"IndicatorLightFaultFlicker","line":24,"character":41}]},{"__symbolic":"reference","module":"../../../model/base/font-setting-model","name":"TextLibrarySetting","line":25,"character":46},{"__symbolic":"reference","module":"../../../service","name":"TextLibraryService","line":26,"character":46},{"__symbolic":"reference","module":"../../../service","name":"LanguageService","line":27,"character":43}]}],"switchToState":[{"__symbolic":"method"}],"getforeignObjectElement":[{"__symbolic":"method"}],"removeForeignObjectlement":[{"__symbolic":"method"}],"doFaultFlicker":[{"__symbolic":"method"}],"clearFlickerInterval":[{"__symbolic":"method"}],"getDisplayText":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"TextStateElement":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"./text-state.model","name":"TextState","line":23,"character":45}]},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","module":"../../../logger","name":"LoggerService","line":26,"character":33},{"__symbolic":"reference","name":"number"},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../../model/switch-indicator-light/indicator-light-fault-flicker","name":"IndicatorLightFaultFlicker","line":28,"character":41}]},{"__symbolic":"reference","module":"../../../model/base/font-setting-model","name":"TextLibrarySetting","line":29,"character":46},{"__symbolic":"reference","module":"../../../service","name":"TextLibraryService","line":30,"character":46},{"__symbolic":"reference","module":"../../../service","name":"LanguageService","line":31,"character":43},{"__symbolic":"reference","module":"../../../gui/gui-context","name":"GuiContext","line":32,"character":38}]}],"switchToState":[{"__symbolic":"method"}],"subscribeLanguageChange":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method"}],"getforeignObjectElement":[{"__symbolic":"method"}],"removeForeignObjectlement":[{"__symbolic":"method"}],"doFaultFlicker":[{"__symbolic":"method"}],"clearFlickerInterval":[{"__symbolic":"method"}],"getDisplayText":[{"__symbolic":"method"}]}}}}]
@@ -5,13 +5,27 @@ import { GraphStore, VariableStore } from '../../config';
5
5
  import { LoggerService } from '../../logger';
6
6
  import { Injector } from '@angular/core';
7
7
  import { HyperlinkModel } from '../../model/hyperlink/hyperlink.model';
8
+ import { GuiContext } from '../../gui/gui-context';
8
9
  export declare class HyperlinkElement extends ConditionalDynamicDisplayElement {
9
10
  private readonly graphStore;
10
11
  private readonly textLibraryService?;
11
12
  private readonly languageService?;
13
+ private readonly guiContext?;
12
14
  protected readonly model: HyperlinkModel;
13
15
  protected readonly logger: LoggerService;
14
- constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, graphStore: GraphStore, signalRAppId: string, textLibraryService?: TextLibraryService, languageService?: LanguageService);
16
+ private languageChangeSubscription?;
17
+ private textElementModal?;
18
+ constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, graphStore: GraphStore, signalRAppId: string, textLibraryService?: TextLibraryService, languageService?: LanguageService, guiContext?: GuiContext);
19
+ dispose(): void;
20
+ /**
21
+ * 订阅语种变化事件
22
+ * 当设备的语种ID改变时,重新渲染文本
23
+ */
24
+ private subscribeLanguageChange;
25
+ /**
26
+ * 重新渲染文本
27
+ */
28
+ private reRenderText;
15
29
  private initGraphAndText;
16
30
  /**
17
31
  * 获取显示文本
@@ -3,14 +3,17 @@ import { GraphStateElement } from '../shared/graph/graph-state-element';
3
3
  import { LOGGER_SERVICE_TOKEN } from '../../logger';
4
4
  import { TextElementModal } from '../shared/text/text-element';
5
5
  export class HyperlinkElement extends ConditionalDynamicDisplayElement {
6
- constructor(element, injector, permissionChecker, variableCommunicator, variableStore, graphStore, signalRAppId, textLibraryService, languageService) {
6
+ constructor(element, injector, permissionChecker, variableCommunicator, variableStore, graphStore, signalRAppId, textLibraryService, languageService, guiContext) {
7
7
  super(element, permissionChecker, variableCommunicator, variableStore, signalRAppId);
8
8
  this.graphStore = graphStore;
9
9
  this.textLibraryService = textLibraryService;
10
10
  this.languageService = languageService;
11
+ this.guiContext = guiContext;
11
12
  this.logger = injector.get(LOGGER_SERVICE_TOKEN);
12
13
  if (this.model.size) {
13
14
  this.initGraphAndText();
15
+ // 订阅语种变化
16
+ this.subscribeLanguageChange();
14
17
  }
15
18
  if (this.model && this.model.linkAddress) {
16
19
  this.rootElement.style('cursor', 'hand');
@@ -24,6 +27,44 @@ export class HyperlinkElement extends ConditionalDynamicDisplayElement {
24
27
  });
25
28
  }
26
29
  }
30
+ dispose() {
31
+ // 取消语种变化订阅
32
+ if (this.languageChangeSubscription) {
33
+ this.languageChangeSubscription.unsubscribe();
34
+ this.languageChangeSubscription = undefined;
35
+ }
36
+ if (this.$element) {
37
+ this.$element.remove();
38
+ }
39
+ }
40
+ /**
41
+ * 订阅语种变化事件
42
+ * 当设备的语种ID改变时,重新渲染文本
43
+ */
44
+ subscribeLanguageChange() {
45
+ // 只有使用文本库时才需要订阅语种变化
46
+ if (!this.model.textLibrary || this.model.textLibrary.labelType !== 'textLibrary') {
47
+ return;
48
+ }
49
+ if (this.guiContext && this.guiContext.languageChanged$) {
50
+ this.languageChangeSubscription = this.guiContext.languageChanged$.subscribe(() => {
51
+ // 重新渲染文本
52
+ this.reRenderText();
53
+ });
54
+ }
55
+ }
56
+ /**
57
+ * 重新渲染文本
58
+ */
59
+ reRenderText() {
60
+ if (!this.textElementModal || !this.model.size) {
61
+ return;
62
+ }
63
+ // 获取新的显示文本
64
+ const displayText = this.getDisplayText();
65
+ // 直接更新文本内容,而不是重新创建元素
66
+ this.textElementModal.updateText(displayText);
67
+ }
27
68
  initGraphAndText() {
28
69
  this.rootElement.selectAll('*').remove();
29
70
  const size = this.model.size;
@@ -46,8 +87,8 @@ export class HyperlinkElement extends ConditionalDynamicDisplayElement {
46
87
  };
47
88
  // 获取显示文本(支持文本库)
48
89
  const displayText = this.getDisplayText();
49
- const textElement = new TextElementModal(displayText, font, width, height);
50
- this.$element.append(textElement.Element);
90
+ this.textElementModal = new TextElementModal(displayText, font, width, height);
91
+ this.$element.append(this.textElementModal.Element);
51
92
  }
52
93
  /**
53
94
  * 获取显示文本
@@ -55,25 +96,43 @@ export class HyperlinkElement extends ConditionalDynamicDisplayElement {
55
96
  * 否则返回默认文本
56
97
  */
57
98
  getDisplayText() {
58
- var _a;
99
+ var _a, _b, _c, _d, _e, _f;
59
100
  // 检查是否使用文本库
60
101
  if (this.model.textLibrary && this.model.textLibrary.labelType === 'textLibrary') {
61
102
  const textLibraryId = this.model.textLibrary.selectedTextLibraryItem;
62
103
  const textItem = this.model.textLibrary.selectedTextItem;
63
104
  if (textLibraryId && textItem && this.textLibraryService) {
64
- // 获取当前默认语种
65
- const currentLanguage = ((_a = this.languageService) === null || _a === void 0 ? void 0 : _a.getDefaultLanguage()) || 'zh-CN';
66
105
  // 获取文本库数据
67
106
  const textLibraryData = this.textLibraryService.getTextLibraryById(typeof textLibraryId === 'string' ? parseInt(textLibraryId, 10) : textLibraryId);
68
107
  if (textLibraryData && textLibraryData.data) {
69
108
  // 查找对应的文本条目
70
109
  const textEntry = textLibraryData.data.find(entry => entry.key === textItem.toString());
71
110
  if (textEntry) {
72
- // 优先返回对应语种的文本
73
- if (textEntry.cultures && textEntry.cultures[currentLanguage]) {
74
- return textEntry.cultures[currentLanguage];
111
+ // 获取当前语种ID
112
+ const currentLanguageId = (_c = (_b = (_a = this.guiContext) === null || _a === void 0 ? void 0 : _a.getCurrentLanguageId) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : null;
113
+ // 确定要使用的语种代码(culture)
114
+ let targetLanguage;
115
+ const defaultLanguage = ((_d = this.languageService) === null || _d === void 0 ? void 0 : _d.getDefaultLanguage()) || 'zh-CN';
116
+ if (currentLanguageId === null || currentLanguageId === undefined) {
117
+ // 设备未设置当前语种,使用默认语种
118
+ targetLanguage = defaultLanguage;
119
+ }
120
+ else {
121
+ // 设备已设置当前语种,获取对应的语种代码
122
+ const currentLanguage = (_f = (_e = this.guiContext) === null || _e === void 0 ? void 0 : _e.getLanguageCultureById) === null || _f === void 0 ? void 0 : _f.call(_e, currentLanguageId);
123
+ if (currentLanguage) {
124
+ targetLanguage = currentLanguage;
125
+ }
126
+ else {
127
+ // 无法获取语种代码,使用默认语种
128
+ targetLanguage = defaultLanguage;
129
+ }
130
+ }
131
+ // 返回对应语种的文本
132
+ if (textEntry.cultures && textEntry.cultures[targetLanguage]) {
133
+ return textEntry.cultures[targetLanguage];
75
134
  }
76
- // 如果没有对应语种,返回默认值
135
+ // 如果没有对应语种,返回空字符串
77
136
  return '';
78
137
  }
79
138
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"HyperlinkElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-dynamic-display-element","name":"ConditionalDynamicDisplayElement","line":12,"character":38},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":17,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":17,"character":48},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":17,"character":77},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":18,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":18,"character":67},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":18,"character":111},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../service","name":"TextLibraryService","line":20,"character":46},{"__symbolic":"reference","module":"../../service","name":"LanguageService","line":21,"character":43}]}],"initGraphAndText":[{"__symbolic":"method"}],"getDisplayText":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"HyperlinkElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-dynamic-display-element","name":"ConditionalDynamicDisplayElement","line":14,"character":38},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":21,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":21,"character":48},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":21,"character":77},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":22,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":22,"character":67},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":22,"character":111},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../service","name":"TextLibraryService","line":24,"character":46},{"__symbolic":"reference","module":"../../service","name":"LanguageService","line":25,"character":43},{"__symbolic":"reference","module":"../../gui/gui-context","name":"GuiContext","line":26,"character":38}]}],"dispose":[{"__symbolic":"method"}],"subscribeLanguageChange":[{"__symbolic":"method"}],"reRenderText":[{"__symbolic":"method"}],"initGraphAndText":[{"__symbolic":"method"}],"getDisplayText":[{"__symbolic":"method"}]}}}}]
@@ -5,14 +5,27 @@ import { GraphStore, VariableStore } from '../../config';
5
5
  import { LoggerService } from '../../logger';
6
6
  import { Injector } from '@angular/core';
7
7
  import { PermissionChecker, TextLibraryService, LanguageService } from '../../service';
8
+ import { GuiContext } from '../../gui/gui-context';
8
9
  export declare class TextElement extends ConditionalDynamicDisplayElement {
9
10
  private readonly graphStore;
10
11
  private readonly textLibraryService?;
11
12
  private readonly languageService?;
13
+ private readonly guiContext?;
12
14
  protected readonly model: TextModel;
13
15
  protected readonly logger: LoggerService;
14
- constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, graphStore: GraphStore, signalRAppId: string, textLibraryService?: TextLibraryService, languageService?: LanguageService);
16
+ private languageChangeSubscription?;
17
+ private textElementModal?;
18
+ constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, graphStore: GraphStore, signalRAppId: string, textLibraryService?: TextLibraryService, languageService?: LanguageService, guiContext?: GuiContext);
15
19
  dispose(): void;
20
+ /**
21
+ * 订阅语种变化事件
22
+ * 当设备的语种ID改变时,重新渲染文本
23
+ */
24
+ private subscribeLanguageChange;
25
+ /**
26
+ * 重新渲染文本
27
+ */
28
+ private reRenderText;
16
29
  /**
17
30
  * 获取显示文本
18
31
  * 如果配置了文本库,则从文本库中获取对应语种的文本
@@ -3,11 +3,12 @@ import { GraphStateElement } from '../shared/graph/graph-state-element';
3
3
  import { LOGGER_SERVICE_TOKEN } from '../../logger';
4
4
  import { TextElementModal } from '../shared/text/text-element';
5
5
  export class TextElement extends ConditionalDynamicDisplayElement {
6
- constructor(element, injector, permissionChecker, variableCommunicator, variableStore, graphStore, signalRAppId, textLibraryService, languageService) {
6
+ constructor(element, injector, permissionChecker, variableCommunicator, variableStore, graphStore, signalRAppId, textLibraryService, languageService, guiContext) {
7
7
  super(element, permissionChecker, variableCommunicator, variableStore, signalRAppId);
8
8
  this.graphStore = graphStore;
9
9
  this.textLibraryService = textLibraryService;
10
10
  this.languageService = languageService;
11
+ this.guiContext = guiContext;
11
12
  this.logger = injector.get(LOGGER_SERVICE_TOKEN);
12
13
  if (this.model.text && this.model.size) {
13
14
  const width = this.model.size.width;
@@ -30,8 +31,10 @@ export class TextElement extends ConditionalDynamicDisplayElement {
30
31
  };
31
32
  // 获取显示文本(支持文本库)
32
33
  const displayText = this.getDisplayText();
33
- const textElement = new TextElementModal(displayText, font, width, height);
34
- this.$element.append(textElement.Element);
34
+ this.textElementModal = new TextElementModal(displayText, font, width, height);
35
+ this.$element.append(this.textElementModal.Element);
36
+ // 订阅语种变化
37
+ this.subscribeLanguageChange();
35
38
  }
36
39
  else {
37
40
  this.handleTextValue();
@@ -41,35 +44,86 @@ export class TextElement extends ConditionalDynamicDisplayElement {
41
44
  }
42
45
  }
43
46
  dispose() {
47
+ // 取消语种变化订阅
48
+ if (this.languageChangeSubscription) {
49
+ this.languageChangeSubscription.unsubscribe();
50
+ this.languageChangeSubscription = undefined;
51
+ }
44
52
  if (this.$element) {
45
53
  this.$element.remove();
46
54
  }
47
55
  }
56
+ /**
57
+ * 订阅语种变化事件
58
+ * 当设备的语种ID改变时,重新渲染文本
59
+ */
60
+ subscribeLanguageChange() {
61
+ // 只有使用文本库时才需要订阅语种变化
62
+ if (!this.model.textLibrary || this.model.textLibrary.labelType !== 'textLibrary') {
63
+ return;
64
+ }
65
+ if (this.guiContext && this.guiContext.languageChanged$) {
66
+ this.languageChangeSubscription = this.guiContext.languageChanged$.subscribe(() => {
67
+ // 重新渲染文本
68
+ this.reRenderText();
69
+ });
70
+ }
71
+ }
72
+ /**
73
+ * 重新渲染文本
74
+ */
75
+ reRenderText() {
76
+ if (!this.textElementModal || !this.model.size) {
77
+ return;
78
+ }
79
+ // 获取新的显示文本
80
+ const displayText = this.getDisplayText();
81
+ // 直接更新文本内容,而不是重新创建元素
82
+ this.textElementModal.updateText(displayText);
83
+ }
48
84
  /**
49
85
  * 获取显示文本
50
86
  * 如果配置了文本库,则从文本库中获取对应语种的文本
51
87
  * 否则返回默认文本
52
88
  */
53
89
  getDisplayText() {
54
- var _a;
90
+ var _a, _b, _c, _d, _e, _f;
55
91
  // 检查是否使用文本库
56
92
  if (this.model.textLibrary && this.model.textLibrary.labelType === 'textLibrary') {
57
93
  const textLibraryId = this.model.textLibrary.selectedTextLibraryItem;
58
94
  const textItem = this.model.textLibrary.selectedTextItem;
59
95
  if (textLibraryId && textItem && this.textLibraryService) {
60
- // 获取当前默认语种
61
- const currentLanguage = ((_a = this.languageService) === null || _a === void 0 ? void 0 : _a.getDefaultLanguage()) || 'zh-CN';
62
96
  // 获取文本库数据
63
97
  const textLibraryData = this.textLibraryService.getTextLibraryById(typeof textLibraryId === 'string' ? parseInt(textLibraryId, 10) : textLibraryId);
64
98
  if (textLibraryData && textLibraryData.data) {
65
99
  // 查找对应的文本条目
66
100
  const textEntry = textLibraryData.data.find(entry => entry.key === textItem.toString());
67
101
  if (textEntry) {
68
- // 优先返回对应语种的文本
69
- if (textEntry.cultures && textEntry.cultures[currentLanguage]) {
70
- return textEntry.cultures[currentLanguage];
102
+ // 获取当前语种ID
103
+ const currentLanguageId = (_c = (_b = (_a = this.guiContext) === null || _a === void 0 ? void 0 : _a.getCurrentLanguageId) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : null;
104
+ // 确定要使用的语种代码(culture)
105
+ let targetLanguage;
106
+ const defaultLanguage = ((_d = this.languageService) === null || _d === void 0 ? void 0 : _d.getDefaultLanguage()) || 'zh-CN';
107
+ if (currentLanguageId === null || currentLanguageId === undefined) {
108
+ // 设备未设置当前语种,使用默认语种
109
+ targetLanguage = defaultLanguage;
110
+ }
111
+ else {
112
+ // 设备已设置当前语种,获取对应的语种代码
113
+ const currentLanguage = (_f = (_e = this.guiContext) === null || _e === void 0 ? void 0 : _e.getLanguageCultureById) === null || _f === void 0 ? void 0 : _f.call(_e, currentLanguageId);
114
+ if (currentLanguage) {
115
+ targetLanguage = currentLanguage;
116
+ }
117
+ else {
118
+ // 无法获取语种代码,使用默认语种
119
+ targetLanguage = defaultLanguage;
120
+ }
121
+ }
122
+ // 返回对应语种的文本
123
+ if (textEntry.cultures && textEntry.cultures[targetLanguage]) {
124
+ return textEntry.cultures[targetLanguage];
71
125
  }
72
- // 如果没有对应语种,返回默认值
126
+ // 如果没有对应语种,返回空字符串
73
127
  return '';
74
128
  }
75
129
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"TextElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-dynamic-display-element","name":"ConditionalDynamicDisplayElement","line":10,"character":33},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":15,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":15,"character":48},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":15,"character":77},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":16,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":16,"character":67},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":16,"character":111},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../service","name":"TextLibraryService","line":18,"character":46},{"__symbolic":"reference","module":"../../service","name":"LanguageService","line":19,"character":43}]}],"dispose":[{"__symbolic":"method"}],"getDisplayText":[{"__symbolic":"method"}],"handleTextValue":[{"__symbolic":"method"}],"initGraph":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"TextElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-dynamic-display-element","name":"ConditionalDynamicDisplayElement","line":12,"character":33},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":19,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":19,"character":48},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":19,"character":77},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":20,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":20,"character":67},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":20,"character":111},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../service","name":"TextLibraryService","line":22,"character":46},{"__symbolic":"reference","module":"../../service","name":"LanguageService","line":23,"character":43},{"__symbolic":"reference","module":"../../gui/gui-context","name":"GuiContext","line":24,"character":38}]}],"dispose":[{"__symbolic":"method"}],"subscribeLanguageChange":[{"__symbolic":"method"}],"reRenderText":[{"__symbolic":"method"}],"getDisplayText":[{"__symbolic":"method"}],"handleTextValue":[{"__symbolic":"method"}],"initGraph":[{"__symbolic":"method"}]}}}}]
@@ -7,6 +7,7 @@ import { PermissionChecker, OperationRecordService, TextLibraryService, Language
7
7
  import { VariableCommunicator } from '../../communication';
8
8
  import { ConditionalEnableElement } from '../base/conditional-enable-element';
9
9
  import { SecurityChecker } from '../../security';
10
+ import { GuiContext } from '../../gui/gui-context';
10
11
  export declare class SwitchIndicatorLightElement extends ConditionalEnableElement {
11
12
  private readonly modalService;
12
13
  private readonly graphStore;
@@ -14,6 +15,7 @@ export declare class SwitchIndicatorLightElement extends ConditionalEnableElemen
14
15
  private readonly securityChecker;
15
16
  private readonly textLibraryService?;
16
17
  private readonly languageService?;
18
+ private readonly guiContext?;
17
19
  protected readonly model: SwitchIndicatorLight;
18
20
  private readonly logger;
19
21
  private switchOperator;
@@ -26,7 +28,7 @@ export declare class SwitchIndicatorLightElement extends ConditionalEnableElemen
26
28
  private restorationTimer;
27
29
  private isWriteRestorationDownValue;
28
30
  private onDocMouseUp;
29
- constructor(element: HTMLElement, injector: Injector, modalService: BsModalService, variableCommunicator: VariableCommunicator, graphStore: GraphStore, permissionChecker: PermissionChecker, operationRecordService: OperationRecordService, securityChecker: SecurityChecker, variableStore: VariableStore, localization: Localization, signalRAppId: string, textLibraryService?: TextLibraryService, languageService?: LanguageService);
31
+ constructor(element: HTMLElement, injector: Injector, modalService: BsModalService, variableCommunicator: VariableCommunicator, graphStore: GraphStore, permissionChecker: PermissionChecker, operationRecordService: OperationRecordService, securityChecker: SecurityChecker, variableStore: VariableStore, localization: Localization, signalRAppId: string, textLibraryService?: TextLibraryService, languageService?: LanguageService, guiContext?: GuiContext);
30
32
  handleMouseUp(): void;
31
33
  private initOnDocMouseUpEvent;
32
34
  private checkElementPassword;
@@ -37,5 +39,9 @@ export declare class SwitchIndicatorLightElement extends ConditionalEnableElemen
37
39
  private currentStateIdChange;
38
40
  private switchToState;
39
41
  private initGraphAndText;
42
+ /**
43
+ * 释放资源
44
+ */
45
+ dispose(): void;
40
46
  private checkState;
41
47
  }