DevExpress Fluent theme: grid/info panel refactor

Major refactor for DevExpress Fluent theme compatibility:
- InfoPanel templates now use strongly-typed context (`InfoPanelContext`)
- Unified grid layout with `MgGridWithInfoPanel` wrapper
- CSS updated to use Fluent theme variables and container queries
- App-wide CSS cleanup and formatting improvements
- `.editorconfig` added for modern CSS support
- Improved InfoPanel instance resolution for nested grids
- Codebase is cleaner, more maintainable, and ready for further customization
This commit is contained in:
Loretta 2025-12-21 08:24:40 +01:00
parent e8d38f0038
commit 271868b4d5
9 changed files with 459 additions and 436 deletions

View File

@ -74,7 +74,6 @@
</ToolbarTemplate> </ToolbarTemplate>
</GridProductDto> </GridProductDto>
@code { @code {
[Inject] public required DatabaseClient Database { get; set; } [Inject] public required DatabaseClient Database { get; set; }

View File

@ -15,78 +15,80 @@
@inject IEnumerable<IAcLogWriterClientBase> LogWriters @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject FruitBankSignalRClient FruitBankSignalRClient @inject FruitBankSignalRClient FruitBankSignalRClient
<GridShippingItemBase @ref="Grid" ParentDataItem="ParentDataItem" DataSource="ShippingItems" AutoSaveLayoutName="GridShippingItem" <MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
SignalRClient="FruitBankSignalRClient" Logger="_logger" <GridContent>
CssClass="@GridCss" ValidationEnabled="false" CustomizeElement="Grid_CustomizeElement" <GridShippingItemBase @ref="Grid" ParentDataItem="ParentDataItem" DataSource="ShippingItems" AutoSaveLayoutName="GridShippingItem"
OnGridFocusedRowChanged="Grid_FocusedRowChanged"> SignalRClient="FruitBankSignalRClient" Logger="_logger"
<Columns> CssClass="@GridCss" ValidationEnabled="false" CustomizeElement="Grid_CustomizeElement"
<DxGridDataColumn FieldName="Id" Caption="oiId" Width="125" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> OnGridFocusedRowChanged="Grid_FocusedRowChanged">
<DxGridDataColumn FieldName="ShippingDocumentId" Caption="ShippingDocument" <Columns>
Visible="@(!ParentDataItemIsShippingDocument)" ReadOnly="@(ParentDataItemIsShippingDocument)"> <DxGridDataColumn FieldName="Id" Caption="oiId" Width="125" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<EditSettings> <DxGridDataColumn FieldName="ShippingDocumentId" Caption="ShippingDocument"
<DxComboBoxSettings Data="ShippingDocuments" Visible="@(!ParentDataItemIsShippingDocument)" ReadOnly="@(ParentDataItemIsShippingDocument)">
ValueFieldName="Id" <EditSettings>
TextFieldName="@nameof(ShippingDocument.PdfFileName)" <DxComboBoxSettings Data="ShippingDocuments"
DropDownBodyCssClass="dd-body-class" ValueFieldName="Id"
ListRenderMode="ListRenderMode.Entire" TextFieldName="@nameof(ShippingDocument.PdfFileName)"
SearchMode="ListSearchMode.AutoSearch" DropDownBodyCssClass="dd-body-class"
SearchFilterCondition="ListSearchFilterCondition.Contains" ListRenderMode="ListRenderMode.Entire"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"> SearchMode="ListSearchMode.AutoSearch"
<Columns> SearchFilterCondition="ListSearchFilterCondition.Contains"
<DxListEditorColumn FieldName="@nameof(ShippingDocument.Id)" /> ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto">
<DxListEditorColumn FieldName="@nameof(ShippingDocument.DocumentIdNumber)" /> <Columns>
<DxListEditorColumn FieldName="@nameof(ShippingDocument.PdfFileName)" /> <DxListEditorColumn FieldName="@nameof(ShippingDocument.Id)" />
<DxListEditorColumn FieldName="@("Partner.Name")" /> <DxListEditorColumn FieldName="@nameof(ShippingDocument.DocumentIdNumber)" />
</Columns> <DxListEditorColumn FieldName="@nameof(ShippingDocument.PdfFileName)" />
</DxComboBoxSettings> <DxListEditorColumn FieldName="@("Partner.Name")" />
</EditSettings> </Columns>
</DxGridDataColumn> </DxComboBoxSettings>
</EditSettings>
</DxGridDataColumn>
<DxGridDataColumn FieldName="@("ShippingDocument.Partner.Name")" Caption="Patner" Width="125" ReadOnly="true" Visible="@(!ParentDataItemIsShippingDocument)" /> <DxGridDataColumn FieldName="@("ShippingDocument.Partner.Name")" Caption="Patner" Width="125" ReadOnly="true" Visible="@(!ParentDataItemIsShippingDocument)" />
<DxGridDataColumn FieldName="ProductId" Caption="Product"> <DxGridDataColumn FieldName="ProductId" Caption="Product">
<EditSettings> <EditSettings>
<DxComboBoxSettings Data="ProductDtos" <DxComboBoxSettings Data="ProductDtos"
ValueFieldName="Id" ValueFieldName="Id"
TextFieldName="Name" TextFieldName="Name"
DropDownBodyCssClass="dd-body-class" DropDownBodyCssClass="dd-body-class"
ListRenderMode="ListRenderMode.Entire" ListRenderMode="ListRenderMode.Entire"
SearchMode="ListSearchMode.AutoSearch" SearchMode="ListSearchMode.AutoSearch"
SearchFilterCondition="ListSearchFilterCondition.Contains" SearchFilterCondition="ListSearchFilterCondition.Contains"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"> ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto">
<Columns> <Columns>
<DxListEditorColumn FieldName="@nameof(ProductDto.Id)" /> <DxListEditorColumn FieldName="@nameof(ProductDto.Id)" />
<DxListEditorColumn FieldName="@nameof(ProductDto.Name)" /> <DxListEditorColumn FieldName="@nameof(ProductDto.Name)" />
<DxListEditorColumn FieldName="@nameof(ProductDto.AvailableQuantity)" /> <DxListEditorColumn FieldName="@nameof(ProductDto.AvailableQuantity)" />
<DxListEditorColumn FieldName="@nameof(ProductDto.StockQuantity)" /> <DxListEditorColumn FieldName="@nameof(ProductDto.StockQuantity)" />
<DxListEditorColumn FieldName="@nameof(ProductDto.IncomingQuantity)" /> <DxListEditorColumn FieldName="@nameof(ProductDto.IncomingQuantity)" />
<DxListEditorColumn FieldName="@nameof(ProductDto.NetWeight)" /> <DxListEditorColumn FieldName="@nameof(ProductDto.NetWeight)" />
<DxListEditorColumn FieldName="@nameof(ProductDto.IsMeasurable)" /> <DxListEditorColumn FieldName="@nameof(ProductDto.IsMeasurable)" />
</Columns> </Columns>
</DxComboBoxSettings> </DxComboBoxSettings>
</EditSettings> </EditSettings>
</DxGridDataColumn> </DxGridDataColumn>
<DxGridDataColumn FieldName="NameOnDocument" MinWidth="120" Caption="Name(OnDoc)" /> <DxGridDataColumn FieldName="NameOnDocument" MinWidth="120" Caption="Name(OnDoc)" />
<DxGridDataColumn FieldName="Name" MinWidth="120" Caption="Name" Visible="false" /> <DxGridDataColumn FieldName="Name" MinWidth="120" Caption="Name" Visible="false" />
<DxGridDataColumn FieldName="PalletsOnDocument" Caption="Raklap(OnDoc)" /> <DxGridDataColumn FieldName="PalletsOnDocument" Caption="Raklap(OnDoc)" />
<DxGridDataColumn FieldName="QuantityOnDocument" Caption="Mennyiség(OnDoc)" /> <DxGridDataColumn FieldName="QuantityOnDocument" Caption="Mennyiség(OnDoc)" />
<DxGridDataColumn FieldName="NetWeightOnDocument" Caption="Net.súly(OnDoc)" /> <DxGridDataColumn FieldName="NetWeightOnDocument" Caption="Net.súly(OnDoc)" />
<DxGridDataColumn FieldName="GrossWeightOnDocument" Caption="Br.súly(OnDoc)" /> <DxGridDataColumn FieldName="GrossWeightOnDocument" Caption="Br.súly(OnDoc)" />
<DxGridDataColumn FieldName="MeasuringCount" Caption="Mérések száma" /> <DxGridDataColumn FieldName="MeasuringCount" Caption="Mérések száma" />
<DxGridDataColumn FieldName="MeasuredQuantity" Name="MeasuredQuantity" Caption="Mért mennyiség" ReadOnly="true" /> <DxGridDataColumn FieldName="MeasuredQuantity" Name="MeasuredQuantity" Caption="Mért mennyiség" ReadOnly="true" />
<DxGridDataColumn FieldName="MeasuredNetWeight" Name="MeasuredNetWeight" Caption="Mért net.súly(kg)" ReadOnly="true" /> <DxGridDataColumn FieldName="MeasuredNetWeight" Name="MeasuredNetWeight" Caption="Mért net.súly(kg)" ReadOnly="true" />
<DxGridDataColumn FieldName="MeasuredGrossWeight" Name="MeasuredGrossWeight" Caption="Mért br.súly(kg)" ReadOnly="true" /> <DxGridDataColumn FieldName="MeasuredGrossWeight" Name="MeasuredGrossWeight" Caption="Mért br.súly(kg)" ReadOnly="true" />
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" /> <DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
<DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" /> <DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" />
<DxGridDataColumn FieldName="Created" ReadOnly="true" /> <DxGridDataColumn FieldName="Created" ReadOnly="true" />
<DxGridDataColumn FieldName="Modified" ReadOnly="true" /> <DxGridDataColumn FieldName="Modified" ReadOnly="true" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
@* <DataColumnCellDisplayTemplate> @* <DataColumnCellDisplayTemplate>
@{ @{
if (context.DataColumn.FieldName == nameof(ShippingItem.ShippingDocumentId)) if (context.DataColumn.FieldName == nameof(ShippingItem.ShippingDocumentId))
{ {
@ -100,30 +102,31 @@
} }
</DataColumnCellDisplayTemplate> </DataColumnCellDisplayTemplate>
*@ <DetailRowTemplate> *@ <DetailRowTemplate>
@{ @{
var shippingItemPallets = ((ShippingItem)context.DataItem).ShippingItemPallets; var shippingItemPallets = ((ShippingItem)context.DataItem).ShippingItemPallets;
<GridShippingItemPallets ShippingItemPallets="shippingItemPallets" IsMasterGrid="false"></GridShippingItemPallets> <GridShippingItemPallets ShippingItemPallets="shippingItemPallets" IsMasterGrid="false"></GridShippingItemPallets>
} }
</DetailRowTemplate> </DetailRowTemplate>
<ToolbarTemplate> <ToolbarTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" /> <MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
} }
</ToolbarTemplate> </ToolbarTemplate>
<GroupSummary> <GroupSummary>
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum" <DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
FieldName="MeasuredQuantity" FieldName="MeasuredQuantity"
FooterColumnName="Quantity" /> FooterColumnName="Quantity" />
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum" <DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
FieldName="MeasuredGrossWeight" FieldName="MeasuredGrossWeight"
FooterColumnName="GrossWeight" /> FooterColumnName="GrossWeight" />
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum" <DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
FieldName="MeasuredNetWeight" FieldName="MeasuredNetWeight"
FooterColumnName="NetWeight" /> FooterColumnName="NetWeight" />
</GroupSummary> </GroupSummary>
</GridShippingItemBase> </GridShippingItemBase>
@* </MgGridBase> *@ </GridContent>
</MgGridWithInfoPanel>
@code { @code {
//[Inject] public required ObjectLock ObjectLock { get; set; } //[Inject] public required ObjectLock ObjectLock { get; set; }

View File

@ -15,32 +15,36 @@
@inject IEnumerable<IAcLogWriterClientBase> LogWriters @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject FruitBankSignalRClient FruitBankSignalRClient @inject FruitBankSignalRClient FruitBankSignalRClient
<GridGenericAttributeBase @ref="Grid" DataSource="GenericAttributes" AutoSaveLayoutName="GridGenericAttribute" SignalRClient="FruitBankSignalRClient" Logger="_logger" <MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
ParentDataItem="@ParentDataItem" CssClass="@GridCss" ValidationEnabled="false" OnGridFocusedRowChanged="Grid_FocusedRowChanged"> <GridContent>
<Columns> <GridGenericAttributeBase @ref="Grid" DataSource="GenericAttributes" AutoSaveLayoutName="GridGenericAttribute" SignalRClient="FruitBankSignalRClient" Logger="_logger"
<DxGridDataColumn FieldName="@nameof(GenericAttribute.Id)" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> ParentDataItem="@ParentDataItem" CssClass="@GridCss" ValidationEnabled="false" OnGridFocusedRowChanged="Grid_FocusedRowChanged">
<Columns>
<DxGridDataColumn FieldName="@nameof(GenericAttribute.Id)" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<DxGridDataColumn FieldName="@nameof(GenericAttribute.KeyGroup)" ReadOnly="true" /> <DxGridDataColumn FieldName="@nameof(GenericAttribute.KeyGroup)" ReadOnly="true" />
<DxGridDataColumn FieldName="@nameof(GenericAttribute.Key)" /> <DxGridDataColumn FieldName="@nameof(GenericAttribute.Key)" />
<DxGridDataColumn FieldName="@nameof(GenericAttribute.Value)" /> <DxGridDataColumn FieldName="@nameof(GenericAttribute.Value)" />
<DxGridDataColumn FieldName="@nameof(GenericAttribute.EntityId)" ReadOnly="true" /> <DxGridDataColumn FieldName="@nameof(GenericAttribute.EntityId)" ReadOnly="true" />
<DxGridDataColumn FieldName="@nameof(GenericAttribute.StoreId)" ReadOnly="true" /> <DxGridDataColumn FieldName="@nameof(GenericAttribute.StoreId)" ReadOnly="true" />
<DxGridDataColumn FieldName="@nameof(GenericAttribute.CreatedOrUpdatedDateUTC)" ReadOnly="true" /> <DxGridDataColumn FieldName="@nameof(GenericAttribute.CreatedOrUpdatedDateUTC)" ReadOnly="true" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
<ToolbarTemplate> <ToolbarTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" /> <MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
} }
</ToolbarTemplate> </ToolbarTemplate>
</GridGenericAttributeBase> </GridGenericAttributeBase>
</GridContent>
</MgGridWithInfoPanel>
@code { @code {
[Inject] public required DatabaseClient Database { get; set; } [Inject] public required DatabaseClient Database { get; set; }
[Parameter] public AcObservableCollection<GenericAttributeDto>? GenericAttributes{ get; set; } [Parameter] public AcObservableCollection<GenericAttributeDto>? GenericAttributes { get; set; }
//[Parameter] public object[]? ContextIds { get; set; } //[Parameter] public object[]? ContextIds { get; set; }
[Parameter] public IId<int>? ParentDataItem { get; set; } [Parameter] public IId<int>? ParentDataItem { get; set; }

View File

@ -13,62 +13,66 @@
@inject IEnumerable<IAcLogWriterClientBase> LogWriters @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject FruitBankSignalRClient FruitBankSignalRClient @inject FruitBankSignalRClient FruitBankSignalRClient
<GridPartnerBase @ref="Grid" <MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
DataSource="Partners" <GridContent>
AutoSaveLayoutName="GridPartner" <GridPartnerBase @ref="Grid"
SignalRClient="FruitBankSignalRClient" DataSource="Partners"
Logger="_logger" AutoSaveLayoutName="GridPartner"
CssClass="@GridCss" SignalRClient="FruitBankSignalRClient"
ValidationEnabled="false" Logger="_logger"
ShowInfoPanel="true" CssClass="@GridCss"
OnGridFocusedRowChanged="Grid_FocusedRowChanged"> ValidationEnabled="false"
<Columns> ShowInfoPanel="true"
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> OnGridFocusedRowChanged="Grid_FocusedRowChanged">
<Columns>
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<DxGridDataColumn FieldName="Name" /> <DxGridDataColumn FieldName="Name" />
<DxGridDataColumn FieldName="TaxId" /> <DxGridDataColumn FieldName="TaxId" />
<DxGridDataColumn FieldName="CertificationNumber" /> <DxGridDataColumn FieldName="CertificationNumber" />
<DxGridDataColumn FieldName="PostalCode" /> <DxGridDataColumn FieldName="PostalCode" />
<DxGridDataColumn FieldName="@nameof(Partner.Country)" /> <DxGridDataColumn FieldName="@nameof(Partner.Country)" />
<DxGridDataColumn FieldName="State" /> <DxGridDataColumn FieldName="State" />
<DxGridDataColumn FieldName="County" /> <DxGridDataColumn FieldName="County" />
<DxGridDataColumn FieldName="City" /> <DxGridDataColumn FieldName="City" />
<DxGridDataColumn FieldName="Street" /> <DxGridDataColumn FieldName="Street" />
<DxGridDataColumn FieldName="Created" ReadOnly="true" /> <DxGridDataColumn FieldName="Created" ReadOnly="true" />
<DxGridDataColumn FieldName="Modified" ReadOnly="true" /> <DxGridDataColumn FieldName="Modified" ReadOnly="true" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
<DetailRowTemplate> <DetailRowTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
var partner = ((Partner)context.DataItem); var partner = ((Partner)context.DataItem);
var shippingDocuments = partner?.ShippingDocuments ?? []; var shippingDocuments = partner?.ShippingDocuments ?? [];
<DxTabs> <DxTabs>
<DxTabPage Text="Szállítólevelek"> <DxTabPage Text="Szállítólevelek">
@{ @{
var observableShippingDocuments = new AcObservableCollection<ShippingDocument>(shippingDocuments); var observableShippingDocuments = new AcObservableCollection<ShippingDocument>(shippingDocuments);
<GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@partner" Partners="@Partners"></GridShippingDocument> <GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@partner" Partners="@Partners"></GridShippingDocument>
} }
</DxTabPage> </DxTabPage>
<DxTabPage Text="Szállítmány tételek"> <DxTabPage Text="Szállítmány tételek">
@{ @{
var observableShippingItems = new AcObservableCollection<ShippingItem>(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? [])); var observableShippingItems = new AcObservableCollection<ShippingItem>(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? []));
<GridShippingItemTemplate ShippingItems="@observableShippingItems" ParentDataItem="@partner" /> <GridShippingItemTemplate ShippingItems="@observableShippingItems" ParentDataItem="@partner" />
} }
</DxTabPage> </DxTabPage>
</DxTabs> </DxTabs>
} }
</DetailRowTemplate> </DetailRowTemplate>
<ToolbarTemplate> <ToolbarTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" /> <MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
} }
</ToolbarTemplate> </ToolbarTemplate>
</GridPartnerBase> </GridPartnerBase>
</GridContent>
</MgGridWithInfoPanel>
@code { @code {
//[Inject] public required ObjectLock ObjectLock { get; set; } //[Inject] public required ObjectLock ObjectLock { get; set; }

View File

@ -11,45 +11,47 @@
@inject IEnumerable<IAcLogWriterClientBase> LogWriters @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject FruitBankSignalRClient FruitBankSignalRClient @inject FruitBankSignalRClient FruitBankSignalRClient
<GridStockQuantityHistoryDtoBase @ref="Grid" ContextIds="ContextIds" ParentDataItem="ParentDataItem" DataSource="StockQuantityHistoryDtos" <MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
AutoSaveLayoutName="GridStockQuantityHistoryDto" SignalRClient="FruitBankSignalRClient" Logger="_logger" <GridContent>
CssClass="@GridCss" ValidationEnabled="false"> <GridStockQuantityHistoryDtoBase @ref="Grid" ContextIds="ContextIds" ParentDataItem="ParentDataItem" DataSource="StockQuantityHistoryDtos"
<Columns> AutoSaveLayoutName="GridStockQuantityHistoryDto" SignalRClient="FruitBankSignalRClient" Logger="_logger"
<DxGridDataColumn FieldName="Id" Width="125" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> CssClass="@GridCss" ValidationEnabled="false">
<Columns>
<DxGridDataColumn FieldName="Id" Width="125" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<DxGridDataColumn FieldName="ProductId" ReadOnly="true" Visible="@IsMasterGrid"> <DxGridDataColumn FieldName="ProductId" ReadOnly="true" Visible="@IsMasterGrid">
<EditSettings> <EditSettings>
<DxComboBoxSettings Data="ProductDtos" <DxComboBoxSettings Data="ProductDtos"
ValueFieldName="Id" ValueFieldName="Id"
TextFieldName="Name" TextFieldName="Name"
DropDownBodyCssClass="dd-body-class" DropDownBodyCssClass="dd-body-class"
ListRenderMode="ListRenderMode.Entire" ListRenderMode="ListRenderMode.Entire"
SearchMode="ListSearchMode.AutoSearch" SearchMode="ListSearchMode.AutoSearch"
SearchFilterCondition="ListSearchFilterCondition.Contains" SearchFilterCondition="ListSearchFilterCondition.Contains"
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto" /> ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto" />
</EditSettings> </EditSettings>
</DxGridDataColumn> </DxGridDataColumn>
<DxGridDataColumn FieldName="QuantityAdjustment" Width="135" Caption="Adj. Quantity" ReadOnly="true" /> <DxGridDataColumn FieldName="QuantityAdjustment" Width="135" Caption="Adj. Quantity" ReadOnly="true" />
<DxGridDataColumn FieldName="StockQuantity" Width="135" ReadOnly="true" /> <DxGridDataColumn FieldName="StockQuantity" Width="135" ReadOnly="true" />
<DxGridDataColumn FieldName="StockQuantityHistoryId" Width="135" Caption="SqhId" ReadOnly="true" Visible="false" /> <DxGridDataColumn FieldName="StockQuantityHistoryId" Width="135" Caption="SqhId" ReadOnly="true" Visible="false" />
<DxGridDataColumn FieldName="NetWeightAdjustment" Width="135" Caption="Adj. NetWeight(kg)" ReadOnly="true" /> <DxGridDataColumn FieldName="NetWeightAdjustment" Width="135" Caption="Adj. NetWeight(kg)" ReadOnly="true" />
<DxGridDataColumn FieldName="NetWeight" Width="135" Caption="Net Weight(kg)" ReadOnly="true" /> <DxGridDataColumn FieldName="NetWeight" Width="135" Caption="Net Weight(kg)" ReadOnly="true" />
<DxGridDataColumn FieldName="Message" ReadOnly="true" /> <DxGridDataColumn FieldName="Message" ReadOnly="true" />
<DxGridDataColumn FieldName="IsInconsistent" Width="105" Caption="Inconsistent" ReadOnly="true" /> <DxGridDataColumn FieldName="IsInconsistent" Width="105" Caption="Inconsistent" ReadOnly="true" />
<DxGridDataColumn FieldName="CombinationId" Width="125" ReadOnly="true" Visible="false" /> <DxGridDataColumn FieldName="CombinationId" Width="125" ReadOnly="true" Visible="false" />
<DxGridDataColumn FieldName="WarehouseId" Width="125" ReadOnly="true" Visible="false" /> <DxGridDataColumn FieldName="WarehouseId" Width="125" ReadOnly="true" Visible="false" />
<DxGridDataColumn FieldName="CreatedOnUtc" Width="150" Caption="Created" ReadOnly="true" DisplayFormat="g" /> <DxGridDataColumn FieldName="CreatedOnUtc" Width="150" Caption="Created" ReadOnly="true" DisplayFormat="g" />
</Columns> </Columns>
<ToolbarTemplate> <ToolbarTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" /> <MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
} }
</ToolbarTemplate> </ToolbarTemplate>
@* <GroupSummary> @* <GroupSummary>
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum" <DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
FieldName="MeasuredQuantity" FieldName="MeasuredQuantity"
FooterColumnName="Quantity" /> FooterColumnName="Quantity" />
@ -60,7 +62,9 @@
FieldName="MeasuredNetWeight" FieldName="MeasuredNetWeight"
FooterColumnName="NetWeight" /> FooterColumnName="NetWeight" />
</GroupSummary> *@ </GroupSummary> *@
</GridStockQuantityHistoryDtoBase> </GridStockQuantityHistoryDtoBase>
</GridContent>
</MgGridWithInfoPanel>
@code { @code {
[Inject] public required DatabaseClient Database { get; set; } [Inject] public required DatabaseClient Database { get; set; }

View File

@ -5,15 +5,15 @@
@inject IJSRuntime JS @inject IJSRuntime JS
<MgGridInfoPanel OnDataItemChanged="OnDataItemChangedAsync"> <MgGridInfoPanel OnDataItemChanged="OnDataItemChangedAsync">
@* <HeaderTemplate Context="dataItem"> @* <HeaderTemplate Context="ctx">
<div class="dxbl-grid-header-panel px-3 py-2 border-bottom d-flex align-items-center"> <div class="dxbl-grid-header-panel px-3 py-2 border-bottom d-flex align-items-center">
<span class="me-2">??</span> <span class="me-2">??</span>
<span class="fw-semibold">Szállítólevél részletei</span> <span class="fw-semibold">Szállítólevél részletei</span>
</div> </div>
</HeaderTemplate> *@ </HeaderTemplate> *@
@* <BeforeColumnsTemplate Context="dataItem"> @* <BeforeColumnsTemplate Context="ctx">
@if (dataItem is ShippingDocument doc) @if (ctx.DataItem is ShippingDocument doc)
{ {
<div class="alert alert-info mb-2 py-1 px-2 small"> <div class="alert alert-info mb-2 py-1 px-2 small">
<strong>Partner:</strong> @doc.Partner?.Name <strong>Partner:</strong> @doc.Partner?.Name
@ -21,8 +21,8 @@
} }
</BeforeColumnsTemplate> *@ </BeforeColumnsTemplate> *@
<AfterColumnsTemplate Context="dataItem"> <AfterColumnsTemplate Context="ctx">
@if (dataItem is ShippingDocument doc) @if (ctx is { IsEditMode: false, DataItem: ShippingDocument doc })
{ {
<table class="table table-sm table-bordered table-striped" style="margin-top: 35px;"> <table class="table table-sm table-bordered table-striped" style="margin-top: 35px;">
<colgroup> <colgroup>
@ -73,7 +73,7 @@
} }
</AfterColumnsTemplate> </AfterColumnsTemplate>
@* <FooterTemplate Context="dataItem"> @* <FooterTemplate Context="ctx">
<div class="p-2 border-top d-flex gap-2"> <div class="p-2 border-top d-flex gap-2">
<DxButton Text="Nyomtatás" IconCssClass="dx-icon dx-icon-print" RenderStyle="ButtonRenderStyle.Light" /> <DxButton Text="Nyomtatás" IconCssClass="dx-icon dx-icon-print" RenderStyle="ButtonRenderStyle.Light" />
<DxButton Text="Export" IconCssClass="dx-icon dx-icon-export" RenderStyle="ButtonRenderStyle.Light" /> <DxButton Text="Export" IconCssClass="dx-icon dx-icon-export" RenderStyle="ButtonRenderStyle.Light" />

View File

@ -15,50 +15,54 @@
@* <GridShippingBase @ref="Grid" Data="Shippings" AutoSaveLayoutName="GridShipping"> *@ @* <GridShippingBase @ref="Grid" Data="Shippings" AutoSaveLayoutName="GridShipping"> *@
<GridShippingBase @ref="Grid" DataSource="Shippings" AutoSaveLayoutName="GridShipping" SignalRClient="FruitBankSignalRClient" Logger="_logger" <MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
CssClass="@GridCss" ValidationEnabled="false" <GridContent>
OnGridFocusedRowChanged="Grid_FocusedRowChanged"> <GridShippingBase @ref="Grid" DataSource="Shippings" AutoSaveLayoutName="GridShipping" SignalRClient="FruitBankSignalRClient" Logger="_logger"
<Columns> CssClass="@GridCss" ValidationEnabled="false"
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> OnGridFocusedRowChanged="Grid_FocusedRowChanged">
<Columns>
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<DxGridDataColumn FieldName="ShippingDate" /> <DxGridDataColumn FieldName="ShippingDate" />
<DxGridDataColumn FieldName="LicencePlate" /> <DxGridDataColumn FieldName="LicencePlate" />
<DxGridDataColumn FieldName="IsAllMeasured" ReadOnly="true" /> <DxGridDataColumn FieldName="IsAllMeasured" ReadOnly="true" />
<DxGridDataColumn FieldName="Created" ReadOnly="true" /> <DxGridDataColumn FieldName="Created" ReadOnly="true" />
<DxGridDataColumn FieldName="Modified" ReadOnly="true" /> <DxGridDataColumn FieldName="Modified" ReadOnly="true" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
<DetailRowTemplate> <DetailRowTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
var shipping = ((Shipping)context.DataItem); var shipping = ((Shipping)context.DataItem);
var shippingDocuments = shipping?.ShippingDocuments ?? []; var shippingDocuments = shipping?.ShippingDocuments ?? [];
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)"> <DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)">
<DxTabPage Text="Szállítólevelek"> <DxTabPage Text="Szállítólevelek">
@{ @{
var observableShippingDocuments = new AcObservableCollection<ShippingDocument>(shippingDocuments); var observableShippingDocuments = new AcObservableCollection<ShippingDocument>(shippingDocuments);
<GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@shipping" Partners="@Partners"></GridShippingDocument> <GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@shipping" Partners="@Partners"></GridShippingDocument>
} }
</DxTabPage> </DxTabPage>
<DxTabPage Text="Szállítmány tételek"> <DxTabPage Text="Szállítmány tételek">
@{ @{
var observableShippingItems = new AcObservableCollection<ShippingItem>(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? [])); var observableShippingItems = new AcObservableCollection<ShippingItem>(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? []));
<GridShippingItemTemplate ShippingItems="@observableShippingItems" ParentDataItem="@shipping" /> <GridShippingItemTemplate ShippingItems="@observableShippingItems" ParentDataItem="@shipping" />
} }
</DxTabPage> </DxTabPage>
</DxTabs> </DxTabs>
} }
</DetailRowTemplate> </DetailRowTemplate>
<ToolbarTemplate> <ToolbarTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" /> <MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
} }
</ToolbarTemplate> </ToolbarTemplate>
</GridShippingBase> </GridShippingBase>
</GridContent>
</MgGridWithInfoPanel>
@code { @code {
//[Inject] public required ObjectLock ObjectLock { get; set; } //[Inject] public required ObjectLock ObjectLock { get; set; }

View File

@ -13,43 +13,47 @@
@inject IEnumerable<IAcLogWriterClientBase> LogWriters @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject FruitBankSignalRClient FruitBankSignalRClient @inject FruitBankSignalRClient FruitBankSignalRClient
<GridStockTakingItemBase @ref="Grid" AutoSaveLayoutName="GridStockTakingItem" SignalRClient="FruitBankSignalRClient" Logger="_logger" <MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
CssClass="@GridCss" ValidationEnabled="false" OnGridFocusedRowChanged="Grid_FocusedRowChanged"> <GridContent>
<Columns> <GridStockTakingItemBase @ref="Grid" AutoSaveLayoutName="GridStockTakingItem" SignalRClient="FruitBankSignalRClient" Logger="_logger"
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> CssClass="@GridCss" ValidationEnabled="false" OnGridFocusedRowChanged="Grid_FocusedRowChanged">
<Columns>
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.StockTakingId)" TextAlignment="GridTextAlignment.Left" Caption="Leltár időpontja"> <DxGridDataColumn FieldName="@nameof(StockTakingItem.StockTakingId)" TextAlignment="GridTextAlignment.Left" Caption="Leltár időpontja">
<CellDisplayTemplate> <CellDisplayTemplate>
<span>@(((StockTakingItem)context.DataItem)?.StockTaking?.StartDateTime.ToString("g") ?? "")</span> <span>@(((StockTakingItem)context.DataItem)?.StockTaking?.StartDateTime.ToString("g") ?? "")</span>
</CellDisplayTemplate> </CellDisplayTemplate>
</DxGridDataColumn> </DxGridDataColumn>
<DxGridDataColumn FieldName="Product.Name" /> <DxGridDataColumn FieldName="Product.Name" />
<DxGridDataColumn FieldName="OriginalStockQuantity" /> <DxGridDataColumn FieldName="OriginalStockQuantity" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.InProcessOrdersQuantity)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.InProcessOrdersQuantity)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.TotalOriginalQuantity)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.TotalOriginalQuantity)" />
<DxGridDataColumn FieldName="MeasuredStockQuantity" /> <DxGridDataColumn FieldName="MeasuredStockQuantity" />
<DxGridDataColumn FieldName="OriginalNetWeight" /> <DxGridDataColumn FieldName="OriginalNetWeight" />
<DxGridDataColumn FieldName="MeasuredNetWeight" /> <DxGridDataColumn FieldName="MeasuredNetWeight" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.QuantityDiff)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.QuantityDiff)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.NetWeightDiff)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.NetWeightDiff)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.IsMeasurable)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.IsMeasurable)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.IsMeasured)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.IsMeasured)" />
<DxGridDataColumn FieldName="@nameof(StockTakingItem.IsInvalid)" /> <DxGridDataColumn FieldName="@nameof(StockTakingItem.IsInvalid)" />
<DxGridDataColumn FieldName="Created" ReadOnly="true" Visible="false" DisplayFormat="g" /> <DxGridDataColumn FieldName="Created" ReadOnly="true" Visible="false" DisplayFormat="g" />
<DxGridDataColumn FieldName="Modified" ReadOnly="true" DisplayFormat="g" /> <DxGridDataColumn FieldName="Modified" ReadOnly="true" DisplayFormat="g" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
<ToolbarTemplate> <ToolbarTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" /> <MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
} }
</ToolbarTemplate> </ToolbarTemplate>
</GridStockTakingItemBase> </GridStockTakingItemBase>
</GridContent>
</MgGridWithInfoPanel>
@code { @code {

View File

@ -1,82 +1,82 @@
html, body { html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
min-height: 100vh; min-height: 100vh;
} }
a, .btn-link { a, .btn-link {
color: #006bb7; color: #006bb7;
} }
.btn-primary { .btn-primary {
color: #fff; color: #fff;
background-color: #1b6ec2; background-color: #1b6ec2;
border-color: #1861ac; border-color: #1861ac;
} }
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { .btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
} }
.content { .content {
padding-top: 1.1rem; padding-top: 1.1rem;
} }
h1:focus { h1:focus {
outline: none; outline: none;
} }
.valid.modified:not([type=checkbox]) { .valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050; outline: 1px solid #26b050;
} }
.invalid { .invalid {
outline: 1px solid #e50000; outline: 1px solid #e50000;
} }
.validation-message { .validation-message {
color: #e50000; color: #e50000;
} }
.blazor-error-boundary { .blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA9NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDg2IDYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA9NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDg2IDYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
padding: 1rem 1rem 1rem 3.7rem; padding: 1rem 1rem 1rem 3.7rem;
color: white; color: white;
} }
.blazor-error-boundary::after { .blazor-error-boundary::after {
content: "An error has occurred." content: "An error has occurred."
} }
.darker-border-checkbox.form-check-input { .darker-border-checkbox.form-check-input {
border-color: #929292; border-color: #929292;
} }
.icon { .icon {
--icon-width: 1.25rem; --icon-width: 1.25rem;
--icon-height: 1.25rem; --icon-height: 1.25rem;
--icon-home-mask-image: url("images/home-fluent.svg"); --icon-home-mask-image: url("images/home-fluent.svg");
--icon-weather-mask-image: url("images/weather-fluent.svg"); --icon-weather-mask-image: url("images/weather-fluent.svg");
--icon-counter-mask-image: url("images/counter-fluent.svg"); --icon-counter-mask-image: url("images/counter-fluent.svg");
--icon-ok_green-mask-image: url("images/ok_green_lt.svg"); --icon-ok_green-mask-image: url("images/ok_green_lt.svg");
} }
.icon { .icon {
width: var(--icon-width); width: var(--icon-width);
height: var(--icon-height); height: var(--icon-height);
background-color: currentcolor; background-color: currentcolor;
mask-position: center center; mask-position: center center;
-webkit-mask-repeat: no-repeat; -webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat; mask-repeat: no-repeat;
-webkit-mask-image: var(--icon-mask-image); -webkit-mask-image: var(--icon-mask-image);
mask-image: var(--icon-mask-image); mask-image: var(--icon-mask-image);
} }
.measuring-form-layout { .measuring-form-layout {
margin-top: 15px; margin-top: 15px;
margin-bottom: 25px; margin-bottom: 25px;
padding: 8px; padding: 8px;
background-color: lightgrey; background-color: lightgrey;
border-radius: 8px; border-radius: 8px;
} }
.dd-body-class, .dd-body-class,
@ -92,11 +92,11 @@ h1:focus {
*/ */
.hide-toolbar .dxbl-grid-toolbar-container { .hide-toolbar .dxbl-grid-toolbar-container {
display: none; display: none;
} }
.hideDetailButton .dxbl-grid-expand-button-cell .dxbl-grid-expand-button { .hideDetailButton .dxbl-grid-expand-button-cell .dxbl-grid-expand-button {
visibility: hidden; visibility: hidden;
} }
.header-bold span { .header-bold span {
@ -110,9 +110,10 @@ h1:focus {
background-color: #F7F7F7 !important; background-color: #F7F7F7 !important;
color: #161616; color: #161616;
} }
/* Fluent Themes */
/*.alt-item { /* DevExpress Fluent Theme - alternating row colors */
--dxbl-grid-row-bg: var(--DS-color-surface-neutral-subdued-rest); /*.alt-item > td:not(.dxbl-grid-empty-cell):not(.dxbl-grid-indent-cell) {
background-color: var(--DS-color-surface-neutral-subdued-rest) !important;
}*/ }*/
/*endregion: DSGrids*/ /*endregion: DSGrids*/
@ -120,33 +121,33 @@ h1:focus {
.order-notification-toast { .order-notification-toast {
padding: 4px; padding: 4px;
} }
.order-notification-toast .message { .order-notification-toast .message {
font-weight: 600; font-weight: 600;
margin-bottom: 8px; margin-bottom: 8px;
font-size: 14px; font-size: 14px;
} }
.order-notification-toast .order-info { .order-notification-toast .order-info {
margin-bottom: 4px; margin-bottom: 4px;
font-size: 13px; font-size: 13px;
} }
.order-notification-toast .label { .order-notification-toast .label {
color: #666; color: #666;
margin-right: 4px; margin-right: 4px;
} }
.order-notification-toast .order-number { .order-notification-toast .order-number {
font-weight: bold; font-weight: bold;
color: #0066cc; color: #0066cc;
} }
.order-notification-toast .date { .order-notification-toast .date {
font-weight: 500; font-weight: 500;
} }
/* ======================================== /* ========================================
Grid Toolbar Icons - SVG based Grid Toolbar Icons - SVG based
======================================== */ ======================================== */
@ -164,108 +165,108 @@ h1:focus {
.grid-export-xlsx, .grid-export-xlsx,
.grid-export-pdf, .grid-export-pdf,
.grid-refresh { .grid-refresh {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.grid-new-row::before, .grid-new-row::before,
.grid-edit-row::before, .grid-edit-row::before,
.grid-delete-row::before, .grid-delete-row::before,
.grid-save::before, .grid-save::before,
.grid-cancel::before, .grid-cancel::before,
.grid-chevron-up::before, .grid-chevron-up::before,
.grid-chevron-down::before, .grid-chevron-down::before,
.grid-column-chooser::before, .grid-column-chooser::before,
.grid-export::before, .grid-export::before,
.grid-export-xlsx::before, .grid-export-xlsx::before,
.grid-export-pdf::before, .grid-export-pdf::before,
.grid-refresh::before { .grid-refresh::before {
content: ""; content: "";
display: inline-block; display: inline-block;
width: 1.25rem; width: 1.25rem;
height: 1.25rem; height: 1.25rem;
margin-right: 0.25rem; margin-right: 0.25rem;
background-color: currentColor; background-color: currentColor;
mask-size: contain; mask-size: contain;
mask-repeat: no-repeat; mask-repeat: no-repeat;
mask-position: center; mask-position: center;
-webkit-mask-size: contain; -webkit-mask-size: contain;
-webkit-mask-repeat: no-repeat; -webkit-mask-repeat: no-repeat;
-webkit-mask-position: center; -webkit-mask-position: center;
} }
/* Plus icon (New) */ /* Plus icon (New) */
.grid-new-row::before { .grid-new-row::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E");
} }
/* Edit/Pencil icon */ /* Edit/Pencil icon */
.grid-edit-row::before { .grid-edit-row::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z'/%3E%3C/svg%3E");
} }
/* Trash/Delete icon */ /* Trash/Delete icon */
.grid-delete-row::before { .grid-delete-row::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='3 6 5 6 21 6'/%3E%3Cpath d='M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='3 6 5 6 21 6'/%3E%3Cpath d='M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='3 6 5 6 21 6'/%3E%3Cpath d='M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='3 6 5 6 21 6'/%3E%3Cpath d='M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'/%3E%3C/svg%3E");
} }
/* Save/Check icon */ /* Save/Check icon */
.grid-save::before { .grid-save::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z'/%3E%3Cpolyline points='17 21 17 13 7 13 7 21'/%3E%3Cpolyline points='7 3 7 8 15 8'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z'/%3E%3Cpolyline points='17 21 17 13 7 13 7 21'/%3E%3Cpolyline points='7 3 7 8 15 8'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z'/%3E%3Cpolyline points='17 21 17 13 7 13 7 21'/%3E%3Cpolyline points='7 3 7 8 15 8'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z'/%3E%3Cpolyline points='17 21 17 13 7 13 7 21'/%3E%3Cpolyline points='7 3 7 8 15 8'/%3E%3C/svg%3E");
} }
/* Cancel/Close icon */ /* Cancel/Close icon */
.grid-cancel::before { .grid-cancel::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E");
} }
/* Chevron Up icon */ /* Chevron Up icon */
.grid-chevron-up::before { .grid-chevron-up::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='18 15 12 9 6 15'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='18 15 12 9 6 15'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='18 15 12 9 6 15'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='18 15 12 9 6 15'/%3E%3C/svg%3E");
} }
/* Chevron Down icon */ /* Chevron Down icon */
.grid-chevron-down::before { .grid-chevron-down::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
} }
/* Column Chooser icon */ /* Column Chooser icon */
.grid-column-chooser::before { .grid-column-chooser::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Crect x='3' y='3' width='18' height='18' rx='2' ry='2'/%3E%3Cline x1='12' y1='3' x2='12' y2='21'/%3E%3Cline x1='3' y1='9' x2='21' y2='9'/%3E%3Cline x1='3' y1='15' x2='21' y2='15'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Crect x='3' y='3' width='18' height='18' rx='2' ry='2'/%3E%3Cline x1='12' y1='3' x2='12' y2='21'/%3E%3Cline x1='3' y1='9' x2='21' y2='9'/%3E%3Cline x1='3' y1='15' x2='21' y2='15'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Crect x='3' y='3' width='18' height='18' rx='2' ry='2'/%3E%3Cline x1='12' y1='3' x2='12' y2='21'/%3E%3Cline x1='3' y1='9' x2='21' y2='9'/%3E%3Cline x1='3' y1='15' x2='21' y2='15'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Crect x='3' y='3' width='18' height='18' rx='2' ry='2'/%3E%3Cline x1='12' y1='3' x2='12' y2='21'/%3E%3Cline x1='3' y1='9' x2='21' y2='9'/%3E%3Cline x1='3' y1='15' x2='21' y2='15'/%3E%3C/svg%3E");
} }
/* Export icon */ /* Export icon */
.grid-export::before { .grid-export::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/%3E%3Cpolyline points='17 8 12 3 7 8'/%3E%3Cline x1='12' y1='3' x2='12' y2='15'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/%3E%3Cpolyline points='17 8 12 3 7 8'/%3E%3Cline x1='12' y1='3' x2='12' y2='15'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/%3E%3Cpolyline points='17 8 12 3 7 8'/%3E%3Cline x1='12' y1='3' x2='12' y2='15'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/%3E%3Cpolyline points='17 8 12 3 7 8'/%3E%3Cline x1='12' y1='3' x2='12' y2='15'/%3E%3C/svg%3E");
} }
/* Export XLSX icon */ /* Export XLSX icon */
.grid-export-xlsx::before { .grid-export-xlsx::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='8' y1='13' x2='16' y2='13'/%3E%3Cline x1='8' y1='17' x2='16' y2='17'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='8' y1='13' x2='16' y2='13'/%3E%3Cline x1='8' y1='17' x2='16' y2='17'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='8' y1='13' x2='16' y2='13'/%3E%3Cline x1='8' y1='17' x2='16' y2='17'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='8' y1='13' x2='16' y2='13'/%3E%3Cline x1='8' y1='17' x2='16' y2='17'/%3E%3C/svg%3E");
} }
/* Export PDF icon */ /* Export PDF icon */
.grid-export-pdf::before { .grid-export-pdf::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cpath d='M9 15h6'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cpath d='M9 15h6'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cpath d='M9 15h6'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cpath d='M9 15h6'/%3E%3C/svg%3E");
} }
/* Refresh icon */ /* Refresh icon */
.grid-refresh::before { .grid-refresh::before {
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='23 4 23 10 17 10'/%3E%3Cpolyline points='1 20 1 14 7 14'/%3E%3Cpath d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='23 4 23 10 17 10'/%3E%3Cpolyline points='1 20 1 14 7 14'/%3E%3Cpath d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/%3E%3C/svg%3E");
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='23 4 23 10 17 10'/%3E%3Cpolyline points='1 20 1 14 7 14'/%3E%3Cpath d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='23 4 23 10 17 10'/%3E%3Cpolyline points='1 20 1 14 7 14'/%3E%3Cpath d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/%3E%3C/svg%3E");
} }
/* ======================================== /* ========================================
MgGrid Splitter with InfoPanel MgGrid Splitter with InfoPanel
@ -274,10 +275,10 @@ h1:focus {
/* Splitter - allow natural height, page scroll is enabled */ /* Splitter - allow natural height, page scroll is enabled */
.mg-grid-splitter { .mg-grid-splitter {
/* No max-height - allow page to scroll naturally */ /* No max-height - allow page to scroll naturally */
} }
/* InfoPanel pane - allow overflow for transform to work */ /* InfoPanel pane - allow overflow for transform to work */
.mg-info-panel-pane { .mg-info-panel-pane {
overflow: visible !important; overflow: visible !important;
} }