build v0.10.10 production

This commit is contained in:
Frede Hundewadt 2022-07-24 08:43:38 +02:00
parent f707dc2d87
commit 128c29c798
56 changed files with 844 additions and 228 deletions

View file

@ -50,3 +50,7 @@
</tbody>
</table>
}
else
{
<LoaderBallTriangle />
}

View file

@ -78,5 +78,5 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}

View file

@ -54,5 +54,5 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}

View file

@ -84,7 +84,5 @@
}
else
{
<div>
Ingen data
</div>
<LoaderBallTriangle />
}

View file

@ -51,5 +51,5 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}

View file

@ -67,5 +67,5 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}

View file

@ -55,5 +55,5 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}

View file

@ -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)
{
<div class="m-5 @(Loading ? "visible" : "invisible")">
<div class="d-flex justify-content-center">
<!-- loader credit: samherbert.net/svg-loaders -->
<img src="/svg-loaders/ball-triangle" alt="loading ..."/>
</div>
</div>
}

View file

@ -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;
}
}

View file

@ -14,6 +14,13 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
*@
<div class="spinner-border text-warning" role="status">
<span class="visually-hidden">Loading...</span>
@if (Loading)
{
<div class="m-5 @(Loading ? "visible" : "invisible")">
<div class="d-flex justify-content-center">
<!-- loader credit: samherbert.net/svg-loaders -->
<img src="/svg-loaders/bars.svg" alt="loading ..."/>
</div>
</div>
}

View file

@ -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;
}
}

View file

@ -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)
{
<div class="m-5 @(Loading ? "visible" : "invisible")">
<div class="d-flex justify-content-center">
<!-- loader credit: samherbert.net/svg-loaders -->
<img src="/svg-loaders/tail-spin.svg" alt="loading ..."/>
</div>
</div>
}

View file

@ -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;
}
}

View file

@ -82,5 +82,5 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}

View file

@ -15,7 +15,6 @@
using System.Timers;
using Microsoft.AspNetCore.Components;
using Microsoft.VisualBasic;
using Timer = System.Timers.Timer;
namespace Wonky.Client.Components

View file

@ -73,5 +73,5 @@
}
else
{
<AppSpinner></AppSpinner>
<LoaderBallTriangle />
}

View file

@ -0,0 +1,85 @@
<div class="row mb-3">
<div class="col-md-8">
<div class="btn-group-lg" role="group" aria-label="Ordre status">
<input type="radio" class="btn-check" name="btnorder" id="btnorder1" autocomplete="off" checked @onchange="@GetOrderStatusNone" />
<label class="btn btn-danger" for="btnorder1">Ubehandlet</label>
<input type="radio" class="btn-check" name="btnorder" id="btnorder2" autocomplete="off" @onchange="@GetOrderStatusPicked"/>
<label class="btn btn-warning" for="btnorder2">Plukket</label>
<input type="radio" class="btn-check" name="btnorder" id="btnorder3" autocomplete="off" @onchange="@GetOrderStatusPacked" />
<label class="btn btn-success" for="btnorder3">Pakket</label>
<input type="radio" class="btn-check" name="btnorder" id="btnorder4" autocomplete="off" @onchange="@GetOrderStatusShipped" />
<label class="btn btn-info" for="btnorder4">Afsendt</label>
</div>
</div>
<div class="col-md-4">
@if (_readyToShip && _orders.Any())
{
<button type="button" class="btn btn-lg btn-primary text-nowrap" @onclick="SetProcessStatusShipped">Sæt alle afsendt</button>
}
</div>
</div>
@if (_orders.Any())
{
<div class="list-group list-group-flush">
<div class="list-group-item">
<div class="row mb-1">
<div class="col-md-2">
<h4>Ordredato</h4>
</div>
<div class="col-md-4">
<h4>Kundenavn</h4>
</div>
<div class="col-md-4">
<h4>Postnr. Bynavn</h4>
</div>
<div class="col-md-2">
<h4>Status</h4>
</div>
</div>
</div>
@foreach (var order in _orders)
{
<a class="list-group-item list-group-item-action" href="warehouse/orders/@order.OrderId">
<div class="row">
<div class="col-md-2">
@order.OrderDate
</div>
<div class="col-md-4">
@order.Company.Name
</div>
<div class="col-md-4">
@order.Company.ZipCode @order.Company.City
</div>
<div class="col-md-2">
@switch (order.ProcessStatusEnum.ToLower())
{
case "none":
<span>Ubehandlet</span>
break;
case "picked":
<span>Plukket</span>
break;
case "packed":
<span>Pakket</span>
break;
case "shipped":
<span>Afsendt</span>
break;
}
</div>
</div>
</a>
}
</div>
}
else
{
<LoaderBallTriangle />
}
@code {
}

View file

