123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- using InABox.Core;
- using InABox.DynamicGrid;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace InABox.Wpf.Dashboard.Editor;
- internal class DynamicDashboardDataQueryEditItem : BaseObject
- {
- // Having to do custom OnPropertyChanged stuff because Fody isn't allowed in this project.
- private Type? _type;
- [ComboLookupEditor(typeof(TypeLookupGenerator))]
- [EditorSequence(1)]
- public Type? Type
- {
- get => _type;
- set
- {
- var oldValue = _type;
- _type = value;
- OnPropertyChanged(nameof(Type), oldValue, value);
- }
- }
- [EditorSequence(2)]
- public string Name { get; set; } = "";
- [FilterEditor]
- [EditorSequence(3)]
- public string Filter { get; set; } = "";
- [ColumnsEditor]
- [EditorSequence(4)]
- public string Columns { get; set; } = "";
- [SortOrderEditor]
- [EditorSequence(5)]
- public string SortOrder { get; set; } = "";
- public DynamicDashboardDataQueryEditItem()
- {
- }
- public DynamicDashboardDataQueryEditItem(IDynamicDashboardDataQuery query)
- {
- Name = query.Key;
- Type = query.Type;
- Filter = Serialization.Serialize(query.Filter);
- Columns = Serialization.Serialize(query.Columns);
- SortOrder = Serialization.Serialize(query.SortOrder);
- }
- private class TypeLookupGenerator : LookupGenerator<DynamicDashboardDataQueryEditItem>
- {
- public TypeLookupGenerator(DynamicDashboardDataQueryEditItem[]? items) : base(items)
- {
- }
- protected override void DoGenerateLookups()
- {
- foreach(var entity in CoreUtils.Entities.Where(x => x.IsSubclassOf(typeof(Entity)) && x.HasInterface<IRemotable>()).OrderBy(x => x.Name))
- {
- AddValue(entity, entity.Name);
- }
- }
- }
- protected override void DoPropertyChanged(string name, object? before, object? after)
- {
- base.DoPropertyChanged(name, before, after);
- if(name == nameof(Type))
- {
- Filter = "";
- Columns = "";
- SortOrder = "";
- if (Type is not null && (Name.IsNullOrWhiteSpace() || Name == (before as Type)?.Name))
- {
- Name = Type.Name;
- }
- }
- }
- public IDynamicDashboardDataQuery? ToQuery()
- {
- if(Type is not null)
- {
- var query = (Activator.CreateInstance(typeof(DynamicDashboardDataQuery<>).MakeGenericType(Type)) as IDynamicDashboardDataQuery)!;
- query.Key = Name;
- query.Filter = Serialization.Deserialize(typeof(Filter<>).MakeGenericType(Type), Filter) as IFilter;
- query.Columns = (Serialization.Deserialize(typeof(Columns<>).MakeGenericType(Type), Columns) as IColumns)
- ?? Core.Columns.None(Type);
- query.SortOrder = Serialization.Deserialize(typeof(SortOrder<>).MakeGenericType(Type), SortOrder) as ISortOrder;
- return query;
- }
- else
- {
- return null;
- }
- }
- }
- internal class DynamicDashboardDataQueryGrid : DynamicItemsListGrid<DynamicDashboardDataQueryEditItem>
- {
- protected override void Init()
- {
- base.Init();
- ActionColumns.Add(new DynamicTextColumn(GetText)
- {
- HeaderText = "Table"
- });
- HiddenColumns.Add(x => x.Type);
- }
- private object? GetText(CoreRow? row)
- {
- return row?.Get<DynamicDashboardDataQueryEditItem, Type?>(x => x.Type)?.Name ?? "";
- }
- protected override void DoValidate(DynamicDashboardDataQueryEditItem[] items, List<string> errors)
- {
- base.DoValidate(items, errors);
- foreach(var item in items)
- {
- if(Items.Any(x => x != item && x.Name == item.Name))
- {
- errors.Add($"Duplicate key '{item.Name}'");
- }
- }
- }
- protected override void DoReconfigure(DynamicGridOptions options)
- {
- base.DoReconfigure(options);
- options.AddRows = true;
- options.EditRows = true;
- options.DeleteRows = true;
- }
- private readonly Column<DynamicDashboardDataQueryEditItem> FilterColumn = new(x => x.Filter);
- private readonly Column<DynamicDashboardDataQueryEditItem> ColumnsColumn = new(x => x.Columns);
- private readonly Column<DynamicDashboardDataQueryEditItem> SortOrderColumn = new(x => x.SortOrder);
- private readonly Column<DynamicDashboardDataQueryEditItem> TypeColumn = new(x => x.Type);
- protected override void CustomiseEditor(IDynamicEditorForm form, DynamicDashboardDataQueryEditItem[] items, DynamicGridColumn column, BaseEditor editor)
- {
- base.CustomiseEditor(form, items, column, editor);
- var item = items.First();
- if(FilterColumn.IsEqualTo(column.ColumnName) && editor is FilterEditor filterEditor)
- {
- filterEditor.Type = item.Type;
- }
- else if(ColumnsColumn.IsEqualTo(column.ColumnName) && editor is ColumnsEditor columnsEditor)
- {
- columnsEditor.Type = item.Type;
- }
- else if(SortOrderColumn.IsEqualTo(column.ColumnName) && editor is SortOrderEditor sortEditor)
- {
- sortEditor.Type = item.Type;
- }
- }
- protected override Dictionary<string, object?> EditorValueChanged(IDynamicEditorForm editor, DynamicDashboardDataQueryEditItem[] items, string name, object value)
- {
- var changed = base.EditorValueChanged(editor, items, name, value);
- if (TypeColumn.IsEqualTo(name))
- {
- if(value is Type type)
- {
- if(editor.TryFindEditor<FilterEditorControl>(FilterColumn.Property, out var filterEditor))
- {
- filterEditor.FilterType = type;
- }
- if(editor.TryFindEditor<ColumnsEditorControl>(ColumnsColumn.Property, out var columnsEditor))
- {
- columnsEditor.ColumnsType = type;
- }
- }
- }
- return changed;
- }
- }
|