Merge pull request #121 from LD-Reborn/120-feature-add-localization-to-assets-frontend

120 feature add localization to assets frontend
This commit is contained in:
LD50
2025-10-12 20:03:51 +02:00
committed by GitHub
5 changed files with 199 additions and 26 deletions

View File

@@ -66,6 +66,7 @@ public class AssetsController : Controller
[HttpPost("Create")]
public async Task<AssetsCreateResponseModel> Create([FromBody]AssetsCreateRequestModel assetModel)
{
string? assetId;
AssetsCreateResponseModel result;
if (assetModel is null)
{
@@ -82,8 +83,8 @@ public class AssetsController : Controller
[
new LdapAttribute("objectClass", ["top", "device", "extensibleObject"]),
];
attributeSet.Add(new LdapAttribute("cn", await _ldap.GetAssetCounterAndIncrementAsync()));
assetId = await _ldap.GetAssetCounterAndIncrementAsync();
attributeSet.Add(new LdapAttribute("cn", assetId));
if (assetModel.SerialNumber != null)
{
attributeSet.Add(new LdapAttribute("serialNumber", assetModel.SerialNumber));
@@ -107,7 +108,7 @@ public class AssetsController : Controller
}
await _ldap.CreateAsset(attributeSet);
result = new AssetsCreateResponseModel(successful: true);
result = new AssetsCreateResponseModel(successful: true, assetId);
}
catch (Exception e)
{

View File

@@ -1,8 +1,9 @@
using Berufsschule_HAM.Models;
public class AssetsCreateResponseModel(bool successful, string exception = "None")
public class AssetsCreateResponseModel(bool successful, string? assetId = null, string exception = "None")
{
public bool Success { get; set; } = successful;
public string? AssetId { get; set; } = assetId;
public string? Exception { get; set; } = exception;
}

View File

@@ -13,8 +13,26 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, ...</value>
</resheader>
<data name="Assets" xml:space="preserve">
<value>Assets</value>
</data>
<data name="Create asset" xml:space="preserve">
<value>Asset anlegen</value>
<value>Asset erstellen</value>
</data>
<data name="Owner" xml:space="preserve">
<value>Besitzer</value>
</data>
<data name="Asset ID" xml:space="preserve">
<value>Asset ID</value>
</data>
<data name="Asset Name" xml:space="preserve">
<value>Asset Name</value>
</data>
<data name="Location" xml:space="preserve">
<value>Ort</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
<data name="Update" xml:space="preserve">
<value>Anpassen</value>
@@ -22,4 +40,103 @@
<data name="Delete" xml:space="preserve">
<value>Löschen</value>
</data>
<data name="Create Asset" xml:space="preserve">
<value>Asset erstellen</value>
</data>
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="Serial Number" xml:space="preserve">
<value>Seriennummer</value>
</data>
<data name="Description" xml:space="preserve">
<value>Beschreibung</value>
</data>
<data name="Type" xml:space="preserve">
<value>Art</value>
</data>
<data name="Make" xml:space="preserve">
<value>Marke</value>
</data>
<data name="Model" xml:space="preserve">
<value>Modell</value>
</data>
<data name="Attributes" xml:space="preserve">
<value>Attribute</value>
</data>
<data name="Add Attribute" xml:space="preserve">
<value>Attribut hinzufügen</value>
</data>
<data name="Purchase Information" xml:space="preserve">
<value>Kaufinformationen</value>
</data>
<data name="Purchase Value" xml:space="preserve">
<value>Kaufwert</value>
</data>
<data name="Purchased At" xml:space="preserve">
<value>Gekauft bei</value>
</data>
<data name="Purchased By" xml:space="preserve">
<value>Gekauft von</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Abbrechen</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellen</value>
</data>
<data name="Update Asset" xml:space="preserve">
<value>Asset anpassen</value>
</data>
<data name="Purchase Date" xml:space="preserve">
<value>Kaufdatum</value>
</data>
<data name="Save Changes" xml:space="preserve">
<value>Änderungen anwenden</value>
</data>
<data name="Attribute name" xml:space="preserve">
<value>Attribut Name</value>
</data>
<data name="Attribute value" xml:space="preserve">
<value>Attribut Wert</value>
</data>
<data name="Remove" xml:space="preserve">
<value>Entfernen</value>
</data>
<data name="Confirm Delete" xml:space="preserve">
<value>Asset löschen</value>
</data>
<data name="AssetDeleteConfirmation1" xml:space="preserve">
<value>Sind Sie sicher, dass Sie das Asset</value>
</data>
<data name="AssetDeleteConfirmation2" xml:space="preserve">
<value> löschen wollen?</value>
</data>
<data name="Yes, Delete" xml:space="preserve">
<value>Ja, löschen</value>
</data>
<data name="Asset deleted successfully" xml:space="preserve">
<value>Asset wurde erfolgreich gelöscht</value>
</data>
<data name="Error contacting server" xml:space="preserve">
<value>Server konnte nicht erreicht werden</value>
</data>
<data name="Unknown error" xml:space="preserve">
<value>Unbekannter Fehler</value>
</data>
<data name="Asset created successfully" xml:space="preserve">
<value>Asset wurde erfolgreich erstellt</value>
</data>
<data name="Error creating asset" xml:space="preserve">
<value>Fehler beim Erstellen des Asset</value>
</data>
<data name="Error loading asset data" xml:space="preserve">
<value>Fehler beim Laden der Asset Daten</value>
</data>
<data name="Asset updated successfully" xml:space="preserve">
<value>Asset wurde erfolgreich angepasst</value>
</data>
<data name="Error updating asset" xml:space="preserve">
<value>Fehler beim Anpassen des Assets</value>
</data>
</root>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, ...</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, ...</value>
</resheader>
<data name="AssetDeleteConfirmation1" xml:space="preserve">
<value>Are you sure you want to delete the asset</value>
</data>
<data name="AssetDeleteConfirmation2" xml:space="preserve">
<value>?</value>
</data>
</root>

View File

@@ -67,16 +67,16 @@
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-danger text-white">
<h5 class="modal-title" id="deleteModalLabel">Confirm Delete</h5>
<h5 class="modal-title" id="deleteModalLabel">@T["Confirm Delete"]</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Are you sure you want to delete the asset <strong id="assetName"></strong> (ID: <span id="assetId"></span>)?</p>
<p>@T["AssetDeleteConfirmation1"] <strong id="assetName"></strong> (ID: <span id="assetId"></span>)@T["AssetDeleteConfirmation2"]</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">@T["Cancel"]</button>
<form id="deleteForm" method="post" action="">
<button type="submit" class="btn btn-danger">Yes, Delete</button>
<button type="submit" class="btn btn-danger">@T["Yes, Delete"]</button>
</form>
</div>
</div>
@@ -157,13 +157,13 @@
row.classList.add('table-danger');
setTimeout(() => row.remove(), 300);
showToast('Asset deleted successfully', 'success');
showToast('@T["Asset deleted successfully"]', 'success');
} else {
showToast(`${result.reason}: ${result.exception || 'Unknown error'}`, 'danger');
showToast(`${result.reason}: ${result.exception || '@T["Unknown error"]'}`, 'danger');
}
} catch (error) {
console.error(error);
showToast('Error contacting server', 'danger');
showToast('@T["Error contacting server"]', 'danger');
}
});
});
@@ -274,9 +274,9 @@
const row = document.createElement('div');
row.className = 'd-flex gap-2 align-items-center attribute-row';
row.innerHTML = `
<input type="text" class="form-control" placeholder="Attribute name" data-attr-name />
<input type="text" class="form-control" placeholder="Attribute value" data-attr-value />
<button type="button" class="btn btn-danger btn-sm btn-remove-attribute"></button>
<input type="text" class="form-control" placeholder="@T["Attribute name"]" data-attr-name />
<input type="text" class="form-control" placeholder="@T["Attribute value"]" data-attr-value />
<button type="button" class="btn btn-danger btn-sm btn-remove-attribute">@T["Remove"]</button>
`;
attributesContainer.appendChild(row);
});
@@ -333,14 +333,47 @@
bootstrap.Modal.getInstance(createModalEl).hide();
createForm.reset();
attributesContainer.innerHTML = '';
showToast('Asset created successfully', 'success');
const tableBody = document.querySelector('table tbody');
if (tableBody) {
const newRow = document.createElement('tr');
newRow.innerHTML = `
<td>${jsonData.Owner || ''}</td>
<td>${result.assetId || ''}</td>
<td>${jsonData.Name || ''}</td>
<td>${jsonData.Location || ''}</td>
<td>
<div class="d-flex gap-2">
<button class="btn btn-sm btn-warning btn-update"
data-asset-id="${result.assetId}"
data-bs-toggle="modal"
data-bs-target="#updateAssetModal">
@T["Update"]
</button>
<button class="btn btn-sm btn-danger btn-delete"
data-asset-id="${result.assetId}"
data-asset-name="${jsonData.Name || ''}"
data-bs-toggle="modal"
data-bs-target="#deleteModal">
@T["Delete"]
</button>
</div>
</td>
`;
newRow.classList.add('table-success');
setTimeout(() => {
newRow.classList.toggle('table-success');
}, 500);
tableBody.append(newRow);
}
showToast('@T["Asset created successfully"]', 'success');
} else {
showToast(`${result.reason || 'Error creating asset'}`, 'danger');
showToast(`${result.reason || '@T["Error creating asset"]'}`, 'danger');
}
})
.catch(err => {
console.error(err);
showToast('Error contacting server', 'danger');
showToast('@T["Error contacting server"]', 'danger');
});
});
});
@@ -448,9 +481,9 @@ document.addEventListener('DOMContentLoaded', () => {
const row = document.createElement('div');
row.className = 'd-flex gap-2 align-items-center attribute-row';
row.innerHTML = `
<input type="text" class="form-control" placeholder="Attribute name" data-attr-name />
<input type="text" class="form-control" placeholder="Attribute value" data-attr-value />
<button type="button" class="btn btn-danger btn-sm btn-remove-attribute"></button>
<input type="text" class="form-control" placeholder="@T["Attribute name"]" data-attr-name />
<input type="text" class="form-control" placeholder="@T["Attribute value"]" data-attr-value />
<button type="button" class="btn btn-danger btn-sm btn-remove-attribute">@T["Remove"]</button>
`;
updateAttributesContainer.appendChild(row);
});
@@ -493,7 +526,7 @@ document.addEventListener('DOMContentLoaded', () => {
row.innerHTML = `
<input type="text" class="form-control" value="${attrName}" data-attr-name />
<input type="text" class="form-control" value="${attrValue}" data-attr-value />
<button type="button" class="btn btn-danger btn-sm btn-remove-attribute"></button>
<button type="button" class="btn btn-danger btn-sm btn-remove-attribute">@T["Remove"]</button>
`;
updateAttributesContainer.appendChild(row);
}
@@ -509,7 +542,7 @@ document.addEventListener('DOMContentLoaded', () => {
}
} catch (err) {
console.error(err);
showToast('Error loading asset data', 'danger');
showToast('@T["Error loading asset data"]', 'danger');
}
});
@@ -551,7 +584,7 @@ document.addEventListener('DOMContentLoaded', () => {
if (result.success) {
bootstrap.Modal.getInstance(updateModal).hide();
showToast('Asset updated successfully', 'success');
showToast('@T["Asset updated successfully"]', 'success');
// Optionally refresh the row
const row = [...document.querySelectorAll('tr')]
@@ -563,11 +596,11 @@ document.addEventListener('DOMContentLoaded', () => {
row.children[3].textContent = jsonData.Location || '';
}
} else {
showToast(result.reason || 'Error updating asset', 'danger');
showToast(result.reason || '@T["Error updating asset"]', 'danger');
}
} catch (err) {
console.error(err);
showToast('Error contacting server', 'danger');
showToast('@T["Error contacting server"]', 'danger');
}
});
});