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

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp
, '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.

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp
, '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.

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp
, '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.

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp
, '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.

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp
, '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.

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp
, '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.

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp
, '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.

Add loading states and prevent cells from being edited when table is loading. - #484

Merged
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable
Sep 12, 2019
Merged

Add loading states and prevent cells from being edited when table is loading.#484
shammamah-zz merged 18 commits into
masterfrom
loading-states-uneditable

Conversation

@shammamah-zz

@shammamah-zzshammamah-zz commented Jun 28, 2019

Copy link
Copy Markdown
Contributor

Closes#319.

About

  • Added loading state to Table props
  • Disabled editing and copy-paste when data property of Table is loading
  • Added tests

@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:47 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 39a98c4 to 170adb2CompareJune 28, 2019 20:50
@chriddyp
chriddyp temporarily deployed to dash-table-review-pr-484 June 28, 2019 20:51 Inactive
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from e027042 to e1cb857CompareJuly 24, 2019 17:44
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from ecaf7d2 to f866ceeCompareAugust 26, 2019 18:00

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Few comments below for the handling of onChange and cell content.

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This approach is good to handle doubleClick but will cause unexpected behavior with onChange.

As implemented, a user could do the following steps:

  1. select a cell and edit it, triggering a callback
  2. while the callback executes, a new cell is selected for editing
  3. the user enters a new value and submits it
  4. the value resets to the original value in the cell

This behavior would be surprising. Better to prevent the user from editing the cell content altogether.

The table cells are generated in two steps, one step that does not take user interactions into consideration and one that does:

  1. a "partial" generation that does not take into account the active cells, (loading_state), etc. (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L67)

  2. a "final" generation that edits the result of step 1 (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L92)

I think this "final" generation step is where we would want to take the loading_state into consideration.

The getContent method below would need to be able to take loading_state into consideration for this case, to override column.editable (https://github.com/plotly/dash-table/blob/master/src/dash-table/derived/cell/contents.tsx#L128)

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.

Changes made in 60c952f and fc77aec.

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 should also cover the copy/paste use case, if I understand correctly)

const realIdx = virtualized.indices[idx];

if (!c.editable) {
if (!c.editable || loading_state && loading_state.is_loading) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state && loading_state.is_loading

Listening for all loading_states works but I wonder if we could limit ourselves to a subset of all props. Is there anything besides data that really impacts editing?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Playing with this, I realized there was a bug for loading_state and multi output: plotly/dash#893

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 865885a to 0443f25CompareSeptember 9, 2019 15:50
@shammamah-zz
shammamah-zz marked this pull request as ready for review September 9, 2019 15:52
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 0443f25 to 1ec4b98CompareSeptember 9, 2019 16:19
Comment threadsrc/dash-table/components/CellFactory.tsx Outdated
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 7a29749 to 5b88a69CompareSeptember 10, 2019 16:09
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch 3 times, most recently from b712269 to 955e040CompareSeptember 11, 2019 19:43

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • Waiting for 🌴 for evaluated loading_state.
  • This will require a follow up PR in dash-docs, at least to explain the table behavior and what triggers it.
  • Add changelog entry

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 5822a41 to 8dd3fe6CompareSeptember 11, 2019 21:15
Shammamah Hossainand others added 4 commits September 12, 2019 10:27
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Read new State prop from ControlledTable; add timeouts of 1000ms before editing in copy_paste_test.
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
Co-Authored-By: Marc-André Rivet <Marc-Andre-Rivet@users.noreply.github.com>
!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

loading_state is not required for partial resolution of the cells as they will all be considered inactive anyway. This can be removed and partialGet can pass false to getContent instead.

!!is_focused,
dropdowns
dropdowns,
loading_state

@Marc-Andre-RivetMarc-Andre-RivetSep 12, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Calculate the boolean value prior to passing it to cellContents. On each render the object will potentially be different and force re-evaluation / bust cache very often otherwise.

!!is_focused,
dropdowns
dropdowns,
data_loading

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Better, but what I meant is that we can omit this parameter completely for partialGet at the moment.

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.

Right, that makes sense!

Shammamah Hossain added 2 commits September 12, 2019 12:02
Compute relevant information (whether the data are loading) in CellFactory instead.
@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from 42c7a48 to 40722c1CompareSeptember 12, 2019 16:06
return (!dropdown || !editable) ? CellType.DropdownLabel : CellType.Dropdown;
default:
return (!active || !editable) ? CellType.Label : CellType.Input;
return (!active || !editable || is_loading) ? CellType.Label : CellType.Input;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As is, won't the dropdowns still be editable when the table is loading?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Making it a label has UI/presentation implications though.. I don't remember if the dropdown library we use allows us to make the dropdown readonly

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.

That's why I left the loading states info out of the dropdowns -- wasn't sure exactly what would happen or what "editing" means in that case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looking at the documentation for react-select there seems to be a isDisabled prop
https://react-select.com/props

It reacts somewhat like we would want I think -- except maybe for default styling
https://jedwatson.github.io/react-select/

image

@shammamah-zz
shammamah-zzforce-pushed the loading-states-uneditable branch from f02acb8 to 2d15ca4CompareSeptember 12, 2019 17:59

@Marc-Andre-RivetMarc-Andre-Rivet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃 Looks good to me

@shammamah-zz
shammamah-zz merged commit f9b7bc4 into masterSep 12, 2019
@shammamah-zz
shammamah-zz deleted the loading-states-uneditable branch September 12, 2019 19:59
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.

disable editing if the column is in a 'loading state'

3 participants

@shammamah-zz@Marc-Andre-Rivet@chriddyp