Skip to content

Add guard to TreeViewcreated hook, to prevent data over-fetching - #2650

Merged
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request
Dec 10, 2020
Merged

Add guard to TreeViewcreated hook, to prevent data over-fetching#2650
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request

Conversation

@jonboiser

@jonboiserjonboiser commented Dec 9, 2020

Copy link
Copy Markdown
Contributor

Description

This adds a guard to the TreeView's created hook to prevent it (along with the NodePanels created hook) from doing two types of overfetching:

  1. At a channel's root node, TreeView and NodePanel will collectively request the root node twice
  2. At a channels' non-root node Treeview and NodePanel will collectively request the root node once, and the current node twice

Here I'm using a shorthand of "request the node" to mean "make a call to /api/contentnode with the query param of parent=node".

After this fix:

  1. At a channel's root node, TreeView will not request the root node. And NodePanel will request the root node once.
  2. At a channels' non-root node Treeview will request the root node once. And NodePanel will request the current node once.

Issue Addressed (if applicable)

Fixes#2316

Before/After Screenshots (if applicable)

Before:

Notice that the same IDs are repeated multiple times in the request URL

CleanShot 2020-12-08 at 16 39 23@2x
CleanShot 2020-12-08 at 16 37 01@2x

After:

Notice that the ID do not overlap between requests URLs

CleanShot 2020-12-08 at 16 34 53@2x
CleanShot 2020-12-08 at 16 34 12@2x

Steps to Test

  • Step 1
  • Step 2

Implementation Notes (optional)

At a high level, how did you implement this?

I added a guard to TreeView to ask for a smaller amount of data, with the knowledge that NodePanel will be rendered in the UI tree and make a complementary data request. This ensures that the current behavior of always request the root node + the current node is retained, but done in a way that we are not overfetching duplicate copies of these nodes.

Does this introduce any tech-debt items?

List anything that will need to be addressed later

I don't know enough about the architecture to know if this is hacky. It's possible that a smarter solution would have just removed all calls to loadContentNodes from TreeView and deferred it to NodePanel

Checklist

Delete any items that don't apply

  • Is the code clean and well-commented?
  • Has the docs label been added if this introduces a change that needs to be updated in the user docs?
  • Has the CHANGELOG label been added to this pull request? Items with this label will be added to the CHANGELOG at a later time
  • Are there tests for this change?
  • Are all user-facing strings translated properly (if applicable)?
  • Has the notranslate class been added to elements that shouldn't be translated by Google Chrome's automatic translation feature (e.g. icons, user-generated text)?
  • Are all UI components LTR and RTL compliant (if applicable)?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there any new ways this uses user data that needs to be factored into our Privacy Policy?
  • Are there any new interactions that need to be added to the QA Sheet?
  • Are there opportunities for using Google Analytics here (if applicable)?
  • If the Pipfile has been changed, is the updated Pipfile.lock file also included in this PR?
  • Are the migrations safe for a large db (if applicable)?

Comments

Any additional notes you'd like to add

Reviewers

If you are looking to assign a reviewer, here are some options:

  • Jordan jayoshih (full stack)
  • Aron aronasorman (back end, devops)
  • Micah micahscopes (full stack)
  • Kevin kollivier (back end)
  • Ivan ivanistheone (Ricecooker)
  • Richard rtibbles (full stack, Kolibri)
  • Radina @radinamatic (documentation)

@jonboiserjonboiser added this to the Vue Refactor milestone Dec 9, 2020

@micahscopesmicahscopes 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.

This seems good for now, and I tried it out and it works. It also doesn't seem like it'd be too difficult to rework this later if someone felt inspired to.

@micahscopes
micahscopes merged commit d6b0135 into learningequality:developDec 10, 2020
@jonboiser
jonboiser deleted the deduplicate-root-node-request branch December 14, 2020 19:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicative network calls when loading channel edit page

2 participants

@jonboiser@micahscopes
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add guard to `TreeView` `created` hook, to prevent data over-fetching by jonboiser · Pull Request #2650 · learningequality/studio · GitHub
Skip to content

