From 128c29c798b2222ea05ecba43a642a9ffc5dfb08 Mon Sep 17 00:00:00 2001 From: Frede Hundewadt <22748698+fhdk@users.noreply.github.com> Date: Sun, 24 Jul 2022 08:43:38 +0200 Subject: [PATCH] build v0.10.10 production --- .../Components/ActivityTableComponent.razor | 4 + .../AdminAdvisorCompanyTableComponent.razor | 2 +- .../AdminAdvisorTableComponent.razor | 2 +- .../AdminReportTableComponent.razor | 4 +- .../Components/AdminUserTableComponent.razor | 2 +- .../Components/CompanyTableComponent.razor | 2 +- .../Components/ItemTableComponent.razor | 2 +- .../Components/LoaderBallTriangle.razor | 26 ++++++ .../Components/LoaderBallTriangle.razor.cs | 18 ++++ .../{AppSpinner.razor => LoaderBars.razor} | 13 ++- Wonky.Client/Components/LoaderBars.razor.cs | 18 ++++ Wonky.Client/Components/LoaderSnake.razor | 26 ++++++ Wonky.Client/Components/LoaderSnake.razor.cs | 18 ++++ .../Components/ReportTableComponent.razor | 2 +- .../Components/SearchPhraseComponent.razor.cs | 1 - .../Components/TaskItemTableComponent.razor | 2 +- .../Components/WarehouseListComponent.razor | 85 ++++++++++++++++++ .../WarehouseListComponent.razor.cs} | 16 +++- .../HttpRepository/ActivityHttpRepository.cs | 8 +- .../AdminReportHttpRepository.cs | 4 +- .../HttpRepository/CompanyHttpRepository.cs | 14 +-- .../HttpRepository/HistoryHttpRepository.cs | 8 +- .../HttpRepository/ReportHttpRepository.cs | 10 +-- .../HttpRepository/SalesItemHttpRepository.cs | 4 +- .../HttpRepository/TaskItemHttpRepository.cs | 12 +-- .../HttpRepository/UserHttpRepository.cs | 14 +-- .../HttpRepository/WarehouseHttpRepository.cs | 8 +- Wonky.Client/Pages/ActivityNewVisitPage.razor | 2 +- Wonky.Client/Pages/AdminAdvisorViewPage.razor | 3 +- .../Pages/AdminOfficeUserViewPage.razor | 3 +- Wonky.Client/Pages/AdvisorReportNewPage.razor | 2 +- Wonky.Client/Pages/CustomerViewPage.razor | 2 +- Wonky.Client/Pages/HelpPage.razor | 44 ++++++--- Wonky.Client/Pages/Index.razor | 3 + Wonky.Client/Pages/Login.razor | 2 +- .../Pages/WarehouseOrderListPage.razor | 76 +--------------- .../Pages/WarehouseOrderViewPage.razor | 3 +- .../Services/AuthenticationService.cs | 6 +- Wonky.Client/Services/VatInfoLookupService.cs | 6 +- Wonky.Client/Wonky.Client.csproj | 8 +- Wonky.Client/wwwroot/appsettings.json | 42 +++++---- Wonky.Client/wwwroot/index.html | 22 ++--- Wonky.Client/wwwroot/svg-loaders/audio.svg | 29 ++++++ .../wwwroot/svg-loaders/ball-triangle.svg | 47 ++++++++++ Wonky.Client/wwwroot/svg-loaders/bars.svg | 52 +++++++++++ Wonky.Client/wwwroot/svg-loaders/circles.svg | 20 +++++ Wonky.Client/wwwroot/svg-loaders/grid.svg | 56 ++++++++++++ Wonky.Client/wwwroot/svg-loaders/hearts.svg | 18 ++++ Wonky.Client/wwwroot/svg-loaders/oval.svg | 17 ++++ Wonky.Client/wwwroot/svg-loaders/puff.svg | 37 ++++++++ Wonky.Client/wwwroot/svg-loaders/rings.svg | 42 +++++++++ .../wwwroot/svg-loaders/spinning-circles.svg | 55 ++++++++++++ .../wwwroot/svg-loaders/tail-spin.svg | 32 +++++++ .../wwwroot/svg-loaders/three-dots.svg | 33 +++++++ Wonky.Entity/Configuration/ApiConfig.cs | 85 ++++++++++-------- icon-512.png | Bin 0 -> 63324 bytes 56 files changed, 844 insertions(+), 228 deletions(-) create mode 100644 Wonky.Client/Components/LoaderBallTriangle.razor create mode 100644 Wonky.Client/Components/LoaderBallTriangle.razor.cs rename Wonky.Client/Components/{AppSpinner.razor => LoaderBars.razor} (73%) create mode 100644 Wonky.Client/Components/LoaderBars.razor.cs create mode 100644 Wonky.Client/Components/LoaderSnake.razor create mode 100644 Wonky.Client/Components/LoaderSnake.razor.cs create mode 100644 Wonky.Client/Components/WarehouseListComponent.razor rename Wonky.Client/{Pages/WarehouseOrderListPage.razor.cs => Components/WarehouseListComponent.razor.cs} (76%) create mode 100644 Wonky.Client/wwwroot/svg-loaders/audio.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/ball-triangle.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/bars.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/circles.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/grid.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/hearts.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/oval.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/puff.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/rings.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/spinning-circles.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/tail-spin.svg create mode 100644 Wonky.Client/wwwroot/svg-loaders/three-dots.svg create mode 100644 icon-512.png diff --git a/Wonky.Client/Components/ActivityTableComponent.razor b/Wonky.Client/Components/ActivityTableComponent.razor index fe44779b..a827f3ce 100644 --- a/Wonky.Client/Components/ActivityTableComponent.razor +++ b/Wonky.Client/Components/ActivityTableComponent.razor @@ -49,4 +49,8 @@ +} +else +{ + } \ No newline at end of file diff --git a/Wonky.Client/Components/AdminAdvisorCompanyTableComponent.razor b/Wonky.Client/Components/AdminAdvisorCompanyTableComponent.razor index 3246eaf6..33327b11 100644 --- a/Wonky.Client/Components/AdminAdvisorCompanyTableComponent.razor +++ b/Wonky.Client/Components/AdminAdvisorCompanyTableComponent.razor @@ -78,5 +78,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Components/AdminAdvisorTableComponent.razor b/Wonky.Client/Components/AdminAdvisorTableComponent.razor index e22627fd..b65e8593 100644 --- a/Wonky.Client/Components/AdminAdvisorTableComponent.razor +++ b/Wonky.Client/Components/AdminAdvisorTableComponent.razor @@ -54,5 +54,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Components/AdminReportTableComponent.razor b/Wonky.Client/Components/AdminReportTableComponent.razor index fd124af5..482ca124 100644 --- a/Wonky.Client/Components/AdminReportTableComponent.razor +++ b/Wonky.Client/Components/AdminReportTableComponent.razor @@ -84,7 +84,5 @@ } else { -
- Ingen data -
+ } \ No newline at end of file diff --git a/Wonky.Client/Components/AdminUserTableComponent.razor b/Wonky.Client/Components/AdminUserTableComponent.razor index 05d54bcb..5d4600c9 100644 --- a/Wonky.Client/Components/AdminUserTableComponent.razor +++ b/Wonky.Client/Components/AdminUserTableComponent.razor @@ -51,5 +51,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Components/CompanyTableComponent.razor b/Wonky.Client/Components/CompanyTableComponent.razor index 3b9e85b6..af568e2c 100644 --- a/Wonky.Client/Components/CompanyTableComponent.razor +++ b/Wonky.Client/Components/CompanyTableComponent.razor @@ -67,5 +67,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Components/ItemTableComponent.razor b/Wonky.Client/Components/ItemTableComponent.razor index 04ff6ca3..3953d720 100644 --- a/Wonky.Client/Components/ItemTableComponent.razor +++ b/Wonky.Client/Components/ItemTableComponent.razor @@ -55,5 +55,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Components/LoaderBallTriangle.razor b/Wonky.Client/Components/LoaderBallTriangle.razor new file mode 100644 index 00000000..dc933d37 --- /dev/null +++ b/Wonky.Client/Components/LoaderBallTriangle.razor @@ -0,0 +1,26 @@ +@* +// 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] +// +*@ + +@if (Loading) +{ +
+
+ + loading ... +
+
+} \ No newline at end of file diff --git a/Wonky.Client/Components/LoaderBallTriangle.razor.cs b/Wonky.Client/Components/LoaderBallTriangle.razor.cs new file mode 100644 index 00000000..9176186e --- /dev/null +++ b/Wonky.Client/Components/LoaderBallTriangle.razor.cs @@ -0,0 +1,18 @@ + +namespace Wonky.Client.Components; + +public partial class LoaderBallTriangle +{ + private bool Loading { get; set; } + + protected override async Task OnInitializedAsync() + { + Loading = true; + + await Task.Delay(10000); + + Loading = false; + } + + +} \ No newline at end of file diff --git a/Wonky.Client/Components/AppSpinner.razor b/Wonky.Client/Components/LoaderBars.razor similarity index 73% rename from Wonky.Client/Components/AppSpinner.razor rename to Wonky.Client/Components/LoaderBars.razor index 16f0cfc1..d5e9f34f 100644 --- a/Wonky.Client/Components/AppSpinner.razor +++ b/Wonky.Client/Components/LoaderBars.razor @@ -14,6 +14,13 @@ // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // *@ -
- Loading... -
+ +@if (Loading) +{ +
+
+ + loading ... +
+
+} \ No newline at end of file diff --git a/Wonky.Client/Components/LoaderBars.razor.cs b/Wonky.Client/Components/LoaderBars.razor.cs new file mode 100644 index 00000000..ed3ed82e --- /dev/null +++ b/Wonky.Client/Components/LoaderBars.razor.cs @@ -0,0 +1,18 @@ + +namespace Wonky.Client.Components; + +public partial class LoaderBars +{ + private bool Loading { get; set; } + + protected override async Task OnInitializedAsync() + { + Loading = true; + + await Task.Delay(10000); + + Loading = false; + } + + +} \ No newline at end of file diff --git a/Wonky.Client/Components/LoaderSnake.razor b/Wonky.Client/Components/LoaderSnake.razor new file mode 100644 index 00000000..34a1fb49 --- /dev/null +++ b/Wonky.Client/Components/LoaderSnake.razor @@ -0,0 +1,26 @@ +@* +// 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] +// +*@ + +@if (Loading) +{ +
+
+ + loading ... +
+
+} \ No newline at end of file diff --git a/Wonky.Client/Components/LoaderSnake.razor.cs b/Wonky.Client/Components/LoaderSnake.razor.cs new file mode 100644 index 00000000..3464d043 --- /dev/null +++ b/Wonky.Client/Components/LoaderSnake.razor.cs @@ -0,0 +1,18 @@ + +namespace Wonky.Client.Components; + +public partial class LoaderSnake +{ + private bool Loading { get; set; } + + protected override async Task OnInitializedAsync() + { + Loading = true; + + await Task.Delay(10000); + + Loading = false; + } + + +} \ No newline at end of file diff --git a/Wonky.Client/Components/ReportTableComponent.razor b/Wonky.Client/Components/ReportTableComponent.razor index c672569a..b991ca96 100644 --- a/Wonky.Client/Components/ReportTableComponent.razor +++ b/Wonky.Client/Components/ReportTableComponent.razor @@ -82,5 +82,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Components/SearchPhraseComponent.razor.cs b/Wonky.Client/Components/SearchPhraseComponent.razor.cs index c8a8de17..22ca22ca 100644 --- a/Wonky.Client/Components/SearchPhraseComponent.razor.cs +++ b/Wonky.Client/Components/SearchPhraseComponent.razor.cs @@ -15,7 +15,6 @@ using System.Timers; using Microsoft.AspNetCore.Components; -using Microsoft.VisualBasic; using Timer = System.Timers.Timer; namespace Wonky.Client.Components diff --git a/Wonky.Client/Components/TaskItemTableComponent.razor b/Wonky.Client/Components/TaskItemTableComponent.razor index 3afe83b4..05d31cf0 100644 --- a/Wonky.Client/Components/TaskItemTableComponent.razor +++ b/Wonky.Client/Components/TaskItemTableComponent.razor @@ -73,5 +73,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Components/WarehouseListComponent.razor b/Wonky.Client/Components/WarehouseListComponent.razor new file mode 100644 index 00000000..95b499ac --- /dev/null +++ b/Wonky.Client/Components/WarehouseListComponent.razor @@ -0,0 +1,85 @@ +
+
+
+ + + + + + + + + + + +
+
+
+ @if (_readyToShip && _orders.Any()) + { + + } +
+
+@if (_orders.Any()) +{ + +} +else +{ + +} + +@code { + +} \ No newline at end of file diff --git a/Wonky.Client/Pages/WarehouseOrderListPage.razor.cs b/Wonky.Client/Components/WarehouseListComponent.razor.cs similarity index 76% rename from Wonky.Client/Pages/WarehouseOrderListPage.razor.cs rename to Wonky.Client/Components/WarehouseListComponent.razor.cs index c9323677..17c0e5a1 100644 --- a/Wonky.Client/Pages/WarehouseOrderListPage.razor.cs +++ b/Wonky.Client/Components/WarehouseListComponent.razor.cs @@ -4,9 +4,9 @@ using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpRepository; using Wonky.Entity.Views; -namespace Wonky.Client.Pages; +namespace Wonky.Client.Components; -public partial class WarehouseOrderListPage : IDisposable +public partial class WarehouseListComponent { [Inject] private HttpInterceptorService _interceptor { get; set; } [Inject] private IWarehouseHttpRepository _warehouseRepo { get; set; } @@ -28,21 +28,32 @@ public partial class WarehouseOrderListPage : IDisposable private async Task GetOrderStatusNone() { + _orders = new List(); _orders = await _warehouseRepo.GetWarehouseOrderListByStatus("none"); _readyToShip = false; } private async Task GetOrderStatusPicked() { + _orders = new List(); _orders = await _warehouseRepo.GetWarehouseOrderListByStatus("picked"); _readyToShip = false; } private async Task GetOrderStatusPacked() { + _orders = new List(); _orders = await _warehouseRepo.GetWarehouseOrderListByStatus("packed"); _readyToShip = true; } + + private async Task GetOrderStatusShipped() + { + _orders = new List(); + var orderList = await _warehouseRepo.GetWarehouseOrderListByStatus("shipped"); + _orders = orderList.OrderByDescending(x => x.OrderDate).ToList(); + _readyToShip = false; + } private async Task SetProcessStatusShipped() { @@ -63,4 +74,5 @@ public partial class WarehouseOrderListPage : IDisposable { _interceptor.DisposeEvent(); } + } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/ActivityHttpRepository.cs b/Wonky.Client/HttpRepository/ActivityHttpRepository.cs index 3c70f13e..ba1a0bc7 100644 --- a/Wonky.Client/HttpRepository/ActivityHttpRepository.cs +++ b/Wonky.Client/HttpRepository/ActivityHttpRepository.cs @@ -57,7 +57,7 @@ public class ActivityHttpRepository : IActivityHttpRepository public async Task GetActivities(string activityDate) { var response = await _client - .GetAsync($"{_apiConfig.ActivityUri}/date/{activityDate}"); + .GetAsync($"{_apiConfig.CrmSale}/date/{activityDate}"); var content = await response.Content.ReadAsStringAsync(); return string.IsNullOrWhiteSpace(content) ? new ReportItemListView() @@ -67,7 +67,7 @@ public class ActivityHttpRepository : IActivityHttpRepository public async Task CreateActivity(ActivityDto model) { Console.WriteLine(JsonSerializer.Serialize(model, _options)); - var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityUri}", model, _options); + var response = await _client.PostAsJsonAsync($"{_apiConfig.CrmSale}", model, _options); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(content); return result!; @@ -76,13 +76,13 @@ public class ActivityHttpRepository : IActivityHttpRepository public async Task GetActivity(string id) { var salesItem = await _client - .GetFromJsonAsync($"{_apiConfig.ActivityUri}/{id}"); + .GetFromJsonAsync($"{_apiConfig.CrmSale}/{id}"); return salesItem ?? new ActivityDto(); } public async Task AcceptOffer(string id) { - var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityUri}/{id}/accept", id) + var response = await _client.PostAsJsonAsync($"{_apiConfig.CrmSale}/{id}/accept", id) ; var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(content); diff --git a/Wonky.Client/HttpRepository/AdminReportHttpRepository.cs b/Wonky.Client/HttpRepository/AdminReportHttpRepository.cs index c90494e3..9f0b52bd 100644 --- a/Wonky.Client/HttpRepository/AdminReportHttpRepository.cs +++ b/Wonky.Client/HttpRepository/AdminReportHttpRepository.cs @@ -47,12 +47,12 @@ public class AdminReportHttpRepository : IAdminReportHttpRepository public async Task> GetReports(string userId) { - return await _client.GetFromJsonAsync>($"{_apiConfig.AdminAdvisorUri}/{userId}/reports"); + return await _client.GetFromJsonAsync>($"{_apiConfig.AdminUser}/{userId}/reports"); } public async Task GetReport(string userId, string workDate) { - return await _client.GetFromJsonAsync($"{_apiConfig.AdminAdvisorUri}/{userId}/reports/{workDate}"); + return await _client.GetFromJsonAsync($"{_apiConfig.AdminUser}/{userId}/reports/{workDate}"); } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/CompanyHttpRepository.cs b/Wonky.Client/HttpRepository/CompanyHttpRepository.cs index 66cd3a81..91c47051 100644 --- a/Wonky.Client/HttpRepository/CompanyHttpRepository.cs +++ b/Wonky.Client/HttpRepository/CompanyHttpRepository.cs @@ -68,7 +68,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository ["isHidden"] = pagingParameters.IsHidden.ToString(), ["hasFolded"] = pagingParameters.HasFolded.ToString() }; - var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CompanyUri}/page", queryString)); + var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CrmCustomer}/page", queryString)); var content = await response.Content.ReadAsStringAsync(); @@ -93,7 +93,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository ["hasFolded"] = pagingParameters.HasFolded.ToString() }; var response = await _client - .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.AdminAdvisorUri}/{userId}/companies", queryString)); + .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.AdminUser}/{userId}/companies", queryString)); var content = await response.Content.ReadAsStringAsync(); @@ -107,13 +107,13 @@ public class CompanyHttpRepository : ICompanyHttpRepository public async Task GetCompanyByAccount(string accountNumber) { - var company = await _client.GetFromJsonAsync($"{_apiConfig.CompanyUri}/account/{accountNumber}"); + var company = await _client.GetFromJsonAsync($"{_apiConfig.CrmCustomer}/account/{accountNumber}"); return company ?? new CompanyDto(); } public async Task GetCompanyById(string companyId) { - var company = await _client.GetFromJsonAsync($"{_apiConfig.CompanyUri}/{companyId}"); + var company = await _client.GetFromJsonAsync($"{_apiConfig.CrmCustomer}/{companyId}"); return company ?? new CompanyDto(); } @@ -124,7 +124,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository /// company id public async Task CreateCompany(CompanyDto model) { - var response = await _client.PostAsJsonAsync($"{_apiConfig.CompanyUri}", model); + var response = await _client.PostAsJsonAsync($"{_apiConfig.CrmCustomer}", model); var content = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(content, _options); return result.CompanyId; @@ -132,7 +132,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository public async Task UpdateCompany(string companyId, CompanyDto model) { - var response = await _client.PutAsJsonAsync($"{_apiConfig.CompanyUri}/{companyId}", model); + var response = await _client.PutAsJsonAsync($"{_apiConfig.CrmCustomer}/{companyId}", model); var content = await response.Content.ReadAsStringAsync(); Console.WriteLine(content); return response.IsSuccessStatusCode; @@ -140,7 +140,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository public async Task DeleteCompany(string companyId) { - var response = await _client.DeleteAsync($"{_apiConfig.CompanyUri}/{companyId}"); + var response = await _client.DeleteAsync($"{_apiConfig.CrmCustomer}/{companyId}"); return response.IsSuccessStatusCode; } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/HistoryHttpRepository.cs b/Wonky.Client/HttpRepository/HistoryHttpRepository.cs index dbff5f6f..557f1d84 100644 --- a/Wonky.Client/HttpRepository/HistoryHttpRepository.cs +++ b/Wonky.Client/HttpRepository/HistoryHttpRepository.cs @@ -48,7 +48,7 @@ public class HistoryHttpRepository : IHistoryHttpRepository } public async Task> FetchInventory(string companyId) { - var response = await _client.GetAsync($"{_api.CompanyUri}/{companyId}/{_api.InventoryUri}"); + var response = await _client.GetAsync($"{_api.CrmCustomer}/{companyId}/{_api.CrmInventory}"); var content = await response.Content.ReadAsStringAsync(); return response.IsSuccessStatusCode ? JsonSerializer.Deserialize>(content, _options) @@ -59,18 +59,18 @@ public class HistoryHttpRepository : IHistoryHttpRepository public async Task> FetchHistory(string companyId) { return await _client.GetFromJsonAsync>( - $"{_api.CompanyUri}/{companyId}/{_api.ProductUri}"); + $"{_api.CrmCustomer}/{companyId}/{_api.CrmProduct}"); } public async Task> FetchHistory(string companyId, string sku) { return await _client.GetFromJsonAsync>( - $"{_api.CompanyUri}/{companyId}/{_api.ProductUri}/{sku}"); + $"{_api.CrmCustomer}/{companyId}/{_api.CrmProduct}/{sku}"); } public async Task UpdateProductHistory(string companyId, string syncDate = "2010-01-01") { - return await _client.GetStringAsync($"{_api.CompanyUri}/{companyId}/{_api.SyncUri}/{syncDate}"); + return await _client.GetStringAsync($"{_api.CrmCustomer}/{companyId}/{_api.CrmSync}/{syncDate}"); } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/ReportHttpRepository.cs b/Wonky.Client/HttpRepository/ReportHttpRepository.cs index 6e21fead..ea934d0d 100644 --- a/Wonky.Client/HttpRepository/ReportHttpRepository.cs +++ b/Wonky.Client/HttpRepository/ReportHttpRepository.cs @@ -48,32 +48,32 @@ public class ReportHttpRepository :IReportHttpRepository public async Task> GetReports() { - return await _client.GetFromJsonAsync>($"{_apiConfig.ReportUri}"); + return await _client.GetFromJsonAsync>($"{_apiConfig.CrmReport}"); } public async Task ReportExist(string workDate) { var result = await _client - .GetFromJsonAsync($"{_apiConfig.ReportUri}/exist/{workDate}"); + .GetFromJsonAsync($"{_apiConfig.CrmReport}/exist/{workDate}"); return result.ReportClosed; } public async Task GetReport(string workDate) { - return await _client.GetFromJsonAsync($"{_apiConfig.ReportUri}/{workDate}"); + return await _client.GetFromJsonAsync($"{_apiConfig.CrmReport}/{workDate}"); } public async Task InitializeReportData(string workDate) { var initData = await _client - .GetFromJsonAsync($"{_apiConfig.ReportUri}/init/{workDate}"); + .GetFromJsonAsync($"{_apiConfig.CrmReport}/init/{workDate}"); return initData ?? new ReportInitDto(); } public async Task PostReport(string workDate, ReportDto reportDto) { var response = await _client - .PostAsJsonAsync($"{_apiConfig.ReportUri}/{workDate}", reportDto, _options); + .PostAsJsonAsync($"{_apiConfig.CrmReport}/{workDate}", reportDto, _options); var jsonDate = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize(jsonDate); diff --git a/Wonky.Client/HttpRepository/SalesItemHttpRepository.cs b/Wonky.Client/HttpRepository/SalesItemHttpRepository.cs index c061b05d..e85be4e6 100644 --- a/Wonky.Client/HttpRepository/SalesItemHttpRepository.cs +++ b/Wonky.Client/HttpRepository/SalesItemHttpRepository.cs @@ -64,7 +64,7 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository ["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup, }; var response = await _client - .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CatalogUri}/page", queryString)); + .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CrmCatalog}/page", queryString)); var content = await response.Content.ReadAsStringAsync(); @@ -80,7 +80,7 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository public async Task GetSalesItem(string id) { var salesItem = await _client - .GetFromJsonAsync($"{_apiConfig.CatalogUri}/{id}"); + .GetFromJsonAsync($"{_apiConfig.CrmCatalog}/{id}"); return salesItem ?? new SalesItemView(); } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs b/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs index 8321eb73..a613b682 100644 --- a/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs +++ b/Wonky.Client/HttpRepository/TaskItemHttpRepository.cs @@ -51,31 +51,31 @@ public class TaskItemHttpRepository : ITaskItemHttpRepository public async Task?> GetTaskList() { - return await _client.GetFromJsonAsync>($"{_apiConfig.TaskUri}", _options); + return await _client.GetFromJsonAsync>($"{_apiConfig.CrmTask}", _options); } public async Task?> GetTaskList(string workDate) { - return await _client.GetFromJsonAsync>($"{_apiConfig.TaskUri}/date/{workDate}", _options); + return await _client.GetFromJsonAsync>($"{_apiConfig.CrmTask}/date/{workDate}", _options); } public async Task GetTaskItem(string taskItemId) { - return await _client.GetFromJsonAsync($"{_apiConfig.TaskUri}/{taskItemId}", _options); + return await _client.GetFromJsonAsync($"{_apiConfig.CrmTask}/{taskItemId}", _options); } public async Task CreateTaskItem(TaskItemDto taskItem) { - await _client.PostAsJsonAsync($"{_apiConfig.TaskUri}", taskItem, _options); + await _client.PostAsJsonAsync($"{_apiConfig.CrmTask}", taskItem, _options); } public async Task UpdateTaskItem(string taskItemId, TaskItemDto taskItem) { - await _client.PutAsJsonAsync($"{_apiConfig.TaskUri}/{taskItemId}", taskItem, _options); + await _client.PutAsJsonAsync($"{_apiConfig.CrmTask}/{taskItemId}", taskItem, _options); } public async Task DeleteTaskItem(string taskItemId) { - await _client.DeleteAsync($"{_apiConfig.TaskUri}/{taskItemId}"); + await _client.DeleteAsync($"{_apiConfig.CrmTask}/{taskItemId}"); } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/UserHttpRepository.cs b/Wonky.Client/HttpRepository/UserHttpRepository.cs index 7d9bc78a..7415df98 100644 --- a/Wonky.Client/HttpRepository/UserHttpRepository.cs +++ b/Wonky.Client/HttpRepository/UserHttpRepository.cs @@ -49,37 +49,37 @@ public class UserHttpRepository : IUserHttpRepository public async Task> GetAdvisors() { - return await _client.GetFromJsonAsync>(_api.AdminAdvisorUri); + return await _client.GetFromJsonAsync>(_api.AdminUser); } public async Task GetAdvisorInfo(string userId) { - return await _client.GetFromJsonAsync($"{_api.AdminAdvisorUri}/{userId}"); + return await _client.GetFromJsonAsync($"{_api.AdminUser}/{userId}"); } public async Task UpdateAdvisor(string userId, UserUpdateDto model) { - await _client.PutAsJsonAsync($"{_api.AdminAdvisorUri}/{userId}", model, _options); + await _client.PutAsJsonAsync($"{_api.AdminUser}/{userId}", model, _options); } public async Task> GetAdminUsers() { - return await _client.GetFromJsonAsync>(_api.AdminUserUri); + return await _client.GetFromJsonAsync>(_api.AdminOffice); } public async Task GetAdminUserInfo(string userId) { - return await _client.GetFromJsonAsync($"{_api.AdminUserUri}/{userId}"); + return await _client.GetFromJsonAsync($"{_api.AdminOffice}/{userId}"); } public async Task UpdateAdminUser(string userId, UserUpdateDto model) { - await _client.PutAsJsonAsync($"{_api.AdminUserUri}/{userId}", model, _options); + await _client.PutAsJsonAsync($"{_api.AdminOffice}/{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); + await _client.PostAsJsonAsync($"{_api.AdminPasswd}/{userId}", passwd, _options); } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/WarehouseHttpRepository.cs b/Wonky.Client/HttpRepository/WarehouseHttpRepository.cs index 24b10fd2..8791c5cb 100644 --- a/Wonky.Client/HttpRepository/WarehouseHttpRepository.cs +++ b/Wonky.Client/HttpRepository/WarehouseHttpRepository.cs @@ -32,21 +32,21 @@ public class WarehouseHttpRepository : IWarehouseHttpRepository public async Task> GetWarehouseOrderListByDate(string date) { - return await _client.GetFromJsonAsync>($"{_api.WarehouseUri}?date={date}", _options); + return await _client.GetFromJsonAsync>($"{_api.Warehouse}?date={date}", _options); } public async Task> GetWarehouseOrderListByStatus(string status) { - return await _client.GetFromJsonAsync>($"{_api.WarehouseUri}?status={status}", _options); + return await _client.GetFromJsonAsync>($"{_api.Warehouse}?status={status}", _options); } public async Task GetWarehouseOrder(string orderId) { - return await _client.GetFromJsonAsync($"{_api.WarehouseUri}/{orderId}", _options); + return await _client.GetFromJsonAsync($"{_api.Warehouse}/{orderId}", _options); } public async Task UpdateWarehouseOrderStatus(WarehouseProcess process) { _logger.LogDebug("process => {}", JsonSerializer.Serialize(process)); - await _client.PutAsJsonAsync($"{_api.WarehouseUri}/{process.OrderId}", process, _options); + await _client.PutAsJsonAsync($"{_api.Warehouse}/{process.OrderId}", process, _options); } } \ No newline at end of file diff --git a/Wonky.Client/Pages/ActivityNewVisitPage.razor b/Wonky.Client/Pages/ActivityNewVisitPage.razor index 910328a7..d86c839c 100644 --- a/Wonky.Client/Pages/ActivityNewVisitPage.razor +++ b/Wonky.Client/Pages/ActivityNewVisitPage.razor @@ -352,7 +352,7 @@ \ No newline at end of file diff --git a/Wonky.Client/Pages/AdminOfficeUserViewPage.razor b/Wonky.Client/Pages/AdminOfficeUserViewPage.razor index f5ad9c17..237e3d43 100644 --- a/Wonky.Client/Pages/AdminOfficeUserViewPage.razor +++ b/Wonky.Client/Pages/AdminOfficeUserViewPage.razor @@ -17,6 +17,7 @@ @page "/admin/users/office/{CountryCode}/{UserId}/view" @using Microsoft.AspNetCore.Authorization +@using Wonky.Client.Components @attribute [Authorize(Roles = "Admin")]
@@ -112,7 +113,7 @@ } else { - + }
\ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorReportNewPage.razor b/Wonky.Client/Pages/AdvisorReportNewPage.razor index 33404b86..64a8fe95 100644 --- a/Wonky.Client/Pages/AdvisorReportNewPage.razor +++ b/Wonky.Client/Pages/AdvisorReportNewPage.razor @@ -33,7 +33,7 @@
@if (_working) { - + }
diff --git a/Wonky.Client/Pages/CustomerViewPage.razor b/Wonky.Client/Pages/CustomerViewPage.razor index f1aa6fdb..bb17da22 100644 --- a/Wonky.Client/Pages/CustomerViewPage.razor +++ b/Wonky.Client/Pages/CustomerViewPage.razor @@ -219,5 +219,5 @@ } else { - + } \ No newline at end of file diff --git a/Wonky.Client/Pages/HelpPage.razor b/Wonky.Client/Pages/HelpPage.razor index df8ff86b..99122065 100644 --- a/Wonky.Client/Pages/HelpPage.razor +++ b/Wonky.Client/Pages/HelpPage.razor @@ -23,22 +23,44 @@ @attribute [Authorize(Roles = "Advisor,Admin,Office,Warehouse")]
-
- Wonky Logo -
-
-
Browservalg
- Den nyeste udgave af Google Chrome, Chromium, Microsoft Edge, Apple Safari eller Vivaldi. +
+
+ Wonky Logo +
+
-
-
+ +
+
+

