From e42c4ffe0d553e00cde3724f37c2cb2b85cf6c39 Mon Sep 17 00:00:00 2001 From: Frede Hundewadt <22748698+fhdk@users.noreply.github.com> Date: Sun, 26 Jun 2022 18:22:38 +0200 Subject: [PATCH] wip - admin tasks --- .../Components/UserTableComponent.razor | 26 +++-- .../Components/UserTableComponent.razor.cs | 2 +- .../HttpRepository/ITaskItemHttpRepository.cs | 4 +- .../HttpRepository/IUserHttpRepository.cs | 5 +- .../HttpRepository/TaskItemHttpRepository.cs | 4 +- .../HttpRepository/UserHttpRepository.cs | 34 +++++- Wonky.Client/Pages/AdminSalesReportList.razor | 30 +++++ .../Pages/AdminSalesReportList.razor.cs | 29 +++++ Wonky.Client/Pages/AdminUserList.razor | 5 +- Wonky.Client/Pages/AdminUserList.razor.cs | 11 +- Wonky.Client/Pages/AdminUserView.razor | 104 ++++++++++++++++++ Wonky.Client/Pages/AdminUserView.razor.cs | 65 +++++++++++ Wonky.Client/Shared/NavMenu.razor | 17 ++- Wonky.Client/wwwroot/appsettings.json | 15 ++- Wonky.Entity/Configuration/ApiConfig.cs | 3 +- ...serListView.cs => AdminAdviserListView.cs} | 5 +- Wonky.Entity/DTO/AdviserInfoView.cs | 34 ++++++ Wonky.Entity/DTO/AdviserUpdateDto.cs | 27 +++++ 18 files changed, 381 insertions(+), 39 deletions(-) create mode 100644 Wonky.Client/Pages/AdminSalesReportList.razor create mode 100644 Wonky.Client/Pages/AdminSalesReportList.razor.cs create mode 100644 Wonky.Client/Pages/AdminUserView.razor create mode 100644 Wonky.Client/Pages/AdminUserView.razor.cs rename Wonky.Entity/DTO/{AdminUserListView.cs => AdminAdviserListView.cs} (62%) create mode 100644 Wonky.Entity/DTO/AdviserInfoView.cs create mode 100644 Wonky.Entity/DTO/AdviserUpdateDto.cs diff --git a/Wonky.Client/Components/UserTableComponent.razor b/Wonky.Client/Components/UserTableComponent.razor index dc3833e0..1497f6f8 100644 --- a/Wonky.Client/Components/UserTableComponent.razor +++ b/Wonky.Client/Components/UserTableComponent.razor @@ -20,38 +20,48 @@
+
+ Land +
+
+ Nr. +
Navn
- Land + Telefonnr.
Email
-
- Telefonnr. -
@foreach (var user in UserList) {
+
+ @user.CountryCode +
+
+ @user.SalesRep +
@user.FullName
- @user.CountryCode + @user.PhoneNumber
@user.Email
-
- @user.PhoneNUmber -
}
+} +else +{ + } \ No newline at end of file diff --git a/Wonky.Client/Components/UserTableComponent.razor.cs b/Wonky.Client/Components/UserTableComponent.razor.cs index fe5e8dd4..315e425a 100644 --- a/Wonky.Client/Components/UserTableComponent.razor.cs +++ b/Wonky.Client/Components/UserTableComponent.razor.cs @@ -6,5 +6,5 @@ namespace Wonky.Client.Components; public partial class UserTableComponent { - [Parameter] public List UserList { get; set; } + [Parameter] public List UserList { get; set; } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/ITaskItemHttpRepository.cs b/Wonky.Client/HttpRepository/ITaskItemHttpRepository.cs index 2c966615..768c0688 100644 --- a/Wonky.Client/HttpRepository/ITaskItemHttpRepository.cs +++ b/Wonky.Client/HttpRepository/ITaskItemHttpRepository.cs @@ -4,7 +4,7 @@ namespace Wonky.Client.HttpRepository; public interface ITaskItemHttpRepository { - Task> GetTaskList(); + Task?> GetTaskList(); Task CreateTaskItem(TaskItemView taskItem); - Task GetTaskItem(string taskItemId); + Task GetTaskItem(string taskItemId); } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/IUserHttpRepository.cs b/Wonky.Client/HttpRepository/IUserHttpRepository.cs index 1fc3f994..58361bbf 100644 --- a/Wonky.Client/HttpRepository/IUserHttpRepository.cs +++ b/Wonky.Client/HttpRepository/IUserHttpRepository.cs @@ -4,5 +4,8 @@ namespace Wonky.Client.HttpRepository; public interface IUserHttpRepository { - Task?> GetSalesReps(); + Task> GetAdvisers(); + Task GetAdviserInfo(string userId); + Task UpdateAdviser(string userId, AdviserUpdateDto model); + Task ResetUserPassword(string userId, string newPasswd, string confirmPasswd); } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs b/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs index 586ab18f..341a252e 100644 --- a/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs +++ b/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs @@ -30,7 +30,7 @@ public class TaskItemHttpRepository : ITaskItemHttpRepository _apiConfig = configuration.Value; } - public async Task> GetTaskList() + public async Task?> GetTaskList() { return await _client.GetFromJsonAsync>($"{_apiConfig.TaskUri}"); } @@ -40,7 +40,7 @@ public class TaskItemHttpRepository : ITaskItemHttpRepository await _client.PostAsJsonAsync($"{_apiConfig.TaskUri}", taskItem); } - public async Task GetTaskItem(string taskItemId) + public async Task GetTaskItem(string taskItemId) { return await _client.GetFromJsonAsync($"{_apiConfig.TaskUri}/{taskItemId}"); } diff --git a/Wonky.Client/HttpRepository/UserHttpRepository.cs b/Wonky.Client/HttpRepository/UserHttpRepository.cs index e1566c29..94346593 100644 --- a/Wonky.Client/HttpRepository/UserHttpRepository.cs +++ b/Wonky.Client/HttpRepository/UserHttpRepository.cs @@ -1,8 +1,10 @@ +using System.Net.Http.Json; using System.Text.Json; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Options; using Wonky.Entity.Configuration; using Wonky.Entity.DTO; +using Wonky.Entity.Views; namespace Wonky.Client.HttpRepository; @@ -29,12 +31,32 @@ public class UserHttpRepository : IUserHttpRepository _api = configuration.Value; } - public async Task?> GetSalesReps() + public async Task> GetAdvisers() { - var response = await _client.GetAsync(_api.AdminSalesRepUri); - var content = await response.Content.ReadAsStringAsync(); - return !response.IsSuccessStatusCode - ? new List() - : JsonSerializer.Deserialize>(content, _options); + return await _client.GetFromJsonAsync>(_api.AdminAdviserUri); + } + + public async Task GetAdviserInfo(string userId) + { + return await _client.GetFromJsonAsync($"{_api.AdminAdviserUri}/{userId}"); + // var response = await _client.GetAsync($"{_api.AdminAdviserUri}/{userId}"); + // var content = await response.Content.ReadAsStringAsync(); + // _logger.LogInformation($"GetAdviserInfo => {content}", content); + // return new AdviserInfoView(); + // if (!response.IsSuccessStatusCode) + // return new AdviserInfoView(); + // var result = JsonSerializer.Deserialize(content); + // return JsonSerializer.Deserialize(result.Message); + } + + public async Task UpdateAdviser(string userId, AdviserUpdateDto model) + { + await _client.PutAsJsonAsync($"{_api.AdminAdviserUri}/{userId}", model, _options); + } + + public async Task ResetUserPassword(string userId, string newPasswd, string confirmPasswd) + { + var passwd = new Dictionary {{"newPassword", newPasswd}, {"confirmPassword", confirmPasswd}}; + await _client.PostAsJsonAsync($"{_api.AdminPasswdUri}/{userId}", passwd, _options); } } \ No newline at end of file diff --git a/Wonky.Client/Pages/AdminSalesReportList.razor b/Wonky.Client/Pages/AdminSalesReportList.razor new file mode 100644 index 00000000..6dbfdb9a --- /dev/null +++ b/Wonky.Client/Pages/AdminSalesReportList.razor @@ -0,0 +1,30 @@ +@* +// Copyright (C) 2022 FCS Frede's Computer Services. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] +// +*@ +@using Wonky.Client.Components +@page "/sales-reports" +
+
+
+
+

Rapport Arkiv

+
+
+
+
+ +
+
diff --git a/Wonky.Client/Pages/AdminSalesReportList.razor.cs b/Wonky.Client/Pages/AdminSalesReportList.razor.cs new file mode 100644 index 00000000..702536be --- /dev/null +++ b/Wonky.Client/Pages/AdminSalesReportList.razor.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Components; +using Toolbelt.Blazor; +using Wonky.Client.HttpInterceptors; +using Wonky.Client.HttpRepository; +using Wonky.Entity.Views; + +namespace Wonky.Client.Pages; + +public partial class AdminSalesReportList : IDisposable +{ + [Parameter] public string UserId { get; set; } = ""; + [Inject] private IReportHttpRepository _reportRepo { get; set; } + [Inject] private HttpInterceptorService _interceptor { get; set; } + + private List _reports { get; set; } + + protected override async Task OnInitializedAsync() + { + _interceptor.RegisterEvent(); + _interceptor.RegisterBeforeSendEvent(); + + _reports = await _reportRepo.GetReports(); + } + + public void Dispose() + { + _interceptor.DisposeEvent(); + } +} \ No newline at end of file diff --git a/Wonky.Client/Pages/AdminUserList.razor b/Wonky.Client/Pages/AdminUserList.razor index b20da46a..ceff9089 100644 --- a/Wonky.Client/Pages/AdminUserList.razor +++ b/Wonky.Client/Pages/AdminUserList.razor @@ -1,10 +1,11 @@ @using Wonky.Client.Components @page "/admin/users" +
-
+

Sælgere

- +
\ No newline at end of file diff --git a/Wonky.Client/Pages/AdminUserList.razor.cs b/Wonky.Client/Pages/AdminUserList.razor.cs index c1329ade..ac850851 100644 --- a/Wonky.Client/Pages/AdminUserList.razor.cs +++ b/Wonky.Client/Pages/AdminUserList.razor.cs @@ -5,17 +5,22 @@ using Wonky.Entity.DTO; namespace Wonky.Client.Pages; -public partial class AdminUserList +public partial class AdminUserList : IDisposable { [Inject] private HttpInterceptorService _interceptor { get; set; } [Inject] private IUserHttpRepository _userRepo { get; set; } - private List? _salesReps { get; set; } = new(); + private List? _salesReps { get; set; } = new(); protected override async Task OnInitializedAsync() { _interceptor.RegisterEvent(); _interceptor.RegisterBeforeSendEvent(); - _salesReps = await _userRepo.GetSalesReps(); + _salesReps = await _userRepo.GetAdvisers(); + } + + public void Dispose() + { + _interceptor.DisposeEvent(); } } \ No newline at end of file diff --git a/Wonky.Client/Pages/AdminUserView.razor b/Wonky.Client/Pages/AdminUserView.razor new file mode 100644 index 00000000..f9a4bd88 --- /dev/null +++ b/Wonky.Client/Pages/AdminUserView.razor @@ -0,0 +1,104 @@ +@page "/admin/users/{UserId}" +
+
+

Sælger info

+
+
+ @if (_adviserInfo != null) + { + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ Fornavn + + + + + Efternavn + + + +
+ Email + + + + + Mobilnummer + + + +
+ Sælgernr. + + @_adviserInfo.Adviser + + Landekode + + @_updateInfo.CountryCode +
+ Spærret + + + +
+
+
+
+
+ Tilbage +
+
+ +
+
+
+
+

NULSTIL ADGANGSKODE

+
+ +
+ +
+
+
+ +
+ +
+
+
+ } + else + { + + } +
+
\ No newline at end of file diff --git a/Wonky.Client/Pages/AdminUserView.razor.cs b/Wonky.Client/Pages/AdminUserView.razor.cs new file mode 100644 index 00000000..27440e16 --- /dev/null +++ b/Wonky.Client/Pages/AdminUserView.razor.cs @@ -0,0 +1,65 @@ +using System.Text.Json; +using Blazored.Toast.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using Wonky.Client.HttpInterceptors; +using Wonky.Client.HttpRepository; +using Wonky.Entity.DTO; + +namespace Wonky.Client.Pages; + +public partial class AdminUserView : IDisposable +{ + [Parameter] public string UserId { get; set; } = ""; + [Inject] private HttpInterceptorService _interceptor { get; set; } + [Inject] private IUserHttpRepository _userRepo { get; set; } + [Inject] private ILogger _logger { get; set; } + [Inject] private NavigationManager _navigator { get; set; } + [Inject] private IToastService _toast { get; set; } + private AdviserInfoView _adviserInfo { get; set; } = new(); + private EditContext _editContext { get; set; } + private AdviserUpdateDto _updateInfo { get; set; } = new(); + + private readonly JsonSerializerOptions? _options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + + protected override async Task OnParametersSetAsync() + { + _interceptor.RegisterEvent(); + _interceptor.RegisterBeforeSendEvent(); + + _adviserInfo = await _userRepo.GetAdviserInfo(UserId); + + _updateInfo.Email = _adviserInfo.Email; + _updateInfo.CountryCode = _adviserInfo.CountryCode; + _updateInfo.FirstName = _adviserInfo.FirstName; + _updateInfo.LastName = _adviserInfo.LastName; + _updateInfo.PhoneNumber = _adviserInfo.PhoneNumber; + _updateInfo.LockoutEnabled = _adviserInfo.LockoutEnabled; + + } + + protected override void OnInitialized() + { + _editContext = new EditContext(_updateInfo); + } + + private async Task UpdateAdviser() + { + _toast.ShowInfo("Sender data til server ..."); + await _userRepo.UpdateAdviser(UserId, _updateInfo); + _navigator.NavigateTo("/admin/users"); + + } + + private async Task SetPassword() + { + + } + public void Dispose() + { + _interceptor.DisposeEvent(); + } +} \ No newline at end of file diff --git a/Wonky.Client/Shared/NavMenu.razor b/Wonky.Client/Shared/NavMenu.razor index ef9fe407..35ffdd51 100644 --- a/Wonky.Client/Shared/NavMenu.razor +++ b/Wonky.Client/Shared/NavMenu.razor @@ -34,21 +34,28 @@ - - + + + + + diff --git a/Wonky.Client/wwwroot/appsettings.json b/Wonky.Client/wwwroot/appsettings.json index 4325823b..8fb6420f 100644 --- a/Wonky.Client/wwwroot/appsettings.json +++ b/Wonky.Client/wwwroot/appsettings.json @@ -1,8 +1,8 @@ { "Logging": { "LogLevel": { - "Default": "None", - "System": "Information", + "Default": "Debug", + "System": "Debug", "Microsoft": "Information" }, "Debug": { @@ -32,13 +32,16 @@ "tokenUri": "token", "userInfoUri": "api/auth/userinfo", "catalogUri": "api/v2/crm/catalog", - "activityUri": "api/v2/crm/salesReps/sales", - "reportUri": "api/v2/crm/salesReps/reports", - "taskUri": "api/v2/crm/salesRps/tasks", + "activityUri": "api/v2/crm/advisers/sales", + "reportUri": "api/v2/crm/advisers/reports", + "taskUri": "api/v2/crm/advisers/tasks", "companyUri": "api/v2/crm/companies", "inventoryUri": "history/inventory", "productUri": "history/products", "syncUri": "history/sync", - "adminSalesRepUri": "api/v2/admin/users/salesreps" + "adminAdviserUri": "api/v2/admin/users/advisers", + "adminPasswdUri": "api/v2/admin/users/passwd", + "adminReportUri": "reports", + "adminCompanyUri": "companies" } } \ No newline at end of file diff --git a/Wonky.Entity/Configuration/ApiConfig.cs b/Wonky.Entity/Configuration/ApiConfig.cs index 271415e6..252c2084 100644 --- a/Wonky.Entity/Configuration/ApiConfig.cs +++ b/Wonky.Entity/Configuration/ApiConfig.cs @@ -34,7 +34,8 @@ public class ApiConfig public string InventoryUri { get; set; } = ""; public string ProductUri { get; set; } = ""; public string SyncUri { get; set; } = ""; - public string AdminSalesRepUri { get; set; } = ""; + public string AdminAdviserUri { get; set; } = ""; + public string AdminPasswdUri { get; set; } = ""; diff --git a/Wonky.Entity/DTO/AdminUserListView.cs b/Wonky.Entity/DTO/AdminAdviserListView.cs similarity index 62% rename from Wonky.Entity/DTO/AdminUserListView.cs rename to Wonky.Entity/DTO/AdminAdviserListView.cs index ddbfbd23..30446c84 100644 --- a/Wonky.Entity/DTO/AdminUserListView.cs +++ b/Wonky.Entity/DTO/AdminAdviserListView.cs @@ -1,10 +1,11 @@ namespace Wonky.Entity.DTO; -public class AdminUserListView +public class AdminAdviserListView { public string UserId { get; set; } = ""; + public string SalesRep { get; set; } = ""; public string FullName { get; set; } = ""; public string Email { get; set; } = ""; public string CountryCode { get; set; } = ""; - public string PhoneNUmber { get; set; } = ""; + public string PhoneNumber { get; set; } = ""; } \ No newline at end of file diff --git a/Wonky.Entity/DTO/AdviserInfoView.cs b/Wonky.Entity/DTO/AdviserInfoView.cs new file mode 100644 index 00000000..19044fd8 --- /dev/null +++ b/Wonky.Entity/DTO/AdviserInfoView.cs @@ -0,0 +1,34 @@ +using System.ComponentModel.DataAnnotations; + +namespace Wonky.Entity.DTO; + +public class AdviserInfoView +{ + [Required(ErrorMessage = "Fornavn skal angives.")] + [MaxLength(50,ErrorMessage = "Der kan højst bruges 50 tegn.")] + public string FirstName { get; set; } = ""; + + [Required(ErrorMessage = "Efternavn skal angives.")] + [MaxLength(50,ErrorMessage = "Der kan højst bruges 50 tegn.")] + public string LastName { get; set; } = ""; + + [Required(ErrorMessage = "Landekode skal angives.")] + [MaxLength(50,ErrorMessage = "Der kan højst bruges 3 tegn.")] + public string CountryCode { get; set; } = ""; + + [Required(ErrorMessage = "Email skal angives.")] + [MaxLength(50, ErrorMessage = "Der kan højst bruges 80 tegn.")] + public string Email { get; set; } = ""; + + [MaxLength(20, ErrorMessage = "Der kan højst bruges 20 tegn.")] + public string PhoneNumber { get; set; } = ""; + + [Required(ErrorMessage = "Sælger identifikation skal angives.")] + [MaxLength(50,ErrorMessage = "Der kan højst bruges 20 tegn.")] + public string Adviser { get; set; } = ""; + public string CountryName { get; set; } = ""; + public bool LockoutEnabled { get; set; } + public bool EmailConfirmed { get; set; } + public bool IsAdviser { get; set; } + public bool IsAdmin { get; set; } +} \ No newline at end of file diff --git a/Wonky.Entity/DTO/AdviserUpdateDto.cs b/Wonky.Entity/DTO/AdviserUpdateDto.cs new file mode 100644 index 00000000..84bd1a95 --- /dev/null +++ b/Wonky.Entity/DTO/AdviserUpdateDto.cs @@ -0,0 +1,27 @@ +using System.ComponentModel.DataAnnotations; + +namespace Wonky.Entity.DTO; + +public class AdviserUpdateDto +{ + [Required(ErrorMessage = "Fornavn skal angives.")] + [MaxLength(50,ErrorMessage = "Der kan højst bruges 50 tegn.")] + public string FirstName { get; set; } = ""; + + [Required(ErrorMessage = "Efternavn skal angives.")] + [MaxLength(50,ErrorMessage = "Der kan højst bruges 50 tegn.")] + public string LastName { get; set; } = ""; + + [Required(ErrorMessage = "Landekode skal angives.")] + [MaxLength(50,ErrorMessage = "Der kan højst bruges 3 tegn.")] + public string CountryCode { get; set; } = ""; + + [Required(ErrorMessage = "Email skal angives.")] + [MaxLength(50, ErrorMessage = "Der kan højst bruges 80 tegn.")] + public string Email { get; set; } = ""; + + [MaxLength(20, ErrorMessage = "Der kan højst bruges 20 tegn.")] + public string PhoneNumber { get; set; } = ""; + + [Required] public bool LockoutEnabled { get; set; } +} \ No newline at end of file