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 @@
@@ -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