mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-21 13:50:20 +08:00
Merge pull request #16146 from jmchilton/axe-fixes-1
Accessibility fixes for workflows, login, and registration.
This commit is contained in:
@@ -19,21 +19,27 @@
|
||||
<b-card-body>
|
||||
<div>
|
||||
<!-- standard internal galaxy login -->
|
||||
<b-form-group :label="labelNameAddress">
|
||||
<b-form-group :label="labelNameAddress" label-for="login-form-name">
|
||||
<b-form-input
|
||||
v-if="!connectExternalProvider"
|
||||
id="login-form-name"
|
||||
v-model="login"
|
||||
name="login"
|
||||
type="text" />
|
||||
<b-form-input
|
||||
v-else
|
||||
id="login-form-name"
|
||||
disabled
|
||||
:value="connectExternalEmail"
|
||||
name="login"
|
||||
type="text" />
|
||||
</b-form-group>
|
||||
<b-form-group :label="labelPassword">
|
||||
<b-form-input v-model="password" name="password" type="password" />
|
||||
<b-form-group :label="labelPassword" label-for="login-form-password">
|
||||
<b-form-input
|
||||
id="login-form-password"
|
||||
v-model="password"
|
||||
name="password"
|
||||
type="password" />
|
||||
<b-form-text>
|
||||
<span v-localize>Forgot password?</span>
|
||||
<a
|
||||
|
||||
@@ -34,17 +34,29 @@
|
||||
role="tabpanel"
|
||||
accordion="registration_acc">
|
||||
<b-card-body>
|
||||
<b-form-group :label="labelEmailAddress">
|
||||
<b-form-input v-model="email" name="email" type="text" />
|
||||
<b-form-group :label="labelEmailAddress" label-for="register-form-email">
|
||||
<b-form-input id="register-form-email" v-model="email" name="email" type="text" />
|
||||
</b-form-group>
|
||||
<b-form-group :label="labelPassword">
|
||||
<b-form-input v-model="password" name="password" type="password" />
|
||||
<b-form-group :label="labelPassword" label-for="register-form-password">
|
||||
<b-form-input
|
||||
id="register-form-password"
|
||||
v-model="password"
|
||||
name="password"
|
||||
type="password" />
|
||||
</b-form-group>
|
||||
<b-form-group :label="labelConfirmPassword">
|
||||
<b-form-input v-model="confirm" name="confirm" type="password" />
|
||||
<b-form-group :label="labelConfirmPassword" label-for="register-form-confirm">
|
||||
<b-form-input
|
||||
id="register-form-confirm"
|
||||
v-model="confirm"
|
||||
name="confirm"
|
||||
type="password" />
|
||||
</b-form-group>
|
||||
<b-form-group :label="labelPublicName">
|
||||
<b-form-input v-model="username" name="username" type="text" />
|
||||
<b-form-group :label="labelPublicName" label-for="register-form-username">
|
||||
<b-form-input
|
||||
id="register-form-username"
|
||||
v-model="username"
|
||||
name="username"
|
||||
type="text" />
|
||||
<b-form-text v-localize
|
||||
>Your public name is an identifier that will be used to generate addresses for
|
||||
information you share publicly. Public names must be at least three characters
|
||||
@@ -52,8 +64,15 @@
|
||||
dashes ('.', '_', '-').
|
||||
</b-form-text>
|
||||
</b-form-group>
|
||||
<b-form-group v-if="mailingJoinAddr && serverMailConfigured" :label="labelSubscribe">
|
||||
<input v-model="subscribe" name="subscribe" type="checkbox" />
|
||||
<b-form-group
|
||||
v-if="mailingJoinAddr && serverMailConfigured"
|
||||
:label="labelSubscribe"
|
||||
label-for="register-form-subscribe">
|
||||
<input
|
||||
id="register-form-subscribe"
|
||||
v-model="subscribe"
|
||||
name="subscribe"
|
||||
type="checkbox" />
|
||||
</b-form-group>
|
||||
<b-button v-localize name="create" type="submit" :disabled="disableCreate"
|
||||
>Create</b-button
|
||||
|
||||
@@ -46,7 +46,7 @@ onMounted(async () => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<b-card body-class="p-0">
|
||||
<b-card body-class="p-0" class="workflow-display">
|
||||
<b-card-header v-if="!embedded">
|
||||
<span class="float-right">
|
||||
<b-button
|
||||
|
||||
@@ -72,7 +72,7 @@ async function submit(ev: SubmitEvent) {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<b-form class="mt-4" @submit="submit">
|
||||
<b-form class="mt-4 workflow-import-file" @submit="submit">
|
||||
<h2 class="h-sm">Import from a Galaxy workflow export URL or a workflow file</h2>
|
||||
<b-form-group label="Archived Workflow URL">
|
||||
<b-form-input
|
||||
|
||||
@@ -154,7 +154,7 @@ async function importVersionFromUrl(url: string, isRunFormRedirect = false) {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div class="workflow-import-trs-id">
|
||||
<b-card v-if="!isAnonymous" title="GA4GH Tool Registry Server (TRS) Workflow Import">
|
||||
<div>
|
||||
<b>TRS Server:</b>
|
||||
@@ -169,7 +169,7 @@ async function importVersionFromUrl(url: string, isRunFormRedirect = false) {
|
||||
</b-alert>
|
||||
<div v-else>
|
||||
<div class="my-3">
|
||||
<b-form-group label="TRS ID:" label-class="font-weight-bold">
|
||||
<b-form-group label="TRS ID:" label-for="trs-id-input" label-class="font-weight-bold">
|
||||
<b-form-input id="trs-id-input" v-model="toolId" debounce="500" />
|
||||
</b-form-group>
|
||||
</div>
|
||||
|
||||
@@ -118,7 +118,7 @@ async function importVersion(trsId?: string, toolIdToImport?: string, version?:
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<b-card title="GA4GH Tool Registry Server (TRS) Workflow Search">
|
||||
<b-card class="workflow-import-trs-search" title="GA4GH Tool Registry Server (TRS) Workflow Search">
|
||||
<b-alert :show="hasErrorMessage" variant="danger">{{ errorMessage }}</b-alert>
|
||||
|
||||
<div class="mb-3">
|
||||
@@ -147,7 +147,7 @@ async function importVersion(trsId?: string, toolIdToImport?: string, version?:
|
||||
:title="searchHelp">
|
||||
<icon icon="question" />
|
||||
</b-button>
|
||||
<b-button size="sm" data-description="show deleted filter toggle" @click="query = ''">
|
||||
<b-button size="sm" title="clear search" @click="query = ''">
|
||||
<icon icon="times" />
|
||||
</b-button>
|
||||
</b-input-group-append>
|
||||
|
||||
@@ -8,16 +8,16 @@ import FromFileOrUrl from "./Import/FromFileOrUrl";
|
||||
<section>
|
||||
<h1 class="h-lg">Import workflow</h1>
|
||||
<b-tabs fill>
|
||||
<b-tab title="Archived file or url" active>
|
||||
<b-tab title-link-class="workflow-import-file-link" title="Archived file or url" active>
|
||||
<FromFileOrUrl />
|
||||
</b-tab>
|
||||
<b-tab title="GA4GH servers">
|
||||
<b-tab title-link-class="workflow-import-trs-search-link" title="GA4GH servers">
|
||||
<div class="mt-4">
|
||||
<h2 class="h-sm">Import a Workflow from Configured GA4GH Tool Registry Servers (e.g. Dockstore)</h2>
|
||||
<TrsSearch />
|
||||
</div>
|
||||
</b-tab>
|
||||
<b-tab title="TRS ID">
|
||||
<b-tab title-link-class="workflow-import-trs-id-link" title="TRS ID">
|
||||
<div class="mt-4">
|
||||
<h2 class="h-sm">Import from a TRS ID</h2>
|
||||
<TrsImport />
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<Published :item="workflow">
|
||||
<template v-slot>
|
||||
<WorkflowDisplay :workflow-id="id" :workflow="workflow" :expanded="true" />
|
||||
<WorkflowDisplay :workflow-id="id" :expanded="true" />
|
||||
</template>
|
||||
</Published>
|
||||
</template>
|
||||
|
||||
@@ -562,6 +562,13 @@ workflows:
|
||||
dropdown: '[data-workflow-dropdown*="${id}"]'
|
||||
run_button: '[data-workflow-run*="${id}"]'
|
||||
bookmark_link: '.workflow-bookmark-link'
|
||||
import_file: '.workflow-import-file'
|
||||
import_trs_search: '.workflow-import-trs-search'
|
||||
import_trs_id: '.workflow-import-trs-id'
|
||||
import_file_link: '.workflow-import-file-link'
|
||||
import_trs_search_link: '.workflow-import-trs-search-link'
|
||||
import_trs_id_link: '.workflow-import-trs-id-link'
|
||||
|
||||
workflow_with_name:
|
||||
type: xpath
|
||||
selector: '//span[@class="workflow-dropdown-name" and text() = "${workflow_name}"]'
|
||||
@@ -718,6 +725,7 @@ workflow_editor:
|
||||
|
||||
workflow_show:
|
||||
selectors:
|
||||
_: '.workflow-display'
|
||||
title: '[data-description="workflow name"]'
|
||||
import_link: '[data-description="workflow import"]'
|
||||
|
||||
|
||||
@@ -592,10 +592,10 @@ class NavigatesGalaxy(HasDriver):
|
||||
"login": email,
|
||||
"password": password,
|
||||
}
|
||||
form = self.wait_for_visible(self.navigation.login.selectors.form)
|
||||
self.fill(form, login_info)
|
||||
login = self.components.login
|
||||
self.fill(login.form.wait_for_visible(), login_info)
|
||||
self.snapshot("logging-in")
|
||||
self.wait_for_and_click(self.navigation.login.selectors.submit)
|
||||
login.submit.wait_for_and_click()
|
||||
self.snapshot("login-submitted")
|
||||
|
||||
def register(self, email=None, password=None, username=None, confirm=None, assert_valid=True):
|
||||
@@ -610,10 +610,11 @@ class NavigatesGalaxy(HasDriver):
|
||||
|
||||
self.home()
|
||||
self.components.masthead.register_or_login.wait_for_and_click()
|
||||
self.wait_for_and_click(self.navigation.registration.selectors.toggle)
|
||||
form = self.wait_for_visible(self.navigation.registration.selectors.form)
|
||||
registration = self.components.registration
|
||||
registration.toggle.wait_for_and_click()
|
||||
form = registration.form.wait_for_visible()
|
||||
self.fill(form, dict(email=email, password=password, username=username, confirm=confirm))
|
||||
self.wait_for_and_click(self.navigation.registration.selectors.submit)
|
||||
registration.submit.wait_for_and_click()
|
||||
if assert_valid is False:
|
||||
self.assert_error_message()
|
||||
elif assert_valid:
|
||||
|
||||
@@ -5,6 +5,13 @@ from .framework import (
|
||||
|
||||
|
||||
class TestLogin(SeleniumTestCase):
|
||||
@selenium_test
|
||||
def test_login_accessibility(self):
|
||||
self.home()
|
||||
self.components.masthead.register_or_login.wait_for_and_click()
|
||||
login = self.components.login
|
||||
login.form.assert_no_axe_violations_with_impact_of_at_least("moderate")
|
||||
|
||||
@selenium_test
|
||||
def test_logging_in(self):
|
||||
email = self._get_random_email()
|
||||
|
||||
@@ -17,6 +17,15 @@ class TestRegistration(SeleniumTestCase):
|
||||
self.home()
|
||||
self.register()
|
||||
|
||||
@selenium_test
|
||||
def test_registration_accessibility(self):
|
||||
self.home()
|
||||
self.components.masthead.register_or_login.wait_for_and_click()
|
||||
registration = self.components.registration
|
||||
registration.toggle.wait_for_and_click()
|
||||
registration.form.wait_for_visible()
|
||||
registration.form.assert_no_axe_violations_with_impact_of_at_least("moderate")
|
||||
|
||||
@selenium_test
|
||||
def test_logout(self):
|
||||
self.home()
|
||||
|
||||
@@ -24,6 +24,19 @@ class TestWorkflowManagement(SeleniumTestCase, TestsGalaxyPagers, UsesWorkflowAs
|
||||
new_workflow = table_elements[0].find_element(By.CSS_SELECTOR, ".workflow-dropdown")
|
||||
assert "TestWorkflow1 (imported from URL)" in new_workflow.text, new_workflow.text
|
||||
|
||||
@selenium_test
|
||||
def test_import_accessibility(self):
|
||||
self.workflow_index_open()
|
||||
self.workflow_index_click_import()
|
||||
workflows = self.components.workflows
|
||||
workflows.import_file.assert_no_axe_violations_with_impact_of_at_least("moderate")
|
||||
workflows.import_trs_search_link.wait_for_and_click()
|
||||
# moderate violation relating to header ordering
|
||||
workflows.import_trs_search.assert_no_axe_violations_with_impact_of_at_least("serious")
|
||||
workflows.import_trs_id_link.wait_for_and_click()
|
||||
# ditto - moderate violation relating to header ordering
|
||||
workflows.import_trs_id.assert_no_axe_violations_with_impact_of_at_least("serious")
|
||||
|
||||
@selenium_test
|
||||
def test_view(self):
|
||||
self.workflow_index_open()
|
||||
@@ -39,8 +52,14 @@ class TestWorkflowManagement(SeleniumTestCase, TestsGalaxyPagers, UsesWorkflowAs
|
||||
# assert EXAMPLE_WORKFLOW_URL_1 in title_element.text
|
||||
self.workflow_index_click_option("View")
|
||||
workflow_show = self.components.workflow_show
|
||||
title_item = self.components.workflow_show.title.wait_for_visible()
|
||||
assert "TestWorkflow1" in title_item.text
|
||||
|
||||
@retry_assertion_during_transitions
|
||||
def check_title():
|
||||
title_item = self.components.workflow_show.title.wait_for_visible()
|
||||
assert "TestWorkflow1" in title_item.text
|
||||
|
||||
check_title()
|
||||
workflow_show._.assert_no_axe_violations_with_impact_of_at_least("moderate")
|
||||
import_link = workflow_show.import_link.wait_for_visible()
|
||||
assert "Import Workflow" in import_link.get_attribute("title")
|
||||
self.screenshot("workflow_manage_view")
|
||||
|
||||
Reference in New Issue
Block a user