You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
8.7 KiB
256 lines
8.7 KiB
|
|
/* |
|
* Licensed to the Apache Software Foundation (ASF) under one |
|
* or more contributor license agreements. See the NOTICE file |
|
* distributed with this work for additional information |
|
* regarding copyright ownership. The ASF licenses this file |
|
* to you under the Apache License, Version 2.0 (the |
|
* "License"); you may not use this file except in compliance |
|
* with the License. You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, |
|
* software distributed under the License is distributed on an |
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
|
* KIND, either express or implied. See the License for the |
|
* specific language governing permissions and limitations |
|
* under the License. |
|
*/ |
|
|
|
|
|
/** |
|
* AUTO-GENERATED FILE. DO NOT MODIFY. |
|
*/ |
|
|
|
/* |
|
* Licensed to the Apache Software Foundation (ASF) under one |
|
* or more contributor license agreements. See the NOTICE file |
|
* distributed with this work for additional information |
|
* regarding copyright ownership. The ASF licenses this file |
|
* to you under the Apache License, Version 2.0 (the |
|
* "License"); you may not use this file except in compliance |
|
* with the License. You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, |
|
* software distributed under the License is distributed on an |
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
|
* KIND, either express or implied. See the License for the |
|
* specific language governing permissions and limitations |
|
* under the License. |
|
*/ |
|
import * as zrUtil from 'zrender/lib/core/util.js'; |
|
import { makeInner } from '../util/model.js'; |
|
import { getDecalFromPalette } from '../model/mixin/palette.js'; |
|
var DEFAULT_OPTION = { |
|
label: { |
|
enabled: true |
|
}, |
|
decal: { |
|
show: false |
|
} |
|
}; |
|
var inner = makeInner(); |
|
var decalPaletteScope = {}; |
|
export default function ariaVisual(ecModel, api) { |
|
var ariaModel = ecModel.getModel('aria'); // See "area enabled" detection code in `GlobalModel.ts`. |
|
|
|
if (!ariaModel.get('enabled')) { |
|
return; |
|
} |
|
|
|
var defaultOption = zrUtil.clone(DEFAULT_OPTION); |
|
zrUtil.merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false); |
|
zrUtil.merge(ariaModel.option, defaultOption, false); |
|
setDecal(); |
|
setLabel(); |
|
|
|
function setDecal() { |
|
var decalModel = ariaModel.getModel('decal'); |
|
var useDecal = decalModel.get('show'); |
|
|
|
if (useDecal) { |
|
// Each type of series use one scope. |
|
// Pie and funnel are using different scopes. |
|
var paletteScopeGroupByType_1 = zrUtil.createHashMap(); |
|
ecModel.eachSeries(function (seriesModel) { |
|
if (seriesModel.isColorBySeries()) { |
|
return; |
|
} |
|
|
|
var decalScope = paletteScopeGroupByType_1.get(seriesModel.type); |
|
|
|
if (!decalScope) { |
|
decalScope = {}; |
|
paletteScopeGroupByType_1.set(seriesModel.type, decalScope); |
|
} |
|
|
|
inner(seriesModel).scope = decalScope; |
|
}); |
|
ecModel.eachRawSeries(function (seriesModel) { |
|
if (ecModel.isSeriesFiltered(seriesModel)) { |
|
return; |
|
} |
|
|
|
if (zrUtil.isFunction(seriesModel.enableAriaDecal)) { |
|
// Let series define how to use decal palette on data |
|
seriesModel.enableAriaDecal(); |
|
return; |
|
} |
|
|
|
var data = seriesModel.getData(); |
|
|
|
if (!seriesModel.isColorBySeries()) { |
|
var dataAll_1 = seriesModel.getRawData(); |
|
var idxMap_1 = {}; |
|
var decalScope_1 = inner(seriesModel).scope; |
|
data.each(function (idx) { |
|
var rawIdx = data.getRawIndex(idx); |
|
idxMap_1[rawIdx] = idx; |
|
}); |
|
var dataCount_1 = dataAll_1.count(); |
|
dataAll_1.each(function (rawIdx) { |
|
var idx = idxMap_1[rawIdx]; |
|
var name = dataAll_1.getName(rawIdx) || rawIdx + ''; |
|
var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1); |
|
var specifiedDecal = data.getItemVisual(idx, 'decal'); |
|
data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal)); |
|
}); |
|
} else { |
|
var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount()); |
|
var specifiedDecal = data.getVisual('decal'); |
|
data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal)); |
|
} |
|
|
|
function mergeDecal(specifiedDecal, paletteDecal) { |
|
// Merge decal from palette to decal from itemStyle. |
|
// User do not need to specify all of the decal props. |
|
var resultDecal = specifiedDecal ? zrUtil.extend(zrUtil.extend({}, paletteDecal), specifiedDecal) : paletteDecal; |
|
resultDecal.dirty = true; |
|
return resultDecal; |
|
} |
|
}); |
|
} |
|
} |
|
|
|
function setLabel() { |
|
var labelLocale = ecModel.getLocaleModel().get('aria'); |
|
var labelModel = ariaModel.getModel('label'); |
|
labelModel.option = zrUtil.defaults(labelModel.option, labelLocale); |
|
|
|
if (!labelModel.get('enabled')) { |
|
return; |
|
} |
|
|
|
var dom = api.getZr().dom; |
|
|
|
if (labelModel.get('description')) { |
|
dom.setAttribute('aria-label', labelModel.get('description')); |
|
return; |
|
} |
|
|
|
var seriesCnt = ecModel.getSeriesCount(); |
|
var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10; |
|
var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10; |
|
var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt); |
|
var ariaLabel; |
|
|
|
if (seriesCnt < 1) { |
|
// No series, no aria label |
|
return; |
|
} else { |
|
var title = getTitle(); |
|
|
|
if (title) { |
|
var withTitle = labelModel.get(['general', 'withTitle']); |
|
ariaLabel = replace(withTitle, { |
|
title: title |
|
}); |
|
} else { |
|
ariaLabel = labelModel.get(['general', 'withoutTitle']); |
|
} |
|
|
|
var seriesLabels_1 = []; |
|
var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']); |
|
ariaLabel += replace(prefix, { |
|
seriesCount: seriesCnt |
|
}); |
|
ecModel.eachSeries(function (seriesModel, idx) { |
|
if (idx < displaySeriesCnt) { |
|
var seriesLabel = void 0; |
|
var seriesName = seriesModel.get('name'); |
|
var withName = seriesName ? 'withName' : 'withoutName'; |
|
seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]); |
|
seriesLabel = replace(seriesLabel, { |
|
seriesId: seriesModel.seriesIndex, |
|
seriesName: seriesModel.get('name'), |
|
seriesType: getSeriesTypeName(seriesModel.subType) |
|
}); |
|
var data = seriesModel.getData(); |
|
|
|
if (data.count() > maxDataCnt) { |
|
// Show part of data |
|
var partialLabel = labelModel.get(['data', 'partialData']); |
|
seriesLabel += replace(partialLabel, { |
|
displayCnt: maxDataCnt |
|
}); |
|
} else { |
|
seriesLabel += labelModel.get(['data', 'allData']); |
|
} |
|
|
|
var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']); |
|
var endSeparator_1 = labelModel.get(['data', 'separator', 'end']); |
|
var dataLabels = []; |
|
|
|
for (var i = 0; i < data.count(); i++) { |
|
if (i < maxDataCnt) { |
|
var name_1 = data.getName(i); |
|
var value = data.getValues(i); |
|
var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']); |
|
dataLabels.push(replace(dataLabel, { |
|
name: name_1, |
|
value: value.join(middleSeparator_1) |
|
})); |
|
} |
|
} |
|
|
|
seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1; |
|
seriesLabels_1.push(seriesLabel); |
|
} |
|
}); |
|
var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']); |
|
var middleSeparator = separatorModel.get('middle'); |
|
var endSeparator = separatorModel.get('end'); |
|
ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator; |
|
dom.setAttribute('aria-label', ariaLabel); |
|
} |
|
} |
|
|
|
function replace(str, keyValues) { |
|
if (!zrUtil.isString(str)) { |
|
return str; |
|
} |
|
|
|
var result = str; |
|
zrUtil.each(keyValues, function (value, key) { |
|
result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value); |
|
}); |
|
return result; |
|
} |
|
|
|
function getTitle() { |
|
var title = ecModel.get('title'); |
|
|
|
if (title && title.length) { |
|
title = title[0]; |
|
} |
|
|
|
return title && title.text; |
|
} |
|
|
|
function getSeriesTypeName(type) { |
|
return ecModel.getLocaleModel().get(['series', 'typeNames'])[type] || '自定义图'; |
|
} |
|
} |