Added localization for Admin.cshtml, added url-based collapse state

This commit is contained in:
2025-11-15 12:44:52 +01:00
parent fe1329985f
commit 770706883a
3 changed files with 125 additions and 2 deletions

View File

@@ -0,0 +1,91 @@
<?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="Users" xml:space="preserve">
<value>Benutzer</value>
</data>
<data name="General settings" xml:space="preserve">
<value>Allgemeine Einstellungen</value>
</data>
<data name="Default hash algorithm" xml:space="preserve">
<value>Standard-Hashalgorithmus</value>
</data>
<data name="Barcode type" xml:space="preserve">
<value>Barcode-Typ</value>
</data>
<data name="Barcode text" xml:space="preserve">
<value>Barcode-Text</value>
</data>
<data name="Max downloadable user image size" xml:space="preserve">
<value>Maximale Download-Größe für Benutzerbilder</value>
</data>
<data name="Presets" xml:space="preserve">
<value>Voreinstellungen</value>
</data>
<data name="Preset name" xml:space="preserve">
<value>Name der Voreinstellung</value>
</data>
<data name="Attributes" xml:space="preserve">
<value>Attribute</value>
</data>
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="Value" xml:space="preserve">
<value>Wert</value>
</data>
<data name="Delete attribute" xml:space="preserve">
<value>Attribut löschen</value>
</data>
<data name="Add attribute" xml:space="preserve">
<value>Attribut hinzufügen</value>
</data>
<data name="Delete preset" xml:space="preserve">
<value>Voreinstellung löschen</value>
</data>
<data name="Add preset" xml:space="preserve">
<value>Voreinstellung hinzufügen</value>
</data>
<data name="Apply settings and update presets" xml:space="preserve">
<value>Einstellungen übernehmen und Voreinstellungen aktualisieren</value>
</data>
<data name="Settings updated successfully" xml:space="preserve">
<value>Einstellungen erfolgreich aktualisiert</value>
</data>
<data name="Unknown error" xml:space="preserve">
<value>Unbekannter Fehler</value>
</data>
<data name="Error contacting server" xml:space="preserve">
<value>Fehler bei der Kommunikation mit dem Server</value>
</data>
</root>

View File

@@ -84,7 +84,7 @@
</div> </div>
} }
<div class="row mb-2"> <div class="row mb-2">
<div class="col-md-4"> <div class="col-md-8 mt-2">
<button type="button" class="btn btn-danger" data-type="deletePreset">@T["Delete preset"]</button> <button type="button" class="btn btn-danger" data-type="deletePreset">@T["Delete preset"]</button>
</div> </div>
<div class="col-md-4 ms-auto mt-2"> <div class="col-md-4 ms-auto mt-2">
@@ -179,10 +179,38 @@
} }
document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(toggler => { document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(toggler => {
toggler.addEventListener('click', () => { toggler.addEventListener('click', async () => {
const icon = toggler.querySelector('.chevron-svg'); const icon = toggler.querySelector('.chevron-svg');
icon.classList.toggle('rotate'); icon.classList.toggle('rotate');
var target = document.querySelector(toggler.dataset.bsTarget);
while (target.classList.contains('collapsing')) {
await sleep(10);
}
icon.parentElement.classList.toggle("no-bottom-border"); icon.parentElement.classList.toggle("no-bottom-border");
const collapseId = toggler.dataset.bsTarget.replace('#', '');
const isCollapsed = target.classList.contains('show');
// Update URL parameter
const url = new URL(window.location);
url.searchParams.set(collapseId, isCollapsed); // true = open, false = collapsed
window.history.replaceState({}, '', url);
});
});
document.addEventListener('DOMContentLoaded', () => {
const collapseElements = document.querySelectorAll('.collapse');
collapseElements.forEach(el => {
const paramValue = new URL(window.location).searchParams.get(el.id);
if (paramValue === 'true') {
el.classList.add('show');
const toggler = document.querySelector(`[data-bs-target="#${el.id}"]`);
if (toggler) {
toggler.querySelector('.chevron-svg')?.classList.add('rotate');
toggler.classList.add('no-bottom-border');
}
} else {
el.classList.remove('show');
}
}); });
}); });

View File

@@ -266,3 +266,7 @@ function unflatten(obj) {
} }
return result; return result;
} }
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}