Skip to content

Use released PDF Viewer editor & fix chart dollar sign #81

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<DxPieChartSeries ArgumentField="(Opportunity item) => CaptionHelper.GetDisplayText(item.Stage)"
ValueField="Item => Item.Value"
SummaryMethod="items => items.Sum()">
<DxChartSeriesLabel Visible="true" Position="RelativePosition.Outside" ValueFormat="ChartElementFormat.Thousands(1)">
<DxChartSeriesLabel Visible="true" Position="RelativePosition.Outside" ValueFormat="ChartElementFormat.Thousands(1)" FormatPattern="${valueText}">
<DxChartSeriesLabelConnector Visible="true" />
</DxChartSeriesLabel>
</DxPieChartSeries>
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using DevExpress.ExpressApp;
using OutlookInspired.Blazor.Server.Editors.PdfViewer;
using DevExpress.Blazor.Reporting.Models;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Office.Blazor.Editors;
using Microsoft.AspNetCore.Components;
using OutlookInspired.Module.BusinessObjects;

namespace OutlookInspired.Blazor.Server.Features {
Expand All @@ -9,7 +11,8 @@ protected override void OnActivated() {
View.CustomizeViewItemControl<PdfViewerPropertyEditor>(this, item => {
item.ComponentModel.CssClass = "welcome-pdf-viewer";
item.ComponentModel.IsSinglePagePreview = true;
item.ComponentModel.CustomizeToolbar = EventCallback.Factory.Create<ToolbarModel>(this, toolbar => toolbar.AllItems.Clear());
});
}
}
}
}
8 changes: 0 additions & 8 deletions CS/OutlookInspired.Blazor.Server/wwwroot/css/site.css
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,3 @@ app {
height: 2rem;
}

.pe-pdf-viewer .dxbrv-toolbar {
height: 2rem;
}

.pe-pdf-viewer {
width: 100%;
height: 100vh;
}
82 changes: 40 additions & 42 deletions CS/OutlookInspired.Module/BusinessObjects/Order.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,81 +3,81 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.DC;
using DevExpress.ExpressApp.Utils;
using DevExpress.Persistent.Base;
using OutlookInspired.Module.Attributes;
using OutlookInspired.Module.Features;
using OutlookInspired.Module.Features.CloneView;
using OutlookInspired.Module.Features.Maps;
using BaseEditorAliases = DevExpress.ExpressApp.Editors.EditorAliases;


