Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dash Multi-Page App URLs do not always execute in the same order #133

Closed
mjclawar opened this issue Sep 13, 2017 · 15 comments
Closed

Dash Multi-Page App URLs do not always execute in the same order #133

mjclawar opened this issue Sep 13, 2017 · 15 comments

Comments

@mjclawar
Copy link
Contributor

Link/Location/pathname + callbacks issues

It appears that the callbacks driven by pathname from a Location component do not always execute in the same order, leading to behavior like on the https://plot.ly/dash/urls page. Refreshing the urls page quickly and repeatedly leads to one of three cases:

  1. The home Plotly Dash page is displayed
  2. The home Plotly Dash page is flickered and then the URLs page is displayed
  3. The URLs page is displayed.

As a result, trying to have multi-page apps driven by the URL does not work, since callbacks either

  1. Receive the pathname as None (assuming that would map to case 1 above), or
  2. Do not update at all and pathname keeps the old value (assuming that would also map to case 1 above), or
  3. It updates after other callbacks have fired, leading to more requests than necessary (assuming that would map to case 2 above), or
  4. Execute as expected, but less than all of the time.

Example

The Multi-Page App URLs demo app confirms this behavior, as the initial page load keeps a '404' on the page regardless if I directly go to /apps/app1 in the URL bar in Chrome.

I updated the display_page callback in the example to

@app.callback(Output('page-content', 'children'),
              [Input('url', 'pathname')])
def display_page(pathname):
    print(pathname)
    
    if pathname == '/pages/app1':
        return app1.layout
    elif pathname == '/pages/app2':
        return 'hi!'
    else:
        return '404'

This creates this stack trace:

 * Running on http://127.0.0.1:8889/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 246-948-826
127.0.0.1 - - [13/Sep/2017 15:14:49] "GET /apps/app1 HTTP/1.1" 200 -
127.0.0.1 - - [13/Sep/2017 15:14:50] "GET /_dash-layout HTTP/1.1" 200 -
127.0.0.1 - - [13/Sep/2017 15:14:50] "GET /_dash-dependencies HTTP/1.1" 200 -
127.0.0.1 - - [13/Sep/2017 15:14:50] "GET /favicon.ico HTTP/1.1" 200 -
None
127.0.0.1 - - [13/Sep/2017 15:14:50] "POST /_dash-update-component HTTP/1.1" 200 -
/apps/app1
127.0.0.1 - - [13/Sep/2017 15:14:50] "POST /_dash-update-component HTTP/1.1" 200 -

The page just renders 404. When I include a dcc.Link('CHANGE URL', href='/pages/app1') component on the page, and click on that, then it changes to the app1 content.

Am I doing something wrong? I copied the exact project structure for this demo, am also seeing it in other apps I'm working on, and there seems to be a clear issue with the https://plot.ly/dash/urls page.

@cemal01e
Copy link

This PR might be of use to you #70. There may be cases where it makes sense to have each url supported by a different dash object. At the moment I don't think having a one dash instance supporting multiple urls works so well.

@mjclawar
Copy link
Contributor Author

Thanks! Stumbled across that last week, and it definitely is a solution to the multi-page URL issue.

I believe that there still is an issue with the fact that pathname is None on page load, which causes the issue shown at https://plot.ly/dash/urls in my initial issue. The two options that I've seen around this (unless I'm completely missing something obvious) are:

  1. Throw an error when pathname is None, preventing unnecessary computation before the pathname variable updates with the actual pathname from the URL on page load or
  2. Create a default pathname, which prevents errors, but leads to terrible performance if there are many components tied to the URL.

I've gone with option 1, but this creates a mess of 500 (INTERNAL SERVER ERROR) messages in the console, and unnecessarily (however slightly) increases the burden on the server, especially if there are many callbacks dependent on pathname.

The core issue seems to be that pathname is not consistently correct on page load.

@chriddyp
Copy link
Member

@mjclawar Thanks for opening the issue! Here's what's going on here:
1 - Unspecified properties in the app.layout are set to None
2 - When the app loads, it renders the layout and then it fires off all of the callbacks that have inputs and outputs that are visible in the app. In this case, dcc.Location.pathname is None, so that gets fired off.
3 - When the dcc.Location component is rendered, its pathname property is updated to match the URL https://github.com/plotly/dash-core-components/blob/2c7c3c08319c10639eea3b8c00ae12d399eff4c7/src/components/Location.react.js#L13-L19. In doing this, it fires off a callback with it's new pathname property.

We can't actually set the pathname to a string in the app.layout because the app could be loaded from any url. If we set it to /page-2, then the initial callback would be fired with /page-2 even if the user loaded /page-3.

The solution that was taken in the https://plot.ly/dash/urls page and in the dash-docs (https://github.com/plotly/dash-docs/blob/c2c74e718a492217502b03739e39190c359af029/tutorial/run.py#L286-L287) was to load the index page if the pathname was None and "hope" that the user indeed loaded that URL. As you mention, this causes the page to flicker if the URL was wrong (the index content will be loaded on the first callback when pathname=None and the correct page's content will be loaded when dcc.Location component is rendered).

The correct solution would probably be to load either a loading message or an empty string on None:

@app.callback(Output('content', 'children'), [Input('location', 'pathname')])
def update_children(pathname):
    if pathname is None:
        return 'Loading...'
    else:
        return my_content[pathname]

In fact, I'm going to update the dash-docs to do that right now.

At the moment I don't think having a one dash instance supporting multiple urls works so well.

By updating the content in-place with use of the dcc.Link component, Dash apps are able to provide a multi-page app experience without refreshing the entire page - it's extremely fast! Going forward, using dcc.Location and dcc.Link is the method that I "officially recommend".

@mjclawar
Copy link
Contributor Author

mjclawar commented Sep 20, 2017

@chriddyp Appreciate the detailed response.

I understand why pathname is initially None, but it still seems like this should be classified as a bug because the behavior is not consistent. The page does not merely flicker to the index page all the time, in the case of the Dash URLs page. Sometimes it flickers to the index page, then to the URLs page. Sometimes it goes directly to the URLs page. But sometimes (and this is completely undesired behavior), it goes to the index page and stays there. You can still see all of these outcomes it if you refresh the URLs page enough times, although now it has your loading message before all three outcomes 🎉 !

I have used the dcc.Link component and it's phenomenal (in fact this entire project is phenomenal), but only after you get past the initial page load hiccups raised in this issue.

@chriddyp
Copy link
Member

But sometimes (and this is completely undesired behavior), it goes to the index page and stays there.

Hm yeah, this is definitely wrong. I've added a commit to remove the "loading index page no matter what before responding to callback" for the docs in https://github.com/plotly/dash-docs/commit/53f7b51f2ee2c0da788d75f72bb4f4f7d83adc67. We'll see if the issue persists after deployment.

Thanks for being so thorough on this one! We'll get it straightened out 👍

@mjclawar
Copy link
Contributor Author

... and it now appears that your update fixed everything in the above comment. Cool!

So is the best way to approach the pathname being None to just have handlers for initial load that handle a None and return properly-formatted empty data? I'm trying to think about how we scale this without throwing "number of callbacks" errors for callbacks that depend on pathname (what I'm doing right now), since the other alternative is to submit a bunch of unnecessary queries. It just seems like a ton of traffic on page load for a responsive app after pathname updates, but not seeing a way around it given your explanation above.

@chriddyp
Copy link
Member

reloading-index-page

Yikes, that didn't really help. Sometimes it flickers back to nothing. OK, I see what you mean now with things getting called "out of order". None should only be passed first and only once. It looks like it's getting passed in multiple times.

Looks like this is going to require a deeper investigation. I'll look into it and update this thread with any progress. Thanks again for reporting!

@mjclawar
Copy link
Contributor Author

Crossed comment paths. Just found that bug. Glad we're seeing the same thing! Thanks for checking into it.

@chriddyp
Copy link
Member

It just seems like a ton of traffic on page load for a responsive app after pathname updates, but not seeing a way around it given your explanation above.

If this works the way it is supposed to, then there should only be 1 extra / unnecessary API call: the first callback with pathname=None. In the grand scheme of things, this shouldn't be a issue given that the requests and responses JSON payloads are going to be extremely tiny (the request is something like {payload: {inputs: [{id: 'location', 'prop': 'pathname', 'value': null}], outputs: [{id: 'content', 'prop': 'children'}]} and the response is just something like {'id': 'location', 'prop': 'pathname', 'value': ''}) . However, it is certainly confusing and idiosyncratic. I don't see a good way around it given the current architecture.

For now, I'll look into getting this to work the way it is supposed to 😅

@chriddyp
Copy link
Member

@mjclawar - I'm looking into fixing this today although I can't seem to reproduce it locally.

