Skip to content

Commit

Permalink
Create working
Browse files Browse the repository at this point in the history
  • Loading branch information
goodtocode committed Jul 4, 2023
1 parent 6500043 commit 05b7c1b
Show file tree
Hide file tree
Showing 6 changed files with 194 additions and 14 deletions.
1 change: 1 addition & 0 deletions src/Subjects/Presentation.Shared.Rcl/Paging/Pager.razor
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@using Goodtocode.Common.Extensions;

@if (Result != null)
{
<div class="row">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@page "/businesscreate"
@page "/business/create"
@using Goodtocode.Subjects.BlazorServer.Data;
@using Goodtocode.Subjects.BlazorServer.Models;
@using Goodtocode.Subjects.Domain;
Expand Down Expand Up @@ -31,7 +31,7 @@
@code {
private BusinessModel business = new BusinessModel();
private string alertMessage = string.Empty;
private CancellationTokenSource cts = new CancellationTokenSource();
private CancellationTokenSource? cts;
private async Task CreateBusineses()
{
if (!Validator.TryValidateObject(business,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
@page "/businesssearch"
@page "/business"
@page "/business/{page:int}"
@using Goodtocode.Common.Extensions;
@using Goodtocode.Subjects.BlazorServer.Data;
@using Goodtocode.Subjects.BlazorServer.Models;
@using Goodtocode.Subjects.Domain;
@using System.ComponentModel.DataAnnotations;
@using Goodtocode.Subjects.Rcl;
@using Goodtocode.Subjects.Rcl.Paging
@using Microsoft.AspNetCore.Http.Extensions;

@inject BusinessService Service
Expand Down Expand Up @@ -47,8 +49,8 @@
<td>@business.BusinessName</td>
<td>@business.TaxNumber</td>
<td class="nowrap" style="width:5%;">
<NavLink href="@($"/person/viewperson/{business.BusinessKey}")" class="btn btn-link oi oi-eye p-0 nounderline"></NavLink>
<NavLink href="@($"/person/updateperson/{business.BusinessKey}")" class="btn btn-link oi oi-pencil p-0 nounderline"></NavLink>
<NavLink href="@($"/business/details/{business.BusinessKey}")" class="btn btn-link oi oi-eye p-0 nounderline"></NavLink>
<NavLink href="@($"/business/update/{business.BusinessKey}")" class="btn btn-link oi oi-pencil p-0 nounderline"></NavLink>
<button @onclick="@(() => DeleteBusinessAsync(business))" disabled="@business.IsDeleting" class="btn btn-link oi oi-trash p-0 nounderline">
@if (business.IsDeleting) { <span class="spinner-border spinner-border-sm"></span> }
else { <span></span> }
Expand All @@ -58,11 +60,12 @@
}
</tbody>
</table>
<Pager Result=@businesses PageChanged=PagerPageChanged />
}

@code {
[Parameter]
public int Page { get; set; } = 1;
public int page { get; set; } = 1;
[Parameter]
public string SearchTerm { get; set; } = string.Empty;
private string alertMessage = string.Empty;
Expand All @@ -83,6 +86,12 @@
PageHistory.AddPageToHistory(UriHelper.Uri);
}

protected void PagerPageChanged(int page)
{
UriHelper.NavigateTo("/businesslist/" + page);
PageHistory.AddPageToHistory(UriHelper.Uri);
}

protected async Task SearchBoxKeyPress(KeyboardEventArgs ev)
{
if (ev.Key == "Enter")
Expand All @@ -106,7 +115,7 @@
{
processing = true;
await Task.Delay(500, cts.Token);
businesses = await Service.GetBusinessesAsync(businessSearch.Name, Page);
businesses = await Service.GetBusinessesAsync(page);
if (businesses.Results.Count() == 0)
alertMessage = "No businesses found";
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
@page "/business/search"
@using Goodtocode.Common.Extensions;
@using Goodtocode.Subjects.BlazorServer.Data;
@using Goodtocode.Subjects.BlazorServer.Models;
@using Goodtocode.Subjects.Domain;
@using System.ComponentModel.DataAnnotations;
@using Goodtocode.Subjects.Rcl;
@using Microsoft.AspNetCore.Http.Extensions;

@inject BusinessService Service
@inject PageHistoryState PageHistory
@inject NavigationManager UriHelper

<PageTitle>Business Search</PageTitle>

<EditForm Model="@SearchTerm" OnValidSubmit="@GetBusinessesAsync">
<DataAnnotationsValidator />
<div class="input-group mb-3">
<input type="text" class="form-control form-control-lg" placeholder="Search" aria-label="Search" aria-describedby="button-addon2"
@bind="@SearchTerm">
<button class="btn btn-primary btn-lg" type="submit" id="button-addon2"><i class="bi bi-search"></i></button>
</div>
<ValidationSummary />
<div hidden="@string.IsNullOrEmpty(alertMessage)" class="alert alert-danger" role="alert">@alertMessage</div>
<div hidden="@(!processing)" class="spinner-border text-primary center-screen" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</EditForm>


@if (businesses.Results.Count() > 0)
{
<table class="table table-striped">
<thead>
<tr>
<th>Key</th>
<th>Name</th>
<th>Tax Number</th>
<th style="width:5%;"></th>
</tr>
</thead>
<tbody>
@foreach (var business in businesses.Results)
{
<tr>
<td>@business.BusinessKey</td>
<td>@business.BusinessName</td>
<td>@business.TaxNumber</td>
<td class="nowrap" style="width:5%;">
<NavLink href="@($"/person/viewperson/{business.BusinessKey}")" class="btn btn-link oi oi-eye p-0 nounderline"></NavLink>
<NavLink href="@($"/person/updateperson/{business.BusinessKey}")" class="btn btn-link oi oi-pencil p-0 nounderline"></NavLink>
<button @onclick="@(() => DeleteBusinessAsync(business))" disabled="@business.IsDeleting" class="btn btn-link oi oi-trash p-0 nounderline">
@if (business.IsDeleting) { <span class="spinner-border spinner-border-sm"></span> }
else { <span></span> }
</button>
</td>
</tr>
}
</tbody>
</table>
}

@code {
[Parameter]
public int Page { get; set; } = 1;
[Parameter]
public string SearchTerm { get; set; } = string.Empty;
private string alertMessage = string.Empty;
private SearchModel businessSearch = new SearchModel();
private PagedResult<BusinessModel> businesses = new PagedResult<BusinessModel>();
private CancellationTokenSource cts = new CancellationTokenSource();
private bool processing;

protected override void OnInitialized()
{
PageHistory.AddPageToHistory(UriHelper.Uri);
base.OnInitialized();
}

protected override async Task OnParametersSetAsync()
{
await GetBusinessesAsync();
PageHistory.AddPageToHistory(UriHelper.Uri);
}

protected async Task SearchBoxKeyPress(KeyboardEventArgs ev)
{
if (ev.Key == "Enter")
{
await GetBusinessesAsync();
}
}

private async Task GetBusinessesAsync()
{
alertMessage = string.Empty;

businessSearch.Name = SearchTerm;

if (!Validator.TryValidateObject(businessSearch,
new ValidationContext(businessSearch, serviceProvider: null, items: null), new List<ValidationResult>(), true)) return;

if (cts != null) cts.Cancel();
cts = new CancellationTokenSource();
try
{
processing = true;
await Task.Delay(500, cts.Token);
businesses = await Service.GetBusinessesAsync(businessSearch.Name, Page);
if (businesses.Results.Count() == 0)
alertMessage = "No businesses found";
}
catch (TaskCanceledException)
{
// Ignore exception if task was cancelled
}
finally
{
processing = false;
StateHasChanged();
}
}

private async Task DeleteBusinessAsync(BusinessModel business)
{
alertMessage = string.Empty;

if (cts != null) cts.Cancel();
cts = new CancellationTokenSource();
try
{
processing = true;
var businessToDelete = business;
await Task.Delay(500, cts.Token);
await Service.DeleteBusinessAsync(business.BusinessKey);
await GetBusinessesAsync();
}
catch (TaskCanceledException)
{
// Ignore exception if task was cancelled
}
finally
{
processing = false;
StateHasChanged();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public BusinessService(IHttpClientFactory clientFactory)
public async Task<BusinessModel> GetBusinessAsync(Guid businessKey)
{
var httpClient = _clientFactory.CreateClient("SubjectsApiClient");
var response = await httpClient.GetAsync($"{httpClient.BaseAddress}/Business?key={businessKey}&api-version={apiVersion}");
var response = await httpClient.GetAsync($"{httpClient.BaseAddress}Business?key={businessKey}&api-version={apiVersion}");
var business = new BusinessModel();
if (response.StatusCode != HttpStatusCode.NotFound)
{
Expand All @@ -32,11 +32,25 @@ public async Task<BusinessModel> GetBusinessAsync(Guid businessKey)
return business;
}

public async Task<PagedResult<BusinessModel>> GetBusinessesAsync(int page)
{
var business = new PagedResult<BusinessModel>();
var httpClient = _clientFactory.CreateClient("SubjectsApiClient");
var response = await httpClient.GetAsync($"{httpClient.BaseAddress}Businesses?pageNumber={page}&pageSize=20&api-version={apiVersion}");
if (response.StatusCode != HttpStatusCode.NotFound)
{
response.EnsureSuccessStatusCode();
business = JsonSerializer.Deserialize<PagedResult<BusinessModel>>(response.Content.ReadAsStream()) ?? throw new Exception("Deserialization failed.");
}

return business;
}

public async Task<PagedResult<BusinessModel>> GetBusinessesAsync(string name, int page)
{
var business = new PagedResult<BusinessModel>();
var httpClient = _clientFactory.CreateClient("SubjectsApiClient");
var response = await httpClient.GetAsync($"{httpClient.BaseAddress}Businesses?name={name}&pageNumber=1&pageSize=20&api-version={apiVersion}");
var response = await httpClient.GetAsync($"{httpClient.BaseAddress}Businesses?name={name}&pageNumber={page}&pageSize=20&api-version={apiVersion}");
if (response.StatusCode != HttpStatusCode.NotFound)
{
response.EnsureSuccessStatusCode();
Expand All @@ -49,21 +63,23 @@ public async Task<PagedResult<BusinessModel>> GetBusinessesAsync(string name, in
public async Task CreateBusinessAsync(BusinessModel business)
{
var httpClient = _clientFactory.CreateClient("SubjectsApiClient");
var response = await httpClient.PutAsJsonAsync<BusinessObject>($"{httpClient.BaseAddress}/Business?api-version=1", business.CopyPropertiesSafe<BusinessObject>());
var businessDto = business.CopyPropertiesSafe<BusinessObject>();
var response = await httpClient.PutAsJsonAsync<BusinessObject>($"{httpClient.BaseAddress}Business?api-version=1", businessDto);
response.EnsureSuccessStatusCode();
}

public async Task UpdateBusinessAsync(BusinessModel business)
{
var httpClient = _clientFactory.CreateClient("SubjectsApiClient");
var response = await httpClient.PostAsJsonAsync<BusinessObject>($"{httpClient.BaseAddress}/Business?key={business.BusinessKey}api-version={apiVersion}", business.CopyPropertiesSafe<BusinessObject>());
var businessDto = business.CopyPropertiesSafe<BusinessObject>();
var response = await httpClient.PostAsJsonAsync<BusinessObject>($"{httpClient.BaseAddress}Business?key={business.BusinessKey}api-version={apiVersion}", businessDto);
response.EnsureSuccessStatusCode();
}

public async Task DeleteBusinessAsync(Guid businessKey)
{
var httpClient = _clientFactory.CreateClient("SubjectsApiClient");
var response = await httpClient.DeleteAsync($"{httpClient.BaseAddress}/Business?key={businessKey}api-version={apiVersion}");
var response = await httpClient.DeleteAsync($"{httpClient.BaseAddress}Business?key={businessKey}api-version={apiVersion}");
response.EnsureSuccessStatusCode();
}
}
10 changes: 8 additions & 2 deletions src/Subjects/Presentation.Web.BlazorServer/Shared/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,18 @@
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="businesssearch">
<NavLink class="nav-link" href="business/search">
<span class="oi oi-list-rich" aria-hidden="true"></span> Search
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="businesscreate">
<NavLink class="nav-link" href="business/1">
<span class="oi oi-list-rich" aria-hidden="true"></span> List
</NavLink>
</div>

<div class="nav-item px-3">
<NavLink class="nav-link" href="business/create">
<span class="oi oi-list-rich" aria-hidden="true"></span> Add Business
</NavLink>
</div>
Expand Down

0 comments on commit 05b7c1b

Please sign in to comment.