@ -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,22 +28,33 @@ public partial class WarehouseOrderListPage : IDisposable
private async Task GetOrderStatusNone()
{
_orders = new List<WarehouseOrderView>();
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("none");
_readyToShip = false;
}
private async Task GetOrderStatusPicked()
{
_orders = new List<WarehouseOrderView>();
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("picked");
_readyToShip = false;
}
private async Task GetOrderStatusPacked()
{
_orders = new List<WarehouseOrderView>();
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("packed");
_readyToShip = true;
}
private async Task GetOrderStatusShipped()
{
_orders = new List<WarehouseOrderView>();
var orderList = await _warehouseRepo.GetWarehouseOrderListByStatus("shipped");
_orders = orderList.OrderByDescending(x => x.OrderDate).ToList();
_readyToShip = false;
}
private async Task SetProcessStatusShipped()
{
foreach (var order in _orders)
@ -63,4 +74,5 @@ public partial class WarehouseOrderListPage : IDisposable
{
_interceptor.DisposeEvent();
}
}

View file

@ -57,7 +57,7 @@ public class ActivityHttpRepository : IActivityHttpRepository
public async Task<ReportItemListView> 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<ApiResponseView> 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<ApiResponseView>(content);
return result!;
@ -76,13 +76,13 @@ public class ActivityHttpRepository : IActivityHttpRepository
public async Task<ActivityDto> GetActivity(string id)
{
var salesItem = await _client
.GetFromJsonAsync<ActivityDto>($"{_apiConfig.ActivityUri}/{id}");
.GetFromJsonAsync<ActivityDto>($"{_apiConfig.CrmSale}/{id}");
return salesItem ?? new ActivityDto();
}
public async Task<ApiResponseView> 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<ApiResponseView>(content);

View file

@ -47,12 +47,12 @@ public class AdminReportHttpRepository : IAdminReportHttpRepository
public async Task<List<NgSalesReportListView>> GetReports(string userId)
{
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.AdminAdvisorUri}/{userId}/reports");
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.AdminUser}/{userId}/reports");
}
public async Task<ReportView> GetReport(string userId, string workDate)
{
return await _client.GetFromJsonAsync<ReportView>($"{_apiConfig.AdminAdvisorUri}/{userId}/reports/{workDate}");
return await _client.GetFromJsonAsync<ReportView>($"{_apiConfig.AdminUser}/{userId}/reports/{workDate}");
}
}

View file

@ -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<CompanyDto> GetCompanyByAccount(string accountNumber)
{
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CompanyUri}/account/{accountNumber}");
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CrmCustomer}/account/{accountNumber}");
return company ?? new CompanyDto();
}
public async Task<CompanyDto> GetCompanyById(string companyId)
{
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CompanyUri}/{companyId}");
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CrmCustomer}/{companyId}");
return company ?? new CompanyDto();
}
@ -124,7 +124,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
/// <returns>company id</returns>
public async Task<string> 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<CompanyDto>(content, _options);
return result.CompanyId;
@ -132,7 +132,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
public async Task<bool> 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<bool> DeleteCompany(string companyId)
{
var response = await _client.DeleteAsync($"{_apiConfig.CompanyUri}/{companyId}");
var response = await _client.DeleteAsync($"{_apiConfig.CrmCustomer}/{companyId}");
return response.IsSuccessStatusCode;
}
}

View file

@ -48,7 +48,7 @@ public class HistoryHttpRepository : IHistoryHttpRepository
}
public async Task<List<ProductInventoryView>> 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<List<ProductInventoryView>>(content, _options)
@ -59,18 +59,18 @@ public class HistoryHttpRepository : IHistoryHttpRepository
public async Task<List<ProductHistoryView>> FetchHistory(string companyId)
{
return await _client.GetFromJsonAsync<List<ProductHistoryView>>(
$"{_api.CompanyUri}/{companyId}/{_api.ProductUri}");
$"{_api.CrmCustomer}/{companyId}/{_api.CrmProduct}");
}
public async Task<List<ProductHistoryView>> FetchHistory(string companyId, string sku)
{
return await _client.GetFromJsonAsync<List<ProductHistoryView>>(
$"{_api.CompanyUri}/{companyId}/{_api.ProductUri}/{sku}");
$"{_api.CrmCustomer}/{companyId}/{_api.CrmProduct}/{sku}");
}
public async Task<string> 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}");
}
}

View file

@ -48,32 +48,32 @@ public class ReportHttpRepository :IReportHttpRepository
public async Task<List<NgSalesReportListView>> GetReports()
{
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.ReportUri}");
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.CrmReport}");
}
public async Task<bool> ReportExist(string workDate)
{
var result =
await _client
.GetFromJsonAsync<SalesReportClosedView>($"{_apiConfig.ReportUri}/exist/{workDate}");
.GetFromJsonAsync<SalesReportClosedView>($"{_apiConfig.CrmReport}/exist/{workDate}");
return result.ReportClosed;
}
public async Task<ReportView> GetReport(string workDate)
{
return await _client.GetFromJsonAsync<ReportView>($"{_apiConfig.ReportUri}/{workDate}");
return await _client.GetFromJsonAsync<ReportView>($"{_apiConfig.CrmReport}/{workDate}");
}
public async Task<ReportInitDto> InitializeReportData(string workDate)
{
var initData = await _client
.GetFromJsonAsync<ReportInitDto>($"{_apiConfig.ReportUri}/init/{workDate}");
.GetFromJsonAsync<ReportInitDto>($"{_apiConfig.CrmReport}/init/{workDate}");
return initData ?? new ReportInitDto();
}
public async Task<ApiResponseView> 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<ApiResponseView>(jsonDate);

View file

@ -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<SalesItemView> GetSalesItem(string id)
{
var salesItem = await _client
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.CatalogUri}/{id}");
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.CrmCatalog}/{id}");
return salesItem ?? new SalesItemView();
}
}

View file

@ -51,31 +51,31 @@ public class TaskItemHttpRepository : ITaskItemHttpRepository
public async Task<List<TaskItemDto>?> GetTaskList()
{
return await _client.GetFromJsonAsync<List<TaskItemDto>>($"{_apiConfig.TaskUri}", _options);
return await _client.GetFromJsonAsync<List<TaskItemDto>>($"{_apiConfig.CrmTask}", _options);
}
public async Task<List<TaskItemDto>?> GetTaskList(string workDate)
{
return await _client.GetFromJsonAsync<List<TaskItemDto>>($"{_apiConfig.TaskUri}/date/{workDate}", _options);
return await _client.GetFromJsonAsync<List<TaskItemDto>>($"{_apiConfig.CrmTask}/date/{workDate}", _options);
}
public async Task<TaskItemDto?> GetTaskItem(string taskItemId)
{
return await _client.GetFromJsonAsync<TaskItemDto>($"{_apiConfig.TaskUri}/{taskItemId}", _options);
return await _client.GetFromJsonAsync<TaskItemDto>($"{_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}");
}
}

View file

@ -49,37 +49,37 @@ public class UserHttpRepository : IUserHttpRepository
public async Task<List<UserListAdminView>> GetAdvisors()
{
return await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminAdvisorUri);
return await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminUser);
}
public async Task<AdminUserInfoDto> GetAdvisorInfo(string userId)
{
return await _client.GetFromJsonAsync<AdminUserInfoDto>($"{_api.AdminAdvisorUri}/{userId}");
return await _client.GetFromJsonAsync<AdminUserInfoDto>($"{_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<List<UserListAdminView>> GetAdminUsers()
{
return await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminUserUri);
return await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminOffice);
}
public async Task<AdminUserInfoDto> GetAdminUserInfo(string userId)
{
return await _client.GetFromJsonAsync<AdminUserInfoDto>($"{_api.AdminUserUri}/{userId}");
return await _client.GetFromJsonAsync<AdminUserInfoDto>($"{_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<string, string> {{"newPassword", newPasswd}, {"confirmPassword", confirmPasswd}};
await _client.PostAsJsonAsync($"{_api.AdminPasswdUri}/{userId}", passwd, _options);
await _client.PostAsJsonAsync($"{_api.AdminPasswd}/{userId}", passwd, _options);
}
}

View file

@ -32,21 +32,21 @@ public class WarehouseHttpRepository : IWarehouseHttpRepository
public async Task<List<WarehouseOrderView>> GetWarehouseOrderListByDate(string date)
{
return await _client.GetFromJsonAsync<List<WarehouseOrderView>>($"{_api.WarehouseUri}?date={date}", _options);
return await _client.GetFromJsonAsync<List<WarehouseOrderView>>($"{_api.Warehouse}?date={date}", _options);
}
public async Task<List<WarehouseOrderView>> GetWarehouseOrderListByStatus(string status)
{
return await _client.GetFromJsonAsync<List<WarehouseOrderView>>($"{_api.WarehouseUri}?status={status}", _options);
return await _client.GetFromJsonAsync<List<WarehouseOrderView>>($"{_api.Warehouse}?status={status}", _options);
}
public async Task<WarehouseOrderView> GetWarehouseOrder(string orderId)
{
return await _client.GetFromJsonAsync<WarehouseOrderView>($"{_api.WarehouseUri}/{orderId}", _options);
return await _client.GetFromJsonAsync<WarehouseOrderView>($"{_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);
}
}

View file

@ -352,7 +352,7 @@
<div class="card-footer">
@if (HideButtons)
{
<AppSpinner></AppSpinner>
<LoaderBallTriangle />
}
else
{

View file

@ -17,6 +17,7 @@
@page "/admin/users/advisors/{CountryCode}/{UserId}/view"
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Admin")]
<div class="card">
@ -129,7 +130,7 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}
</div>
</div>

View file

@ -17,6 +17,7 @@
@page "/admin/users/office/{CountryCode}/{UserId}/view"
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Admin")]
<div class="card">
@ -112,7 +113,7 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle />
}
</div>
</div>

View file

@ -33,7 +33,7 @@
<div class="col-md-2 justify-content-center">
@if (_working)
{
<AppSpinner></AppSpinner>
<LoaderBallTriangle/>
}
</div>
</div>

View file

@ -219,5 +219,5 @@
}
else
{
<AppSpinner/>
<LoaderBallTriangle/>
}

View file

@ -23,22 +23,44 @@
@attribute [Authorize(Roles = "Advisor,Admin,Office,Warehouse")]
<div class="row mb-2">
<div class="col col-md-2">
<img class="grumpy-coder" src="@_app?.Image" alt="Wonky Logo"/>
</div>
<div class="col">
<h5>Browservalg</h5>
Den nyeste udgave af Google Chrome, Chromium, Microsoft Edge, Apple Safari eller Vivaldi.
<div class="col col-md-4">
<div class="text-center">
<img class="grumpy-coder mb-2" src="@_app?.Image" alt="Wonky Logo"/>
<h5><AppVersion></AppVersion></h5>
</div>
</div>
<div class="row">
<div class="col">
</div>
<div class="row mb-2">
<div class="col col-md-4">
<h2 class="text-center">Piktogrammer</h2>
<ColorCoding></ColorCoding>
</div>
</div>
<div class="row">
<div class="col">
<AppVersion></AppVersion>
<div class="row mb-2">
<div class="col col-md-4">
<h2 class="text-center">Testede browsere</h2>
<ul class="list-group">
<li class="list-group-item">Safari (macOS, iOS)</li>
<li class="list-group-item">Chrome (Linux, Windows, Android)</li>
<li class="list-group-item">Edge (Linux, Windows, Android)</li>
<li class="list-group-item">Firefox (Linux, Windows, Android)</li>
<li class="list-group-item">Chromium (Linux)</li>
<li class="list-group-item">Vivaldi (Linux)</li>
</ul>
</div>
</div>
<div class="row mb-2">
<div class="col col-md-4">
<h2 class="text-center">Open Source</h2>
<ul class="list-group">
<a class="list-group-item list-group-item-action" href="https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor/" target="_blank">Blazor WebAssembly</a>
<a class="list-group-item list-group-item-action" href="https://getbootstrap.com/" target="_blank">Bootstrap</a>
<a class="list-group-item list-group-item-action" href="https://github.com/SamHerbert/SVG-Loaders" target="_blank">SVG-Loaders</a>
<a class="list-group-item list-group-item-action" href="https://codeberg.org/wonky/Wonky.Client" target="_blank">Wonky Client</a>
</ul>
</div>
</div>

View file

@ -27,6 +27,9 @@
<AdvisorLandingComponent />
</AuthorizeView>
<AuthorizeView Roles="Warehouse">
<WarehouseListComponent />
</AuthorizeView>
@code{
}

View file

@ -61,7 +61,7 @@
<div class="col d-flex justify-content-center">
@if (execLogin)
{
<AppSpinner/>
<LoaderBallTriangle />
}
</div>
</div>

View file

@ -1,78 +1,6 @@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Admin,Warehouse,Office")]
@page "/warehouse/orders"
<div class="row mb-3">
<div class="col-md-8">
<div class="btn-group-lg" role="group" aria-label="Ordre status">
<input type="radio" class="btn-check" name="btnorder" id="btnorder1" autocomplete="off" checked @onchange="@GetOrderStatusNone" />
<label class="btn btn-danger" for="btnorder1">Ubehandlet</label>
<input type="radio" class="btn-check" name="btnorder" id="btnorder2" autocomplete="off" @onchange="@GetOrderStatusPicked"/>
<label class="btn btn-warning" for="btnorder2">Plukket</label>
<input type="radio" class="btn-check" name="btnorder" id="btnorder3" autocomplete="off" @onchange="@GetOrderStatusPacked" />
<label class="btn btn-success" for="btnorder3">Pakket</label>
</div>
</div>
<div class="col-md-4">
@if (_readyToShip && _orders.Any())
{
<button type="button" class="btn btn-lg btn-primary text-nowrap" @onclick="SetProcessStatusShipped">Sæt alle afsendt</button>
}
</div>
</div>
@if (_orders.Any())
{
<div class="list-group list-group-flush">
<div class="list-group-item">
<div class="row mb-1">
<div class="col-md-2">
<h4>Ordredato</h4>
</div>
<div class="col-md-4">
<h4>Kundenavn</h4>
</div>
<div class="col-md-4">
<h4>Postnr. Bynavn</h4>
</div>
<div class="col-md-2">
<h4>Status</h4>
</div>
</div>
</div>
@foreach (var order in _orders)
{
<a class="list-group-item list-group-item-action" href="warehouse/orders/@order.OrderId">
<div class="row">
<div class="col-md-2">
@order.OrderDate
</div>
<div class="col-md-4">
@order.Company.Name
</div>
<div class="col-md-4">
@order.Company.ZipCode @order.Company.City
</div>
<div class="col-md-2">
@switch (order.ProcessStatusEnum.ToLower())
{
case "none":
<span>Ubehandlet</span>
break;
case "picked":
<span>Plukket</span>
break;
case "packed":
<span>Pakket</span>
break;
case "shipped":
<span>Afsendt</span>
break;
}
</div>
</div>
</a>
}
</div>
}
<WarehouseListComponent />

View file

@ -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
{
<div>Ingen data</div>
<LoaderBallTriangle />
}

View file

@ -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<UserInfoView> 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<UserInfoView>(infoContent, _options);
if(write)

View file

@ -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<List<VirkRegInfo>>(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();

View file

@ -11,10 +11,10 @@
<PackageReference Include="Blazored.LocalStorage" Version="4.2.0" />
<PackageReference Include="Blazored.Toast" Version="3.2.2" />
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="6.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="6.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.5" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="6.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="6.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.7" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />

View file

@ -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": {

View file

@ -19,12 +19,12 @@
</head>
<body>
<div id="app">
<div class="spinner-border text-warning" role="status">
<span class="visually-hidden">Indlæser siden ...</span>
<div class="m-5 d-flex justify-content-center">
<!-- loader credit: samherbert.net/svg-loaders -->
<img src="svg-loaders/ball-triangle.svg" alt="loading ..."/>
</div>
</div>
<script src="/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="_framework/blazor.webassembly.js"></script>
</body>
</html>

View file

@ -0,0 +1,29 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="55" height="80" viewBox="0 0 55 80" xmlns="http://www.w3.org/2000/svg" fill="#ffaa00">
<g transform="matrix(1 0 0 -1 0 80)">
<rect width="10" height="20" rx="3">
<animate attributeName="height"
begin="0s" dur="4.3s"
values="20;45;57;80;64;32;66;45;64;23;66;13;64;56;34;34;2;23;76;79;20" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="15" width="10" height="80" rx="3">
<animate attributeName="height"
begin="0s" dur="2s"
values="80;55;33;5;75;23;73;33;12;14;60;80" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="30" width="10" height="50" rx="3">
<animate attributeName="height"
begin="0s" dur="1.4s"
values="50;34;78;23;56;23;34;76;80;54;21;50" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="45" width="10" height="30" rx="3">
<animate attributeName="height"
begin="0s" dur="2s"
values="30;45;13;80;56;72;45;76;34;23;67;30" calcMode="linear"
repeatCount="indefinite" />
</rect>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,47 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<!-- Todo: add easing -->
<svg width="57" height="57" viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg" stroke="#ffaa00">
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)" stroke-width="2">
<circle cx="5" cy="50" r="5">
<animate attributeName="cy"
begin="0s" dur="2.2s"
values="50;5;50;50"
calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="cx"
begin="0s" dur="2.2s"
values="5;27;49;5"
calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="27" cy="5" r="5">
<animate attributeName="cy"
begin="0s" dur="2.2s"
from="5" to="5"
values="5;50;50;5"
calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="cx"
begin="0s" dur="2.2s"
from="27" to="27"
values="27;49;5;27"
calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="49" cy="50" r="5">
<animate attributeName="cy"
begin="0s" dur="2.2s"
values="50;50;5;50"
calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="cx"
from="49" to="49"
begin="0s" dur="2.2s"
values="49;5;27;49"
calcMode="linear"
repeatCount="indefinite" />
</circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,52 @@
<svg width="135" height="140" viewBox="0 0 135 140" xmlns="http://www.w3.org/2000/svg" fill="#ffaa00">
<rect y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="30" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="60" width="15" height="140" rx="6">
<animate attributeName="height"
begin="0s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="90" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="120" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,20 @@
<svg width="135" height="135" viewBox="0 0 135 135" xmlns="http://www.w3.org/2000/svg" fill="#ffaa00">
<path d="M67.447 58c5.523 0 10-4.477 10-10s-4.477-10-10-10-10 4.477-10 10 4.477 10 10 10zm9.448 9.447c0 5.523 4.477 10 10 10 5.522 0 10-4.477 10-10s-4.478-10-10-10c-5.523 0-10 4.477-10 10zm-9.448 9.448c-5.523 0-10 4.477-10 10 0 5.522 4.477 10 10 10s10-4.478 10-10c0-5.523-4.477-10-10-10zM58 67.447c0-5.523-4.477-10-10-10s-10 4.477-10 10 4.477 10 10 10 10-4.477 10-10z">
<animateTransform
attributeName="transform"
type="rotate"
from="0 67 67"
to="-360 67 67"
dur="2.5s"
repeatCount="indefinite"/>
</path>
<path d="M28.19 40.31c6.627 0 12-5.374 12-12 0-6.628-5.373-12-12-12-6.628 0-12 5.372-12 12 0 6.626 5.372 12 12 12zm30.72-19.825c4.686 4.687 12.284 4.687 16.97 0 4.686-4.686 4.686-12.284 0-16.97-4.686-4.687-12.284-4.687-16.97 0-4.687 4.686-4.687 12.284 0 16.97zm35.74 7.705c0 6.627 5.37 12 12 12 6.626 0 12-5.373 12-12 0-6.628-5.374-12-12-12-6.63 0-12 5.372-12 12zm19.822 30.72c-4.686 4.686-4.686 12.284 0 16.97 4.687 4.686 12.285 4.686 16.97 0 4.687-4.686 4.687-12.284 0-16.97-4.685-4.687-12.283-4.687-16.97 0zm-7.704 35.74c-6.627 0-12 5.37-12 12 0 6.626 5.373 12 12 12s12-5.374 12-12c0-6.63-5.373-12-12-12zm-30.72 19.822c-4.686-4.686-12.284-4.686-16.97 0-4.686 4.687-4.686 12.285 0 16.97 4.686 4.687 12.284 4.687 16.97 0 4.687-4.685 4.687-12.283 0-16.97zm-35.74-7.704c0-6.627-5.372-12-12-12-6.626 0-12 5.373-12 12s5.374 12 12 12c6.628 0 12-5.373 12-12zm-19.823-30.72c4.687-4.686 4.687-12.284 0-16.97-4.686-4.686-12.284-4.686-16.97 0-4.687 4.686-4.687 12.284 0 16.97 4.686 4.687 12.284 4.687 16.97 0z">
<animateTransform
attributeName="transform"
type="rotate"
from="0 67 67"
to="360 67 67"
dur="8s"
repeatCount="indefinite"/>
</path>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,56 @@
<svg width="105" height="105" viewBox="0 0 105 105" xmlns="http://www.w3.org/2000/svg" fill="#ffaa00">
<circle cx="12.5" cy="12.5" r="12.5">
<animate attributeName="fill-opacity"
begin="0s" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="12.5" cy="52.5" r="12.5" fill-opacity=".5">
<animate attributeName="fill-opacity"
begin="100ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="52.5" cy="12.5" r="12.5">
<animate attributeName="fill-opacity"
begin="300ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="52.5" cy="52.5" r="12.5">
<animate attributeName="fill-opacity"
begin="600ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="92.5" cy="12.5" r="12.5">
<animate attributeName="fill-opacity"
begin="800ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="92.5" cy="52.5" r="12.5">
<animate attributeName="fill-opacity"
begin="400ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="12.5" cy="92.5" r="12.5">
<animate attributeName="fill-opacity"
begin="700ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="52.5" cy="92.5" r="12.5">
<animate attributeName="fill-opacity"
begin="500ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="92.5" cy="92.5" r="12.5">
<animate attributeName="fill-opacity"
begin="200ms" dur="1s"
values="1;.2;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,18 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="140" height="64" viewBox="0 0 140 64" xmlns="http://www.w3.org/2000/svg" fill="#ffaa00">
<path d="M30.262 57.02L7.195 40.723c-5.84-3.976-7.56-12.06-3.842-18.063 3.715-6 11.467-7.65 17.306-3.68l4.52 3.76 2.6-5.274c3.717-6.002 11.47-7.65 17.305-3.68 5.84 3.97 7.56 12.054 3.842 18.062L34.49 56.118c-.897 1.512-2.793 1.915-4.228.9z" fill-opacity=".5">
<animate attributeName="fill-opacity"
begin="0s" dur="1.4s"
values="0.5;1;0.5"
calcMode="linear"
repeatCount="indefinite" />
</path>
<path d="M105.512 56.12l-14.44-24.272c-3.716-6.008-1.996-14.093 3.843-18.062 5.835-3.97 13.588-2.322 17.306 3.68l2.6 5.274 4.52-3.76c5.84-3.97 13.592-2.32 17.307 3.68 3.718 6.003 1.998 14.088-3.842 18.064L109.74 57.02c-1.434 1.014-3.33.61-4.228-.9z" fill-opacity=".5">
<animate attributeName="fill-opacity"
begin="0.7s" dur="1.4s"
values="0.5;1;0.5"
calcMode="linear"
repeatCount="indefinite" />
</path>
<path d="M67.408 57.834l-23.01-24.98c-5.864-6.15-5.864-16.108 0-22.248 5.86-6.14 15.37-6.14 21.234 0L70 16.168l4.368-5.562c5.863-6.14 15.375-6.14 21.235 0 5.863 6.14 5.863 16.098 0 22.247l-23.007 24.98c-1.43 1.556-3.757 1.556-5.188 0z" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,17 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#ffaa00">
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)" stroke-width="2">
<circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
<path d="M36 18c0-9.94-8.06-18-18-18">
<animateTransform
attributeName="transform"
type="rotate"
from="0 18 18"
to="360 18 18"
dur="1s"
repeatCount="indefinite"/>
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 697 B

