Tehtäviin Tyyppi-kenttä (tekniikka, laskutus, myynti, asennus, muu)
Uusi category-sarake todosiin. Näkyy listassa badgena, lomakkeessa dropdownina ja lukunäkymässä. Tyypillä voi myös suodattaa listaa. Värikoodatut badget kullekin tyypille. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3898,6 +3898,7 @@ let currentTodoSubTab = 'tasks';
|
||||
|
||||
const todoStatusLabels = { avoin:'Avoin', kaynnissa:'Käynnissä', odottaa:'Odottaa', valmis:'Valmis', ehdotettu:'Ehdotettu', harkinnassa:'Harkinnassa', toteutettu:'Toteutettu', hylatty:'Hylätty' };
|
||||
const todoPriorityLabels = { normaali:'Normaali', tarkea:'Tärkeä', kiireellinen:'Kiireellinen' };
|
||||
const todoCategoryLabels = { tekniikka:'Tekniikka', laskutus:'Laskutus', myynti:'Myynti', asennus:'Asennus', muu:'Muu' };
|
||||
|
||||
function switchTodoSubTab(target) {
|
||||
currentTodoSubTab = target;
|
||||
@@ -3939,10 +3940,12 @@ function renderTasksList() {
|
||||
const query = (document.getElementById('todo-search-input')?.value || '').toLowerCase().trim();
|
||||
const statusF = document.getElementById('todo-status-filter')?.value || '';
|
||||
const assignF = document.getElementById('todo-assigned-filter')?.value || '';
|
||||
const catF = document.getElementById('todo-category-filter')?.value || '';
|
||||
let tasks = todosData.filter(t => t.type === 'task');
|
||||
if (query) tasks = tasks.filter(t => (t.title||'').toLowerCase().includes(query) || (t.description||'').toLowerCase().includes(query) || (t.assigned_to||'').toLowerCase().includes(query));
|
||||
if (statusF) tasks = tasks.filter(t => t.status === statusF);
|
||||
if (assignF) tasks = tasks.filter(t => t.assigned_to === assignF);
|
||||
if (catF) tasks = tasks.filter(t => t.category === catF);
|
||||
|
||||
// Lajittelu: deadline lähimmät ensin (null-deadlinet loppuun), sitten prioriteetti
|
||||
const today = new Date().toISOString().slice(0,10);
|
||||
@@ -3976,6 +3979,7 @@ function renderTasksList() {
|
||||
return `<tr class="${rowClass}" onclick="openTaskRead('${t.id}')" style="cursor:pointer;">
|
||||
<td><span class="todo-status status-${t.status}">${todoStatusLabels[t.status]||t.status}</span></td>
|
||||
<td><span class="priority-badge priority-${t.priority}">${todoPriorityLabels[t.priority]||t.priority}</span></td>
|
||||
<td>${t.category ? `<span class="todo-category cat-${t.category}">${todoCategoryLabels[t.category]||t.category}</span>` : '<span style="color:#ccc;">—</span>'}</td>
|
||||
<td><strong>${esc(t.title)}</strong></td>
|
||||
<td>${t.assigned_to ? esc(t.assigned_to) : '<span style="color:#ccc;">—</span>'}</td>
|
||||
<td class="nowrap">${t.deadline ? `<span${overdue ? ' style="color:#e74c3c;font-weight:600;"' : (soon ? ' style="color:#f39c12;font-weight:600;"' : '')}>${t.deadline}</span>` : '<span style="color:#ccc;">—</span>'}</td>
|
||||
@@ -4009,6 +4013,7 @@ async function openTaskRead(id) {
|
||||
<option value="">— Ei —</option>
|
||||
</select>` : esc(t.assigned_to || '—')}</div>
|
||||
<div><strong style="font-size:0.78rem;color:#888;">Prioriteetti</strong><br>${todoPriorityLabels[t.priority]||t.priority}</div>
|
||||
<div><strong style="font-size:0.78rem;color:#888;">Tyyppi</strong><br>${t.category ? (todoCategoryLabels[t.category]||t.category) : '—'}</div>
|
||||
<div><strong style="font-size:0.78rem;color:#888;">Deadline</strong><br>${t.deadline || '—'}</div>`;
|
||||
// Populoi vastuuhenkilö-dropdown
|
||||
if (isAdmin) {
|
||||
@@ -4058,6 +4063,7 @@ async function openTaskEdit(id) {
|
||||
document.getElementById('task-form-title').value = t?.title || '';
|
||||
document.getElementById('task-form-priority').value = t?.priority || 'normaali';
|
||||
document.getElementById('task-form-status').value = t?.status || 'avoin';
|
||||
document.getElementById('task-form-category').value = t?.category || '';
|
||||
document.getElementById('task-form-deadline').value = t?.deadline || '';
|
||||
document.getElementById('task-form-desc').value = t?.description || '';
|
||||
document.getElementById('task-edit-title').textContent = t ? 'Muokkaa tehtävää' : 'Uusi tehtävä';
|
||||
@@ -4088,6 +4094,7 @@ document.getElementById('task-form')?.addEventListener('submit', async (e) => {
|
||||
title: document.getElementById('task-form-title').value.trim(),
|
||||
description: document.getElementById('task-form-desc').value.trim(),
|
||||
priority: document.getElementById('task-form-priority').value,
|
||||
category: document.getElementById('task-form-category').value,
|
||||
status: document.getElementById('task-form-status').value,
|
||||
deadline: document.getElementById('task-form-deadline').value || null,
|
||||
assigned_to: document.getElementById('task-form-assigned').value,
|
||||
@@ -4275,6 +4282,7 @@ async function deleteTimeEntry(entryId, todoId) {
|
||||
document.getElementById('todo-search-input')?.addEventListener('input', () => renderTasksList());
|
||||
document.getElementById('todo-status-filter')?.addEventListener('change', () => renderTasksList());
|
||||
document.getElementById('todo-assigned-filter')?.addEventListener('change', () => renderTasksList());
|
||||
document.getElementById('todo-category-filter')?.addEventListener('change', () => renderTasksList());
|
||||
document.getElementById('feature-search-input')?.addEventListener('input', () => renderFeaturesList());
|
||||
document.getElementById('feature-status-filter')?.addEventListener('change', () => renderFeaturesList());
|
||||
document.getElementById('btn-add-task')?.addEventListener('click', () => openTaskEdit(null));
|
||||
|
||||
Reference in New Issue
Block a user