pull/1/head
DJh2o2 2023-03-01 12:46:32 +07:00
parent 70cd546d15
commit c26031ca46
15 changed files with 853 additions and 621 deletions

@ -25,6 +25,7 @@
<PackageReference Include="Blazorise.DataGrid" Version="1.2.1" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.2.1" />
<PackageReference Include="Blazorise.Icons.Material" Version="1.2.1" />
<PackageReference Include="Blazorise.LoadingIndicator" Version="1.2.1" />
<PackageReference Include="Blazorise.Material" Version="1.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.0-preview.1.23112.2" />

@ -27,10 +27,16 @@
</DataGrid>
}
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
</NotAuthorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {

@ -11,107 +11,106 @@
<AuthorizeView>
<Authorized Context="Auth">
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">Accounts</Heading>
<Paragraph>
<DataGrid TItem="Account"
Data="@accounts"
SelectedRow="@selectedAccount"
SelectedRowChanged="@OnSelectedAccountChanged"
RowInserted="@OnRowInsertedAsync"
RowUpdated="@OnRowUpdatedAsync"
RowRemoved="@OnRowRemovedAsync"
CommandMode="DataGridCommandMode.ButtonRow"
EditMode="DataGridEditMode.Popup"
UseValidation Narrow Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive FixedHeader>
<DataGridColumns>
<DataGridCommandColumn NewCommandAllowed="false" EditCommandAllowed="false" DeleteCommandAllowed="false">
<SaveCommandTemplate>
<Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</SaveCommandTemplate>
<CancelCommandTemplate>
<Button ElementId="btnCancel" Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</CancelCommandTemplate>
</DataGridCommandColumn>
<DataGridColumn Field="@nameof(Account.AccountId)" Caption="AccountId" Filterable Sortable/>
<DataGridColumn Field="@nameof(Account.AccountName)" Caption="AccountName" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Account.Street)" Caption="Street" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Account.Zip)" Caption="Zip" Filterable Sortable Editable>
<EditTemplate>
<NumericEdit TValue="uint" Value="@(Convert.ToUInt32(context.CellValue))" ValueChanged="@(v => context.CellValue = v)"/>
</EditTemplate>
</DataGridColumn>
<DataGridColumn Field="@nameof(Account.City)" Caption="City" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Account.PhoneNumber)" Caption="PhoneNumber" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.EMail)" Caption="EMail" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.FaxNumber)" Caption="FaxNumber" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.Webpage)" Caption="Webpage" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.SapAccountNumber)" Caption="SapAccountNumber" Filterable Sortable Editable>
<EditTemplate>
<NumericEdit TValue="uint" Value="@(Convert.ToUInt32(context.CellValue))" ValueChanged="@(v => context.CellValue = v)"/>
</EditTemplate>
</DataGridColumn>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">Accounts</Heading>
<Paragraph>
<DataGrid TItem="Account"
Data="@accounts"
SelectedRow="@selectedAccount"
SelectedRowChanged="@OnSelectedAccountChanged"
RowInserted="@OnRowInsertedAsync"
RowUpdated="@OnRowUpdatedAsync"
RowRemoved="@OnRowRemovedAsync"
CommandMode="DataGridCommandMode.ButtonRow"
EditMode="DataGridEditMode.Popup"
UseValidation Narrow Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive FixedHeader>
<DataGridColumns>
<DataGridCommandColumn NewCommandAllowed="false" EditCommandAllowed="false" DeleteCommandAllowed="false">
<SaveCommandTemplate>
<Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</SaveCommandTemplate>
<CancelCommandTemplate>
<Button ElementId="btnCancel" Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</CancelCommandTemplate>
</DataGridCommandColumn>
<DataGridColumn Field="@nameof(Account.AccountId)" Caption="AccountId" Filterable Sortable/>
<DataGridColumn Field="@nameof(Account.AccountName)" Caption="AccountName" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Account.Street)" Caption="Street" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Account.Zip)" Caption="Zip" Filterable Sortable Editable>
<EditTemplate>
<NumericEdit TValue="uint" Value="@(Convert.ToUInt32(context.CellValue))" ValueChanged="@(v => context.CellValue = v)"/>
</EditTemplate>
</DataGridColumn>
<DataGridColumn Field="@nameof(Account.City)" Caption="City" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Account.PhoneNumber)" Caption="PhoneNumber" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.EMail)" Caption="EMail" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.FaxNumber)" Caption="FaxNumber" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.Webpage)" Caption="Webpage" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(Account.SapAccountNumber)" Caption="SapAccountNumber" Filterable Sortable Editable>
<EditTemplate>
<NumericEdit TValue="uint" Value="@(Convert.ToUInt32(context.CellValue))" ValueChanged="@(v => context.CellValue = v)"/>
</EditTemplate>
</DataGridColumn>
<DataGridColumn Field="@nameof(Account.AccountType)" Caption="AccountTypeCode" Filterable Sortable>
<DisplayTemplate>
@{
AccountType? accountType = (context as Account)?.AccountType;
if (accountType != null) {
@($"{accountType.AccountTypeCode}")
}
}
</DisplayTemplate>
</DataGridColumn>
<DataGridColumn Field="@nameof(Account.AccountType)" Caption="AccountTypeCode" Filterable Sortable>
<DataGridColumn Field="@nameof(Account.SubMarket)" Caption="SubMarketCode" Filterable Sortable>
<DisplayTemplate>
@{
AccountType? accountType = (context as Account)?.AccountType;
@{
SubMarket? subMarket = (context as Account)?.SubMarket;
if (accountType != null) {
@($"{accountType.AccountTypeCode}")
if (subMarket != null) {
@($"{subMarket.SubMarketCode}")
}
}
}
</DisplayTemplate>
</DataGridColumn>
</DataGridColumn>
<DataGridColumn Field="@nameof(Account.SubMarket)" Caption="SubMarketCode" Filterable Sortable>
<DisplayTemplate>
@{
SubMarket? subMarket = (context as Account)?.SubMarket;
</DataGridColumns>
if (subMarket != null) {
@($"{subMarket.SubMarketCode}")
}
}
</DisplayTemplate>
</DataGridColumn>
</DataGridColumns>
<ButtonRowTemplate>
<Button Color="Color.Success" Clicked="context.NewCommand.Clicked">New</Button>
<Button Color="Color.Primary" Disabled="selectedAccount is null" Clicked="context.EditCommand.Clicked">Edit</Button>
<Button Color="Color.Danger" Disabled="selectedAccount is null" Clicked="context.DeleteCommand.Clicked">Delete</Button>
<Button Color="Color.Secondary" Clicked="context.ClearFilterCommand.Clicked">Clear Filter</Button>
</ButtonRowTemplate>
</DataGrid>
</Paragraph>
</Div>
<ButtonRowTemplate>
<Button Color="Color.Primary" Clicked="context.NewCommand.Clicked">New</Button>
<Button Color="Color.Warning" Disabled="selectedAccount is null" Clicked="context.EditCommand.Clicked">Edit</Button>
<Button Color="Color.Danger" Disabled="selectedAccount is null" Clicked="context.DeleteCommand.Clicked">Delete</Button>
<Button Color="Color.Secondary" Clicked="context.ClearFilterCommand.Clicked">Clear Filter</Button>
</ButtonRowTemplate>
</DataGrid>
</Paragraph>
</Div>
@if (selectedAccount != null) {
@if (selectedAccount != null) {
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Contacts in @selectedAccount.AccountName</Heading>
<Paragraph>
<Heading Size="HeadingSize.Is5">Contacts in @selectedAccount.AccountName</Heading>
<Paragraph>
<DataGrid TItem="Contact" Data="@selectedAccount.Contacts" UseValidation Narrow FixedHeader ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Contact.AccountId)" Caption="AccountId" Filterable Sortable/>
@ -120,27 +119,33 @@
<DataGridColumn Field="@nameof(Contact.Gender)" Caption="Gender" Filterable Sortable />
<DataGridColumn Field="@nameof(Contact.EMail)" Caption="EMail" Filterable Sortable />
</DataGrid>
</Paragraph>
</Div>
}
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
</Paragraph>
</Div>
}
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is6">Import Accounts from CSV</Heading>
<Paragraph>
<Field>
<FileEdit Filter=".csv" Changed="@OnImportAccounts" />
</Field>
</Paragraph>
</Div>
<Field>
<FileEdit Filter=".csv" Changed="@OnImportAccounts" />
</Field>
</Paragraph>
</Div>
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
</NotAuthorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {

@ -8,68 +8,91 @@
<AuthorizeView>
<Authorized Context="Auth">
<h1>CustomDescriptions</h1>
<DataGrid TItem="CustomDescription"
Data="@customDescriptions"
SelectedRow="@selectedCustomDescription"
SelectedRowChanged="@OnSelectedCustomDescriptionChanged"
RowInserted="@OnRowInsertedAsync"
RowUpdated="@OnRowUpdatedAsync"
RowRemoved="@OnRowRemovedAsync"
CommandMode="DataGridCommandMode.ButtonRow"
EditMode="DataGridEditMode.Popup"
PagerPosition="DataGridPagerPosition.Top"
PagerOptions="new(){ ButtonSize=Size.Default }"
ShowPageSizes UseValidation Narrow Navigable Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive FixedHeader>
<DataGridColumns>
<DataGridCommandColumn NewCommandAllowed="false" EditCommandAllowed="false" DeleteCommandAllowed="false">
<SaveCommandTemplate>
<Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</SaveCommandTemplate>
<CancelCommandTemplate>
<Button ElementId="btnCancel" Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</CancelCommandTemplate>
</DataGridCommandColumn>
<DataGridColumn Field="@nameof(CustomDescription.CustomDescriptionId)" Caption="CustomDescriptionId" Filterable Sortable />
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">CustomDescription</Heading>
<Paragraph>
<DataGrid TItem="CustomDescription"
Data="@customDescriptions"
SelectedRow="@selectedCustomDescription"
SelectedRowChanged="@OnSelectedCustomDescriptionChanged"
RowInserted="@OnRowInsertedAsync"
RowUpdated="@OnRowUpdatedAsync"
RowRemoved="@OnRowRemovedAsync"
CommandMode="DataGridCommandMode.ButtonRow"
EditMode="DataGridEditMode.Popup"
PagerPosition="DataGridPagerPosition.Top"
PagerOptions="new(){ ButtonSize=Size.Default }"
ShowPageSizes UseValidation Narrow Navigable Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive FixedHeader>
<DataGridColumns>
<DataGridCommandColumn NewCommandAllowed="false" EditCommandAllowed="false" DeleteCommandAllowed="false">
<SaveCommandTemplate>
<Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</SaveCommandTemplate>
<CancelCommandTemplate>
<Button ElementId="btnCancel" Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</CancelCommandTemplate>
</DataGridCommandColumn>
<DataGridColumn Field="@nameof(CustomDescription.CustomDescriptionId)" Caption="CustomDescriptionId" Filterable Sortable />
<DataGridColumn Field="@nameof(CustomDescription.ProductNumber)" Caption="ProductNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.ProductNumber)" Caption="ProductNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.OptionNumber)" Caption="OptionNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.OptionNumber)" Caption="OptionNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.Heading)" Caption="Heading" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.Heading)" Caption="Heading" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.CoverletterText)" Caption="CoverletterText" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(CustomDescription.CoverletterText)" Caption="CoverletterText" Filterable Sortable Editable />
<DataGridColumn Field="@nameof(CustomDescription.DescriptionText)" Caption="DescriptionText" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.DescriptionText)" Caption="DescriptionText" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(CustomDescription.AccountId)" Caption="AccountId" Filterable Sortable Editable>
<EditTemplate>
<NumericEdit TValue="uint" Value="@((uint)context.CellValue)" ValueChanged="@(v => context.CellValue = v)" />
</EditTemplate>
</DataGridColumn>
<DataGridColumn Field="@nameof(CustomDescription.AccountId)" Caption="AccountId" Filterable Sortable Editable>
<EditTemplate>
<NumericEdit TValue="uint" Value="@((uint)context.CellValue)" ValueChanged="@(v => context.CellValue = v)" />
</EditTemplate>
</DataGridColumn>
</DataGridColumns>
</DataGridColumns>
<ButtonRowTemplate>
<Button Color="Color.Success" Clicked="context.NewCommand.Clicked">New</Button>
<Button Color="Color.Primary" Disabled="selectedCustomDescription is null" Clicked="context.EditCommand.Clicked">Edit</Button>
<Button Color="Color.Danger" Disabled="selectedCustomDescription is null" Clicked="context.DeleteCommand.Clicked">Delete</Button>
<Button Color="Color.Secondary" Clicked="context.ClearFilterCommand.Clicked">Clear Filter</Button>
</ButtonRowTemplate>
</DataGrid>
<h2>Import</h2>
<Field>
<FieldLabel>Import CustomDescriptions</FieldLabel>
<FileEdit Filter=".csv" Changed="@OnImportCustomDescriptions" />
</Field>
<ButtonRowTemplate>
<Button Color="Color.Success" Clicked="context.NewCommand.Clicked">New</Button>
<Button Color="Color.Primary" Disabled="selectedCustomDescription is null" Clicked="context.EditCommand.Clicked">Edit</Button>
<Button Color="Color.Danger" Disabled="selectedCustomDescription is null" Clicked="context.DeleteCommand.Clicked">Delete</Button>
<Button Color="Color.Secondary" Clicked="context.ClearFilterCommand.Clicked">Clear Filter</Button>
</ButtonRowTemplate>
</DataGrid>
</Paragraph>
</Div>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">Import</Heading>
<Paragraph>
<Field>
<FieldLabel>Import CustomDescriptions</FieldLabel>
<FileEdit Filter=".csv" Changed="@OnImportCustomDescriptions" />
</Field>
</Paragraph>
</Div>
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
</NotAuthorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {

@ -43,10 +43,16 @@
</ButtonRowTemplate>
</DataGrid>
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
</NotAuthorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {

@ -47,10 +47,16 @@
</DataGrid>
}
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
</NotAuthorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {

@ -102,10 +102,16 @@
</Column>
}
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
</NotAuthorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {

@ -2,282 +2,417 @@
@using Gremlin_BlazorServer.Services
@using Gremlin_BlazorServer.Data.EntityClasses
@using System.Globalization
@using System.Security.Claims;
@inject GenericController GenericController
@inject NavigationManager NavigationManager
@inject HostingService HostingService
@inject GenericController genericController
@inject NavigationManager navigationManager
@inject HostingService hostingService
@inject IJSRuntime jSRuntime
<h1>Create New Quote</h1>
<h2>Recipient</h2>
<DataGrid TItem="Contact" Data="@contacts" SelectedRow="@selectedContact" SelectedRowChanged="@OnSelectedContactChanged" Bordered Hoverable Filterable Striped ShowPager Responsive Sortable>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Contact.ContactId)" Caption="ContactId" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.AccountId)" Caption="AccountId" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.FirstName)" Caption="FirstName" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.LastName)" Caption="LastName" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.Gender)" Caption="Gender" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.EMail)" Caption="EMail" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.PhoneNumber)" Caption="PhoneNumber" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.SapContactNumber)" Caption="SAPContactNumber" Sortable Filterable/>
</DataGrid>
<h2>Quote Details</h2>
<Row>
<Column ColumnSize="ColumnSize.Is7">
<Fields>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsname:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Description" TextChanged="@OnDescriptionChanged"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsnummer:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.QuotationNumber" TextChanged="@OnQuotationNumberChanged"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotspfad:</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6">@quote.Path</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Gewährleistung (Monate):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6">@quote.Warranty</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsgültigkeit (Tage):</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.ValidFor.ToString()" TextChanged="@OnValidForChanged"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer (%):</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Vat.ToString(CultureInfo.CurrentCulture)" TextChanged="@OnVATChanged"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten (%):</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Freight.ToString(CultureInfo.CurrentCulture)"/>
</FieldBody>
</Field>
</Fields>
</Column>
<Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" Checked="@quote.IsPriceInformation" CheckedChanged="@OnIsPriceInformationChanged">Preisinformation</Check>
<Check TValue="bool" Checked="@quote.ShowBrutto" CheckedChanged="@OnShowBruttoChanged">Bruttopreise anzeigen</Check>
<Check TValue="bool" Checked="@quote.ShowSinglePrices" CheckedChanged="@OnShowSinglePricesChanged">Einzelpreise ausweisen</Check>
<Check TValue="bool" Checked="@quote.ShowDiscounts" CheckedChanged="@OnShowDiscountsChanged">Discounts ausweisen</Check>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Listenpreis netto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalListprice.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Summe netto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalNet.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalFreightOnly.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme netto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalFreight.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalVat.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme brutto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalGross.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
</Column>
</Row>
@if (quote.LineItems != null) {
<h2>LineItems</h2>
<DataGrid TItem="LineItem"
Data="@quote.LineItems"
SelectedRow="@selectedLineItem"
SelectedRowChanged="@OnSelectedLineItemChanged"
Bordered Hoverable Striped ShowPager Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(LineItem.Position)" Caption="Position" />
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" />
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber"/>
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber"/>
<DataGridColumn Field="@nameof(LineItem.SapShortDescription)" Caption="SapShortDescription" />
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice" />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" DisplayFormat="{0:n2}%" Caption="TotalDiscount" />
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total"/>
</DataGrid>
@if (selectedLineItem != null && customDescriptionOfSelectedLineItem != null) {
<h2>CustomDescription</h2>
<Column ColumnSize="ColumnSize.Is12">
<Fields>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">ProductNumber</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.ProductNumber"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">OptionNumber</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.OptionNumber"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Heading</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.Heading"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">DescriptionText</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@customDescriptionOfSelectedLineItem.DescriptionText"/>
</FieldBody>
</Field>
</Fields>
</Column>
}
}
@if (quote.LineItems == null) {
<h2>Uploading Quote</h2>
<Field>
<FieldLabel>Please select PriceSurfer quote as TSV</FieldLabel><FileEdit Filter=".tsv" Changed="@SelectQuoteOnChanged" Written="@SelectQuoteOnWritten" Progressed="@SelectQuoteOnProgressed"/>
</Field>
}
<h2>Create Quote</h2>
<Button Color="Color.Primary" Disabled="@lineItemsNotReady" Clicked="@OnCreateTex" Loading="@isCreatingTex">Create Tex from Quote</Button>
<Button Color="Color.Secondary" Disabled="@texNotReady" Clicked="@OnCreatePdf" Loading="@isCreatingPdf">Create Pdf from Tex</Button>
<Button Color="Color.Secondary" Disabled="@pdfNotReady" Clicked="@OnOpenPdfApp">Open Pdf with App</Button>
<Button Color="Color.Secondary" Disabled="@pdfNotReady" Clicked="@OnOpenPdfNewTab">Open Pdf in Tab</Button>
<Button Color="Color.Success" Disabled="@pdfNotReady" Clicked="@OnSave">Save</Button>
<Button Color="Color.Danger" Clicked="@OnCancel">Cancel</Button>
@if (!pdfNotReady && url != null && debug) {
<h3>Pdf</h3>
<iframe src="/quotes/@url" style="width:50%;height:600px;"></iframe>
}
@if (quote.Tex != null && debug) {
<h3>Tex</h3>
<MemoEdit ReadOnly Size="Size.Small" Autosize @bind-Text="@quote.Tex" />
}
@code {
private IList<Contact>? contacts;
private Quote quote = new();
private Contact? selectedContact;
private LineItem? selectedLineItem;
private CustomDescription? customDescriptionOfSelectedLineItem;
private readonly CultureInfo cultureInfo = new("de-DE");
private bool pdfNotReady = true;
private bool isCreatingPdf;
private bool texNotReady = true;
private bool isCreatingTex;
private bool lineItemsNotReady = true;
private string? url;
private bool debug;
protected override Task OnParametersSetAsync() {
contacts = GenericController.GetAll<Contact>();
GenerateNewQuote("Woitschetzki"); //TODO: get salesRep from Login
return Task.CompletedTask;
}
private void GenerateNewQuote(string salesRep) {
quote.SalesRep = GenericController.Get<Contact>(c => c.LastName == salesRep);
quote.QuoteId = GenericController.GetLast<Quote>().QuoteId + 1;
if (quote.SalesRep != null) {
quote.QuotationNumber = quote.SalesRep.LastName switch
{
"Woitschetzki" => $"DE-83PE89-{DateTime.Now:My}-{quote.QuoteId}",
"Welsch" => $"DE-83RE32-{DateTime.Now:My}-{quote.QuoteId}",
_ => $"DE-XXYYXX-{DateTime.Now:My}-{quote.QuoteId}"
};
@inject ILoadingIndicatorService ApplicationLoadingIndicatorService
<AuthorizeView>
<Authorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Recipient</Heading>
<Paragraph>
<DataGrid TItem="Contact"
Data="@contacts"
SelectedRow="@selectedContact"
SelectedRowChanged="@OnSelectedContactChanged"
Bordered Hoverable Filterable Striped ShowPager Responsive Sortable>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Contact.ContactId)" Caption="ContactId" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.AccountId)" Caption="AccountId" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.FirstName)" Caption="FirstName" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.LastName)" Caption="LastName" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.Gender)" Caption="Gender" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.EMail)" Caption="EMail" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.PhoneNumber)" Caption="PhoneNumber" Sortable Filterable/>
<DataGridColumn Field="@nameof(Contact.SapContactNumber)" Caption="SAPContactNumber" Sortable Filterable/>
</DataGrid>
</Paragraph>
</Div>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Quote Details</Heading>
<Paragraph>
<Row>
<Column ColumnSize="ColumnSize.Is4">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsname</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Description" TextChanged="@OnDescriptionChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsnummer</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.QuotationNumber" TextChanged="@OnQuotationNumberChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotspfad</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.Path"/>"
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Gewährleistung (Monate)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Warranty.ToString()" TextChanged="@OnWarrantyChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsgültigkeit (Tage)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.ValidFor.ToString()" TextChanged="@OnValidForChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer (%)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Vat.ToString(CultureInfo.CurrentCulture)" TextChanged="@OnVATChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten (%)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Freight.ToString(CultureInfo.CurrentCulture)"/>
</FieldBody>
</Field>
</Column>
@if (quote.Recipient != null && quote.Recipient.Account != null)
{
<Column ColumnSize="ColumnSize.Is3">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">FirstName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.FirstName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">LastName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.LastName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">AccountName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.AccountName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Street</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.Street</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Zip</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.Zip.ToString()</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">City</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.City</FieldBody>
</Field>
</Column>
}
<Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" Checked="@quote.IsPriceInformation" CheckedChanged="@OnIsPriceInformationChanged">Preisinformation</Check>
<Check TValue="bool" Checked="@quote.ShowBrutto" CheckedChanged="@OnShowBruttoChanged">Bruttopreise anzeigen</Check>
<Check TValue="bool" Checked="@quote.ShowSinglePrices" CheckedChanged="@OnShowSinglePricesChanged">Einzelpreise ausweisen</Check>
<Check TValue="bool" Checked="@quote.ShowDiscounts" CheckedChanged="@OnShowDiscountsChanged">Discounts ausweisen</Check>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Listenpreis netto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalListprice.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Summe netto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalNet.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalFreightOnly.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme netto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalFreight.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalVat.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme brutto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalGross.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
</Column>
</Row>
</Paragraph>
</Div>
@if (quote.LineItems != null) {
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">LineItems</Heading>
<Paragraph>
<DataGrid TItem="LineItem"
Data="@quote.LineItems"
SelectedRow="@selectedLineItem"
SelectedRowChanged="@OnSelectedLineItemChanged"
Bordered Hoverable Striped ShowPager Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(LineItem.Position)" Caption="Position" />
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" />
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber"/>
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber"/>
<DataGridColumn Field="@nameof(LineItem.SapShortDescription)" Caption="SapShortDescription" />
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice" />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" DisplayFormat="{0:n2}%" Caption="TotalDiscount" />
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total"/>
</DataGrid>
</Paragraph>
</Div>
@if (selectedLineItem != null && customDescriptionOfSelectedLineItem != null) {
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">CustomDescription</Heading>
<Paragraph>
<Column ColumnSize="ColumnSize.Is12">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">ProductNumber</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@customDescriptionOfSelectedLineItem.ProductNumber</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">OptionNumber</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@customDescriptionOfSelectedLineItem.OptionNumber</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Heading</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@customDescriptionOfSelectedLineItem.Heading</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">DescriptionText</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@customDescriptionOfSelectedLineItem.DescriptionText</FieldBody>
</Field>
</Column>
</Paragraph>
</Div>
}
}
quote.Description = "Gerät";
}
private async Task SelectQuoteOnChanged(FileChangedEventArgs e) {
try {
foreach (IFileEntry? file in e.Files) {
using MemoryStream stream = new();
await file.WriteToStreamAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
using StreamReader reader = new(stream);
string fileContent = await reader.ReadToEndAsync();
quote = QuoteHandling.ReadLineItems(quote, fileContent);
if (quote.Recipient?.Account?.AccountName != null)
{
quote = HostingService.SetPath(quote); //Set path to wwwroot/quotes folder
}
FileService.WriteQuoteToTsv(fileContent, quote);
}
@if (quote.LineItems == null) {
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Upload PriceSurfer Quote </Heading>
<Paragraph>
<Field>
<FieldLabel>Please select PriceSurfer quote as TSV</FieldLabel>
<FileEdit Filter=".tsv" Changed="@SelectQuoteOnChanged" Written="@SelectQuoteOnWritten" Progressed="@SelectQuoteOnProgressed"/>
</Field>
</Paragraph>
</Div>
}
catch (Exception exc) {
Console.WriteLine(exc.Message);
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Create Quote</Heading>
<Paragraph>
<Button Color="Color.Primary" Disabled="@lineItemsNotReady" Clicked="@OnCreateTex" Loading="@isCreatingTex">Create Tex from Quote</Button>
<Button Color="Color.Secondary" Disabled="@texNotReady" Clicked="@OnCreatePdf" Loading="@isCreatingPdf">Create Pdf from Tex</Button>
<Button Color="Color.Secondary" Disabled="@pdfNotReady" Clicked="@OnOpenPdfApp">Open Pdf with App</Button>
<Button Color="Color.Secondary" Disabled="@pdfNotReady" Clicked="@OnOpenPdfNewTab">Open Pdf in Tab</Button>
<Button Color="Color.Success" Disabled="@pdfNotReady" Clicked="@OnSave">Save</Button>
<Button Color="Color.Danger" Clicked="@OnCancel">Cancel</Button>
</Paragraph>
</Div>
@if (!pdfNotReady && url != null && debug) {
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">PDF</Heading>
<Paragraph>
<iframe src="/quotes/@url" style="width:50%;height:600px;"></iframe>
</Paragraph>
</Div>
}
finally {
Console.WriteLine("LineItems successfull read");
lineItemsNotReady = false;
StateHasChanged();
@if (quote.Tex != null && debug) {
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Tex</Heading>
<Paragraph>
<MemoEdit ReadOnly Size="Size.Small" Autosize @bind-Text="@quote.Tex" />
</Paragraph>
</Div>
}
</Authorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {
[CascadingParameter] private Task<AuthenticationState>? authenticationStateTask { get; set; }
private IList<Contact>? contacts;
private Quote quote = new();
private Contact? selectedContact;
private LineItem? selectedLineItem;
private CustomDescription? customDescriptionOfSelectedLineItem;
private readonly CultureInfo cultureInfo = new("de-DE");
private bool pdfNotReady = true;
private bool isCreatingPdf;
private bool texNotReady = true;
private bool isCreatingTex;
private bool lineItemsNotReady = true;
private string? url;
private bool debug;
protected override async Task OnParametersSetAsync() {
if (authenticationStateTask != null) {
ClaimsPrincipal user = (await authenticationStateTask).User;
if (user.Identity is { IsAuthenticated: true }) {
await ApplicationLoadingIndicatorService.Show();
contacts = await genericController.GetAllAsync<Contact>();
await ApplicationLoadingIndicatorService.Hide();
quote = await GenerateNewQuote(quote, "Woitschetzki");
}
}
await base.OnInitializedAsync();
}
private async Task<Quote> GenerateNewQuote(Quote _quote, string salesRepLastName) {
if (_quote == null) return new();
_quote.SalesRep = await genericController.GetAsync<Contact>(c => c.LastName.Equals(salesRepLastName), "Account");
private static void SelectQuoteOnWritten(FileWrittenEventArgs e) {
Console.WriteLine($"File: {e.File.Name} Position: {e.Position} Data: {Convert.ToBase64String(e.Data)}");
Quote? lastQuote = genericController.GetLast<Quote>();
if (lastQuote != null)
{
_quote.QuoteId = lastQuote.QuoteId + 1;
}
else
{
_quote.QuoteId = 1;
}
private static void SelectQuoteOnProgressed(FileProgressedEventArgs e) {
Console.WriteLine($"File: {e.File.Name} Progress: {e.Percentage}");
if (_quote.SalesRep != null) {
_quote.QuotationNumber = _quote.SalesRep.LastName switch
{
"Woitschetzki" => $"DE-83PE89-{DateTime.Now:My}-{_quote.QuoteId}",
"Welsch" => $"DE-83RE32-{DateTime.Now:My}-{_quote.QuoteId}",
_ => $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}"
};
}
else {
_quote.QuotationNumber = $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}";
}
_quote.Description = "Gerät";
return _quote;
}
private async Task SelectQuoteOnChanged(FileChangedEventArgs e) {
try {
foreach (IFileEntry? file in e.Files) {
using MemoryStream stream = new();
await file.WriteToStreamAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
using StreamReader reader = new(stream);
string fileContent = await reader.ReadToEndAsync();
quote = QuoteHandling.ReadLineItems(quote, fileContent);
if (quote.Recipient?.Account?.AccountName != null)
{
quote = hostingService.SetPath(quote); //Set path to wwwroot/quotes folder
}
private Task OnSelectedContactChanged(Contact sC) {
selectedContact = sC;
quote.Recipient = selectedContact;
quote.Recipient.Account = GenericController.Get<Account>(account => account.AccountId == quote.Recipient.AccountId);
return Task.CompletedTask;
FileService.WriteQuoteToTsv(fileContent, quote);
}
}
catch (Exception exc) {
Console.WriteLine(exc.Message);
}
finally {
lineItemsNotReady = false;
StateHasChanged();
}
}
private Task OnSave() {
if (GenericController.Insert(quote) > 0)
NavigationManager.NavigateTo("Quotes/QuoteIndex");
private static void SelectQuoteOnWritten(FileWrittenEventArgs e) {
Console.WriteLine($"File: {e.File.Name} Position: {e.Position} Data: {Convert.ToBase64String(e.Data)}");
}
return Task.CompletedTask;
private static void SelectQuoteOnProgressed(FileProgressedEventArgs e) {
Console.WriteLine($"File: {e.File.Name} Progress: {e.Percentage}");
}
private async Task OnSelectedContactChanged(Contact _selectedContact) {
selectedContact = _selectedContact;
quote.Recipient = selectedContact;
quote.Recipient.Account = await genericController.GetAsync<Account>(account => account.AccountId.Equals(quote.Recipient.AccountId));
return;
}
private async Task OnSave() {
if (await genericController.InsertAsync(quote) > 0)
navigationManager.NavigateTo("Quotes/QuoteIndex");
return;
}
private async Task OnCreateTex() {
isCreatingTex = true;
quote.Tex = (await QuoteHandling.CreateTex(quote))?.ToString();
quote.Tex = (await QuoteHandling.CreateTexAsync(quote))?.ToString();
if (quote.Tex == null) return;
await FileService.WriteTexFile(quote);
isCreatingTex = false;
@ -351,15 +486,21 @@
return Task.CompletedTask;
}
private Task OnWarrantyChanged(string warranty) {
quote.Warranty = int.Parse(warranty);
return Task.CompletedTask;
}
private Task OnCancel() {
NavigationManager.NavigateTo("Quotes/QuoteIndex");
navigationManager.NavigateTo("Quotes/QuoteIndex");
return Task.CompletedTask;
}
private Task OnSelectedLineItemChanged(LineItem lI) {
private async Task OnSelectedLineItemChanged(LineItem lI) {
selectedLineItem = lI;
customDescriptionOfSelectedLineItem = GenericController.Get<CustomDescription>(cD => cD.ProductNumber == lI.ProductNumber && cD.OptionNumber == lI.OptionNumber);
return Task.CompletedTask;
customDescriptionOfSelectedLineItem =
await genericController.GetAsync<CustomDescription>(cD => cD.ProductNumber.Equals(lI.ProductNumber) && cD.OptionNumber.Equals(lI.OptionNumber));
return;
}
}

@ -2,220 +2,220 @@
@using Gremlin_BlazorServer.Services
@using Gremlin_BlazorServer.Data.EntityClasses
@using System.Globalization
@using System.Security.Claims;
@inject GenericController GenericController
@inject NavigationManager NavigationManager
<h1>Quotes</h1>
<Button Color="Color.Primary" Clicked="@OnCreateNewQuote">Create New Quote</Button>
@inject GenericController genericController
@inject NavigationManager navigationManager
<AuthorizeView>
<Authorized>
@if (quotes != null) {
<DataGrid TItem="Quote" Data="@quotes" SelectedRow="@selectedQuote" SelectedRowChanged="@OnSelectedQuoteChanged" ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Quote.QuoteId)" Caption="#" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuotationNumber)" Caption="QuotationNumber" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuotationDate)" Caption="Date" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.ValidUntil)" Caption="ValidUntil" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.TotalNet)" Caption="TotalNet" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.TotalGross)" Caption="TotalGross" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuoteContains3Pp)" Caption="3PP" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuoteContainsRb)" Caption="RB" Filterable Sortable/>
</DataGrid>
}
@if (selectedQuote != null) {
<Tabs SelectedTab="@selectedTab" SelectedTabChanged="@OnSelectedTabChanged">
<Items>
<Tab Name="details">Details</Tab>
<Tab Name="lineitems">LineItems</Tab>
</Items>
<Content>
<TabPanel Name="details">
<Row>
<Column ColumnSize="ColumnSize.Is4">
<Fields>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsname:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@selectedQuote.Description"/>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsnummer:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@selectedQuote.QuotationNumber"/>
</FieldBody>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">Quotes</Heading>
<Paragraph>
<Button Color="Color.Primary" Clicked="@OnCreateNewQuote">Create New Quote</Button>
@if (quotes != null) {
<DataGrid TItem="Quote" Data="@quotes" SelectedRow="@selectedQuote" SelectedRowChanged="@OnSelectedQuoteChanged" ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Quote.QuoteId)" Caption="QuoteId" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuotationNumber)" Caption="QuotationNumber" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuotationDate)" Caption="Date" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.ValidUntil)" Caption="ValidUntil" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.TotalNet)" Caption="TotalNet" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.TotalGross)" Caption="TotalGross" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuoteContains3Pp)" Caption="3PP" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuoteContainsRb)" Caption="RB" Filterable Sortable/>
</DataGrid>
}
</Paragraph>
</Div>
@if (selectedQuote != null)
{
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Quote #@selectedQuote.QuoteId: @selectedQuote.QuotationNumber</Heading>
<Paragraph>
<Tabs SelectedTab="@selectedTab" SelectedTabChanged="@OnSelectedTabChanged">
<Items>
<Tab Name="details">Details</Tab>
<Tab Name="lineitems">LineItems</Tab>
</Items>
<Content>
<TabPanel Name="details">
<Row>
<Column ColumnSize="ColumnSize.Is4">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsname</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Description</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotspfad:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.Path"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsnummer</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.QuotationNumber</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Gewährleistung (Monate):</FieldLabel><FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Warranty.ToString(CultureInfo.CurrentCulture)</FieldBody>
@* <Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotspfad</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6" Overflow="Overflow.Scroll">@selectedQuote.Path</FieldBody>
</Field>*@
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Gewährleistung (Monate)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Warranty.ToString(CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsgültigkeit (Tage):</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@selectedQuote.ValidFor.ToString(CultureInfo.CurrentCulture)"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsgültigkeit (Tage)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.ValidFor.ToString(CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer (%):</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@selectedQuote.Vat.ToString(CultureInfo.CurrentCulture)"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer (%)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Vat.ToString(CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten (%):</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@selectedQuote.Freight.ToString(CultureInfo.CurrentCulture)"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten (%)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Freight.ToString(CultureInfo.CurrentCulture)</FieldBody>
</Field>
</Fields>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Fields>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">FirstName:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.Recipient.FirstName"/>
</FieldBody>
</Column>
@if (selectedQuote.Recipient != null && selectedQuote.Recipient.Account != null)
{
<Column ColumnSize="ColumnSize.Is3">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">FirstName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Recipient.FirstName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">LastName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Recipient.LastName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">AccountName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Recipient.Account.AccountName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Street</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Recipient.Account.Street</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Zip</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Recipient.Account.Zip.ToString()</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">City</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.Recipient.Account.City</FieldBody>
</Field>
</Column>
}
<Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" Disabled Checked="@selectedQuote.IsPriceInformation">Preisinformation</Check>
<Check TValue="bool" Disabled Checked="@selectedQuote.ShowBrutto">Bruttopreise anzeigen</Check>
<Check TValue="bool" Disabled Checked="@selectedQuote.ShowSinglePrices">Einzelpreise ausweisen</Check>
<Check TValue="bool" Disabled Checked="@selectedQuote.ShowDiscounts">Discounts ausweisen</Check>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Listenpreis (netto)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.TotalListprice.ToString("C", CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">LastName:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.Recipient.LastName"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Summe (netto)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.TotalNet.ToString("C", CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">AccountName:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.Recipient.Account.AccountName"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.TotalFreightOnly.ToString("C", CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Street:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.Recipient.Account.Street"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme (netto)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.TotalFreight.ToString("C", CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Zip:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.Recipient.Account.Zip.ToString()"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.TotalVat.ToString("C", CultureInfo.CurrentCulture)</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">City:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.Recipient.Account.City"/>
</FieldBody>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme (brutto)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@selectedQuote.TotalGross.ToString("C", CultureInfo.CurrentCulture)</FieldBody>
</Field>
</Fields>
</Column>
<Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" ReadOnly Checked="@selectedQuote.IsPriceInformation">Preisinformation</Check>
<Check TValue="bool" ReadOnly Checked="@selectedQuote.ShowBrutto">Bruttopreise anzeigen</Check>
<Check TValue="bool" ReadOnly Checked="@selectedQuote.ShowSinglePrices">Einzelpreise ausweisen</Check>
<Check TValue="bool" ReadOnly Checked="@selectedQuote.ShowDiscounts">Discounts ausweisen</Check>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Listenpreis netto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.TotalListprice.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Summe netto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.TotalNet.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.TotalFreightOnly.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme netto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.TotalFreight.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.TotalVat.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme brutto:</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@selectedQuote.TotalGross.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
</Column>
</Row>
</TabPanel>
<TabPanel Name="lineitems">
<DataGrid TItem="LineItem" Data="@selectedQuote.LineItems" Bordered Hoverable Sortable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(LineItem.Position)" Caption="#"/>
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" Editable/>
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber" Editable/>
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber" Editable/>
<DataGridColumn Field="@nameof(LineItem.ProductLine)" Caption="ProductLine" Editable/>
<DataGridColumn Field="@nameof(LineItem.ListPrice)" Caption="ListPrice" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Editable/>
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" Caption="TotalDiscount" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Editable/>
<DataGridColumn Field="@nameof(LineItem.Total)" Caption="Total" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Editable/>
</DataGrid>
</TabPanel>
</Content>
</Tabs>
}
</Column>
</Row>
</TabPanel>
<TabPanel Name="lineitems">
<DataGrid TItem="LineItem" Data="@selectedQuote.LineItems" Bordered Hoverable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(LineItem.Position)" Caption="Position"/>
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" />
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber" />
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber" />
<DataGridColumn Field="@nameof(LineItem.ProductLine)" Caption="ProductLine" />
<DataGridColumn Field="@nameof(LineItem.ListPrice)" Caption="ListPrice" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" Caption="TotalDiscount" DisplayFormat="{0:n2}%" DisplayFormatProvider=cultureInfo />
<DataGridColumn Field="@nameof(LineItem.Total)" Caption="Total" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo />
</DataGrid>
</TabPanel>
</Content>
</Tabs>
</Paragraph>
</Div>
}
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {
private IList<Quote>? quotes;
private Quote? selectedQuote;
private readonly CultureInfo cultureInfo = new("de-DE");
private string selectedTab = "details";
[CascadingParameter] private Task<AuthenticationState>? authenticationStateTask { get; set; }
protected override Task OnInitializedAsync() {
quotes = GenericController.GetAll<Quote>("Recipient");
return Task.CompletedTask;
private IList<Quote>? quotes;
private Quote? selectedQuote;
private readonly CultureInfo cultureInfo = new("de-DE");
private string selectedTab = "details";
protected override async Task OnInitializedAsync()
{
if (authenticationStateTask != null)
{
ClaimsPrincipal user = (await authenticationStateTask).User;
if (user.Identity is { IsAuthenticated: true })
{
quotes = await genericController.GetAllAsync<Quote>();
}
}
await base.OnInitializedAsync();
}
private void OnSelectedQuoteChanged(Quote sQ) {
selectedQuote = sQ;
if (selectedQuote.Recipient != null) {
selectedQuote.Recipient.Account = GenericController.Get<Account>(a => a.AccountId == sQ.Recipient?.AccountId);
}
selectedQuote.LineItems = GenericController.GetAll<LineItem>(lineItem => lineItem.Quote == selectedQuote);
private async Task OnSelectedQuoteChanged(Quote _selectedQuote) {
selectedQuote = _selectedQuote;
selectedQuote.Recipient = await genericController.GetAsync<Contact>(c => c.ContactId.Equals(selectedQuote.ContactId));
if (selectedQuote.Recipient != null) {
selectedQuote = await genericController.GetAsync<Quote>(c => c.QuoteId.Equals(_selectedQuote.QuoteId), "Recipient", "LineItems");
selectedQuote.Recipient.Account = await genericController.GetAsync<Account>(a => a.AccountId.Equals(selectedQuote.Recipient.AccountId));
}
//selectedQuote.LineItems = await genericController.GetAllAsync<LineItem>(lI => lI.Quote.Equals(selectedQuote));
return;
}
private void OnCreateNewQuote() {
NavigationManager.NavigateTo("Quotes/QuoteAdd");
navigationManager.NavigateTo("Quotes/QuoteAdd");
}
private Task OnSelectedTabChanged(string sT) {
selectedTab = sT;
private Task OnSelectedTabChanged(string _selectedTab) {
selectedTab = _selectedTab;
return Task.CompletedTask;
}

@ -37,6 +37,9 @@
<script src="js/material.min.js"></script>
<script src="_content/Blazorise.Material/blazorise.material.js"></script>
<!-- LoadingIndicator-->
<link href="_content/Blazorise.LoadingIndicator/blazorise.loadingindicator.css" rel="stylesheet" />
<component type="typeof(HeadOutlet)" render-mode="Server"/>
</head>
<body>

@ -1,5 +1,6 @@
using Blazorise;
using Blazorise.Icons.Material;
using Blazorise.LoadingIndicator;
using Blazorise.Material;
//using Blazorise.Bootstrap;
@ -30,6 +31,7 @@ builder.Services.AddBlazorise(options => { options.Immediate = true; })
.AddMaterialProviders()
.AddMaterialIcons();
builder.Services.AddOptions();
builder.Services.AddLoadingIndicator();
//Auth
const string connection = "server0";

@ -183,14 +183,30 @@ public class GenericController
}
}
public async Task<TResult?> GetAsync<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata
public async Task<TResult?> GetAsync<TResult>(Predicate<TResult> search, string include1) where TResult : class, IMetadata
{
try
{
using (GremlinDb gremlinDb = new())
{
return await Task.Run(() => gremlinDb.Set<TResult>().Include(include).AsEnumerable().FirstOrDefault(t => search(t)));
return await Task.Run(() => gremlinDb.Set<TResult>().Include(include1).AsEnumerable().FirstOrDefault(t => search(t)));
}
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
}
public async Task<TResult?> GetAsync<TResult>(Predicate<TResult> search, string include1, string include2) where TResult : class, IMetadata
{
try
{
using (GremlinDb gremlinDb = new())
{
return await Task.Run(() => gremlinDb.Set<TResult>().Include(include1).Include(include2).AsEnumerable().FirstOrDefault(t => search(t)));
}
}
catch (Exception exception)

@ -6,7 +6,7 @@ namespace Gremlin_BlazorServer.Services;
public static class QuoteHandling
{
public static async Task<StringBuilder?> CreateTex(Quote quote)
public static async Task<StringBuilder?> CreateTexAsync(Quote quote)
{
StringBuilder? texString = await TexService.CreateTex(quote);
if (texString == null)

@ -9,4 +9,5 @@
@using Gremlin_BlazorServer
@using Gremlin_BlazorServer.Shared
@using Blazorise
@using Blazorise.DataGrid
@using Blazorise.DataGrid
@using Blazorise.LoadingIndicator

@ -0,0 +1,16 @@
# Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
11 G7114A 29 1260 Infinity II VW-Detektor 1 9307 0 0 30 6514.9 6514.9 30 0 0 0 ISL100D1 Detectors
12 G7114A 018 29 Standarddurchflusszelle VWD 1 1612 0 0 30 1128.4 1128.4 30 0 0 0
13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
15 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR
1 # Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
2 1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
3 2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
4 3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
5 4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
6 5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
7 6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
8 7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
9 8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
10 9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
11 10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
12 11 G7114A 29 1260 Infinity II VW-Detektor 1 9307 0 0 30 6514.9 6514.9 30 0 0 0 ISL100D1 Detectors
13 12 G7114A 018 29 Standarddurchflusszelle VWD 1 1612 0 0 30 1128.4 1128.4 30 0 0 0
14 13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
15 14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
16 15 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR