Skip to content

Commit e98f92d

Browse files
authored
Merge pull request #1334 from Esri/df/apollo/1477-followup
`FeatureFormView` - Further revise UNA candidate querying and paging
2 parents 3441533 + fdabe5b commit e98f92d

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

Sources/ArcGISToolkit/Components/FeatureFormView/Subviews/FormElements/UtilityAssociationsFormElement/UtilityAssociationFeatureCandidatesView.swift

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ extension FeatureFormView {
2525
@State private var candidates: [UtilityAssociationFeatureCandidate] = []
2626
/// The phrase used to filter candidates by name.
2727
@State private var filterPhrase = ""
28-
/// A Boolean value indicating if the initial candidate query is complete.
29-
@State private var initialQueryIsComplete = false
3028
/// The parameters for retrieving the next page of results.
3129
@State private var nextQueryParameters: QueryParameters?
30+
/// A Boolean value indicating whether a filter based query is running.
31+
@State private var queryForFilterPhraseIsRunning = false
32+
/// A Boolean value indicating if the initial candidate query is complete.
33+
@State private var queryForFirstPageIsComplete = false
3234
/// A Boolean value indicating whether a query is running.
3335
@State private var queryIsRunning = false
3436
/// The task for the current query.
@@ -48,23 +50,28 @@ extension FeatureFormView {
4850
var body: some View {
4951
List {
5052
sectionForFilter
51-
if !initialQueryIsComplete {
53+
if !queryForFirstPageIsComplete {
5254
ProgressView()
55+
.task {
56+
let parameters = QueryParameters()
57+
parameters.whereClause = "1=1"
58+
queryFeatures(parameters: parameters)
59+
await queryTask?.value
60+
queryForFirstPageIsComplete = true
61+
}
5362
} else {
54-
if filteredCandidates.isEmpty && !queryIsRunning {
55-
contentUnavailableView
63+
if filteredCandidates.isEmpty {
64+
if queryForFilterPhraseIsRunning {
65+
ProgressView()
66+
.id(filterPhrase)
67+
} else if !queryIsRunning {
68+
contentUnavailableView
69+
}
5670
} else {
5771
sectionForCandidates
5872
}
5973
}
6074
}
61-
.task {
62-
let parameters = QueryParameters()
63-
parameters.whereClause = "1=1"
64-
queryFeatures(parameters: parameters)
65-
await queryTask?.value
66-
initialQueryIsComplete = true
67-
}
6875
}
6976

7077
/// A view to indicate no utility association candidate results were found.
@@ -127,10 +134,6 @@ extension FeatureFormView {
127134
.task {
128135
queryFeatures(parameters: nextQueryParameters)
129136
}
130-
} else if queryIsRunning {
131-
// Paging via filter phrase
132-
ProgressView()
133-
.id(nextQueryParameters.resultOffset)
134137
}
135138
}
136139
} header: {
@@ -169,23 +172,27 @@ extension FeatureFormView {
169172
"""
170173
)
171174
)
175+
.disabled(!queryForFirstPageIsComplete)
172176
.task(id: filterPhrase) {
173-
while filteredCandidates.isEmpty, let nextQueryParameters {
177+
try? await Task.sleep(for: .milliseconds(500))
178+
queryForFilterPhraseIsRunning = true
179+
while !Task.isCancelled, filteredCandidates.isEmpty, let nextQueryParameters {
174180
queryFeatures(parameters: nextQueryParameters)
175181
await queryTask?.value
176182
}
183+
queryForFilterPhraseIsRunning = false
177184
}
178185
}
179186
}
180187

181188
func queryFeatures(parameters: QueryParameters) {
182189
queryTask?.cancel()
190+
queryIsRunning = true
183191
queryTask = Task {
184-
queryIsRunning = true
185192
let result = try? await source.queryFeatures(assetType: assetType, parameters: parameters)
186-
queryIsRunning = false
187193
candidates.append(contentsOf: result?.candidates ?? [])
188194
nextQueryParameters = result?.nextQueryParams
195+
queryIsRunning = false
189196
}
190197
}
191198
}

0 commit comments

Comments
 (0)