166 lines
14 KiB
XML
166 lines
14 KiB
XML
<Window x:Class="HikvisionAttendanceManager.App.MainWindow"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:local="clr-namespace:HikvisionAttendanceManager.App"
|
|
Title="Hikvision Attendance Manager" Height="780" Width="1280" MinHeight="620" MinWidth="1020"
|
|
WindowStartupLocation="CenterScreen" Background="{StaticResource CanvasBrush}">
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="205"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
<Border Grid.Column="0" Background="White" BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,1,0">
|
|
<DockPanel Margin="12">
|
|
<StackPanel DockPanel.Dock="Top">
|
|
<StackPanel Orientation="Horizontal" Margin="7,12,7,26">
|
|
<Border Width="31" Height="35" CornerRadius="8" Background="#EAF1FF">
|
|
<TextBlock Text="⌂" Foreground="{StaticResource PrimaryBrush}" FontWeight="Bold" FontSize="18" VerticalAlignment="Center" HorizontalAlignment="Center"/>
|
|
</Border>
|
|
<StackPanel Margin="10,0,0,0" VerticalAlignment="Center">
|
|
<TextBlock Text="Hikvision" FontWeight="Bold" FontSize="16" Foreground="#16213A"/>
|
|
<TextBlock Text="Attendance Manager" FontSize="10" Foreground="#77849A"/>
|
|
</StackPanel>
|
|
</StackPanel>
|
|
<Button x:Name="DashboardNav" Content="⌂ Dashboard" Style="{StaticResource SidebarButton}" Background="#EAF1FF" Foreground="#1D4ED8" Click="Navigate_Click" Tag="Dashboard"/>
|
|
<Button Content="▣ Devices" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="Devices"/>
|
|
<Button Content="⇄ Attendance Sync" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="Attendance Sync"/>
|
|
<Button Content="♙ User Management" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="User Management"/>
|
|
<TextBlock Text="TEMPLATE SYNCING" Margin="14,16,0,4" FontSize="10" FontWeight="SemiBold" Foreground="#94A3B8"/>
|
|
<Button Content=" ↓ Device → DB" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="Device → DB"/>
|
|
<Button Content=" ↑ DB → Device" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="DB → Device"/>
|
|
<Button Content=" ▤ Departmental User Sync" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="Departmental User Sync"/>
|
|
<Button Content="◷ Sync History" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="Sync History"/>
|
|
</StackPanel>
|
|
<Button DockPanel.Dock="Bottom" Content="⚙ Settings" Style="{StaticResource SidebarButton}" Click="Navigate_Click" Tag="Settings"/>
|
|
</DockPanel>
|
|
</Border>
|
|
|
|
<Grid Grid.Column="1" Margin="27,20">
|
|
<Grid x:Name="DashboardPage">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="330"/>
|
|
</Grid.ColumnDefinitions>
|
|
<StackPanel Grid.Row="0">
|
|
<TextBlock Text="Welcome, Operator 👋" FontSize="21" FontWeight="SemiBold" Foreground="#17233B"/>
|
|
<TextBlock Text="Manage your Hikvision devices and users easily." Margin="0,4,0,0" Foreground="#66758C" FontSize="12"/>
|
|
</StackPanel>
|
|
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
|
|
<Border Background="White" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="18" Padding="10,5" Margin="0,0,10,0"><TextBlock Text="● Operator" Foreground="#475569" FontSize="11"/></Border>
|
|
<Button x:Name="RefreshDashboardButton" Content="↻ Refresh" Click="RefreshDashboard_Click"/>
|
|
</StackPanel>
|
|
<TextBlock x:Name="DashboardErrorText" Grid.Row="0" Grid.ColumnSpan="2" Margin="0,52,0,0" Foreground="#DC2626" FontSize="12" Visibility="Collapsed" TextWrapping="Wrap"/>
|
|
<UniformGrid Grid.Row="1" Grid.ColumnSpan="2" Columns="4" Margin="0,28,0,20">
|
|
<Border Style="{StaticResource CardStyle}" Background="#F5FAFF" Margin="0,0,12,0"><StackPanel><TextBlock Text="TOTAL DEVICES" Style="{StaticResource CardCaption}"/><TextBlock Text="{Binding Dashboard.TotalDevicesDisplay, Mode=OneWay}" Style="{StaticResource CardValue}"/><TextBlock Text="Active Hikvision devices" Foreground="#748299" FontSize="11"/></StackPanel></Border>
|
|
<Border Style="{StaticResource CardStyle}" Background="#F2FBF5" Margin="0,0,12,0"><StackPanel><TextBlock Text="ONLINE DEVICES" Style="{StaticResource CardCaption}"/><TextBlock Text="{Binding Dashboard.OnlineDevicesDisplay, Mode=OneWay}" Style="{StaticResource CardValue}" Foreground="#15803D"/><TextBlock Text="Connected" Foreground="#15803D" FontSize="11"/></StackPanel></Border>
|
|
<Border Style="{StaticResource CardStyle}" Background="#FFF6F6" Margin="0,0,12,0"><StackPanel><TextBlock Text="OFFLINE DEVICES" Style="{StaticResource CardCaption}"/><TextBlock Text="{Binding Dashboard.OfflineDevicesDisplay, Mode=OneWay}" Style="{StaticResource CardValue}" Foreground="#DC2626"/><TextBlock Text="Not Connected" Foreground="#DC2626" FontSize="11"/></StackPanel></Border>
|
|
<Border Style="{StaticResource CardStyle}" Background="#F7F5FF"><StackPanel><TextBlock Text="TOTAL USERS ON DEVICES" Style="{StaticResource CardCaption}"/><TextBlock Text="{Binding Dashboard.TotalUsersDisplay, Mode=OneWay}" Style="{StaticResource CardValue}"/><TextBlock Text="Across all devices" Foreground="#748299" FontSize="11"/></StackPanel></Border>
|
|
</UniformGrid>
|
|
<Grid Grid.Row="2" Grid.ColumnSpan="2">
|
|
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="300"/></Grid.ColumnDefinitions>
|
|
<Border Style="{StaticResource CardStyle}" Margin="0,0,18,0">
|
|
<StackPanel>
|
|
<TextBlock Text="Recent Activity" FontWeight="SemiBold" FontSize="16" Foreground="#1D293D"/>
|
|
<TextBlock x:Name="ActivityText" Text="No activity yet. Add a device to get started." Margin="0,22,0,0" Foreground="#748299"/>
|
|
</StackPanel>
|
|
</Border>
|
|
<Border Grid.Column="1" Style="{StaticResource CardStyle}">
|
|
<StackPanel>
|
|
<TextBlock Text="Device Status" FontWeight="SemiBold" FontSize="16" Foreground="#1D293D"/>
|
|
<TextBlock Text="{Binding Dashboard.DeviceStatusSummary, Mode=OneWay}" Margin="0,22,0,8" Foreground="#748299"/>
|
|
<ItemsControl ItemsSource="{Binding Devices}">
|
|
<ItemsControl.ItemTemplate>
|
|
<DataTemplate>
|
|
<TextBlock Text="{Binding DashboardListLine}" Margin="0,0,0,6" Foreground="#475569" FontSize="12"/>
|
|
</DataTemplate>
|
|
</ItemsControl.ItemTemplate>
|
|
</ItemsControl>
|
|
<TextBlock x:Name="LastHrmsSyncText" Margin="0,16,0,0" Foreground="#748299" FontSize="11"/>
|
|
</StackPanel>
|
|
</Border>
|
|
</Grid>
|
|
</Grid>
|
|
|
|
<Grid x:Name="DevicesPage" Visibility="Collapsed">
|
|
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions>
|
|
<DockPanel>
|
|
<StackPanel DockPanel.Dock="Left"><TextBlock Text="Devices" FontSize="25" FontWeight="SemiBold" Foreground="#17233B"/><TextBlock Text="Manage Hikvision terminals and test their connectivity." Margin="0,6,0,0" Foreground="#66758C"/></StackPanel>
|
|
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" VerticalAlignment="Center">
|
|
<Button Content="Refresh" Margin="0,0,8,0" Click="RefreshDevices_Click"/>
|
|
<Button Content="+ Add Device" Style="{StaticResource PrimaryButton}" Click="AddDevice_Click"/>
|
|
</StackPanel>
|
|
</DockPanel>
|
|
<Border Grid.Row="1" x:Name="DeviceEditor" Visibility="Collapsed" Background="White" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1" CornerRadius="10" Margin="0,24,0,16" Padding="18">
|
|
<StackPanel><TextBlock Text="Add Manual Hikvision Device" FontWeight="SemiBold" Margin="0,0,0,10"/>
|
|
<WrapPanel>
|
|
<TextBox x:Name="DeviceNameBox" Width="180" Margin="0,0,10,8" ToolTip="Machine name"/>
|
|
<TextBox x:Name="MachineIdBox" Width="120" Margin="0,0,10,8" ToolTip="Machine ID"/>
|
|
<TextBox x:Name="IpAddressBox" Width="140" Margin="0,0,10,8" ToolTip="IP Address"/>
|
|
<TextBox x:Name="PortBox" Width="75" Margin="0,0,10,8" Text="8000" ToolTip="Port"/>
|
|
<TextBox x:Name="UsernameBox" Width="120" Margin="0,0,10,8" ToolTip="Username"/>
|
|
<PasswordBox x:Name="PasswordBox" Width="120" Margin="0,0,10,8" ToolTip="Password"/>
|
|
<TextBox x:Name="ModelBox" Width="140" Margin="0,0,10,8" ToolTip="Model"/>
|
|
<Button x:Name="EditorTestConnectionButton" Content="Test Connection" Margin="0,0,10,8" Click="TestEditorConnection_Click"/>
|
|
<Button Content="Add Device" Style="{StaticResource PrimaryButton}" Margin="0,0,8,8" Click="SaveDevice_Click"/>
|
|
<Button Content="Cancel" Margin="0,0,0,8" Click="CancelEdit_Click"/>
|
|
</WrapPanel></StackPanel>
|
|
</Border>
|
|
<Border Grid.Row="2" Style="{StaticResource CardStyle}" Padding="0">
|
|
<DockPanel>
|
|
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" Margin="16">
|
|
<Button x:Name="DevicesTestConnectionButton" Content="Test Connection" Style="{StaticResource PrimaryButton}" Click="TestConnection_Click"/>
|
|
<Button Content="View Device Information" Margin="8,0,0,0" Click="DeviceInformation_Click"/>
|
|
<Button Content="Edit" Margin="8,0,0,0" Click="EditDevice_Click"/>
|
|
<Button Content="Remove" Margin="8,0,0,0" Foreground="#B91C1C" Click="RemoveDevice_Click"/>
|
|
<TextBlock x:Name="ConnectionMessageText" VerticalAlignment="Center" Margin="18,0,0,0" Foreground="#66758C"/>
|
|
</StackPanel>
|
|
<DataGrid x:Name="DevicesGrid" ItemsSource="{Binding Devices}" SelectedItem="{Binding SelectedDevice, Mode=TwoWay}" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="True" BorderThickness="0" HeadersVisibility="Column" RowHeight="44">
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Machine Name" Binding="{Binding Name}" Width="*"/>
|
|
<DataGridTextColumn Header="Machine ID" Binding="{Binding MachineId}" Width="110"/>
|
|
<DataGridTextColumn Header="IP Address" Binding="{Binding IpAddress}" Width="140"/>
|
|
<DataGridTextColumn Header="Port" Binding="{Binding Port}" Width="70"/>
|
|
<DataGridTextColumn Header="Model" Binding="{Binding Model}" Width="150"/>
|
|
<DataGridTextColumn Header="Source" Binding="{Binding Source}" Width="80"/>
|
|
<DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="120"/>
|
|
<DataGridTextColumn Header="Registered Users" Binding="{Binding RegisteredUserCountDisplay}" Width="120"/>
|
|
<DataGridTextColumn Header="Last Sync" Binding="{Binding LastSyncDisplay}" Width="150"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</DockPanel>
|
|
</Border>
|
|
</Grid>
|
|
|
|
<Grid x:Name="UserManagementPage" Visibility="Collapsed">
|
|
<local:UserManagementView x:Name="UserManagementControl"/>
|
|
</Grid>
|
|
<Grid x:Name="AttendanceSyncPage" Visibility="Collapsed">
|
|
<local:AttendanceSyncView x:Name="AttendanceSyncControl"/>
|
|
</Grid>
|
|
<Grid x:Name="DeviceToDbPage" Visibility="Collapsed">
|
|
<local:DeviceToDbView x:Name="DeviceToDbControl"/>
|
|
</Grid>
|
|
<Grid x:Name="DbToDevicePage" Visibility="Collapsed">
|
|
<local:DbToDeviceView x:Name="DbToDeviceControl"/>
|
|
</Grid>
|
|
<Grid x:Name="DepartmentalSyncPage" Visibility="Collapsed">
|
|
<local:DepartmentalUserSyncView x:Name="DepartmentalSyncControl"/>
|
|
</Grid>
|
|
<Grid x:Name="SyncHistoryPage" Visibility="Collapsed">
|
|
<local:SyncHistoryView x:Name="SyncHistoryControl"/>
|
|
</Grid>
|
|
|
|
<Grid x:Name="PlaceholderPage" Visibility="Collapsed">
|
|
<Border Style="{StaticResource CardStyle}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="470" Padding="34">
|
|
<StackPanel HorizontalAlignment="Center"><TextBlock x:Name="PlaceholderTitle" FontSize="22" FontWeight="SemiBold" Foreground="#17233B" HorizontalAlignment="Center"/><TextBlock Text="This operator workflow is planned for a later implementation phase." Margin="0,14,0,0" TextAlignment="Center" Foreground="#66758C"/></StackPanel>
|
|
</Border>
|
|
</Grid>
|
|
</Grid>
|
|
</Grid>
|
|
</Window>
|