Skip to content
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
11 changes: 8 additions & 3 deletions core/src/utils/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ export const getAriaLabel = (componentEl: HTMLElement, inputId: string): { label
: inputId + '-lbl';

let label = labelledBy !== null && labelledBy.trim() !== ''
? document.querySelector(`#${labelledBy}`)
? document.getElementById(labelledBy)
: findItemLabel(componentEl);

if (label) {
Expand All @@ -147,10 +147,15 @@ export const getAriaLabel = (componentEl: HTMLElement, inputId: string): { label
// if there is no label, check to see if the user has provided
// one by setting an id on the component and using the label element
} else if (componentId.trim() !== '') {
label = document.querySelector(`label[for=${componentId}]`);
label = document.querySelector(`label[for="${componentId}"]`);

if (label) {
label.id = labelId = `${componentId}-lbl`;
if (label.id !== '') {
labelId = label.id;
} else {
label.id = labelId = `${componentId}-lbl`;
}

labelText = label.textContent;
}
}
Expand Down
96 changes: 96 additions & 0 deletions core/src/utils/test/aria.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { newSpecPage } from '@stencil/core/testing';
import { getAriaLabel } from '../helpers';
import { Item } from '../../components/item/item.tsx';
import { Label } from '../../components/label/label.tsx';
import { Toggle } from '../../components/toggle/toggle.tsx';

describe('getAriaLabel()', () => {
it('should correctly link component to label', async () => {
const page = await newSpecPage({
components: [Item, Label, Toggle],
html: `
<ion-item>
<ion-label>My Label</ion-label>
<ion-toggle></ion-toggle>
</ion-item>
`
});

const toggle = page.body.querySelector('ion-toggle');

const { label, labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0');

expect(labelText).toEqual('My Label');
expect(labelId).toEqual('ion-tg-0-lbl');
expect(label).toEqual(page.body.querySelector('ion-label'));
});

it('should correctly link component when using custom label', async () => {
const page = await newSpecPage({
components: [Toggle],
html: `
<div id="my-label">Hello World</div>
<ion-toggle aria-labelledby="my-label"></ion-toggle>
`
});

const toggle = page.body.querySelector('ion-toggle');

const { label, labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0');

expect(labelText).toEqual('Hello World');
expect(labelId).toEqual('my-label');
expect(label).toEqual(page.body.querySelector('#my-label'));
});

it('should correctly link component when special characters are used', async () => {
const page = await newSpecPage({
components: [Toggle],
html: `
<div id="id.1">Hello World</div>
<ion-toggle aria-labelledby="id.1"></ion-toggle>
`
});

const toggle = page.body.querySelector('ion-toggle');

const { label, labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0');

expect(labelText).toEqual('Hello World');
expect(labelId).toEqual('id.1');
});

it('should only set the label id if one was not set already', async () => {
const page = await newSpecPage({
components: [Toggle],
html: `
<label id="my-id" for="id.1">Hello World</label>
<ion-toggle id="id.1"></ion-toggle>
`
});

const toggle = page.body.querySelector('ion-toggle');

const { label, labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0');

expect(labelText).toEqual('Hello World');
expect(labelId).toEqual('my-id');
});

it('should set label id', async () => {
const page = await newSpecPage({
components: [Toggle],
html: `
<label for="id.1">Hello World</label>
<ion-toggle id="id.1"></ion-toggle>
`
});

const toggle = page.body.querySelector('ion-toggle');

const { label, labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0');

expect(labelText).toEqual('Hello World');
expect(labelId).toEqual('id.1-lbl');
});
});