Implemented user-customizable, persistent grid and band layouts for CatalogsGrid and MassDataGrid. Added backend API, database entity, and repository for storing layouts per user. Refactored grids to support dynamic band/column rendering, layout management UI, and per-user storage via localStorage and the new API. Registered all necessary services and updated data context. Enables flexible, user-specific grid experiences with saved layouts.
65 lines
2.1 KiB
C#
65 lines
2.1 KiB
C#
using System.Net.Http.Json;
|
|
using DbFirst.BlazorWasm.Models;
|
|
|
|
namespace DbFirst.BlazorWasm.Services;
|
|
|
|
public class LayoutApiClient
|
|
{
|
|
private readonly HttpClient _httpClient;
|
|
private const string Endpoint = "api/layouts";
|
|
|
|
public LayoutApiClient(HttpClient httpClient)
|
|
{
|
|
_httpClient = httpClient;
|
|
}
|
|
|
|
public async Task<LayoutDto?> GetAsync(string layoutType, string layoutKey, string userName)
|
|
{
|
|
var url = $"{Endpoint}?layoutType={Uri.EscapeDataString(layoutType)}&layoutKey={Uri.EscapeDataString(layoutKey)}&userName={Uri.EscapeDataString(userName)}";
|
|
var response = await _httpClient.GetAsync(url);
|
|
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
return await response.Content.ReadFromJsonAsync<LayoutDto>();
|
|
}
|
|
|
|
public async Task<LayoutDto> UpsertAsync(LayoutDto dto)
|
|
{
|
|
var response = await _httpClient.PostAsJsonAsync(Endpoint, dto);
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var detail = await ReadErrorAsync(response);
|
|
throw new InvalidOperationException(detail);
|
|
}
|
|
|
|
var payload = await response.Content.ReadFromJsonAsync<LayoutDto>();
|
|
return payload ?? dto;
|
|
}
|
|
|
|
private static async Task<string> ReadErrorAsync(HttpResponseMessage response)
|
|
{
|
|
var body = await response.Content.ReadAsStringAsync();
|
|
if (!string.IsNullOrWhiteSpace(body))
|
|
{
|
|
return body;
|
|
}
|
|
|
|
return $"{(int)response.StatusCode} {response.ReasonPhrase}".Trim();
|
|
}
|
|
|
|
public async Task DeleteAsync(string layoutType, string layoutKey, string userName)
|
|
{
|
|
var url = $"{Endpoint}?layoutType={Uri.EscapeDataString(layoutType)}&layoutKey={Uri.EscapeDataString(layoutKey)}&userName={Uri.EscapeDataString(userName)}";
|
|
var response = await _httpClient.DeleteAsync(url);
|
|
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
|
|
{
|
|
return;
|
|
}
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
}
|