Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Tabs and Tab component bug-fixes by valentijnnieman · Pull Request #267 · plotly/dash-core-components · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Tabs and Tab component bug-fixes by valentijnnieman · Pull Request #267 · plotly/dash-core-components · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Tabs and Tab component bug-fixes by valentijnnieman · Pull Request #267 · plotly/dash-core-components · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Tabs and Tab component bug-fixes by valentijnnieman · Pull Request #267 · plotly/dash-core-components · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Tabs and Tab component bug-fixes by valentijnnieman · Pull Request #267 · plotly/dash-core-components · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Tabs and Tab component bug-fixes by valentijnnieman · Pull Request #267 · plotly/dash-core-components · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Tabs and Tab component bug-fixes by valentijnnieman · Pull Request #267 · plotly/dash-core-components · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Tabs and Tab component bug-fixes - #267

Merged
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children
Aug 22, 2018
Merged

Tabs and Tab component bug-fixes#267
valentijnnieman merged 13 commits into
masterfrom
265-tabs-without-children

Conversation

@valentijnnieman

@valentijnniemanvalentijnnieman commented Aug 17, 2018

Copy link
Copy Markdown
Contributor

This fixes the bug where the Tabs component breaks if no children props are set. This should fix#265 too.

It also fixes the bug where the 2nd tab was selected by default - #262

(Sorry, I had some trouble with my commits, it looks a bit wonky)

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

It looks like this is the issue with the committed bundle files: https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it

@valentijnniemanvalentijnnieman changed the title Prevent Tabs from breaking if there are no props.children set on it[WIP] Tabs and Tab component bug-fixesAug 17, 2018
@valentijnniemanvalentijnnieman changed the title [WIP] Tabs and Tab component bug-fixesTabs and Tab component bug-fixesAug 17, 2018
@radekwlsk

Copy link
Copy Markdown

Any ETA on new version merging those fixes?

T4rk1n
T4rk1n previously requested changes Aug 22, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have rebased instead of regenerating all the components. Fix the indentation.

Comment threadsrc/components/Tabs.react.js Outdated
@@ -124,53 +124,62 @@ export default class Tabs extends Component {
}
render() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The indentation is 2 space while the rest of the components is 4 spaces.

Comment threadtest/test_integration.py Outdated
time.sleep(2)
self.assertEqual(tabs_content.text, 'Test content 1')


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡️ Only one space between methods in classes.

self.assertEqual(tabs_content.text, 'Test content 1')


def test_tabs_with_children_undefined(self):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐅 I think this test could be improved, right now it doesn't do much. Maybe add the tabs in a callback triggered by a button ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test tests if a Tabs component still renders even if children is undefined. Previously, if children was not set, it would break, thus throwing an error, and thus failing this test. This PR fixes #265 as mentioned above.

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing ;

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@T4rk1n What good would rebasing have done in this case? I'm seeing a change in end-of-line characters, when I rebuild the Tabs component it automatically rebuild all of the other components because the end-of-line characters where different (see link https://unix.stackexchange.com/questions/32001/what-is-m-and-how-do-i-get-rid-of-it)

@T4rk1n

Copy link
Copy Markdown
Contributor

@valentijnnieman Your right. it put the ^M in the docstrings, probably from when I generated the classes, git doesn't replace the newline in strings automatically.

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommending some more style changes 🐄

Repeating my 'outdated' comment:

Technically we should be using semicolons.
Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
}

const amountOfTabs = this.props.children.length
const amountOfTabs = this.props.children.length

@wbrgsswbrgssAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, technically we should be using semicolons.

Many more missing -- too many to mention in a review. I recommend adding
/*eslint semi: ["error", "always"]*/
to the top of this file and linting again to catch them

