This commit is contained in:
Tour
2025-12-10 09:01:07 +01:00
parent 613b6345f2
commit 683823de6f
2 changed files with 450 additions and 0 deletions

370
public/kan.html Normal file
View File

@@ -0,0 +1,370 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🎯 Interactive Tech Dashboard</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh; padding: 20px; color: #333;
}
.dashboard {
max-width: 1400px; margin: 0 auto;
background: rgba(255, 255, 255, 0.95);
border-radius: 20px; padding: 30px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
}
header { text-align: center; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 3px solid #667eea; }
h1 { font-size: 2.5em; color: #667eea; margin-bottom: 10px; font-weight: 700; }
.date { font-size: 1.2em; color: #666; font-weight: 500; }
.control-panel {
background: #f3f4f6; padding: 20px; border-radius: 15px;
margin-bottom: 30px; border: 2px dashed #9ca3af;
}
.control-panel h3 { margin-bottom: 10px; color: #667eea; }
.control-textarea {
width: 100%; min-height: 150px; padding: 15px; border-radius: 8px;
border: 1px solid #d1d5db; font-family: 'Courier New', monospace; font-size: 0.9em;
resize: vertical; margin-bottom: 10px;
}
.control-hint {
font-size: 0.85em; color: #6b7280; font-family: monospace;
background: white; padding: 10px; border-radius: 5px; margin-top: 10px;
}
.progress-section {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white; padding: 25px; border-radius: 15px;
margin-bottom: 30px; box-shadow: 0 5px 20px rgba(102, 126, 234, 0.4);
}
.progress-label { display: flex; justify-content: space-between; margin-bottom: 10px; font-size: 1.1em; font-weight: 500; }
.progress-bar { width: 100%; height: 30px; background: rgba(255, 255, 255, 0.3); border-radius: 15px; overflow: hidden; position: relative; }
.progress-fill { height: 100%; background: linear-gradient(90deg, #4ade80 0%, #22c55e 100%); width: 25%; transition: width 0.5s ease; position: relative; box-shadow: 0 0 20px rgba(74, 222, 128, 0.5); }
.progress-fill::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent); animation: shimmer 2s infinite; }
@keyframes shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } }
.projects-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 25px; margin-bottom: 30px; }
.project-card { background: white; border-radius: 15px; padding: 25px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); transition: transform 0.3s ease; border-left: 5px solid; }
.project-card:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); }
.project-card.defrag { border-left-color: #667eea; }
.project-card.dual-boot { border-left-color: #f59e0b; }
.project-card.ai { border-left-color: #10b981; }
.project-card.autocomplete { border-left-color: #ef4444; }
.project-header { display: flex; align-items: center; margin-bottom: 20px; }
.project-icon { font-size: 2em; margin-right: 15px; }
h2 { font-size: 1.5em; color: #222; font-weight: 600; }
.task-item { display: flex; align-items: center; padding: 10px 0; border-bottom: 1px solid #e5e7eb; }
.task-item:last-child { border-bottom: none; }
.task-item:hover { background: #f9fafb; border-radius: 5px; margin: 0 -10px; padding: 10px; }
.task-checkbox { width: 18px; height: 18px; margin-right: 12px; cursor: pointer; accent-color: #667eea; }
.task-text { flex: 1; }
.task-status { font-size: 0.85em; padding: 3px 10px; border-radius: 12px; margin-left: 10px; font-weight: 500; }
.status-todo { background: #f3f4f6; color: #666; }
.status-progress { background: #dbeafe; color: #1d4ed8; }
.status-completed { background: #dcfce7; color: #166534; }
.priority-badge { display: inline-block; width: 12px; height: 12px; border-radius: 50%; margin-left: 10px; }
.priority-high { background: #ef4444; }
.priority-medium { background: #f59e0b; }
.priority-low { background: #10b981; }
.quick-actions { background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); padding: 25px; border-radius: 15px; margin-bottom: 30px; border-left: 5px solid #f59e0b; }
.action-list { list-style: none; }
.action-list li { padding: 10px 0; display: flex; align-items: center; }
.action-checkbox { margin-right: 12px; width: 18px; height: 18px; cursor: pointer; accent-color: #f59e0b; }
.legend { background: #f9fafb; padding: 20px; border-radius: 15px; margin-bottom: 30px; display: flex; justify-content: space-around; flex-wrap: wrap; gap: 20px; }
.legend-item { display: flex; align-items: center; }
.notes { background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); padding: 20px; border-radius: 15px; border-left: 5px solid #f59e0b; }
.notes h3 { margin-bottom: 10px; color: #92400e; }
.notes ul { list-style-position: inside; color: #78350f; }
.footer { text-align: center; margin-top: 30px; padding-top: 20px; border-top: 1px solid #e5e7eb; color: #666; font-size: 0.9em; }
@media (max-width: 768px) { .projects-grid { grid-template-columns: 1fr; } h1 { font-size: 2em; } }
</style>
</head>
<body>
<div class="dashboard">
<header>
<h1>🎯 Interactive Tech Dashboard</h1>
<div class="date">December 10, 2025 | Focus: Infrastructure & AI</div>
</header>
<div class="control-panel">
<h3>🎮 Control Panel - Edit tasks below:</h3>
<textarea class="control-textarea" id="taskControl" placeholder="Enter tasks in format: PROJECT|Task description|status|priority|notes
Click 'Update Dashboard' to apply changes...">DEFRAG|App initialization|todo||local
DEFRAG|In-screen dynamic console|progress||local
DEFRAG|Disk cleanup tool integration|todo||local
DEFRAG|Athena monitoring dashboard|todo||athena
DUAL_BOOT|Partition disk space (50GB+)|todo|high|local
DUAL_BOOT|Install Ubuntu dual boot|todo|high|local
DUAL_BOOT|Configure boot loader|todo|medium|local
AI|Auctiora: Set up object detection pipeline|todo||local
AI|Auctiora: Test model inference|todo||local
AI|Scraper: Configure for mobile network|todo||mobile
AI|Scraper: Test connectivity & performance|todo||mobile
AUTOCOMPLETE|Deploy autocomplete API endpoint|todo||athena
AUTOCOMPLETE|Test integration with existing infrastructure|todo||athena
QUICK_ACTIONS|Free up disk space (50GB+)|todo||local
QUICK_ACTIONS|Install dual boot setup|todo||local
QUICK_ACTIONS|Migrate development environment|todo||local</textarea>
<button onclick="updateDashboard()" style="background: #667eea; color: white; padding: 10px 20px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600;">🔄 Update Dashboard</button>
<div class="control-hint">
Format: PROJECT|Task|status|priority|notes<br>
PROJECT: DEFRAG, DUAL_BOOT, AI, AUTOCOMPLETE, QUICK_ACTIONS<br>
Status: todo, progress, completed<br>
Priority: high, medium, low (or blank)
</div>
</div>
<div class="progress-section">
<div class="progress-label">
<span>Overall Progress</span>
<span id="progressText">25% (2 of 8 tasks)</span>
</div>
<div class="progress-bar">
<div class="progress-fill" id="progressFill"></div>
</div>
</div>
<div class="projects-grid" id="projectsGrid"></div>
<div class="legend">
<div class="legend-item">
<span class="status-badge status-todo">TODO</span>
<span style="margin-left: 10px;">Not started</span>
</div>
<div class="legend-item">
<span class="status-badge status-progress">PROGRESS</span>
<span style="margin-left: 10px;">Active</span>
</div>
<div class="legend-item">
<span class="status-badge status-completed">COMPLETED</span>
<span style="margin-left: 10px;">Done</span>
</div>
<div class="legend-item">
<span class="priority-badge priority-high"></span>
<span>High Priority</span>
</div>
<div class="legend-item">
<span class="priority-badge priority-medium"></span>
<span>Medium Priority</span>
</div>
<div class="legend-item">
<span class="priority-badge priority-low"></span>
<span>Low Priority</span>
</div>
</div>
<div class="notes">
<h3>💡 Notes</h3>
<ul>
<li>Focus on local machine maintenance first</li>
<li>Athena tasks blocked until disk cleanup complete</li>
<li>Mobile scraper requires network performance testing</li>
<li>Object detection model needs GPU verification</li>
</ul>
</div>
<div class="footer">
<p><strong>Next Review:</strong> End of day | <strong>ETA for completion:</strong> 2-3 days</p>
</div>
</div>
<script>
// Initial task data
let allTasks = [];
// Parse task data from control textarea
function parseTasks() {
const textarea = document.getElementById('taskControl');
const lines = textarea.value.trim().split('\n');
allTasks = [];
lines.forEach((line, index) => {
if (!line.trim()) return;
const parts = line.split('|').map(p => p.trim());
allTasks.push({
id: index,
project: parts[0] || 'MISC',
description: parts[1] || '',
status: parts[2] || 'todo',
priority: parts[3] || '',
notes: parts[4] || '',
rawLine: line
});
});
}
// Update progress bar
function updateProgress() {
const completed = allTasks.filter(t => t.status === 'completed').length;
const total = allTasks.length;
const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
document.getElementById('progressText').textContent = `${percentage}% (${completed} of ${total} tasks)`;
document.getElementById('progressFill').style.width = percentage + '%';
}
// Toggle task status
function toggleTask(taskId) {
const task = allTasks.find(t => t.id === taskId);
if (task) {
const statuses = ['todo', 'progress', 'completed'];
const currentIdx = statuses.indexOf(task.status);
task.status = statuses[(currentIdx + 1) % statuses.length];
// Update control textarea
updateControlTextarea();
// Re-render dashboard
renderDashboard();
}
}
// Update control textarea from task data
function updateControlTextarea() {
const lines = allTasks.map(task =>
`${task.project}|${task.description}|${task.status}|${task.priority}|${task.notes}`
);
document.getElementById('taskControl').value = lines.join('\n');
}
// Render the dashboard
function renderDashboard() {
parseTasks();
updateProgress();
const grid = document.getElementById('projectsGrid');
grid.innerHTML = '';
// Group tasks by project
const projects = {};
allTasks.forEach(task => {
if (!projects[task.project]) {
projects[task.project] = [];
}
projects[task.project].push(task);
});
// Project configurations
const projectConfig = {
'DEFRAG': { icon: '🔧', title: 'DEFRAG Application', color: 'defrag', subtitle: 'Disk optimization toolkit development' },
'DUAL_BOOT': { icon: '💻', title: 'Dual Boot Setup', color: 'dual-boot', subtitle: 'Unix/Linux workstation configuration' },
'AI': { icon: '🤖', title: 'AI/ML Projects', color: 'ai', subtitle: 'Artificial Intelligence & Machine Learning' },
'AUTOCOMPLETE': { icon: '✅', title: 'Autocomplete Service', color: 'autocomplete', subtitle: 'Athena server configuration' },
'QUICK_ACTIONS': { icon: '⚡', title: 'Quick Actions', color: 'quick-actions', subtitle: 'Immediate priority tasks' }
};
// Render each project
Object.entries(projects).forEach(([projectName, tasks]) => {
if (projectName === 'QUICK_ACTIONS') {
// Render quick actions as a special card
const quickActionsCard = document.createElement('div');
quickActionsCard.className = 'quick-actions';
quickActionsCard.innerHTML = `
<div class="project-header">
<span class="project-icon">⚡</span>
<h2>Quick Actions - Switch to Ubuntu</h2>
</div>
<ul class="action-list">
${tasks.map(task => `
<li>
<input type="checkbox" class="action-checkbox"
${task.status === 'completed' ? 'checked' : ''}
onchange="toggleTask(${task.id})">
<span style="${task.status === 'completed' ? 'text-decoration: line-through; opacity: 0.6;' : ''}">${task.description}</span>
</li>
`).join('')}
</ul>
`;
grid.appendChild(quickActionsCard);
} else {
const config = projectConfig[projectName] || { icon: '📌', title: projectName, color: 'misc', subtitle: '' };
const card = document.createElement('div');
card.className = `project-card ${config.color}`;
if (projectName === 'AI') {
// Special handling for AI project with subsections
const auctioraTasks = tasks.filter(t => t.description.includes('Auctiora'));
const scraperTasks = tasks.filter(t => t.description.includes('Scraper'));
card.innerHTML = `
<div class="project-header">
<span class="project-icon">${config.icon}</span>
<h2>${config.title}</h2>
</div>
${config.subtitle ? `<p style="color: #666; margin-bottom: 15px;">${config.subtitle}</p>` : ''}
<h3 style="margin: 15px 0 10px; color: #667eea;">Auctiora - Object Detection</h3>
${auctioraTasks.map(task => `
<div class="task-item">
<input type="checkbox" class="task-checkbox"
${task.status === 'completed' ? 'checked' : ''}
onchange="toggleTask(${task.id})">
<span class="task-text">${task.description.replace('Auctiora: ', '')}</span>
<span class="task-status status-${task.status}">${task.status.toUpperCase()}</span>
</div>
`).join('')}
<h3 style="margin: 20px 0 10px; color: #667eea;">Mobile Scraper</h3>
${scraperTasks.map(task => `
<div class="task-item">
<input type="checkbox" class="task-checkbox"
${task.status === 'completed' ? 'checked' : ''}
onchange="toggleTask(${task.id})">
<span class="task-text">${task.description.replace('Scraper: ', '')}</span>
<span class="task-status status-${task.status}">${task.status.toUpperCase()}</span>
</div>
`).join('')}
`;
} else {
// Standard project card
card.innerHTML = `
<div class="project-header">
<span class="project-icon">${config.icon}</span>
<h2>${config.title}</h2>
</div>
${config.subtitle ? `<p style="color: #666; margin-bottom: 15px;">${config.subtitle}</p>` : ''}
${tasks.map(task => `
<div class="task-item">
<input type="checkbox" class="task-checkbox"
${task.status === 'completed' ? 'checked' : ''}
onchange="toggleTask(${task.id})">
<span class="task-text">${task.description}</span>
<span class="task-status status-${task.status}">${task.status.toUpperCase()}</span>
${task.priority ? `<span class="priority-badge priority-${task.priority}" title="${task.priority} priority"></span>` : ''}
${task.notes ? `<span style="margin-left: 8px; font-size: 0.85em; color: #6b7280;">(${task.notes})</span>` : ''}
</div>
`).join('')}
`;
}
grid.appendChild(card);
}
});
}
// Update dashboard from control textarea
function updateDashboard() {
renderDashboard();
}
// Initialize on load
window.onload = function() {
renderDashboard();
};
</script>
</body>
</html>

80
public/kanban.html Normal file
View File

@@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Today Dashboard</title>
<style>
body {
font-family: Arial, sans-serif;
background: #f4f6f8;
margin: 0;
padding: 40px;
color: #222;
}
h1 {
text-align: center;
margin-bottom: 40px;
font-weight: 700;
}
.section {
background: #fff;
border-radius: 12px;
padding: 24px 28px;
margin-bottom: 26px;
box-shadow: 0 4px 12px rgba(0,0,0,0.07);
}
.section h2 {
margin-top: 0;
font-size: 22px;
color: #333;
border-left: 4px solid #4a90e2;
padding-left: 10px;
}
ul {
list-style: none;
padding-left: 0;
margin-top: 14px;
}
li {
background: #f0f3f7;
margin-bottom: 8px;
padding: 10px 14px;
border-radius: 8px;
font-size: 15px;
}
</style>
</head>
<body>
<h1>📌 Today Dashboard</h1>
<div class="section">
<h2>🚀 Core Dev</h2>
<ul>
<li><strong>DEFRAG</strong> — App-init afronden</li>
<li>Live console-updates + progress-bar</li>
<li><strong>Auctiora</strong> — Object-detectie verder brengen</li>
<li><strong>Scraper</strong> — Test via mobiel netwerk</li>
</ul>
</div>
<div class="section">
<h2>💾 System & Ops</h2>
<ul>
<li>Lokale disk opschonen (tool)</li>
<li>Athena disk-usage inzichtelijk maken</li>
<li>Dual-boot Unix/Linux voorbereiden</li>
<li>Ruimte vrijmaken voor Ubuntu</li>
</ul>
</div>
<div class="section">
<h2>🧠 Dev Experience</h2>
<ul>
<li>Athena — Autocomplete/finish verbeteren</li>
<li>Athena — Output inzichtelijker maken</li>
</ul>
</div>
</body>
</html>