|
102 | 102 | OnPathChanged="OnMobilePathChanged" |
103 | 103 | OnFilterChanged="OnMobileFilterChanged" |
104 | 104 | InitialSearch="@_initialSearch" |
105 | | - InitialFilters="@_initialFilters" /> |
| 105 | + InitialFilters="@_initialFilters" |
| 106 | + InitialSortBy="@_initialSortBy" |
| 107 | + InitialSortAscending="@_initialSortAscending" |
| 108 | + InitialPage="@_initialPage" /> |
106 | 109 | </div> |
107 | 110 | } |
108 | 111 |
|
|
172 | 175 | private bool _firstRenderComplete = false; |
173 | 176 | private bool _needsRefresh = false; |
174 | 177 |
|
175 | | - // URL state for filters and search |
| 178 | + // URL state for filters, search, sorting, and pagination |
176 | 179 | private string _initialSearch = string.Empty; |
177 | 180 | private HashSet<string> _initialFilters = new(); |
| 181 | + private string _initialSortBy = "Name"; |
| 182 | + private bool _initialSortAscending = true; |
| 183 | + private int _initialPage = 1; |
178 | 184 | private string _currentSearch = string.Empty; |
179 | 185 | private HashSet<string> _currentFilters = new(); |
| 186 | + private string _currentSortBy = "Name"; |
| 187 | + private bool _currentSortAscending = true; |
| 188 | + private int _currentPage = 1; |
180 | 189 |
|
181 | 190 | protected override async Task OnParametersSetAsync() |
182 | 191 | { |
183 | 192 | string currentBsiId = bsi?.Id; |
184 | 193 | bool idChanged = _previousId != id; |
185 | 194 | bool bsiChanged = isShared && _previousBsiId != currentBsiId && currentBsiId != null; |
186 | 195 |
|
| 196 | + // Parse URL params early so they're available before first render |
| 197 | + if (!_firstRenderComplete) |
| 198 | + { |
| 199 | + ParseUrlParameters(); |
| 200 | + } |
| 201 | + |
187 | 202 | if (idChanged || bsiChanged) |
188 | 203 | { |
189 | 204 | _previousId = id; |
|
198 | 213 | } |
199 | 214 | } |
200 | 215 |
|
| 216 | + private void ParseUrlParameters() |
| 217 | + { |
| 218 | + try |
| 219 | + { |
| 220 | + var uri = new Uri(MyNavigationManager.Uri); |
| 221 | + var query = System.Web.HttpUtility.ParseQueryString(uri.Query); |
| 222 | + var searchFromUrl = query["search"]; |
| 223 | + var filtersFromUrl = query["filters"]; |
| 224 | + var sortByFromUrl = query["sortBy"]; |
| 225 | + var sortAscFromUrl = query["sortAsc"]; |
| 226 | + |
| 227 | + // Parse initial search |
| 228 | + if (!string.IsNullOrEmpty(searchFromUrl)) |
| 229 | + { |
| 230 | + _initialSearch = Uri.UnescapeDataString(searchFromUrl); |
| 231 | + _currentSearch = _initialSearch; |
| 232 | + } |
| 233 | + |
| 234 | + // Parse initial filters (comma-separated) |
| 235 | + if (!string.IsNullOrEmpty(filtersFromUrl)) |
| 236 | + { |
| 237 | + var filterList = Uri.UnescapeDataString(filtersFromUrl).Split(',', StringSplitOptions.RemoveEmptyEntries); |
| 238 | + _initialFilters = new HashSet<string>(filterList); |
| 239 | + _currentFilters = new HashSet<string>(filterList); |
| 240 | + } |
| 241 | + |
| 242 | + // Parse initial sort |
| 243 | + if (!string.IsNullOrEmpty(sortByFromUrl)) |
| 244 | + { |
| 245 | + _initialSortBy = Uri.UnescapeDataString(sortByFromUrl); |
| 246 | + _currentSortBy = _initialSortBy; |
| 247 | + } |
| 248 | + |
| 249 | + if (!string.IsNullOrEmpty(sortAscFromUrl)) |
| 250 | + { |
| 251 | + _initialSortAscending = sortAscFromUrl.ToLower() != "false"; |
| 252 | + _currentSortAscending = _initialSortAscending; |
| 253 | + } |
| 254 | + |
| 255 | + // Parse initial page |
| 256 | + var pageFromUrl = query["page"]; |
| 257 | + if (!string.IsNullOrEmpty(pageFromUrl) && int.TryParse(pageFromUrl, out int page) && page > 0) |
| 258 | + { |
| 259 | + _initialPage = page; |
| 260 | + _currentPage = page; |
| 261 | + } |
| 262 | + } |
| 263 | + catch (Exception ex) |
| 264 | + { |
| 265 | + Logger.LogError(ex, "Error parsing URL parameters"); |
| 266 | + } |
| 267 | + } |
| 268 | + |
201 | 269 | protected override async Task OnAfterRenderAsync(bool firstRender) |
202 | 270 | { |
203 | 271 | if (firstRender) |
|
261 | 329 | var uri = new Uri(MyNavigationManager.Uri); |
262 | 330 | var query = System.Web.HttpUtility.ParseQueryString(uri.Query); |
263 | 331 | var pathFromUrl = query["path"]; |
264 | | - var searchFromUrl = query["search"]; |
265 | | - var filtersFromUrl = query["filters"]; |
266 | | - |
267 | | - // Parse initial search |
268 | | - if (!string.IsNullOrEmpty(searchFromUrl)) |
269 | | - { |
270 | | - _initialSearch = Uri.UnescapeDataString(searchFromUrl); |
271 | | - _currentSearch = _initialSearch; |
272 | | - } |
273 | | - |
274 | | - // Parse initial filters (comma-separated) |
275 | | - if (!string.IsNullOrEmpty(filtersFromUrl)) |
276 | | - { |
277 | | - var filterList = Uri.UnescapeDataString(filtersFromUrl).Split(',', StringSplitOptions.RemoveEmptyEntries); |
278 | | - _initialFilters = new HashSet<string>(filterList); |
279 | | - _currentFilters = new HashSet<string>(filterList); |
280 | | - } |
281 | 332 |
|
282 | 333 | // Decode the path and ensure it ends with / |
283 | 334 | string decodedPath = "/"; |
|
310 | 361 | { |
311 | 362 | try |
312 | 363 | { |
313 | | - UpdateUrlWithState(path, _currentSearch, _currentFilters); |
| 364 | + // Reset page to 1 when navigating to a different folder |
| 365 | + _currentPage = 1; |
| 366 | + UpdateUrlWithState(path, _currentSearch, _currentFilters, _currentSortBy, _currentSortAscending, _currentPage); |
314 | 367 | } |
315 | 368 | catch (Exception ex) |
316 | 369 | { |
|
324 | 377 | { |
325 | 378 | _currentSearch = args.SearchText; |
326 | 379 | _currentFilters = args.TypeFilters; |
| 380 | + _currentSortBy = args.SortBy; |
| 381 | + _currentSortAscending = args.SortAscending; |
| 382 | + _currentPage = args.CurrentPage; |
327 | 383 |
|
328 | 384 | // Get current path from mobile file manager |
329 | 385 | var currentPath = mobileFileManager?.Path ?? "/"; |
330 | | - UpdateUrlWithState(currentPath, _currentSearch, _currentFilters); |
| 386 | + UpdateUrlWithState(currentPath, _currentSearch, _currentFilters, _currentSortBy, _currentSortAscending, _currentPage); |
331 | 387 | } |
332 | 388 | catch (Exception ex) |
333 | 389 | { |
334 | 390 | Logger.LogError(ex, "Error updating URL with filters"); |
335 | 391 | } |
336 | 392 | } |
337 | 393 |
|
338 | | - private void UpdateUrlWithState(string path, string search, HashSet<string> filters) |
| 394 | + private void UpdateUrlWithState(string path, string search, HashSet<string> filters, string sortBy = "Name", bool sortAscending = true, int page = 1) |
339 | 395 | { |
340 | 396 | var baseUri = MyNavigationManager.Uri.Split('?')[0]; |
341 | 397 | var queryParams = new List<string>(); |
|
358 | 414 | queryParams.Add($"filters={Uri.EscapeDataString(string.Join(",", filters))}"); |
359 | 415 | } |
360 | 416 |
|
| 417 | + // Add sort if not default |
| 418 | + if (sortBy != "Name") |
| 419 | + { |
| 420 | + queryParams.Add($"sortBy={Uri.EscapeDataString(sortBy)}"); |
| 421 | + } |
| 422 | + |
| 423 | + // Add sort direction if descending |
| 424 | + if (!sortAscending) |
| 425 | + { |
| 426 | + queryParams.Add("sortAsc=false"); |
| 427 | + } |
| 428 | + |
| 429 | + // Add page if not first page |
| 430 | + if (page > 1) |
| 431 | + { |
| 432 | + queryParams.Add($"page={page}"); |
| 433 | + } |
| 434 | + |
361 | 435 | var newUrl = queryParams.Count > 0 ? $"{baseUri}?{string.Join("&", queryParams)}" : baseUri; |
362 | 436 | MyNavigationManager.NavigateTo(newUrl, forceLoad: false, replace: true); |
363 | 437 | } |
|
0 commit comments