(function ($) {
'use strict';
const settings = window.kingAddonsWishlist || {};
const getVariationId = ($button) => {
const explicit = parseInt($button.data('variation-id'), 10);
if (explicit) {
return explicit;
}
const $form = $button.closest('form.variations_form');
if ($form.length) {
const picked = parseInt($form.find('input.variation_id').val(), 10);
if (!isNaN(picked) && picked > 0) {
return picked;
}
}
return 0;
};
const updateButtonState = ($button, state) => {
const labelDefault = $button.attr('data-label-default') || settings.labels?.add || '';
const labelAdded = $button.attr('data-label-added') || settings.labels?.added || '';
const isAdded = state === 'added';
$button.attr('data-state', isAdded ? 'added' : 'default');
$button.attr('aria-pressed', isAdded ? 'true' : 'false');
$button.toggleClass('king-addons-wishlist-button--added', isAdded);
$button.toggleClass('king-addons-wishlist-button--default', !isAdded);
$button.attr('aria-label', isAdded ? labelAdded : labelDefault);
const $label = $button.find('.king-addons-wishlist-button__label');
if ($label.length) {
$label.text(isAdded ? labelAdded : labelDefault);
}
};
const updateCounters = (count) => {
$('.king-addons-wishlist-counter').each(function () {
const $counter = $(this);
$counter.attr('data-count', count);
$counter.text(count);
});
};
const restoreEmptyRows = () => {
$('.king-addons-wishlist-table tbody').each(function () {
const $tbody = $(this);
if ($tbody.find('.king-addons-wishlist-table__row').length) {
return;
}
if ($tbody.find('.king-addons-wishlist-table__empty').length) {
return;
}
const cols = $tbody.closest('table').find('thead th').length || 1;
$tbody.append(
'
| ' +
(settings.labels?.empty || 'No products in wishlist yet.') +
' |
'
);
});
};
const syncButtons = (productId, variationId, state) => {
$('.king-addons-wishlist-button').each(function () {
const $btn = $(this);
const pid = parseInt($btn.attr('data-product-id'), 10);
const vid = parseInt($btn.attr('data-variation-id'), 10) || 0;
if (pid !== productId || vid !== variationId) {
return;
}
if ($btn.hasClass('king-addons-wishlist-button--table-remove')) {
if (state === 'default') {
$btn.closest('tr').remove();
}
return;
}
updateButtonState($btn, state);
});
if (state === 'default') {
restoreEmptyRows();
}
};
const handleToggle = ($button) => {
const productId = parseInt($button.data('product-id'), 10);
const wishlistId = $button.data('wishlist-id') || '';
const variationId = getVariationId($button);
if (!productId) {
return;
}
$button.prop('disabled', true);
$.post(settings.ajaxUrl, {
action: 'king_addons_wishlist_toggle',
nonce: settings.nonce,
product_id: productId,
variation_id: variationId,
wishlist_id: wishlistId,
})
.done((response) => {
if (response.success && response.data) {
syncButtons(productId, variationId, response.data.state);
if (response.data.count !== undefined) {
updateCounters(response.data.count);
}
} else if (response?.data?.message) {
alert(response.data.message);
} else {
alert(settings.labels?.error || 'Error');
}
})
.fail((xhr) => {
if (xhr?.responseJSON?.data?.message) {
alert(xhr.responseJSON.data.message);
} else {
alert(settings.labels?.error || 'Error');
}
})
.always(() => {
$button.prop('disabled', false);
});
};
$(document).on('click', '.king-addons-wishlist-button', function (event) {
event.preventDefault();
handleToggle($(this));
});
// Notes functionality (Pro)
const handleNoteSave = ($container) => {
const productId = parseInt($container.data('product-id'), 10);
const variationId = parseInt($container.data('variation-id'), 10) || 0;
const wishlistId = $container.data('wishlist-id') || '';
const note = $container.find('.king-addons-wishlist-notes__input').val().trim();
const $saveBtn = $container.find('.king-addons-wishlist-notes__save');
$saveBtn.prop('disabled', true).text('...');
$.post(settings.ajaxUrl, {
action: 'king_addons_wishlist_update_note',
nonce: settings.nonce,
product_id: productId,
variation_id: variationId,
wishlist_id: wishlistId,
note: note,
})
.done((response) => {
if (response.success) {
const $display = $container.find('.king-addons-wishlist-notes__display');
const $form = $container.find('.king-addons-wishlist-notes__form');
const $text = $container.find('.king-addons-wishlist-notes__text');
$text.text(note);
if (note) {
$display.show();
$form.hide();
} else {
$display.hide();
$form.show();
}
} else if (response?.data?.message) {
alert(response.data.message);
}
})
.fail((xhr) => {
if (xhr?.responseJSON?.data?.message) {
alert(xhr.responseJSON.data.message);
} else {
alert(settings.labels?.error || 'Error');
}
})
.always(() => {
$saveBtn.prop('disabled', false).text('Save');
});
};
// Edit note button click
$(document).on('click', '.king-addons-wishlist-notes__edit-btn', function (event) {
event.preventDefault();
const $container = $(this).closest('.king-addons-wishlist-notes');
$container.find('.king-addons-wishlist-notes__display').hide();
$container.find('.king-addons-wishlist-notes__form').show();
$container.find('.king-addons-wishlist-notes__input').focus();
});
// Save note button click
$(document).on('click', '.king-addons-wishlist-notes__save', function (event) {
event.preventDefault();
const $container = $(this).closest('.king-addons-wishlist-notes');
handleNoteSave($container);
});
// Cancel note edit
$(document).on('click', '.king-addons-wishlist-notes__cancel', function (event) {
event.preventDefault();
const $container = $(this).closest('.king-addons-wishlist-notes');
const $display = $container.find('.king-addons-wishlist-notes__display');
const $form = $container.find('.king-addons-wishlist-notes__form');
const originalNote = $display.find('.king-addons-wishlist-notes__text').text();
$container.find('.king-addons-wishlist-notes__input').val(originalNote);
$display.show();
$form.hide();
});
// Submit on Enter key
$(document).on('keydown', '.king-addons-wishlist-notes__input', function (event) {
if (event.key === 'Enter' && !event.shiftKey) {
event.preventDefault();
const $container = $(this).closest('.king-addons-wishlist-notes');
handleNoteSave($container);
}
});
})(jQuery);