View file

@ -0,0 +1,37 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="44" height="44" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="#ffaa00">
<g fill="none" fill-rule="evenodd" stroke-width="2">
<circle cx="22" cy="22" r="1">
<animate attributeName="r"
begin="0s" dur="1.8s"
values="1; 20"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.165, 0.84, 0.44, 1"
repeatCount="indefinite" />
<animate attributeName="stroke-opacity"
begin="0s" dur="1.8s"
values="1; 0"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.3, 0.61, 0.355, 1"
repeatCount="indefinite" />
</circle>
<circle cx="22" cy="22" r="1">
<animate attributeName="r"
begin="-0.9s" dur="1.8s"
values="1; 20"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.165, 0.84, 0.44, 1"
repeatCount="indefinite" />
<animate attributeName="stroke-opacity"
begin="-0.9s" dur="1.8s"
values="1; 0"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.3, 0.61, 0.355, 1"
repeatCount="indefinite" />
</circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,42 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg" stroke="#ffaa00">
<g fill="none" fill-rule="evenodd" transform="translate(1 1)" stroke-width="2">
<circle cx="22" cy="22" r="6" stroke-opacity="0">
<animate attributeName="r"
begin="1.5s" dur="3s"
values="6;22"
calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="stroke-opacity"
begin="1.5s" dur="3s"
values="1;0" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="stroke-width"
begin="1.5s" dur="3s"
values="2;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="22" cy="22" r="6" stroke-opacity="0">
<animate attributeName="r"
begin="3s" dur="3s"
values="6;22"
calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="stroke-opacity"
begin="3s" dur="3s"
values="1;0" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="stroke-width"
begin="3s" dur="3s"
values="2;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="22" cy="22" r="8">
<animate attributeName="r"
begin="0s" dur="1.5s"
values="6;1;2;3;4;5;6"
calcMode="linear"
repeatCount="indefinite" />
</circle>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,55 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="58" height="58" viewBox="0 0 58 58" xmlns="http://www.w3.org/2000/svg">
<g fill="#ffaa00" fill-rule="evenodd">
<g transform="translate(2 1)" stroke="#FFF" stroke-width="1.5">
<circle cx="42.601" cy="11.462" r="5" fill-opacity="1" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="1;0;0;0;0;0;0;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="49.063" cy="27.063" r="5" fill-opacity="0" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="0;1;0;0;0;0;0;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="42.601" cy="42.663" r="5" fill-opacity="0" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="0;0;1;0;0;0;0;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="27" cy="49.125" r="5" fill-opacity="0" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="0;0;0;1;0;0;0;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="11.399" cy="42.663" r="5" fill-opacity="0" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="0;0;0;0;1;0;0;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="4.938" cy="27.063" r="5" fill-opacity="0" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="0;0;0;0;0;1;0;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="11.399" cy="11.462" r="5" fill-opacity="0" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="0;0;0;0;0;0;1;0" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="27" cy="5" r="5" fill-opacity="0" fill="#ffaa00">
<animate attributeName="fill-opacity"
begin="0s" dur="1.3s"
values="0;0;0;0;0;0;0;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,32 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient x1="8.042%" y1="0%" x2="65.682%" y2="23.865%" id="a">
<stop stop-color="#ffaa00" stop-opacity="0" offset="0%"/>
<stop stop-color="#ffaa00" stop-opacity=".631" offset="63.146%"/>
<stop stop-color="#ffaa00" offset="100%"/>
</linearGradient>
</defs>
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)">
<path d="M36 18c0-9.94-8.06-18-18-18" id="Oval-2" stroke="url(#a)" stroke-width="2">
<animateTransform
attributeName="transform"
type="rotate"
from="0 18 18"
to="360 18 18"
dur="0.9s"
repeatCount="indefinite" />
</path>
<circle fill="#ffaa00" cx="36" cy="18" r="1">
<animateTransform
attributeName="transform"
type="rotate"
from="0 18 18"
to="360 18 18"
dur="0.9s"
repeatCount="indefinite" />
</circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,33 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="120" height="30" viewBox="0 0 120 30" xmlns="http://www.w3.org/2000/svg" fill="#ffaa00">
<circle cx="15" cy="15" r="15">
<animate attributeName="r" from="15" to="15"
begin="0s" dur="0.8s"
values="15;9;15" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="fill-opacity" from="1" to="1"
begin="0s" dur="0.8s"
values="1;.5;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="60" cy="15" r="9" fill-opacity="0.3">
<animate attributeName="r" from="9" to="9"
begin="0s" dur="0.8s"
values="9;15;9" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="fill-opacity" from="0.5" to="0.5"
begin="0s" dur="0.8s"
values=".5;1;.5" calcMode="linear"
repeatCount="indefinite" />
</circle>
<circle cx="105" cy="15" r="15">
<animate attributeName="r" from="15" to="15"
begin="0s" dur="0.8s"
values="15;9;15" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="fill-opacity" from="1" to="1"
begin="0s" dur="0.8s"
values="1;.5;1" calcMode="linear"
repeatCount="indefinite" />
</circle>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -16,6 +16,11 @@ namespace Wonky.Entity.Configuration;
public class ApiConfig
{
/// <summary>
/// Application base url
/// </summary>
public string InnoBaseUrl { get; set; } = "";
/// <summary>
/// GLS tracking url
/// </summary>
@ -29,89 +34,97 @@ public class ApiConfig
/// <summary>
/// VAT registrar url Denmark
/// </summary>
public string VirkUrl { get; set; } = "";
public string ServiceVirk { get; set; } = "";
/// <summary>
/// VAT registrar url Norway
/// </summary>
public string BrRegUrl { get; set; } = "";
public string ServiceBrReg { get; set; } = "";
/// <summary>
/// VAT registrar url EU
/// </summary>
public string ViesUrl { get; set; } = "";
/// <summary>
/// Application base url
/// </summary>
public string InnoBaseUrl { get; set; } = "";
/// <summary>
/// Application uri for company information request
/// </summary>
public string CompanyUri { get; set; } = "";
/// <summary>
/// Application uri for product catalog request
/// </summary>
public string CatalogUri { get; set; } = "";
/// <summary>
/// Application uri for user information request
/// </summary>
public string UserInfoUri { get; set; } = "";
public string ServiceVies { get; set; } = "";
/// <summary>
/// Application uri for token request
/// </summary>
public string TokenUri { get; set; } = "";
public string CrmAuth { get; set; } = "";
/// <summary>
/// Application uri for user information request
/// </summary>
public string CrmUser { get; set; } = "";
/// <summary>
/// Application uri for product catalog request
/// </summary>
public string CrmCatalog { get; set; } = "";
/// <summary>
/// Application uri for activity request
/// </summary>
public string ActivityUri { get; set; } = "";
public string CrmSale { get; set; } = "";
/// <summary>
/// Application uri for sales report request
/// </summary>
public string ReportUri { get; set; } = "";
public string CrmReport { get; set; } = "";
/// <summary>
/// Application uri for task items request
/// </summary>
public string TaskUri { get; set; } = "";
public string CrmTask { get; set; } = "";
/// <summary>
/// Application uri for customer information request
/// </summary>
public string CrmCustomer { get; set; } = "";
/// <summary>
/// Application uri for customer product inventory request
/// </summary>
public string InventoryUri { get; set; } = "";
public string CrmInventory { get; set; } = "";
/// <summary>
/// Application uri for customer product sale request
/// </summary>
public string ProductUri { get; set; } = "";
public string CrmProduct { get; set; } = "";
/// <summary>
/// Application uri for updating customer product sale request
/// </summary>
public string SyncUri { get; set; } = "";
public string CrmSync { get; set; } = "";
/// <summary>
/// Application uri for administration of sales representatives
/// </summary>
public string AdminAdvisorUri { get; set; } = "";
public string AdminUser { get; set; } = "";
/// <summary>
/// Application uri for administration of administrative users
/// </summary>
public string AdminUserUri { get; set; } = "";
public string AdminOffice { get; set; } = "";
/// <summary>
/// Application uri for administrative reset of user credentials
/// </summary>
public string AdminPasswdUri { get; set; } = "";
public string AdminPasswd { get; set; } = "";
public string WarehouseUri { get; set; } = "";
/// <summary>
/// Uri for warehouse requests
/// </summary>
public string Warehouse { get; set; } = "";
// /// <summary>
// /// Application uri for reading salesReports
// /// </summary>
// public string AdminReport { get; set; } = "";
//
// /// <summary>
// /// Application uri for handling external customer login
// /// </summary>
// public string AdminCompany { get; set; } = "";
// public string KrvVariantsUri { get; set; } = "";
// public string KrvProductsUri { get; set; } = "";

BIN
icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB