overlay customer activity list view and single view

This commit is contained in:
Frede Hundewadt 2023-01-30 14:20:42 +01:00
parent 709ca5d90b
commit fc0682c747
39 changed files with 411 additions and 122 deletions

View file

@ -38,7 +38,7 @@
@foreach (var activity in ActivityList) @foreach (var activity in ActivityList)
{ {
<tr> <tr>
<td class="align-middle"><a class="btn btn-outline-info text-black d-block" href="/advisor/customers/@activity.Company.CompanyId/orders/@activity.ActivityId">@activity.Company.Name</a></td> <td class="align-middle"><a href="/advisor/customers/@activity.Company.CompanyId/orders/@activity.ActivityId">@activity.Company.Name</a></td>
<td class="align-middle">@activity.Company.City</td> <td class="align-middle">@activity.Company.City</td>
<td class="align-middle">@activity.Demo</td> <td class="align-middle">@activity.Demo</td>
<td class="align-middle">@activity.Sales</td> <td class="align-middle">@activity.Sales</td>

View file

@ -0,0 +1,75 @@
@*
// 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]
//
*@
<div class="list-group">
<div class="list-group-item">
<div class="row">
<div class="col">
<h4>Dato</h4>
</div>
<div class="col">
<h4>Demo</h4>
</div>
<div class="col">
<h4>Salg</h4>
</div>
<div class="col">
<h4>Ordre Note</h4>
</div>
<div class="col">
<h4>Ordre Note</h4>
</div>
</div>
</div>
@if (Activities.Any())
{
@foreach (var activity in Activities)
{
<div class="list-group-item list-group-item-action" style="cursor: pointer" @onclick="() => ShowVisitOverlay(activity.ActivityId)">
<div class="row">
<div class="col">
@activity.OrderDate
</div>
<div class="col">
@activity.Demo
</div>
<div class="col">
@activity.Sales
</div>
<div class="col">
@activity.OfficeNote
</div>
<div class="col">
@activity.CrmNote
</div>
</div>
</div>
}
}
else
{
<div class="list-group-item">
<div class="row">
<div class="col">
Ingen data
</div>
</div>
</div>
}
</div>
<CustomerActivityViewModalOverlay ReportItem="Activity" @ref="ActivityViewOverlay"/>

View file

@ -0,0 +1,41 @@
// 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 System.Globalization;
using System.Runtime.InteropServices;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterfaces;
using Wonky.Client.Models;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Components;
public partial class CustomerVisitListComponent
{
[Parameter] public List<ReportItemView> Activities { get; set; } = new();
private CustomerActivityViewModalOverlay ActivityViewOverlay { get; set; } = new();
private ReportItemView Activity { get; set; } = new();
private void ShowVisitOverlay(string activityId)
{
Activity = Activities.First(x => x.ActivityId == activityId);
ActivityViewOverlay.Show();
}
}

View file

@ -22,7 +22,7 @@
<thead> <thead>
<tr> <tr>
<th class="p-0" colspan="4"> <th class="p-0" colspan="4">
<div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2"> <div class="alert d-print-block border border-1 border-dark pt-3 mb-2">
<h2 class="fw-bold text-center">@ReportItem.Company.Name</h2> <h2 class="fw-bold text-center">@ReportItem.Company.Name</h2>
@if (ReportItem.Express) @if (ReportItem.Express)
{ {
@ -134,10 +134,10 @@
</table> </table>
@if (!string.IsNullOrWhiteSpace(@ReportItem.OfficeNote)) @if (!string.IsNullOrWhiteSpace(@ReportItem.OfficeNote))
{ {
<div class="alert alert-dark d-print-block"> <div class="alert d-print-block border border-1 border-dark">
<h4 class="text-center"> <p class="text-center h4">
@ReportItem.OfficeNote @ReportItem.OfficeNote
</h4> </p>
</div> </div>
} }
</div> </div>

View file

@ -20,7 +20,7 @@
@attribute [Authorize(Roles = "Advisor")] @attribute [Authorize(Roles = "Advisor")]
@page "/advisor/customers/{CompanyId}/activities/new" @page "/advisor/customers/{CompanyId}/activities/new"
<PageTitle>Rådgiver Opret Aktivetet for @Company.Name</PageTitle> <PageTitle>Ny aktivitet - @Company.Name</PageTitle>
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center"> <div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center">
<div class="col"> <div class="col">
@ -161,7 +161,8 @@ else
<button class="btn btn-danger" disabled="@string.IsNullOrWhiteSpace(Activity.ActivityTypeEnum)" @onclick="ShowInvoiceOverlay">Faktura</button> <button class="btn btn-danger" disabled="@string.IsNullOrWhiteSpace(Activity.ActivityTypeEnum)" @onclick="ShowInvoiceOverlay">Faktura</button>
</div> </div>
<div class="col-sm-3 d-grid mx-auto"> <div class="col-sm-3 d-grid mx-auto">
<button class="btn btn-warning" disabled>Tidl. besøg</button> <button class="btn btn-warning" disabled="@string.IsNullOrWhiteSpace(Activity.ActivityTypeEnum)" @onclick="ShowVisitOverlay">Tidl. besøg</button>
@* <button class="btn btn-warning" disabled @onclick="ShowVisitOverlay">Tidl. besøg</button> *@
</div> </div>
<div class="col-sm-3 d-grid mx-auto"> <div class="col-sm-3 d-grid mx-auto">
<button class="btn btn-success" disabled="@string.IsNullOrWhiteSpace(Activity.ActivityTypeEnum)" @onclick="ShowInventoryOverlay">Produkter</button> <button class="btn btn-success" disabled="@string.IsNullOrWhiteSpace(Activity.ActivityTypeEnum)" @onclick="ShowInventoryOverlay">Produkter</button>
@ -335,21 +336,23 @@ else
</div> </div>
} }
<ConfirmWorkDateOverlay BodyMessage="@PromptDateConfirm" <ConfirmWorkDateModalOverlay BodyMessage="@PromptDateConfirm"
OnOkClicked="WorkDateConfirmCallback" @ref="WorkDateOverlay"/> OnOkClicked="WorkDateConfirmCallback" @ref="WorkDateOverlay"/>
<PriceCatalogOverlay CountryCode="@Company.CountryCode.ToLower()" <PriceCatalogModalOverlay CountryCode="@Company.CountryCode.ToLower()"
OnSelected="PriceListCallback" @ref="CatalogOverlay"/> OnSelected="PriceListCallback" @ref="CatalogOverlay"/>
<ProductHistoryOverlay CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="ProductOverlay"/> <ProductHistoryModalOverlay CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="ProductOverlay"/>
<ProductPriceHistoryModal CompanyId="@CompanyId" Sku="@SelectedItem.Sku" <ProductPriceHistoryModal CompanyId="@CompanyId" Sku="@SelectedItem.Sku"
OnSelected="PriceHistoryCallback" @ref="PriceOverlay"/> OnSelected="PriceHistoryCallback" @ref="PriceOverlay"/>
<ConfirmProductCheckOverlay BodyMessage="" CompanyId="@CompanyId" Products="CheckList" <ConfirmProductCheckModalOverlay BodyMessage="" CompanyId="@CompanyId" Products="CheckList"
OnOkClicked="ConfirmProductCheckCallback" @ref="ProductCheckOverlay" /> OnOkClicked="ConfirmProductCheckCallback" @ref="ProductCheckOverlay" />
<CustomerInvoiceOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceOverlay" /> <CustomerInvoiceModalOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceOverlay" />
<CustomerInventoryOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode" <CustomerInventoryModalOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
OnInventorySelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryOverlay" /> OnInventorySelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryOverlay" />
<CustomerActivityListModalOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay" />

View file

@ -39,10 +39,10 @@ public partial class AdvisorActivityCreatePage : IDisposable
[Inject] private IToastService Toaster { get; set; } [Inject] private IToastService Toaster { get; set; }
[Inject] private NavigationManager Navigator { get; set; } [Inject] private NavigationManager Navigator { get; set; }
[Inject] private ILocalStorageService Storage { get; set; } [Inject] private ILocalStorageService Storage { get; set; }
[Inject] private ICountryCatalogRepository Catalog { get; set; } [Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
[Inject] private IAdvisorCustomerRepository Companies { get; set; } [Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; }
[Inject] private IAdvisorActivityRepository Actitivites { get; set; } [Inject] private IAdvisorActivityRepository ActivityRepo { get; set; }
[Inject] private IAdvisorReportRepository Reports { get; set; } [Inject] private IAdvisorReportRepository ReportRepo { get; set; }
[Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } [Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
[CascadingParameter] private DraftStateProvider DraftProvider { get; set; } = new(); [CascadingParameter] private DraftStateProvider DraftProvider { get; set; } = new();
@ -71,18 +71,20 @@ public partial class AdvisorActivityCreatePage : IDisposable
private string PromptDateConfirm { get; set; } = ""; private string PromptDateConfirm { get; set; } = "";
// OVERLAY PAGES // OVERLAY PAGES
private PriceCatalogOverlay CatalogOverlay { get; set; } = new(); private PriceCatalogModalOverlay CatalogOverlay { get; set; } = new();
private ProductHistoryOverlay ProductOverlay { get; set; } = new(); private ProductHistoryModalOverlay ProductOverlay { get; set; } = new();
private ProductPriceHistoryModal PriceOverlay { get; set; } = new(); private ProductPriceHistoryModal PriceOverlay { get; set; } = new();
private ConfirmWorkDateOverlay WorkDateOverlay { get; set; } = new(); private ConfirmWorkDateModalOverlay WorkDateOverlay { get; set; } = new();
private ConfirmProductCheckOverlay ProductCheckOverlay { get; set; } = new(); private ConfirmProductCheckModalOverlay ProductCheckOverlay { get; set; } = new();
private CustomerInvoiceOverlay InvoiceOverlay { get; set; } = new(); private CustomerInvoiceModalOverlay InvoiceOverlay { get; set; } = new();
private CustomerInventoryOverlay InventoryOverlay { get; set; } = new(); private CustomerInventoryModalOverlay InventoryOverlay { get; set; } = new();
private CustomerActivityListModalOverlay ActivityListOverlay { get; set; } = new();
private List<ProductInventoryView> Inventory { get; set; } = new(); private List<ProductInventoryView> Inventory { get; set; } = new();
private List<ProductInventoryView> CheckList { get; set; } = new(); private List<ProductInventoryView> CheckList { get; set; } = new();
private InvoiceListView CompanyInvoices { get; set; } = new(); private InvoiceListView CompanyInvoices { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new();
private string ButtonText { get; set; } = "Gem besøg"; private string ButtonText { get; set; } = "Gem besøg";
private bool OrgWarning { get; set; } private bool OrgWarning { get; set; }
@ -103,7 +105,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// User Info // User Info
SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu"); SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu");
// Fetch Customer from http // Fetch Customer from http
Company = await Companies.GetCompanyById(CompanyId); Company = await CompanyRepo.GetCompanyById(CompanyId);
if (Company.HasFolded == 1) if (Company.HasFolded == 1)
// Company has shutdown activities // Company has shutdown activities
Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt."; Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt.";
@ -143,7 +145,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// Initialize date variable // Initialize date variable
SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate); SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate);
// raise flag if report is closed // raise flag if report is closed
ReportClosed = await Reports.ReportExist($"{SelectedDate:yyyy-MM-dd}"); ReportClosed = await ReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
// Ask for confirmation of date // Ask for confirmation of date
Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed); Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed);
if (!UserPrefs.DateConfirmed) if (!UserPrefs.DateConfirmed)
@ -162,6 +164,17 @@ public partial class AdvisorActivityCreatePage : IDisposable
Working = false; Working = false;
} }
private async Task ShowVisitOverlay()
{
Logger.LogDebug("ShowInventoryOverlay - wait for visits");
ActivityListOverlay.Show();
Activities = await ActivityRepo.GetCustomerActivities(CompanyId);
await Task.Delay(500);
}
private async Task ShowInventoryOverlay() private async Task ShowInventoryOverlay()
{ {
Logger.LogDebug("ShowInventoryOverlay - wait for inventory"); Logger.LogDebug("ShowInventoryOverlay - wait for inventory");
@ -169,6 +182,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
InventoryOverlay.Show(); InventoryOverlay.Show();
Inventory = await HistoryRepo.FetchInventory(CompanyId); Inventory = await HistoryRepo.FetchInventory(CompanyId);
await Task.Delay(500); await Task.Delay(500);
} }
@ -313,7 +327,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
/// <param name="workDate"></param> /// <param name="workDate"></param>
private async Task WorkDateComponentCallback(string workDate) private async Task WorkDateComponentCallback(string workDate)
{ {
ReportClosed = await Reports.ReportExist(workDate); ReportClosed = await ReportRepo.ReportExist(workDate);
SelectedDate = DateTime.Parse(workDate); SelectedDate = DateTime.Parse(workDate);
Activity.ActivityDate = workDate; Activity.ActivityDate = workDate;
} }
@ -335,7 +349,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// get selected item // get selected item
if (string.IsNullOrWhiteSpace(sku.ItemId)) if (string.IsNullOrWhiteSpace(sku.ItemId))
return; return;
SelectedItem = await Catalog.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId); SelectedItem = await CatalogRepo.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId);
ShowItem = true; ShowItem = true;
Price = sku.Rate; Price = sku.Rate;
Quantity = sku.Quantity; Quantity = sku.Quantity;
@ -412,7 +426,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
{ {
Company.Phone = Activity.Phone; Company.Phone = Activity.Phone;
Activity.OrderMessage = $"Telefonnr. opdateret.\n{Activity.OrderMessage}"; Activity.OrderMessage = $"Telefonnr. opdateret.\n{Activity.OrderMessage}";
await Companies.UpdateErpData(Company.CompanyId, Company); await CompanyRepo.UpdateErpData(Company.CompanyId, Company);
} }
// begin assembling activity // begin assembling activity
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}"; Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";
@ -448,7 +462,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// debug logging // debug logging
Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity)); Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity));
// post to api // post to api
var result = await Actitivites.CreateActivity(Activity); var result = await ActivityRepo.CreateActivity(Activity);
// debug logging // debug logging
Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result)); Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result));
// show result message // show result message