Piktogrammer

-
-
- + +
+
+

Testede browsere

+
    +
  • Safari (macOS, iOS)
  • +
  • Chrome (Linux, Windows, Android)
  • +
  • Edge (Linux, Windows, Android)
  • +
  • Firefox (Linux, Windows, Android)
  • +
  • Chromium (Linux)
  • +
  • Vivaldi (Linux)
  • +
+
+
+ + diff --git a/Wonky.Client/Pages/Index.razor b/Wonky.Client/Pages/Index.razor index a62c0127..a5c3b475 100644 --- a/Wonky.Client/Pages/Index.razor +++ b/Wonky.Client/Pages/Index.razor @@ -27,6 +27,9 @@ + + + @code{ } diff --git a/Wonky.Client/Pages/Login.razor b/Wonky.Client/Pages/Login.razor index 61b27753..83b35065 100644 --- a/Wonky.Client/Pages/Login.razor +++ b/Wonky.Client/Pages/Login.razor @@ -61,7 +61,7 @@
@if (execLogin) { - + }
diff --git a/Wonky.Client/Pages/WarehouseOrderListPage.razor b/Wonky.Client/Pages/WarehouseOrderListPage.razor index c9e1f435..6c9faaf2 100644 --- a/Wonky.Client/Pages/WarehouseOrderListPage.razor +++ b/Wonky.Client/Pages/WarehouseOrderListPage.razor @@ -1,78 +1,6 @@ @using Microsoft.AspNetCore.Authorization +@using Wonky.Client.Components @attribute [Authorize(Roles = "Admin,Warehouse,Office")] @page "/warehouse/orders" -
-
-
- - - - - - - - -
-
-
- @if (_readyToShip && _orders.Any()) - { - - } -
-
-@if (_orders.Any()) -{ - -} \ No newline at end of file + \ No newline at end of file diff --git a/Wonky.Client/Pages/WarehouseOrderViewPage.razor b/Wonky.Client/Pages/WarehouseOrderViewPage.razor index 7c2ca59f..978cb7d5 100644 --- a/Wonky.Client/Pages/WarehouseOrderViewPage.razor +++ b/Wonky.Client/Pages/WarehouseOrderViewPage.razor @@ -1,4 +1,5 @@ @using Microsoft.AspNetCore.Authorization +@using Wonky.Client.Components @attribute [Authorize(Roles = "Admin,Warehouse,Office")] @page "/warehouse/orders/{OrderId}" @@ -99,5 +100,5 @@ } else { -
Ingen data
+ } \ No newline at end of file diff --git a/Wonky.Client/Services/AuthenticationService.cs b/Wonky.Client/Services/AuthenticationService.cs index 2c490cda..101b728c 100644 --- a/Wonky.Client/Services/AuthenticationService.cs +++ b/Wonky.Client/Services/AuthenticationService.cs @@ -54,7 +54,7 @@ namespace Wonky.Client.Services }; var response = await _client - .PostAsync(_apiConfig.Value.TokenUri, new FormUrlEncodedContent(credentials)); + .PostAsync(_apiConfig.Value.CrmAuth, new FormUrlEncodedContent(credentials)); var resContent = await response.Content.ReadAsStringAsync(); @@ -89,7 +89,7 @@ namespace Wonky.Client.Services ["grant_type"] = "refresh_token", ["refresh_token"] = refreshToken }; - var response = await _client.PostAsync(_apiConfig.Value.TokenUri, new FormUrlEncodedContent(credentials)); + var response = await _client.PostAsync(_apiConfig.Value.CrmAuth, new FormUrlEncodedContent(credentials)); if (!response.IsSuccessStatusCode) return string.Empty; @@ -119,7 +119,7 @@ namespace Wonky.Client.Services public async Task UserInfo(bool write = false) { - var infoResponse = await _client.GetAsync(_apiConfig.Value.UserInfoUri); + var infoResponse = await _client.GetAsync(_apiConfig.Value.CrmUser); var infoContent = await infoResponse.Content.ReadAsStringAsync(); var userInfo = JsonSerializer.Deserialize(infoContent, _options); if(write) diff --git a/Wonky.Client/Services/VatInfoLookupService.cs b/Wonky.Client/Services/VatInfoLookupService.cs index d66525d5..aa35d943 100644 --- a/Wonky.Client/Services/VatInfoLookupService.cs +++ b/Wonky.Client/Services/VatInfoLookupService.cs @@ -51,7 +51,7 @@ public class VatInfoLookupService ["houseNumber"] = $"{query.HouseNumber}", ["zipCode"] = $"{query.ZipCode}" }; - var endpoint = QueryHelpers.AddQueryString(_config.VirkUrl, queryString); + var endpoint = QueryHelpers.AddQueryString(_config.ServiceVirk, queryString); var response = await _client.GetAsync(endpoint); var content = await response.Content.ReadAsStringAsync(); var jsonResult = JsonSerializer.Deserialize>(content, _options); @@ -70,7 +70,7 @@ public class VatInfoLookupService { ["vatNumber"] = $"{vatNumber}" }; - var endpoint = QueryHelpers.AddQueryString(_config.BrRegUrl, queryString); + var endpoint = QueryHelpers.AddQueryString(_config.ServiceBrReg, queryString); var response = await _client.GetAsync(endpoint); var content = await response.Content.ReadAsStringAsync(); @@ -91,7 +91,7 @@ public class VatInfoLookupService { ["vatNumber"] = $"{vatNumber}" }; - var endpoint = QueryHelpers.AddQueryString(_config.ViesUrl, queryString); + var endpoint = QueryHelpers.AddQueryString(_config.ServiceVies, queryString); var response = await _client.GetAsync(endpoint); var content = await response.Content.ReadAsStringAsync(); diff --git a/Wonky.Client/Wonky.Client.csproj b/Wonky.Client/Wonky.Client.csproj index 40f7798a..ea0e6907 100644 --- a/Wonky.Client/Wonky.Client.csproj +++ b/Wonky.Client/Wonky.Client.csproj @@ -11,10 +11,10 @@ - - - - + + + + diff --git a/Wonky.Client/wwwroot/appsettings.json b/Wonky.Client/wwwroot/appsettings.json index 685675bf..597fa250 100644 --- a/Wonky.Client/wwwroot/appsettings.json +++ b/Wonky.Client/wwwroot/appsettings.json @@ -1,34 +1,32 @@ { "appInfo": { "name": "Wonky Client", - "version": "0.9.19", - "rc": true, + "version": "0.10.10", + "rc": false, "sandBox": false, "image": "grumpy-coder.png" }, "apiConfig": { - "innoBaseUrl": "https://staging.innotec.dk", + "innoBaseUrl": "https://production.innotec.dk", "glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=", "glsId": "", - "virkUrl": "api/v2/services/virk", - "brRegUrl": "api/v2/services/brReg", - "viesUrl": "api/v2/services/vies", - "tokenUri": "token", - "userInfoUri": "api/auth/userinfo", - "catalogUri": "api/v2/crm/catalog", - "activityUri": "api/v2/crm/advisors/sales", - "reportUri": "api/v2/crm/advisors/reports", - "taskUri": "api/v2/crm/advisors/tasks", - "companyUri": "api/v2/crm/companies", - "inventoryUri": "history/inventory", - "productUri": "history/products", - "syncUri": "history/sync", - "adminAdvisorUri": "api/v2/admin/users/advisors", - "adminUserUri": "api/v2/admin/users/office", - "adminPasswdUri": "api/v2/admin/users/passwd", - "adminReportUri": "reports", - "adminCompanyUri": "companies", - "warehouseUri": "api/v2/warehouse/orders" + "servcieVirk": "api/v2/services/virk", + "serviceBrReg": "api/v2/services/brReg", + "servcieVies": "api/v2/services/vies", + "crmAuth": "token", + "crmUser": "api/auth/userinfo", + "crmCatalog": "api/v2/crm/catalog", + "crmSale": "api/v2/crm/advisors/sales", + "crmReport": "api/v2/crm/advisors/reports", + "crmTask": "api/v2/crm/advisors/tasks", + "crmCustomer": "api/v2/crm/companies", + "crmInventory": "history/inventory", + "crmProduct": "history/products", + "crmSync": "history/sync", + "adminUser": "api/v2/admin/users/advisors", + "adminOffice": "api/v2/admin/users/office", + "adminPasswd": "api/v2/admin/users/passwd", + "warehouse": "api/v2/warehouse/orders" }, "Logging": { "LogLevel": { diff --git a/Wonky.Client/wwwroot/index.html b/Wonky.Client/wwwroot/index.html index 8ac4b78a..7b07ccb0 100644 --- a/Wonky.Client/wwwroot/index.html +++ b/Wonky.Client/wwwroot/index.html @@ -3,28 +3,28 @@ Inno Web CRM - - + + - + - - - + + +
-
- Indlæser siden ... +
+ + loading ...
- - + + - diff --git a/Wonky.Client/wwwroot/svg-loaders/audio.svg b/Wonky.Client/wwwroot/svg-loaders/audio.svg new file mode 100644 index 00000000..ee151e0d --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/audio.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wonky.Client/wwwroot/svg-loaders/ball-triangle.svg b/Wonky.Client/wwwroot/svg-loaders/ball-triangle.svg new file mode 100644 index 00000000..88b97e36 --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/ball-triangle.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wonky.Client/wwwroot/svg-loaders/bars.svg b/Wonky.Client/wwwroot/svg-loaders/bars.svg new file mode 100644 index 00000000..4c12b21d --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/bars.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wonky.Client/wwwroot/svg-loaders/circles.svg b/Wonky.Client/wwwroot/svg-loaders/circles.svg new file mode 100644 index 00000000..963f42b9 --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/circles.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/Wonky.Client/wwwroot/svg-loaders/grid.svg b/Wonky.Client/wwwroot/svg-loaders/grid.svg new file mode 100644 index 00000000..a398670d --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/grid.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wonky.Client/wwwroot/svg-loaders/hearts.svg b/Wonky.Client/wwwroot/svg-loaders/hearts.svg new file mode 100644 index 00000000..7fbec397 --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/hearts.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/Wonky.Client/wwwroot/svg-loaders/oval.svg b/Wonky.Client/wwwroot/svg-loaders/oval.svg new file mode 100644 index 00000000..2d156e6a --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/oval.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Wonky.Client/wwwroot/svg-loaders/puff.svg b/Wonky.Client/wwwroot/svg-loaders/puff.svg new file mode 100644 index 00000000..45f93f8f --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/puff.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wonky.Client/wwwroot/svg-loaders/rings.svg b/Wonky.Client/wwwroot/svg-loaders/rings.svg new file mode 100644 index 00000000..78f533c6 --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/rings.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wonky.Client/wwwroot/svg-loaders/spinning-circles.svg b/Wonky.Client/wwwroot/svg-loaders/spinning-circles.svg new file mode 100644 index 00000000..2c08b2fc --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/spinning-circles.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wonky.Client/wwwroot/svg-loaders/tail-spin.svg b/Wonky.Client/wwwroot/svg-loaders/tail-spin.svg new file mode 100644 index 00000000..33ca851a --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/tail-spin.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Wonky.Client/wwwroot/svg-loaders/three-dots.svg b/Wonky.Client/wwwroot/svg-loaders/three-dots.svg new file mode 100644 index 00000000..4c4fa60d --- /dev/null +++ b/Wonky.Client/wwwroot/svg-loaders/three-dots.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/Wonky.Entity/Configuration/ApiConfig.cs b/Wonky.Entity/Configuration/ApiConfig.cs index d15ba241..7b257c28 100644 --- a/Wonky.Entity/Configuration/ApiConfig.cs +++ b/Wonky.Entity/Configuration/ApiConfig.cs @@ -16,6 +16,11 @@ namespace Wonky.Entity.Configuration; public class ApiConfig { + /// + /// Application base url + /// + public string InnoBaseUrl { get; set; } = ""; + /// /// GLS tracking url /// @@ -29,90 +34,98 @@ public class ApiConfig /// /// VAT registrar url Denmark /// - public string VirkUrl { get; set; } = ""; + public string ServiceVirk { get; set; } = ""; /// /// VAT registrar url Norway /// - public string BrRegUrl { get; set; } = ""; + public string ServiceBrReg { get; set; } = ""; /// /// VAT registrar url EU /// - public string ViesUrl { get; set; } = ""; - - /// - /// Application base url - /// - public string InnoBaseUrl { get; set; } = ""; - - /// - /// Application uri for company information request - /// - public string CompanyUri { get; set; } = ""; - - /// - /// Application uri for product catalog request - /// - public string CatalogUri { get; set; } = ""; - - /// - /// Application uri for user information request - /// - public string UserInfoUri { get; set; } = ""; + public string ServiceVies { get; set; } = ""; /// /// Application uri for token request /// - public string TokenUri { get; set; } = ""; + public string CrmAuth { get; set; } = ""; + + /// + /// Application uri for user information request + /// + public string CrmUser { get; set; } = ""; + /// + /// Application uri for product catalog request + /// + public string CrmCatalog { get; set; } = ""; + /// /// Application uri for activity request /// - public string ActivityUri { get; set; } = ""; - + public string CrmSale { get; set; } = ""; + /// /// Application uri for sales report request /// - public string ReportUri { get; set; } = ""; - + public string CrmReport { get; set; } = ""; + /// /// Application uri for task items request /// - public string TaskUri { get; set; } = ""; + public string CrmTask { get; set; } = ""; + + /// + /// Application uri for customer information request + /// + public string CrmCustomer { get; set; } = ""; /// /// Application uri for customer product inventory request /// - public string InventoryUri { get; set; } = ""; + public string CrmInventory { get; set; } = ""; /// /// Application uri for customer product sale request /// - public string ProductUri { get; set; } = ""; + public string CrmProduct { get; set; } = ""; /// /// Application uri for updating customer product sale request /// - public string SyncUri { get; set; } = ""; + public string CrmSync { get; set; } = ""; /// /// Application uri for administration of sales representatives /// - public string AdminAdvisorUri { get; set; } = ""; + public string AdminUser { get; set; } = ""; /// /// Application uri for administration of administrative users /// - public string AdminUserUri { get; set; } = ""; + public string AdminOffice { get; set; } = ""; /// /// Application uri for administrative reset of user credentials /// - public string AdminPasswdUri { get; set; } = ""; + public string AdminPasswd { get; set; } = ""; - public string WarehouseUri { get; set; } = ""; + /// + /// Uri for warehouse requests + /// + public string Warehouse { get; set; } = ""; + // /// + // /// Application uri for reading salesReports + // /// + // public string AdminReport { get; set; } = ""; + // + // /// + // /// Application uri for handling external customer login + // /// + // public string AdminCompany { get; set; } = ""; + // public string KrvVariantsUri { get; set; } = ""; // public string KrvProductsUri { get; set; } = ""; // public string ImageUploadUri { get; set; } = ""; diff --git a/icon-512.png b/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..61d90191eb0a0843c0e2f172819c81aab05e5f6f GIT binary patch literal 63324 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 literal 0 HcmV?d00001