diff --git a/src/Resources/Views.Home.Assets.de.resx b/src/Resources/Views.Home.Assets.de.resx index df9f6d8..556a080 100644 --- a/src/Resources/Views.Home.Assets.de.resx +++ b/src/Resources/Views.Home.Assets.de.resx @@ -157,4 +157,13 @@ Barcode zum Druckauftragsstapel hinzufügen + + Ort auswählen + + + Besitzer auswählen + + + Benutzer auswählen + diff --git a/src/Views/Home/Assets.cshtml b/src/Views/Home/Assets.cshtml index 11ef9d9..79ee670 100644 --- a/src/Views/Home/Assets.cshtml +++ b/src/Views/Home/Assets.cshtml @@ -5,6 +5,8 @@ @{ ViewData["Title"] = T["Assets"]; } + + @@ -177,9 +179,10 @@
- +
-
@@ -388,9 +391,10 @@
- +
-
@@ -485,13 +489,16 @@ document.addEventListener('DOMContentLoaded', () => { updateAttributesContainer.innerHTML = ''; updateForm.reset(); - const locationSelect = updateForm.querySelector('#updateLocationSelect'); - await loadLocationsIntoSelect(locationSelect); try { const response = await fetch(`/Assets/Get?cn=${assetId}`); const responseJson = await response.json(); const asset = responseJson.assetsModel; + const locationSelect = updateForm.querySelector('#updateLocationSelect'); + await loadLocationsIntoSelect(locationSelect, asset.Location); + const usersSelect = updateForm.querySelector('#updateUsersSelect'); + await loadUsersIntoSelect(usersSelect, asset.Owner); + for (const [key, value] of Object.entries(asset)) { const input = updateForm.querySelector(`[name="${key}"]`); if (input) input.value = value; @@ -762,11 +769,67 @@ document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => { const createModal = document.getElementById('createAssetModal'); createModal.addEventListener('show.bs.modal', async () => { - const select = createModal.querySelector('#createLocationSelect'); - await loadLocationsIntoSelect(select); + const selectLocations = createModal.querySelector('#createLocationSelect'); + await loadLocationsIntoSelect(selectLocations); + const selectUsers = createModal.querySelector('#createUsersSelect'); + await loadUsersIntoSelect(selectUsers); }); }); + + + \ No newline at end of file diff --git a/src/Views/Shared/_Layout.cshtml b/src/Views/Shared/_Layout.cshtml index 0611bc7..fd97d68 100644 --- a/src/Views/Shared/_Layout.cshtml +++ b/src/Views/Shared/_Layout.cshtml @@ -20,7 +20,9 @@ diff --git a/src/wwwroot/css/site.css b/src/wwwroot/css/site.css index b50430f..8ed6dde 100644 --- a/src/wwwroot/css/site.css +++ b/src/wwwroot/css/site.css @@ -40,4 +40,27 @@ body { width: 2rem; height: 2rem; float: right; -} \ No newline at end of file +} + +/* Tomselect dark mode theme */ +[data-bs-theme="dark"] .ts-control, +[data-bs-theme="dark"] .ts-dropdown { + color: #f8f9fa !important; + border-color: #444 !important; +} + +[data-bs-theme="dark"] .ts-control input, +[data-bs-theme="dark"] .ts-dropdown .option, +[data-bs-theme="dark"] .ts-dropdown .item { + color: #f8f9fa !important; +} + +[data-bs-theme="dark"] .ts-dropdown .option:hover, +[data-bs-theme="dark"] .ts-dropdown .active { + color: #ffffff !important; +} + +[data-bs-theme="dark"] .ts-control .item { + color: #f8f9fa !important; + border-color: #666 !important; +} diff --git a/src/wwwroot/js/site.js b/src/wwwroot/js/site.js index 15d9a89..4604645 100644 --- a/src/wwwroot/js/site.js +++ b/src/wwwroot/js/site.js @@ -123,20 +123,65 @@ async function loadLocationsIntoSelect(selectElement, selectedValue = null) { const response = await fetch('/Locations/Index'); const locations = await response.json(); - selectElement.innerHTML = ``; + const ts = selectElement.tomselect; + + if (!ts) { + selectElement.innerHTML = ``; + locations.forEach(loc => { + const option = document.createElement('option'); + option.value = loc.location; + option.textContent = loc.location; + if (selectedValue && selectedValue === loc.location) { + option.selected = true; + } + selectElement.appendChild(option); + }); + return; + } + + ts.clearOptions(); + ts.addOption(locations.map(loc => ({ + value: loc.location, + text: loc.location + }))); + ts.refreshOptions(false); + + if (selectedValue) { + ts.setValue(selectedValue); + } else { + ts.clear(true); + } - locations.forEach(loc => { - const text = `${loc.description.Location}, Room ${loc.description.RoomNumber}, Seat ${loc.description.Seat}`; - const option = document.createElement('option'); - option.value = loc.location; - option.textContent = text; - if (selectedValue && selectedValue === loc.location) { - option.selected = true; - } - selectElement.appendChild(option); - }); } catch (err) { console.error('Error loading locations:', err); - showToast(appTranslations.errorLoading, 'danger'); + showToast(appTranslations.errorLoadingLocations, 'danger'); + } +} + +async function loadUsersIntoSelect(selectElement, selectedValue = null) { + try { + const response = await fetch('/Users/Index?Cn=false&Sn=false&Title=false&Description=false&JpegPhoto=false&UserPassword=false'); + const users = await response.json(); + + const ts = selectElement.tomselect; + if (!ts) { + selectElement.innerHTML = ``; + users.forEach(u => { + const opt = document.createElement('option'); + opt.value = u.uid; + opt.textContent = u.uid; + selectElement.appendChild(opt); + }); + return; + } + + ts.clearOptions(); + ts.addOption(users.map(u => ({ value: u.uid, text: u.uid }))); + ts.refreshOptions(false); + + if (selectedValue) ts.setValue(selectedValue); + } catch (err) { + console.error('Error loading users:', err); + showToast(appTranslations.errorLoadingUsers, 'danger'); } } \ No newline at end of file