'use strict'; 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', 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, 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, 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(); };