Files
Jacek Pyziak cd264483f8 Add PSR HTTP Message Interfaces and Dependencies
- Implemented StreamInterface, UploadedFileInterface, and UriInterface as per PSR standards.
- Added getallheaders function to retrieve HTTP headers in a compatible manner.
- Included LICENSE files for ralouphie/getallheaders and symfony/deprecation-contracts.
- Introduced function for triggering deprecation notices in Symfony.
2025-12-28 12:44:00 +01:00

221 lines
7.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
class BlockFilterSorter {
constructor() {
this.tableBody = document.querySelector('.atfp-custom-data-table-table tbody');
this.filters = document.querySelectorAll('.atfp-custom-data-table-filters .atfp-filter-tab');
this.atfpDataTableObj = null;
this.saveButtonEnabled = false;
this.saveButtonText = false;
this.saveButtonClass = false;
this.saveButtonAction = false;
this.saveButtonNonce = false;
this.displayAjaxNotice=false;
this.ajaxUrl = false;
if (window.atfpCustomTableDataObject) {
if (atfpCustomTableDataObject.save_button_enabled && '' !== atfpCustomTableDataObject.save_button_enabled) {
this.saveButtonEnabled = atfpCustomTableDataObject.save_button_enabled;
}
if (atfpCustomTableDataObject.save_button_text && '' !== atfpCustomTableDataObject.save_button_text) {
this.saveButtonText = atfpCustomTableDataObject.save_button_text;
}
if (atfpCustomTableDataObject.save_button_class && '' !== atfpCustomTableDataObject.save_button_class) {
this.saveButtonClass = atfpCustomTableDataObject.save_button_class;
}
if (atfpCustomTableDataObject.save_button_handler && '' !== atfpCustomTableDataObject.save_button_handler) {
this.saveButtonAction = atfpCustomTableDataObject.save_button_handler;
}
if (atfpCustomTableDataObject.save_button_nonce && '' !== atfpCustomTableDataObject.save_button_nonce) {
this.saveButtonNonce = atfpCustomTableDataObject.save_button_nonce;
}
if (atfpCustomTableDataObject.admin_url && '' !== atfpCustomTableDataObject.admin_url) {
this.ajaxUrl = atfpCustomTableDataObject.admin_url;
}
const inputFields = document.querySelectorAll('#atfp-custom-datatable tbody input[name="atfp_fields_status"]');
inputFields.forEach(input => {
input.addEventListener('change', this.updateStatusHandler.bind(this));
});
}
if (this.tableBody) {
this.atfpDataTable();
this.filters.forEach(filter => {
filter.addEventListener('input', this.datatableFilterHandler.bind(this));
});
}
}
atfpDataTable() {
if (this.tableBody) {
this.atfpDataTableObj = new DataTable('#atfp-custom-datatable', {
pageLength: 25,
infoCallback: function (settings, start, end, total, max) {
return `Showing ${start} to ${end} of ${max} records`;
}
});
this.atfpDataTableObj.on('draw.dt', function (e) {
const rows = jQuery(this).find('tbody tr');
if (rows.length.length === 0) {
this.atfpDataTableObj.empty();
}
const length = e.dt.page.info().length;
const page = e.dt.page.info().page;
rows.each(function (index, row) {
const emptyCell = row.querySelector('td.dt-empty');
if (!emptyCell) {
row.children[0].textContent = (page * length) + index + 1;
}
});
});
const tableWrp = document.getElementById('atfp-custom-datatable_wrapper');
const selectWrapper = document.querySelector('.atfp-custom-data-table-filters');
selectWrapper.remove();
tableWrp.prepend(selectWrapper);
if (this.saveButtonEnabled && '' !== this.saveButtonText && 'false' !== this.saveButtonText) {
const saveButton = this.appendSaveButton();
const lastRow = tableWrp.querySelector('.dt-layout-row:last-child');
lastRow.before(saveButton);
jQuery(`.${this.saveButtonClass}`).on('click', this.saveButtonHandler.bind(this));
}
}
}
datatableFilterHandler(e) {
if (this.atfpDataTableObj) {
let value = e.target.value;
let wrapper = e.target.closest('.atfp-filter-tab');
let column = parseInt(wrapper.dataset.column);
let defaultValue = wrapper.dataset.default;
value = value === defaultValue ? false : value;
this.atfpDataTableObj.column(column).search(value ? new RegExp('^' + value, 'i') : '', false, false, false).draw();
}
}
updateStatusHandler(e) {
const table = jQuery('#atfp-custom-datatable').DataTable();
if (!table) return; // DataTable not initialized
const $tr = jQuery(e.target).closest('tr');
if (!$tr.length) return; // no row found
const dtRow = table.row($tr);
if (!dtRow.node()) return; // row doesnt exist in DataTable
const checked = e.target.checked;
const status = checked ? 'Supported' : 'Unsupported';
// Make sure cell exists
const cell = dtRow.cell(dtRow.index(), 3);
if (!cell) return;
// Update via DataTables API
cell.data(status);
}
saveButtonHandler(e) {
e.preventDefault();
const saveBtns = jQuery(`.${this.saveButtonClass}`);
if (saveBtns.hasClass('saving')) {
return;
}
if (!this.saveButtonAction || '' === this.saveButtonAction || !this.saveButtonNonce || '' === this.saveButtonNonce || !this.ajaxUrl || '' === this.ajaxUrl) {
return;
}
const selectedCheckbox = [];
const tdNodes = this.atfpDataTableObj.column(4).nodes();
if (tdNodes.length > 0) {
Array.from(tdNodes).forEach(tdNode => {
const checkbox = tdNode.querySelector('input[type="checkbox"]');
if (checkbox && checkbox.checked) {
selectedCheckbox.push(checkbox.value);
}
});
}
if (selectedCheckbox.length === 0) {
return;
}
const apiSendData = {
action: this.saveButtonAction,
atfp_nonce: this.saveButtonNonce,
save_custom_fields_data: JSON.stringify(selectedCheckbox)
};
saveBtns.addClass('saving').html('<span class="saving-text">Saving<span class="dot" style="--i:0"></span><span class="dot" style="--i:1"></span><span class="dot" style="--i:2"></span></span>', true);
fetch(this.ajaxUrl, {
method: 'POST',
headers: {
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': 'application/json',
},
body: new URLSearchParams(apiSendData)
})
.then(response => response.json())
.then(data => {
saveBtns.removeClass('saving').html(this.saveButtonText, true);
if (data.success) {
if (data.data.message) {
this.appendMessageNotice(data.data.message, 'success');
}
}
})
.catch(error => {
console.log(error);
if (error.data.message) {
this.appendMessageNotice(data.data.message, 'error');
}
saveBtns.removeClass('saving').html(this.saveButtonText, true);
console.error(error);
});
}
appendMessageNotice(message, type) {
if(this.displayAjaxNotice){
jQuery('#atfp-custom-fields-message-notice').remove();
clearTimeout(this.displayAjaxNotice);
}
this.displayAjaxNotice=setTimeout(() => {
this.displayAjaxNotice=false;
jQuery('#atfp-custom-fields-message-notice').remove();
}, 10000);
let messageNotice = jQuery('<div id="atfp-custom-fields-message-notice"><p>' + message + '</p></div>');
messageNotice.addClass('is-dismissible notice notice-' + type);
jQuery('.atfpp-dashboard-wrapper').before(messageNotice);
}
appendSaveButton() {
if (!this.saveButtonText || '' === this.saveButtonText || 'false' === this.saveButtonText || !this.saveButtonEnabled) {
return;
}
const saveButton = document.createElement('button');
saveButton.className = 'button button-primary ' + this.saveButtonClass;
saveButton.textContent = this.saveButtonText;
return saveButton;
}
}
// Call the class after window load
window.addEventListener('load', () => {
new BlockFilterSorter();
});