Skip to content

Commit

Permalink
feat: Hide JS dependant elements unless JS enabled (#149)
Browse files Browse the repository at this point in the history
* fix(print): Move Javascript to <script> element due to CSP

* feat: Hide JS dependant elements unless JS enabled

* chore: move class + attribute one up

* tests: Add E2E tests for feedback + print button

* fix: Exclude cypress tests from sonarcloud
  • Loading branch information
jimwashbrook authored Aug 28, 2024
1 parent 132bd08 commit 78cc655
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 6 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/code-pr-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
/d:sonar.login="${{ secrets.SONAR_TOKEN }}" \
/d:sonar.host.url="https://sonarcloud.io" \
/d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml \
/d:sonar.coverage.exclusions=**/Program.cs,**/wwwroot/** \
/d:sonar.coverage.exclusions=**/Program.cs,**/wwwroot/**,**/Dfe.ContentSupport.Web.E2ETests/** \
/d:sonar.issue.ignore.multicriteria=e1 \
/d:sonar.issue.ignore.multicriteria.e1.ruleKey=csharpsquid:S6602 \
/d:sonar.issue.ignore.multicriteria.e1.resourceKey=src/**/*.cs
Expand Down
24 changes: 24 additions & 0 deletions src/Dfe.ContentSupport.Web/Views/Content/CsIndex.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,28 @@
addPrintButtonEventListener();
</script>
}

<script nonce="@Context.Items["nonce"]" defer>
const hiddenClass = "govuk-visually-hidden";
//Some elements should remain hidden
const idsToNotShow = ["support-links"];
//Remove hidden visibility CSS class if JS enabled
const removeHiddenClassFromElements = () => {
const hiddenElements = Array.from(document.querySelectorAll(`.${hiddenClass}`));
for(const element of hiddenElements){
if(idsToNotShow.indexOf(element.id) > -1){
continue;
}
element.classList.remove(hiddenClass);
//Also unset "aria-hidden" attribute
element.ariaHidden = undefined;
}
}
removeHiddenClassFromElements();
</script>
}
2 changes: 1 addition & 1 deletion src/Dfe.ContentSupport.Web/Views/Shared/_Feedback.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

@if (track)
{
<div class="dfe-feedback-banner govuk-!-margin-top-9">
<div class="dfe-feedback-banner govuk-!-margin-top-9 govuk-visually-hidden" aria-hidden="true" id="feedback-banner">
<div class="dfe-feedback-banner--content">
<form id="feedbackForm">
<div class="dfe-feedback-banner--content-questions">
Expand Down
4 changes: 2 additions & 2 deletions src/Dfe.ContentSupport.Web/Views/Shared/_Footer.cshtml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<footer class="govuk-footer " role="contentinfo">
<div class="govuk-width-container ">
<div class="govuk-width-container">
<div class="govuk-footer__meta">
<div class="govuk-footer__meta-item govuk-footer__meta-item--grow">
<h2 class="govuk-visually-hidden">Support links</h2>
<h2 class="govuk-visually-hidden" id="support-links">Support links</h2>
@* @await Component.InvokeAsync("FooterLinks") *@
<svg aria-hidden="true" focusable="false" class="govuk-footer__licence-logo"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 483.2 195.7" height="17" width="41">
Expand Down
4 changes: 2 additions & 2 deletions src/Dfe.ContentSupport.Web/Views/Shared/_Print.cshtml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<div class="print-button">
<button class="govuk-link print-link-button" data-module="print-link" id="print-link">Print this page</button>
<div class="print-button govuk-visually-hidden" aria-hidden="true">
<button class="govuk-link print-link-button" data-module="print-link" id="print-link" >Print this page</button>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
describe('Feedback banner', () => {
it("should be visible when tracking consented", () => {
cy.visit('content/hello-world',
{
headers: {
'Cookie': '.AspNet.Consent=yes'
}
}
);

cy.get("div#feedback-banner")
.should('exist')
.not("govuk-visually-hidden")
.should('not.have.attr', 'aria-hidden');
});

it("should not exist when tracking consent not given", () => {
cy.visit('content/hello-world',
{
headers: {
'Cookie': '.AspNet.Consent=no'
}
}
);

cy.get("div#feedback-banner")
.should('not.exist');
});

});
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
describe('Print button', () => {
beforeEach(() => {
cy.visit('content/hello-world', {
onBeforeLoad(win) {
//Stub the print functionality so we can see if it was called
//Note: could spy instead, but I don't want the print dialog to actually show.
cy.stub(win, 'print', () => { });
},
});
});

it("should be visible", () => {
cy.get("div.print-button")
.should('exist')
.not("govuk-visually-hidden")
.should('not.have.attr', 'aria-hidden');

cy.get("button#print-link").should("exist");
});

it("should print on click", () => {
cy.get("button#print-link").click();
cy.window().its("print").should('be.called');
});
});

0 comments on commit 78cc655

Please sign in to comment.