Here is the example that I'm using:

import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html

import time

app = dash.Dash()
server = app.server

app.layout = html.Div([
    dcc.Location(id='location'),
    html.Div(id='content')
])


@app.callback(
    Output('content', 'children'),
    [Input('location', 'pathname')])
def display(path):
    print(path)
    if path is None:
        return ''
    elif path == '/':
        return 'index'
    else:
        return html.H3(path)


if __name__ == '__main__':
    app.run_server(debug=True, threaded=True)

Every time that I refresh the page, the callback gets called with: None and then page-1 (or w/e the pathname is). This is "as expected". I can't replicate the issue where it goes from None to page-1 and then back to None.

urls

I have also tried running the docs locally and making the change from #133 (comment) locally and I still can't replicate it.

Are you able to reliably replicate the bug in your examples?

Thanks for the help!

@chriddyp
Copy link
Member

Nevermind, I'm able to reproduce the issue now:

import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html

import time

app = dash.Dash()
server = app.server
server.secret_key = 'test'


app.layout = html.Div([
    dcc.Location(id='location'),
    html.Div(id='content')
])


@app.callback(
    Output('content', 'children'),
    [Input('location', 'pathname')])
def display(path):
    print(path)
    if path is None:
        time.sleep(3)
        return ''
    elif path == '/':
        return 'index'
    else:
        return html.H3(path)


if __name__ == '__main__':
    app.run_server(debug=True, threaded=True)

The issue occurs when the intial request with pathname=None takes longer than the follow up request with pathname='/page-1'. While dash initiates the requests in order, it looks like we aren't doing a good job of dealing with request responses that come back out of order

@mjclawar
Copy link
Contributor Author

So this is a deeper problem than just a bug. Although arguably one that Dash is not really responsible for handling.
It would be nice if there were a fix for the dcc.Location component where it could be initialized on the client side as something other than None based on, e.g., the url from the page if there were not a default pathname passed in on the server side. That (selfishly) effectively patches all the inconsistency problems I am having with it! 😄

chriddyp added a commit to plotly/dash-renderer that referenced this issue Sep 27, 2017
this test demonstrates the issue found in
plotly/dash#133 (comment)
@chriddyp
Copy link
Member

chriddyp commented Sep 27, 2017

Although arguably one that Dash is not really responsible for handling.

Actually, I think we're doing the wrong thing in dash front-end by overwriting an output component with an old request. What we should be doing is rejecting old request's responses if a new request's response has already updated the output component.

I've added a test and a fix in plotly/dash-renderer#22. You can try it out on the prerelease channel with

pip install dash-renderer==0.11.0rc4  # or whatever is the latest, see comments in https://github.com/plotly/dash-renderer/pull/22

I've also updated the dash-docs with this new version to test it out in a production environment. So far, so good :)
url-fix

I'll officially close this issue once the fix is on the stable channel at 0.11.0.

@chriddyp
Copy link
Member

Fixed in dash-renderer==0.11.0 🎉

@anthonymobile
Copy link

anthonymobile commented Mar 29, 2020

i just had this exact problem trying to build a similar url-based routing. this solution worked for me after trying every possible if-then, and try-except combination possible to trap the NoneType error. this bug appears to still be there. (active_route refers to a bus route, not an url route)

@app.callback(
        Output("page-content", "children"),
        [Input("url", "pathname")])
def display_page(pathname):

    if pathname is None:
        return 'Loading...'
    elif pathname == '/':
        active_route='87'
        return create_layout(app, routes, active_route)
    else:
        active_route=(pathname[1:])
        return create_layout(app, routes, active_route)

