aria.js 9.0 KB

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