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

View file

@ -1,4 +1,3 @@
@using Microsoft.AspNetCore.Authorization
@* @*
// Copyright (C) 2022 FCS Frede's Computer Services. // Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify // 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> <PageTitle>Inno Web CRM</PageTitle>
<AuthorizeView> <div class="card">
<Authorized> <div class="card-header">
<div class="row mb-1 align-items-center"> <div class="row">
<div class="col-md-4"> <div class="col">
<span class="workDate">@(string.IsNullOrWhiteSpace(_workDate) ? "" : $"{DateTime.Parse(_workDate).ToLongDateString()}")</span> <h3>Kalender</h3>
</div>
<div class="col-md-4">
<WorkDateComponent OnChanged="GetActivities"></WorkDateComponent>
</div> </div>
<div class="col"> <div class="col">
<WorkDateComponent OnChanged="GetCalender"></WorkDateComponent>
</div> </div>
</div> </div>
</div>
<hr /> </div>
<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>

View file

@ -34,10 +34,7 @@ public partial class Home : IDisposable
[Inject] public UserPreferenceService UserPrefs { get; set; } [Inject] public UserPreferenceService UserPrefs { get; set; }
[Inject] public ILogger<Home> Logger { get; set; } [Inject] public ILogger<Home> Logger { get; set; }
[Inject] private HttpInterceptorService Interceptor { 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; } [Inject] private IToastService _toast { get; set; }
private NgActivityListView _view { get; set; } = new();
private Preferences _prefs { get; set; } = new(); private Preferences _prefs { get; set; } = new();
private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}"; private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
@ -50,15 +47,12 @@ public partial class Home : IDisposable
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); 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; _workDate = workDate;
_view = new NgActivityListView();
_view = await ActivityRepo.GetActivities(workDate);
} }
public void Dispose() public void Dispose()

View file

@ -62,7 +62,7 @@ namespace Wonky.Client.HttpInterceptors
_interceptor.BeforeSendAsync -= InterceptBeforeSendAsync; _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; 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) if (e.Response == null || e.Response.IsSuccessStatusCode)
return; return;
string message; string message;
var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri); var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri);
if (currDoc.Contains("login"))
currDoc = "/";
switch (e.Response.StatusCode) switch (e.Response.StatusCode)
{ {
case HttpStatusCode.NotFound: case HttpStatusCode.NotFound:
//_navigation.NavigateTo("/404"); //_navigation.NavigateTo("/404");
message = "Der er ingen data ..."; message = "Der var ingen data ...";
_toast.ShowInfo(message); _toast.ShowInfo(message);
break; break;
case HttpStatusCode.BadRequest: case HttpStatusCode.BadRequest:
ClearInfo();
_navigation.NavigateTo($"/login/{currDoc}");
message = "Login info skal fornyes ...";
_toast.ShowInfo(message);
break;
case HttpStatusCode.Unauthorized: case HttpStatusCode.Unauthorized:
ClearInfo(); ClearInfo();
_navigation.NavigateTo($"/login/{currDoc}"); _navigation.NavigateTo($"/login/{currDoc}");

View file

@ -19,6 +19,7 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser")] @attribute [Authorize(Roles = "Adviser")]
@using Wonky.Client.Components @using Wonky.Client.Components
<div class="row mb-2 align-items-center"> <div class="row mb-2 align-items-center">
<div class="col"> <div class="col">
<h5 style="font-variant: small-caps">@_workDate.ToLongDateString()</h5> <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> <th>
CVR/ORG CVR/ORG
</th> </th>
<td class="state"><DisplayStateComponent StateClass="@_vatState"></DisplayStateComponent></td> <td class="state">
<DisplayStateComponent StateClass="@_vatState"></DisplayStateComponent>
</td>
<td> <td>
<InputText id="vatNumber" class="form-control" @bind-Value="_companyView.VatNumber"/> <InputText id="vatNumber" class="form-control" @bind-Value="_companyView.VatNumber"/>
<ValidationMessage For="@(() => _companyView.VatNumber)"></ValidationMessage> <ValidationMessage For="@(() => _companyView.VatNumber)"></ValidationMessage>
@ -154,7 +156,9 @@
<th> <th>
Næste besøg Næste besøg
</th> </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> <td>
<InputDate id="nextVisit" class="form-control" @bind-Value="@(_nextVisit)"/> <InputDate id="nextVisit" class="form-control" @bind-Value="@(_nextVisit)"/>
<ValidationMessage For="@(() => _companyView.NextVisit)">Dato kan ikke vær før sidste besøg</ValidationMessage> <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 @using Wonky.Client.Helpers
@attribute [Authorize(Roles = "Adviser")] @attribute [Authorize(Roles = "Adviser")]
@if (_companyDto != null) @if (_companyDto != null)
{ {
<div class="card"> <div class="card">
@ -81,5 +82,5 @@
} }
else else
{ {
<AppSpinner/> <AppSpinner/>
} }

View file

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

View file

@ -18,10 +18,11 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.Extensions.Options @using Microsoft.Extensions.Options
@using Wonky.Entity.Configuration @using Wonky.Entity.Configuration
@using Microsoft.AspNetCore.Authorization
@page "/info" @page "/info"
<AuthorizeView>
<Authorized> @attribute [Authorize(Roles = "Adviser,Admin")]
<div class="row mb-2"> <div class="row mb-2">
<div class="col col-md-2"> <div class="col col-md-2">
<img class="grumpy-coder" src="@_app?.Image" alt="Wonky Logo"/> <img class="grumpy-coder" src="@_app?.Image" alt="Wonky Logo"/>
</div> </div>
@ -29,25 +30,26 @@
<h5>Browservalg</h5> <h5>Browservalg</h5>
Det anbefales at bruge en Chrome baseret browser f.eks. Edge, Safari, Vivaldi, Chrome eller Chromium Det anbefales at bruge en Chrome baseret browser f.eks. Edge, Safari, Vivaldi, Chrome eller Chromium
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<ColorCoding></ColorCoding> <ColorCoding></ColorCoding>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<h5> <h5>
App version <AppVersion></AppVersion> App version <AppVersion></AppVersion>
</h5> </h5>
</div> </div>
</div> </div>
</Authorized>
</AuthorizeView>
@code{ @code{
[Inject] IOptions<AppInfo>? AppInfo { get; set; } [Inject]
IOptions<AppInfo>? AppInfo { get; set; }
private AppInfo? _app; private AppInfo? _app;
protected override void OnInitialized() protected override void OnInitialized()
@ -56,4 +58,3 @@
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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