Improved progress display
Previously, the progress bar updated only after completing an entire table. For large tables such as LIBARC, this could make the application appear to have stopped responding. Phase 10 updates the interface while rows are being exported.
This commit is contained in:
@@ -2561,22 +2561,15 @@ struct WorkbenchAdministrationView: View {
|
||||
)
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
case .dashboard:
|
||||
// Keep the live charts visible even while scrolling the overview.
|
||||
// The old outer ScrollView moved all charts offscreen when scrolled.
|
||||
VStack(alignment: .leading, spacing: 10) {
|
||||
// The Dashboard is a graph dashboard, not a selectable set of KPI cards.
|
||||
// Keep six real Swift Charts visible; do not replace them with overview tiles.
|
||||
ScrollView(.vertical) {
|
||||
WorkbenchInlinePerformanceDashboard(samples: diagnosticSamples)
|
||||
.frame(maxWidth: .infinity, alignment: .topLeading)
|
||||
.layoutPriority(2)
|
||||
Divider()
|
||||
Text("Server overview").font(.title2.bold())
|
||||
ScrollView(.vertical) {
|
||||
WorkbenchServerOverview(rows: filteredRows)
|
||||
.frame(maxWidth: .infinity, alignment: .topLeading)
|
||||
}
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
.padding(18)
|
||||
}
|
||||
.padding(16)
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
.accessibilityIdentifier("dashboard-live-line-charts")
|
||||
default:
|
||||
// Status and System Variables is deliberately a distinct variable
|
||||
// inspector, never replaced by the monitoring screen.
|
||||
@@ -4128,7 +4121,7 @@ private struct WorkbenchInlinePerformanceDashboard: View {
|
||||
}
|
||||
if let last = readings.last {
|
||||
Text(last.value.formatted(.number.precision(.fractionLength(1))) + (rate ? " /sec" : ""))
|
||||
.font(.system(size: 24, weight: .semibold, design: .rounded))
|
||||
.font(.system(size: 15, weight: .semibold, design: .rounded))
|
||||
.foregroundStyle(tint)
|
||||
} else {
|
||||
Text("Collecting samples…")
|
||||
@@ -4140,11 +4133,14 @@ private struct WorkbenchInlinePerformanceDashboard: View {
|
||||
LineMark(x: .value("Time", reading.time), y: .value("Value", reading.value))
|
||||
.foregroundStyle(tint)
|
||||
.lineStyle(StrokeStyle(lineWidth: 2.5))
|
||||
PointMark(x: .value("Time", reading.time), y: .value("Value", reading.value))
|
||||
.foregroundStyle(tint)
|
||||
}
|
||||
.chartYAxis { AxisMarks(position: .leading) }
|
||||
.frame(height: 92)
|
||||
.frame(height: 175)
|
||||
.accessibilityLabel("Live time-series graph for \(title)")
|
||||
}
|
||||
.padding(10)
|
||||
.padding(14)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.background(Color(nsColor: .controlBackgroundColor))
|
||||
.clipShape(RoundedRectangle(cornerRadius: 12))
|
||||
@@ -4159,9 +4155,7 @@ private struct WorkbenchInlinePerformanceDashboard: View {
|
||||
Text("\(samples.count) samples · refreshes every 5 seconds")
|
||||
.font(.caption).foregroundStyle(.secondary)
|
||||
}
|
||||
LazyVGrid(columns: [GridItem(.flexible(minimum: 0), spacing: 12),
|
||||
GridItem(.flexible(minimum: 0), spacing: 12),
|
||||
GridItem(.flexible(minimum: 0), spacing: 12)], spacing: 10) {
|
||||
LazyVGrid(columns: [GridItem(.adaptive(minimum: 360), spacing: 16)], spacing: 16) {
|
||||
panel("Queries per second", metric: "Queries", rate: true, tint: .blue)
|
||||
panel("Active connections", metric: "Threads_connected", rate: false, tint: .teal)
|
||||
panel("Running threads", metric: "Threads_running", rate: false, tint: .orange)
|
||||
|
||||
Reference in New Issue
Block a user