mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-01-31 13:29:55 +00:00
Improve sidebar accessibility (#759)
* Add ARIA label to sidebar buttons * Add component test * Add generalized component tests
This commit is contained in:
@@ -3,11 +3,14 @@
|
||||
:class="props.class"
|
||||
text
|
||||
:pt="{
|
||||
root: `side-bar-button ${
|
||||
props.selected
|
||||
? 'p-button-primary side-bar-button-selected'
|
||||
: 'p-button-secondary'
|
||||
}`
|
||||
root: {
|
||||
class: `side-bar-button ${
|
||||
props.selected
|
||||
? 'p-button-primary side-bar-button-selected'
|
||||
: 'p-button-secondary'
|
||||
}`,
|
||||
'aria-label': props.tooltip
|
||||
}
|
||||
}"
|
||||
@click="emit('click', $event)"
|
||||
v-tooltip="{ value: props.tooltip, showDelay: 300, hideDelay: 300 }"
|
||||
|
||||
75
src/components/sidebar/__tests__/SidebarIcon.spec.ts
Normal file
75
src/components/sidebar/__tests__/SidebarIcon.spec.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { mount } from '@vue/test-utils'
|
||||
import { expect, describe, it } from 'vitest'
|
||||
import SidebarIcon from '../SidebarIcon.vue'
|
||||
import OverlayBadge from 'primevue/overlaybadge'
|
||||
import Button from 'primevue/button'
|
||||
import Tooltip from 'primevue/tooltip'
|
||||
import PrimeVue from 'primevue/config'
|
||||
|
||||
type SidebarIconProps = {
|
||||
icon: string
|
||||
selected: boolean
|
||||
tooltip?: string
|
||||
class?: string
|
||||
iconBadge?: string | (() => string | null)
|
||||
}
|
||||
|
||||
describe('SidebarIcon', () => {
|
||||
const exampleProps: SidebarIconProps = {
|
||||
icon: 'pi pi-cog',
|
||||
selected: false
|
||||
}
|
||||
|
||||
const mountSidebarIcon = (props: Partial<SidebarIconProps>, options = {}) => {
|
||||
return mount(SidebarIcon, {
|
||||
global: {
|
||||
plugins: [PrimeVue],
|
||||
directives: { tooltip: Tooltip },
|
||||
components: { OverlayBadge, Button }
|
||||
},
|
||||
props: { ...exampleProps, ...props },
|
||||
...options
|
||||
})
|
||||
}
|
||||
|
||||
it('renders label', () => {
|
||||
const wrapper = mountSidebarIcon({})
|
||||
expect(wrapper.find('.p-button.p-component').exists()).toBe(true)
|
||||
expect(wrapper.find('.p-button-label').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders icon', () => {
|
||||
const wrapper = mountSidebarIcon({})
|
||||
expect(wrapper.find('.p-button-icon-only').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('creates badge when iconBadge prop is set', () => {
|
||||
const badge = '2'
|
||||
const wrapper = mountSidebarIcon({ iconBadge: badge })
|
||||
const badgeEl = wrapper.findComponent(OverlayBadge)
|
||||
expect(badgeEl.exists()).toBe(true)
|
||||
expect(badgeEl.find('.p-badge').text()).toEqual(badge)
|
||||
})
|
||||
|
||||
it('shows tooltip on hover', async () => {
|
||||
const tooltipShowDelay = 300
|
||||
const tooltipText = 'Settings'
|
||||
const wrapper = mountSidebarIcon({ tooltip: tooltipText })
|
||||
|
||||
const tooltipElBeforeHover = document.querySelector('[role="tooltip"]')
|
||||
expect(tooltipElBeforeHover).toBeNull()
|
||||
|
||||
// Hover over the icon
|
||||
await wrapper.trigger('mouseenter')
|
||||
await new Promise((resolve) => setTimeout(resolve, tooltipShowDelay + 16))
|
||||
|
||||
const tooltipElAfterHover = document.querySelector('[role="tooltip"]')
|
||||
expect(tooltipElAfterHover).not.toBeNull()
|
||||
})
|
||||
|
||||
it('sets aria-label attribute when tooltip is provided', () => {
|
||||
const tooltipText = 'Settings'
|
||||
const wrapper = mountSidebarIcon({ tooltip: tooltipText })
|
||||
expect(wrapper.attributes('aria-label')).toEqual(tooltipText)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user