Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a5a6f89f18 | |||
| 6835ee87a7 | |||
| 3a9d45327a |
+31
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
`;
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user