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)
{
<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.Demo</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>
<tr>
<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>
@if (ReportItem.Express)
{
@ -134,10 +134,10 @@
</table>
@if (!string.IsNullOrWhiteSpace(@ReportItem.OfficeNote))
{
<div class="alert alert-dark d-print-block">
<h4 class="text-center">
<div class="alert d-print-block border border-1 border-dark">
<p class="text-center h4">
@ReportItem.OfficeNote
</h4>
</p>
</div>
}
</div>

View file

@ -20,7 +20,7 @@
@attribute [Authorize(Roles = "Advisor")]
@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="col">
@ -161,7 +161,8 @@ else
<button class="btn btn-danger" disabled="@string.IsNullOrWhiteSpace(Activity.ActivityTypeEnum)" @onclick="ShowInvoiceOverlay">Faktura</button>
</div>
<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 class="col-sm-3 d-grid mx-auto">
<button class="btn btn-success" disabled="@string.IsNullOrWhiteSpace(Activity.ActivityTypeEnum)" @onclick="ShowInventoryOverlay">Produkter</button>
@ -335,21 +336,23 @@ else
</div>
}
<ConfirmWorkDateOverlay BodyMessage="@PromptDateConfirm"
<ConfirmWorkDateModalOverlay BodyMessage="@PromptDateConfirm"
OnOkClicked="WorkDateConfirmCallback" @ref="WorkDateOverlay"/>
<PriceCatalogOverlay CountryCode="@Company.CountryCode.ToLower()"
<PriceCatalogModalOverlay CountryCode="@Company.CountryCode.ToLower()"
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"
OnSelected="PriceHistoryCallback" @ref="PriceOverlay"/>
<ConfirmProductCheckOverlay BodyMessage="" CompanyId="@CompanyId" Products="CheckList"
<ConfirmProductCheckModalOverlay BodyMessage="" CompanyId="@CompanyId" Products="CheckList"
OnOkClicked="ConfirmProductCheckCallback" @ref="ProductCheckOverlay" />
<CustomerInvoiceOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceOverlay" />
<CustomerInvoiceModalOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceOverlay" />
<CustomerInventoryOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
OnInventorySelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryOverlay" />
<CustomerInventoryModalOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
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 NavigationManager Navigator { get; set; }
[Inject] private ILocalStorageService Storage { get; set; }
[Inject] private ICountryCatalogRepository Catalog { get; set; }
[Inject] private IAdvisorCustomerRepository Companies { get; set; }
[Inject] private IAdvisorActivityRepository Actitivites { get; set; }
[Inject] private IAdvisorReportRepository Reports { get; set; }
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
[Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; }
[Inject] private IAdvisorActivityRepository ActivityRepo { get; set; }
[Inject] private IAdvisorReportRepository ReportRepo { get; set; }
[Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
[CascadingParameter] private DraftStateProvider DraftProvider { get; set; } = new();
@ -71,18 +71,20 @@ public partial class AdvisorActivityCreatePage : IDisposable
private string PromptDateConfirm { get; set; } = "";
// OVERLAY PAGES
private PriceCatalogOverlay CatalogOverlay { get; set; } = new();
private ProductHistoryOverlay ProductOverlay { get; set; } = new();
private PriceCatalogModalOverlay CatalogOverlay { get; set; } = new();
private ProductHistoryModalOverlay ProductOverlay { get; set; } = new();
private ProductPriceHistoryModal PriceOverlay { get; set; } = new();
private ConfirmWorkDateOverlay WorkDateOverlay { get; set; } = new();
private ConfirmProductCheckOverlay ProductCheckOverlay { get; set; } = new();
private CustomerInvoiceOverlay InvoiceOverlay { get; set; } = new();
private CustomerInventoryOverlay InventoryOverlay { get; set; } = new();
private ConfirmWorkDateModalOverlay WorkDateOverlay { get; set; } = new();
private ConfirmProductCheckModalOverlay ProductCheckOverlay { get; set; } = new();
private CustomerInvoiceModalOverlay InvoiceOverlay { 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> CheckList { 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 bool OrgWarning { get; set; }
@ -103,7 +105,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// User Info
SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu");
// Fetch Customer from http
Company = await Companies.GetCompanyById(CompanyId);
Company = await CompanyRepo.GetCompanyById(CompanyId);
if (Company.HasFolded == 1)
// Company has shutdown activities
Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt.";
@ -143,7 +145,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// Initialize date variable
SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate);
// 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
Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed);
if (!UserPrefs.DateConfirmed)
@ -162,6 +164,17 @@ public partial class AdvisorActivityCreatePage : IDisposable
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()
{
Logger.LogDebug("ShowInventoryOverlay - wait for inventory");
@ -169,6 +182,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
InventoryOverlay.Show();
Inventory = await HistoryRepo.FetchInventory(CompanyId);
await Task.Delay(500);
}
@ -313,7 +327,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
/// <param name="workDate"></param>
private async Task WorkDateComponentCallback(string workDate)
{
ReportClosed = await Reports.ReportExist(workDate);
ReportClosed = await ReportRepo.ReportExist(workDate);
SelectedDate = DateTime.Parse(workDate);
Activity.ActivityDate = workDate;
}
@ -335,7 +349,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// get selected item
if (string.IsNullOrWhiteSpace(sku.ItemId))
return;
SelectedItem = await Catalog.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId);
SelectedItem = await CatalogRepo.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId);
ShowItem = true;
Price = sku.Rate;
Quantity = sku.Quantity;
@ -412,7 +426,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
{
Company.Phone = Activity.Phone;
Activity.OrderMessage = $"Telefonnr. opdateret.\n{Activity.OrderMessage}";
await Companies.UpdateErpData(Company.CompanyId, Company);
await CompanyRepo.UpdateErpData(Company.CompanyId, Company);
}
// begin assembling activity
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";
@ -448,7 +462,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
// debug logging
Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity));
// post to api
var result = await Actitivites.CreateActivity(Activity);
var result = await ActivityRepo.CreateActivity(Activity);
// debug logging
Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result));
// show result message

