Files
Jobhero_back/public/js/ajaxcrud.js
Carlos b34622b289 Fix búsqueda en tiempo real, paginación, OneSignal, bancos/categorías y vistas auth
- ajaxcrud.js: fix race condition en búsqueda, abort de requests en vuelo
- Layout: mover @yield('js') después de app.js para corregir orden de carga
- Paginación: useBootstrapFour() + eliminar wrappers <ul> duplicados en 17 vistas
- OneSignal: migrar de UserTag iChamba_ID a ExternalId en controladores
- API: agregar endpoint GET /api/banks y campos rfc/bank/bank_account/fee en hero()
- Seeders: BanksSeeder (239 bancos) y CategoriesSeeder (100 categorías)
- Auth views: corregir padding/scroll en register, login, password reset

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 21:21:44 -06:00

141 lines
4.0 KiB
JavaScript
Executable File
Vendored

$(document).on('click', '.pagination a', function (event) {
event.preventDefault();
ajaxLoad($(this).attr('href'));
});
$(document).on('submit', 'form[method="GET"]', function (event) {
event.preventDefault();
ajaxLoad($(this).attr('action') + '?' + $(this).serialize());
});
var searchTimer;
$(document).on('keyup', 'input[name="search"]', function () {
var form = $(this).closest('form');
clearTimeout(searchTimer);
if (activeRequest) {
activeRequest.abort();
activeRequest = null;
}
searchTimer = setTimeout(function () {
ajaxLoad(form.attr('action') + '?' + form.serialize());
}, 400);
});
$(document).on('submit', 'form#frm', function (event) {
event.preventDefault();
var form = $(this);
var data = new FormData($(this)[0]);
var url = form.attr("action");
$.ajax({
type: form.attr('method'),
url: url,
data: data,
cache: false,
contentType: false,
processData: false,
success: function (data) {
$('.is-invalid').removeClass('is-invalid');
if (data.fail) {
for (control in data.errors) {
$('#' + control).addClass('is-invalid');
$('#error-' + control).html(data.errors[control]);
}
} else {
ajaxLoad(data.redirect_url);
}
},
error: function (xhr, textStatus, errorThrown) {
alert("Error: " + errorThrown);
}
});
return false;
});
var activeRequest = null;
function ajaxLoad(filename, content) {
content = typeof content !== 'undefined' ? content : 'content';
var searchFocused = $('input[name="search"]').is(':focus');
if (activeRequest) {
activeRequest.abort();
}
$('.loading').show();
activeRequest = $.ajax({
type: "GET",
url: filename,
headers: {'X-Requested-With': 'XMLHttpRequest'},
success: function (data) {
activeRequest = null;
$("#" + content).html(data);
$('.loading').hide();
if (searchFocused) {
var input = $('input[name="search"]');
input.focus();
var len = input.val().length;
input[0].setSelectionRange(len, len);
}
},
error: function (xhr, status, error) {
if (status !== 'abort') {
alert(xhr.responseText);
}
}
});
}
function ajaxDelete(filename, token, content) {
content = typeof content !== 'undefined' ? content : 'content';
$('.loading').show();
$.ajax({
type: 'POST',
data: {_method: 'DELETE', _token: token},
url: filename,
success: function (data) {
window.location.href = filename.slice(0, -9);
$("#" + content).html(data);
$('.loading').hide();
},
error: function (xhr, status, error) {
alert(xhr.responseText);
}
});
}
function ajaxDeleteComments(filename, token, content) {
content = typeof content !== 'undefined' ? content : 'content';
$('.loading').show();
$.ajax({
type: 'POST',
data: {_method: 'DELETE', _token: token},
url: filename,
success: function (data) {
window.location.href = filename.replace("delete/", "");
$("#" + content).html(data);
$('.loading').hide();
},
error: function (xhr, status, error) {
alert(xhr.responseText);
}
});
}
function ajaxRedirect(filename, token, content) {
content = typeof content !== 'undefined' ? content : 'content';
$('.loading').show();
$.ajax({
type: 'POST',
data: {_method: 'PUT', _token: token},
url: filename,
success: function (data) {
window.location.href = filename.slice(0, -14);
$("#" + content).html(data);
$('.loading').hide();
},
error: function (xhr, status, error) {
alert(xhr.responseText);
}
});
}