Refactor #5106 - OrderList accessibility

pull/4972/head
tugcekucukoglu 2024-01-19 11:13:17 +03:00
parent bed58e4f80
commit 3b764469fd
1 changed files with 60 additions and 47 deletions

View File

@ -141,17 +141,7 @@ export default {
}, },
onListFocus(event) { onListFocus(event) {
this.focused = true; this.focused = true;
const selectedFirstItem = this.autoOptionFocus this.findCurrentFocusedIndex();
? DomHandler.findSingle(this.list, '[data-p-highlight="true"]') || DomHandler.findSingle(this.list, '[data-pc-section="item"]')
: DomHandler.findSingle(this.list, '[data-p-highlight="true"]');
if (selectedFirstItem) {
const findIndex = ObjectUtils.findIndexInList(selectedFirstItem, this.list.children);
const index = this.focusedOptionIndex !== -1 ? this.focusedOptionIndex : selectedFirstItem ? findIndex : -1;
this.changeFocusedOptionIndex(index);
}
this.$emit('focus', event); this.$emit('focus', event);
}, },
onListBlur(event) { onListBlur(event) {
@ -203,7 +193,7 @@ export default {
this.focusedOptionIndex = index; this.focusedOptionIndex = index;
}, },
onArrowDownKey(event) { onArrowDownKey(event) {
const optionIndex = this.findNextOptionIndex(this.focusedOptionIndex); const optionIndex = this.focusedOptionIndex !== -1 ? this.findNextOptionIndex(this.focusedOptionIndex) : this.findFirstSelectedOptionIndex();
this.changeFocusedOptionIndex(optionIndex); this.changeFocusedOptionIndex(optionIndex);
@ -214,7 +204,7 @@ export default {
event.preventDefault(); event.preventDefault();
}, },
onArrowUpKey(event) { onArrowUpKey(event) {
const optionIndex = this.findPrevOptionIndex(this.focusedOptionIndex); const optionIndex = this.focusedOptionIndex !== -1 ? this.findPrevOptionIndex(this.focusedOptionIndex) : this.findLastSelectedOptionIndex();
this.changeFocusedOptionIndex(optionIndex); this.changeFocusedOptionIndex(optionIndex);
@ -226,9 +216,7 @@ export default {
}, },
onHomeKey(event) { onHomeKey(event) {
if (event.ctrlKey && event.shiftKey) { if (event.ctrlKey && event.shiftKey) {
const items = DomHandler.find(this.list, '[data-pc-section="item"]'); const matchedOptionIndex = this.findMatchedOptionIndex();
const focusedItem = DomHandler.findSingle(this.list, `[data-pc-section="item"][id=${this.focusedOptionIndex}]`);
const matchedOptionIndex = [...items].findIndex((item) => item === focusedItem);
this.d_selection = [...this.modelValue].slice(0, matchedOptionIndex + 1); this.d_selection = [...this.modelValue].slice(0, matchedOptionIndex + 1);
this.$emit('update:selection', this.d_selection); this.$emit('update:selection', this.d_selection);
@ -244,9 +232,7 @@ export default {
}, },
onEndKey(event) { onEndKey(event) {
if (event.ctrlKey && event.shiftKey) { if (event.ctrlKey && event.shiftKey) {
const items = DomHandler.find(this.list, '[data-pc-section="item"]'); const matchedOptionIndex = this.findMatchedOptionIndex();
const focusedItem = DomHandler.findSingle(this.list, `[data-pc-section="item"][id=${this.focusedOptionIndex}]`);
const matchedOptionIndex = [...items].findIndex((item) => item === focusedItem);
this.d_selection = [...this.modelValue].slice(matchedOptionIndex, items.length); this.d_selection = [...this.modelValue].slice(matchedOptionIndex, items.length);
this.$emit('update:selection', this.d_selection); this.$emit('update:selection', this.d_selection);
@ -255,28 +241,23 @@ export default {
value: this.d_selection value: this.d_selection
}); });
} else { } else {
this.changeFocusedOptionIndex(DomHandler.find(this.list, '[data-pc-section="item"]').length - 1); this.changeFocusedOptionIndex(this.findAllItems().length - 1);
} }
event.preventDefault(); event.preventDefault();
}, },
onEnterKey(event) { onEnterKey(event) {
const items = DomHandler.find(this.list, '[data-pc-section="item"]'); const matchedOptionIndex = this.findMatchedOptionIndex();
const focusedItem = DomHandler.findSingle(this.list, `[data-pc-section="item"][id=${this.focusedOptionIndex}]`);
const matchedOptionIndex = [...items].findIndex((item) => item === focusedItem);
this.onItemClick(event, this.modelValue[matchedOptionIndex], matchedOptionIndex); this.onItemClick(event, this.modelValue[matchedOptionIndex], matchedOptionIndex);
event.preventDefault(); event.preventDefault();
}, },
onSpaceKey(event) { onSpaceKey(event) {
event.preventDefault(); event.preventDefault();
if (event.shiftKey && this.d_selection && this.d_selection.length > 0) { if (event.shiftKey && this.d_selection && this.d_selection.length > 0) {
const items = DomHandler.find(this.list, '[data-pc-section="item"]');
const selectedItemIndex = ObjectUtils.findIndexInList(this.d_selection[0], [...this.modelValue]); const selectedItemIndex = ObjectUtils.findIndexInList(this.d_selection[0], [...this.modelValue]);
const focusedItem = DomHandler.findSingle(this.list, `[data-pc-section="item"][id=${this.focusedOptionIndex}]`); const matchedOptionIndex = this.findMatchedOptionIndex();
const matchedOptionIndex = [...items].findIndex((item) => item === focusedItem);
this.d_selection = [...this.modelValue].slice(Math.min(selectedItemIndex, matchedOptionIndex), Math.max(selectedItemIndex, matchedOptionIndex) + 1); this.d_selection = [...this.modelValue].slice(Math.min(selectedItemIndex, matchedOptionIndex), Math.max(selectedItemIndex, matchedOptionIndex) + 1);
this.$emit('update:selection', this.d_selection); this.$emit('update:selection', this.d_selection);
@ -288,20 +269,61 @@ export default {
this.onEnterKey(event); this.onEnterKey(event);
} }
}, },
findNextOptionIndex(index) { findAllItems() {
const items = DomHandler.find(this.list, '[data-pc-section="item"]'); return DomHandler.find(this.list, '[data-pc-section="item"]');
const matchedOptionIndex = [...items].findIndex((link) => link.id === index); },
findFocusedItem() {
return DomHandler.findSingle(this.list, `[data-pc-section="item"][id=${this.focusedOptionIndex}]`);
},
findCurrentFocusedIndex() {
this.focusedOptionIndex = this.findFirstSelectedOptionIndex();
if (this.autoOptionFocus && this.focusedOptionIndex === -1) {
this.focusedOptionIndex = this.findFirstFocusedOptionIndex();
}
this.scrollInView(this.focusedOptionIndex);
},
findFirstFocusedOptionIndex() {
const firstFocusableItem = DomHandler.findSingle(this.list, '[data-pc-section="item"]');
return DomHandler.getAttribute(firstFocusableItem, 'id');
},
findFirstSelectedOptionIndex() {
if (this.hasSelectedOption) {
const selectedFirstItem = DomHandler.findSingle(this.list, '[data-p-highlight="true"]');
return DomHandler.getAttribute(selectedFirstItem, 'id');
}
return -1;
},
findLastSelectedOptionIndex() {
if (this.hasSelectedOption) {
const selectedItems = DomHandler.find(this.list, '[data-p-highlight="true"]');
return ObjectUtils.findIndexInList(selectedItems[selectedItems.length - 1], this.list.children);
}
return -1;
},
findMatchedOptionIndex(id = this.focusedOptionIndex) {
const items = this.findAllItems();
return [...items].findIndex((link) => link.id === id);
},
findNextOptionIndex(id) {
const matchedOptionIndex = this.findMatchedOptionIndex(id);
return matchedOptionIndex > -1 ? matchedOptionIndex + 1 : 0; return matchedOptionIndex > -1 ? matchedOptionIndex + 1 : 0;
}, },
findPrevOptionIndex(index) { findPrevOptionIndex(id) {
const items = DomHandler.find(this.list, '[data-pc-section="item"]'); const matchedOptionIndex = this.findMatchedOptionIndex(id);
const matchedOptionIndex = [...items].findIndex((link) => link.id === index);
return matchedOptionIndex > -1 ? matchedOptionIndex - 1 : 0; return matchedOptionIndex > -1 ? matchedOptionIndex - 1 : 0;
}, },
changeFocusedOptionIndex(index) { changeFocusedOptionIndex(index) {
const items = DomHandler.find(this.list, '[data-pc-section="item"]'); const items = this.findAllItems();
let order = index >= items.length ? items.length - 1 : index < 0 ? 0 : index; let order = index >= items.length ? items.length - 1 : index < 0 ? 0 : index;
@ -429,7 +451,7 @@ export default {
const selected = selectedIndex != -1; const selected = selectedIndex != -1;
const metaSelection = this.itemTouched ? false : this.metaKeySelection; const metaSelection = this.itemTouched ? false : this.metaKeySelection;
const selectedId = DomHandler.find(this.list, '[data-pc-section="item"]')[index].getAttribute('id'); const selectedId = this.findAllItems()[index].getAttribute('id');
this.focusedOptionIndex = event?.type === 'click' ? -1 : selectedId; this.focusedOptionIndex = event?.type === 'click' ? -1 : selectedId;
@ -460,18 +482,6 @@ export default {
onItemTouchEnd() { onItemTouchEnd() {
this.itemTouched = true; this.itemTouched = true;
}, },
findNextItem(item) {
let nextItem = item.nextElementSibling;
if (nextItem) return !(DomHandler.getAttribute(nextItem, 'data-pc-section') === 'item') ? this.findNextItem(nextItem) : nextItem;
else return null;
},
findPrevItem(item) {
let prevItem = item.previousElementSibling;
if (prevItem) return !(DomHandler.getAttribute(nextItem, 'data-pc-section') === 'item') ? this.findPrevItem(prevItem) : prevItem;
else return null;
},
updateListScroll() { updateListScroll() {
const listItems = DomHandler.find(this.list, '[data-pc-section="item"][data-p-highlight="true"]'); const listItems = DomHandler.find(this.list, '[data-pc-section="item"][data-p-highlight="true"]');
@ -564,6 +574,9 @@ export default {
}, },
moveBottomAriaLabel() { moveBottomAriaLabel() {
return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.moveBottom : undefined; return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.moveBottom : undefined;
},
hasSelectedOption() {
return ObjectUtils.isNotEmpty(this.d_selection);
} }
}, },
components: { components: {