This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
35f30f5
run against renderer candidate
Feb 27, 2019
47fa1a7
older chrome version for 3.6
Feb 27, 2019
8ae3db6
3.6.7
Feb 27, 2019
9e3613f
- remove confirm dialog tests
Feb 27, 2019
d053565
fix confirm dialog
Feb 28, 2019
409985f
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 2, 2019
f1a714d
update for renderer "setProps"
Mar 2, 2019
df57e12
bump renderer
Mar 2, 2019
0a0b9ca
fix format
Mar 2, 2019
6a4132e
update tabs / renderer setProps
Mar 3, 2019
e380a6f
tab fragments
Mar 3, 2019
e414421
jest tests
Mar 3, 2019
3fdf0ec
format
Mar 3, 2019
59d8499
fix tests
Mar 3, 2019
23e7dab
Merge remote-tracking branch 'origin/master' into renderer-setprops-2…
Mar 5, 2019
7f44431
.
Mar 5, 2019
c7e3fc8
run against head of renderer-setprops branches
Mar 5, 2019
a28f123
rename dash private props
Mar 5, 2019
f73de52
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
fe2e815
Update config.yml
Marc-Andre-Rivet Mar 8, 2019
6ac1cd7
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 8, 2019
8e7eec9
Update Tabs.test.js
Marc-Andre-Rivet Mar 11, 2019
9eaf8ba
Merge branch 'master' into renderer-setprops-20rc1
Marc-Andre-Rivet Mar 11, 2019
cbbe001
revert tab test change
Mar 11, 2019
4c4e419
clean up confirm dialog
Mar 11, 2019
973a47a
fix format
Mar 11, 2019
eaf4255
improve Tabs test
Mar 11, 2019
cbb33ca
remove redundant test
Mar 11, 2019
d3f877a
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
f0c2434
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
a69306b
Update config.yml
Marc-Andre-Rivet Mar 11, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 166 additions & 43 deletions dash_core_components/dash_core_components.dev.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.dev.js.map

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dash_core_components/dash_core_components.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dash_core_components/dash_core_components.min.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dash_core_components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",

@Marc-Andre-RivetMarc-Andre-RivetMar 5, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

React 16 <Fragment /> polyfill -- gets rid of the wrapper <div /> and allows the same behavior as before -- the extra div could break existing styles or make styling more difficult

"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
Binary file addeddash_renderer-0.20.0rc1.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,6 +73,7 @@
"prettier": "^1.14.2",
"react": "^16.6.1",
"react-dom": "^16.6.1",
"react-dot-fragment": "^0.2.8",
"style-loader": "^0.23.1",
"styled-jsx": "^3.1.1",
"webpack": "^4.25.1",
Expand Down
5 changes: 4 additions & 1 deletion src/components/ConfirmDialog.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ export default class ConfirmDialog extends Component {
this.state = {
displayed: props.displayed,
};
this._update();
}

_setStateAndProps(value) {
Expand DownExpand Up@@ -58,6 +57,10 @@ export default class ConfirmDialog extends Component {
this._update();
}

componentDidMount() {
this._update();
}

render() {
return null;
}
Expand Down
31 changes: 15 additions & 16 deletions src/components/ConfirmDialogProvider.react.js
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import {clone} from 'ramda';
import React from 'react';
import PropTypes from 'prop-types';

Expand DownExpand Up@@ -31,20 +32,18 @@ export default class ConfirmDialogProvider extends React.Component {
const displayed = this.state.displayed;

// Will lose the previous onClick of the child
const wrapClick = child =>
React.cloneElement(child, {
onClick: () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
},
});
const wrapClick = child => {
const props = clone(child.props);
props._dashprivate_layout.props.onClick = () => {
const update = {displayed: true};
this.setState(update);
if (setProps) {
setProps(update);
}
};

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Like before, inserting onClick prop for the real child to use


const realChild = children.props
? children.props.children
: children.map(e => e.props.children);
return React.cloneElement(child, props);
};

return (
<div
Expand All@@ -53,9 +52,9 @@ export default class ConfirmDialogProvider extends React.Component {
(loading_state && loading_state.is_loading) || undefined
}
>
{realChild && realChild.length
? realChild.map(wrapClick)
: wrapClick(realChild)}
{Array.isArray(children)
? children.map(wrapClick)
: wrapClick(children)}
Comment thread
alexcjohnson marked this conversation as resolved.
<ConfirmDialog {...this.props} displayed={displayed} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Tab.react.js
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import Fragment from 'react-dot-fragment';

const Tab = ({children}) => <div>{children}</div>;
const Tab = ({children}) => <Fragment>{children}</Fragment>;

/**
* Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.
Expand Down
11 changes: 5 additions & 6 deletions src/components/Tabs.react.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -204,11 +204,11 @@ export default class Tabs extends Component {
// props we want are lying a bit deeper - which means they
// are coming from Dash
R.isNil(child.props.disabled) &&
child.props.children &&
child.props.children.props
child.props._dashprivate_layout &&
child.props._dashprivate_layout.props
) {
// props are coming from Dash
childProps = child.props.children.props;
childProps = child.props._dashprivate_layout.props;
} else {
// else props are coming from React (Demo.react.js, or Tabs.test.js)
childProps = child.props;
Expand All@@ -222,6 +222,7 @@ export default class Tabs extends Component {
if (childProps.value === this.state.selected) {
selectedTab = child;
}

return (
<EnhancedTab
key={index}
Expand All@@ -247,9 +248,7 @@ export default class Tabs extends Component {
});
}

const selectedTabContent = !R.isNil(selectedTab)
? selectedTab.props.children
: '';
const selectedTabContent = !R.isNil(selectedTab) ? selectedTab : '';

const tabContainerClass = this.props.vertical
? 'tab-container tab-container--vert'
Expand Down
2 changes: 0 additions & 2 deletions test/test_integration.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -1264,8 +1264,6 @@ def on_click(n_clicks):
time.sleep(2)

self.driver.switch_to.alert.accept()
time.sleep(2)
self.driver.switch_to.alert.accept()

def test_empty_graph(self):
app = dash.Dash(__name__)
Expand Down
7 changes: 1 addition & 6 deletions test/unit/Tabs.test.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -177,12 +177,7 @@ describe('Tabs handle Tab selection logic', () => {
});
test('Tab can be clicked and will display its content', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();
expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
test('Tab without value will still be clickable', () => {
tabs.find('[value="tab-2"]').simulate('click');
const renderedContent = tabs.find('.tab-content > div').html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This test is an exact copy of the test above. Looks like copy-paste that was never modified. Removing.

const renderedContent = tabs.find(Tab).html();

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Checking for the Tab component instead of some arbitrary selector

expect(renderedContent).toEqual('<div>Tab 2 child</div>');
});
});
Expand Down