Skip to content
This repository was archived by the owner on Mar 25, 2025. It is now read-only.

Commit 829d52f

Browse files
github-actions[bot]sino32peterbarancek
authored
[NEW FEATURE] Search function in data (#568)
* Create draft PR for #566 * + External invoke search(possible filter entities from outside), if criteria is exact and reqired entity exist in collection , then entity is selected also in view , otherwise it behave like filter * fixing layout in search header. * fix bug with scroll, it is shown when is needed(this commit solve isue about neccessary to resize by grid splitter and then datagrid scroll bar was occured) Co-authored-by: sino32 <sino32@users.noreply.github.com> Co-authored-by: Peter Barancek <peter.barancek@mts.sk>
1 parent 5370c4d commit 829d52f

File tree

11 files changed

+123
-66
lines changed

11 files changed

+123
-66
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace TcoData
2+
{
3+
/// <summary>
4+
/// An interaface which grants access to certain operations in DataExchange viewmodel,
5+
/// like searching by id, invoking search or filling the searchbox
6+
/// </summary>
7+
public interface IDataExchangeOperations
8+
{
9+
object SelectedRecord { get; }
10+
string FilterByID { get; set; }
11+
void InvokeSearch();
12+
}
13+
}

src/TcoData/src/TcoDataConnector/pex/TcoDataExchange/TcoDataExchange.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace TcoData
88

99
public partial class TcoDataExchange
1010
{
11+
/// <summary>An interaface which grants access to certain operations in DataExchange viewmodel, like searching by id, invoking search or filling the searchbox</summary>
12+
public IDataExchangeOperations DataExchangeOperations { get; set; }
1113
private dynamic _onliner;
1214

1315
protected dynamic Onliner
@@ -199,5 +201,7 @@ protected IVortexObject OnlinerVortex
199201
return _onlinerVortex;
200202
}
201203
}
204+
205+
202206
}
203207
}

src/TcoData/src/Wpf/TcoData.Wpf/Data/Data/DataView.xaml

Lines changed: 62 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<Grid Name="ResizableGrid">
2727
<Grid.RowDefinitions>
2828
<RowDefinition Height="Auto" />
29-
<RowDefinition Height="auto" MaxHeight="{Binding ElementName=RootContainer, Path=ActualHeight, Converter={wpf:PercentageConverter}, ConverterParameter=0.5}" />
29+
<RowDefinition MaxHeight="{Binding ElementName=RootContainer, Path=ActualHeight, Converter={wpf:PercentageConverter}, ConverterParameter=0.5}" />
3030

3131
<RowDefinition x:Name="GridSplitterRow" Height="Auto" />
3232
<RowDefinition />
@@ -38,82 +38,90 @@
3838
Margin="0,5,0,5"
3939
Visibility="{Binding Mode, Mode=OneWay, Converter={wpf:ModeConverter}, ConverterParameter=Display}"
4040
HorizontalAlignment="Stretch" />
41-
<Grid Grid.Row="0">
42-
<Grid Visibility="{Binding Mode, Mode=OneWay, Converter={wpf:ModeConverter}, ConverterParameter=Display}">
43-
<Grid.ColumnDefinitions>
44-
<ColumnDefinition></ColumnDefinition>
45-
<ColumnDefinition></ColumnDefinition>
46-
<ColumnDefinition></ColumnDefinition>
47-
</Grid.ColumnDefinitions>
41+
<Grid Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center">
42+
<ItemsControl Margin="5" HorizontalContentAlignment="Center" Visibility="{Binding Mode, Mode=OneWay, Converter={wpf:ModeConverter}, ConverterParameter=Display}">
43+
<ItemsControl.ItemsPanel>
44+
<ItemsPanelTemplate>
45+
<WrapPanel Background="Transparent" Width="{Binding (FrameworkElement.ActualWidth) , RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" MinWidth="{Binding ItemWidth , RelativeSource={RelativeSource Self}}" ItemHeight="{Binding (ListView.View).ItemHeight , RelativeSource={RelativeSource AncestorType=ListView}}" ItemWidth="{Binding (ListView.View).ItemWidth , RelativeSource={RelativeSource AncestorType=ListView}}" />
46+
</ItemsPanelTemplate>
47+
</ItemsControl.ItemsPanel>
4848

