feat: implement interactive intern dashboard journal features and correct resource component namespace
This commit is contained in:
@@ -225,7 +225,7 @@ class InternApplicationResource extends Resource
|
|||||||
})
|
})
|
||||||
->columnSpanFull(),
|
->columnSpanFull(),
|
||||||
|
|
||||||
\Filament\Forms\Components\Section::make('Onay ve İmza Bilgileri')
|
\Filament\Schemas\Components\Section::make('Onay ve İmza Bilgileri')
|
||||||
->schema([
|
->schema([
|
||||||
\Filament\Forms\Components\Toggle::make('notebook_supervisor_signed')
|
\Filament\Forms\Components\Toggle::make('notebook_supervisor_signed')
|
||||||
->label('Staj Sorumlusu İmzala / Onayla')
|
->label('Staj Sorumlusu İmzala / Onayla')
|
||||||
|
|||||||
@@ -870,12 +870,151 @@
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
return text
|
console.warn('Commits could not be pre-loaded in memory.', err);
|
||||||
.replace(/&/g, "&")
|
});
|
||||||
.replace(/</g, "<")
|
}
|
||||||
.replace(/>/g, ">")
|
|
||||||
.replace(/"/g, """)
|
function selectNotebookDay(idx) {
|
||||||
.replace(/'/g, "'");
|
const oldBtn = document.getElementById(`btn-day-${activeDayIdx}`);
|
||||||
|
if (oldBtn) {
|
||||||
|
oldBtn.classList.remove('border-blue-200', 'bg-blue-50/50');
|
||||||
|
oldBtn.classList.add('border-slate-100', 'bg-white');
|
||||||
|
const oldTitle = oldBtn.querySelector('span.text-xs');
|
||||||
|
if (oldTitle) {
|
||||||
|
oldTitle.classList.remove('text-blue-700');
|
||||||
|
oldTitle.classList.add('text-slate-800');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
activeDayIdx = idx;
|
||||||
|
const newBtn = document.getElementById(`btn-day-${idx}`);
|
||||||
|
if (newBtn) {
|
||||||
|
newBtn.classList.add('border-blue-200', 'bg-blue-50/50');
|
||||||
|
newBtn.classList.remove('border-slate-100', 'bg-white');
|
||||||
|
const newTitle = newBtn.querySelector('span.text-xs');
|
||||||
|
if (newTitle) {
|
||||||
|
newTitle.classList.add('text-blue-700');
|
||||||
|
newTitle.classList.remove('text-slate-800');
|
||||||
|
}
|
||||||
|
|
||||||
|
const dayNum = newBtn.getAttribute('data-day-num');
|
||||||
|
const dateVal = newBtn.getAttribute('data-date');
|
||||||
|
const dateFormatted = newBtn.getAttribute('data-formatted-date');
|
||||||
|
const savedContent = newBtn.getAttribute('data-saved-content');
|
||||||
|
|
||||||
|
document.getElementById('editor-day-title').textContent = `${dayNum}. Gün`;
|
||||||
|
document.getElementById('editor-day-date').textContent = dateFormatted;
|
||||||
|
document.getElementById('editor-content').value = savedContent;
|
||||||
|
document.getElementById('save-status').textContent = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fillFromGithub() {
|
||||||
|
const btn = document.getElementById(`btn-day-${activeDayIdx}`);
|
||||||
|
if (!btn) return;
|
||||||
|
|
||||||
|
const dateVal = btn.getAttribute('data-date');
|
||||||
|
const dayCommits = allGithubCommits[dateVal] || [];
|
||||||
|
|
||||||
|
if (dayCommits.length === 0) {
|
||||||
|
alert("Bu staj gününe ait GitHub commit'i bulunamadı. Lütfen commit attığınızdan ve tarihin doğru olduğundan emin olun.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let commitText = "";
|
||||||
|
const sorted = [...dayCommits].reverse();
|
||||||
|
sorted.forEach(c => {
|
||||||
|
const msg = c.commit.message;
|
||||||
|
const sha = c.sha.substring(0, 7);
|
||||||
|
const authorDate = new Date(c.commit.author.date);
|
||||||
|
const time = authorDate.toLocaleTimeString('tr-TR', { hour: '2-digit', minute: '2-digit' });
|
||||||
|
commitText += `- [${time}] (${sha}) ${msg}\n`;
|
||||||
|
});
|
||||||
|
|
||||||
|
const textarea = document.getElementById('editor-content');
|
||||||
|
if (textarea.value.trim() !== "") {
|
||||||
|
if (confirm("Mevcut rapor içeriğinizin sonuna bu günün commitlerini eklemek ister misiniz? (Hayır derseniz mevcut içerik silinip commitler yazılır.)")) {
|
||||||
|
textarea.value = textarea.value.trim() + "\n\n" + commitText.trim();
|
||||||
|
} else {
|
||||||
|
textarea.value = commitText.trim();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
textarea.value = commitText.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveActiveDay() {
|
||||||
|
const btn = document.getElementById(`btn-day-${activeDayIdx}`);
|
||||||
|
if (!btn) return;
|
||||||
|
|
||||||
|
const dayNum = btn.getAttribute('data-day-num');
|
||||||
|
const dateVal = btn.getAttribute('data-date');
|
||||||
|
const contentVal = document.getElementById('editor-content').value;
|
||||||
|
const statusText = document.getElementById('save-status');
|
||||||
|
|
||||||
|
statusText.textContent = "Kaydediliyor...";
|
||||||
|
statusText.className = "text-xs font-semibold text-slate-400 animate-pulse";
|
||||||
|
|
||||||
|
fetch("{{ route('intern.save-journal') }}", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"X-CSRF-TOKEN": "{{ csrf_token() }}"
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
day_number: dayNum,
|
||||||
|
date: dateVal,
|
||||||
|
content: contentVal
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if (data.success) {
|
||||||
|
statusText.textContent = "Başarıyla kaydedildi.";
|
||||||
|
statusText.className = "text-xs font-semibold text-green-600";
|
||||||
|
|
||||||
|
btn.setAttribute('data-saved-content', contentVal);
|
||||||
|
|
||||||
|
const badge = document.getElementById(`badge-day-${activeDayIdx}`);
|
||||||
|
if (badge) {
|
||||||
|
if (contentVal.trim() !== '') {
|
||||||
|
badge.textContent = 'DOLU';
|
||||||
|
badge.className = "inline-flex px-2 py-0.5 rounded-lg text-[9px] font-extrabold uppercase bg-green-50 text-green-700 border border-green-200";
|
||||||
|
} else {
|
||||||
|
badge.textContent = 'BOŞ';
|
||||||
|
badge.className = "inline-flex px-2 py-0.5 rounded-lg text-[9px] font-extrabold uppercase bg-slate-50 text-slate-400 border border-slate-200";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
statusText.textContent = data.message || "Kaydedilemedi.";
|
||||||
|
statusText.className = "text-xs font-semibold text-red-600";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
statusText.textContent = "Bağlantı hatası oluştu.";
|
||||||
|
statusText.className = "text-xs font-semibold text-red-600";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function openPrintModal() {
|
||||||
|
const modal = document.getElementById('print-modal');
|
||||||
|
const card = document.getElementById('print-modal-card');
|
||||||
|
modal.classList.remove('hidden');
|
||||||
|
setTimeout(() => {
|
||||||
|
card.classList.remove('scale-95', 'opacity-0');
|
||||||
|
card.classList.add('scale-100', 'opacity-100');
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
function closePrintModal() {
|
||||||
|
const modal = document.getElementById('print-modal');
|
||||||
|
const card = document.getElementById('print-modal-card');
|
||||||
|
card.classList.remove('scale-100', 'opacity-100');
|
||||||
|
card.classList.add('scale-95', 'opacity-0');
|
||||||
|
setTimeout(() => {
|
||||||
|
modal.classList.add('hidden');
|
||||||
|
}, 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleFileSelected(input) {
|
function handleFileSelected(input) {
|
||||||
|
|||||||
Reference in New Issue
Block a user