Add guard to TreeViewcreated hook, to prevent data over-fetching - #2650

Merged
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request
Dec 10, 2020
Merged

Add guard to TreeViewcreated hook, to prevent data over-fetching#2650
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request

Conversation

@jonboiser

@jonboiserjonboiser commented Dec 9, 2020

Copy link
Copy Markdown
Contributor

Description

This adds a guard to the TreeView's created hook to prevent it (along with the NodePanels created hook) from doing two types of overfetching:

  1. At a channel's root node, TreeView and NodePanel will collectively request the root node twice
  2. At a channels' non-root node Treeview and NodePanel will collectively request the root node once, and the current node twice

Here I'm using a shorthand of "request the node" to mean "make a call to /api/contentnode with the query param of parent=node".

After this fix:

  1. At a channel's root node, TreeView will not request the root node. And NodePanel will request the root node once.
  2. At a channels' non-root node Treeview will request the root node once. And NodePanel will request the current node once.

Issue Addressed (if applicable)

Fixes#2316

Before/After Screenshots (if applicable)

Before:

Notice that the same IDs are repeated multiple times in the request URL

CleanShot 2020-12-08 at 16 39 23@2x
CleanShot 2020-12-08 at 16 37 01@2x

After:

Notice that the ID do not overlap between requests URLs

CleanShot 2020-12-08 at 16 34 53@2x
CleanShot 2020-12-08 at 16 34 12@2x

Steps to Test

  • Step 1
  • Step 2

Implementation Notes (optional)

At a high level, how did you implement this?

I added a guard to TreeView to ask for a smaller amount of data, with the knowledge that NodePanel will be rendered in the UI tree and make a complementary data request. This ensures that the current behavior of always request the root node + the current node is retained, but done in a way that we are not overfetching duplicate copies of these nodes.

Does this introduce any tech-debt items?

List anything that will need to be addressed later

I don't know enough about the architecture to know if this is hacky. It's possible that a smarter solution would have just removed all calls to loadContentNodes from TreeView and deferred it to NodePanel

Checklist

Delete any items that don't apply

  • Is the code clean and well-commented?
  • Has the docs label been added if this introduces a change that needs to be updated in the user docs?
  • Has the CHANGELOG label been added to this pull request? Items with this label will be added to the CHANGELOG at a later time
  • Are there tests for this change?
  • Are all user-facing strings translated properly (if applicable)?
  • Has the notranslate class been added to elements that shouldn't be translated by Google Chrome's automatic translation feature (e.g. icons, user-generated text)?
  • Are all UI components LTR and RTL compliant (if applicable)?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there any new ways this uses user data that needs to be factored into our Privacy Policy?
  • Are there any new interactions that need to be added to the QA Sheet?
  • Are there opportunities for using Google Analytics here (if applicable)?
  • If the Pipfile has been changed, is the updated Pipfile.lock file also included in this PR?
  • Are the migrations safe for a large db (if applicable)?

Comments

Any additional notes you'd like to add

Reviewers

If you are looking to assign a reviewer, here are some options:

  • Jordan jayoshih (full stack)
  • Aron aronasorman (back end, devops)
  • Micah micahscopes (full stack)
  • Kevin kollivier (back end)
  • Ivan ivanistheone (Ricecooker)
  • Richard rtibbles (full stack, Kolibri)
  • Radina @radinamatic (documentation)

@jonboiserjonboiser added this to the Vue Refactor milestone Dec 9, 2020

@micahscopesmicahscopes 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.

This seems good for now, and I tried it out and it works. It also doesn't seem like it'd be too difficult to rework this later if someone felt inspired to.

@micahscopes
micahscopes merged commit d6b0135 into learningequality:developDec 10, 2020
@jonboiser
jonboiser deleted the deduplicate-root-node-request branch December 14, 2020 19:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicative network calls when loading channel edit page

2 participants

@jonboiser@micahscopes
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add guard to `TreeView` `created` hook, to prevent data over-fetching by jonboiser · Pull Request #2650 · learningequality/studio · GitHub
Skip to content

