chore: implementiere MsFilePicker-Komponente, ersetze veraltete Input-Felder in Geräteneukonfiguration und ZNS-Importer, verbessere Vereinskarten-Darstellung und Detail-UX, behebe Tippfehler in settings.json

This commit is contained in:
2026-04-20 02:00:31 +02:00
parent 9fe889b2c1
commit d4aeba4666
11 changed files with 337 additions and 248 deletions
@@ -0,0 +1,18 @@
package at.mocode.frontend.core.designsystem.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
/**
* Zentraler FilePicker für die gesamte App.
*/
@Composable
expect fun MsFilePicker(
label: String,
selectedPath: String?,
onFileSelected: (String) -> Unit,
fileExtensions: List<String> = emptyList(),
directoryOnly: Boolean = false,
enabled: Boolean = true,
modifier: Modifier = Modifier
)
@@ -0,0 +1,78 @@
package at.mocode.frontend.core.designsystem.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import java.awt.FileDialog
import java.awt.Frame
import java.io.File
import javax.swing.JFileChooser
@Composable
actual fun MsFilePicker(
label: String,
selectedPath: String?,
onFileSelected: (String) -> Unit,
fileExtensions: List<String>,
directoryOnly: Boolean,
enabled: Boolean,
modifier: Modifier
) {
Row(
modifier = modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
MsTextField(
value = selectedPath ?: "",
onValueChange = { },
readOnly = true,
label = label,
placeholder = if (directoryOnly) "Verzeichnis wählen..." else "Datei wählen...",
modifier = Modifier.weight(1f),
enabled = enabled,
compact = true
)
Spacer(Modifier.width(8.dp))
MsButton(
onClick = {
if (directoryOnly) {
// JFileChooser ist für Verzeichnisse auf dem Desktop oft stabiler/einfacher
val chooser = JFileChooser().apply {
fileSelectionMode = JFileChooser.DIRECTORIES_ONLY
dialogTitle = label
selectedPath?.let {
val currentDir = File(it)
if (currentDir.exists()) currentDirectory = currentDir
}
}
val result = chooser.showOpenDialog(null)
if (result == JFileChooser.APPROVE_OPTION) {
onFileSelected(chooser.selectedFile.absolutePath)
}
} else {
// AWT FileDialog für nativen Look bei Dateiauswahl (wie vom User gewünscht)
val dialog = FileDialog(null as Frame?, label, FileDialog.LOAD).apply {
if (fileExtensions.isNotEmpty()) {
setFilenameFilter { _, name ->
fileExtensions.any { name.lowercase().endsWith(it.lowercase()) }
}
}
}
dialog.isVisible = true
if (dialog.file != null) {
onFileSelected(File(dialog.directory, dialog.file).absolutePath)
}
}
},
text = "Durchsuchen",
enabled = enabled
)
}
}
@@ -0,0 +1,25 @@
package at.mocode.frontend.core.designsystem.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@Composable
actual fun MsFilePicker(
label: String,
selectedPath: String?,
onFileSelected: (String) -> Unit,
fileExtensions: List<String>,
directoryOnly: Boolean,
enabled: Boolean,
modifier: Modifier
) {
// WasmJs Implementierung (Platzhalter oder HTML Input Logik)
MsTextField(
value = selectedPath ?: "",
onValueChange = { },
readOnly = true,
label = label,
modifier = modifier,
enabled = enabled
)
}