Comment threadsrc/components/Tabs.react.js Outdated
this.props.children = [this.props.children];
}
if(this.props.children) {
if (!Array.isArray(this.props.children)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some inconsistency here (R.is(Array, foo) is used above here). Apparently there's also the undocumentedR.isArray.

@valentijnnieman

Copy link
Copy Markdown
ContributorAuthor

@wbrgss That's why we have .eslintrc :-) we'll update the tooling eventually to auto-format, (#274) but for now I don't want to spend time chasing down missing semi-colons and preventing these important fixes from being released. I'm pretty sure that the latest changes (where I ran Prettier) already caught everything by the way!

@wbrgsswbrgss left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃 from me

@T4rk1n

Copy link
Copy Markdown
Contributor

💃

@valentijnnieman
valentijnnieman merged commit 26b2c62 into masterAug 22, 2018
@valentijnnieman
valentijnnieman deleted the 265-tabs-without-children branch August 22, 2018 21:59
@renanxcortes

renanxcortes commented Sep 7, 2018

Copy link
Copy Markdown

Hi! I deployed a Dash app some weeks ago and everything went okay and worked properly with the tabs, but now I ran the exactly the same code, but now I have to change the tabs whenever I want to update the callback. Do you know what might be happening? Does this PR was supposed to fix this? I`ve looked on #265 also but it didn't solve :(

My layout code is:

app.layout = html.Div(
html.Div([ html.Div([
html.H1(children='Web STARS', style={'textAlign': 'center'}),
html.H2(children='A web-based version of Space-Time Analysis of Regional Systems',
style={'textAlign': 'center'}),
dcc.Tabs(id="tabs", style = {'textAlign': 'center', 'backgroundColor':'lightblue',
#'width': '75%'
},
children=[
dcc.Tab(label='Presentation', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.H3(children='This is a beta-version of some functions of STARS using Dash from plotly.', style={'textAlign': 'center',
'margin-top': '60', 'font-size': '110%'}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_stars.decode()), style={'width': '150px',
'margin-left': 700}),
html.Img(src='data:image/png;base64,{}'.format(encoded_image_plotly.decode()), style={'width': '150px',
'margin-left': 700}) ]),
dcc.Tab(label='Spatiotemporal Overview', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
# html.Div([ # dcc.Checklist(
# id='auto-check',
# options=[{'label': ' Time Travel Animation ', 'value': 'auto'}],
# values=[],
# ),
# ], style={'padding-top': '200px', 'display': 'inline-block', 'float': 'left'}),
# html.Div([
html.P('Select the Year:', style={'margin-top': '5', 'font-size': '150%', 'font-weight': 'bold',
'textAlign': 'center'}),
dcc.Slider(
id='years-slider',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
), dcc.Interval(
id='interval-event',
interval=24*60*60*1000,
n_intervals=0
),
html.P('Select the Variable to analyze:', style={'margin-top': '35', 'font-size': '150%', 'font-weight': 'bold'}), dcc.RadioItems(
id='type_data_selector',
options=[
{'label': 'Per Capita Relative Ratio (PCR)', 'value': 'pcr'},
{'label': 'Raw Income Data', 'value': 'raw'}
],
value='pcr',
style={'margin-top': '0', 'font-size': '125%'}
),
html.Div([ html.P('Animation:', style={'margin-top': '20', 'font-size': '150%', 'font-weight': 'bold'})
]),
html.Div([
dcc.Checklist(
id='auto-check',
options=[{'label': ' Time Travelling ', 'value': 'auto'}],
values=[],
)]), html.Div([
dcc.Checklist(
id='spatial_travel-check',
options=[{'label': ' Spatial Travelling ', 'value': 'auto'}],
values=[],
)]),
dcc.Interval(
id='spatial_interval-event',
interval=24*60*60*1000,
n_intervals=0
),
], style={'width':1350, 'margin':25, 'float': 'left'}),
html.Div([ html.Div([
dcc.Graph(
id='choropleth-graph'
),
dcc.Graph( # ?dcc.Graph to learn more about the properties
id='timeseries-graph',
clear_on_unhover = 'True' # Sets the slider year when the mouse hover if off the graph
), # dcc.Graph(
# id='timepath-graph'
#),
], className="four columns"), html.Div([ dcc.Graph(
id='scatter-graph'
),
html.P('Change the years below:'),
dcc.Graph(
id='density-graph' ),
html.P('Choose a pair of years for densities:', style = {'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='initial_years_dropdown',
options=years_options,
value='1929'
),
dcc.Dropdown(
id='final_years_dropdown',
options=years_options,
value='2009'
)], className="row"),
# dcc.Graph(
# id='boxplot-graph'
#) ], className="four columns"), html.Div([
dcc.Graph(
id='timepath-graph'
),
dcc.Graph(
id='boxplot-graph'
), ], className="four columns"), ], className="row", style={'width': '100%', 'display': 'inline-block', 'float': 'center'}) ]),
dcc.Tab(label='Rank Paths', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.Div([
html.P('Select the Rank for the Path:', style = {'font-size': '150%', 'margin-top':25, 'font-weight': 'bold'}),
html.Div([
dcc.Dropdown(
id='rankpath_dropdown',
options=ranks_options,
value='1'
)], style = {'margin-left':600,
'margin-right':600,
'margin-top':10}),
html.Div([
html.P('Year Highlighted:', style={'margin-top': '25', 'font-size': '150%', 'font-weight': 'bold'}), dcc.Slider(
id='years-slider-rank-path',
min=min(years),
max=max(years),
value=min(years),
marks={str(year): str(year) for year in years_by_step}
)
], style={'width': '75%', 'margin-left':50,
'margin-right':50,
'textAlign': 'center',
'display':'inline-block'}),
html.Div([ dcc.Graph(
id='rank-path-graph'
)], style = {'margin-left':185,
'margin-right':150,
'margin-top':25})
], className="twelve columns", style={#'width': '75%',
'textAlign': 'center', #'margin-left':150,
#'margin-top':20,
'backgroundColor':'rgb(244, 244, 255)'}) # Or 'lightgray' or look here https://www.w3schools.com/colors/colors_rgb.asp ]),
dcc.Tab(label='Markov and Spatial Markov', style={'font-weight': 'bold', 'font-size': '120%'}, children=[
html.P('Put here the markov features')
])
])
])
], className='ten columns offset-by-one', style = {'backgroundColor':'rgb(244, 244, 255)'})
)

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

issue updating tabs dynamically?

5 participants

@valentijnnieman@radekwlsk@T4rk1n@renanxcortes@wbrgss