Add guard to TreeViewcreated hook, to prevent data over-fetching - #2650

Merged
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request
Dec 10, 2020
Merged

Add guard to TreeViewcreated hook, to prevent data over-fetching#2650
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request

Conversation

@jonboiser

@jonboiserjonboiser commented Dec 9, 2020

Copy link
Copy Markdown
Contributor

Description

This adds a guard to the TreeView's created hook to prevent it (along with the NodePanels created hook) from doing two types of overfetching:

  1. At a channel's root node, TreeView and NodePanel will collectively request the root node twice
  2. At a channels' non-root node Treeview and NodePanel will collectively request the root node once, and the current node twice

Here I'm using a shorthand of "request the node" to mean "make a call to /api/contentnode with the query param of parent=node".

After this fix:

  1. At a channel's root node, TreeView will not request the root node. And NodePanel will request the root node once.
  2. At a channels' non-root node Treeview will request the root node once. And NodePanel will request the current node once.

Issue Addressed (if applicable)

Fixes#2316

Before/After Screenshots (if applicable)

Before:

Notice that the same IDs are repeated multiple times in the request URL

CleanShot 2020-12-08 at 16 39 23@2x
CleanShot 2020-12-08 at 16 37 01@2x

After:

Notice that the ID do not overlap between requests URLs

CleanShot 2020-12-08 at 16 34 53@2x
CleanShot 2020-12-08 at 16 34 12@2x

Steps to Test

  • Step 1
  • Step 2

Implementation Notes (optional)

At a high level, how did you implement this?

I added a guard to TreeView to ask for a smaller amount of data, with the knowledge that NodePanel will be rendered in the UI tree and make a complementary data request. This ensures that the current behavior of always request the root node + the current node is retained, but done in a way that we are not overfetching duplicate copies of these nodes.

Does this introduce any tech-debt items?

List anything that will need to be addressed later

I don't know enough about the architecture to know if this is hacky. It's possible that a smarter solution would have just removed all calls to loadContentNodes from TreeView and deferred it to NodePanel

Checklist

Delete any items that don't apply

  • Is the code clean and well-commented?
  • Has the docs label been added if this introduces a change that needs to be updated in the user docs?
  • Has the CHANGELOG label been added to this pull request? Items with this label will be added to the CHANGELOG at a later time
  • Are there tests for this change?
  • Are all user-facing strings translated properly (if applicable)?
  • Has the notranslate class been added to elements that shouldn't be translated by Google Chrome's automatic translation feature (e.g. icons, user-generated text)?
  • Are all UI components LTR and RTL compliant (if applicable)?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there any new ways this uses user data that needs to be factored into our Privacy Policy?
  • Are there any new interactions that need to be added to the QA Sheet?
  • Are there opportunities for using Google Analytics here (if applicable)?
  • If the Pipfile has been changed, is the updated Pipfile.lock file also included in this PR?
  • Are the migrations safe for a large db (if applicable)?

Comments

Any additional notes you'd like to add

Reviewers

If you are looking to assign a reviewer, here are some options:

  • Jordan jayoshih (full stack)
  • Aron aronasorman (back end, devops)
  • Micah micahscopes (full stack)
  • Kevin kollivier (back end)
  • Ivan ivanistheone (Ricecooker)
  • Richard rtibbles (full stack, Kolibri)
  • Radina @radinamatic (documentation)

@jonboiserjonboiser added this to the Vue Refactor milestone Dec 9, 2020

@micahscopesmicahscopes 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.

This seems good for now, and I tried it out and it works. It also doesn't seem like it'd be too difficult to rework this later if someone felt inspired to.

@micahscopes
micahscopes merged commit d6b0135 into learningequality:developDec 10, 2020
@jonboiser
jonboiser deleted the deduplicate-root-node-request branch December 14, 2020 19:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicative network calls when loading channel edit page

2 participants

@jonboiser@micahscopes
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add guard to `TreeView` `created` hook, to prevent data over-fetching by jonboiser · Pull Request #2650 · learningequality/studio · GitHub
Skip to content

