aria.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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 * as zrUtil from 'zrender/lib/core/util';
  41. import { retrieveRawValue } from '../data/helper/dataProvider';
  42. import { makeInner } from '../util/model';
  43. import { getDecalFromPalette } from '../model/mixin/palette';
  44. var DEFAULT_OPTION = {
  45. label: {
  46. enabled: true
  47. },
  48. decal: {
  49. show: false
  50. }
  51. };
  52. var inner = makeInner();
  53. var decalPaletteScope = {};
  54. export default function ariaVisual(ecModel, api) {
  55. var ariaModel = ecModel.getModel('aria'); // See "area enabled" detection code in `GlobalModel.ts`.
  56. if (!ariaModel.get('enabled')) {
  57. return;
  58. }
  59. var defaultOption = zrUtil.clone(DEFAULT_OPTION);
  60. zrUtil.merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false);
  61. zrUtil.merge(ariaModel.option, defaultOption, false);
  62. setDecal();
  63. setLabel();
  64. function setDecal() {
  65. var decalModel = ariaModel.getModel('decal');
  66. var useDecal = decalModel.get('show');
  67. if (useDecal) {
  68. // Each type of series use one scope.
  69. // Pie and funnel are using diferrent scopes
  70. var paletteScopeGroupByType_1 = zrUtil.createHashMap();
  71. ecModel.eachSeries(function (seriesModel) {
  72. if (seriesModel.isColorBySeries()) {
  73. return;
  74. }
  75. var decalScope = paletteScopeGroupByType_1.get(seriesModel.type);
  76. if (!decalScope) {
  77. decalScope = {};
  78. paletteScopeGroupByType_1.set(seriesModel.type, decalScope);
  79. }
  80. inner(seriesModel).scope = decalScope;
  81. });
  82. ecModel.eachRawSeries(function (seriesModel) {
  83. if (ecModel.isSeriesFiltered(seriesModel)) {
  84. return;
  85. }
  86. if (typeof seriesModel.enableAriaDecal === 'function') {
  87. // Let series define how to use decal palette on data
  88. seriesModel.enableAriaDecal();
  89. return;
  90. }
  91. var data = seriesModel.getData();
  92. if (!seriesModel.isColorBySeries()) {
  93. var dataAll_1 = seriesModel.getRawData();
  94. var idxMap_1 = {};
  95. var decalScope_1 = inner(seriesModel).scope;
  96. data.each(function (idx) {
  97. var rawIdx = data.getRawIndex(idx);
  98. idxMap_1[rawIdx] = idx;
  99. });
  100. var dataCount_1 = dataAll_1.count();
  101. dataAll_1.each(function (rawIdx) {
  102. var idx = idxMap_1[rawIdx];
  103. var name = dataAll_1.getName(rawIdx) || rawIdx + '';
  104. var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1);
  105. var specifiedDecal = data.getItemVisual(idx, 'decal');
  106. data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal));
  107. });
  108. } else {
  109. var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount());
  110. var specifiedDecal = data.getVisual('decal');
  111. data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal));
  112. }
  113. function mergeDecal(specifiedDecal, paletteDecal) {
  114. // Merge decal from palette to decal from itemStyle.
  115. // User do not need to specify all of the decal props.
  116. var resultDecal = specifiedDecal ? zrUtil.extend(zrUtil.extend({}, paletteDecal), specifiedDecal) : paletteDecal;
  117. resultDecal.dirty = true;
  118. return resultDecal;
  119. }
  120. });
  121. }
  122. }
  123. function setLabel() {
  124. var labelLocale = ecModel.getLocaleModel().get('aria');
  125. var labelModel = ariaModel.getModel('label');
  126. labelModel.option = zrUtil.defaults(labelModel.option, labelLocale);
  127. if (!labelModel.get('enabled')) {
  128. return;
  129. }
  130. var dom = api.getZr().dom;
  131. if (labelModel.get('description')) {
  132. dom.setAttribute('aria-label', labelModel.get('description'));
  133. return;
  134. }
  135. var seriesCnt = ecModel.getSeriesCount();
  136. var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10;
  137. var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10;
  138. var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt);
  139. var ariaLabel;
  140. if (seriesCnt < 1) {
  141. // No series, no aria label
  142. return;
  143. } else {
  144. var title = getTitle();
  145. if (title) {
  146. var withTitle = labelModel.get(['general', 'withTitle']);
  147. ariaLabel = replace(withTitle, {
  148. title: title
  149. });
  150. } else {
  151. ariaLabel = labelModel.get(['general', 'withoutTitle']);
  152. }
  153. var seriesLabels_1 = [];
  154. var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']);
  155. ariaLabel += replace(prefix, {
  156. seriesCount: seriesCnt
  157. });
  158. ecModel.eachSeries(function (seriesModel, idx) {
  159. if (idx < displaySeriesCnt) {
  160. var seriesLabel = void 0;
  161. var seriesName = seriesModel.get('name');
  162. var withName = seriesName ? 'withName' : 'withoutName';
  163. seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]);
  164. seriesLabel = replace(seriesLabel, {
  165. seriesId: seriesModel.seriesIndex,
  166. seriesName: seriesModel.get('name'),
  167. seriesType: getSeriesTypeName(seriesModel.subType)
  168. });
  169. var data = seriesModel.getData();
  170. if (data.count() > maxDataCnt) {
  171. // Show part of data
  172. var partialLabel = labelModel.get(['data', 'partialData']);
  173. seriesLabel += replace(partialLabel, {
  174. displayCnt: maxDataCnt
  175. });
  176. } else {
  177. seriesLabel += labelModel.get(['data', 'allData']);
  178. }
  179. var dataLabels = [];
  180. for (var i = 0; i < data.count(); i++) {
  181. if (i < maxDataCnt) {
  182. var name_1 = data.getName(i);
  183. var value = retrieveRawValue(data, i);
  184. var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']);
  185. dataLabels.push(replace(dataLabel, {
  186. name: name_1,
  187. value: value
  188. }));
  189. }
  190. }
  191. var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']);
  192. var endSeparator_1 = labelModel.get(['data', 'separator', 'end']);
  193. seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1;
  194. seriesLabels_1.push(seriesLabel);
  195. }
  196. });
  197. var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']);
  198. var middleSeparator = separatorModel.get('middle');
  199. var endSeparator = separatorModel.get('end');
  200. ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator;
  201. dom.setAttribute('aria-label', ariaLabel);
  202. }
  203. }
  204. function replace(str, keyValues) {
  205. if (typeof str !== 'string') {
  206. return str;
  207. }
  208. var result = str;
  209. zrUtil.each(keyValues, function (value, key) {
  210. result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value);
  211. });
  212. return result;
  213. }
  214. function getTitle() {
  215. var title = ecModel.get('title');
  216. if (title && title.length) {
  217. title = title[0];
  218. }
  219. return title && title.text;
  220. }
  221. function getSeriesTypeName(type) {
  222. return ecModel.getLocaleModel().get(['series', 'typeNames'])[type] || '自定义图';
  223. }
  224. }