') + ')', '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('^' + ".*" + ', '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" + ', '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('^' + ".*" + ', '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); } })(); })(); Self-heal validation on edit modal load by MisRob · Pull Request #2857 · learningequality/studio · GitHub
Skip to content

Self-heal validation on edit modal load - #2857

Merged
rtibbles merged 5 commits into
learningequality:hotfixesfrom
MisRob:node-validation-self-healing
Jan 26, 2021
Merged

Self-heal validation on edit modal load#2857
rtibbles merged 5 commits into
learningequality:hotfixesfrom
MisRob:node-validation-self-healing

Conversation

@MisRob

@MisRobMisRob commented Jan 22, 2021

Copy link
Copy Markdown
Member

Description

Check if nodes' complete attribute is correct when nodes are loaded on edit modal open. Fix it for nodes that are marked incorrectly.

Steps to Test

  • Clear IndexedDB
  • yarn run devsetup
  • Go to "Published Channel" editor
  • Navigate to Topic 1 where you can find a node that is incorrectly marked as incomplete - "Sample Audio"
  • Open edit modal for "Sample Audio"
  • Check that the "Incomplete" error icon disappeared from the node's list and a request with a correct complete attribute has been sent

Does this introduce any tech-debt items?

I wanted to add tests but I've found out that we skip all edit modal test cases. After removing skip, everything fails. This makes adding new scenarios difficult. I can see that we skip tests for more related views. I think this is our tech debt from times when we needed to do some core refactors and agreed to comment out certain tests to be able to merge asap so other folks could work on related features. I am going to raise this issue during content dev meeting and hopefully will address that soon and also add tests for this new behavior on that opportunity.

Checklist

  • Is the code clean and well-commented?
  • Are there tests for this change?
  • Are views organized into pages, components, and layouts directories as described in the docs?
  • Are there opportunities for using Google Analytics here (if applicable)?

@codecov

codecovBot commented Jan 22, 2021

Copy link
Copy Markdown

Codecov Report

Merging #2857 (46ee11e) into hotfixes (5fd66f8) will not change coverage.
The diff coverage is n/a.

Impacted file tree graph

@@ Coverage Diff @@## hotfixes #2857 +/- ##
=========================================
Coverage 84.97% 84.97% =========================================
Files 295 295 Lines 15558 15558 =========================================
Hits 13220 13220 Misses 2338 2338 

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5fd66f8...46ee11e. Read the comment docs.

@marcellamakimarcellamaki left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Manual QA on this looks good, and I did look over the code as well, but I think an extra set of eyes from @micahscopes would be helpful to make sure there's not anything I'm missing on the code side.

@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 looks good to me. I'll hold off on merging until we have a chance to discuss it at the content dev meeting tomorrow.

@rtibbles

Copy link
Copy Markdown
Member

Manual testing checks out, and both @micahscopes and myself have read the code, and no alarm bells are ringing. Let's merge this.

@rtibbles
rtibbles merged commit da2e998 into learningequality:hotfixesJan 26, 2021
@MisRob
MisRob deleted the node-validation-self-healing branch February 3, 2021 07:08
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.

4 participants

@MisRob@rtibbles@micahscopes@marcellamaki