Add guard to TreeViewcreated hook, to prevent data over-fetching - #2650

Merged
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request
Dec 10, 2020
Merged

Add guard to TreeViewcreated hook, to prevent data over-fetching#2650
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request

Conversation

@jonboiser

@jonboiserjonboiser commented Dec 9, 2020

Copy link
Copy Markdown
Contributor

Description

This adds a guard to the TreeView's created hook to prevent it (along with the NodePanels created hook) from doing two types of overfetching:

  1. At a channel's root node, TreeView and NodePanel will collectively request the root node twice
  2. At a channels' non-root node Treeview and NodePanel will collectively request the root node once, and the current node twice

Here I'm using a shorthand of "request the node" to mean "make a call to /api/contentnode with the query param of parent=node".

After this fix:

  1. At a channel's root node, TreeView will not request the root node. And NodePanel will request the root node once.
  2. At a channels' non-root node Treeview will request the root node once. And NodePanel will request the current node once.

Issue Addressed (if applicable)

Fixes#2316

Before/After Screenshots (if applicable)

Before:

Notice that the same IDs are repeated multiple times in the request URL

CleanShot 2020-12-08 at 16 39 23@2x
CleanShot 2020-12-08 at 16 37 01@2x

After:

Notice that the ID do not overlap between requests URLs

CleanShot 2020-12-08 at 16 34 53@2x
CleanShot 2020-12-08 at 16 34 12@2x

Steps to Test

  • Step 1
  • Step 2

Implementation Notes (optional)

At a high level, how did you implement this?

I added a guard to TreeView to ask for a smaller amount of data, with the knowledge that NodePanel will be rendered in the UI tree and make a complementary data request. This ensures that the current behavior of always request the root node + the current node is retained, but done in a way that we are not overfetching duplicate copies of these nodes.

Does this introduce any tech-debt items?

List anything that will need to be addressed later

I don't know enough about the architecture to know if this is hacky. It's possible that a smarter solution would have just removed all calls to loadContentNodes from TreeView and deferred it to NodePanel

Checklist

Delete any items that don't apply

  • Is the code clean and well-commented?
  • Has the docs label been added if this introduces a change that needs to be updated in the user docs?
  • Has the CHANGELOG label been added to this pull request? Items with this label will be added to the CHANGELOG at a later time
  • Are there tests for this change?
  • Are all user-facing strings translated properly (if applicable)?
  • Has the notranslate class been added to elements that shouldn't be translated by Google Chrome's automatic translation feature (e.g. icons, user-generated text)?
  • Are all UI components LTR and RTL compliant (if applicable)?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there any new ways this uses user data that needs to be factored into our Privacy Policy?
  • Are there any new interactions that need to be added to the QA Sheet?
  • Are there opportunities for using Google Analytics here (if applicable)?
  • If the Pipfile has been changed, is the updated Pipfile.lock file also included in this PR?
  • Are the migrations safe for a large db (if applicable)?

Comments

Any additional notes you'd like to add

Reviewers

If you are looking to assign a reviewer, here are some options:

  • Jordan jayoshih (full stack)
  • Aron aronasorman (back end, devops)
  • Micah micahscopes (full stack)
  • Kevin kollivier (back end)
  • Ivan ivanistheone (Ricecooker)
  • Richard rtibbles (full stack, Kolibri)
  • Radina @radinamatic (documentation)

@jonboiserjonboiser added this to the Vue Refactor milestone Dec 9, 2020

@micahscopesmicahscopes 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.

This seems good for now, and I tried it out and it works. It also doesn't seem like it'd be too difficult to rework this later if someone felt inspired to.

@micahscopes
micahscopes merged commit d6b0135 into learningequality:developDec 10, 2020
@jonboiser
jonboiser deleted the deduplicate-root-node-request branch December 14, 2020 19:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicative network calls when loading channel edit page

2 participants

@jonboiser@micahscopes
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add guard to `TreeView` `created` hook, to prevent data over-fetching by jonboiser · Pull Request #2650 · learningequality/studio · GitHub
Skip to content