View file

@ -36,63 +36,7 @@
</div> </div>
</div> </div>
<div class="list-group"> <CustomerVisitListComponent Activities="Activities" />
<div class="list-group-item">
<div class="row">
<div class="col">
<h4>Dato</h4>
</div>
<div class="col">
<h4>Demo</h4>
</div>
<div class="col">
<h4>Salg</h4>
</div>
<div class="col">
<h4>Note /Kontor</h4>
</div>
<div class="col">
<h4>Note /Selv</h4>
</div>
</div>
</div>
@if (Activities.Any())
{
@foreach (var activity in Activities)
{
<div class="list-group-item">
<div class="row">
<div class="col">
@activity.OrderDate
</div>
<div class="col">
@activity.Demo
</div>
<div class="col">
@activity.Sales
</div>
<div class="col">
@activity.OfficeNote
</div>
<div class="col">
@activity.CrmNote
</div>
</div>
</div>
}
}
else
{
<div class="list-group-item">
<div class="row">
<div class="col">
Ingen data
</div>
</div>
</div>
}
</div>
} }
@if (Working) @if (Working)
{ {

View file

@ -34,7 +34,7 @@
<CustomerInventoryListComponent OnReorderSelected="OnReorderCallback" CompanyId="@CompanyId" Inventory="@Inventory"/> <CustomerInventoryListComponent OnReorderSelected="OnReorderCallback" CompanyId="@CompanyId" Inventory="@Inventory"/>
<InventoryReorderModal OnSelected="@OnSelectedItem" CompanyId="@CompanyId" SalesItem="@SalesItem" @ref="ReorderModal"/> <InventoryReorderModalOverlay OnSelected="@OnSelectedItem" CompanyId="@CompanyId" SalesItem="@SalesItem" @ref="InventoryOverlay"/>
@if (Working) @if (Working)
{ {

View file

@ -44,7 +44,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
private CompanyDto Company { get; set; } = new(); private CompanyDto Company { get; set; } = new();
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
private SalesItemView SalesItem { get; set; } = new(); private SalesItemView SalesItem { get; set; } = new();
private InventoryReorderModal ReorderModal { get; set; } = new(); private InventoryReorderModalOverlay InventoryOverlay { get; set; } = new();
private List<ProductInventoryView> Inventory { get; set; } = new(); private List<ProductInventoryView> Inventory { get; set; } = new();
@ -65,7 +65,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
{ {
// fetch item from http repo // fetch item from http repo
SalesItem = await Catalog.GetSalesItemSku(Company.CountryCode.ToLower(), sku); SalesItem = await Catalog.GetSalesItemSku(Company.CountryCode.ToLower(), sku);
ReorderModal.Show(); InventoryOverlay.Show();
} }
private async Task OnSelectedItem(DraftItem draftItem) private async Task OnSelectedItem(DraftItem draftItem)

View file

@ -33,7 +33,7 @@
</div> </div>
</div> </div>
<CustomerInvoiceListComponent OnShowInvoice="CallInvoiceModal" CompanyId="@_companyId" InvoiceList="@CompanyInvoices.Invoices"/> <CustomerInvoiceListComponent OnShowInvoice="CallInvoiceModal" CompanyId="@_companyId" InvoiceList="@CompanyInvoices.Invoices"/>
<InvoiceViewModal CompanyId="@_companyId" InvoiceId="@InvoiceId" @ref="InvoiceView" /> <InvoiceViewModalOverlay CompanyId="@_companyId" InvoiceId="@InvoiceId" @ref="InvoiceView" />
} }
@if (Working) @if (Working)

View file

@ -23,7 +23,7 @@ public partial class AdvisorCustomerInvoiceListPage : IDisposable
[Inject] private ILogger<AdvisorCustomerInvoiceListPage> Logger { get; set; } [Inject] private ILogger<AdvisorCustomerInvoiceListPage> Logger { get; set; }
private InvoiceListView CompanyInvoices { get; set; } = new(); private InvoiceListView CompanyInvoices { get; set; } = new();
private CompanyDto Company { get; set; } = new(); private CompanyDto Company { get; set; } = new();
private InvoiceViewModal InvoiceView { get; set; } = new(); private InvoiceViewModalOverlay InvoiceView { get; set; } = new();
private string InvoiceId { get; set; } = ""; private string InvoiceId { get; set; } = "";
private bool Working { get; set; } private bool Working { get; set; }
private bool AllSet { get; set; } private bool AllSet { get; set; }

View file

@ -36,7 +36,7 @@
</div> </div>
</div> </div>
<div class="report-main d-print-grid"> <div class="report-main d-print-table">
@if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum)) @if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum))
{ {
<PageTitle>@Report.ReportData.Name</PageTitle> <PageTitle>@Report.ReportData.Name</PageTitle>

View file

@ -225,4 +225,4 @@
</div> </div>
</div> </div>
<PriceCatalogOverlay OnSelected="PriceListCallback" @ref="PriceCatalog"/> <PriceCatalogModalOverlay OnSelected="PriceListCallback" @ref="CatalogOverlay"/>

View file

@ -59,7 +59,7 @@ public partial class OfficeCustomerCreatePhoneOrderPage : IDisposable
private bool ReportClosed { get; set; } private bool ReportClosed { get; set; }
private bool PoFormInvalid { get; set; } = true; private bool PoFormInvalid { get; set; } = true;
private bool Working { get; set; } private bool Working { get; set; }
private PriceCatalogOverlay PriceCatalog { get; set; } = new(); private PriceCatalogModalOverlay CatalogOverlay { get; set; } = new();
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
@ -126,7 +126,7 @@ public partial class OfficeCustomerCreatePhoneOrderPage : IDisposable
private void CallPriceListModal() private void CallPriceListModal()
{ {
PriceCatalog.Show(); CatalogOverlay.Show();
} }
private async Task PriceListCallback(SelectedSku sku) private async Task PriceListCallback(SelectedSku sku)

View file

@ -41,7 +41,7 @@
{ {
<PageTitle>@Report.ReportData.Name</PageTitle> <PageTitle>@Report.ReportData.Name</PageTitle>
<div class="row"> <div class="row">
<div class="col text-center align-content-center"> <div class="alert border border-1 border-dark text-center align-content-center">
<h3>@Report.ReportData.Name</h3> <h3>@Report.ReportData.Name</h3>
</div> </div>
</div> </div>

View file

@ -26,7 +26,7 @@
</div> </div>
<div class="col-sm-6 d-grid"> <div class="col-sm-6 d-grid">
<AuthorizeView Roles="Admin,Office"> <AuthorizeView Roles="Admin,Office">
<button class="btn btn-primary" type="button" @onclick="Print"><i class="bi-printer"></i> Udskriv</button> <button class="btn btn-primary" type="button" @onclick="OfficePrint"><i class="bi-printer"></i> Udskriv</button>
</AuthorizeView> </AuthorizeView>
<AuthorizeView Roles="Advisor"> <AuthorizeView Roles="Advisor">
<button class="btn btn-primary" type="button" @onclick="Print"><i class="bi-printer"></i> Udskriv</button> <button class="btn btn-primary" type="button" @onclick="Print"><i class="bi-printer"></i> Udskriv</button>

View file

@ -32,10 +32,12 @@
<div class="report-main d-print-table"> <div class="report-main d-print-table">
<PageTitle>@Report.ReportData.Name</PageTitle> <PageTitle>@Report.ReportData.Name</PageTitle>
<div class="row"> <div class="row">
<div class="col text-center align-content-center"> <div class="col">
<div class="alert border border-2 border-dark text-center align-content-center">
<h3>@Report.ReportData.Name</h3> <h3>@Report.ReportData.Name</h3>
</div> </div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="w-75"> <div class="w-75">
<ReportSummaryComponent ReportData="Report.ReportData"/> <ReportSummaryComponent ReportData="Report.ReportData"/>

View file

@ -18,7 +18,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class ConfirmProductCheckOverlay public partial class ConfirmProductCheckModalOverlay
{ {
private string _modalDisplay = ""; private string _modalDisplay = "";
private bool _showBackdrop; private bool _showBackdrop;

View file

@ -17,7 +17,7 @@ using Microsoft.AspNetCore.Components;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class ConfirmWorkDateOverlay public partial class ConfirmWorkDateModalOverlay
{ {
private string _modalDisplay = ""; private string _modalDisplay = "";
private bool _showBackdrop; private bool _showBackdrop;

View file

@ -0,0 +1,19 @@
@using Wonky.Client.Components
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">@CompanyName - Aktivitet oversigt</h3>
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
</div>
<div class="modal-body">
<CustomerVisitListComponent Activities="Activities"/>
</div>
</div>
</div>
</div>
@if (_showBackdrop)
{
<div class="modal-backdrop fade show"></div>
}

View file

@ -0,0 +1,34 @@
using System.Text.Json;
using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpInterfaces;
using Wonky.Client.Models;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Shared;
public partial class CustomerActivityListModalOverlay
{
[Parameter] public string CompanyName { get; set; } = "";
[Parameter] public List<ReportItemView> Activities { get; set; } = new();
private string _modalDisplay = "";
private bool _showBackdrop;
public void Show()
{
_modalDisplay = "block;";
_showBackdrop = true;
StateHasChanged();
}
private void Hide()
{
_modalDisplay = "none;";
_showBackdrop = false;
StateHasChanged();
}
}

View file

@ -0,0 +1,109 @@
@*
// 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]
//
*@
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
</div>
<div class="modal-body">
<div class="card">
<div class="card-body">
<div class="card-title mb-2">
<h3>Besøg - @ReportItem.Company.Name</h3>
</div>
<div class="row g-3">
<label for="date" class="col-form-label-sm col-sm-1">Dato</label>
<div class="col-sm-3">
<input id="date" class="form-control" type="text" value="@(DateTime.Parse(ReportItem.CreateTimestamp).ToShortDateString())" readonly/>
</div>
<label for="account" class="col-form-label-sm col-sm-1">Konto</label>
<div class="col-sm-3">
<input id="account" class="form-control" type="text" value="@ReportItem.Company.Account" readonly/>
</div>
<label for="vatNumber" class="col-form-label-sm col-sm-1">Cvr Org</label>
<div class="col-sm-3">
<input id="vatNumber" class="form-control" type="text" value="@ReportItem.Company.VatNumber" readonly/>
</div>
<label for="eSalesNumber" class="col-form-label-sm col-sm-1">EOrdre</label>
<div class="col-sm-3">
<input id="eSalesNumber" class="form-control" type="text" value="@ReportItem.ESalesNumber" readonly/>
</div>
<label for="ourRef" class="col-form-label-sm col-sm-1">Vor Ref.</label>
<div class="col-sm-3">
<input id="ourRef" class="form-control" type="text" value="@ReportItem.OurRef" readonly/>
</div>
<hr/>
<label for="referenceNumber" class="col-form-label-sm col-sm-1">Rekv.</label>
<div class="col-sm-3">
<input id="referenceNumber" class="form-control" type="text" value="@ReportItem.ReferenceNumber" readonly/>
</div>
<label for="yourRef" class="col-form-label-sm col-sm-1">Kunde Ref.</label>
<div class="col-sm-7">
<input id="yourRef" class="form-control" type="text" value="@ReportItem.YourRef" readonly/>
</div>
<label for="officeNote" class="col-form-label-sm col-sm-1">Ordre Note</label>
<div class="col-sm-5">
<textarea id="officeNote" class="form-control" value="@ReportItem.OfficeNote" readonly=""/>
</div>
<label for="crmNote" class="col-form-label-sm col-sm-1">Crm Note</label>
<div class="col-sm-5">
<textarea id="crmNote" class="form-control" value="@ReportItem.CrmNote" readonly=""/>
</div>
<hr/>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Varenr</th>
<th scope="col">Beskrivelse</th>
<th class="text-end" scope="col">Antal</th>
<th class="text-end" scope="col">Pris</th>
<th class="text-end" scope="col">Rabat</th>
</tr>
</thead>
<tbody>
@foreach (var line in ReportItem.Lines)
{
<tr>
<td>@line.Sku</td>
<td>@line.Description</td>
<td class="text-end">@line.Quantity</td>
<td class="text-end">@line.Price</td>
<td class="text-end">@line.Discount</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@if (_showBackdrop)
{
<div class="modal-backdrop fade show"></div>
}

View file

@ -0,0 +1,48 @@
// 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 System.Text.Json;
using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpInterfaces;
using Wonky.Client.HttpRepository;
using Wonky.Client.Models;
using Wonky.Client.Services;
using Wonky.Entity.Requests;
using Wonky.Entity.Views;
namespace Wonky.Client.Shared;
public partial class CustomerActivityViewModalOverlay
{
[Parameter] public ReportItemView ReportItem { get; set; } = new();
private string _modalDisplay = "";
private bool _showBackdrop;
public void Show()
{
_modalDisplay = "block;";
_showBackdrop = true;
StateHasChanged();
}
private void Hide()
{
_modalDisplay = "none;";
_showBackdrop = false;
StateHasChanged();
}
}

View file

@ -17,4 +17,4 @@
{ {
<div class="modal-backdrop fade show"></div> <div class="modal-backdrop fade show"></div>
} }
<InventoryReorderModal CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="ReorderModal" /> <InventoryReorderModalOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="InventoryOverlay" />

View file

@ -9,11 +9,11 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class CustomerInventoryOverlay : IDisposable public partial class CustomerInventoryModalOverlay : IDisposable
{ {
[Inject] private HttpInterceptorService Interceptor { get; set; } [Inject] private HttpInterceptorService Interceptor { get; set; }
[Inject] private ICountryCatalogRepository Catalog { get; set; } [Inject] private ICountryCatalogRepository Catalog { get; set; }
[Inject] private ILogger<CustomerInventoryOverlay> Logger { get; set; } [Inject] private ILogger<CustomerInventoryModalOverlay> Logger { get; set; }
[Parameter] public string CompanyName { get; set; } = ""; [Parameter] public string CompanyName { get; set; } = "";
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
@ -28,7 +28,7 @@ public partial class CustomerInventoryOverlay : IDisposable
private List<ProductInventoryView> _inventory { get; set; } = new(); private List<ProductInventoryView> _inventory { get; set; } = new();
private DraftItem DraftItem { get; set; } = new(); private DraftItem DraftItem { get; set; } = new();
private SalesItemView SalesItem { get; set; } = new(); private SalesItemView SalesItem { get; set; } = new();
private InventoryReorderModal ReorderModal { get; set; } = new(); private InventoryReorderModalOverlay InventoryOverlay { get; set; } = new();
protected override void OnInitialized() protected override void OnInitialized()
{ {
@ -40,7 +40,7 @@ public partial class CustomerInventoryOverlay : IDisposable
private async Task OnReorderCallback(string sku) private async Task OnReorderCallback(string sku)
{ {
SalesItem = await Catalog.GetSalesItemSku(CountryCode.ToLower(), sku); SalesItem = await Catalog.GetSalesItemSku(CountryCode.ToLower(), sku);
ReorderModal.Show(); InventoryOverlay.Show();
} }
private async Task OnSelectedItem(DraftItem draftItem) private async Task OnSelectedItem(DraftItem draftItem)

View file

@ -16,7 +16,7 @@
</div> </div>
</div> </div>
<CustomerInvoiceListComponent OnShowInvoice="@CallInvoiceModal" CompanyId="@Company.CompanyId" InvoiceList="@Invoices"/> <CustomerInvoiceListComponent OnShowInvoice="@CallInvoiceModal" CompanyId="@Company.CompanyId" InvoiceList="@Invoices"/>
<InvoiceViewModal CompanyId="@Company.CompanyId" InvoiceId="@InvoiceId" @ref="InvoiceView" /> <InvoiceViewModalOverlay CompanyId="@Company.CompanyId" InvoiceId="@InvoiceId" @ref="InvoiceView" />
</div> </div>
</div> </div>
</div> </div>

View file

@ -6,12 +6,12 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class CustomerInvoiceOverlay public partial class CustomerInvoiceModalOverlay
{ {
[Parameter] public InvoiceListView CustomerInvoices { get; set; } = new(); [Parameter] public InvoiceListView CustomerInvoices { get; set; } = new();
[Inject] private ILogger<CustomerInvoiceOverlay> Logger { get; set; } [Inject] private ILogger<CustomerInvoiceModalOverlay> Logger { get; set; }
private InvoiceViewModal InvoiceView { get; set; } = new(); private InvoiceViewModalOverlay InvoiceView { get; set; } = new();
private string InvoiceId { get; set; } = ""; private string InvoiceId { get; set; } = "";
private string _modalDisplay = ""; private string _modalDisplay = "";
private bool _showBackdrop; private bool _showBackdrop;

View file

@ -25,7 +25,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class InventoryReorderModal public partial class InventoryReorderModalOverlay
{ {
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
[Parameter] public SalesItemView SalesItem { get; set; } = new(); [Parameter] public SalesItemView SalesItem { get; set; } = new();

View file

@ -25,7 +25,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class InvoiceViewModal : IDisposable public partial class InvoiceViewModalOverlay : IDisposable
{ {
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
[Parameter] public string InvoiceId { get; set; } = ""; [Parameter] public string InvoiceId { get; set; } = "";
@ -46,7 +46,6 @@ public partial class InvoiceViewModal : IDisposable
} }
} }
public void Show() public void Show()
{ {
_modalDisplay = "block;"; _modalDisplay = "block;";

View file

@ -24,7 +24,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class PriceCatalogOverlay : IDisposable public partial class PriceCatalogModalOverlay : IDisposable
{ {
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; } [Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }

View file

@ -24,7 +24,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class ProductHistoryOverlay public partial class ProductHistoryModalOverlay
{ {
// [Parameter] public EventCallback<decimal> OnSelected { get; set; } // [Parameter] public EventCallback<decimal> OnSelected { get; set; }
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";

View file

@ -1,14 +1,14 @@
{ {
"appInfo": { "appInfo": {
"name": "Wonky Online", "name": "Wonky Online",
"version": "0.108.1", "version": "0.110.1",
"rc": true, "rc": true,
"sandBox": false, "sandBox": false,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Debug",
"System": "Information", "System": "Information",
"Microsoft": "Information" "Microsoft": "Information"
}, },

View file

@ -15,15 +15,16 @@
} }
.report-main { .report-main {
font-size: 10px; font-size: 10px;
page-break-before: always;
page-break-after: always;
break-before: page; break-before: page;
break-after: page; break-after: page;
break-inside: avoid; break-inside: avoid;
page-break-after: always; /*min-height: 280mm;*/
height: 280mm;
border: initial; border: initial;
border-radius: initial; border-radius: initial;
box-shadow: initial; box-shadow: initial;
margin: 0; margin: auto;
width: initial; width: initial;
-webkit-print-color-adjust: exact; -webkit-print-color-adjust: exact;
color-adjust: exact; color-adjust: exact;