feat: on-page Download PDF opens Letter-size printable Study Load; drop pdf-lib/background path
This commit is contained in:
@@ -101,115 +101,6 @@ $('#saveProfile').addEventListener('click', async () => {
|
||||
renderProfiles(profiles);
|
||||
});
|
||||
|
||||
// ---- Tabs ----
|
||||
document.querySelectorAll('.tabs button').forEach((btn) => {
|
||||
btn.addEventListener('click', () => {
|
||||
document.querySelectorAll('.tabs button').forEach((b) => b.classList.remove('active'));
|
||||
btn.classList.add('active');
|
||||
$('#tab-login').hidden = btn.dataset.tab !== 'login';
|
||||
$('#tab-studyload').hidden = btn.dataset.tab !== 'studyload';
|
||||
});
|
||||
});
|
||||
|
||||
// ---- Study Load ----
|
||||
function setStatus(msg, cls) {
|
||||
const el = $('#status');
|
||||
el.textContent = msg;
|
||||
el.className = 'status ' + (cls || '');
|
||||
}
|
||||
|
||||
function renderCourses(courses) {
|
||||
const box = $('#coursesEditor');
|
||||
box.innerHTML = '';
|
||||
courses.forEach((c, i) => {
|
||||
const row = document.createElement('div');
|
||||
row.className = 'course-row';
|
||||
row.innerHTML =
|
||||
'<div class="grid">' +
|
||||
'<input data-i="' + i + '" data-f="group" placeholder="Group" value="' + escapeHtml(c.group || '') + '">' +
|
||||
'<input data-i="' + i + '" data-f="courseCode" placeholder="Course code" value="' + escapeHtml(c.courseCode || '') + '">' +
|
||||
'<input data-i="' + i + '" data-f="description" placeholder="Description" value="' + escapeHtml(c.description || '') + '">' +
|
||||
'<input data-i="' + i + '" data-f="units" placeholder="Units" value="' + escapeHtml(c.units || '') + '">' +
|
||||
'<input data-i="' + i + '" data-f="teacher" placeholder="Teacher" value="' + escapeHtml(c.teacher || '') + '">' +
|
||||
'<input data-i="' + i + '" data-f="status" placeholder="Status" value="' + escapeHtml(c.status || '') + '">' +
|
||||
'</div>' +
|
||||
'<input data-i="' + i + '" data-f="schedule" placeholder="Schedule" value="' + escapeHtml(c.schedule || '') + '">' +
|
||||
'<button class="btn remove-course" data-i="' + i + '">Remove</button>';
|
||||
box.appendChild(row);
|
||||
});
|
||||
box.querySelectorAll('input').forEach((inp) => {
|
||||
inp.addEventListener('input', () => {
|
||||
const i = +inp.dataset.i;
|
||||
const f = inp.dataset.f;
|
||||
studyLoadCourses[i][f] = inp.value;
|
||||
});
|
||||
});
|
||||
box.querySelectorAll('.remove-course').forEach((btn) => {
|
||||
btn.addEventListener('click', () => {
|
||||
studyLoadCourses.splice(+btn.dataset.i, 1);
|
||||
renderCourses(studyLoadCourses);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
let studyLoadCourses = [];
|
||||
|
||||
$('#loadFromPortal').addEventListener('click', async () => {
|
||||
setStatus('Loading from portal...');
|
||||
try {
|
||||
const res = await browser.runtime.sendMessage({ type: 'scrape-study-load' });
|
||||
if (!res || !res.ok) throw new Error((res && res.error) || 'Scrape failed');
|
||||
const d = res.data;
|
||||
$('#hFullName').value = d.header.fullName || '';
|
||||
$('#hStudentId').value = d.header.studentId || '';
|
||||
$('#hProgram').value = d.header.program || '';
|
||||
$('#hYearLevel').value = d.header.yearLevel || '';
|
||||
$('#hSemester').value = d.header.semester || '';
|
||||
$('#hDateEnrolled').value = d.header.dateEnrolled || '';
|
||||
$('#hDateRange').value = d.header.dateRange || '';
|
||||
$('#totalUnits').value = d.totalUnits || '';
|
||||
studyLoadCourses = d.courses || [];
|
||||
renderCourses(studyLoadCourses);
|
||||
$('#studyLoadForm').hidden = false;
|
||||
setStatus('Loaded. Review and generate.', 'ok');
|
||||
} catch (err) {
|
||||
setStatus('Could not load from portal: ' + err.message + ' — enter manually below.', 'error');
|
||||
studyLoadCourses = [];
|
||||
renderCourses(studyLoadCourses);
|
||||
$('#studyLoadForm').hidden = false;
|
||||
}
|
||||
});
|
||||
|
||||
$('#addCourse').addEventListener('click', () => {
|
||||
studyLoadCourses.push({ group: '', courseCode: '', description: '', units: '', teacher: '', schedule: '', status: '' });
|
||||
renderCourses(studyLoadCourses);
|
||||
});
|
||||
|
||||
$('#generatePdf').addEventListener('click', async () => {
|
||||
const data = {
|
||||
header: {
|
||||
fullName: $('#hFullName').value.trim(),
|
||||
studentId: $('#hStudentId').value.trim(),
|
||||
program: $('#hProgram').value.trim(),
|
||||
yearLevel: $('#hYearLevel').value.trim(),
|
||||
semester: $('#hSemester').value.trim(),
|
||||
dateEnrolled: $('#hDateEnrolled').value.trim(),
|
||||
dateRange: $('#hDateRange').value.trim()
|
||||
},
|
||||
courses: studyLoadCourses,
|
||||
totalUnits: $('#totalUnits').value.trim()
|
||||
};
|
||||
if (!data.courses.length) { setStatus('Add at least one course.', 'error'); return; }
|
||||
setStatus('Generating PDF...');
|
||||
try {
|
||||
const res = await browser.runtime.sendMessage({ type: 'generate-pdf', data });
|
||||
if (!res || !res.ok) throw new Error((res && res.error) || 'Generation failed');
|
||||
setStatus('PDF download started.', 'ok');
|
||||
} catch (err) {
|
||||
setStatus('Error: ' + err.message, 'error');
|
||||
}
|
||||
});
|
||||
|
||||
// ---- Init ----
|
||||
(async function init() {
|
||||
await loadMaster();
|
||||
|
||||
Reference in New Issue
Block a user