GaugeView.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. /**
  20. * AUTO-GENERATED FILE. DO NOT MODIFY.
  21. */
  22. /*
  23. * Licensed to the Apache Software Foundation (ASF) under one
  24. * or more contributor license agreements. See the NOTICE file
  25. * distributed with this work for additional information
  26. * regarding copyright ownership. The ASF licenses this file
  27. * to you under the Apache License, Version 2.0 (the
  28. * "License"); you may not use this file except in compliance
  29. * with the License. You may obtain a copy of the License at
  30. *
  31. * http://www.apache.org/licenses/LICENSE-2.0
  32. *
  33. * Unless required by applicable law or agreed to in writing,
  34. * software distributed under the License is distributed on an
  35. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  36. * KIND, either express or implied. See the License for the
  37. * specific language governing permissions and limitations
  38. * under the License.
  39. */
  40. import { __extends } from "tslib";
  41. import PointerPath from './PointerPath';
  42. import * as graphic from '../../util/graphic';
  43. import { setStatesStylesFromModel, enableHoverEmphasis } from '../../util/states';
  44. import { createTextStyle, setLabelValueAnimation, animateLabelValue } from '../../label/labelStyle';
  45. import ChartView from '../../view/Chart';
  46. import { parsePercent, round, linearMap } from '../../util/number';
  47. import Sausage from '../../util/shape/sausage';
  48. import { createSymbol } from '../../util/symbol';
  49. import ZRImage from 'zrender/lib/graphic/Image';
  50. import { extend } from 'zrender/lib/core/util';
  51. import { setCommonECData } from '../../util/innerStore';
  52. function parsePosition(seriesModel, api) {
  53. var center = seriesModel.get('center');
  54. var width = api.getWidth();
  55. var height = api.getHeight();
  56. var size = Math.min(width, height);
  57. var cx = parsePercent(center[0], api.getWidth());
  58. var cy = parsePercent(center[1], api.getHeight());
  59. var r = parsePercent(seriesModel.get('radius'), size / 2);
  60. return {
  61. cx: cx,
  62. cy: cy,
  63. r: r
  64. };
  65. }
  66. function formatLabel(value, labelFormatter) {
  67. var label = value == null ? '' : value + '';
  68. if (labelFormatter) {
  69. if (typeof labelFormatter === 'string') {
  70. label = labelFormatter.replace('{value}', label);
  71. } else if (typeof labelFormatter === 'function') {
  72. label = labelFormatter(value);
  73. }
  74. }
  75. return label;
  76. }
  77. var PI2 = Math.PI * 2;
  78. var GaugeView =
  79. /** @class */
  80. function (_super) {
  81. __extends(GaugeView, _super);
  82. function GaugeView() {
  83. var _this = _super !== null && _super.apply(this, arguments) || this;
  84. _this.type = GaugeView.type;
  85. return _this;
  86. }
  87. GaugeView.prototype.render = function (seriesModel, ecModel, api) {
  88. this.group.removeAll();
  89. var colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']);
  90. var posInfo = parsePosition(seriesModel, api);
  91. this._renderMain(seriesModel, ecModel, api, colorList, posInfo);
  92. this._data = seriesModel.getData();
  93. };
  94. GaugeView.prototype.dispose = function () {};
  95. GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) {
  96. var group = this.group;
  97. var clockwise = seriesModel.get('clockwise');
  98. var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;
  99. var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;
  100. var axisLineModel = seriesModel.getModel('axisLine');
  101. var roundCap = axisLineModel.get('roundCap');
  102. var MainPath = roundCap ? Sausage : graphic.Sector;
  103. var showAxis = axisLineModel.get('show');
  104. var lineStyleModel = axisLineModel.getModel('lineStyle');
  105. var axisLineWidth = lineStyleModel.get('width');
  106. var angleRangeSpan = !((endAngle - startAngle) % PI2) && endAngle !== startAngle ? PI2 : (endAngle - startAngle) % PI2;
  107. var prevEndAngle = startAngle;
  108. for (var i = 0; showAxis && i < colorList.length; i++) {
  109. // Clamp
  110. var percent = Math.min(Math.max(colorList[i][0], 0), 1);
  111. endAngle = startAngle + angleRangeSpan * percent;
  112. var sector = new MainPath({
  113. shape: {
  114. startAngle: prevEndAngle,
  115. endAngle: endAngle,
  116. cx: posInfo.cx,
  117. cy: posInfo.cy,
  118. clockwise: clockwise,
  119. r0: posInfo.r - axisLineWidth,
  120. r: posInfo.r
  121. },
  122. silent: true
  123. });
  124. sector.setStyle({
  125. fill: colorList[i][1]
  126. });
  127. sector.setStyle(lineStyleModel.getLineStyle( // Because we use sector to simulate arc
  128. // so the properties for stroking are useless
  129. ['color', 'width']));
  130. group.add(sector);
  131. prevEndAngle = endAngle;
  132. }
  133. var getColor = function (percent) {
  134. // Less than 0
  135. if (percent <= 0) {
  136. return colorList[0][1];
  137. }
  138. var i;
  139. for (i = 0; i < colorList.length; i++) {
  140. if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) {
  141. return colorList[i][1];
  142. }
  143. } // More than 1
  144. return colorList[i - 1][1];
  145. };
  146. if (!clockwise) {
  147. var tmp = startAngle;
  148. startAngle = endAngle;
  149. endAngle = tmp;
  150. }
  151. this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);
  152. this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo);
  153. this._renderAnchor(seriesModel, posInfo);
  154. this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);
  155. };
  156. GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {
  157. var group = this.group;
  158. var cx = posInfo.cx;
  159. var cy = posInfo.cy;
  160. var r = posInfo.r;
  161. var minVal = +seriesModel.get('min');
  162. var maxVal = +seriesModel.get('max');
  163. var splitLineModel = seriesModel.getModel('splitLine');
  164. var tickModel = seriesModel.getModel('axisTick');
  165. var labelModel = seriesModel.getModel('axisLabel');
  166. var splitNumber = seriesModel.get('splitNumber');
  167. var subSplitNumber = tickModel.get('splitNumber');
  168. var splitLineLen = parsePercent(splitLineModel.get('length'), r);
  169. var tickLen = parsePercent(tickModel.get('length'), r);
  170. var angle = startAngle;
  171. var step = (endAngle - startAngle) / splitNumber;
  172. var subStep = step / subSplitNumber;
  173. var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();
  174. var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();
  175. var splitLineDistance = splitLineModel.get('distance');
  176. var unitX;
  177. var unitY;
  178. for (var i = 0; i <= splitNumber; i++) {
  179. unitX = Math.cos(angle);
  180. unitY = Math.sin(angle); // Split line
  181. if (splitLineModel.get('show')) {
  182. var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth;
  183. var splitLine = new graphic.Line({
  184. shape: {
  185. x1: unitX * (r - distance) + cx,
  186. y1: unitY * (r - distance) + cy,
  187. x2: unitX * (r - splitLineLen - distance) + cx,
  188. y2: unitY * (r - splitLineLen - distance) + cy
  189. },
  190. style: splitLineStyle,
  191. silent: true
  192. });
  193. if (splitLineStyle.stroke === 'auto') {
  194. splitLine.setStyle({
  195. stroke: getColor(i / splitNumber)
  196. });
  197. }
  198. group.add(splitLine);
  199. } // Label
  200. if (labelModel.get('show')) {
  201. var distance = labelModel.get('distance') + splitLineDistance;
  202. var label = formatLabel(round(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter'));
  203. var autoColor = getColor(i / splitNumber);
  204. group.add(new graphic.Text({
  205. style: createTextStyle(labelModel, {
  206. text: label,
  207. x: unitX * (r - splitLineLen - distance) + cx,
  208. y: unitY * (r - splitLineLen - distance) + cy,
  209. verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle',
  210. align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center'
  211. }, {
  212. inheritColor: autoColor
  213. }),
  214. silent: true
  215. }));
  216. } // Axis tick
  217. if (tickModel.get('show') && i !== splitNumber) {
  218. var distance = tickModel.get('distance');
  219. distance = distance ? distance + axisLineWidth : axisLineWidth;
  220. for (var j = 0; j <= subSplitNumber; j++) {
  221. unitX = Math.cos(angle);
  222. unitY = Math.sin(angle);
  223. var tickLine = new graphic.Line({
  224. shape: {
  225. x1: unitX * (r - distance) + cx,
  226. y1: unitY * (r - distance) + cy,
  227. x2: unitX * (r - tickLen - distance) + cx,
  228. y2: unitY * (r - tickLen - distance) + cy
  229. },
  230. silent: true,
  231. style: tickLineStyle
  232. });
  233. if (tickLineStyle.stroke === 'auto') {
  234. tickLine.setStyle({
  235. stroke: getColor((i + j / subSplitNumber) / splitNumber)
  236. });
  237. }
  238. group.add(tickLine);
  239. angle += subStep;
  240. }
  241. angle -= subStep;
  242. } else {
  243. angle += step;
  244. }
  245. }
  246. };
  247. GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {
  248. var group = this.group;
  249. var oldData = this._data;
  250. var oldProgressData = this._progressEls;
  251. var progressList = [];
  252. var showPointer = seriesModel.get(['pointer', 'show']);
  253. var progressModel = seriesModel.getModel('progress');
  254. var showProgress = progressModel.get('show');
  255. var data = seriesModel.getData();
  256. var valueDim = data.mapDimension('value');
  257. var minVal = +seriesModel.get('min');
  258. var maxVal = +seriesModel.get('max');
  259. var valueExtent = [minVal, maxVal];
  260. var angleExtent = [startAngle, endAngle];
  261. function createPointer(idx, angle) {
  262. var itemModel = data.getItemModel(idx);
  263. var pointerModel = itemModel.getModel('pointer');
  264. var pointerWidth = parsePercent(pointerModel.get('width'), posInfo.r);
  265. var pointerLength = parsePercent(pointerModel.get('length'), posInfo.r);
  266. var pointerStr = seriesModel.get(['pointer', 'icon']);
  267. var pointerOffset = pointerModel.get('offsetCenter');
  268. var pointerOffsetX = parsePercent(pointerOffset[0], posInfo.r);
  269. var pointerOffsetY = parsePercent(pointerOffset[1], posInfo.r);
  270. var pointerKeepAspect = pointerModel.get('keepAspect');
  271. var pointer; // not exist icon type will be set 'rect'
  272. if (pointerStr) {
  273. pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect);
  274. } else {
  275. pointer = new PointerPath({
  276. shape: {
  277. angle: -Math.PI / 2,
  278. width: pointerWidth,
  279. r: pointerLength,
  280. x: pointerOffsetX,
  281. y: pointerOffsetY
  282. }
  283. });
  284. }
  285. pointer.rotation = -(angle + Math.PI / 2);
  286. pointer.x = posInfo.cx;
  287. pointer.y = posInfo.cy;
  288. return pointer;
  289. }
  290. function createProgress(idx, endAngle) {
  291. var roundCap = progressModel.get('roundCap');
  292. var ProgressPath = roundCap ? Sausage : graphic.Sector;
  293. var isOverlap = progressModel.get('overlap');
  294. var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count();
  295. var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth;
  296. var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth;
  297. var progress = new ProgressPath({
  298. shape: {
  299. startAngle: startAngle,
  300. endAngle: endAngle,
  301. cx: posInfo.cx,
  302. cy: posInfo.cy,
  303. clockwise: clockwise,
  304. r0: r0,
  305. r: r
  306. }
  307. });
  308. isOverlap && (progress.z2 = maxVal - data.get(valueDim, idx) % maxVal);
  309. return progress;
  310. }
  311. if (showProgress || showPointer) {
  312. data.diff(oldData).add(function (idx) {
  313. if (showPointer) {
  314. var pointer = createPointer(idx, startAngle);
  315. graphic.initProps(pointer, {
  316. rotation: -(linearMap(data.get(valueDim, idx), valueExtent, angleExtent, true) + Math.PI / 2)
  317. }, seriesModel);
  318. group.add(pointer);
  319. data.setItemGraphicEl(idx, pointer);
  320. }
  321. if (showProgress) {
  322. var progress = createProgress(idx, startAngle);
  323. var isClip = progressModel.get('clip');
  324. graphic.initProps(progress, {
  325. shape: {
  326. endAngle: linearMap(data.get(valueDim, idx), valueExtent, angleExtent, isClip)
  327. }
  328. }, seriesModel);
  329. group.add(progress); // Add data index and series index for indexing the data by element
  330. // Useful in tooltip
  331. setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress);
  332. progressList[idx] = progress;
  333. }
  334. }).update(function (newIdx, oldIdx) {
  335. if (showPointer) {
  336. var previousPointer = oldData.getItemGraphicEl(oldIdx);
  337. var previousRotate = previousPointer ? previousPointer.rotation : startAngle;
  338. var pointer = createPointer(newIdx, previousRotate);
  339. pointer.rotation = previousRotate;
  340. graphic.updateProps(pointer, {
  341. rotation: -(linearMap(data.get(valueDim, newIdx), valueExtent, angleExtent, true) + Math.PI / 2)
  342. }, seriesModel);
  343. group.add(pointer);
  344. data.setItemGraphicEl(newIdx, pointer);
  345. }
  346. if (showProgress) {
  347. var previousProgress = oldProgressData[oldIdx];
  348. var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle;
  349. var progress = createProgress(newIdx, previousEndAngle);
  350. var isClip = progressModel.get('clip');
  351. graphic.updateProps(progress, {
  352. shape: {
  353. endAngle: linearMap(data.get(valueDim, newIdx), valueExtent, angleExtent, isClip)
  354. }
  355. }, seriesModel);
  356. group.add(progress); // Add data index and series index for indexing the data by element
  357. // Useful in tooltip
  358. setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress);
  359. progressList[newIdx] = progress;
  360. }
  361. }).execute();
  362. data.each(function (idx) {
  363. var itemModel = data.getItemModel(idx);
  364. var emphasisModel = itemModel.getModel('emphasis');
  365. if (showPointer) {
  366. var pointer = data.getItemGraphicEl(idx);
  367. var symbolStyle = data.getItemVisual(idx, 'style');
  368. var visualColor = symbolStyle.fill;
  369. if (pointer instanceof ZRImage) {
  370. var pathStyle = pointer.style;
  371. pointer.useStyle(extend({
  372. image: pathStyle.image,
  373. x: pathStyle.x,
  374. y: pathStyle.y,
  375. width: pathStyle.width,
  376. height: pathStyle.height
  377. }, symbolStyle));
  378. } else {
  379. pointer.useStyle(symbolStyle);
  380. pointer.type !== 'pointer' && pointer.setColor(visualColor);
  381. }
  382. pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle());
  383. if (pointer.style.fill === 'auto') {
  384. pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true)));
  385. }
  386. pointer.z2EmphasisLift = 0;
  387. setStatesStylesFromModel(pointer, itemModel);
  388. enableHoverEmphasis(pointer, emphasisModel.get('focus'), emphasisModel.get('blurScope'));
  389. }
  390. if (showProgress) {
  391. var progress = progressList[idx];
  392. progress.useStyle(data.getItemVisual(idx, 'style'));
  393. progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle());
  394. progress.z2EmphasisLift = 0;
  395. setStatesStylesFromModel(progress, itemModel);
  396. enableHoverEmphasis(progress, emphasisModel.get('focus'), emphasisModel.get('blurScope'));
  397. }
  398. });
  399. this._progressEls = progressList;
  400. }
  401. };
  402. GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) {
  403. var anchorModel = seriesModel.getModel('anchor');
  404. var showAnchor = anchorModel.get('show');
  405. if (showAnchor) {
  406. var anchorSize = anchorModel.get('size');
  407. var anchorType = anchorModel.get('icon');
  408. var offsetCenter = anchorModel.get('offsetCenter');
  409. var anchorKeepAspect = anchorModel.get('keepAspect');
  410. var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect);
  411. anchor.z2 = anchorModel.get('showAbove') ? 1 : 0;
  412. anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle());
  413. this.group.add(anchor);
  414. }
  415. };
  416. GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) {
  417. var _this = this;
  418. var data = seriesModel.getData();
  419. var valueDim = data.mapDimension('value');
  420. var minVal = +seriesModel.get('min');
  421. var maxVal = +seriesModel.get('max');
  422. var contentGroup = new graphic.Group();
  423. var newTitleEls = [];
  424. var newDetailEls = [];
  425. var hasAnimation = seriesModel.isAnimationEnabled();
  426. var showPointerAbove = seriesModel.get(['pointer', 'showAbove']);
  427. data.diff(this._data).add(function (idx) {
  428. newTitleEls[idx] = new graphic.Text({
  429. silent: true
  430. });
  431. newDetailEls[idx] = new graphic.Text({
  432. silent: true
  433. });
  434. }).update(function (idx, oldIdx) {
  435. newTitleEls[idx] = _this._titleEls[oldIdx];
  436. newDetailEls[idx] = _this._detailEls[oldIdx];
  437. }).execute();
  438. data.each(function (idx) {
  439. var itemModel = data.getItemModel(idx);
  440. var value = data.get(valueDim, idx);
  441. var itemGroup = new graphic.Group();
  442. var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true));
  443. var itemTitleModel = itemModel.getModel('title');
  444. if (itemTitleModel.get('show')) {
  445. var titleOffsetCenter = itemTitleModel.get('offsetCenter');
  446. var titleX = posInfo.cx + parsePercent(titleOffsetCenter[0], posInfo.r);
  447. var titleY = posInfo.cy + parsePercent(titleOffsetCenter[1], posInfo.r);
  448. var labelEl = newTitleEls[idx];
  449. labelEl.attr({
  450. z2: showPointerAbove ? 0 : 2,
  451. style: createTextStyle(itemTitleModel, {
  452. x: titleX,
  453. y: titleY,
  454. text: data.getName(idx),
  455. align: 'center',
  456. verticalAlign: 'middle'
  457. }, {
  458. inheritColor: autoColor
  459. })
  460. });
  461. itemGroup.add(labelEl);
  462. }
  463. var itemDetailModel = itemModel.getModel('detail');
  464. if (itemDetailModel.get('show')) {
  465. var detailOffsetCenter = itemDetailModel.get('offsetCenter');
  466. var detailX = posInfo.cx + parsePercent(detailOffsetCenter[0], posInfo.r);
  467. var detailY = posInfo.cy + parsePercent(detailOffsetCenter[1], posInfo.r);
  468. var width = parsePercent(itemDetailModel.get('width'), posInfo.r);
  469. var height = parsePercent(itemDetailModel.get('height'), posInfo.r);
  470. var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor;
  471. var labelEl = newDetailEls[idx];
  472. var formatter_1 = itemDetailModel.get('formatter');
  473. labelEl.attr({
  474. z2: showPointerAbove ? 0 : 2,
  475. style: createTextStyle(itemDetailModel, {
  476. x: detailX,
  477. y: detailY,
  478. text: formatLabel(value, formatter_1),
  479. width: isNaN(width) ? null : width,
  480. height: isNaN(height) ? null : height,
  481. align: 'center',
  482. verticalAlign: 'middle'
  483. }, {
  484. inheritColor: detailColor
  485. })
  486. });
  487. setLabelValueAnimation(labelEl, {
  488. normal: itemDetailModel
  489. }, value, function (value) {
  490. return formatLabel(value, formatter_1);
  491. });
  492. hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, {
  493. getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) {
  494. return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1);
  495. }
  496. });
  497. itemGroup.add(labelEl);
  498. }
  499. contentGroup.add(itemGroup);
  500. });
  501. this.group.add(contentGroup);
  502. this._titleEls = newTitleEls;
  503. this._detailEls = newDetailEls;
  504. };
  505. GaugeView.type = 'gauge';
  506. return GaugeView;
  507. }(ChartView);
  508. export default GaugeView;