Skip to content

Commit

Permalink
Migrate to delegated event listeners to simplify and fix focus bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
lhoffbeck committed Feb 3, 2025
1 parent 7319935 commit 9a7b42d
Showing 1 changed file with 34 additions and 61 deletions.
95 changes: 34 additions & 61 deletions assets/quick-order-list.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ if (!customElements.get('quick-order-list')) {
}

this.querySelector('form').addEventListener('submit', (event) => event.preventDefault());

this.handleVariantInputKeydownMulti = this.handleVariantInputKeydownMulti.bind(this);
}

connectedCallback() {
Expand Down Expand Up @@ -63,7 +61,12 @@ if (!customElements.get('quick-order-list')) {
});
});

this.querySelector('.quick-order-list__table').addEventListener('focusin', this.switchVariants.bind(this));
this.querySelector('.quick-order-list__contents').addEventListener(
'keyup',
this.handleScrollIntoView.bind(this)
);

this.quickOrderListTable.addEventListener('keydown', this.handleSwitchVariantOnEnter.bind(this));

this.initVariantEventListeners();
}
Expand Down Expand Up @@ -129,6 +132,10 @@ if (!customElements.get('quick-order-list')) {
}
}

get quickOrderListTable() {
return this.querySelector('.quick-order-list__table');
}

getSectionsToRender() {
return [
{
Expand All @@ -155,10 +162,7 @@ if (!customElements.get('quick-order-list')) {
}

toggleTableLoading(enable) {
this.querySelector('.quick-order-list__table').classList.toggle(
'quick-order-list__container--disabled',
enable
);
this.quickOrderListTable.classList.toggle('quick-order-list__container--disabled', enable);
this.toggleLoading(enable);
}

Expand Down Expand Up @@ -214,7 +218,7 @@ if (!customElements.get('quick-order-list')) {
const shouldUpdateVariants =
this.currentPage === (newSection.querySelector('.pagination-wrapper')?.dataset.page ?? '1');
if (newTable && shouldUpdateVariants) {
const table = this.querySelector('.quick-order-list__table');
const table = this.quickOrderListTable;

// skip variants that are queued for update
[...new Set(this.queue.map(({ id }) => id))].forEach(
Expand All @@ -227,8 +231,6 @@ if (!customElements.get('quick-order-list')) {
const newFocusTarget = this.querySelector(`[data-target='${focusTarget}']`);
if (newFocusTarget) {
newFocusTarget?.focus({ preventScroll: true });
} else {
getFocusableElements(this)?.[0]?.focus({ preventScroll: true });
}

this.initVariantEventListeners();
Expand Down Expand Up @@ -256,21 +258,20 @@ if (!customElements.get('quick-order-list')) {
}
}

scrollQuickOrderListTable(variantListInput) {
const inputTopBorder = variantListInput.getBoundingClientRect().top;
const inputBottomBorder = variantListInput.getBoundingClientRect().bottom;
scrollQuickOrderListTable(target) {
const inputTopBorder = target.getBoundingClientRect().top;
const inputBottomBorder = target.getBoundingClientRect().bottom;

if (this.isListInsideModal) {
const totalBarCrossesInput = inputBottomBorder > this.totalBar.getBoundingClientRect().top;
const tableHeadCrossesInput =
inputTopBorder < this.querySelector('.quick-order-list__table thead').getBoundingClientRect().bottom;

if (totalBarCrossesInput || tableHeadCrossesInput) {
this.scrollToCenter(variantListInput);
this.scrollToCenter(target);
}
} else {
const stickyHeaderBottomBorder =
this.stickyHeaderElement && this.stickyHeaderElement.getBoundingClientRect().bottom;
const stickyHeaderBottomBorder = this.stickyHeaderElement?.getBoundingClientRect().bottom;
const totalBarCrossesInput = inputBottomBorder > this.totalBarPosition;
const inputOutsideOfViewPort =
inputBottomBorder < this.querySelector('.variant-item__quantity-wrapper').offsetHeight;
Expand All @@ -290,65 +291,37 @@ if (!customElements.get('quick-order-list')) {
stickyHeaderCrossesInput ||
stickyHeaderScrollupCrossesInput
) {
this.scrollToCenter(variantListInput);
this.scrollToCenter(target);
}
}
}

scrollToCenter(variantListInput) {
variantListInput.scrollIntoView({
scrollToCenter(target) {
target.scrollIntoView({
block: 'center',
behavior: 'smooth',
});
}

switchVariants(event) {
const variantTarget = event.target;

if (this.allInputsArray.length !== 1) {
this.scrollQuickOrderListTable(variantTarget);
handleScrollIntoView(event) {
if ((event.key === 'Tab' || event.key === 'Enter') && this.allInputsArray.length !== 1) {
this.scrollQuickOrderListTable(event.target);
}
}

if (variantTarget.tagName !== 'INPUT') {
return;
}
handleSwitchVariantOnEnter(event) {
if (event.key !== 'Enter' || event.target.tagName !== 'INPUT') return;

variantTarget.select();
if (this.allInputsArray.length !== 1) {
variantTarget.removeEventListener('keydown', this.handleVariantInputKeydownMulti);
variantTarget.addEventListener('keydown', this.handleVariantInputKeydownMulti);
} else {
variantTarget.removeEventListener('keydown', this.handleVariantInputKeydownSingle);
variantTarget.addEventListener('keydown', this.handleVariantInputKeydownSingle);
}
}
event.preventDefault();
event.target.blur();

handleVariantInputKeydownSingle(event) {
if (event.key === 'Enter') {
event.preventDefault();
event.target.blur();
}
}
if (!this.validateInput(event.target) || this.allInputsArray.length <= 1) return;

handleVariantInputKeydownMulti(event) {
if (event.key === 'Enter') {
event.preventDefault();
event.target.blur();
if (this.validateInput(event.target)) {
const currentIndex = this.allInputsArray.indexOf(event.target);
if (!event.shiftKey) {
const nextIndex = currentIndex + 1;
const nextVariant = this.allInputsArray[nextIndex] || this.allInputsArray[0];
nextVariant.select();
} else {
const previousIndex = currentIndex - 1;
const previousVariant =
this.allInputsArray[previousIndex] || this.allInputsArray[this.allInputsArray.length - 1];
this.lastElement = previousVariant.dataset.index;
previousVariant.select();
}
}
}
const currentIndex = this.allInputsArray.indexOf(event.target);
const offset = event.shiftKey ? -1 : 1;
const nextIndex = (currentIndex + offset + this.allInputsArray.length) % this.allInputsArray.length;

this.allInputsArray[nextIndex]?.select();
}

updateMultipleQty(items) {
Expand Down

0 comments on commit 9a7b42d

Please sign in to comment.