diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts index 92c5f08f3d..2f5136bf2a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/scada/scada-symbol-widget.component.ts @@ -131,8 +131,12 @@ export class ScadaSymbolWidgetComponent implements OnInit, AfterViewInit, OnDest content: string) { const simulated = this.ctx.utilsService.widgetEditMode || this.ctx.isPreview || (isDefinedAndNotNull(this.settings.simulated) ? this.settings.simulated : false); - this.scadaSymbolObject = new ScadaSymbolObject(rootElement, this.ctx, content, - this.settings.scadaSymbolObjectSettings, this, simulated); + if (content.startsWith(' ({ properties: [] }); +const svgPartsRegex = /()(.*)<\/svg>/gms; + +const tbNamespaceRegex = //gms; + +export const applyTbNamespaceToSvgContent = (svgContent: string): string => { + svgPartsRegex.lastIndex = 0; + let svgRootNode: string; + let innerSvg = ''; + let match = svgPartsRegex.exec(svgContent); + if (match != null) { + if (match.length > 1) { + svgRootNode = match[1]; + } + if (match.length > 2) { + innerSvg = match[2]; + } + } + if (!svgRootNode) { + throw new Error('Invalid SVG document.'); + } + tbNamespaceRegex.lastIndex = 0; + match = tbNamespaceRegex.exec(svgRootNode); + if (match === null || !match.length) { + svgRootNode = svgRootNode.slice(0, -1) + ' xmlns:tb="https://thingsboard.io/svg">'; + return `${svgRootNode}\n${innerSvg}\n`; + } + return svgContent; +}; export const parseScadaSymbolMetadataFromContent = (svgContent: string): ScadaSymbolMetadata => { try { + svgContent = applyTbNamespaceToSvgContent(svgContent); const svgDoc = new DOMParser().parseFromString(svgContent, 'image/svg+xml'); return parseScadaSymbolMetadataFromDom(svgDoc); } catch (_e) { @@ -216,13 +245,17 @@ const parseScadaSymbolMetadataFromDom = (svgDoc: Document): ScadaSymbolMetadata }; export const updateScadaSymbolMetadataInContent = (svgContent: string, metadata: ScadaSymbolMetadata): string => { + svgContent = applyTbNamespaceToSvgContent(svgContent); const svgDoc = new DOMParser().parseFromString(svgContent, 'image/svg+xml'); + const parsererror = svgDoc.getElementsByTagName('parsererror'); + if (parsererror?.length) { + return parsererror[0].outerHTML; + } updateScadaSymbolMetadataInDom(svgDoc, metadata); return svgDoc.documentElement.outerHTML; }; const updateScadaSymbolMetadataInDom = (svgDoc: Document, metadata: ScadaSymbolMetadata) => { - svgDoc.documentElement.setAttribute('xmlns:tb', 'https://thingsboard.io/svg'); let metadataElement: Node; const elements = svgDoc.getElementsByTagName('tb:metadata'); if (elements?.length) { @@ -237,7 +270,6 @@ const updateScadaSymbolMetadataInDom = (svgDoc: Document, metadata: ScadaSymbolM metadataElement.appendChild(cdata); }; -const svgPartsRegex = /()(.*)<\/svg>/gms; const tbMetadataRegex = /.*<\/tb:metadata>/gs; export interface ScadaSymbolContentData { @@ -389,6 +421,7 @@ export class ScadaSymbolObject { this.shapeResize$ = new ResizeObserver(() => { this.resize(); }); + this.svgContent = applyTbNamespaceToSvgContent(this.svgContent); const doc: XMLDocument = new DOMParser().parseFromString(this.svgContent, 'image/svg+xml'); this.metadata = parseScadaSymbolMetadataFromDom(doc); const defaults = defaultScadaSymbolObjectSettings(this.metadata); @@ -645,12 +678,22 @@ export class ScadaSymbolObject { } private renderState(): void { - this.metadata.stateRender(this.context, this.svgShape); + try { + this.metadata.stateRender(this.context, this.svgShape); + } catch (e) { + console.error(e); + } for (const tag of this.metadata.tags) { - const elements = this.context.tags[tag.tag];// this.svgShape.find(`[tb\\:tag="${tag.tag}"]`); - elements.forEach(element => { - tag.stateRender(this.context, element); - }); + const elements = this.context.tags[tag.tag]; + if (elements) { + elements.forEach(element => { + try { + tag.stateRender(this.context, element); + } catch (e) { + console.error(e); + } + }); + } } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.scss index 99b5c5df13..7f67f6ca37 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.scss +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.scss @@ -13,8 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -.tb-scada-symbol-appearance-properties { - gap: 16px; - display: flex; - flex-direction: column; +:host ::ng-deep { + .tb-scada-symbol-appearance-properties { + gap: 16px; + display: flex; + flex-direction: column; + } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts index 5048c53213..80f2ef8a74 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/scada/scada-symbol-object-settings.component.ts @@ -72,8 +72,7 @@ import { map } from 'rxjs/operators'; useExisting: forwardRef(() => ScadaSymbolObjectSettingsComponent), multi: true } - ], - encapsulation: ViewEncapsulation.None + ] }) export class ScadaSymbolObjectSettingsComponent implements OnInit, OnChanges, ControlValueAccessor, Validator { diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.html b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.html index e2e272cda3..20cc6fb40e 100644 --- a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.html +++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-editor.component.html @@ -39,6 +39,7 @@