Commit 597231c7493969f94b336825d123667d3bb80d4c

Authored by Igor Kulikov
Committed by GitHub
2 parents 6bad9304 1b9cf7c5

Merge pull request #2764 from vvlladd28/bug/3.0/tooltip

[3.0] Fix tooltip data
@@ -496,7 +496,7 @@ export function padValue(val: any, dec: number): string { @@ -496,7 +496,7 @@ export function padValue(val: any, dec: number): string {
496 val = Math.abs(val); 496 val = Math.abs(val);
497 497
498 if (dec > 0) { 498 if (dec > 0) {
499 - strVal = val.toFixed(dec).toString() 499 + strVal = val.toFixed(dec);
500 } else { 500 } else {
501 strVal = Math.round(val).toString(); 501 strVal = Math.round(val).toString();
502 } 502 }
@@ -20,7 +20,7 @@ import { Datasource } from '@app/shared/models/widget.models'; @@ -20,7 +20,7 @@ import { Datasource } from '@app/shared/models/widget.models';
20 import _ from 'lodash'; 20 import _ from 'lodash';
21 import { Observable, Observer, of } from 'rxjs'; 21 import { Observable, Observer, of } from 'rxjs';
22 import { map } from 'rxjs/operators'; 22 import { map } from 'rxjs/operators';
23 -import { createLabelFromDatasource, hashCode, padValue } from '@core/utils'; 23 +import { createLabelFromDatasource, hashCode, isNumber, padValue } from '@core/utils';
24 24
25 export function createTooltip(target: L.Layer, 25 export function createTooltip(target: L.Layer,
26 settings: MarkerSettings | PolylineSettings | PolygonSettings, 26 settings: MarkerSettings | PolylineSettings | PolygonSettings,
@@ -43,8 +43,9 @@ export function createTooltip(target: L.Layer, @@ -43,8 +43,9 @@ export function createTooltip(target: L.Layer,
43 const actions = document.getElementsByClassName('tb-custom-action'); 43 const actions = document.getElementsByClassName('tb-custom-action');
44 Array.from(actions).forEach( 44 Array.from(actions).forEach(
45 (element: HTMLElement) => { 45 (element: HTMLElement) => {
46 - if (element && settings.tooltipAction[element.id]) {  
47 - element.addEventListener('click', ($event) => settings.tooltipAction[element.id]($event, datasource)); 46 + const actionName = element.getAttribute('data-action-name');
  47 + if (element && settings.tooltipAction[actionName]) {
  48 + element.addEventListener('click', ($event) => settings.tooltipAction[actionName]($event, datasource));
48 } 49 }
49 }); 50 });
50 }); 51 });
@@ -111,38 +112,81 @@ export function aspectCache(imageUrl: string): Observable<number> { @@ -111,38 +112,81 @@ export function aspectCache(imageUrl: string): Observable<number> {
111 112
112 export type TranslateFunc = (key: string, defaultTranslation?: string) => string; 113 export type TranslateFunc = (key: string, defaultTranslation?: string) => string;
113 114
  115 +const varsRegex = /\${([^}]*)}/g;
  116 +const linkActionRegex = /<link-act name=['"]([^['"]*)['"]>([^<]*)<\/link-act>/g;
  117 +const buttonActionRegex = /<button-act name=['"]([^['"]*)['"]>([^<]*)<\/button-act>/g;
  118 +
  119 +function createLinkElement(actionName: string, actionText: string): string {
  120 + return `<a href="#" class="tb-custom-action" data-action-name=${actionName}>${actionText}</a>`;
  121 +}
  122 +
  123 +function createButtonElement(actionName: string, actionText: string) {
  124 + return `<button mat-button class="tb-custom-action" data-action-name=${actionName}>${actionText}</button>`;
  125 +}
  126 +
114 function parseTemplate(template: string, data: { $datasource?: Datasource, [key: string]: any }, 127 function parseTemplate(template: string, data: { $datasource?: Datasource, [key: string]: any },
115 - translateFn?: TranslateFunc) { 128 + translateFn?: TranslateFunc) {
116 let res = ''; 129 let res = '';
117 try { 130 try {
118 - if (template.match(/<link-act/g)) {  
119 - template = template.replace(/<link-act/g, '<a href="#"').replace(/link-act>/g, 'a>')  
120 - .replace(/name=(['"])(.*?)(['"])/g, `class='tb-custom-action' id='$2'`);  
121 - }  
122 if (translateFn) { 131 if (translateFn) {
123 template = translateFn(template); 132 template = translateFn(template);
124 } 133 }
125 template = createLabelFromDatasource(data.$datasource, template); 134 template = createLabelFromDatasource(data.$datasource, template);
126 - const formatted = template.match(/\${([^}]*):\d*}/g);  
127 - if (formatted)  
128 - formatted.forEach(value => {  
129 - const [variable, digits] = value.replace('${', '').replace('}', '').split(':');  
130 - data[variable] = padValue(data[variable], +digits);  
131 - if (data[variable] === 'NaN') data[variable] = '';  
132 - template = template.replace(value, '${' + variable + '}');  
133 - });  
134 - const variables = template.match(/\${.*?}/g);  
135 - if (variables) {  
136 - variables.forEach(variable => {  
137 - variable = variable.replace('${', '').replace('}', '');  
138 - if (!data[variable])  
139 - data[variable] = '';  
140 - }) 135 +
  136 + let match = varsRegex.exec(template);
  137 + while (match !== null) {
  138 + const variable = match[0];
  139 + let label = match[1];
  140 + let valDec = 2;
  141 + const splitValues = label.split(':');
  142 + if (splitValues.length > 1) {
  143 + label = splitValues[0];
  144 + valDec = parseFloat(splitValues[1]);
  145 + }
  146 +
  147 + if (label.startsWith('#')) {
  148 + const keyIndexStr = label.substring(1);
  149 + const n = Math.floor(Number(keyIndexStr));
  150 + if (String(n) === keyIndexStr && n >= 0) {
  151 + label = data.$datasource.dataKeys[n].label;
  152 + }
  153 + }
  154 +
  155 + const value = data[label];
  156 + let textValue: string;
  157 + if (isNumber(value)) {
  158 + textValue = padValue(value, valDec);
  159 + } else {
  160 + textValue = value;
  161 + }
  162 + template = template.split(variable).join(textValue);
  163 + match = varsRegex.exec(template);
  164 + }
  165 +
  166 + let actionTags: string;
  167 + let actionText: string;
  168 + let actionName: string;
  169 + let action: string;
  170 +
  171 + match = linkActionRegex.exec(template);
  172 + while (match !== null) {
  173 + [actionTags, actionName, actionText] = match;
  174 + action = createLinkElement(actionName, actionText);
  175 + template = template.split(actionTags).join(action);
  176 + match = linkActionRegex.exec(template);
141 } 177 }
  178 +
  179 + match = buttonActionRegex.exec(template);
  180 + while (match !== null) {
  181 + [actionTags, actionName, actionText] = match;
  182 + action = createButtonElement(actionName, actionText);
  183 + template = template.split(actionTags).join(action);
  184 + match = buttonActionRegex.exec(template);
  185 + }
  186 +
142 const compiled = _.template(template); 187 const compiled = _.template(template);
143 res = compiled(data); 188 res = compiled(data);
144 - }  
145 - catch (ex) { 189 + } catch (ex) {
146 console.log(ex, template) 190 console.log(ex, template)
147 } 191 }
148 return res; 192 return res;