Vlogging Content Schedule Generator
Organize Titles, Topics, and Production Workflow
Total Videos Planned: 0
My Vlog Channel
Period: November 2025 | Vlogger: N/A
Upload Timeline
| Upload Date | Video Title / Topic | Format | Production Status |
|---|
Generated by Vlogging Schedule Generator
Channel & Scheduling Context
Default Upload Settings
This day is used as a reference for your planning period.
Video Log
Log your videos chronologically. Click a row to remove it.
Current Log
Log is empty.
"; return; } sortedVideos.forEach(video => { const row = document.createElement('div'); row.className = 'vsg-video-row'; const uploadDateFmt = new Date(video.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); row.innerHTML = `
[${uploadDateFmt}] ${video.title}
`;
outputs.listEditor.appendChild(row);
});
}
// --- 5. EVENT LISTENERS & ACTIONS ---
function attachListeners() {
// Meta Inputs
const metaInputs = [inputs.channelName, inputs.vlogger, inputs.period, inputs.defaultDay];
metaInputs.forEach(inp => inp.addEventListener('input', renderAll));
// Add Video Button
document.getElementById('btn-add-video').addEventListener('click', addVideo);
}
function addVideo() {
const date = inputs.uploadDate.value;
const format = inputs.format.value;
const title = inputs.title.value.trim();
const status = inputs.status.value;
if (!date || !title) {
alert("Please enter a valid Upload Date and Video Title.");
return;
}
const newVideo = {
id: Date.now(),
date: date,
format: format,
title: title,
status: status
};
vsgData.videos.push(newVideo);
// Clear inputs
inputs.title.value = "";
renderAll();
}
window.removeVideo = function(id) {
if(confirm("Remove this video from the schedule?")) {
vsgData.videos = vsgData.videos.filter(v => v.id !== id);
renderAll();
}
};
// --- 6. TAB NAVIGATION ---
window.vsgSwitchTab = function(tabId) {
document.querySelectorAll('.vsg-tab-pane').forEach(p => p.classList.remove('active'));
document.querySelectorAll('.vsg-tab-btn').forEach(b => b.classList.remove('active'));
document.getElementById(tabId).classList.add('active');
document.querySelector(`.vsg-tab-btn[data-tab="${tabId}"]`).classList.add('active');
document.getElementById('vlog-schedule-tool').scrollIntoView({behavior: 'smooth'});
};
document.querySelectorAll('.vsg-tab-btn').forEach(btn => {
btn.addEventListener('click', function() { vsgSwitchTab(this.dataset.tab); });
});
// --- 7. PDF EXPORT ---
const btnDown = document.getElementById('vsg-download-btn');
if(btnDown) {
btnDown.addEventListener('click', function() {
renderAll();
const element = document.getElementById('vsg-render-area');
const filename = (inputs.channelName.value || 'Schedule').replace(/\s+/g,'_');
const opt = {
margin: 0.4,
filename: `${filename}_Schedule.pdf`,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2, useCORS: true },
jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
};
const origText = btnDown.innerText;
btnDown.innerText = "Generating Schedule...";
html2pdf().set(opt).from(element).save().then(() => {
btnDown.innerText = origText;
});
});
}
// Start
init();
});
