Workspace: Aufgabenbrett und Dashboard-Zahlen
Erster echter Arbeitsbereich aus dem Konzept. Kanban mit offen / in Arbeit / Review / erledigt, dazu Prioritaet, Frist, Verantwortlicher und Zuordnung zu einem Creator-Bereich. Kern ist die Datentrennung, und die sitzt AUSSCHLIESSLICH im Server -- in jeder einzelnen Abfrage, an einer Stelle definiert (sichtbar()): admin sieht alles creator sieht seinen Bereich und was ihm zugewiesen ist scout sieht nur, was ihm zugewiesen ist Geprueft mit vier Testkonten: - Chef sieht 4, Luna 2, Mika 1, Sam 1 Aufgaben - Luna auf Mikas Aufgabe: 404 (nicht 403 -- sonst liesse sich durch Ausprobieren herausfinden, welche Nummern es gibt) - Luna legt Aufgabe mit creator_id=Mika an: wird still auf ihren eigenen Bereich umgebogen, Mika sieht sie nicht - Anfrage mit fremdem Origin: 403 - ohne Anmeldung: 401, ungueltiger Status/leerer Titel: 400 - Scout bekommt in der Personenliste nur sich selbst - Dashboard-Zahlen je Rolle korrekt eingegrenzt Weitere Punkte: - Texte werden im Browser nur ueber textContent gesetzt, nie innerHTML -- ein Aufgabentitel darf keine Auszeichnung einschleusen - ueberfaellig = Frist vorbei UND nicht erledigt; die Kachel faerbt sich nur, wenn wirklich etwas ansteht - erledigt_am wird gesetzt bzw. wieder geleert, wenn eine Aufgabe zurueckgeholt wird - Erledigtes verschwindet nicht, wie im Konzept gefordert
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
/* ===================================================================
|
||||
Aufgabenbrett. Baut auf gate.css und start.css auf.
|
||||
=================================================================== */
|
||||
|
||||
.inhalt--breit { max-width: 1240px; }
|
||||
|
||||
.zurueck { color: inherit; text-decoration: none; border-bottom: 1px solid transparent; }
|
||||
.zurueck:hover { border-bottom-color: currentColor; }
|
||||
|
||||
.kopf-zeile {
|
||||
display: flex; align-items: flex-end; justify-content: space-between;
|
||||
gap: 20px; flex-wrap: wrap; margin-bottom: 24px;
|
||||
}
|
||||
.kopf-zeile .titel { margin: 0; font-size: clamp(1.4rem, 2.2vw, 1.85rem); }
|
||||
|
||||
.knopf--klein {
|
||||
width: auto; margin: 0; padding: 10px 18px; font-size: .92rem;
|
||||
}
|
||||
|
||||
.leise { color: var(--text-still); font-weight: 400; }
|
||||
|
||||
/* ---------- Formular -------------------------------------------------- */
|
||||
|
||||
.neu {
|
||||
margin: 0 0 28px;
|
||||
padding: 20px;
|
||||
background: rgba(255, 255, 255, .03);
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
.neu__zeile { margin-bottom: 14px; }
|
||||
.neu__raster {
|
||||
display: grid; gap: 14px; margin-bottom: 8px;
|
||||
grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
|
||||
}
|
||||
.neu__knoepfe { display: flex; gap: 10px; align-items: center; margin-top: 12px; }
|
||||
|
||||
.feld-schild {
|
||||
display: block; margin-bottom: 6px;
|
||||
font-size: .76rem; font-weight: 600; letter-spacing: .06em;
|
||||
text-transform: uppercase; color: var(--text-still);
|
||||
}
|
||||
|
||||
.neu input, .neu textarea, .neu select {
|
||||
width: 100%; padding: 10px 12px;
|
||||
background: rgba(255, 255, 255, .045);
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: var(--radius-klein);
|
||||
color: var(--text); font: inherit;
|
||||
transition: border-color var(--tempo), box-shadow var(--tempo);
|
||||
}
|
||||
.neu textarea { resize: vertical; min-height: 62px; }
|
||||
.neu input:focus, .neu textarea:focus, .neu select:focus {
|
||||
outline: none; border-color: rgba(63, 189, 245, .7);
|
||||
box-shadow: 0 0 0 3px rgba(63, 189, 245, .16);
|
||||
}
|
||||
/* Der Kalender-Knopf im Datumsfeld ist sonst fast schwarz auf dunkel. */
|
||||
.neu input[type="date"]::-webkit-calendar-picker-indicator { filter: invert(.75); cursor: pointer; }
|
||||
|
||||
/* ---------- Brett ----------------------------------------------------- */
|
||||
|
||||
.brett {
|
||||
display: grid; gap: 14px;
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.spalte {
|
||||
background: rgba(255, 255, 255, .022);
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: var(--radius);
|
||||
padding: 14px 12px 16px;
|
||||
min-height: 120px;
|
||||
}
|
||||
|
||||
.spalte__kopf {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
margin: 0 2px 12px;
|
||||
font-size: .78rem; font-weight: 700;
|
||||
letter-spacing: .08em; text-transform: uppercase;
|
||||
color: var(--text-leise);
|
||||
}
|
||||
.spalte__punkt { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; }
|
||||
.spalte__zahl {
|
||||
margin-left: auto; padding: 1px 8px;
|
||||
background: rgba(255, 255, 255, .06); border-radius: 999px;
|
||||
font-size: .74rem; color: var(--text-still); letter-spacing: normal;
|
||||
}
|
||||
|
||||
.spalte[data-status="offen"] .spalte__punkt { background: #6f89a8; }
|
||||
.spalte[data-status="arbeit"] .spalte__punkt { background: var(--akzent); }
|
||||
.spalte[data-status="review"] .spalte__punkt { background: #e0a33c; }
|
||||
.spalte[data-status="erledigt"] .spalte__punkt { background: #4dab77; }
|
||||
|
||||
.karte {
|
||||
padding: 12px 13px;
|
||||
margin-bottom: 9px;
|
||||
background: rgba(9, 13, 22, .78);
|
||||
border: 1px solid var(--rand);
|
||||
border-left: 3px solid transparent;
|
||||
border-radius: var(--radius-klein);
|
||||
}
|
||||
.karte[data-prio="hoch"] { border-left-color: #d8656e; }
|
||||
.karte[data-prio="mittel"] { border-left-color: #4b6c8a; }
|
||||
.karte[data-prio="niedrig"] { border-left-color: #3c4a5a; }
|
||||
|
||||
.karte__titel { font-weight: 600; font-size: .93rem; line-height: 1.35; }
|
||||
.karte__text { margin: 6px 0 0; font-size: .84rem; color: var(--text-leise); }
|
||||
|
||||
.karte__zeile {
|
||||
display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
|
||||
margin-top: 10px; font-size: .76rem; color: var(--text-still);
|
||||
}
|
||||
.karte__frist--faellig { color: var(--warn); font-weight: 600; }
|
||||
|
||||
.karte__schritte { display: flex; gap: 6px; margin-top: 10px; flex-wrap: wrap; }
|
||||
.schritt {
|
||||
padding: 5px 10px;
|
||||
background: rgba(255, 255, 255, .04);
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: 8px;
|
||||
color: var(--text-leise); font: inherit; font-size: .76rem; cursor: pointer;
|
||||
transition: background var(--tempo), border-color var(--tempo), color var(--tempo);
|
||||
}
|
||||
.schritt:hover { background: rgba(255, 255, 255, .08); color: var(--text); border-color: var(--rand-hell); }
|
||||
.schritt[disabled] { opacity: .4; cursor: default; }
|
||||
|
||||
.spalte__leer { margin: 4px 2px; font-size: .82rem; color: var(--text-still); }
|
||||
|
||||
@media (max-width: 1080px) { .brett { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
||||
@media (max-width: 620px) { .brett { grid-template-columns: 1fr; } }
|
||||
@@ -66,6 +66,32 @@ body.start {
|
||||
.willkommen { margin-bottom: 38px; }
|
||||
.willkommen .titel { margin-bottom: 6px; }
|
||||
|
||||
/* ---------- Zahlen ---------------------------------------------------- */
|
||||
|
||||
.zahlen-block { margin-bottom: 34px; }
|
||||
|
||||
.zahlen {
|
||||
list-style: none; margin: 0; padding: 0;
|
||||
display: grid; gap: 10px;
|
||||
grid-template-columns: repeat(auto-fit, minmax(122px, 1fr));
|
||||
}
|
||||
|
||||
.zahl {
|
||||
padding: 14px 16px;
|
||||
background: rgba(255, 255, 255, .03);
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: var(--radius-klein);
|
||||
}
|
||||
.zahl__wert { display: block; font-size: 1.7rem; font-weight: 700; line-height: 1.1; }
|
||||
.zahl__name { display: block; margin-top: 2px; font-size: .78rem; color: var(--text-still); }
|
||||
|
||||
/* Nur wenn wirklich etwas überfällig ist, wird die Kachel hervorgehoben --
|
||||
sonst stumpft die Farbe ab und man übersieht sie im Ernstfall. */
|
||||
.zahl[data-warn="ja"] { border-color: rgba(255, 154, 162, .42); background: rgba(255, 154, 162, .07); }
|
||||
.zahl[data-warn="ja"] .zahl__wert { color: var(--warn); }
|
||||
|
||||
/* ---------- Bereiche --------------------------------------------------- */
|
||||
|
||||
.bereiche {
|
||||
list-style: none; margin: 0; padding: 0;
|
||||
display: grid; gap: 10px;
|
||||
@@ -93,6 +119,24 @@ body.start {
|
||||
.bereich[data-phase="1"] { border-color: rgba(63, 189, 245, .34); }
|
||||
.bereich[data-phase="1"] .bereich__stand { color: var(--akzent); }
|
||||
|
||||
/* Fertige Bereiche sind anklickbar und heben sich deutlich ab. */
|
||||
.bereich[data-fertig="ja"] {
|
||||
padding: 0;
|
||||
border-color: rgba(63, 189, 245, .5);
|
||||
background: linear-gradient(100deg, rgba(63, 189, 245, .10), rgba(138, 118, 255, .07));
|
||||
transition: border-color var(--tempo), background var(--tempo);
|
||||
}
|
||||
.bereich[data-fertig="ja"]:hover { border-color: rgba(63, 189, 245, .8); }
|
||||
|
||||
.bereich__link {
|
||||
display: flex; align-items: baseline; gap: 10px; width: 100%;
|
||||
padding: 13px 15px;
|
||||
color: inherit; text-decoration: none;
|
||||
border-radius: var(--radius-klein);
|
||||
}
|
||||
.bereich__link:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
|
||||
.bereich[data-fertig="ja"] .bereich__stand { color: var(--akzent); font-weight: 600; }
|
||||
|
||||
.inhalt .fuss { margin-top: 40px; text-align: left; }
|
||||
|
||||
@media (max-width: 520px) {
|
||||
|
||||
Reference in New Issue
Block a user