Tweaks to the admin flash messages flow (#16582)
* Focus flash message button on load * update specs * Update app/javascript/packs/admin/flashMessages.js Co-authored-by: Nick Taylor <nick@iamdeveloper.com> * Update app/javascript/packs/admin/flashMessages.js Co-authored-by: Nick Taylor <nick@iamdeveloper.com> Co-authored-by: Nick Taylor <nick@iamdeveloper.com>
This commit is contained in:
parent
dc0693e0f4
commit
4d07a1ef7b
6 changed files with 54 additions and 27 deletions
6
app/javascript/packs/admin/flashMessages.js
Normal file
6
app/javascript/packs/admin/flashMessages.js
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
const [ firstFlashDismissBtn ] =
|
||||
document.getElementsByClassName('js-flash-close-btn');
|
||||
|
||||
// This allows screen reader users to become aware of the message (as well as bringing focus to the top of the main content).
|
||||
// (we don't use aria-live or role="alert" on the message text as these are not reliably announced for content that exists from page load)
|
||||
firstFlashDismissBtn?.focus();
|
||||
|
|
@ -80,12 +80,13 @@
|
|||
</nav>
|
||||
</div>
|
||||
<main id="main-content" class="crayons-layout__content min-w-0 p-2">
|
||||
<% flash.each do |type, message| %>
|
||||
<%= javascript_packs_with_chunks_tag "admin/flashMessages", defer: true %>
|
||||
<% flash.each_with_index do |(type, message), i| %>
|
||||
<div data-testid="flash-<%= type %>" class="alert alert-<%= type == "notice" || type == "success" ? "success" : "danger" %>">
|
||||
<button class="close" data-dismiss="alert" aria-label="Close">
|
||||
<span id="flash-<%= i %>"><%= message %></span>
|
||||
<button class="close js-flash-close-btn" data-dismiss="alert" aria-label="Dismiss message" aria-describedby="flash-<%= i %>">
|
||||
<%= crayons_icon_tag(:x, aria_hidden: true) %>
|
||||
</button>
|
||||
<%= message %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ function openCreditsModal() {
|
|||
return cy.getModal();
|
||||
}
|
||||
|
||||
function closeUserUpdatedMessage(message) {
|
||||
function verifyAndDismissUserUpdatedMessage(message) {
|
||||
cy.findByText(message).should('exist');
|
||||
cy.findByRole('button', { name: 'Close' }).click();
|
||||
cy.findByRole('button', { name: 'Dismiss message' })
|
||||
.should('have.focus')
|
||||
.click();
|
||||
cy.findByText(message).should('not.exist');
|
||||
}
|
||||
|
||||
|
|
@ -38,7 +40,7 @@ describe('Manage User Credits', () => {
|
|||
});
|
||||
|
||||
cy.getModal().should('not.exist');
|
||||
closeUserUpdatedMessage('Credits have been added!');
|
||||
verifyAndDismissUserUpdatedMessage('Credits have been added!');
|
||||
cy.findByTestId('user-credits').should('have.text', '210');
|
||||
});
|
||||
|
||||
|
|
@ -57,7 +59,7 @@ describe('Manage User Credits', () => {
|
|||
});
|
||||
|
||||
cy.getModal().should('not.exist');
|
||||
closeUserUpdatedMessage('Credits have been removed.');
|
||||
verifyAndDismissUserUpdatedMessage('Credits have been removed.');
|
||||
cy.findByTestId('user-credits').should('have.text', '89');
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ function openOrgModal(ctaText = 'Add organization') {
|
|||
return cy.getModal();
|
||||
}
|
||||
|
||||
function closeUserUpdatedMessage(message) {
|
||||
function verifyAndDismissUserUpdatedMessage(message) {
|
||||
cy.findByText(message).should('exist');
|
||||
cy.findByRole('button', { name: 'Close' }).click();
|
||||
cy.findByRole('button', { name: 'Dismiss message' })
|
||||
.should('have.focus')
|
||||
.click();
|
||||
cy.findByText(message).should('not.exist');
|
||||
}
|
||||
|
||||
|
|
@ -34,7 +36,9 @@ describe('Manage User Organziations', () => {
|
|||
cy.findByRole('button', { name: 'Add organization' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage('User was successfully added to Bachmanity');
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'User was successfully added to Bachmanity',
|
||||
);
|
||||
cy.getModal().should('not.exist');
|
||||
|
||||
// Focusing on the link is required to make buttons visible.
|
||||
|
|
@ -60,14 +64,18 @@ describe('Manage User Organziations', () => {
|
|||
cy.findByRole('button', { name: 'Add organization' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage('User was successfully added to Bachmanity');
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'User was successfully added to Bachmanity',
|
||||
);
|
||||
|
||||
openOrgModal('Add another organization').within(() => {
|
||||
cy.findByRole('spinbutton', { name: 'Organization ID' }).type(2);
|
||||
cy.findByRole('button', { name: 'Add organization' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage('User was successfully added to Awesome Org');
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'User was successfully added to Awesome Org',
|
||||
);
|
||||
cy.getModal().should('not.exist');
|
||||
|
||||
// Focusing on the link is required to make buttons visible.
|
||||
|
|
@ -103,7 +111,9 @@ describe('Manage User Organziations', () => {
|
|||
cy.findByRole('button', { name: 'Update' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage('User was successfully updated to admin');
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'User was successfully updated to admin',
|
||||
);
|
||||
cy.getModal().should('not.exist');
|
||||
});
|
||||
|
||||
|
|
@ -115,7 +125,9 @@ describe('Manage User Organziations', () => {
|
|||
cy.findByRole('button', { name: 'Add organization' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage('User was successfully added to Bachmanity');
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'User was successfully added to Bachmanity',
|
||||
);
|
||||
cy.getModal().should('not.exist');
|
||||
|
||||
// Two links currently exist for every org (image and name)
|
||||
|
|
@ -134,7 +146,9 @@ describe('Manage User Organziations', () => {
|
|||
name: 'Revoke Awesome Org organization membership',
|
||||
}).click();
|
||||
|
||||
closeUserUpdatedMessage('User was successfully removed from Awesome Org');
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'User was successfully removed from Awesome Org',
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ function openRolesModal() {
|
|||
return cy.getModal();
|
||||
}
|
||||
|
||||
function closeUserUpdatedMessage() {
|
||||
function verifyAndDismissUserUpdatedMessage() {
|
||||
cy.findByText('User has been updated').should('exist');
|
||||
cy.findByRole('button', { name: 'Close' }).click();
|
||||
cy.findByRole('button', { name: 'Dismiss message' })
|
||||
.should('have.focus')
|
||||
.click();
|
||||
cy.findByText('User has been updated').should('not.exist');
|
||||
}
|
||||
|
||||
|
|
@ -44,7 +46,7 @@ describe('Manage User Roles', () => {
|
|||
});
|
||||
|
||||
cy.getModal().should('not.exist');
|
||||
closeUserUpdatedMessage();
|
||||
verifyAndDismissUserUpdatedMessage();
|
||||
|
||||
cy.findByRole('button', { name: 'Remove role: Warned' }).should(
|
||||
'exist',
|
||||
|
|
@ -117,7 +119,7 @@ describe('Manage User Roles', () => {
|
|||
});
|
||||
|
||||
cy.getModal().should('not.exist');
|
||||
closeUserUpdatedMessage();
|
||||
verifyAndDismissUserUpdatedMessage();
|
||||
checkUserStatus('Warned');
|
||||
|
||||
cy.findByRole('button', { name: 'Remove role: Warned' }).should(
|
||||
|
|
@ -131,7 +133,7 @@ describe('Manage User Roles', () => {
|
|||
});
|
||||
|
||||
cy.getModal().should('not.exist');
|
||||
closeUserUpdatedMessage();
|
||||
verifyAndDismissUserUpdatedMessage();
|
||||
checkUserStatus('Warned');
|
||||
|
||||
cy.findByRole('button', { name: 'Remove role: Warned' }).should(
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ function openUserOptions(callback) {
|
|||
});
|
||||
}
|
||||
|
||||
function closeUserUpdatedMessage(message) {
|
||||
function verifyAndDismissUserUpdatedMessage(message) {
|
||||
cy.findByTestId('flash-success')
|
||||
.as('success')
|
||||
.then((element) => {
|
||||
|
|
@ -19,7 +19,9 @@ function closeUserUpdatedMessage(message) {
|
|||
});
|
||||
|
||||
cy.get('@success').within(() => {
|
||||
cy.findByRole('button', { name: 'Close' }).click();
|
||||
cy.findByRole('button', { name: 'Dismiss message' })
|
||||
.should('have.focus')
|
||||
.click();
|
||||
});
|
||||
|
||||
cy.findByTestId('flash-success').should('not.exist');
|
||||
|
|
@ -39,7 +41,7 @@ describe('Manage User Options', () => {
|
|||
openUserOptions(() => {
|
||||
cy.findByRole('button', { name: 'Verify email address' }).click();
|
||||
});
|
||||
closeUserUpdatedMessage('Verification email sent!');
|
||||
verifyAndDismissUserUpdatedMessage('Verification email sent!');
|
||||
});
|
||||
|
||||
it(`should export a user's data to an admin`, () => {
|
||||
|
|
@ -51,7 +53,7 @@ describe('Manage User Options', () => {
|
|||
cy.findByRole('button', { name: 'Export to Admin' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage(
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'Data exported to the admin. The job will complete momentarily.',
|
||||
);
|
||||
});
|
||||
|
|
@ -65,7 +67,7 @@ describe('Manage User Options', () => {
|
|||
cy.findByRole('button', { name: 'Export to User' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage(
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'Data exported to the user. The job will complete momentarily.',
|
||||
);
|
||||
});
|
||||
|
|
@ -90,7 +92,7 @@ describe('Manage User Options', () => {
|
|||
cy.findByRole('button', { name: 'Banish User for spam' }).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage(
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'This user is being banished in the background. The job will complete soon.',
|
||||
);
|
||||
});
|
||||
|
|
@ -106,7 +108,7 @@ describe('Manage User Options', () => {
|
|||
}).click();
|
||||
});
|
||||
|
||||
closeUserUpdatedMessage(
|
||||
verifyAndDismissUserUpdatedMessage(
|
||||
'@trusted_user_1 (email: trusted-user-1@forem.local, user_id: 2) has been fully deleted. If this is a GDPR delete, delete them from Mailchimp & Google Analytics and confirm on the page.',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue