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

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp
, '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" + '
[WIP] Dash dev tools by rmarren1 · Pull Request #64 · plotly/dash-renderer · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp
, '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('^' + ".*" + ' [WIP] Dash dev tools by rmarren1 · Pull Request #64 · plotly/dash-renderer · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp
, '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('^' + ".*" + ' [WIP] Dash dev tools by rmarren1 · Pull Request #64 · plotly/dash-renderer · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp
, '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" + ' [WIP] Dash dev tools by rmarren1 · Pull Request #64 · plotly/dash-renderer · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp
, '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('^' + ".*" + ' [WIP] Dash dev tools by rmarren1 · Pull Request #64 · plotly/dash-renderer · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp
, '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('^' + ".*" + ' [WIP] Dash dev tools by rmarren1 · Pull Request #64 · plotly/dash-renderer · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp
, '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); } })(); })(); [WIP] Dash dev tools by rmarren1 · Pull Request #64 · plotly/dash-renderer · GitHub
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

[WIP] Dash dev tools - #64

Closed
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools
Closed

[WIP] Dash dev tools#64
rmarren1 wants to merge 35 commits into
plotly:masterfrom
rmarren1:dash-dev-tools

Conversation

@rmarren1

@rmarren1rmarren1 commented Jul 29, 2018

Copy link
Copy Markdown
Contributor

Release Candidate: pip install dash-renderer==0.14.0rc7
In this PR, we change the Dash app layout from something like:

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<div id="_dash-app-content">
...
<SomeDashComponent />
...
</div>
</div>

To the following

<div id="react-entry-point">
<div id="_dash-undo-redo">...</div>
<GlobalErrorContainer>
<GlobalErrorOverlay>
<div id="_dash-app-content">
...
<ComponentErrorBoundary>
<SomeDashComponent /> OR <ComponentErrorOverlay><SomeDashComponent /></ComponentErrorOverlay> OR <ComponentDisabledOverlay><SomeDashComponent /></ComponentDisabledOverlay>
</ ComponentErrorBoundary>
...
</div>
</ GlobalErrorOverlay>
</ GlobalErrorContainer>
</div>

The new components serve the following purposes:

  • GlobalErrorContainer -- Container for the GlobalErrorOverlay, this component connects to the Redux store and passes state and functions down to the GlobalErrorOverlay, and also creates the Werkzueg error pop-up.
  • GlobalErrorOverlay -- This component renders the main Dash app (_dash-app-content) along side a conditionally rendered 'error menu'.
  • ComponentErrorBoundary -- This component wraps each Dash component in the TreeContainer and implements the componentDidCatch lifecycle method to catch errors in those Dash components. If there is an error in the component, a ComponentErrorOverlay component is displayed. If the component must be disabled (this component has a child in the callback graph that has an error) a ComponentDisabledOverlay component is displayed.

This PR also makes an update to the Redux store, adding an error state that looks like the following:

{
...,
error : {
frontEnd: [ { myUID: 'fjdsa89r32',
myID: 'button',
error: <javascript error object>,
info: <javascript info object> } ],
backEnd: { errorPage: "...the html werkzueg page..."}
}
...
}

@rmarren1rmarren1 changed the title Dash dev tools -- frontend[WIP] Dash dev tools -- frontendJul 29, 2018
@rmarren1rmarren1 mentioned this pull request Jul 30, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Looks like you can get the route prefixes from the config like this:

returnrequest[method](`${urlBase(config)}${endpoint}`,body,headers)

anyone know how to actually import the config object? It looks like it is passed down through props to react components, e.g.

const{config}=props;
, but I can't find where it originates.

@T4rk1n

Copy link
Copy Markdown
Contributor

@rmarren1 I think it's in the state

constconfig=getState().config;

Or you can get it directly:

JSON.parse(document.getElementById('_dash-config').textContent)

@rmarren1rmarren1 changed the title [WIP] Dash dev tools -- frontend[WIP] Dash dev toolsAug 10, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Another pre-release at dash-renderer==0.14.0-rc2 with

  • Components covered in red when bugs are encountered, click on component to revert previous interaction and try again
  • Werkzueg error pops out in a separate window and Dash app is covered in red, click button to revert previous interaction and try again

@T4rk1n

Copy link
Copy Markdown
Contributor

I am getting a blank screen when I try it with dash_table_experiments:

This is the console log:

Uncaught TypeError: Cannot read property 'object' of undefined
at bundle.js:7
at Array.forEach (<anonymous>)
at Object.<anonymous> (bundle.js:7)
at t (bundle.js:1)
at Object.<anonymous> (bundle.js:1)
at t (bundle.js:1)
at bundle.js:1
at bundle.js:1
react-dom@16.2.0.production.min.js:162 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
h @ react-dom@16.2.0.production.min.js:162
bundle.js:2 Error: dash_table_experiments was not found.
at Object.resolve (bundle.js:14)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
at Array.map (<anonymous>)
at s (bundle.js:14)
(anonymous) @ bundle.js:2
bundle.js:2 Uncaught (in promise) TypeError: t.text is not a function
at bundle.js:2

Can you do a release candidate with the dev build ?

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Yes I'll do that. Pretty sure that your error is because dash-table-experiments is written using in React 15 syntax, I think the only major difference is here you would need to import PropTypes from 'prop-types'; instead.

@T4rk1n

Copy link
Copy Markdown
Contributor

That make senses.

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

dash-renderer==0.14.0-rc3 is up with dev build and working unpkg link. Should be good as long as all components you are using support react 16 (so far this just means import PropTypes from 'prop-types')

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Requires this PR: #67

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Just came across this: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html

This would make for some annoying errors in tests that try to exactly match the rendered HTML to a string. I think this would affect dash, I'll look at the other repos aswell.

@chriddypchriddyp mentioned this pull request Nov 5, 2018
@valentijnnieman

valentijnnieman commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

Hey @rmarren1 - I'm going to start on #94 soon, and was planning on creating a branch off of this branch. Should we fix the merge conflicts first, i.e. rebase, or is that too much work?

Alternatively, I can branch off of this branch, when I'm done we'll merge my branch into this one, and fix the conflicts later.

@rmarren1rmarren1 mentioned this pull request Nov 25, 2018
@rmarren1

Copy link
Copy Markdown
ContributorAuthor

Continued in #100

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.

4 participants

@rmarren1@T4rk1n@valentijnnieman@chriddyp