|
@@ -1,5 +1,7 @@
|
|
|
using InABox.Core;
|
|
|
using InABox.DynamicGrid;
|
|
|
+using InABox.Wpf.Dashboard.Editor;
|
|
|
+using InABox.WPF;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.ComponentModel;
|
|
@@ -7,6 +9,8 @@ using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Windows;
|
|
|
+using System.Windows.Controls;
|
|
|
+using System.Windows.Media;
|
|
|
|
|
|
namespace InABox.Wpf.Dashboard;
|
|
|
|
|
@@ -25,29 +29,136 @@ public class DynamicDashboardGridPresenter : IDynamicDashboardDataPresenter<Dyna
|
|
|
{
|
|
|
public DynamicDashboardGridPresenterProperties Properties { get; set; } = null!;
|
|
|
|
|
|
- public DynamicDashboardDataComponent DataComponent { get; set; } = null!;
|
|
|
+ private DynamicDashboardDataComponent _dataComponent = null!;
|
|
|
+ public DynamicDashboardDataComponent DataComponent
|
|
|
+ {
|
|
|
+ get => _dataComponent;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _dataComponent = value;
|
|
|
+ UpdateData();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- private IDynamicItemsListGrid Grid = null!;
|
|
|
+ private IDynamicDashboardGridPresenterGrid? Grid;
|
|
|
+ private ContentControl Content = new()
|
|
|
+ {
|
|
|
+ Height = 300
|
|
|
+ };
|
|
|
+
|
|
|
+ private DynamicDashboardData? _data;
|
|
|
|
|
|
public FrameworkElement? Setup()
|
|
|
{
|
|
|
- if (!DataComponent.TryGetQuery(Properties.Query, out var query))
|
|
|
+ UpdateData();
|
|
|
+ return Content;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void UpdateData()
|
|
|
+ {
|
|
|
+ if (Properties.Query.IsNullOrWhiteSpace() || !DataComponent.TryGetQuery(Properties.Query, out var query))
|
|
|
+ {
|
|
|
+ Properties.Query = DataComponent.Queries.FirstOrDefault()?.Key ?? "";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!DataComponent.TryGetQuery(Properties.Query, out query))
|
|
|
{
|
|
|
- return null;
|
|
|
+ var border = new Border
|
|
|
+ {
|
|
|
+ Background = Colors.DimGray.ToBrush()
|
|
|
+ };
|
|
|
+ border.ContextMenuOpening += Border_ContextMenuOpening;
|
|
|
+ Content.Content = border;
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- Grid = (Activator.CreateInstance(typeof(DynamicItemsListGrid<>).MakeGenericType(query.Type)) as IDynamicItemsListGrid)!;
|
|
|
+ Grid = (Activator.CreateInstance(typeof(DynamicDashboardGridPresenterGrid<>).MakeGenericType(query.Type)) as IDynamicDashboardGridPresenterGrid)!;
|
|
|
Grid.OnGenerateColumns += Grid_OnGenerateColumns;
|
|
|
Grid.OnSaveColumns += Grid_OnSaveColumns;
|
|
|
+ Grid.GetAvailableColumns += Grid_GetAvailableColumns;
|
|
|
+ Grid.OnLoadColumnsMenu += Grid_OnLoadColumnsMenu;
|
|
|
|
|
|
Grid.Refresh(true, false);
|
|
|
|
|
|
- return Grid as FrameworkElement;
|
|
|
+ Content.Content = Grid as FrameworkElement;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void CustomiseMenu(ContextMenu menu)
|
|
|
+ {
|
|
|
+ if(DataComponent.Queries.Count > 1)
|
|
|
+ {
|
|
|
+ var queryItem = menu.AddItem("Select Query", null, null);
|
|
|
+ foreach(var query in DataComponent.Queries)
|
|
|
+ {
|
|
|
+ queryItem.AddCheckMenuItem(query.Key, query.Key, SelectQuery_Click, isChecked: Properties.Query == query.Key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ menu.AddItem("Select Data", null, SelectData_Click);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void SelectData_Click()
|
|
|
+ {
|
|
|
+ if (DynamicDashboardDataEditor.Execute(DataComponent))
|
|
|
+ {
|
|
|
+ UpdateData();
|
|
|
+ DataComponent.RunQueryAsync(100).ContinueWith(data =>
|
|
|
+ {
|
|
|
+ if(data.Exception is not null)
|
|
|
+ {
|
|
|
+ MessageWindow.ShowError("Error loading data.", data.Exception);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Refresh(data.Result);
|
|
|
+ }
|
|
|
+ }, TaskScheduler.FromCurrentSynchronizationContext());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void SelectQuery_Click(string key, bool isChecked)
|
|
|
+ {
|
|
|
+ if (!isChecked) return;
|
|
|
+
|
|
|
+ Properties.Query = key;
|
|
|
+ Properties.Columns = null;
|
|
|
+
|
|
|
+ UpdateData();
|
|
|
+ if(_data is not null)
|
|
|
+ {
|
|
|
+ Refresh(_data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Grid_OnLoadColumnsMenu(ContextMenu menu)
|
|
|
+ {
|
|
|
+ menu.AddSeparatorIfNeeded();
|
|
|
+ CustomiseMenu(menu);
|
|
|
+ menu.RemoveUnnecessarySeparators();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Grid_GetAvailableColumns(GetAvailableColumnsEventArgs args)
|
|
|
+ {
|
|
|
+ if (!DataComponent.TryGetQuery(Properties.Query, out var query))
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ args.Columns = args.Columns.Where(x => query.Columns.Contains(x.ColumnName));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Border_ContextMenuOpening(object sender, ContextMenuEventArgs e)
|
|
|
+ {
|
|
|
+ var menu = new ContextMenu();
|
|
|
+
|
|
|
+ CustomiseMenu(menu);
|
|
|
+
|
|
|
+ menu.IsOpen = true;
|
|
|
+
|
|
|
+ e.Handled = true;
|
|
|
}
|
|
|
|
|
|
private void Grid_OnSaveColumns(object sender, SaveColumnsEventArgs args)
|
|
|
{
|
|
|
- Properties.Columns = args.Columns;
|
|
|
+ Properties.Columns = args.Columns.Count > 0 ? args.Columns : null;
|
|
|
}
|
|
|
|
|
|
private void Grid_OnGenerateColumns(object sender, GenerateColumnsEventArgs args)
|
|
@@ -60,11 +171,18 @@ public class DynamicDashboardGridPresenter : IDynamicDashboardDataPresenter<Dyna
|
|
|
args.Columns.Add(column.Copy());
|
|
|
}
|
|
|
}
|
|
|
+ else if (DataComponent.TryGetQuery(Properties.Query, out var query) && Grid is not null)
|
|
|
+ {
|
|
|
+ args.Columns.Clear();
|
|
|
+ args.Columns.AddRange(Grid.ExtractColumns(query.Columns));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public void Refresh(DynamicDashboardData data)
|
|
|
{
|
|
|
- if (!DataComponent.TryGetQuery(Properties.Query, out var query))
|
|
|
+ _data = data;
|
|
|
+
|
|
|
+ if (!DataComponent.TryGetQuery(Properties.Query, out var query) || Grid is null)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
@@ -88,3 +206,27 @@ public class DynamicDashboardGridPresenter : IDynamicDashboardDataPresenter<Dyna
|
|
|
{
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+internal interface IDynamicDashboardGridPresenterGrid : IDynamicItemsListGrid
|
|
|
+{
|
|
|
+ public event Action<ContextMenu>? OnLoadColumnsMenu;
|
|
|
+}
|
|
|
+internal class DynamicDashboardGridPresenterGrid<T> : DynamicItemsListGrid<T>, IDynamicDashboardGridPresenterGrid
|
|
|
+ where T : BaseObject, new()
|
|
|
+{
|
|
|
+ public event Action<ContextMenu>? OnLoadColumnsMenu;
|
|
|
+
|
|
|
+ protected override void DoReconfigure(DynamicGridOptions options)
|
|
|
+ {
|
|
|
+ base.DoReconfigure(options);
|
|
|
+
|
|
|
+ options.Clear();
|
|
|
+ options.SelectColumns = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected override void LoadColumnsMenu(ContextMenu menu)
|
|
|
+ {
|
|
|
+ base.LoadColumnsMenu(menu);
|
|
|
+ OnLoadColumnsMenu?.Invoke(menu);
|
|
|
+ }
|
|
|
+}
|