Versioiva dokumentinhallinta + Laitetilat-moduuli

Dokumentit: versioiva tiedostonhallinta asiakkaille (sopimukset, laskut, ohjeet).
Sisältää versiohistorian, tiedostojen latauksen/palautuksen ja asiakas-suodatuksen.

Laitetilat: laitetilojen hallinta kuvagallerialla ja tiedostolistauksella.
Sisältää korttipohjaisen listanäkymän, kuvien esikatselun ja tiedostojen hallinnan.

Molemmat moduulit: 4 DB-taulua, 14 API-endpointtia, täysi CRUD, tiedostoupload.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 15:18:32 +02:00
parent 093f40ac09
commit e6fa65165e
5 changed files with 1612 additions and 2 deletions

150
style.css
View File

@@ -1558,3 +1558,153 @@ span.empty {
background: #e8f0fe;
color: #1a56db;
}
/* ==================== DOKUMENTIT ==================== */
.doc-category {
display: inline-block;
padding: 2px 8px;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 600;
}
.doc-category.cat-sopimus { background: #dbeafe; color: #1e40af; }
.doc-category.cat-lasku { background: #fef3c7; color: #92400e; }
.doc-category.cat-ohje { background: #d1fae5; color: #065f46; }
.doc-category.cat-raportti { background: #ede9fe; color: #5b21b6; }
.doc-category.cat-muu { background: #f3f4f6; color: #374151; }
#doc-versions-table tbody tr:hover {
background: #f0f7ff !important;
}
/* ==================== LAITETILAT ==================== */
.laitetilat-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 1rem;
}
.laitetila-card {
background: #fff;
border-radius: 12px;
padding: 1.25rem;
box-shadow: 0 1px 4px rgba(0,0,0,0.06);
cursor: pointer;
transition: box-shadow 0.2s, transform 0.15s;
border: 2px solid transparent;
}
.laitetila-card:hover {
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
transform: translateY(-2px);
border-color: var(--primary-color);
}
.laitetila-card h4 {
margin: 0 0 0.25rem;
color: var(--primary-dark);
font-size: 1rem;
}
.laitetila-osoite {
color: #888;
font-size: 0.85rem;
margin: 0 0 0.5rem;
}
.laitetila-meta {
color: #aaa;
font-size: 0.8rem;
margin: 0;
}
/* Kuvagalleria */
.gallery-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 0.75rem;
}
.gallery-item {
border-radius: 8px;
overflow: hidden;
background: #f8f9fb;
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
}
.gallery-item img {
width: 100%;
height: 140px;
object-fit: cover;
cursor: pointer;
transition: opacity 0.2s;
}
.gallery-item img:hover {
opacity: 0.85;
}
.gallery-caption {
padding: 0.4rem 0.6rem;
font-size: 0.75rem;
color: #666;
display: flex;
justify-content: space-between;
align-items: center;
}
.gallery-caption span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Laitetilan tiedostolistaus */
.laitetila-file-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.6rem 0;
border-bottom: 1px solid #f0f0f0;
}
.laitetila-file-item:last-child {
border-bottom: none;
}
.laitetila-file-item .file-name {
font-weight: 600;
color: var(--primary-color);
text-decoration: none;
}
.laitetila-file-item .file-name:hover {
text-decoration: underline;
}
.laitetila-file-item .file-meta {
display: block;
font-size: 0.8rem;
color: #999;
}
.laitetila-file-item .file-desc {
display: block;
font-size: 0.8rem;
color: #666;
font-style: italic;
}
.btn-icon {
background: none;
border: none;
cursor: pointer;
font-size: 1rem;
padding: 2px 4px;
border-radius: 4px;
transition: background 0.15s;
}
.btn-icon:hover {
background: #fee2e2;
}