Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Hide JS dependant elements unless JS enabled #149

Merged
merged 5 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
51 changes: 50 additions & 1 deletion src/Dfe.ContentSupport.Web/Views/Content/CsIndex.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,53 @@
<partial name="_Feedback" />
}
</div>
</div>
</div>

@section BodyEnd{
@if (Model.HasPrint)
{
<script nonce="@Context.Items["nonce"]" defer>
/**
* Adds functionality for printing a page to the Print Page button (_Print.cshtml)
*/
const printPage = () => window.print();


const addPrintButtonEventListener = () => {
const printButton = document.getElementById("print-link");

if(!printButton){
return;
}

printButton.addEventListener('click', printPage);
}

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" onclick="window.print()">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');
});
});
Loading