From 83d0c558048080e754ba4afe1aa91d9500280910 Mon Sep 17 00:00:00 2001 From: hami9 Date: Wed, 30 Sep 2026 13:36:50 +0330 Subject: [PATCH] Fix layout and SQL prefill bugs found on a 360dp phone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Testing v1.4.0 on a Galaxy S9 (360dp wide) showed four defects that do not appear on a wider screen: - The System screen ran labels into their values: "Supported ABIsarm64-v8a, armeabi-v7a". Both texts sat in a SpaceBetween row with nothing reserving space, so a wrapping value closed the gap. The label and value now share the row and the value is end-aligned. - A profile badge wrapped one word per line, printing "Teleg / ram / Bot" as a three-line block next to the project name. - The Services log filter drew "ERROR" one letter per line, because five chips did not fit the width. The chip row scrolls sideways now. - The Services subtitle ran underneath the "Stop All" button, which itself wrapped onto two lines. The SQL box in the database browser was hardcoded to "SELECT * FROM tasks LIMIT 25" while the view model executed a query for the first table it found, so the box showed a query that was never run — the screenshot showed that query above android_metadata's single row. In any project without a `tasks` table, pressing Execute SQL on the pre-filled text also failed. It now follows the query that runs. Co-Authored-By: Claude Opus 5 --- .../com/runcode/app/ui/screens/DatabaseScreen.kt | 9 ++++++++- .../com/runcode/app/ui/screens/HealthScreen.kt | 15 ++++++++++++--- .../java/com/runcode/app/ui/screens/HomeScreen.kt | 9 ++++++++- .../com/runcode/app/ui/screens/ProjectsScreen.kt | 11 ++++++++++- .../com/runcode/app/ui/screens/ServicesScreen.kt | 7 +++++-- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/runcode/app/ui/screens/DatabaseScreen.kt b/app/src/main/java/com/runcode/app/ui/screens/DatabaseScreen.kt index 39bb571..00e8a0c 100644 --- a/app/src/main/java/com/runcode/app/ui/screens/DatabaseScreen.kt +++ b/app/src/main/java/com/runcode/app/ui/screens/DatabaseScreen.kt @@ -46,6 +46,7 @@ import androidx.compose.material3.SuggestionChip import androidx.compose.material3.SuggestionChipDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -87,7 +88,13 @@ fun DatabaseScreen( val tables by viewModel.dbTables.collectAsState() val queryResult by viewModel.queryResult.collectAsState() - var sqlInput by remember { mutableStateOf("SELECT * FROM tasks LIMIT 25") } + // Follows the query the view model runs when a database loads. It used to be hardcoded to + // "SELECT * FROM tasks LIMIT 25", so the box showed a query that was never executed — and + // in any project without a `tasks` table, pressing Execute SQL failed. + var sqlInput by remember { mutableStateOf("") } + LaunchedEffect(selectedDb, tables) { + tables.firstOrNull()?.let { first -> sqlInput = "SELECT * FROM `${first.name}` LIMIT 25" } + } var dbDropdownExpanded by remember { mutableStateOf(false) } Column( diff --git a/app/src/main/java/com/runcode/app/ui/screens/HealthScreen.kt b/app/src/main/java/com/runcode/app/ui/screens/HealthScreen.kt index 80c6d03..570e9fe 100644 --- a/app/src/main/java/com/runcode/app/ui/screens/HealthScreen.kt +++ b/app/src/main/java/com/runcode/app/ui/screens/HealthScreen.kt @@ -57,6 +57,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.runcode.app.mcp.McpTools @@ -474,10 +475,18 @@ fun HealthRow(label: String, value: String) { modifier = Modifier .fillMaxWidth() .padding(vertical = 4.dp), - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.spacedBy(12.dp) ) { - Text(label, fontSize = 12.sp, color = TextSecondary) - Text(value, fontFamily = FontFamily.Monospace, fontSize = 12.sp, fontWeight = FontWeight.Medium, color = TextPrimary) + Text(label, fontSize = 12.sp, color = TextSecondary, modifier = Modifier.weight(1f)) + Text( + value, + fontFamily = FontFamily.Monospace, + fontSize = 12.sp, + fontWeight = FontWeight.Medium, + color = TextPrimary, + textAlign = TextAlign.End, + modifier = Modifier.weight(1f) + ) } Divider(color = DarkBorder.copy(alpha = 0.5f), modifier = Modifier.padding(vertical = 2.dp)) } diff --git a/app/src/main/java/com/runcode/app/ui/screens/HomeScreen.kt b/app/src/main/java/com/runcode/app/ui/screens/HomeScreen.kt index b75a5ec..9fdded8 100644 --- a/app/src/main/java/com/runcode/app/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/runcode/app/ui/screens/HomeScreen.kt @@ -466,6 +466,13 @@ fun ProfileBadge(profile: ProjectProfile) { .background(bgColor) .padding(horizontal = 6.dp, vertical = 2.dp) ) { - Text(profile.displayName, fontSize = 9.sp, fontWeight = FontWeight.Bold, color = textColor) + Text( + profile.displayName, + fontSize = 9.sp, + fontWeight = FontWeight.Bold, + color = textColor, + maxLines = 1, + softWrap = false + ) } } diff --git a/app/src/main/java/com/runcode/app/ui/screens/ProjectsScreen.kt b/app/src/main/java/com/runcode/app/ui/screens/ProjectsScreen.kt index 046c2bd..4fabd6e 100644 --- a/app/src/main/java/com/runcode/app/ui/screens/ProjectsScreen.kt +++ b/app/src/main/java/com/runcode/app/ui/screens/ProjectsScreen.kt @@ -55,6 +55,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.runcode.app.domain.models.Project @@ -197,7 +198,15 @@ fun ProjectsScreen( ) { Column(modifier = Modifier.weight(1f)) { Row(verticalAlignment = Alignment.CenterVertically) { - Text(project.name, fontWeight = FontWeight.Bold, fontSize = 16.sp, color = TextPrimary) + Text( + project.name, + fontWeight = FontWeight.Bold, + fontSize = 16.sp, + color = TextPrimary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f, fill = false) + ) Spacer(modifier = Modifier.width(8.dp)) ProfileBadge(project.profile) } diff --git a/app/src/main/java/com/runcode/app/ui/screens/ServicesScreen.kt b/app/src/main/java/com/runcode/app/ui/screens/ServicesScreen.kt index c869f6e..c657210 100644 --- a/app/src/main/java/com/runcode/app/ui/screens/ServicesScreen.kt +++ b/app/src/main/java/com/runcode/app/ui/screens/ServicesScreen.kt @@ -4,6 +4,8 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import androidx.compose.foundation.background +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -114,7 +116,7 @@ fun ServicesScreen( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - Column { + Column(modifier = Modifier.weight(1f).padding(end = 12.dp)) { Text("Service Supervisor", style = MaterialTheme.typography.titleLarge, color = TextPrimary) Text("Local process runtime, health & log stream", fontSize = 12.sp, color = TextSecondary) } @@ -128,7 +130,7 @@ fun ServicesScreen( }, shape = RoundedCornerShape(8.dp) ) { - Text("Stop All", color = AccentRed) + Text("Stop All", color = AccentRed, maxLines = 1, softWrap = false) } } } @@ -226,6 +228,7 @@ fun ServicesScreen( modifier = Modifier .fillMaxWidth() .background(DarkSurfaceElevated) + .horizontalScroll(rememberScrollState()) .padding(horizontal = 8.dp, vertical = 4.dp), horizontalArrangement = Arrangement.spacedBy(6.dp), verticalAlignment = Alignment.CenterVertically