HammadTheOne pushed a commit to HammadTheOne/dash that referenced this issue May 22, 2021
HammadTheOne pushed a commit to HammadTheOne/dash that referenced this issue May 28, 2021
HammadTheOne pushed a commit to HammadTheOne/dash that referenced this issue May 28, 2021
* 3.1 props refactoring (plotly#106)

* refactor virtualization, virtualization settings, and derived props

* refactor renaming paging / pagination props

* refactor virtual, viewport and pagination into adapters

* isolate derived props

* build update

* fix regression

* improve typing

* fix test regression

* simplify pagination adapter / refactor

* lint

* clean up unused props

* - change factory
- clean up props / build update

* fix lint

* bump version

* add dash level props for virtual_dataframe

* refactor fp / derived props

* derived props

* refactor viewport and virtual controlled props

* fix fp regression

* fix fp regression

* refactor controlled table / table fp

* controlled table purecomponent

* fix test (rebrake it!)

* fix selection regression for be paging/sorting/filtering

* improve re-renders & controlled props

* fix test regressions

* update inner-selection fixture

* remove useless spy

* - fix pr comment
- fix for IE/Edge

* clean up

* 3.0 clean offsets (plotly#110)

* refactor virtualization, virtualization settings, and derived props

* refactor renaming paging / pagination props

* refactor virtual, viewport and pagination into adapters

* isolate derived props

* build update

* fix regression

* improve typing

* fix test regression

* simplify pagination adapter / refactor

* lint

* clean up unused props

* - change factory
- clean up props / build update

* fix lint

* bump version

* add dash level props for virtual_dataframe

* cleaup offsets

* triad validation

* - define external facing classes and attributes

* fix regression, update build

* fix test regression (invalid props)

* update test name

* refactor fp / derived props

* derived props

* refactor viewport and virtual controlled props

* fix fp regression

* fix fp regression

* refactor controlled table / table fp

* controlled table purecomponent

* fix test (rebrake it!)

* fix selection regression for be paging/sorting/filtering

* improve re-renders & controlled props

* fix test regressions

* update inner-selection fixture

* remove useless spy

* - control columns into visible columns
- cleanup "hidden" conditional processing

* update changelog

* clean up header factory

* apply style on first controlled table render

* typo/merge miss

* derived visible columns

* - visual tests for hidden columns

* rename functions

* - fix dropdown styling regression

* lint

* 3.1 props fixes (plotly#112)

* props fixes

* update changelog

* bump version

* filter typing

* Update derivedViewport_test.ts

Add basic viewport test with |df| > page_size

* ☝️ 3 new review / documentation / target apps

see discussion in plotly/dash-table#108

* 🙈 forgot file

* 📝 incorporate @cldougl suggestions 🙇

* 3.1 refactor tests (plotly#113)

* props fixes

* update changelog

* bump version

* filter typing

* - delete unused usage files
- restructure tests folder

* - separate cypress and visual tests into 2 ci jobs

* - build before tests!

* add browsers to the node image for visual-test

* 💯 add percent examples

* 📝 title/example clarification

* reformat sizing test app for failing tests (plotly#125)

* Removed .only from dash_test.ts

* Production build instead of dev 🙈

* Fix failing tests

* 3.1 refactor cells rendering (plotly#123)

* WIP
- memoize cell event handlers as derived values
- isolate cell event handlers

* wip
- attempt to isolate cell logic from input logic for individual datum

* wip
- celan up cell wrapper
- isolate input logic a bit more

* further down the rabbit hole..
- separating operation cells from content

* fix dropdown navigation regression

* fix selected row regression

* renaming / restructuring

* rename/restructure

* - clean up zipping
- separate wrappers from styles

* rework style/ast cache

* clean up

* clean up

* build update

* improve rendering perf

* optimize wrappers generation

* build config

* - fix typing regression
- fix rendering perf regression

* - fix navigation regression

* simplify slightly the derived props / ui

* fix copy/paste regressions

* clean up wrapper props

* clean up

* fix regression on conditional dropdowns

* wip, fp the headers

* fp content, wrappers, labels, indices from header factory

* fix regressions

* fp the table itself

* fix typing and behavior for table fp

* fix sorting icon regression

* fix regression

* regression

* fix column name regression with only 1 header row

* fix header actions regression

* fix style application on mount

* fix regression edit cell in n-th page

* fix editing on non-first page (continued)

* fix test

* 3.1 issue118 width behavior (plotly#130)

* WIP
- memoize cell event handlers as derived values
- isolate cell event handlers

* wip
- attempt to isolate cell logic from input logic for individual datum

* wip
- celan up cell wrapper
- isolate input logic a bit more

* further down the rabbit hole..
- separating operation cells from content

* fix dropdown navigation regression

* fix selected row regression

* renaming / restructuring

* rename/restructure

* - clean up zipping
- separate wrappers from styles

* rework style/ast cache

* clean up

* clean up

* build update

* improve rendering perf

* optimize wrappers generation

* build config

* - fix typing regression
- fix rendering perf regression

* - fix navigation regression

* simplify slightly the derived props / ui

* fix copy/paste regressions

* clean up wrapper props

* clean up

* fix regression on conditional dropdowns

* wip, fp the headers

* fp content, wrappers, labels, indices from header factory

* fix regressions

* fp the table itself

* fix typing and behavior for table fp

* fix sorting icon regression

* fix regression

* regression

* fix column name regression with only 1 header row

* fix header actions regression

* add width percentage support + content_style

* fix style application on mount

* fix visual regression with empty df

* only apply row style when necessary

* fix tab test (no offset)

* clean up header styling

* use dash-* classes

* support default column width (override input behavior)

* fix regression edit cell in n-th page

* fix editing on non-first page (continued)

* fix test

* fit to content behavior

* fix regressions

* fix lint

* add column width visual tests

* fix dropdown minimum size when using default width

* sizing examples

* black

* fix navigation test regression

* fix regressions in visual tests

* default column width - fix dropdown width eval

* default width columns
- fix width when first content row is search filter

* percy - add delay before screenshot (attempt to fix FF visual tests)

* debugging selenium

* fix black

* debug selenium

* debug selenium

* fix black

* debug selenium

* debug selenium

* debug selenium

* undo all selenium modifications

* default column width
- filter inputs behave like cell inputs (do not affect width)

* - fixed rows+columns height evaluated correctly

* remove dead code

* remove .only from tests

* add data-dash-column to filter cells

* styling examples (plotly#117)

* 🌈 styling examples

examples that represent of the level of customization that we need in
dash-table. The examples are implemented with HTML tables to
demonstrate the intended behaviour.

I’d like to see each of these examples implemented with the
`dash_table` syntax. We’ll use these examples as our `dash-table`
documentation

* ❌ removing black and pylint

this keeps tripping us up and I don’t think it’s worth the pain right
now.

* Backend examples (plotly#119)

* 🏭 backend computed data usage examples

* 📊 tying it together w a graph

* ❓ not sure what `displayed_pages` does?

* Dropdown usage examples (plotly#120)

* ⬇️ dropdown usage examples

* add conditional dropdown example
HammadTheOne pushed a commit that referenced this issue Jul 23, 2021
* 3.1 props refactoring (#106)

* refactor virtualization, virtualization settings, and derived props

* refactor renaming paging / pagination props

* refactor virtual, viewport and pagination into adapters

* isolate derived props

* build update

* fix regression

* improve typing

* fix test regression

* simplify pagination adapter / refactor

* lint

* clean up unused props

* - change factory
- clean up props / build update

* fix lint

* bump version

* add dash level props for virtual_dataframe

* refactor fp / derived props

* derived props

* refactor viewport and virtual controlled props

* fix fp regression

* fix fp regression

* refactor controlled table / table fp

* controlled table purecomponent

* fix test (rebrake it!)

* fix selection regression for be paging/sorting/filtering

* improve re-renders & controlled props

* fix test regressions

* update inner-selection fixture

* remove useless spy

* - fix pr comment
- fix for IE/Edge

* clean up

* 3.0 clean offsets (#110)

* refactor virtualization, virtualization settings, and derived props

* refactor renaming paging / pagination props

* refactor virtual, viewport and pagination into adapters

* isolate derived props

* build update

* fix regression

* improve typing

* fix test regression

* simplify pagination adapter / refactor

* lint

* clean up unused props

* - change factory
- clean up props / build update

* fix lint

* bump version

* add dash level props for virtual_dataframe

* cleaup offsets

* triad validation

* - define external facing classes and attributes

* fix regression, update build

* fix test regression (invalid props)

* update test name

* refactor fp / derived props

* derived props

* refactor viewport and virtual controlled props

* fix fp regression

* fix fp regression

* refactor controlled table / table fp

* controlled table purecomponent

* fix test (rebrake it!)

* fix selection regression for be paging/sorting/filtering

* improve re-renders & controlled props

* fix test regressions

* update inner-selection fixture

* remove useless spy

* - control columns into visible columns
- cleanup "hidden" conditional processing

* update changelog

* clean up header factory

* apply style on first controlled table render

* typo/merge miss

* derived visible columns

* - visual tests for hidden columns

* rename functions

* - fix dropdown styling regression

* lint

* 3.1 props fixes (#112)

* props fixes

* update changelog

* bump version

* filter typing

* Update derivedViewport_test.ts

Add basic viewport test with |df| > page_size

* ☝️ 3 new review / documentation / target apps

see discussion in plotly/dash-table#108

* 🙈 forgot file

* 📝 incorporate @cldougl suggestions 🙇

* 3.1 refactor tests (#113)

* props fixes

* update changelog

* bump version

* filter typing

* - delete unused usage files
- restructure tests folder

* - separate cypress and visual tests into 2 ci jobs

* - build before tests!

* add browsers to the node image for visual-test

* 💯 add percent examples

* 📝 title/example clarification

* reformat sizing test app for failing tests (#125)

* Removed .only from dash_test.ts

* Production build instead of dev 🙈

* Fix failing tests

* 3.1 refactor cells rendering (#123)

* WIP
- memoize cell event handlers as derived values
- isolate cell event handlers

* wip
- attempt to isolate cell logic from input logic for individual datum

* wip
- celan up cell wrapper
- isolate input logic a bit more

* further down the rabbit hole..
- separating operation cells from content

* fix dropdown navigation regression

* fix selected row regression

* renaming / restructuring

* rename/restructure

* - clean up zipping
- separate wrappers from styles

* rework style/ast cache

* clean up

* clean up

* build update

* improve rendering perf

* optimize wrappers generation

* build config

* - fix typing regression
- fix rendering perf regression

* - fix navigation regression

* simplify slightly the derived props / ui

* fix copy/paste regressions

* clean up wrapper props

* clean up

* fix regression on conditional dropdowns

* wip, fp the headers

* fp content, wrappers, labels, indices from header factory

* fix regressions

* fp the table itself

* fix typing and behavior for table fp

* fix sorting icon regression

* fix regression

* regression

* fix column name regression with only 1 header row

* fix header actions regression

* fix style application on mount

* fix regression edit cell in n-th page

* fix editing on non-first page (continued)

* fix test

* 3.1 issue118 width behavior (#130)

* WIP
- memoize cell event handlers as derived values
- isolate cell event handlers

* wip
- attempt to isolate cell logic from input logic for individual datum

* wip
- celan up cell wrapper
- isolate input logic a bit more

* further down the rabbit hole..
- separating operation cells from content

* fix dropdown navigation regression

* fix selected row regression

* renaming / restructuring

* rename/restructure

* - clean up zipping
- separate wrappers from styles

* rework style/ast cache

* clean up

* clean up

* build update

* improve rendering perf

* optimize wrappers generation

* build config

* - fix typing regression
- fix rendering perf regression

* - fix navigation regression

* simplify slightly the derived props / ui

* fix copy/paste regressions

* clean up wrapper props

* clean up

* fix regression on conditional dropdowns

* wip, fp the headers

* fp content, wrappers, labels, indices from header factory

* fix regressions

* fp the table itself

* fix typing and behavior for table fp

* fix sorting icon regression

* fix regression

* regression

* fix column name regression with only 1 header row

* fix header actions regression

* add width percentage support + content_style

* fix style application on mount

* fix visual regression with empty df

* only apply row style when necessary

* fix tab test (no offset)

* clean up header styling

* use dash-* classes

* support default column width (override input behavior)

* fix regression edit cell in n-th page

* fix editing on non-first page (continued)

* fix test

* fit to content behavior

* fix regressions

* fix lint

* add column width visual tests

* fix dropdown minimum size when using default width

* sizing examples

* black

* fix navigation test regression

* fix regressions in visual tests

* default column width - fix dropdown width eval

* default width columns
- fix width when first content row is search filter

* percy - add delay before screenshot (attempt to fix FF visual tests)

* debugging selenium

* fix black

* debug selenium

* debug selenium

* fix black

* debug selenium

* debug selenium

* debug selenium

* undo all selenium modifications

* default column width
- filter inputs behave like cell inputs (do not affect width)

* - fixed rows+columns height evaluated correctly

* remove dead code

* remove .only from tests

* add data-dash-column to filter cells

* styling examples (#117)

* 🌈 styling examples

examples that represent of the level of customization that we need in
dash-table. The examples are implemented with HTML tables to
demonstrate the intended behaviour.

I’d like to see each of these examples implemented with the
`dash_table` syntax. We’ll use these examples as our `dash-table`
documentation

* ❌ removing black and pylint

this keeps tripping us up and I don’t think it’s worth the pain right
now.

* Backend examples (#119)

* 🏭 backend computed data usage examples

* 📊 tying it together w a graph

* ❓ not sure what `displayed_pages` does?

* Dropdown usage examples (#120)

* ⬇️ dropdown usage examples

* add conditional dropdown example
HammadTheOne pushed a commit that referenced this issue Jul 23, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants