Compare commits

...

3 Commits

4 changed files with 65 additions and 17 deletions
+31
View File
@@ -2063,6 +2063,11 @@ def _upload_excel_items(scope='inventory'):
validation_warnings = []
reserved_codes = set()
known_locations = set(it.get_predefined_locations())
known_filters = {
1: set(it.get_predefined_filter_values(1)),
2: set(it.get_predefined_filter_values(2)),
3: set(it.get_predefined_filter_values(3))
}
def is_code_available(candidate_code):
return candidate_code not in reserved_codes and it.is_code_unique(candidate_code)
@@ -2114,8 +2119,19 @@ def _upload_excel_items(scope='inventory'):
validation_warnings.append((row_number, f'Ort "{ort}" wird neu angelegt'))
filter1 = expand_filter_selection(_excel_list(val('filter1')), 1)
for f in filter1:
if f and f not in known_filters[1]:
validation_warnings.append((row_number, f'Kategorie 1 "{f}" wird neu angelegt'))
filter2 = expand_filter_selection(_excel_list(val('filter2')), 2)
for f in filter2:
if f and f not in known_filters[2]:
validation_warnings.append((row_number, f'Kategorie 2 "{f}" wird neu angelegt'))
filter3 = _excel_list(val('filter3'))
for f in filter3:
if f and f not in known_filters[3]:
validation_warnings.append((row_number, f'Kategorie 3 "{f}" wird neu angelegt'))
anschaffungsjahr = _excel_int(val('anschaffungsjahr'))
raw_year = val('anschaffungsjahr')
@@ -2217,6 +2233,21 @@ def _upload_excel_items(scope='inventory'):
it.add_predefined_location(row['ort'])
known_locations.add(row['ort'])
for f in row.get('filter1', []):
if f and f not in known_filters[1]:
it.add_predefined_filter_value(1, f)
known_filters[1].add(f)
for f in row.get('filter2', []):
if f and f not in known_filters[2]:
it.add_predefined_filter_value(2, f)
known_filters[2].add(f)
for f in row.get('filter3', []):
if f and f not in known_filters[3]:
it.add_predefined_filter_value(3, f)
known_filters[3].add(f)
series_group_id = str(uuid.uuid4()) if row['count'] > 1 else None
row_created_ids = []
+28 -12
View File
@@ -904,7 +904,7 @@
const filter2More = filter2Array.length > 1 ? ` (+${filter2Array.length - 1} mehr)` : '';
const filter3More = filter3Array.length > 1 ? ` (+${filter3Array.length - 1} mehr)` : '';
const imagesHtml = item.Images ? item.Images.map((file, index) => {
const imagesHtml = item.Images && item.Images.length > 0 ? item.Images.slice(0, 1).map((file, index) => {
// Get file with correct case handling
const image = file;
@@ -1631,7 +1631,7 @@
<div class="detail-group">
<div class="detail-label">Anschaffungskosten:</div>
<div class="detail-value">${item.Anschaffungskosten || '-'}</div>
<div class="detail-value">${item.Anschaffungskosten ? item.Anschaffungskosten + ' €' : '-'}</div>
</div>
<div class="detail-group full-width">
@@ -1719,7 +1719,7 @@
: `<button class="ausleihen disabled-button" disabled>${item.BlockedNow ? 'Reserviert' : 'Ausgeliehen'}</button>`
}
${canScheduleItem ? `<button class="schedule-button" onclick="openScheduleModal('${item._id}')">Termin planen</button>` : ''}
<button type="button" class="close-modal secondary-close" onclick="document.getElementById('item-modal').style.display='none';">Schließen</button>
<button type="button" class="details-button" onclick="document.getElementById('item-modal').style.display='none';">Schließen</button>
</div>
`;
@@ -3097,6 +3097,8 @@
scroll-snap-align: center;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
position: relative;
}
.item-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
@@ -3141,7 +3143,7 @@
.item-modal {
display: none;
position: fixed;
z-index: 1000;
z-index: 2500;
left: 0;
top: 0;
width: 100%;
@@ -3468,6 +3470,19 @@
/* Responsive adjustments */
@media (max-width: 768px) {
/* Mobile viewport and scrolling improvements */
html, body {
overflow-x: hidden !important;
-webkit-overflow-scrolling: touch !important;
touch-action: pan-y !important;
height: 100% !important;
}
body {
padding: 0 !important;
margin: 0 !important;
}
.filter-container {
flex-direction: column;
}
@@ -3553,8 +3568,9 @@
display: grid !important;
grid-template-columns: 1fr !important;
gap: 15px !important;
padding: 10px 0 0 !important;
padding: 10px 0 !important;
overflow-x: visible !important;
scroll-snap-type: none !important;
}
.item-card {
@@ -4098,6 +4114,7 @@
border: none !important;
border-radius: 0 !important;
box-shadow: none !important;
box-sizing: border-box !important;
}
.filter-group {
@@ -4314,13 +4331,12 @@
}
.modal-content {
width: 100% !important;
max-width: 100% !important;
height: 100vh !important;
max-height: 100vh !important;
margin: 0 !important;
border: none !important;
border-radius: 0 !important;
width: calc(100vw - 16px) !important;
max-width: none !important;
margin: 80px auto 10px !important;
max-height: 85vh !important;
overflow-y: auto !important;
border-radius: 8px !important;
padding: 16px !important;
}
+5 -4
View File
@@ -582,7 +582,7 @@
.item-modal {
display: none;
position: fixed;
z-index: 1000;
z-index: 2500;
left: 0;
top: 0;
width: 100%;
@@ -2584,7 +2584,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
<input type="date" id="edit-year" name="anschaffungsjahr">
</div>
<div class="form-group">
<label for="edit-cost">Anschaffungskosten:</label>
<label for="edit-cost">Anschaffungskosten (€):</label>
<input id="edit-cost" name="anschaffungskosten">
</div>
<div class="form-group">
@@ -3530,7 +3530,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
const filter2More = filter2Array.length > 1 ? ` (+${filter2Array.length - 1} mehr)` : '';
const filter3More = filter3Array.length > 1 ? ` (+${filter3Array.length - 1} mehr)` : '';
const imagesHtml = item.Images ? item.Images.map((image, index) => {
const imagesHtml = item.Images && item.Images.length > 0 ? item.Images.slice(0, 1).map((image, index) => {
// Check if the image already has a full URL path or just the filename
const imageSrc = image.startsWith('/uploads/') || image.startsWith('http') ?
image :
@@ -4441,7 +4441,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
<div class="detail-group">
<div class="detail-label">Anschaffungskosten:</div>
<div class="detail-value">${item.Anschaffungskosten || '-'}</div>
<div class="detail-value">${item.Anschaffungskosten ? item.Anschaffungskosten + ' €' : '-'}</div>
</div>
<div class="detail-group full-width">
@@ -4535,6 +4535,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
<form method="POST" action="/delete_item/${item._id}" style="display:inline;" onsubmit="return confirm('Sind Sie sicher?')">
<button class="delete-button" type="submit">Löschen</button>
</form>
<button type="button" class="details-button" onclick="document.getElementById('item-modal').style.display='none';">Schließen</button>
</div>
`;
+1 -1
View File
@@ -863,7 +863,7 @@
<input type="date" id="anschaffungsjahr" name="anschaffungsjahr">
</div>
<div class="form-group">
<label for="anschaffungskosten">Anschaffungskosten</label>
<label for="anschaffungskosten">Anschaffungskosten (€)</label>
<input id="anschaffungskosten" name="anschaffungskosten">
</div>
<div class="form-group">