View file

@ -36,63 +36,7 @@
</div>
</div>
<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>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>
<CustomerVisitListComponent Activities="Activities" />
}
@if (Working)
{

View file

@ -34,7 +34,7 @@
<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)
{

View file

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

View file

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

View file

@ -23,7 +23,7 @@ public partial class AdvisorCustomerInvoiceListPage : IDisposable
[Inject] private ILogger<AdvisorCustomerInvoiceListPage> Logger { get; set; }
private InvoiceListView CompanyInvoices { 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 bool Working { get; set; }
private bool AllSet { get; set; }

View file

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

View file

@ -225,4 +225,4 @@
</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 PoFormInvalid { get; set; } = true;
private bool Working { get; set; }
private PriceCatalogOverlay PriceCatalog { get; set; } = new();
private PriceCatalogModalOverlay CatalogOverlay { get; set; } = new();
protected override async Task OnInitializedAsync()
@ -126,7 +126,7 @@ public partial class OfficeCustomerCreatePhoneOrderPage : IDisposable
private void CallPriceListModal()
{
PriceCatalog.Show();
CatalogOverlay.Show();
}
private async Task PriceListCallback(SelectedSku sku)

View file

@ -41,7 +41,7 @@
{
<PageTitle>@Report.ReportData.Name</PageTitle>
<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>
</div>
</div>

View file

@ -26,7 +26,7 @@
</div>
<div class="col-sm-6 d-grid">
<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 Roles="Advisor">
<button class="btn btn-primary" type="button" @onclick="Print"><i class="bi-printer"></i> Udskriv</button>

View file

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

View file

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

View file

@ -17,7 +17,7 @@ using Microsoft.AspNetCore.Components;
namespace Wonky.Client.Shared;
public partial class ConfirmWorkDateOverlay
public partial class ConfirmWorkDateModalOverlay
{
private string _modalDisplay = "";
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>
}
<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;
public partial class CustomerInventoryOverlay : IDisposable
public partial class CustomerInventoryModalOverlay : IDisposable
{
[Inject] private HttpInterceptorService Interceptor { 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 CompanyId { get; set; } = "";
@ -28,7 +28,7 @@ public partial class CustomerInventoryOverlay : IDisposable
private List<ProductInventoryView> _inventory { get; set; } = new();
private DraftItem DraftItem { 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()
{
@ -40,7 +40,7 @@ public partial class CustomerInventoryOverlay : IDisposable
private async Task OnReorderCallback(string sku)
{
SalesItem = await Catalog.GetSalesItemSku(CountryCode.ToLower(), sku);
ReorderModal.Show();
InventoryOverlay.Show();
}
private async Task OnSelectedItem(DraftItem draftItem)

View file

@ -16,7 +16,7 @@
</div>
</div>
<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>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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