Form Management Control - View Form Improvement (Manager View)
Specific Folder FTP Upload / ftp-deploy (push) Successful in 39s
Details
Specific Folder FTP Upload / ftp-deploy (push) Successful in 39s
Details
This commit is contained in:
parent
7bb4afc7ab
commit
bff5a50c37
|
|
@ -19,8 +19,7 @@
|
|||
<h4 class="page-title">{{$formname}}</h4>
|
||||
</div>
|
||||
<div class="col-4 p-2">
|
||||
<a href="/form/downloaddata?form_id={{$form_id}}" id="download-btn" class="btn btn-info btn-xs float-end">Download</a>
|
||||
<button type="button" id="emailme" class="btn btn-warning btn-xs float-end me-2">Email</button>
|
||||
<button type="button" id="export-btn" class="btn btn-info btn-xs float-end" data-bs-toggle="modal" data-bs-target="#export-modal">Export</button>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
</div>
|
||||
|
|
@ -116,6 +115,33 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="export-modal" tabindex="-1" role="dialog" aria-labelledby="export-modal-label" aria-hidden="true">
|
||||
<div class="modal-dialog modal-sm" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="export-modal-label">Export</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="mb-2">
|
||||
<label for="export-startdate" class="form-label">Start Date</label>
|
||||
<input type="date" class="form-control form-control-sm" id="export-startdate" required>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<label for="export-enddate" class="form-label">End Date</label>
|
||||
<input type="date" class="form-control form-control-sm" id="export-enddate" required>
|
||||
</div>
|
||||
<div id="export-date-error" class="text-danger small d-none"></div>
|
||||
<small class="text-muted">Maximum date range is 12 months.</small>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-warning btn-sm" id="export-email-btn">Email</button>
|
||||
<button type="button" class="btn btn-info btn-sm" id="export-download-btn">Download</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style type="text/css">
|
||||
#pageloader {
|
||||
background: rgba( 255, 255, 255, 0.8 );
|
||||
|
|
@ -260,20 +286,85 @@
|
|||
@endforeach
|
||||
],
|
||||
"initComplete": function(settings, json) {
|
||||
var api = this.api();
|
||||
var textBox = $('.dataTables_filter label input');
|
||||
textBox.unbind();
|
||||
textBox.bind('keyup input', function(e) {
|
||||
if(e.keyCode == 8 && !textBox.val() || e.keyCode == 46 && !textBox.val()) {
|
||||
// do nothing
|
||||
} else if(e.keyCode == 13 || !textBox.val()) {
|
||||
api.search(this.value).draw();
|
||||
textBox.on('keydown', function(e) {
|
||||
if (e.keyCode === 13) {
|
||||
e.preventDefault();
|
||||
runServerSearch($(this).val());
|
||||
}
|
||||
});
|
||||
textBox.on('input', function() {
|
||||
if (!$(this).val()) {
|
||||
runServerSearch('');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
let lastkey = '{{$lastkey}}';
|
||||
let currentFilterParams = {};
|
||||
|
||||
function runServerSearch(keyword) {
|
||||
currentFilterParams = Object.assign({}, currentFilterParams, {
|
||||
form_id: $('#form_id').val(),
|
||||
startdate: $('#startdate').val(),
|
||||
enddate: $('#enddate').val()
|
||||
});
|
||||
keyword = (keyword || '').trim();
|
||||
if (keyword) {
|
||||
currentFilterParams.keyword = keyword;
|
||||
} else {
|
||||
delete currentFilterParams.keyword;
|
||||
}
|
||||
lastkey = 1;
|
||||
loadRows(lastkey, false, currentFilterParams);
|
||||
}
|
||||
|
||||
function parseYmd(ymd) {
|
||||
var parts = String(ymd || '').split('-');
|
||||
if (parts.length !== 3) return null;
|
||||
var y = parseInt(parts[0], 10);
|
||||
var m = parseInt(parts[1], 10) - 1;
|
||||
var d = parseInt(parts[2], 10);
|
||||
if (isNaN(y) || isNaN(m) || isNaN(d)) return null;
|
||||
var date = new Date(y, m, d);
|
||||
if (date.getFullYear() !== y || date.getMonth() !== m || date.getDate() !== d) return null;
|
||||
return date;
|
||||
}
|
||||
|
||||
function addMonthsClamped(date, months) {
|
||||
var y = date.getFullYear();
|
||||
var m = date.getMonth() + months;
|
||||
var d = date.getDate();
|
||||
var result = new Date(y, m, 1);
|
||||
var lastDay = new Date(result.getFullYear(), result.getMonth() + 1, 0).getDate();
|
||||
result.setDate(Math.min(d, lastDay));
|
||||
return result;
|
||||
}
|
||||
|
||||
function validateExportDateRange(startdate, enddate, silent) {
|
||||
if (!startdate || !enddate) {
|
||||
if (!silent) Swal.fire('Error!', 'Start date and end date are required.', 'error');
|
||||
return false;
|
||||
}
|
||||
var start = parseYmd(startdate);
|
||||
var end = parseYmd(enddate);
|
||||
if (!start || !end) {
|
||||
if (!silent) Swal.fire('Error!', 'Start date or end date is invalid.', 'error');
|
||||
return false;
|
||||
}
|
||||
if (end < start) {
|
||||
if (!silent) Swal.fire('Error!', 'End date must be on or after start date.', 'error');
|
||||
return false;
|
||||
}
|
||||
var maxEnd = addMonthsClamped(start, 12);
|
||||
if (end > maxEnd) {
|
||||
if (!silent) Swal.fire('Error!', 'Date range must not exceed 12 months.', 'error');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function bindRowActions() {
|
||||
$('.btn-edit').off('click').on('click', function(){
|
||||
|
|
@ -406,14 +497,16 @@
|
|||
});
|
||||
}
|
||||
|
||||
let currentFilterParams = {};
|
||||
|
||||
$('#apply-date-range').on('click', function() {
|
||||
var keyword = currentFilterParams.keyword || '';
|
||||
currentFilterParams = {
|
||||
form_id: $('#form_id').val(),
|
||||
startdate: $('#startdate').val(),
|
||||
enddate: $('#enddate').val()
|
||||
};
|
||||
if (keyword) {
|
||||
currentFilterParams.keyword = keyword;
|
||||
}
|
||||
lastkey = 1;
|
||||
loadRows(lastkey, false, currentFilterParams);
|
||||
});
|
||||
|
|
@ -431,17 +524,84 @@
|
|||
}
|
||||
});
|
||||
|
||||
$('.btn-primary').click(function(){
|
||||
$("#pageloader").fadeIn();
|
||||
$('#export-modal').on('show.bs.modal', function() {
|
||||
$('#export-startdate').val($('#startdate').val() || '');
|
||||
$('#export-enddate').val($('#enddate').val() || '');
|
||||
$('#export-date-error').addClass('d-none').text('');
|
||||
syncExportDateLimits();
|
||||
});
|
||||
|
||||
$('#emailme').click(function(){
|
||||
function formatYmd(date) {
|
||||
var y = date.getFullYear();
|
||||
var m = String(date.getMonth() + 1).padStart(2, '0');
|
||||
var d = String(date.getDate()).padStart(2, '0');
|
||||
return y + '-' + m + '-' + d;
|
||||
}
|
||||
|
||||
function syncExportDateLimits() {
|
||||
var startdate = $('#export-startdate').val() || '';
|
||||
var enddate = $('#export-enddate').val() || '';
|
||||
var start = parseYmd(startdate);
|
||||
var end = parseYmd(enddate);
|
||||
var $startInput = $('#export-startdate');
|
||||
var $endInput = $('#export-enddate');
|
||||
var $error = $('#export-date-error');
|
||||
|
||||
$startInput.removeAttr('max');
|
||||
$endInput.removeAttr('min').removeAttr('max');
|
||||
|
||||
if (start) {
|
||||
$endInput.attr('min', startdate);
|
||||
$endInput.attr('max', formatYmd(addMonthsClamped(start, 12)));
|
||||
}
|
||||
if (end) {
|
||||
$startInput.attr('max', enddate);
|
||||
$startInput.attr('min', formatYmd(addMonthsClamped(end, -12)));
|
||||
}
|
||||
|
||||
if (startdate && enddate && !validateExportDateRange(startdate, enddate, true)) {
|
||||
var msg = 'Date range must not exceed 12 months.';
|
||||
if (end && start && end < start) {
|
||||
msg = 'End date must be on or after start date.';
|
||||
}
|
||||
$error.removeClass('d-none').text(msg);
|
||||
return false;
|
||||
}
|
||||
$error.addClass('d-none').text('');
|
||||
return true;
|
||||
}
|
||||
|
||||
$('#export-startdate, #export-enddate').on('change input', function() {
|
||||
syncExportDateLimits();
|
||||
});
|
||||
|
||||
$('#export-download-btn').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
var startdate = $('#export-startdate').val() || '';
|
||||
var enddate = $('#export-enddate').val() || '';
|
||||
if (!validateExportDateRange(startdate, enddate)) {
|
||||
syncExportDateLimits();
|
||||
return false;
|
||||
}
|
||||
var url = '/form/downloaddata?form_id=' + encodeURIComponent(formId)
|
||||
+ '&startdate=' + encodeURIComponent(startdate)
|
||||
+ '&enddate=' + encodeURIComponent(enddate);
|
||||
window.location.href = url;
|
||||
$('#export-modal').modal('hide');
|
||||
});
|
||||
|
||||
$('#export-email-btn').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
var startdate = $('#export-startdate').val() || '';
|
||||
var enddate = $('#export-enddate').val() || '';
|
||||
if (!validateExportDateRange(startdate, enddate)) {
|
||||
syncExportDateLimits();
|
||||
return false;
|
||||
}
|
||||
$("#pageloader").fadeIn();
|
||||
var startdate = $('#startdate').val() || '';
|
||||
var enddate = $('#enddate').val() || '';
|
||||
var url = '/form/downloaddata?email=1&form_id=' + encodeURIComponent(formId);
|
||||
if (startdate) url += '&startdate=' + encodeURIComponent(startdate);
|
||||
if (enddate) url += '&enddate=' + encodeURIComponent(enddate);
|
||||
var url = '/form/downloaddata?email=1&form_id=' + encodeURIComponent(formId)
|
||||
+ '&startdate=' + encodeURIComponent(startdate)
|
||||
+ '&enddate=' + encodeURIComponent(enddate);
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
|
|
@ -449,22 +609,15 @@
|
|||
success: function() {
|
||||
$('#notifications').append('<div class="alert alert-success">Email Sent Successfully</div>');
|
||||
$("#pageloader").fadeOut();
|
||||
$('#export-modal').modal('hide');
|
||||
},
|
||||
error: function() {
|
||||
error: function(xhr) {
|
||||
$("#pageloader").fadeOut();
|
||||
Swal.fire('Error!', 'Could not send email.', 'error');
|
||||
var message = xhr.responseJSON?.message || 'Could not send email.';
|
||||
Swal.fire('Error!', message, 'error');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('#startdate, #enddate').on('change', function(){
|
||||
var startdate = $('#startdate').val() || '';
|
||||
var enddate = $('#enddate').val() || '';
|
||||
var url = '/form/downloaddata?form_id=' + encodeURIComponent(formId);
|
||||
if (startdate) url += '&startdate=' + encodeURIComponent(startdate);
|
||||
if (enddate) url += '&enddate=' + encodeURIComponent(enddate);
|
||||
$('#download-btn').attr('href', url);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
|
|
|||
Loading…
Reference in New Issue