From 5f8b280fc78b0dd8ad88440a317cb0d35811bb24 Mon Sep 17 00:00:00 2001 From: archmoj Date: Sat, 21 Mar 2020 22:40:31 -0400 Subject: [PATCH 1/7] link rangebreaks and tickformatstops from template --- src/plots/array_container_defaults.js | 2 +- src/plots/cartesian/axis_defaults.js | 7 +++- src/plots/cartesian/layout_defaults.js | 12 ++++++ src/plots/cartesian/tick_label_defaults.js | 5 ++- test/jasmine/tests/axes_test.js | 46 ++++++++++++++++++++++ 5 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/plots/array_container_defaults.js b/src/plots/array_container_defaults.js index 5f258544309..f03c5253f98 100644 --- a/src/plots/array_container_defaults.js +++ b/src/plots/array_container_defaults.js @@ -48,7 +48,7 @@ module.exports = function handleArrayContainerDefaults(parentObjIn, parentObjOut var previousContOut = parentObjOut[name]; - var contIn = Lib.isArrayOrTypedArray(parentObjIn[name]) ? parentObjIn[name] : []; + var contIn = Lib.isArrayOrTypedArray(parentObjIn[name]) ? parentObjIn[name] : (opts.fromTemplate || []); var contOut = parentObjOut[name] = []; var templater = Template.arrayTemplater(parentObjOut, name, inclusionAttr); var i, itemOut; diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index b1cae96206d..10f697b3618 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -51,7 +51,7 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, var visible = coerce('visible', !options.visibleDflt); - var axType = containerOut.type; + var axType = containerOut.type || options.axTemplate.type || '-'; if(axType === 'date') { var handleCalendarDefaults = Registry.getComponentMethod('calendars', 'handleDefaults'); @@ -125,9 +125,12 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, } if(containerOut.type === 'date') { - var rangebreaks = containerIn.rangebreaks; + var fromTemplate = (options.axTemplate || {}).rangebreaks; + var rangebreaks = containerIn.rangebreaks || fromTemplate; + if(Array.isArray(rangebreaks) && rangebreaks.length) { handleArrayContainerDefaults(containerIn, containerOut, { + fromTemplate: fromTemplate, name: 'rangebreaks', inclusionAttr: 'enabled', handleItemDefaults: rangebreaksDefaults diff --git a/src/plots/cartesian/layout_defaults.js b/src/plots/cartesian/layout_defaults.js index 9e163329c7b..9640509a030 100644 --- a/src/plots/cartesian/layout_defaults.js +++ b/src/plots/cartesian/layout_defaults.js @@ -230,7 +230,13 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { axHasImage[axName] )); + var axTemplate; + if(Lib.isPlainObject(layoutOut._template)) { + axTemplate = layoutOut._template[axLayoutOut._name]; + } + var defaultOptions = { + axTemplate: axTemplate || {}, letter: axLetter, font: layoutOut.font, outerTicks: outerTicks[axName], @@ -295,7 +301,13 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { axLayoutOut = Template.newContainer(layoutOut, axName, axLetter + 'axis'); newAxLayoutOut(); + var axTemplate2; + if(Lib.isPlainObject(layoutOut._template)) { + axTemplate2 = layoutOut._template[axLayoutOut._name]; + } + var defaultOptions2 = { + axTemplate: axTemplate2 || {}, letter: axLetter, font: layoutOut.font, outerTicks: outerTicks[axName], diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index 877c1acb40e..bf26dcacaef 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -59,9 +59,12 @@ function handleOtherDefaults(containerIn, containerOut, coerce, axType, options) if(axType !== 'category') { var tickFormat = coerce('tickformat'); - var tickformatStops = containerIn.tickformatstops; + var fromTemplate = (options.axTemplate || {}).tickformatstops; + var tickformatStops = containerIn.tickformatstops || fromTemplate; + if(Array.isArray(tickformatStops) && tickformatStops.length) { handleArrayContainerDefaults(containerIn, containerOut, { + fromTemplate: fromTemplate, name: 'tickformatstops', inclusionAttr: 'enabled', handleItemDefaults: tickformatstopDefaults diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index ad06ff73e53..43662ec3ee4 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5411,3 +5411,49 @@ describe('Test tickformatstops:', function() { .then(done); }); }); + +describe('Test template:', function() { + 'use strict'; + + var gd; + beforeEach(function() { + gd = createGraphDiv(); + }); + afterEach(destroyGraphDiv); + + it('apply axis *type*, *rangebreaks* and *tickformatstops* from template', function(done) { + Plotly.newPlot(gd, { + data: [{ + x: [1e10, 2e10, 3e10, 4e10, 5e10, 6e10, 7e10], + y: [1, 2, 3, 4, 5, 6, 7] + }], + layout: { + template: { + layout: { + xaxis: { + type: 'date', + rangebreaks: [{ + bounds: ['sat', 'mon'] + }], + tickformatstops: [{ + enabled: true, + dtickrange: [1000, 60000], + value: '%H:%M:%S s' + }] + } + } + } + } + }) + .then(function() { + var xaxis = gd._fullLayout.xaxis; + expect(xaxis.type).toBe('date'); + expect(xaxis.rangebreaks).not.toBe(undefined, 'rangebreaks'); + expect(xaxis.rangebreaks.length).toBe(1); + expect(xaxis.tickformatstops).not.toBe(undefined, 'tickformatstops'); + expect(xaxis.tickformatstops.length).toBe(1); + }) + .catch(failTest) + .then(done); + }); +}); From 96e3590929019ada7a1464501fba2ebebadfbe52 Mon Sep 17 00:00:00 2001 From: archmoj Date: Sun, 22 Mar 2020 18:47:48 -0400 Subject: [PATCH 2/7] set various layout components via template --- src/components/annotations/defaults.js | 1 + src/components/annotations3d/defaults.js | 1 + src/components/grid/index.js | 9 +++++---- src/components/images/defaults.js | 1 + src/components/rangeselector/defaults.js | 1 + src/components/shapes/defaults.js | 1 + src/components/sliders/defaults.js | 2 ++ src/components/updatemenus/defaults.js | 2 ++ src/plots/mapbox/layout_defaults.js | 1 + 9 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/annotations/defaults.js b/src/components/annotations/defaults.js index aca202ffaa2..d83a5f5886a 100644 --- a/src/components/annotations/defaults.js +++ b/src/components/annotations/defaults.js @@ -19,6 +19,7 @@ var attributes = require('./attributes'); module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { handleArrayContainerDefaults(layoutIn, layoutOut, { + fromTemplate: (layoutOut._template || {}).annotations, name: 'annotations', handleItemDefaults: handleAnnotationDefaults }); diff --git a/src/components/annotations3d/defaults.js b/src/components/annotations3d/defaults.js index ae749db5cbb..0e8c9d32f3d 100644 --- a/src/components/annotations3d/defaults.js +++ b/src/components/annotations3d/defaults.js @@ -16,6 +16,7 @@ var attributes = require('./attributes'); module.exports = function handleDefaults(sceneLayoutIn, sceneLayoutOut, opts) { handleArrayContainerDefaults(sceneLayoutIn, sceneLayoutOut, { + fromTemplate: (sceneLayoutOut._template || {}).annotations, name: 'annotations', handleItemDefaults: handleAnnotationDefaults, fullLayout: opts.fullLayout diff --git a/src/components/grid/index.js b/src/components/grid/index.js index bb6ec2f6ad9..20571df546a 100644 --- a/src/components/grid/index.js +++ b/src/components/grid/index.js @@ -177,11 +177,12 @@ function getAxes(layout, grid, axLetter) { // the shape of the grid - this needs to be done BEFORE supplyDataDefaults // so that non-subplot traces can place themselves in the grid function sizeDefaults(layoutIn, layoutOut) { - var gridIn = layoutIn.grid || {}; - var xAxes = getAxes(layoutOut, gridIn, 'x'); - var yAxes = getAxes(layoutOut, gridIn, 'y'); + var gridIn = layoutIn.grid || ((layoutIn.template || {}).layout || {}).grid; + var xAxes = getAxes(layoutOut, gridIn || {}, 'x'); + var yAxes = getAxes(layoutOut, gridIn || {}, 'y'); - if(!layoutIn.grid && !xAxes && !yAxes) return; + if(!gridIn && !xAxes && !yAxes) return; + if(!gridIn) gridIn = {}; var hasSubplotGrid = Array.isArray(gridIn.subplots) && Array.isArray(gridIn.subplots[0]); var hasXaxes = Array.isArray(xAxes); diff --git a/src/components/images/defaults.js b/src/components/images/defaults.js index 0c08874c441..ffe58d47e3c 100644 --- a/src/components/images/defaults.js +++ b/src/components/images/defaults.js @@ -17,6 +17,7 @@ var name = 'images'; module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { var opts = { + fromTemplate: (layoutOut._template || {}).images, name: name, handleItemDefaults: imageDefaults }; diff --git a/src/components/rangeselector/defaults.js b/src/components/rangeselector/defaults.js index 3151b981b4a..0d8dfbe5ce4 100644 --- a/src/components/rangeselector/defaults.js +++ b/src/components/rangeselector/defaults.js @@ -26,6 +26,7 @@ module.exports = function handleDefaults(containerIn, containerOut, layout, coun } var buttons = handleArrayContainerDefaults(selectorIn, selectorOut, { + fromTemplate: (selectorOut._template || {}).buttons, name: 'buttons', handleItemDefaults: buttonDefaults, calendar: calendar diff --git a/src/components/shapes/defaults.js b/src/components/shapes/defaults.js index d11ee8eb604..ac3a0f89304 100644 --- a/src/components/shapes/defaults.js +++ b/src/components/shapes/defaults.js @@ -19,6 +19,7 @@ var helpers = require('./helpers'); module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { handleArrayContainerDefaults(layoutIn, layoutOut, { + fromTemplate: (layoutOut._template || {}).shapes, name: 'shapes', handleItemDefaults: handleShapeDefaults }); diff --git a/src/components/sliders/defaults.js b/src/components/sliders/defaults.js index 1411c2e16b2..d5e196a2e72 100644 --- a/src/components/sliders/defaults.js +++ b/src/components/sliders/defaults.js @@ -20,6 +20,7 @@ var stepAttrs = attributes.steps; module.exports = function slidersDefaults(layoutIn, layoutOut) { handleArrayContainerDefaults(layoutIn, layoutOut, { + fromTemplate: (layoutOut._template || {}).sliders, name: name, handleItemDefaults: sliderDefaults }); @@ -31,6 +32,7 @@ function sliderDefaults(sliderIn, sliderOut, layoutOut) { } var steps = handleArrayContainerDefaults(sliderIn, sliderOut, { + fromTemplate: (layoutOut._template || {}).steps, name: 'steps', handleItemDefaults: stepDefaults }); diff --git a/src/components/updatemenus/defaults.js b/src/components/updatemenus/defaults.js index 4b3712b776e..a868bf265a2 100644 --- a/src/components/updatemenus/defaults.js +++ b/src/components/updatemenus/defaults.js @@ -20,6 +20,7 @@ var buttonAttrs = attributes.buttons; module.exports = function updateMenusDefaults(layoutIn, layoutOut) { var opts = { + fromTemplate: (layoutOut._template || {}).updatemenus, name: name, handleItemDefaults: menuDefaults }; @@ -33,6 +34,7 @@ function menuDefaults(menuIn, menuOut, layoutOut) { } var buttons = handleArrayContainerDefaults(menuIn, menuOut, { + fromTemplate: (layoutOut._template || {}).buttons, name: 'buttons', handleItemDefaults: buttonDefaults }); diff --git a/src/plots/mapbox/layout_defaults.js b/src/plots/mapbox/layout_defaults.js index 7aed4eeef20..981421e0413 100644 --- a/src/plots/mapbox/layout_defaults.js +++ b/src/plots/mapbox/layout_defaults.js @@ -35,6 +35,7 @@ function handleDefaults(containerIn, containerOut, coerce, opts) { coerce('pitch'); handleArrayContainerDefaults(containerIn, containerOut, { + fromTemplate: (containerOut._template || {}).layers, name: 'layers', handleItemDefaults: handleLayerDefaults }); From 0e0049d40ae4dfbede80488c13a048fe756c7936 Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 23 Mar 2020 09:18:38 -0400 Subject: [PATCH 3/7] use axType to consider axis types defined in template --- src/plots/cartesian/axis_defaults.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index 10f697b3618..d08daeec239 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -105,10 +105,10 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, if(options.automargin) coerce('automargin'); - var isMultiCategory = containerOut.type === 'multicategory'; + var isMultiCategory = axType === 'multicategory'; if(!options.noTickson && - (containerOut.type === 'category' || isMultiCategory) && + (axType === 'category' || isMultiCategory) && (containerOut.ticks || containerOut.showgrid) ) { var ticksonDflt; @@ -124,7 +124,7 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, } } - if(containerOut.type === 'date') { + if(axType === 'date') { var fromTemplate = (options.axTemplate || {}).rangebreaks; var rangebreaks = containerIn.rangebreaks || fromTemplate; From 964fd6a12d02e31aaf7b910bb1caddc031079b52 Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 23 Mar 2020 11:58:46 -0400 Subject: [PATCH 4/7] Revert "set various layout components via template" This reverts commit 96e3590929019ada7a1464501fba2ebebadfbe52. --- src/components/annotations/defaults.js | 1 - src/components/annotations3d/defaults.js | 1 - src/components/grid/index.js | 9 ++++----- src/components/images/defaults.js | 1 - src/components/rangeselector/defaults.js | 1 - src/components/shapes/defaults.js | 1 - src/components/sliders/defaults.js | 2 -- src/components/updatemenus/defaults.js | 2 -- src/plots/mapbox/layout_defaults.js | 1 - 9 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/components/annotations/defaults.js b/src/components/annotations/defaults.js index d83a5f5886a..aca202ffaa2 100644 --- a/src/components/annotations/defaults.js +++ b/src/components/annotations/defaults.js @@ -19,7 +19,6 @@ var attributes = require('./attributes'); module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { handleArrayContainerDefaults(layoutIn, layoutOut, { - fromTemplate: (layoutOut._template || {}).annotations, name: 'annotations', handleItemDefaults: handleAnnotationDefaults }); diff --git a/src/components/annotations3d/defaults.js b/src/components/annotations3d/defaults.js index 0e8c9d32f3d..ae749db5cbb 100644 --- a/src/components/annotations3d/defaults.js +++ b/src/components/annotations3d/defaults.js @@ -16,7 +16,6 @@ var attributes = require('./attributes'); module.exports = function handleDefaults(sceneLayoutIn, sceneLayoutOut, opts) { handleArrayContainerDefaults(sceneLayoutIn, sceneLayoutOut, { - fromTemplate: (sceneLayoutOut._template || {}).annotations, name: 'annotations', handleItemDefaults: handleAnnotationDefaults, fullLayout: opts.fullLayout diff --git a/src/components/grid/index.js b/src/components/grid/index.js index 20571df546a..bb6ec2f6ad9 100644 --- a/src/components/grid/index.js +++ b/src/components/grid/index.js @@ -177,12 +177,11 @@ function getAxes(layout, grid, axLetter) { // the shape of the grid - this needs to be done BEFORE supplyDataDefaults // so that non-subplot traces can place themselves in the grid function sizeDefaults(layoutIn, layoutOut) { - var gridIn = layoutIn.grid || ((layoutIn.template || {}).layout || {}).grid; - var xAxes = getAxes(layoutOut, gridIn || {}, 'x'); - var yAxes = getAxes(layoutOut, gridIn || {}, 'y'); + var gridIn = layoutIn.grid || {}; + var xAxes = getAxes(layoutOut, gridIn, 'x'); + var yAxes = getAxes(layoutOut, gridIn, 'y'); - if(!gridIn && !xAxes && !yAxes) return; - if(!gridIn) gridIn = {}; + if(!layoutIn.grid && !xAxes && !yAxes) return; var hasSubplotGrid = Array.isArray(gridIn.subplots) && Array.isArray(gridIn.subplots[0]); var hasXaxes = Array.isArray(xAxes); diff --git a/src/components/images/defaults.js b/src/components/images/defaults.js index ffe58d47e3c..0c08874c441 100644 --- a/src/components/images/defaults.js +++ b/src/components/images/defaults.js @@ -17,7 +17,6 @@ var name = 'images'; module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { var opts = { - fromTemplate: (layoutOut._template || {}).images, name: name, handleItemDefaults: imageDefaults }; diff --git a/src/components/rangeselector/defaults.js b/src/components/rangeselector/defaults.js index 0d8dfbe5ce4..3151b981b4a 100644 --- a/src/components/rangeselector/defaults.js +++ b/src/components/rangeselector/defaults.js @@ -26,7 +26,6 @@ module.exports = function handleDefaults(containerIn, containerOut, layout, coun } var buttons = handleArrayContainerDefaults(selectorIn, selectorOut, { - fromTemplate: (selectorOut._template || {}).buttons, name: 'buttons', handleItemDefaults: buttonDefaults, calendar: calendar diff --git a/src/components/shapes/defaults.js b/src/components/shapes/defaults.js index ac3a0f89304..d11ee8eb604 100644 --- a/src/components/shapes/defaults.js +++ b/src/components/shapes/defaults.js @@ -19,7 +19,6 @@ var helpers = require('./helpers'); module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { handleArrayContainerDefaults(layoutIn, layoutOut, { - fromTemplate: (layoutOut._template || {}).shapes, name: 'shapes', handleItemDefaults: handleShapeDefaults }); diff --git a/src/components/sliders/defaults.js b/src/components/sliders/defaults.js index d5e196a2e72..1411c2e16b2 100644 --- a/src/components/sliders/defaults.js +++ b/src/components/sliders/defaults.js @@ -20,7 +20,6 @@ var stepAttrs = attributes.steps; module.exports = function slidersDefaults(layoutIn, layoutOut) { handleArrayContainerDefaults(layoutIn, layoutOut, { - fromTemplate: (layoutOut._template || {}).sliders, name: name, handleItemDefaults: sliderDefaults }); @@ -32,7 +31,6 @@ function sliderDefaults(sliderIn, sliderOut, layoutOut) { } var steps = handleArrayContainerDefaults(sliderIn, sliderOut, { - fromTemplate: (layoutOut._template || {}).steps, name: 'steps', handleItemDefaults: stepDefaults }); diff --git a/src/components/updatemenus/defaults.js b/src/components/updatemenus/defaults.js index a868bf265a2..4b3712b776e 100644 --- a/src/components/updatemenus/defaults.js +++ b/src/components/updatemenus/defaults.js @@ -20,7 +20,6 @@ var buttonAttrs = attributes.buttons; module.exports = function updateMenusDefaults(layoutIn, layoutOut) { var opts = { - fromTemplate: (layoutOut._template || {}).updatemenus, name: name, handleItemDefaults: menuDefaults }; @@ -34,7 +33,6 @@ function menuDefaults(menuIn, menuOut, layoutOut) { } var buttons = handleArrayContainerDefaults(menuIn, menuOut, { - fromTemplate: (layoutOut._template || {}).buttons, name: 'buttons', handleItemDefaults: buttonDefaults }); diff --git a/src/plots/mapbox/layout_defaults.js b/src/plots/mapbox/layout_defaults.js index 981421e0413..7aed4eeef20 100644 --- a/src/plots/mapbox/layout_defaults.js +++ b/src/plots/mapbox/layout_defaults.js @@ -35,7 +35,6 @@ function handleDefaults(containerIn, containerOut, coerce, opts) { coerce('pitch'); handleArrayContainerDefaults(containerIn, containerOut, { - fromTemplate: (containerOut._template || {}).layers, name: 'layers', handleItemDefaults: handleLayerDefaults }); From e350dd085725b6c4d15f80ffb9a549343683a3a2 Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 23 Mar 2020 12:22:01 -0400 Subject: [PATCH 5/7] no need to provide extra link to template - should provide name --- src/plots/array_container_defaults.js | 2 +- src/plots/cartesian/axis_defaults.js | 1 - src/plots/cartesian/tick_label_defaults.js | 1 - test/jasmine/tests/axes_test.js | 2 ++ 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plots/array_container_defaults.js b/src/plots/array_container_defaults.js index f03c5253f98..5f258544309 100644 --- a/src/plots/array_container_defaults.js +++ b/src/plots/array_container_defaults.js @@ -48,7 +48,7 @@ module.exports = function handleArrayContainerDefaults(parentObjIn, parentObjOut var previousContOut = parentObjOut[name]; - var contIn = Lib.isArrayOrTypedArray(parentObjIn[name]) ? parentObjIn[name] : (opts.fromTemplate || []); + var contIn = Lib.isArrayOrTypedArray(parentObjIn[name]) ? parentObjIn[name] : []; var contOut = parentObjOut[name] = []; var templater = Template.arrayTemplater(parentObjOut, name, inclusionAttr); var i, itemOut; diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index d08daeec239..04a38ae799f 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -130,7 +130,6 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, if(Array.isArray(rangebreaks) && rangebreaks.length) { handleArrayContainerDefaults(containerIn, containerOut, { - fromTemplate: fromTemplate, name: 'rangebreaks', inclusionAttr: 'enabled', handleItemDefaults: rangebreaksDefaults diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index bf26dcacaef..bac7c80387e 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -64,7 +64,6 @@ function handleOtherDefaults(containerIn, containerOut, coerce, axType, options) if(Array.isArray(tickformatStops) && tickformatStops.length) { handleArrayContainerDefaults(containerIn, containerOut, { - fromTemplate: fromTemplate, name: 'tickformatstops', inclusionAttr: 'enabled', handleItemDefaults: tickformatstopDefaults diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 43662ec3ee4..94887094815 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5433,9 +5433,11 @@ describe('Test template:', function() { xaxis: { type: 'date', rangebreaks: [{ + name: 'name1', // N.B. should provide name bounds: ['sat', 'mon'] }], tickformatstops: [{ + name: 'name2', // N.B. should provide name enabled: true, dtickrange: [1000, 60000], value: '%H:%M:%S s' From 2494c4e1ad8718bcd4e23d559e3caa0509162a44 Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 24 Mar 2020 15:03:38 -0400 Subject: [PATCH 6/7] use containerOut._template for axis template --- src/plots/cartesian/axis_defaults.js | 6 +++--- src/plots/cartesian/layout_defaults.js | 12 ------------ src/plots/cartesian/tick_label_defaults.js | 5 +++-- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index 04a38ae799f..aab6fc9d6b5 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -51,7 +51,8 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, var visible = coerce('visible', !options.visibleDflt); - var axType = containerOut.type || options.axTemplate.type || '-'; + var axTemplate = containerOut._template || {}; + var axType = containerOut.type || axTemplate.type || '-'; if(axType === 'date') { var handleCalendarDefaults = Registry.getComponentMethod('calendars', 'handleDefaults'); @@ -125,8 +126,7 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, } if(axType === 'date') { - var fromTemplate = (options.axTemplate || {}).rangebreaks; - var rangebreaks = containerIn.rangebreaks || fromTemplate; + var rangebreaks = containerIn.rangebreaks || axTemplate.rangebreaks; if(Array.isArray(rangebreaks) && rangebreaks.length) { handleArrayContainerDefaults(containerIn, containerOut, { diff --git a/src/plots/cartesian/layout_defaults.js b/src/plots/cartesian/layout_defaults.js index 9640509a030..9e163329c7b 100644 --- a/src/plots/cartesian/layout_defaults.js +++ b/src/plots/cartesian/layout_defaults.js @@ -230,13 +230,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { axHasImage[axName] )); - var axTemplate; - if(Lib.isPlainObject(layoutOut._template)) { - axTemplate = layoutOut._template[axLayoutOut._name]; - } - var defaultOptions = { - axTemplate: axTemplate || {}, letter: axLetter, font: layoutOut.font, outerTicks: outerTicks[axName], @@ -301,13 +295,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { axLayoutOut = Template.newContainer(layoutOut, axName, axLetter + 'axis'); newAxLayoutOut(); - var axTemplate2; - if(Lib.isPlainObject(layoutOut._template)) { - axTemplate2 = layoutOut._template[axLayoutOut._name]; - } - var defaultOptions2 = { - axTemplate: axTemplate2 || {}, letter: axLetter, font: layoutOut.font, outerTicks: outerTicks[axName], diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index bac7c80387e..6717b573c9c 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -59,8 +59,9 @@ function handleOtherDefaults(containerIn, containerOut, coerce, axType, options) if(axType !== 'category') { var tickFormat = coerce('tickformat'); - var fromTemplate = (options.axTemplate || {}).tickformatstops; - var tickformatStops = containerIn.tickformatstops || fromTemplate; + + var axTemplate = containerOut._template || {}; + var tickformatStops = containerIn.tickformatstops || axTemplate.tickformatstops; if(Array.isArray(tickformatStops) && tickformatStops.length) { handleArrayContainerDefaults(containerIn, containerOut, { From f824902d0c044d3fcd7342b45efd20461248f6d1 Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 24 Mar 2020 20:24:41 -0400 Subject: [PATCH 7/7] delete empty rangebreaks and tickformatstops after coerce container --- src/plots/cartesian/axis_defaults.js | 17 +++++++++-------- src/plots/cartesian/tick_label_defaults.js | 17 ++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index aab6fc9d6b5..9c7887df813 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -126,14 +126,15 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, } if(axType === 'date') { - var rangebreaks = containerIn.rangebreaks || axTemplate.rangebreaks; - - if(Array.isArray(rangebreaks) && rangebreaks.length) { - handleArrayContainerDefaults(containerIn, containerOut, { - name: 'rangebreaks', - inclusionAttr: 'enabled', - handleItemDefaults: rangebreaksDefaults - }); + handleArrayContainerDefaults(containerIn, containerOut, { + name: 'rangebreaks', + inclusionAttr: 'enabled', + handleItemDefaults: rangebreaksDefaults + }); + + if(!containerOut.rangebreaks.length) { + delete containerOut.rangebreaks; + } else { setConvert(containerOut, layoutOut); if(layoutOut._has('scattergl') || layoutOut._has('splom')) { diff --git a/src/plots/cartesian/tick_label_defaults.js b/src/plots/cartesian/tick_label_defaults.js index 6717b573c9c..ad3a1d166a1 100644 --- a/src/plots/cartesian/tick_label_defaults.js +++ b/src/plots/cartesian/tick_label_defaults.js @@ -60,16 +60,15 @@ function handleOtherDefaults(containerIn, containerOut, coerce, axType, options) if(axType !== 'category') { var tickFormat = coerce('tickformat'); - var axTemplate = containerOut._template || {}; - var tickformatStops = containerIn.tickformatstops || axTemplate.tickformatstops; - - if(Array.isArray(tickformatStops) && tickformatStops.length) { - handleArrayContainerDefaults(containerIn, containerOut, { - name: 'tickformatstops', - inclusionAttr: 'enabled', - handleItemDefaults: tickformatstopDefaults - }); + handleArrayContainerDefaults(containerIn, containerOut, { + name: 'tickformatstops', + inclusionAttr: 'enabled', + handleItemDefaults: tickformatstopDefaults + }); + if(!containerOut.tickformatstops.length) { + delete containerOut.tickformatstops; } + if(!tickFormat && axType !== 'date') { coerce('showexponent', showAttrDflt); coerce('exponentformat');