namespace OutlookInspired.Module.BusinessObjects{
namespace OutlookInspired.Module.BusinessObjects {
[XafDefaultProperty(nameof(InvoiceNumber))]
[CloneView(CloneViewType.DetailView, ChildDetailView)]
[CloneView(CloneViewType.DetailView, MapsDetailView)]
[CloneView(CloneViewType.DetailView, InvoiceDetailView)]
[CloneView(CloneViewType.ListView, ListViewDetail)]
[ImageName("BO_Order")][VisibleInReports(true)]
public class Order :OutlookInspiredBaseObject, IViewFilter,IRouteMapsMarker{
[ImageName("BO_Order")]
[VisibleInReports(true)]
public class Order : OutlookInspiredBaseObject, IViewFilter, IRouteMapsMarker {
public const string MapsDetailView = "Order_DetailView_Maps";
public const string InvoiceDetailView = "Order_Invoice_DetailView";
public const string ChildDetailView = "Order_DetailView_Child";
public const string ListViewDetail = "Order_ListView_Detail";

[XafDisplayName("Invoice #")]
[FontSizeDelta(4)][MaxLength(100)]
public virtual string InvoiceNumber { get; set; }

[FontSizeDelta(4)]
[MaxLength(100)]
public virtual string InvoiceNumber { get; set; }

public virtual Customer Customer { get; set; }
public virtual CustomerStore Store { get; set; }
[MaxLength(100)]
public virtual string PONumber { get; set; }
public virtual string PONumber { get; set; }
public virtual Employee Employee { get; set; }
public virtual DateOnly OrderDate { get; set; }
public virtual DateOnly OrderDate { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal SaleAmount { get; set; }
public virtual decimal SaleAmount { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal ShippingAmount { get; set; }
public virtual decimal ShippingAmount { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal TotalAmount { get; set; }
public virtual decimal TotalAmount { get; set; }

[Browsable(false)]
public virtual int Year => OrderDate.Year;
public virtual DateTime? ShipDate { get; set; }
public virtual OrderShipMethod ShipMethod { get; set; }
public virtual DateTime? ShipDate { get; set; }
public virtual OrderShipMethod ShipMethod { get; set; }
[EditorAlias(EditorAliases.DxHtmlPropertyEditor)]
public virtual byte[] OrderTerms { get; set; }
public virtual byte[] OrderTerms { get; set; }
[Aggregated]
public virtual ObservableCollection<OrderItem> OrderItems{ get; set; } = new();
public virtual ShipmentCourier ShipmentCourier { get; set; }
public virtual ObservableCollection<OrderItem> OrderItems { get; set; } = new();
public virtual ShipmentCourier ShipmentCourier { get; set; }
[EditorAlias(EditorAliases.EnumImageOnlyEditor)]
public virtual ShipmentStatus ShipmentStatus { get; set; }
public virtual ShipmentStatus ShipmentStatus { get; set; }

[HideInUI(HideInUI.DetailView)]
[XafDisplayName(nameof(ShipmentStatus))]
[ImageEditor(ListViewImageEditorMode = ImageEditorMode.PictureEdit,
DetailViewImageEditorMode = ImageEditorMode.PictureEdit,ImageSizeMode = ImageSizeMode.Zoom)]
DetailViewImageEditorMode = ImageEditorMode.PictureEdit, ImageSizeMode = ImageSizeMode.Zoom)]
public virtual byte[] ShipmentStatusImage => ImageLoader.Instance.GetEnumValueImageInfo(@ShipmentStatus).ImageBytes;

[EditorAlias(EditorAliases.PdfViewerEditor)]
[EditorAlias(BaseEditorAliases.PdfViewerPropertyEditor)]
[HideInUI(HideInUI.DetailView)]
[NotMapped]
public virtual byte[] ShipmentDetail{ get; set; } = [];


[EditorAlias(EditorAliases.PdfViewerEditor)]
public virtual byte[] ShipmentDetail { get; set; } = [];

[EditorAlias(BaseEditorAliases.PdfViewerPropertyEditor)]
// [HideInUI(HideInUI.DetailView)]
[VisibleInDetailView(false)]
[NotMapped]
public virtual byte[] InvoiceDocument{ get; set; } = [];
public virtual byte[] InvoiceDocument { get; set; } = [];
[EditorAlias(EditorAliases.DxHtmlPropertyEditor)]
public virtual byte[] Comments { get; set; }
public virtual byte[] Comments { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal RefundTotal { get; set; }
public virtual decimal RefundTotal { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal PaymentTotal { get; set; }
public virtual decimal PaymentTotal { get; set; }

[HideInUI(HideInUI.ListView)]
[PersistentAlias("[<TaxRate>][State = ^.Customer.BillingAddressState].Single(Rate) * TotalAmount")]
Expand All @@ -86,29 +86,27 @@ public class Order :OutlookInspiredBaseObject, IViewFilter,IRouteMapsMarker{
[PersistentAlias("Iif(" + nameof(PaymentTotal) + "=0 AND " + nameof(RefundTotal) + "=0,0,Iif(" +
nameof(RefundTotal) + "=" + nameof(TotalAmount) + ",3,Iif(" + nameof(PaymentTotal) + "=" +
nameof(TotalAmount) + ",1,2)))")]
public PaymentStatus PaymentStatus
public PaymentStatus PaymentStatus
=> Enum.TryParse(EvaluateAlias() as string, out PaymentStatus result) ? result : PaymentStatus.Other;

[HideInUI(HideInUI.DetailView)]
[XafDisplayName(nameof(ShipmentStatus))]
[ImageEditor(ListViewImageEditorMode = ImageEditorMode.PictureEdit,
DetailViewImageEditorMode = ImageEditorMode.PictureEdit,ImageSizeMode = ImageSizeMode.Zoom)]
DetailViewImageEditorMode = ImageEditorMode.PictureEdit, ImageSizeMode = ImageSizeMode.Zoom)]
public byte[] PaymentStatusImage => ImageLoader.Instance.GetEnumValueImageInfo(PaymentStatus).ImageBytes;

public double ActualWeight
public double ActualWeight
=> OrderItems == null ? 0 : OrderItems.Where(item => item.Product != null)
.Sum(item => item.Product.Weight * item.ProductUnits);

[EditorAlias(EditorAliases.MapHomeOfficePropertyEditor)]
public Location Location => new(){Latitude = ((IBaseMapsMarker)this).Latitude, Longitude = ((IBaseMapsMarker)this).Longitude };
public Location Location => new() { Latitude = ((IBaseMapsMarker)this).Latitude, Longitude = ((IBaseMapsMarker)this).Longitude };
string IBaseMapsMarker.Title => Store?.Customer.Name;

double IBaseMapsMarker.Latitude => Store?.Latitude??0;

double IBaseMapsMarker.Longitude => Store?.Longitude??0;
double IBaseMapsMarker.Latitude => Store?.Latitude ?? 0;

double IBaseMapsMarker.Longitude => Store?.Longitude ?? 0;
}

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum OrderShipMethod {
Ground, Air
Expand All @@ -129,11 +127,11 @@ public enum ShipmentStatus {
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum PaymentStatus {
[ImageName("PaymentUnPaid")]
Unpaid,
Unpaid,
[ImageName("PaymentPaid")]
PaidInFull,
PaidInFull,
[ImageName("PaymentRefund")]
RefundInFull,
Other
}
}
}
77 changes: 38 additions & 39 deletions CS/OutlookInspired.Module/BusinessObjects/Product.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,84 +10,84 @@
using OutlookInspired.Module.Features;
using OutlookInspired.Module.Features.CloneView;
using OutlookInspired.Module.Features.Maps;
using BaseEditorAliases = DevExpress.ExpressApp.Editors.EditorAliases;



namespace OutlookInspired.Module.BusinessObjects{
namespace OutlookInspired.Module.BusinessObjects {
[ImageName("BO_Product")]
[CloneView(CloneViewType.DetailView, BrochureDetailView)]
[CloneView(CloneViewType.ListView, LayoutViewListView)]
[CloneView(CloneViewType.DetailView, MapsDetailView)]
[Appearance("UnAvailable",AppearanceItemType.ViewItem, "!"+nameof(Available),TargetItems = "*",FontStyle = DevExpress.Drawing.DXFontStyle.Strikeout)]
[Appearance("UnAvailable", AppearanceItemType.ViewItem, "!" + nameof(Available), TargetItems = "*", FontStyle = DevExpress.Drawing.DXFontStyle.Strikeout)]
[XafDefaultProperty(nameof(Name))]
public class Product :OutlookInspiredBaseObject, IViewFilter,ISalesMapsMarker{
public class Product : OutlookInspiredBaseObject, IViewFilter, ISalesMapsMarker {
private static readonly RichEditDocumentServer RichEditDocumentServer = new();
public const string LayoutViewListView = "ProductLayoutView_ListView";
public const string BrochureDetailView = "Product_Brochure_DetailView";
public const string MapsDetailView = "Product_DetailView_Maps";

[FontSizeDelta(8)][MaxLength(100)]
public virtual string Name { get; set; }

[FontSizeDelta(8)]
[MaxLength(100)]
public virtual string Name { get; set; }
[EditorAlias(EditorAliases.DxHtmlPropertyEditor)]
public virtual byte[] Description { get; set; }
public virtual byte[] Description { get; set; }


[HideInUI(HideInUI.All)]
public virtual string DescriptionString{
get{
RichEditDocumentServer.LoadDocument(Description,DocumentFormat.OpenXml);
public virtual string DescriptionString {
get {
RichEditDocumentServer.LoadDocument(Description, DocumentFormat.OpenXml);
return RichEditDocumentServer.Text;
}
}

public virtual DateTime ProductionStart { get; set; }
public virtual bool Available { get; set; }
public virtual DateTime ProductionStart { get; set; }
public virtual bool Available { get; set; }
[ImageEditor(ListViewImageEditorMode = ImageEditorMode.PictureEdit,
DetailViewImageEditorMode = ImageEditorMode.PictureEdit,ImageSizeMode = ImageSizeMode.Zoom)]
public virtual byte[] Image { get; set; }
DetailViewImageEditorMode = ImageEditorMode.PictureEdit, ImageSizeMode = ImageSizeMode.Zoom)]
public virtual byte[] Image { get; set; }
public virtual Employee Support { get; set; }
public virtual Employee Engineer { get; set; }
[Browsable(false)]
public virtual Guid? EngineerId { get; set; }
[XafDisplayName("Inventory")]
public virtual int? CurrentInventory { get; set; }
public virtual int Backorder { get; set; }
public virtual int Manufacturing { get; set; }
public virtual int? CurrentInventory { get; set; }
public virtual int Backorder { get; set; }
public virtual int Manufacturing { get; set; }

[NotMapped]
public ObservableCollection<MapItem> Sales { get; set; } = new();

[NotMapped][HideInUI(HideInUI.DetailView)]
public virtual ObservableCollection<MapItem> CitySales{ get; set; } = new();
[NotMapped]
[HideInUI(HideInUI.DetailView)]
public virtual ObservableCollection<MapItem> CitySales { get; set; } = new();
public virtual Picture PrimaryImage { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal Cost { get; set; }
public virtual decimal Cost { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal SalePrice { get; set; }
public virtual decimal SalePrice { get; set; }
[Column(TypeName = CurrencyType)]
public virtual decimal RetailPrice { get; set; }
public virtual double Weight { get; set; }
public virtual double ConsumerRating { get; set; }
public virtual ProductCategory Category { get; set; }
public virtual decimal RetailPrice { get; set; }
public virtual double Weight { get; set; }
public virtual double ConsumerRating { get; set; }
public virtual ProductCategory Category { get; set; }

[InverseProperty(nameof(ProductCatalog.Product))][Aggregated]
public virtual ObservableCollection<ProductCatalog> Catalogs{ get; set; } = new();

[InverseProperty(nameof(ProductCatalog.Product))]
[Aggregated]
public virtual ObservableCollection<ProductCatalog> Catalogs { get; set; } = new();

[Aggregated]
public virtual ObservableCollection<ProductImage> Images{ get; set; } = new();
public virtual ObservableCollection<ProductImage> Images { get; set; } = new();

[Aggregated]
public virtual ObservableCollection<QuoteItem> QuoteItems{ get; set; } = new();
[EditorAlias(EditorAliases.PdfViewerEditor)]
public virtual ObservableCollection<QuoteItem> QuoteItems { get; set; } = new();
[EditorAlias(BaseEditorAliases.PdfViewerPropertyEditor)]
public byte[] Brochure => Catalogs.Select(catalog => catalog.PDF).FirstOrDefault();
string IBaseMapsMarker.Title => Name;
double IBaseMapsMarker.Latitude => throw new NotImplementedException();
double IBaseMapsMarker.Longitude => throw new NotImplementedException();
[InverseProperty(nameof(OrderItem.Product))][Aggregated]

public virtual ObservableCollection<OrderItem> OrderItems{ get; set; } = new();
[InverseProperty(nameof(OrderItem.Product))]
[Aggregated]

public virtual ObservableCollection<OrderItem> OrderItems { get; set; } = new();

IEnumerable<Order> ISalesMapsMarker.Orders => OrderItems.Select(item => item.Order).Distinct();
}
Expand All @@ -104,5 +104,4 @@ public enum ProductCategory {
[ImageName(nameof(VideoPlayers))]
VideoPlayers
}

}
}
2 changes: 1 addition & 1 deletion CS/OutlookInspired.Module/BusinessObjects/Quote.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,4 @@ public class Quote :OutlookInspiredBaseObject, IViewFilter,IMapsMarker{



}
}
Loading