Add guard to TreeViewcreated hook, to prevent data over-fetching - #2650

Merged
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request
Dec 10, 2020
Merged

Add guard to TreeViewcreated hook, to prevent data over-fetching#2650
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request

Conversation

@jonboiser

@jonboiserjonboiser commented Dec 9, 2020

Copy link
Copy Markdown
Contributor

Description

This adds a guard to the TreeView's created hook to prevent it (along with the NodePanels created hook) from doing two types of overfetching:

  1. At a channel's root node, TreeView and NodePanel will collectively request the root node twice
  2. At a channels' non-root node Treeview and NodePanel will collectively request the root node once, and the current node twice

Here I'm using a shorthand of "request the node" to mean "make a call to /api/contentnode with the query param of parent=node".

After this fix:

  1. At a channel's root node, TreeView will not request the root node. And NodePanel will request the root node once.
  2. At a channels' non-root node Treeview will request the root node once. And NodePanel will request the current node once.

Issue Addressed (if applicable)

Fixes#2316

Before/After Screenshots (if applicable)

Before:

Notice that the same IDs are repeated multiple times in the request URL

CleanShot 2020-12-08 at 16 39 23@2x
CleanShot 2020-12-08 at 16 37 01@2x

After:

Notice that the ID do not overlap between requests URLs

CleanShot 2020-12-08 at 16 34 53@2x
CleanShot 2020-12-08 at 16 34 12@2x

Steps to Test

  • Step 1
  • Step 2

Implementation Notes (optional)

At a high level, how did you implement this?

I added a guard to TreeView to ask for a smaller amount of data, with the knowledge that NodePanel will be rendered in the UI tree and make a complementary data request. This ensures that the current behavior of always request the root node + the current node is retained, but done in a way that we are not overfetching duplicate copies of these nodes.

Does this introduce any tech-debt items?

List anything that will need to be addressed later

I don't know enough about the architecture to know if this is hacky. It's possible that a smarter solution would have just removed all calls to loadContentNodes from TreeView and deferred it to NodePanel

Checklist

Delete any items that don't apply

  • Is the code clean and well-commented?
  • Has the docs label been added if this introduces a change that needs to be updated in the user docs?
  • Has the CHANGELOG label been added to this pull request? Items with this label will be added to the CHANGELOG at a later time
  • Are there tests for this change?
  • Are all user-facing strings translated properly (if applicable)?
  • Has the notranslate class been added to elements that shouldn't be translated by Google Chrome's automatic translation feature (e.g. icons, user-generated text)?
  • Are all UI components LTR and RTL compliant (if applicable)?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there any new ways this uses user data that needs to be factored into our Privacy Policy?
  • Are there any new interactions that need to be added to the QA Sheet?
  • Are there opportunities for using Google Analytics here (if applicable)?
  • If the Pipfile has been changed, is the updated Pipfile.lock file also included in this PR?
  • Are the migrations safe for a large db (if applicable)?

Comments

Any additional notes you'd like to add

Reviewers

If you are looking to assign a reviewer, here are some options:

  • Jordan jayoshih (full stack)
  • Aron aronasorman (back end, devops)
  • Micah micahscopes (full stack)
  • Kevin kollivier (back end)
  • Ivan ivanistheone (Ricecooker)
  • Richard rtibbles (full stack, Kolibri)
  • Radina @radinamatic (documentation)

@jonboiserjonboiser added this to the Vue Refactor milestone Dec 9, 2020

@micahscopesmicahscopes 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.

This seems good for now, and I tried it out and it works. It also doesn't seem like it'd be too difficult to rework this later if someone felt inspired to.

@micahscopes
micahscopes merged commit d6b0135 into learningequality:developDec 10, 2020
@jonboiser
jonboiser deleted the deduplicate-root-node-request branch December 14, 2020 19:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicative network calls when loading channel edit page

2 participants

@jonboiser@micahscopes
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add guard to `TreeView` `created` hook, to prevent data over-fetching by jonboiser · Pull Request #2650 · learningequality/studio · GitHub
Skip to content

