Feltmodus: dagsplan først med lokasjon per oppgave
Feltmodus hopper til dagsplan-visning og legger dagsplan-kolonnen øverst (backlog under). Hver plan-oppgave viser lokasjon under tittelen. Mobil ved første besøk lander på dagsplanen automatisk. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
bdeb6254b9
commit
7287f33e47
2 changed files with 20 additions and 9 deletions
|
|
@ -77,16 +77,18 @@ const $ = id => document.getElementById(id);
|
||||||
|
|
||||||
// ---------- Persistens av UI-valg ----------
|
// ---------- Persistens av UI-valg ----------
|
||||||
function loadPrefs() {
|
function loadPrefs() {
|
||||||
try {
|
let p = {};
|
||||||
const p = JSON.parse(localStorage.getItem('netops.prefs') || '{}');
|
try { p = JSON.parse(localStorage.getItem('netops.prefs') || '{}') || {}; }
|
||||||
|
catch { /* ignorer korrupt localStorage */ }
|
||||||
if (p.filters) Object.assign(state.filters, p.filters);
|
if (p.filters) Object.assign(state.filters, p.filters);
|
||||||
if (p.sort) state.sort = p.sort;
|
if (p.sort) state.sort = p.sort;
|
||||||
if (VIEWS.includes(p.view)) state.view = p.view;
|
if (VIEWS.includes(p.view)) state.view = p.view;
|
||||||
if (typeof p.fieldMode === 'boolean') state.fieldMode = p.fieldMode;
|
if (typeof p.fieldMode === 'boolean') state.fieldMode = p.fieldMode;
|
||||||
} catch { /* ignorer korrupt localStorage */ }
|
// Slå på feltmodus automatisk på små skjermer hvis brukeren ikke har valgt selv,
|
||||||
// Slå på feltmodus automatisk på små skjermer hvis brukeren ikke har valgt selv.
|
// og land på dagsplanen hvis det er første besøk (ingen lagret visning).
|
||||||
if (localStorage.getItem('netops.fieldModeSet') !== '1' && window.innerWidth < 640) {
|
if (localStorage.getItem('netops.fieldModeSet') !== '1' && window.innerWidth < 640) {
|
||||||
state.fieldMode = true;
|
state.fieldMode = true;
|
||||||
|
if (!VIEWS.includes(p.view)) state.view = 'plan';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function savePrefs() {
|
function savePrefs() {
|
||||||
|
|
@ -873,6 +875,7 @@ function renderPlanItem(t, i, own = true) {
|
||||||
<span class="plan-num">${i + 1}</span>
|
<span class="plan-num">${i + 1}</span>
|
||||||
<div class="plan-item-main">
|
<div class="plan-item-main">
|
||||||
<div class="plan-item-title" onclick="openEdit('${t.id}')">${escapeHtml(t.title)}</div>
|
<div class="plan-item-title" onclick="openEdit('${t.id}')">${escapeHtml(t.title)}</div>
|
||||||
|
${t.location ? `<div class="plan-item-loc">📍 ${escapeHtml(t.location)}</div>` : ''}
|
||||||
<div class="plan-item-meta">
|
<div class="plan-item-meta">
|
||||||
<span class="badge prio-${t.priority}">${t.priority}</span>
|
<span class="badge prio-${t.priority}">${t.priority}</span>
|
||||||
${catBadge(t)}
|
${catBadge(t)}
|
||||||
|
|
@ -1367,9 +1370,12 @@ function applyFieldMode() {
|
||||||
function toggleFieldMode() {
|
function toggleFieldMode() {
|
||||||
state.fieldMode = !state.fieldMode;
|
state.fieldMode = !state.fieldMode;
|
||||||
localStorage.setItem('netops.fieldModeSet', '1'); // brukeren har valgt selv
|
localStorage.setItem('netops.fieldModeSet', '1'); // brukeren har valgt selv
|
||||||
|
// I felt vil man ha dagsplanen først; hopp dit når feltmodus slås på.
|
||||||
|
if (state.fieldMode) state.view = 'plan';
|
||||||
savePrefs();
|
savePrefs();
|
||||||
applyFieldMode();
|
applyFieldMode();
|
||||||
toast(state.fieldMode ? 'Feltmodus på' : 'Feltmodus av');
|
renderView();
|
||||||
|
toast(state.fieldMode ? 'Feltmodus på — viser dagsplan' : 'Feltmodus av');
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Navnevalg (cookie-auth) ----------
|
// ---------- Navnevalg (cookie-auth) ----------
|
||||||
|
|
|
||||||
|
|
@ -371,6 +371,7 @@ tbody tr.status-done .task-title { text-decoration: line-through; }
|
||||||
.plan-item-main { flex: 1; min-width: 0; }
|
.plan-item-main { flex: 1; min-width: 0; }
|
||||||
.plan-item-title { font-size: 13px; font-weight: 500; cursor: pointer; }
|
.plan-item-title { font-size: 13px; font-weight: 500; cursor: pointer; }
|
||||||
.plan-item-title:hover { color: var(--accent); }
|
.plan-item-title:hover { color: var(--accent); }
|
||||||
|
.plan-item-loc { font-family: var(--mono); font-size: 12px; color: var(--accent); margin-top: 2px; }
|
||||||
.plan-item-meta { display: flex; gap: 8px; align-items: center; margin-top: 3px;
|
.plan-item-meta { display: flex; gap: 8px; align-items: center; margin-top: 3px;
|
||||||
font-size: 11px; font-family: var(--mono); color: var(--text-faint); flex-wrap: wrap; }
|
font-size: 11px; font-family: var(--mono); color: var(--text-faint); flex-wrap: wrap; }
|
||||||
.plan-item-actions { display: flex; gap: 2px; flex-shrink: 0; }
|
.plan-item-actions { display: flex; gap: 2px; flex-shrink: 0; }
|
||||||
|
|
@ -453,6 +454,10 @@ body.field-mode input[type="date"] { min-height: 44px; font-size: 15px; }
|
||||||
/* Tavle og planner i én kolonne for tommelvennlig scrolling */
|
/* Tavle og planner i én kolonne for tommelvennlig scrolling */
|
||||||
body.field-mode .board { grid-template-columns: 1fr; }
|
body.field-mode .board { grid-template-columns: 1fr; }
|
||||||
body.field-mode .planner { grid-template-columns: 1fr; }
|
body.field-mode .planner { grid-template-columns: 1fr; }
|
||||||
|
/* I felt vil man ha dagsplanen øverst, backlogen under */
|
||||||
|
body.field-mode .plan-today { order: -1; }
|
||||||
|
body.field-mode .plan-item-loc { font-size: 14px; }
|
||||||
|
body.field-mode .plan-item-title { font-size: 15px; }
|
||||||
body.field-mode .card { padding: 14px; }
|
body.field-mode .card { padding: 14px; }
|
||||||
body.field-mode .card-title { font-size: 15px; }
|
body.field-mode .card-title { font-size: 15px; }
|
||||||
body.field-mode .avail-row, body.field-mode .plan-item { padding: 12px; }
|
body.field-mode .avail-row, body.field-mode .plan-item { padding: 12px; }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue