wip v.0.8.7

This commit is contained in:
Frede Hundewadt 2022-06-18 10:35:58 +02:00
parent dd936c75ef
commit e86e7719c5
19 changed files with 226 additions and 148 deletions

View file

@ -11,7 +11,7 @@
<img class="state the-good rounded-circle me-1" src="state.png" alt="state"/>
</td>
<td class="align-middle">
Ok
Er besøgt.
</td>
</tr>
<tr>
@ -19,7 +19,7 @@
<img class="state the-bad rounded-circle me-1" src="state.png" alt="state"/>
</td>
<td class="align-middle">
Planlæg besøg
Planlæg besøg.
</td>
</tr>
<tr>
@ -27,7 +27,7 @@
<img class="state the-ugly rounded-circle me-1" src="state.png" alt="state"/>
</td>
<td class="align-middle">
Interval overskredet
Besøges nu!
</td>
</tr>
<tr>
@ -35,7 +35,7 @@
<img class="state the-draw rounded-circle me-1" src="state.png" alt="state"/>
</td>
<td class="align-middle">
Opdatering nødvendig
Opdater besøgsdato og/eller CVR/ORG nummer.
</td>
</tr>
<tr>
@ -43,7 +43,7 @@
<img class="state the-dead rounded-circle me-1" src="state.png" alt="state"/>
</td>
<td class="align-middle">
Virksomhed ophørt
Virksomhed ophørt!
</td>
</tr>
</tbody>

View file

@ -1,4 +1,3 @@
@using Microsoft.AspNetCore.Authorization
@*
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
@ -16,58 +15,19 @@
//
*@
@using Microsoft.AspNetCore.Authorization
<PageTitle>Inno Web CRM</PageTitle>
<AuthorizeView>
<Authorized>
<div class="row mb-1 align-items-center">
<div class="col-md-4">
<span class="workDate">@(string.IsNullOrWhiteSpace(_workDate) ? "" : $"{DateTime.Parse(_workDate).ToLongDateString()}")</span>
</div>
<div class="col-md-4">
<WorkDateComponent OnChanged="GetActivities"></WorkDateComponent>
<div class="card">
<div class="card-header">
<div class="row">
<div class="col">
<h3>Kalender</h3>
</div>
<div class="col">
<WorkDateComponent OnChanged="GetCalender"></WorkDateComponent>
</div>
</div>
<hr />
<h5>Dagens aktivitet</h5>
<table class="table">
<thead>
<tr class="align-items-center">
<th scope="col">Kunde</th>
<th scope="col">Demo</th>
<th scope="col">Salg</th>
<th scope="col">Sum</th>
</tr>
</thead>
<tbody>
@if (_view != null)
{
foreach (var activity in _view.Activities)
{
<tr class="align-items-center">
<td>
@activity.Company.Name
</td>
<td>
@activity.Demo
</td>
<td>
@activity.SalesResume
</td>
<td>
@activity.OrderAmount
</td>
</tr>
}
}
</tbody>
</table>
</Authorized>
<NotAuthorized>
<a href="/login">Login</a>
</NotAuthorized>
</AuthorizeView>
</div>
</div>

View file

@ -34,10 +34,7 @@ public partial class Home : IDisposable
[Inject] public UserPreferenceService UserPrefs { get; set; }
[Inject] public ILogger<Home> Logger { get; set; }
[Inject] private HttpInterceptorService Interceptor { get; set; }
[Inject] private NavigationManager Navigator { get; set; }
[Inject] private IActivityHttpRepository ActivityRepo { get; set; }
[Inject] private IToastService _toast { get; set; }
private NgActivityListView _view { get; set; } = new();
private Preferences _prefs { get; set; } = new();
private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
@ -50,15 +47,12 @@ public partial class Home : IDisposable
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
await GetActivities(_workDate);
await GetCalender(_workDate);
}
private async Task GetActivities(string workDate)
private async Task GetCalender(string workDate)
{
_toast.ShowInfo("Vent nogle sekunder for data");
_workDate = workDate;
_view = new NgActivityListView();
_view = await ActivityRepo.GetActivities(workDate);
}
public void Dispose()

View file

@ -62,7 +62,7 @@ namespace Wonky.Client.HttpInterceptors
_interceptor.BeforeSendAsync -= InterceptBeforeSendAsync;
}
public async Task InterceptBeforeSendAsync(object sender, HttpClientInterceptorEventArgs e)
private async Task InterceptBeforeSendAsync(object sender, HttpClientInterceptorEventArgs e)
{
var absolutePath = e.Request.RequestUri.AbsolutePath;
@ -78,27 +78,24 @@ namespace Wonky.Client.HttpInterceptors
}
}
public void AfterSend (object sender, HttpClientInterceptorEventArgs e)
private void AfterSend (object sender, HttpClientInterceptorEventArgs e)
{
if (e.Response == null || e.Response.IsSuccessStatusCode)
return;
string message;
var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri);
if (currDoc.Contains("login"))
currDoc = "/";
switch (e.Response.StatusCode)
{
case HttpStatusCode.NotFound:
//_navigation.NavigateTo("/404");
message = "Der er ingen data ...";
message = "Der var ingen data ...";
_toast.ShowInfo(message);
break;
case HttpStatusCode.BadRequest:
ClearInfo();
_navigation.NavigateTo($"/login/{currDoc}");
message = "Login info skal fornyes ...";
_toast.ShowInfo(message);
break;
case HttpStatusCode.Unauthorized:
ClearInfo();
_navigation.NavigateTo($"/login/{currDoc}");

View file

@ -19,6 +19,7 @@
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser")]
@using Wonky.Client.Components
<div class="row mb-2 align-items-center">
<div class="col">
<h5 style="font-variant: small-caps">@_workDate.ToLongDateString()</h5>

View file

@ -0,0 +1,66 @@
@*
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
*@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Adviser")]
@page "/activity-today"
<div class="row mb-1 align-items-center">
<div class="col-md-4">
<span class="workDate">@(string.IsNullOrWhiteSpace(_workDate) ? "" : $"{DateTime.Parse(_workDate).ToLongDateString()}")</span>
</div>
<div class="col-md-4">
<WorkDateComponent OnChanged="GetActivities"></WorkDateComponent>
</div>
<div class="col">
</div>
</div>
<hr/>
<h5>Dagens aktivitet</h5>
<table class="table">
<thead>
<tr class="align-items-center">
<th scope="col">Kunde</th>
<th scope="col">Demo</th>
<th scope="col">Salg</th>
<th scope="col">Sum</th>
</tr>
</thead>
<tbody>
@if (_view != null)
{
foreach (var activity in _view.Activities)
{
<tr class="align-items-center">
<td>
@activity.Company.Name
</td>
<td>
@activity.Demo
</td>
<td>
@activity.SalesResume
</td>
<td>
@activity.OrderAmount
</td>
</tr>
}
}
</tbody>
</table>

View file

@ -0,0 +1,48 @@
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components;
using Wonky.Client.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Client.Services;
using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class ActivityToday
{
[Inject] public UserPreferenceService UserPrefs { get; set; }
[Inject] public ILogger<Home> Logger { get; set; }
[Inject] private HttpInterceptorService Interceptor { get; set; }
[Inject] private NavigationManager Navigator { get; set; }
[Inject] private IActivityHttpRepository ActivityRepo { get; set; }
[Inject] private IToastService _toast { get; set; }
private NgActivityListView _view { get; set; } = new();
private Preferences _prefs { get; set; } = new();
private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
protected override async Task OnInitializedAsync()
{
_prefs = await UserPrefs.GetPreferences();
if(!string.IsNullOrWhiteSpace(_prefs.WorkDate))
_workDate = _prefs.WorkDate;
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
await GetActivities(_workDate);
}
private async Task GetActivities(string workDate)
{
_toast.ShowInfo("Vent nogle sekunder for data");
_workDate = workDate;
_view = new NgActivityListView();
_view = await ActivityRepo.GetActivities(workDate);
}
public void Dispose()
{
Interceptor.DisposeEvent();
}
}

View file

@ -69,7 +69,9 @@
<th>
CVR/ORG
</th>
<td class="state"><DisplayStateComponent StateClass="@_vatState"></DisplayStateComponent></td>
<td class="state">
<DisplayStateComponent StateClass="@_vatState"></DisplayStateComponent>
</td>
<td>
<InputText id="vatNumber" class="form-control" @bind-Value="_companyView.VatNumber"/>
<ValidationMessage For="@(() => _companyView.VatNumber)"></ValidationMessage>
@ -154,7 +156,9 @@
<th>
Næste besøg
</th>
<td class="state"><DisplayStateComponent StateClass="@(_hasFolded ? "the-dead" : Utils.GetVisitState($"{_companyView.NextVisit}"))"> </DisplayStateComponent></td>
<td class="state">
<DisplayStateComponent StateClass="@(_hasFolded ? "the-dead" : Utils.GetVisitState($"{_companyView.NextVisit}"))"> </DisplayStateComponent>
</td>
<td>
<InputDate id="nextVisit" class="form-control" @bind-Value="@(_nextVisit)"/>
<ValidationMessage For="@(() => _companyView.NextVisit)">Dato kan ikke vær før sidste besøg</ValidationMessage>

View file

@ -21,6 +21,7 @@
@using Wonky.Client.Helpers
@attribute [Authorize(Roles = "Adviser")]
@if (_companyDto != null)
{
<div class="card">
@ -81,5 +82,5 @@
}
else
{
<AppSpinner/>
<AppSpinner/>
}

View file

@ -21,6 +21,7 @@
@using System.Xml
@attribute [Authorize(Roles = "Adviser")]
<h2>Opret kunde</h2>
<table class="table">
<thead>
@ -69,7 +70,9 @@
<td class="align-middle">@info.Name</td>
<td class="align-middle">@info.States[^1].State</td>
<td class="align-middle"></td>
<td class="align-middle"><button class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber))">OVERFØR</button></td>
<td class="align-middle">
<button class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber))">OVERFØR</button>
</td>
</tr>
}
</tbody>
@ -81,7 +84,7 @@
</table>
<EditForm EditContext="_editContext" OnValidSubmit="SubmitCompanyForm">
<DataAnnotationsValidator />
<DataAnnotationsValidator/>
<InputText type="hidden" id="salesRepId" @bind-Value="_companyObject.SalesRepId"/>
<table class="table">
<thead>
@ -123,7 +126,9 @@
<tbody>
<tr>
<td class="align-middle">Moms/Org Reg.</td>
<td class="align-middle state"><DisplayStateComponent StateClass="@RegState"></DisplayStateComponent></td>
<td class="align-middle state">
<DisplayStateComponent StateClass="@RegState"></DisplayStateComponent>
</td>
<td class="align-middle">
<InputText id="vatNumber" class="form-control" @bind-Value="_companyObject.VatNumber"/>
<ValidationMessage For="@(() => _companyObject.VatNumber)"></ValidationMessage>

View file

@ -18,36 +18,38 @@
@using Wonky.Client.Components
@using Microsoft.Extensions.Options
@using Wonky.Entity.Configuration
@using Microsoft.AspNetCore.Authorization
@page "/info"
<AuthorizeView>
<Authorized>
<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>
Det anbefales at bruge en Chrome baseret browser f.eks. Edge, Safari, Vivaldi, Chrome eller Chromium
</div>
</div>
<div class="row">
<div class="col">
<ColorCoding></ColorCoding>
</div>
</div>
<div class="row">
<div class="col">
<h5>
App version <AppVersion></AppVersion>
</h5>
</div>
</div>
</Authorized>
</AuthorizeView>
@attribute [Authorize(Roles = "Adviser,Admin")]
<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>
Det anbefales at bruge en Chrome baseret browser f.eks. Edge, Safari, Vivaldi, Chrome eller Chromium
</div>
</div>
<div class="row">
<div class="col">
<ColorCoding></ColorCoding>
</div>
</div>
<div class="row">
<div class="col">
<h5>
App version <AppVersion></AppVersion>
</h5>
</div>
</div>
@code{
[Inject] IOptions<AppInfo>? AppInfo { get; set; }
[Inject]
IOptions<AppInfo>? AppInfo { get; set; }
private AppInfo? _app;
protected override void OnInitialized()
@ -56,4 +58,3 @@
}
}

View file

@ -26,10 +26,10 @@
<ItemGroupDropdown OnChanged="SetItemGroup"/>
</div>
<div class="col">
<ItemSearchDropdown OnChanged="SetSearchCol"/>
<ItemSearchDropdown OnChanged="SetSearchCol"/>
</div>
<div class="col">
<SearchPhrase OnChanged="SetSearchPhrase"/>
<SearchPhrase OnChanged="SetSearchPhrase"/>
</div>
<div class="col">
<ItemSortDropdown OnChanged="SetSortCol"/>

View file

@ -18,6 +18,8 @@
@page "/sales-item/{salesItemId}"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser,Admin")]
<div class="card">
<div class="card-header">
<h1>@Item.Name</h1>

View file

@ -17,7 +17,6 @@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Adviser")]
@page "/sales-report"
<EditForm EditContext="_editContext">
@ -62,15 +61,15 @@
<option value="sickLeave">Sygdom</option>
<option value="leave">Ferie</option>
</select>
<ValidationMessage For="@(() => _report.DayTypeEnum)" />
<ValidationMessage For="@(() => _report.DayTypeEnum)"/>
</td>
@if (_report.DayTypeEnum.ToLower().Contains("leave"))
{
<td>
<InputDate class="form-control" @bind-Value="_leaveBegin" />
<InputDate class="form-control" @bind-Value="_leaveBegin"/>
</td>
<td>
<InputDate class="form-control" @bind-Value="_leaveEnd" />
<InputDate class="form-control" @bind-Value="_leaveEnd"/>
</td>
}
else
@ -86,11 +85,15 @@
}
<th>
<button type="button" class="btn btn-info"
@onclick="InitializeReport" disabled="@(!_noFigures)">Nøgletal</button>
@onclick="InitializeReport" disabled="@(!_noFigures)">
Nøgletal
</button>
</th>
<td>
<button type="button" class="btn btn-info"
@onclick="SubmitReport" disabled="@(_noFigures)">Gem Rapport</button>
@onclick="SubmitReport" disabled="@(_noFigures)">
Gem Rapport
</button>
</td>
</tr>
</tbody>
@ -108,11 +111,11 @@
<tr>
<td>
<InputTextArea id="description" class="form-control" @bind-Value="_report.Description"/>
<ValidationMessage For="@(() => _report.Description)" />
<ValidationMessage For="@(() => _report.Description)"/>
</td>
<td>
<InputText id="supervisedBy" class="form-control" @bind-Value="_report.SupervisedBy"/>
<ValidationMessage For="@(() => _report.SupervisedBy)" />
<ValidationMessage For="@(() => _report.SupervisedBy)"/>
</td>
</tr>
@ -130,15 +133,15 @@
<tr>
<td>
<InputNumber class="form-control" @bind-Value="@_report.Figures.KmEvening"
disabled="@(_noFigures)" />
disabled="@(_noFigures)"/>
</td>
<td>
<InputNumber class="form-control" @bind-Value="@_report.Figures.KmMorning"
disabled="@(_noFigures)" />
disabled="@(_noFigures)"/>
</td>
<td>
<InputNumber class="form-control" @bind-Value="@_report.Figures.DistancePrivate"
disabled="@(_noFigures)" />
disabled="@(_noFigures)"/>
</td>
</tr>
</tbody>
@ -247,4 +250,3 @@
</div>
</div>
</EditForm>

View file

@ -4,7 +4,6 @@
@attribute [Authorize(Roles = "Adviser,Admin,Supervisor")]
<WorkDateComponent OnChanged="GetReport"></WorkDateComponent>
<div>
@if (_report.Activities.Any())
{
@ -101,9 +100,6 @@
<td>@(_report.Report.TotalSaleCountMonth)</td>
<td>@(_report.Report.TotalTurnoverMonth)</td>
</tr>
</tbody>
</table>
</div>

View file

@ -30,10 +30,6 @@
<div class="content px-4">
@Body
</div>
<BlazoredToasts Position="ToastPosition.BottomCenter"
Timeout="3"
IconType="IconType.FontAwesome"
SuccessIcon="oi oi-thumb-up"
ErrorIcon="oi oi-bug" />
<BlazoredToasts Position="ToastPosition.BottomCenter" Timeout="2"/>
</main>
</div>

View file

@ -34,7 +34,7 @@
<AuthorizeView>
<NotAuthorized>
<div class="nav-item px-3">
<NavLink class="nav-link" href="login">
<NavLink class="nav-link ps-2" href="login">
<span class="oi oi-account-login"></span> Log ind
</NavLink>
</div>
@ -43,28 +43,33 @@
<AuthorizeView Roles="Adviser,Admin">
<Authorized>
<div class="nav-item px-3">
<NavLink class="nav-link" href="/" Match="NavLinkMatch.All">
<span class="oi oi-dashboard" aria-hidden="true"></span> Start
<NavLink class="nav-link ps-2" href="/home" Match="NavLinkMatch.All">
<span class="oi oi-dashboard" aria-hidden="true"></span> ToDo
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="companies">
<NavLink class="nav-link ps-2" href="/activity-today" Match="NavLinkMatch.All">
<span class="oi oi-dashboard" aria-hidden="true"></span> Aktivitet
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="companies">
<span class="oi oi-file" aria-hidden="true"></span> Firmaer
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="price-catalog">
<NavLink class="nav-link ps-2" href="price-catalog">
<span class="oi oi-spreadsheet" aria-hidden="true"></span> Priskatalog
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="sales-report">
<NavLink class="nav-link ps-2" href="sales-report">
<span class="oi oi-document" aria-hidden="true"></span> Dagsrapport
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="info">
<NavLink class="nav-link ps-2" href="info">
<span class="oi oi-question-mark" aria-hidden="true"></span> Hjælp
</NavLink>
</div>

View file

@ -18,7 +18,7 @@
},
"appInfo": {
"name": "Wonky Client",
"version": "0.8.6",
"version": "0.8.7",
"isBeta": true,
"image": "grumpy-coder.png"
},