aria.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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.js';
  41. import { makeInner } from '../util/model.js';
  42. import { getDecalFromPalette } from '../model/mixin/palette.js';
  43. var DEFAULT_OPTION = {
  44. label: {
  45. enabled: true
  46. },
  47. decal: {
  48. show: false
  49. }
  50. };
  51. var inner = makeInner();
  52. var decalPaletteScope = {};
  53. export default function ariaVisual(ecModel, api) {
  54. var ariaModel = ecModel.getModel('aria');
  55. // 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 different 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 (zrUtil.isFunction(seriesModel.enableAriaDecal)) {
  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 dom = api.getZr().dom;
  125. // TODO: support for SSR
  126. if (!dom) {
  127. return;
  128. }
  129. var labelLocale = ecModel.getLocaleModel().get('aria');
  130. var labelModel = ariaModel.getModel('label');
  131. labelModel.option = zrUtil.defaults(labelModel.option, labelLocale);
  132. if (!labelModel.get('enabled')) {
  133. return;
  134. }
  135. dom.setAttribute('role', 'img');
  136. if (labelModel.get('description')) {
  137. dom.setAttribute('aria-label', labelModel.get('description'));
  138. return;
  139. }
  140. var seriesCnt = ecModel.getSeriesCount();
  141. var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10;
  142. var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10;
  143. var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt);
  144. var ariaLabel;
  145. if (seriesCnt < 1) {
  146. // No series, no aria label
  147. return;
  148. } else {
  149. var title = getTitle();
  150. if (title) {
  151. var withTitle = labelModel.get(['general', 'withTitle']);
  152. ariaLabel = replace(withTitle, {
  153. title: title
  154. });
  155. } else {
  156. ariaLabel = labelModel.get(['general', 'withoutTitle']);
  157. }
  158. var seriesLabels_1 = [];
  159. var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']);
  160. ariaLabel += replace(prefix, {
  161. seriesCount: seriesCnt
  162. });
  163. ecModel.eachSeries(function (seriesModel, idx) {
  164. if (idx < displaySeriesCnt) {
  165. var seriesLabel = void 0;
  166. var seriesName = seriesModel.get('name');
  167. var withName = seriesName ? 'withName' : 'withoutName';
  168. seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]);
  169. seriesLabel = replace(seriesLabel, {
  170. seriesId: seriesModel.seriesIndex,
  171. seriesName: seriesModel.get('name'),
  172. seriesType: getSeriesTypeName(seriesModel.subType)
  173. });
  174. var data = seriesModel.getData();
  175. if (data.count() > maxDataCnt) {
  176. // Show part of data
  177. var partialLabel = labelModel.get(['data', 'partialData']);
  178. seriesLabel += replace(partialLabel, {
  179. displayCnt: maxDataCnt
  180. });
  181. } else {
  182. seriesLabel += labelModel.get(['data', 'allData']);
  183. }
  184. var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']);
  185. var endSeparator_1 = labelModel.get(['data', 'separator', 'end']);
  186. var excludeDimensionId_1 = labelModel.get(['data', 'excludeDimensionId']);
  187. var dataLabels = [];
  188. for (var i = 0; i < data.count(); i++) {
  189. if (i < maxDataCnt) {
  190. var name_1 = data.getName(i);
  191. var value = !excludeDimensionId_1 ? data.getValues(i) : zrUtil.filter(data.getValues(i), function (v, j) {
  192. return zrUtil.indexOf(excludeDimensionId_1, j) === -1;
  193. });
  194. var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']);
  195. dataLabels.push(replace(dataLabel, {
  196. name: name_1,
  197. value: value.join(middleSeparator_1)
  198. }));
  199. }
  200. }
  201. seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1;
  202. seriesLabels_1.push(seriesLabel);
  203. }
  204. });
  205. var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']);
  206. var middleSeparator = separatorModel.get('middle');
  207. var endSeparator = separatorModel.get('end');
  208. ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator;
  209. dom.setAttribute('aria-label', ariaLabel);
  210. }
  211. }
  212. function replace(str, keyValues) {
  213. if (!zrUtil.isString(str)) {
  214. return str;
  215. }
  216. var result = str;
  217. zrUtil.each(keyValues, function (value, key) {
  218. result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value);
  219. });
  220. return result;
  221. }
  222. function getTitle() {
  223. var title = ecModel.get('title');
  224. if (title && title.length) {
  225. title = title[0];
  226. }
  227. return title && title.text;
  228. }
  229. function getSeriesTypeName(type) {
  230. var typeNames = ecModel.getLocaleModel().get(['series', 'typeNames']);
  231. return typeNames[type] || typeNames.chart;
  232. }
  233. }