plotly.js
Version:
The open source javascript graphing library that powers plotly
137 lines (123 loc) • 3.9 kB
JavaScript
/**
* Copyright 2012-2020, Plotly, Inc.
* All rights reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
;
var extendFlat = require('../lib/extend').extendFlat;
/**
* Make a xy domain attribute group
*
* @param {object} opts
* @param {string}
* opts.name: name to be inserted in the default description
* @param {boolean}
* opts.trace: set to true for trace containers
* @param {string}
* opts.editType: editType for all pieces
* @param {boolean}
* opts.noGridCell: set to true to omit `row` and `column`
*
* @param {object} extra
* @param {string}
* extra.description: extra description. N.B we use
* a separate extra container to make it compatible with
* the compress_attributes transform.
*
* @return {object} attributes object containing {x,y} as specified
*/
exports.attributes = function(opts, extra) {
opts = opts || {};
extra = extra || {};
var base = {
valType: 'info_array',
role: 'info',
editType: opts.editType,
items: [
{valType: 'number', min: 0, max: 1, editType: opts.editType},
{valType: 'number', min: 0, max: 1, editType: opts.editType}
],
dflt: [0, 1]
};
var namePart = opts.name ? opts.name + ' ' : '';
var contPart = opts.trace ? 'trace ' : 'subplot ';
var descPart = extra.description ? ' ' + extra.description : '';
var out = {
x: extendFlat({}, base, {
description: [
'Sets the horizontal domain of this ',
namePart,
contPart,
'(in plot fraction).',
descPart
].join('')
}),
y: extendFlat({}, base, {
description: [
'Sets the vertical domain of this ',
namePart,
contPart,
'(in plot fraction).',
descPart
].join('')
}),
editType: opts.editType
};
if(!opts.noGridCell) {
out.row = {
valType: 'integer',
min: 0,
dflt: 0,
role: 'info',
editType: opts.editType,
description: [
'If there is a layout grid, use the domain ',
'for this row in the grid for this ',
namePart,
contPart,
'.',
descPart
].join('')
};
out.column = {
valType: 'integer',
min: 0,
dflt: 0,
role: 'info',
editType: opts.editType,
description: [
'If there is a layout grid, use the domain ',
'for this column in the grid for this ',
namePart,
contPart,
'.',
descPart
].join('')
};
}
return out;
};
exports.defaults = function(containerOut, layout, coerce, dfltDomains) {
var dfltX = (dfltDomains && dfltDomains.x) || [0, 1];
var dfltY = (dfltDomains && dfltDomains.y) || [0, 1];
var grid = layout.grid;
if(grid) {
var column = coerce('domain.column');
if(column !== undefined) {
if(column < grid.columns) dfltX = grid._domains.x[column];
else delete containerOut.domain.column;
}
var row = coerce('domain.row');
if(row !== undefined) {
if(row < grid.rows) dfltY = grid._domains.y[row];
else delete containerOut.domain.row;
}
}
var x = coerce('domain.x', dfltX);
var y = coerce('domain.y', dfltY);
// don't accept bad input data
if(!(x[0] < x[1])) containerOut.domain.x = dfltX.slice();
if(!(y[0] < y[1])) containerOut.domain.y = dfltY.slice();
};