Skip to content

Commit

Permalink
Add ARIA support for Fomantic UI checkboxes (go-gitea#22599)
Browse files Browse the repository at this point in the history
Replace go-gitea#22593

This is a general approach to add ARIA support for all Fomantic UI
checkboxes (including radioboxes)

* Pros:
* General approach, it works for all Fomantic UI checkboxes / radioboxes
    * No need to write IDs manually everywhere
    * No need to tell new contributors to write IDs again and again

* Cons:
* Slightly affects performance, but it's really trivial, because there
was already a heavy `$('.ui.checkbox').checkbox()` for Fomantic UI
before. So everything is still fine.

Screenshot (from the repo setting page, which has various checkboxes):

<details>

![image](https://user-images.githubusercontent.com/2114189/214480937-3a54d36f-55c3-49de-9c45-c4bb21f1f4c6.png)

</details>

(cherry picked from commit d4610480ee610ec7d63ae17440128f057bc0d531)
  • Loading branch information
wxiaoguang authored and Loïc Dachary committed Feb 20, 2023
1 parent 0db7a0a commit f320204
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
17 changes: 17 additions & 0 deletions web_src/js/features/aria.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,20 @@ function attachOneDropdownAria($dropdown) {
export function attachDropdownAria($dropdowns) {
$dropdowns.each((_, e) => attachOneDropdownAria($(e)));
}

export function attachCheckboxAria($checkboxes) {
$checkboxes.checkbox();

// Fomantic UI checkbox needs to be something like: <div class="ui checkbox"><label /><input /></div>
// It doesn't work well with <label><input />...</label>
// To make it work with aria, the "id"/"for" attributes are necessary, so add them automatically if missing.
// In the future, refactor to use native checkbox directly, then this patch could be removed.
for (const el of $checkboxes) {
const label = el.querySelector('label');
const input = el.querySelector('input');
if (!label || !input || input.getAttribute('id')) continue;
const id = generateAriaId();
input.setAttribute('id', id);
label.setAttribute('for', id);
}
}
4 changes: 2 additions & 2 deletions web_src/js/features/common-global.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {mqBinarySearch} from '../utils.js';
import createDropzone from './dropzone.js';
import {initCompColorPicker} from './comp/ColorPicker.js';
import {showGlobalErrorMessage} from '../bootstrap.js';
import {attachDropdownAria} from './aria.js';
import {attachCheckboxAria, attachDropdownAria} from './aria.js';
import {handleGlobalEnterQuickSubmit} from './comp/QuickSubmit.js';
import {initTooltip} from '../modules/tippy.js';

Expand Down Expand Up @@ -110,7 +110,7 @@ export function initGlobalCommon() {
});
attachDropdownAria($uiDropdowns);

$('.ui.checkbox').checkbox();
attachCheckboxAria($('.ui.checkbox'));

$('.tabular.menu .item').tab();
$('.tabable.menu .item').tab();
Expand Down

0 comments on commit f320204

Please sign in to comment.