git.iko.soy/parseable-macos
on master help sign in
Add loading state to LogTableView for query execution (#19)
6b6d07diko
ParseableViewer/Views/LogTableView.swift+17−1
@@ -53,6 +53,7 @@ struct LogTableView: View {
53 let records: [LogRecord]
53 let records: [LogRecord]
54 let columns: [String]
54 let columns: [String]
55 @Binding var selectedRecord: LogRecord?
55 @Binding var selectedRecord: LogRecord?
56+ var isLoading: Bool = false
56 var onCellFilter: ((_ column: String, _ value: JSONValue?, _ exclude: Bool) -> Void)?
57 var onCellFilter: ((_ column: String, _ value: JSONValue?, _ exclude: Bool) -> Void)?
57 var onMoveColumn: ((String, String) -> Void)?
58 var onMoveColumn: ((String, String) -> Void)?
58 @State private var sortColumn: String?
59 @State private var sortColumn: String?
@@ -63,7 +64,15 @@ struct LogTableView: View {
63 @State private var columnWidths: [String: CGFloat] = [:]
64 @State private var columnWidths: [String: CGFloat] = [:]
64
65
65 var body: some View {
66 var body: some View {
66− if records.isEmpty {
67+ if records.isEmpty && isLoading {
68+ VStack(spacing: 8) {
69+ ProgressView()
70+ .controlSize(.large)
71+ Text("Loading results...")
72+ .foregroundStyle(.secondary)
73+ }
74+ .frame(maxWidth: .infinity, maxHeight: .infinity)
75+ } else if records.isEmpty {
67 VStack(spacing: 8) {
76 VStack(spacing: 8) {
68 Image(systemName: "doc.text.magnifyingglass")
77 Image(systemName: "doc.text.magnifyingglass")
69 .font(.system(size: 32))
78 .font(.system(size: 32))
@@ -116,6 +125,13 @@ struct LogTableView: View {
116 .frame(minWidth: 300, idealWidth: 350)
125 .frame(minWidth: 300, idealWidth: 350)
117 }
126 }
118 }
127 }
128+ .opacity(isLoading ? 0.5 : 1.0)
129+ .overlay {
130+ if isLoading {
131+ ProgressView()
132+ .controlSize(.large)
133+ }
134+ }
119 .onChange(of: records) { _, _ in
135 .onChange(of: records) { _, _ in
120 columnWidths = computeColumnWidths(columns: columns, records: records)
136 columnWidths = computeColumnWidths(columns: columns, records: records)
121 debouncedRebuildSort()
137 debouncedRebuildSort()
ParseableViewer/Views/QueryView.swift+1
@@ -214,6 +214,7 @@ struct QueryView: View {
214 records: viewModel.filteredResults,
214 records: viewModel.filteredResults,
215 columns: viewModel.visibleColumns,
215 columns: viewModel.visibleColumns,
216 selectedRecord: $vm.selectedLogEntry,
216 selectedRecord: $vm.selectedLogEntry,
217+ isLoading: viewModel.isLoading,
217 onCellFilter: { column, value, exclude in
218 onCellFilter: { column, value, exclude in
218 viewModel.addColumnFilter(column: column, value: value, exclude: exclude)
219 viewModel.addColumnFilter(column: column, value: value, exclude: exclude)
219 Task {
220 Task {