added some function for choose date
This commit is contained in:
+96
-2
@@ -2,6 +2,7 @@
|
||||
let selectedFile = null;
|
||||
let projects = {};
|
||||
let lastEvents = [];
|
||||
let previewData = [];
|
||||
|
||||
// DOM Elements
|
||||
const uploadZone = document.getElementById('uploadZone');
|
||||
@@ -203,18 +204,105 @@ function setFile(file) {
|
||||
fileSize.textContent = formatFileSize(file.size);
|
||||
|
||||
updateSubmitButton();
|
||||
generatePreview(file);
|
||||
}
|
||||
|
||||
async function generatePreview(file) {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
|
||||
showLoading(true);
|
||||
try {
|
||||
const response = await fetch('/preview-time', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
const data = await response.json();
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(data.detail || `HTTP ${response.status}`);
|
||||
}
|
||||
|
||||
renderPreview(data);
|
||||
} catch (error) {
|
||||
console.error('Preview error:', error);
|
||||
showToast('Failed to generate preview: ' + error.message, 'error');
|
||||
document.getElementById('previewContainer').style.display = 'none';
|
||||
} finally {
|
||||
showLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
function renderPreview(data) {
|
||||
previewData = data.map(item => ({...item, selected: true}));
|
||||
const container = document.getElementById('previewContainer');
|
||||
container.style.display = 'block';
|
||||
|
||||
updatePreviewTable();
|
||||
|
||||
document.getElementById('selectAllPreview').onchange = (e) => {
|
||||
const checked = e.target.checked;
|
||||
previewData.forEach(item => item.selected = checked);
|
||||
updatePreviewTable();
|
||||
};
|
||||
}
|
||||
|
||||
// Ensure togglePreviewItem is available globally for inline onclick handlers
|
||||
window.togglePreviewItem = function(index) {
|
||||
previewData[index].selected = !previewData[index].selected;
|
||||
|
||||
// Update "select all" checkbox state
|
||||
const allSelected = previewData.every(item => item.selected);
|
||||
const noneSelected = previewData.every(item => !item.selected);
|
||||
const selectAllCheckbox = document.getElementById('selectAllPreview');
|
||||
selectAllCheckbox.checked = allSelected;
|
||||
selectAllCheckbox.indeterminate = !allSelected && !noneSelected;
|
||||
|
||||
updatePreviewTable();
|
||||
};
|
||||
|
||||
function updatePreviewTable() {
|
||||
const tbody = document.getElementById('previewTableBody');
|
||||
tbody.innerHTML = '';
|
||||
let totalHours = 0;
|
||||
let selectedCount = 0;
|
||||
|
||||
previewData.forEach((item, index) => {
|
||||
if (item.selected) {
|
||||
totalHours += item.hours;
|
||||
selectedCount++;
|
||||
}
|
||||
|
||||
const tr = document.createElement('tr');
|
||||
if (!item.selected) tr.classList.add('excluded');
|
||||
|
||||
tr.innerHTML = `
|
||||
<td><input type="checkbox" ${item.selected ? 'checked' : ''} onclick="event.stopPropagation(); togglePreviewItem(${index})"></td>
|
||||
<td>${item.date}</td>
|
||||
<td>${item.hours.toFixed(2)}</td>
|
||||
`;
|
||||
|
||||
tr.onclick = () => togglePreviewItem(index);
|
||||
tbody.appendChild(tr);
|
||||
});
|
||||
|
||||
document.getElementById('previewTotalHours').textContent = totalHours.toFixed(2);
|
||||
updateSubmitButton();
|
||||
}
|
||||
|
||||
function removeFile() {
|
||||
selectedFile = null;
|
||||
previewData = [];
|
||||
fileInput.value = '';
|
||||
uploadZone.style.display = 'block';
|
||||
filePreview.style.display = 'none';
|
||||
document.getElementById('previewContainer').style.display = 'none';
|
||||
updateSubmitButton();
|
||||
}
|
||||
|
||||
function updateSubmitButton() {
|
||||
submitBtn.disabled = !(selectedFile && projectSelect.value);
|
||||
const hasSelectedDates = previewData.length === 0 || previewData.some(item => item.selected);
|
||||
submitBtn.disabled = !(selectedFile && projectSelect.value && hasSelectedDates);
|
||||
}
|
||||
|
||||
function setDefaultDateRange() {
|
||||
@@ -238,10 +326,16 @@ async function handleSubmit() {
|
||||
|
||||
const projectName = projectSelect.value;
|
||||
|
||||
const excludedDates = previewData
|
||||
.filter(item => !item.selected)
|
||||
.map(item => item.date)
|
||||
.join(',');
|
||||
|
||||
showLoading(true);
|
||||
|
||||
try {
|
||||
const response = await fetch(`/report-time?project_name=${encodeURIComponent(projectName)}`, {
|
||||
const url = `/report-time?project_name=${encodeURIComponent(projectName)}&excluded_dates=${encodeURIComponent(excludedDates)}`;
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user