49-
<StackPanel
50-
Margin="20,0,0,0"
49+
<WrapPanel
50+
Margin="10,0"
5151
x:Name="dropdown"
5252
HorizontalAlignment="Left"
5353
VerticalAlignment="Center"
5454
Orientation="Horizontal">
5555

5656
<TextBlock
57-
Margin="10,0,10,0"
5857
VerticalAlignment="Center"
5958
Text="{x:Static p:strings.PerPage}" />
6059
<ComboBox
61-
Margin="10,0,10,0"
60+
Margin="10,0"
6261
MinWidth="50"
6362
x:Name="PerPageFilterComboBox"
6463
VerticalAlignment="Center"
6564
Background="{Binding ElementName=DataGrid, Path=Background}"
6665
ItemsSource="{Binding PerPageFilter}"
6766
SelectedItem="{Binding Limit, Mode=TwoWay}" />
68-
</StackPanel>
69-
<UniformGrid Grid.Column="1" Columns="3" HorizontalAlignment="Center" Margin="0,5" VerticalAlignment="Center">
67+
</WrapPanel>
7068

69+
<WrapPanel
70+
Margin="10,0"
71+
HorizontalAlignment="Center"
72+
VerticalAlignment="Center"
73+
Orientation="Horizontal">
7174
<Button Command="{Binding PageDownCommand}" Content="&lt;&lt;" Margin=" 5,0"/>
7275
<Button Command="{Binding FindByCriteriaCommand}" Content="{x:Static p:strings.Documents}" Margin=" 5,0" />
7376
<Button Command="{Binding PageUpCommand}" Content="&gt;&gt;" Margin=" 5,0"/>
74-
</UniformGrid>
77+
</WrapPanel>
7578

76-
<StackPanel
77-
Grid.Column="2"
78-
Height="Auto"
79-
Margin="0,0,0,0"
79+
80+
<WrapPanel
81+
Margin="10,0"
82+
VerticalAlignment="Center"
8083
HorizontalAlignment="Right"
8184
Orientation="Horizontal">
82-
83-
<StackPanel
84-
Margin="0,0,10,0"
85-
HorizontalAlignment="Right"
86-
Orientation="Horizontal">
87-
<StackPanel.Resources>
88-
<ObjectDataProvider x:Key="searchModeFromEnum" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
89-
<ObjectDataProvider.MethodParameters>
90-
<x:Type TypeName="data:eSearchMode"/>
91-
</ObjectDataProvider.MethodParameters>
92-
</ObjectDataProvider>
93-
</StackPanel.Resources>
94-
<TextBlock Style="{DynamicResource MaterialDesignCaptionTextBlock}" Margin="10,0,0,0" VerticalAlignment="Center" Text="{x:Static p:strings.Criteria}"></TextBlock>
95-
<ComboBox
96-
Margin="10,0,10,0"
97-
Width="100"
98-
Background="{Binding ElementName=DataGrid, Path=Background}"
99-
ItemsSource="{Binding Source={StaticResource searchModeFromEnum}}"
100-
SelectedItem="{Binding SearchMode, Mode=TwoWay}"/>
101-
<TextBox
102-
x:Name="FilterField"
103-
Height="{Binding ActualHeight, ElementName=PerPageFilterComboBox}"
104-
MinWidth="200"
105-
Margin="0"
106-
VerticalContentAlignment="Center"
107-
BorderBrush="{DynamicResource MaterialDesignDarkSeparatorBackground}"
108-
Text="{Binding FilterByID}" />
109-
<Button
110-
Height="{Binding ActualHeight, ElementName=PerPageFilterComboBox}"
111-
Margin="2,0"
112-
Command="{Binding FindByCriteriaCommand}"
113-
Content="🔍"/>
114-
</StackPanel>
115-
</StackPanel>
116-
</Grid>
85+
<WrapPanel.Resources>
86+
<ObjectDataProvider x:Key="searchModeFromEnum" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
87+
<ObjectDataProvider.MethodParameters>
88+
<x:Type TypeName="data:eSearchMode"/>
89+
</ObjectDataProvider.MethodParameters>
90+
</ObjectDataProvider>
91+
92+
</WrapPanel.Resources>
93+
<TextBlock Style="{DynamicResource MaterialDesignCaptionTextBlock}" Margin="10,0,0,0" VerticalAlignment="Center" Text="{x:Static p:strings.Criteria}"></TextBlock>
94+
<ComboBox
95+
MinWidth="100"
96+
Margin="10,0"
97+
Background="{Binding ElementName=DataGrid, Path=Background}"
98+
ItemsSource="{Binding Source={StaticResource searchModeFromEnum}}"
99+
SelectedItem="{Binding SearchMode, Mode=TwoWay}"/>
100+
101+
</WrapPanel>
102+
103+
<WrapPanel
104+
Margin="10,0"
105+
VerticalAlignment="Center"
106+
HorizontalAlignment="Right"
107+
Orientation="Horizontal">
108+
109+
<TextBox
110+
x:Name="FilterField"
111+
Height="{Binding ActualHeight, ElementName=PerPageFilterComboBox}"
112+
MinWidth="200"
113+
Margin="0"
114+
VerticalContentAlignment="Center"
115+
BorderBrush="{DynamicResource MaterialDesignDarkSeparatorBackground}"
116+
Text="{Binding FilterByID}" />
117+
<Button
118+
Height="{Binding ActualHeight, ElementName=PerPageFilterComboBox}"
119+
Margin="2,0"
120+
Command="{Binding FindByCriteriaCommand}"
121+
Content="🔍"/>
122+
</WrapPanel>
123+
124+
</ItemsControl>
117125
</Grid>
118126
<Grid Grid.Row="1" Visibility="{Binding Mode, Mode=OneWay, Converter={wpf:ModeConverter}, ConverterParameter=Display}">
119127
<Grid.ColumnDefinitions>