Add guard to TreeViewcreated hook, to prevent data over-fetching - #2650

Merged
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request
Dec 10, 2020
Merged

Add guard to TreeViewcreated hook, to prevent data over-fetching#2650
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request

Conversation

@jonboiser

@jonboiserjonboiser commented Dec 9, 2020

Copy link
Copy Markdown
Contributor

Description

This adds a guard to the TreeView's created hook to prevent it (along with the NodePanels created hook) from doing two types of overfetching:

  1. At a channel's root node, TreeView and NodePanel will collectively request the root node twice
  2. At a channels' non-root node Treeview and NodePanel will collectively request the root node once, and the current node twice

Here I'm using a shorthand of "request the node" to mean "make a call to /api/contentnode with the query param of parent=node".

After this fix:

  1. At a channel's root node, TreeView will not request the root node. And NodePanel will request the root node once.
  2. At a channels' non-root node Treeview will request the root node once. And NodePanel will request the current node once.

Issue Addressed (if applicable)

Fixes#2316

Before/After Screenshots (if applicable)

Before:

Notice that the same IDs are repeated multiple times in the request URL

CleanShot 2020-12-08 at 16 39 23@2x
CleanShot 2020-12-08 at 16 37 01@2x

After:

Notice that the ID do not overlap between requests URLs

CleanShot 2020-12-08 at 16 34 53@2x
CleanShot 2020-12-08 at 16 34 12@2x

Steps to Test

  • Step 1
  • Step 2

Implementation Notes (optional)

At a high level, how did you implement this?

I added a guard to TreeView to ask for a smaller amount of data, with the knowledge that NodePanel will be rendered in the UI tree and make a complementary data request. This ensures that the current behavior of always request the root node + the current node is retained, but done in a way that we are not overfetching duplicate copies of these nodes.

Does this introduce any tech-debt items?

List anything that will need to be addressed later

I don't know enough about the architecture to know if this is hacky. It's possible that a smarter solution would have just removed all calls to loadContentNodes from TreeView and deferred it to NodePanel

Checklist

Delete any items that don't apply

  • Is the code clean and well-commented?
  • Has the docs label been added if this introduces a change that needs to be updated in the user docs?
  • Has the CHANGELOG label been added to this pull request? Items with this label will be added to the CHANGELOG at a later time
  • Are there tests for this change?
  • Are all user-facing strings translated properly (if applicable)?
  • Has the notranslate class been added to elements that shouldn't be translated by Google Chrome's automatic translation feature (e.g. icons, user-generated text)?
  • Are all UI components LTR and RTL compliant (if applicable)?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there any new ways this uses user data that needs to be factored into our Privacy Policy?
  • Are there any new interactions that need to be added to the QA Sheet?
  • Are there opportunities for using Google Analytics here (if applicable)?
  • If the Pipfile has been changed, is the updated Pipfile.lock file also included in this PR?
  • Are the migrations safe for a large db (if applicable)?

Comments

Any additional notes you'd like to add

Reviewers

If you are looking to assign a reviewer, here are some options:

  • Jordan jayoshih (full stack)
  • Aron aronasorman (back end, devops)
  • Micah micahscopes (full stack)
  • Kevin kollivier (back end)
  • Ivan ivanistheone (Ricecooker)
  • Richard rtibbles (full stack, Kolibri)
  • Radina @radinamatic (documentation)

@jonboiserjonboiser added this to the Vue Refactor milestone Dec 9, 2020

@micahscopesmicahscopes 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.

This seems good for now, and I tried it out and it works. It also doesn't seem like it'd be too difficult to rework this later if someone felt inspired to.

@micahscopes
micahscopes merged commit d6b0135 into learningequality:developDec 10, 2020
@jonboiser
jonboiser deleted the deduplicate-root-node-request branch December 14, 2020 19:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicative network calls when loading channel edit page

2 participants

@jonboiser@micahscopes
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Add guard to `TreeView` `created` hook, to prevent data over-fetching by jonboiser · Pull Request #2650 · learningequality/studio · GitHub
Skip to content

Add guard to TreeViewcreated hook, to prevent data over-fetching - #2650

Merged
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request
Dec 10, 2020
Merged

Add guard to TreeViewcreated hook, to prevent data over-fetching#2650
micahscopes merged 1 commit into
learningequality:developfrom
jonboiser:deduplicate-root-node-request

Conversation

@jonboiser

@jonboiserjonboiser commented Dec 9, 2020

Copy link
Copy Markdown
Contributor

Description

This adds a guard to the TreeView's created hook to prevent it (along with the NodePanels created hook) from doing two types of overfetching:

  1. At a channel's root node, TreeView and NodePanel will collectively request the root node twice
  2. At a channels' non-root node Treeview and NodePanel will collectively request the root node once, and the current node twice

Here I'm using a shorthand of "request the node" to mean "make a call to /api/contentnode with the query param of parent=node".

After this fix:

  1. At a channel's root node, TreeView will not request the root node. And NodePanel will request the root node once.
  2. At a channels' non-root node Treeview will request the root node once. And NodePanel will request the current node once.

Issue Addressed (if applicable)

Fixes#2316

Before/After Screenshots (if applicable)

Before:

Notice that the same IDs are repeated multiple times in the request URL

CleanShot 2020-12-08 at 16 39 23@2x
CleanShot 2020-12-08 at 16 37 01@2x

After:

Notice that the ID do not overlap between requests URLs

CleanShot 2020-12-08 at 16 34 53@2x
CleanShot 2020-12-08 at 16 34 12@2x

Steps to Test

  • Step 1
  • Step 2

Implementation Notes (optional)

At a high level, how did you implement this?

I added a guard to TreeView to ask for a smaller amount of data, with the knowledge that NodePanel will be rendered in the UI tree and make a complementary data request. This ensures that the current behavior of always request the root node + the current node is retained, but done in a way that we are not overfetching duplicate copies of these nodes.

Does this introduce any tech-debt items?

List anything that will need to be addressed later

I don't know enough about the architecture to know if this is hacky. It's possible that a smarter solution would have just removed all calls to loadContentNodes from TreeView and deferred it to NodePanel

Checklist

Delete any items that don't apply

  • Is the code clean and well-commented?
  • Has the docs label been added if this introduces a change that needs to be updated in the user docs?
  • Has the CHANGELOG label been added to this pull request? Items with this label will be added to the CHANGELOG at a later time
  • Are there tests for this change?
  • Are all user-facing strings translated properly (if applicable)?
  • Has the notranslate class been added to elements that shouldn't be translated by Google Chrome's automatic translation feature (e.g. icons, user-generated text)?
  • Are all UI components LTR and RTL compliant (if applicable)?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there any new ways this uses user data that needs to be factored into our Privacy Policy?
  • Are there any new interactions that need to be added to the QA Sheet?
  • Are there opportunities for using Google Analytics here (if applicable)?
  • If the Pipfile has been changed, is the updated Pipfile.lock file also included in this PR?
  • Are the migrations safe for a large db (if applicable)?

Comments

Any additional notes you'd like to add

Reviewers

If you are looking to assign a reviewer, here are some options:

  • Jordan jayoshih (full stack)
  • Aron aronasorman (back end, devops)
  • Micah micahscopes (full stack)
  • Kevin kollivier (back end)
  • Ivan ivanistheone (Ricecooker)
  • Richard rtibbles (full stack, Kolibri)
  • Radina @radinamatic (documentation)

@jonboiserjonboiser added this to the Vue Refactor milestone Dec 9, 2020

@micahscopesmicahscopes 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.

This seems good for now, and I tried it out and it works. It also doesn't seem like it'd be too difficult to rework this later if someone felt inspired to.

@micahscopes
micahscopes merged commit d6b0135 into learningequality:developDec 10, 2020
@jonboiser
jonboiser deleted the deduplicate-root-node-request branch December 14, 2020 19:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Duplicative network calls when loading channel edit page

2 participants

@jonboiser@micahscopes