src/TcoData/src/Wpf/TcoData.Wpf/Data/Data/DataViewModel.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
namespace TcoData
2121
{
22-
public class DataViewModel<T> : Vortex.Presentation.Wpf.BindableBase, FunctionAvailability where T : IBrowsableDataObject, new()
22+
public class DataViewModel<T> : Vortex.Presentation.Wpf.BindableBase, IDataExchangeOperations, FunctionAvailability where T : IBrowsableDataObject, new()
2323
{
2424
string filterByID;
2525

@@ -39,6 +39,7 @@ namespace TcoData
3939
public DataViewModel(IRepository<T> repository, TcoDataExchange dataExchange) : base()
4040
{
4141
this.DataExchange = dataExchange;
42+
this.DataExchange.DataExchangeOperations = this;
4243
DataBrowser = CreateBrowsable(repository);
4344

4445
StartCreateNewCommand = new RelayCommand(p => StartCreatingNew(), _ => this.Mode == ViewMode.Display, () => LogCommand(nameof(StartCreateNewCommand)));
@@ -354,6 +355,19 @@ void LoadFromPlc()
354355
}, "", () => MessageBox.Show($"{strings.WouldYouLikeToGetFromPLC}", "Data", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes);
355356
}
356357

358+
public void InvokeSearch() => ExternalSearch();
359+
private void ExternalSearch()
360+
{
361+
Filter();
362+
363+
if (DataBrowser.GetRecords(p => p._EntityId == FilterByID).Any() && SearchMode== eSearchMode.Exact)
364+
{
365+
var plain = DataBrowser.FindById(FilterByID);
366+
((dynamic)DataExchange)._data.CopyPlainToShadow(plain);
367+
SelectedRecord = plain;
368+
}
369+
}
370+
357371
public ICommand ExportCommand { get; }
358372
public ICommand ImportCommand { get; }
359373

src/TcoData/src/XAE/XAE/TcoDataTests/POUs/Examples/SandboxContext.TcPOU

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.9">
2+
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.10">
33
<POU Name="SandboxContext" Id="{ed8218eb-5f5f-0973-2882-9b75bfb2ad4d}" SpecialFunc="None">
44
<Declaration><![CDATA[
55
//<Declaration>
@@ -12,6 +12,8 @@ VAR
1212
_state : eExamplesStates;
1313
recordId_1 : STRING;
1414
recordId_2 : STRING;
15+
_invokeSearch : BOOL;
16+
_filteringById :STRING;
1517
END_VAR]]></Declaration>
1618
<Implementation>
1719
<ST><![CDATA[]]></ST>

src/TcoData/src/XAE/XAE/TcoDataTests/POUs/MAIN.TcPOU

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.9">
2+
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.10">
33
<POU Name="MAIN" Id="{0f34ba18-e40b-0caf-2a51-227dede86d56}" SpecialFunc="None">
44
<Declaration><![CDATA[PROGRAM MAIN
55
VAR

src/TcoData/src/XAE/XAE/TcoDataTests/POUs/TestDataContext.TcPOU

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.9">
2+
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.10">
33
<POU Name="TestDataContext" Id="{84826b8f-78be-0c2b-210a-e7483d252490}" SpecialFunc="None">
44
<Declaration><![CDATA[FUNCTION_BLOCK TestDataContext EXTENDS TcoCore._internals_TcoContext
55
VAR
@@ -16,6 +16,8 @@ VAR
1616
_deleteDataWithInvalidIdDone : BOOL;
1717
_dataExistsDone : BOOL;
1818
_createOrUpdateDone : BOOL;
19+
20+
1921
END_VAR
2022
]]></Declaration>
2123
<Implementation>

src/TcoData/src/XAE/XAE/XAETcoData.tsproj

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
<?xml version="1.0"?>
2-
<TcSmProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4024.22">
3-
<Project ProjectGUID="{F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}" Target64Bit="true" ShowHideConfigurations="#x106">
2+
<TcSmProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4024.25">
3+
<Project ProjectGUID="{F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}" TargetNetId="192.168.4.1.1.1" Target64Bit="true" ShowHideConfigurations="#x106">
44
<System>
5-
<Settings MaxCpus="2" NonWinCpus="1">
6-
<Cpu CpuId="1"/>
7-
</Settings>
85
<Tasks>
96
<Task Id="3" Priority="20" CycleTime="100000" AmsPort="350" AdtTasks="true">
107
<Name>PlcTask</Name>

src/TcoData/tests/Sandbox.TcoData.Wpf/MainWindow.xaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,22 @@
66
xmlns:local="clr-namespace:Sandbox.TcoData.Wpf"
77
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
88
xmlns:vortex="http://vortex.mts/xaml"
9-
Width="800"
9+
Width="800"
1010
Height="450"
1111
mc:Ignorable="d"
1212
Title="MainWindow">
1313
<Window.DataContext>
1414
<local:MainWindowViewModel />
1515
</Window.DataContext>
16-
<TabControl>
16+
<TabControl >
1717
<TabItem Header="Data">
1818
<Grid>
1919
<Grid.RowDefinitions>
2020
<RowDefinition />
2121
<RowDefinition Height="Auto" />
22+
<RowDefinition Height="Auto" />
23+
<RowDefinition Height="Auto" />
24+
2225
</Grid.RowDefinitions>
2326
<Grid Grid.Row="0">
2427
<vortex:RenderableContentControl DataContext="{Binding Plc.MAIN.sandbox.DataManager}" PresentationType="Control">
@@ -37,7 +40,9 @@
3740
<vortex:ObservableContentControl DataContext="{Binding SelectedItem, ElementName=dynamicTreeView}" PresentationType="Base-Control" />
3841
</ScrollViewer>
3942
</UniformGrid>-->
43+
<Button Grid.Row="2" Click="Button_Click">ExternalInvokeTest</Button>
4044
</Grid>
45+
4146
</TabItem>
4247
<TabItem Header="Diagnostics">
4348
<vortex:RenderableContentControl DataContext="{Binding Plc.MAIN.sandbox}" PresentationType="Diagnostics" />

src/TcoData/tests/Sandbox.TcoData.Wpf/MainWindow.xaml.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,11 @@ public MainWindow()
2424
{
2525
InitializeComponent();
2626
}
27+
28+
private void Button_Click(object sender, RoutedEventArgs e)
29+
{
30+
var dataContext = this.DataContext as MainWindowViewModel;
31+
dataContext.ExternalInvokeSearchTest();
32+
}
2733
}
2834
}

src/TcoData/tests/Sandbox.TcoData.Wpf/MainWindowViewModel.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,15 @@ public class MainWindowViewModel
99
{
1010
public MainWindowViewModel()
1111
{
12-
1312

1413

14+
15+
}
16+
17+
public void ExternalInvokeSearchTest()
18+
{
19+
Plc.MAIN.sandbox.DataManager.DataExchangeOperations.FilterByID = "TEST";
20+
Plc.MAIN.sandbox.DataManager.DataExchangeOperations.InvokeSearch();
1521
}
1622

1723
public TcoDataTestsTwinController Plc { get; } = TcoDataTests.Entry.TcoDataTests;

0 commit comments

Comments
 (0)