using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Mail;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Threading;
using AvalonDock.Layout;
using Comal.Classes;
using Comal.Stores;
using Comal.TaskScheduler.Shared;
using H.Pipes;
using InABox.Client.IPC;
using InABox.Clients;
using InABox.Configuration;
using InABox.Core;
using InABox.Database;
using InABox.Database.SQLite;
using InABox.DeviceIdentifier;
using InABox.DynamicGrid;
using InABox.Mail;
using InABox.Reports;
using InABox.Core.Reports;
using InABox.Scripting;
using InABox.WPF;
using NAudio.Wave;
using PRS.Shared;
using InABox.WPF.Themes;
using NPOI.SS.Formula.Functions;
using PRSDesktop.Configuration;
using PRSDesktop.Forms;
using PRSServer;
using SharpAvi.Codecs;
using SharpAvi.Output;
using Syncfusion.UI.Xaml.Maps;
using Syncfusion.Windows.Shared;
using Syncfusion.Windows.Tools;
using Syncfusion.Windows.Tools.Controls;
using Activity = Comal.Classes.Activity;
using Application = System.Windows.Application;
using ButtonBase = System.Windows.Controls.Primitives.ButtonBase;
using Color = System.Windows.Media.Color;
using ColorConverter = System.Windows.Media.ColorConverter;
using Control = System.Windows.Controls.Control;
using Image = System.Drawing.Image;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using MessageBox = System.Windows.MessageBox;
using Pen = System.Drawing.Pen;
using PixelFormat = System.Drawing.Imaging.PixelFormat;
using Role = Comal.Classes.Role;
using SortDirection = InABox.Core.SortDirection;
using ValidationResult = InABox.Clients.ValidationResult;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
using FastReport.Export.Email;
using InABox.Wpf;
using javax.xml.crypto;
using PRSDesktop.Components.Spreadsheet;
using InABox.Wpf.Reports;
namespace PRSDesktop
{
///
/// Interaction logic for Main.xaml
///
public partial class MainWindow : IPanelHost
{
//private const int WM_LBUTTONDOWN = 0x201;
private static PipeServer? _client;
private WaveIn? _audio;
private bool _audioMuted;
private MemoryStream? _audioStream;
private readonly Dictionary _bitmaps = new();
private Console? _console;
private Dictionary> _notes = new();
//Dictionary Panels = new Dictionary();
private DispatcherTimer? _recorder;
private Process? _recordingnotes;
private int _screenheight = 720;
private int _screenleft;
private int _screentop;
private int _screenwidth = 1280;
private readonly Dictionary _secondarywindows = new();
private CoreTable? _timesheets;
private DailyActivityHistory? ActivityHistory;
private readonly List CurrentModules = new();
private IBasePanel? CurrentPanel;
private int CurrentPanel_Clicks;
private int CurrentPanel_Keys;
private string CurrentPanel_Label = "";
private DateTime CurrentPanel_Ticks = DateTime.MinValue;
private Fluent.RibbonTabItem? CurrentTab;
private Fluent.Button? CurrentButton;
private readonly int FRAMES_PER_SECOND = 10;
private DatabaseType DatabaseType;
private readonly Dictionary messages = new();
private readonly DispatcherTimer NotificationsWatchDog;
private DateTime pausestarted = DateTime.MinValue;
private readonly Scheduler scheduler = new() { Interval = new TimeSpan(0, 5, 0) };
// We use a Guid for the StationID rather than an IP or Mac address
// because we want true single-instance restriction. Using either of
// the above allows for two instances on the once machine, and thus
// double-counting in the Heartbeat() function
private Login station = new() { StationID = Guid.NewGuid().ToString() };
private TimeSpan totalpauses = new(0);
private readonly int VIDEO_HEIGHT = 1080;
private readonly int VIDEO_WIDTH = 1920;
public MainWindow()
{
NotificationsWatchDog = new DispatcherTimer { IsEnabled = false };
NotificationsWatchDog.Tick += Notifications_Tick;
NotificationsWatchDog.Interval = new TimeSpan(0, 2, 0);
ClientFactory.Notifications.AddHandler(ReceiveNotification);
ClientFactory.RegisterMailer(EmailType.IMAP, typeof(IMAPMailer));
ClientFactory.RegisterMailer(EmailType.Exchange, typeof(ExchangeMailer));
ClientFactory.OnLog += (_, message) => { Logger.Send(LogType.Information, ClientFactory.UserID, message); };
ClientFactory.OnRequestError += ClientFactory_OnRequestError;
HotKeyManager.Initialize();
HotKeyManager.RegisterHotKey(Key.F1, ShowHelp);
HotKeyManager.RegisterHotKey(Key.F5, ToggleRecording);
HotKeyManager.RegisterHotKey(Key.F6, ShowRecordingNotes);
HotKeyManager.RegisterHotKey(Key.F4, ToggleRecordingAudio);
DatabaseType = App.DatabaseSettings.DatabaseType;
switch (DatabaseType)
{
case DatabaseType.Standalone:
ClientFactory.SetClientType(typeof(LocalClient<>), "Wpf", CoreUtils.GetVersion());
DbFactory.ColorScheme = App.DatabaseSettings.ColorScheme;
DbFactory.Logo = App.DatabaseSettings.Logo;
break;
case DatabaseType.Networked:
var url = JsonClient.Ping(App.DatabaseSettings.URLs, out DatabaseInfo info);
ClientFactory.SetClientType(typeof(JsonClient<>), "Wpf", CoreUtils.GetVersion(),
url, true);
break;
case DatabaseType.Local:
ClientFactory.SetClientType(typeof(PipeIPCClient<>), "Wpf", CoreUtils.GetVersion(),
DatabaseServerProperties.GetPipeName(App.DatabaseSettings.LocalServerName));
break;
}
ThemeManager.BaseColor = Colors.CornflowerBlue;
Progress.DisplayImage = PRSDesktop.Resources.splash_small.AsBitmapImage();
try
{
var dbInfo = new Client().Info();
ThemeManager.BaseColor = (Color)ColorConverter.ConvertFromString(dbInfo.ColorScheme);
if (dbInfo.Logo?.Any() == true)
using (var ms = new MemoryStream(dbInfo.Logo))
{
Progress.DisplayImage = new Bitmap(ms).AsBitmapImage();
}
}
catch
{
}
InitializeComponent();
VideoRecordingStatus.Source = PRSDesktop.Resources.videorecording.AsGrayScale().AsBitmapImage();
AudioRecordingStatus.Source = PRSDesktop.Resources.audiorecording.AsGrayScale().AsBitmapImage();
SecondaryWindowStatus.Source = PRSDesktop.Resources.target.AsGrayScale().AsBitmapImage();
ConsoleStatus.Source = PRSDesktop.Resources.view.AsGrayScale().AsBitmapImage();
SelectTask.Source = PRSDesktop.Resources.uparrow.Invert().AsBitmapImage();
Title = $"{(String.Equals(App.Profile?.ToUpper(), "DEFAULT") ? "PRS Desktop" : App.Profile)} (Release {CoreUtils.GetVersion()})";
CheckForUpdates();
Exception? startupException = null;
Exception? loginException = null;
ValidationResult? loginStatus = null;
Progress.ShowModal("Loading PRS", progress =>
{
DynamicGridUtils.PreviewReport = (t, m) => { ReportUtils.PreviewReport(t, m, false, Security.IsAllowed()); };
DynamicGridUtils.PrintMenu = (e, s, m, p) => { ReportUtils.PrintMenu(e, s, m, Security.IsAllowed(), p); };
ImportFactory.Register(typeof(ExcelImporter<>), "Excel File", "Excel Files (*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm");
FormUtils.Register();
Logger.Send(LogType.Information, "", "Registering Classes");
progress.Report("Registering Classes");
var tasks = new List
{
Task.Run(() => CoreUtils.RegisterClasses(typeof(KanbanGrid).Assembly)),
Task.Run(() => CoreUtils.RegisterClasses()),
Task.Run(() => ComalUtils.RegisterClasses()),
Task.Run(() => ReportUtils.RegisterClasses()),
Task.Run(() => ConfigurationUtils.RegisterClasses()),
Task.Run(() => DynamicGridUtils.RegisterClasses()),
Task.Run(() =>
{
ScriptDocument.DefaultAssemblies.AddRange(
Assembly.Load("RoslynPad.Roslyn.Windows"),
Assembly.Load("RoslynPad.Editor.Windows"),
typeof(Control).Assembly,
typeof(MessageBox).Assembly,
typeof(SolidColorBrush).Assembly
);
ScriptDocument.Initialize();
}),
Task.Run(() => DatabaseUpdateScripts.RegisterScripts())
};
Task.WaitAll(tasks.ToArray());
progress.Report("Configuring Application");
RegisterModules(progress);
if (DatabaseType == DatabaseType.Standalone)
{
progress.Report("Starting local database...");
try
{
StartLocalDatabase(progress);
}
catch (Exception err)
{
startupException = new Exception(
string.Format(
"Unable to open database ({0})\n\n{1}\n\n{2}",
App.DatabaseSettings.FileName,
err.Message,
err.StackTrace
)
);
}
}
/*if (startupException == null && App.DatabaseSettings.Autologin)
{
progress.Report("Logging in...");
if (App.DatabaseSettings.LoginType == LoginType.UserID)
{
ValidationResult? result;
try
{
result = ClientFactory.Validate(App.DatabaseSettings.UserID, App.DatabaseSettings.Password);
}
catch(Exception e)
{
Logger.Send(LogType.Error, ClientFactory.UserID, $"Error connecting to server: {CoreUtils.FormatException(e)}");
loginException = new Exception("Error connecting to server.\nPlease check the server URL and port number.");
result = null;
}
loginStatus = result;
if (result == ValidationResult.INVALID)
{
loginException = new Exception("Unable to Login with User ID: " + App.DatabaseSettings.UserID);
}
}
if(loginStatus == ValidationResult.VALID)
{
LoadCurrentEmployee();
if(!CheckTimesheetBypass(false))
{
loginException = new Exception("You must clock on before logging in to PRS!");
loginStatus = null;
}
}
}*/
});
if (startupException != null)
MessageBox.Show(startupException.Message);
else if (loginException != null)
MessageBox.Show(loginException.Message);
if (DoLogin(App.DatabaseSettings.Autologin) == ValidationResult.VALID)
{
AfterLogin();
}
ProfileName.Content = App.Profile;
URL.Content = DatabaseType switch
{
DatabaseType.Networked => ClientFactory.Parameters?.FirstOrDefault(),
DatabaseType.Standalone => App.DatabaseSettings.FileName,
DatabaseType.Local => App.DatabaseSettings.LocalServerName,
_ => ""
};
Progress.ShowModal("Starting Up", progress =>
{
if (loginStatus == ValidationResult.VALID && DatabaseType == DatabaseType.Standalone)
{
progress.Report("Starting Scheduler");
scheduler.Start();
}
});
}
private bool _loggingOut = false;
private void ClientFactory_OnRequestError(RequestException e)
{
if (e.Status == StatusCode.Unauthenticated)
{
switch (e.Method)
{
case RequestMethod.Query:
case RequestMethod.Save:
case RequestMethod.Delete:
case RequestMethod.MultiQuery:
case RequestMethod.MultiSave:
case RequestMethod.MultiDelete:
if (!_loggingOut)
{
Dispatcher.InvokeAsync(() =>
{
_loggingOut = true;
try
{
Logout(null, true);
}
finally
{
_loggingOut = false;
}
});
}
break;
default:
break;
}
}
}
private void ApplyColorScheme()
{
Color baseColor;
try
{
baseColor = (Color)ColorConverter.ConvertFromString(App.DatabaseSettings.ColorScheme);
}
catch
{
baseColor = Colors.CornflowerBlue;
}
ThemeManager.BaseColor = baseColor;
BaseDynamicGrid.SelectionBackground = ThemeManager.SelectionBackgroundBrush;
BaseDynamicGrid.SelectionForeground = ThemeManager.SelectionForegroundBrush;
BaseDynamicGrid.FilterBackground = ThemeManager.FilterBackgroundBrush;
//_ribbon.Background = new SolidColorBrush(Colors.White);
//_ribbon.BackStageColor = ThemeConverter.GetBrush(ElementType.Ribbon, BrushType.Background);
////_ribbon.BackStage.Background = ThemeConverter.GetBrush(ElementType.Ribbon, BrushType.Background);
////_ribbon.BackStage.Foreground = ThemeConverter.GetBrush(ElementType.Ribbon, BrushType.Foreground);
UpdateRibbonColors();
CurrentPanel?.Refresh();
}
#region Configuration
/*
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
var source = PresentationSource.FromVisual(this) as HwndSource;
source?.AddHook(WndProc);
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
var message = (App.Message)msg;
switch (message)
{
case App.Message.Maximise:
WindowState = WindowState.Maximized;
break;
}
return IntPtr.Zero;
}*/
private interface ISetupActionItem
{
}
private class SetupActionItem : ISetupActionItem
{
public string Name { get; set; }
public Action Action { get; set; }
public Bitmap? Image { get; set; }
public Type? SecurityToken { get; set; }
public Func? CanView { get; set; }
public SetupActionItem(string name, Action action, Bitmap? image)
{
Name = name;
Action = action;
Image = image;
}
public bool IsVisible() => (SecurityToken == null || Security.IsAllowed(SecurityToken)) && (CanView == null || CanView());
public SetupActionItem SetSecurityToken() where T : ISecurityDescriptor, new()
{
SecurityToken = typeof(T);
return this;
}
public SetupActionItem SetCanView() where T : Entity
{
return SetSecurityToken>>();
}
}
private class SetupSeparator : ISetupActionItem { }
private Dictionary> SetupActions = new();
private List GetSetupActionList(Fluent.RibbonTabItem tab)
{
if (!SetupActions.TryGetValue(tab, out var list))
{
list = new();
SetupActions[tab] = list;
}
return list;
}
private SetupActionItem AddSetupAction(List list, string header, Action action, Bitmap? image)
{
var item = new SetupActionItem(header, action, image);
list.Add(item);
return item;
}
private SetupActionItem AddSetupAction(Fluent.RibbonTabItem tab, string header, Action action, Bitmap? image)
=> AddSetupAction(GetSetupActionList(tab), header, action, image);
private SetupActionItem? AddSetupAction(Fluent.RibbonTabItem tab, string header, Action action, Bitmap? image, bool canView)
{
if (!canView)
return null;
return AddSetupAction(tab, header, action, image);
}
private SetupSeparator AddSetupSeparator(List list)
{
var separator = new SetupSeparator();
list.Add(separator);
return separator;
}
private SetupSeparator AddSetupSeparator(Fluent.RibbonTabItem tab)
=> AddSetupSeparator(GetSetupActionList(tab));
private void AddSetupModulesAndReports(Fluent.RibbonTabItem tab)
{
AddSetupSeparator(tab);
AddSetupAction(tab, "Custom Modules", ManageModules, PRSDesktop.Resources.script).SetSecurityToken();
AddSetupAction(tab, "Reports", ManageReports, PRSDesktop.Resources.printer).SetSecurityToken();
AddSetupAction(tab, "Email Templates", ManageEmailTemplates, PRSDesktop.Resources.email).SetSecurityToken();
}
private void ConfigureMainScreen()
{
var button = _ribbon.FindVisualChildren().FirstOrDefault();
if (button != null)
button.Visibility = Visibility.Collapsed;
if (ClientFactory.UserGuid == Guid.Empty)
_ribbonRow.Height = new GridLength(30, GridUnitType.Pixel);
else
_ribbonRow.Height = new GridLength(1, GridUnitType.Auto);
var bMaps = Security.CanView()
|| Security.CanView()
|| Security.CanView()
|| Security.CanView();
Progress.ShowModal(
new ProgressSection(
"Configuring Main Screen",
() =>
{
ReportUtils.ExportDefinitions.Clear();
ReportUtils.ExportDefinitions.AddRange(AddTemplateDefinitions());
//DockManager.SidePanelSize = OutstandingDailyReports(false) ? 0.00F : 30.00F;
// Notifications Area
SetVisibility(SendNotification, Security.CanView());
SetVisibility(Notifications, Security.CanView());
SetVisibility(TaskTracking, Security.IsAllowed());
UserID.Content = ClientFactory.UserID;
if (ClientFactory.PasswordExpiration != DateTime.MinValue)
{
var timeUntilExpiration = ClientFactory.PasswordExpiration - DateTime.Now;
if (timeUntilExpiration.Days < 14)
{
PasswordExpiryNotice.Content = $"Password will expire in {timeUntilExpiration.Days} days!";
PasswordExpiryNotice.Visibility = Visibility.Visible;
}
else
{
PasswordExpiryNotice.Visibility = Visibility.Collapsed;
}
}
}
),
new ProgressSection(
"Configuring Quotes",
() =>
{
//// Quotes Menu Bar
SetVisibility(QuotesDashboardButton, Security.IsAllowed());
SetVisibility(QuotesMessagesButton, Security.CanView());
SetVisibility(QuotesTaskButton, Security.IsAllowed());
SetVisibility(QuotesAttendanceButton, Security.IsAllowed());
SetVisibility(QuotesMapButton, bMaps);
SetVisibility(QuotesDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(QuotesButton, Security.CanView());
SetVisibility(KitsMasterList, Security.CanView());
SetVisibility(CostSheetsMasterList, Security.CanView());
SetVisibleIfEither(QuotesTaskSeparator,
new FrameworkElement[]
{
QuotesDashboardButton, QuotesMessagesButton, QuotesTaskButton, QuotesAttendanceButton, QuotesMapButton,
QuotesDailyReportButton
}, new FrameworkElement[] { QuotesButton });
SetVisibleIfEither(QuotesActionSeparator, new FrameworkElement[] { QuotesButton },
new FrameworkElement[] { KitsMasterList, CostSheetsMasterList });
SetVisibleIfAny(QuotesActions, QuotesButton, KitsMasterList, CostSheetsMasterList);
AddSetupAction(QuotesTab, "Status Codes", QuoteStatusButton_Click, PRSDesktop.Resources.quotestatus,
ClientFactory.IsSupported() && Security.IsAllowed());
AddSetupAction(QuotesTab, "Design Sections", QuoteDesignSectionButton_Click, PRSDesktop.Resources.design,
Security.CanView());
AddSetupSeparator(QuotesTab);
AddSetupAction(QuotesTab, "Kit Conditions", KitConditionList_Click, PRSDesktop.Resources.kitcondition,
Security.CanView());
AddSetupAction(QuotesTab, "Kit Formulae", KitFormulaeList_Click, PRSDesktop.Resources.kitformula,
Security.CanView());
AddSetupAction(QuotesTab, "Cost Sheet Types", CostSheetTypeList_Click, PRSDesktop.Resources.costsheettype,
Security.CanView());
AddSetupAction(QuotesTab, "Cost Sheet Brands", CostSheetBrandList_Click, PRSDesktop.Resources.costsheetbrand,
Security.CanView());
AddSetupAction(QuotesTab, "Cost Sheet Sections", CostSheetSectionList_Click, PRSDesktop.Resources.costsheetsection,
Security.CanView());
AddSetupSeparator(QuotesTab);
AddSetupAction(QuotesTab, "Symbols", QuoteDiagramSymbols_Checked, PRSDesktop.Resources.pencil,
Security.CanView());
AddSetupAction(QuotesTab, "Symbol Types", QuoteDiagramSymbolTypes_Checked, PRSDesktop.Resources.attachment,
Security.CanView());
AddSetupAction(QuotesTab, "Dimension Types", QuoteTakeOffUnits_Click, PRSDesktop.Resources.box,
Security.CanView());
AddSetupSeparator(QuotesTab);
AddSetupAction(QuotesTab, "Spreadsheet Templates", () => ViewSpreadsheetTemplates(), PRSDesktop.Resources.box,
Security.CanView());
AddSetupModulesAndReports(QuotesTab);
SetTabVisibleIfAny(QuotesTab, QuotesActions);
}
),
new ProgressSection(
"Configuring Projects",
() =>
{
SetVisibility(ProjectsDashboardButton, Security.IsAllowed());
SetVisibility(ProjectMessagesButton, Security.CanView());
SetVisibility(ProjectTaskButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ProjectAttendanceButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ProjectsMapButton, bMaps);
SetVisibility(ProjectDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ProjectsButton, Security.CanView());
SetVisibility(ServiceButton, false);
SetVisibility(ProjectPlannerButton, Security.CanView());
SetVisibleIfEither(ProjectTaskSeparator,
new FrameworkElement[]
{
ProjectsDashboardButton, ProjectMessagesButton, ProjectTaskButton, ProjectAttendanceButton, ProjectsMapButton,
ProjectDailyReportButton
}, new FrameworkElement[] { QuotesButton, ProjectsButton, ServiceButton, ProjectPlannerButton });
AddSetupAction(ProjectsTab, "Job Statuses", JobStatusButton_Click, PRSDesktop.Resources.view,
Security.CanView());
AddSetupAction(ProjectsTab, "Document MileStones", JobDocumentMileStoneButton_OnClick, PRSDesktop.Resources.revision,
true);
//AddSetupAction(ProjectsTab, "Document Tags", JobDocumentTagButton_OnClick, PRSDesktop.Resources.checklist,
// true);
AddSetupAction(ProjectsTab, "Financial Statuses", FinancialStatusButton_Click, PRSDesktop.Resources.view,
Security.CanView());
AddSetupAction(ProjectsTab, "Drawing Templates", DrawingTemplatesButton_Click, PRSDesktop.Resources.doc_misc,
true);
AddSetupSeparator(ProjectsTab);
AddSetupAction(ProjectsTab, "Spreadsheet Templates", () => ViewSpreadsheetTemplates(), PRSDesktop.Resources.box,
Security.CanView());
AddSetupModulesAndReports(ProjectsTab);
//ProjectsActions.IsLauncherButtonVisible = Security.IsAllowed();
//ProjectReports.IsLauncherButtonVisible = Security.IsAllowed();
SetTabVisibleIfAny(ProjectsTab, ProjectsButton, ServiceButton, ProjectPlannerButton);
}
),
new ProgressSection(
"Configuring Manufacturing",
() =>
{
SetVisibility(ManufacturingDashboardButton, Security.IsAllowed());
SetVisibility(ManufacturingMessagesButton, Security.CanView());
SetVisibility(ManufacturingTaskButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ManufacturingAttendanceButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ManufacturingMapButton, bMaps);
SetVisibility(ManufacturingDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(FactoryStatusButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(FactoryAllocationButton,
ClientFactory.IsSupported() &&
Security.IsAllowed());
//SetVisibility(FactoryScheduleButton, ClientFactory.IsSupported() && ClientFactory.IsEnabled<>());
SetVisibility(FactoryFloorButton,
ClientFactory.IsSupported() && Security.IsAllowed());
//SetVisibility(FactoryReadyButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibleIfEither(ManufacturingTaskSeparator,
new FrameworkElement[]
{
ManufacturingDashboardButton, ManufacturingMessagesButton, ManufacturingTaskButton, ManufacturingAttendanceButton,
ManufacturingMapButton, ManufacturingDailyReportButton
}, new FrameworkElement[] { FactoryStatusButton, FactoryAllocationButton, FactoryFloorButton /* , FactoryReadyButton */ });
SetVisibleIfAny(ManufacturingActions, ManufacturingDashboardButton, ManufacturingMessagesButton, ManufacturingTaskButton,
ManufacturingAttendanceButton, ManufacturingDailyReportButton, FactoryStatusButton, FactoryAllocationButton,
FactoryFloorButton);
AddSetupAction(ManufacturingTab, "Factory Settings", FactorySetup_Click, PRSDesktop.Resources.factorysetup,
ClientFactory.IsSupported() && Security.IsAllowed());
AddSetupAction(ManufacturingTab, "Manufacturing Templates", TemplateSetup_Click, PRSDesktop.Resources.template,
Security.CanView());
AddSetupAction(ManufacturingTab, "Manufacturing Trolleys", TrolleySetup_Click, PRSDesktop.Resources.trolley,
Security.CanView());
AddSetupAction(ManufacturingTab, "Lost Time Types", LostTimeSetup_Click, PRSDesktop.Resources.smiley,
Security.CanView());
//ManufacturingActions.IsLauncherButtonVisible = Security.IsAllowed();
//ManufacturingReports.IsLauncherButtonVisible = Security.IsAllowed();
AddSetupModulesAndReports(ManufacturingTab);
SetTabVisibleIfAny(ManufacturingTab, FactoryStatusButton, FactoryAllocationButton, FactoryFloorButton);
}
),
new ProgressSection(
"Configuring Logistics",
() =>
{
SetVisibility(LogisticsDashboardButton, Security.IsAllowed());
SetVisibility(LogisticsMessagesButton, Security.CanView());
SetVisibility(LogisticsTaskButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(LogisticsAttendanceButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(LogisticsMapButton, bMaps);
SetVisibility(LogisticsDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ReadyToGoItemsButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(DispatchButton, Security.CanView() && Security.CanView());
SetVisibility(RequisitionsButton, Security.CanView());
SetVisibility(DeliveriesButton, Security.IsAllowed());
SetVisibility(DeliveredItemsButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ConsignmentButton, Security.CanView());
SetVisibleIfEither(LogisticsTaskSeparator1,
new FrameworkElement[]
{
LogisticsDashboardButton, LogisticsMessagesButton, LogisticsTaskButton, LogisticsAttendanceButton, LogisticsMapButton,
LogisticsDailyReportButton
},
new FrameworkElement[]
{ ReadyToGoItemsButton, DispatchButton, RequisitionsButton, DeliveriesButton, DeliveredItemsButton });
SetVisibleIfEither(LogisticsTaskSeparator2,
new FrameworkElement[]
{ ReadyToGoItemsButton, DispatchButton, RequisitionsButton, DeliveriesButton, DeliveredItemsButton },
new FrameworkElement[] { ConsignmentButton });
AddSetupAction(LogisticsTab, "Delivery Types", DeliveryTypesButton_Click, PRSDesktop.Resources.truck,
Security.CanView());
AddSetupAction(LogisticsTab, "Consignment Types", ConsignmentTypesButton_Click, PRSDesktop.Resources.service,
Security.CanView());
//LogisticsActions.IsLauncherButtonVisible = Security.IsAllowed();
//LogisticsReports.IsLauncherButtonVisible = Security.IsAllowed();
AddSetupModulesAndReports(LogisticsTab);
SetTabVisibleIfAny(LogisticsTab, DispatchButton, RequisitionsButton, DeliveriesButton, ReadyToGoItemsButton,
DeliveredItemsButton,
ConsignmentButton);
}
),
new ProgressSection(
"Configuring Products",
() =>
{
SetVisibility(ProductsDashboardButton, Security.IsAllowed());
SetVisibility(ProductsMessagesButton, Security.CanView());
SetVisibility(ProductsTaskButton, Security.CanView());
SetVisibility(ProductsAttendanceButton, Security.IsAllowed());
SetVisibility(ProductsMapButton, bMaps);
SetVisibility(ProductsDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(ProductsMasterList, Security.CanView());
SetVisibility(StockLocationList, Security.CanView());
SetVisibility(StockMovementList, Security.CanView());
SetVisibility(StockSummaryButton, Security.CanView() && Security.CanView());
SetVisibleIfEither(ProductsTaskSeparator,
new FrameworkElement[]
{
ProductsDashboardButton, ProductsMessagesButton, ProductsTaskButton, ProductsAttendanceButton, ProductsMapButton,
ProductsDailyReportButton
}, new FrameworkElement[] { ProductsMasterList, StockLocationList, StockMovementList, StockSummaryButton });
SetVisibleIfAny(ProductActions, ProductsMasterList, StockLocationList, StockMovementList, StockSummaryButton);
AddSetupAction(ProductTab, "Product Dimensions", ProductDimensionUnitsList_Click, PRSDesktop.Resources.unitofmeasure,
Security.CanView());
AddSetupAction(ProductTab, "Product Groups", ProductGroupsList_Click, PRSDesktop.Resources.productgroup,
Security.CanView());
AddSetupAction(ProductTab, "Product Styles", ProductStylesList_Click, PRSDesktop.Resources.palette,
Security.CanView());
AddSetupAction(ProductTab, "Stock Areas", StockAreasList_Click, PRSDesktop.Resources.rack,
Security.CanView());
AddSetupAction(ProductTab, "Stock Warehouses", StockWarehouseList_Click, PRSDesktop.Resources.factorysetup,
Security.CanView());
AddSetupSeparator(ProductTab);
AddSetupAction(ProductTab, "Spreadsheet Templates", () => ViewSpreadsheetTemplates(), PRSDesktop.Resources.box,
Security.CanView());
AddSetupModulesAndReports(ProductTab);
SetTabVisibleIfAny(ProductTab, ProductActions);
}
),
new ProgressSection(
"Configuring Human Resources",
() =>
{
SetVisibility(HumanResourcesDashboardButton, Security.IsAllowed());
SetVisibility(HumanResourcesMessagesButton, Security.CanView());
SetVisibility(HumanResourcesTaskButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(HumanResourcesAttendanceButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(HumanResourcesMapButton, bMaps);
SetVisibility(HumanResourcesDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(AssignmentsButton, Security.CanView());
SetVisibility(EmployeePlannerButton, Security.CanView());
SetVisibility(TimesheetsButton, Security.CanView());
SetVisibility(LeaveRequestsButton, Security.CanView());
SetVisibility(OrgChartButton,
ClientFactory.IsSupported()
&& (
Security.IsAllowed()
|| Security.IsAllowed()
|| Security.IsAllowed()
)
);
SetVisibleIfEither(HumanResourcesTaskSeparator,
new FrameworkElement[]
{
HumanResourcesDashboardButton, HumanResourcesMessagesButton, HumanResourcesTaskButton, HumanResourcesAttendanceButton,
HumanResourcesMapButton, HumanResourcesDailyReportButton
}, new FrameworkElement[] { AssignmentsButton, EmployeePlannerButton, TimesheetsButton, LeaveRequestsButton, OrgChartButton });
SetVisibleIfAny(HumanResourcesActions, HumanResourcesDashboardButton, HumanResourcesTaskButton,
HumanResourcesAttendanceButton,
HumanResourcesDailyReportButton, AssignmentsButton, EmployeePlannerButton, TimesheetsButton, LeaveRequestsButton, OrgChartButton);
SetVisibility(UsersButton, Security.CanView());
SetVisibility(EmployeesButton, Security.CanView());
AddSetupAction(HumanResourcesTab, "Security Groups", SecurityGroupsButton_Click, PRSDesktop.Resources.securitygroup,
Security.CanView());
AddSetupSeparator(HumanResourcesTab);
AddSetupAction(HumanResourcesTab, "Employee Groups", GroupsSetup_Click, PRSDesktop.Resources.employees,
Security.CanView());
AddSetupAction(HumanResourcesTab, "Positions", PositionsSetup_Click, PRSDesktop.Resources.position,
Security.CanView());
AddSetupAction(HumanResourcesTab, "Roles", RolesSetup_Click, PRSDesktop.Resources.employeerole,
Security.CanView());
AddSetupAction(HumanResourcesTab, "Teams", EmployeeTeamsButton_Click, PRSDesktop.Resources.team,
Security.CanView());
AddSetupAction(HumanResourcesTab, "Activities", ActivityMenu_Click, PRSDesktop.Resources.quality,
Security.CanView());
AddSetupAction(HumanResourcesTab, "Qualifications", QualificationMenu_Click, PRSDesktop.Resources.certificate,
Security.CanView());
AddSetupAction(HumanResourcesTab, "Rosters", RosterMenu_Click, PRSDesktop.Resources.assignments,
Security.CanView());
AddSetupSeparator(HumanResourcesTab);
// AddSetupAction(HumanResourcesTab, "Rosters", RostersButton_Click, PRSDesktop.Resources.attendance,
// Security.CanView());
AddSetupAction(HumanResourcesTab, "Overtime Rules", OvertimeRulesButton_Click, PRSDesktop.Resources.overtime,
Security.CanView());
AddSetupAction(HumanResourcesTab, "Standard Leave", StandardLeaveButton_Click, PRSDesktop.Resources.fireworks,
Security.CanView());
SetVisibleIfEither(HumanResourcesSetupSeparator1,
new FrameworkElement[] { AssignmentsButton, TimesheetsButton, LeaveRequestsButton, OrgChartButton },
new FrameworkElement[] { UsersButton, EmployeesButton });
//HumanResourcesActions.IsLauncherButtonVisible = Security.IsAllowed();
//HumanResourcesReports.IsLauncherButtonVisible = Security.IsAllowed();
AddSetupSeparator(HumanResourcesTab);
AddSetupAction(HumanResourcesTab, "Spreadsheet Templates", () => ViewSpreadsheetTemplates(), PRSDesktop.Resources.box,
Security.CanView());
AddSetupModulesAndReports(HumanResourcesTab);
SetTabVisibleIfAny(HumanResourcesTab, AssignmentsButton, TimesheetsButton, LeaveRequestsButton, OrgChartButton, UsersButton, EmployeesButton);
}
),
new ProgressSection(
"Configuring Accounts",
() =>
{
SetVisibility(AccountsDashboardButton, Security.IsAllowed());
SetVisibility(AccountsMessagesButton, Security.CanView());
SetVisibility(AccountsTaskButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(AccountsDataButton, Security.IsAllowed());
SetVisibility(AccountsAttendanceButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(AccountsMapButton, bMaps);
SetVisibility(AccountsDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(CustomerList, ClientFactory.IsSupported() && Security.CanView());
SetVisibility(InvoiceList, ClientFactory.IsSupported() && Security.CanView());
SetVisibility(ReceiptList, ClientFactory.IsSupported() && Security.CanView());
SetVisibility(SupplierList, ClientFactory.IsSupported() && Security.CanView());
SetVisibility(PurchasesList, ClientFactory.IsSupported() && Security.CanView());
SetVisibility(BillsList, ClientFactory.IsSupported() && Security.CanView());
SetVisibility(PaymentsList, ClientFactory.IsSupported() && Security.CanView());
SetVisibleIfEither(AccountsTaskSeparator1,
new FrameworkElement[]
{
AccountsDashboardButton, AccountsMessagesButton, AccountsTaskButton, AccountsAttendanceButton, AccountsMapButton,
AccountsDailyReportButton
}, new FrameworkElement[] { CustomerList, InvoiceList, ReceiptList });
SetVisibleIfEither(AccountsTaskSeparator2, new FrameworkElement[] { CustomerList, InvoiceList, ReceiptList },
new FrameworkElement[] { SupplierList, PurchasesList, BillsList, PaymentsList });
SetVisibleIfAny(AccountsActions, AccountsDashboardButton, AccountsMessagesButton, AccountsTaskButton,
AccountsAttendanceButton,
AccountsDailyReportButton, CustomerList, InvoiceList, ReceiptList, SupplierList, PurchasesList, BillsList, PaymentsList);
AddSetupAction(AccountsTab, "Contact Types", ContactTypeList_Click, PRSDesktop.Resources.contacttype,
ClientFactory.IsSupported() && Security.CanView());
AddSetupAction(AccountsTab, "Tax Codes", TaxCodeList_Click, PRSDesktop.Resources.taxcode,
ClientFactory.IsSupported() && Security.CanView());
AddSetupAction(AccountsTab, "Receipt Types", ReceiptTypeList_Click, PRSDesktop.Resources.receipt,
ClientFactory.IsSupported() && Security.CanView());
AddSetupAction(AccountsTab, "Payment Types", PaymentTypeList_Click, PRSDesktop.Resources.payment,
ClientFactory.IsSupported() && Security.CanView());
AddSetupAction(AccountsTab, "Cost Centres", CostCentresList_Click, PRSDesktop.Resources.costcentre,
ClientFactory.IsSupported() && Security.CanView());
AddSetupAction(AccountsTab, "GL Codes", GLCodesList_Click, PRSDesktop.Resources.glcode,
ClientFactory.IsSupported() && Security.CanView());
AddSetupAction(AccountsTab, "Purchase Order Categories", PurchaseOrderCategoriesButton_Click, PRSDesktop.Resources.service,
ClientFactory.IsSupported() && Security.CanView());
//AccountsActions.IsLauncherButtonVisible = Security.IsAllowed();
//AccountsReports.IsLauncherButtonVisible = Security.IsAllowed();
AddSetupSeparator(AccountsTab);
AddSetupAction(AccountsTab, "Customer Spreadsheet Templates", () => ViewSpreadsheetTemplates(), PRSDesktop.Resources.box,
Security.CanView());
AddSetupAction(AccountsTab, "Supplier Spreadsheet Templates", () => ViewSpreadsheetTemplates(), PRSDesktop.Resources.box,
Security.CanView());
AddSetupModulesAndReports(AccountsTab);
SetTabVisibleIfAny(AccountsTab, CustomerList, InvoiceList, ReceiptList, SupplierList, PurchasesList, BillsList, PaymentsList);
}
),
new ProgressSection(
"Configuring Equipment",
() =>
{
SetVisibility(EquipmentDashboardButton, Security.IsAllowed());
SetVisibility(EquipmentMessagesButton, Security.CanView());
SetVisibility(EquipmentTaskButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(EquipmentAttendanceButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(EquipmentMapButton, bMaps);
SetVisibility(EquipmentDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(EquipmentButton, ClientFactory.IsSupported() && Security.CanView());
SetVisibleIfEither(EquipmentTaskSeparator,
new FrameworkElement[]
{
EquipmentDashboardButton, EquipmentMessagesButton, EquipmentTaskButton, EquipmentAttendanceButton, EquipmentMapButton,
EquipmentDailyReportButton
}, new FrameworkElement[] { EquipmentButton });
SetVisibleIfAny(EquipmentActions, EquipmentDashboardButton, EquipmentMessagesButton, EquipmentTaskButton,
EquipmentAttendanceButton, EquipmentDailyReportButton, EquipmentButton);
SetVisibility(TrackersMasterList, Security.CanView());
AddSetupAction(EquipmentTab, "Tracker Types", TrackerTypes_Click, PRSDesktop.Resources.milestone,
Security.CanView());
AddSetupAction(EquipmentTab, "Stickers", Stickers_Click, PRSDesktop.Resources.barcode,
Security.CanView());
AddSetupAction(EquipmentTab, "Digital Keys", DigitalKeys_Click, PRSDesktop.Resources.key,
Security.CanView());
AddSetupAction(EquipmentTab, "Equipment Groups", EquipmentGroupList_Click, PRSDesktop.Resources.specifications,
Security.CanView());
//EquipmentActions.IsLauncherButtonVisible = Security.IsAllowed();
//EquipmentReports.IsLauncherButtonVisible = Security.IsAllowed();
AddSetupModulesAndReports(EquipmentTab);
SetTabVisibleIfAny(EquipmentTab, EquipmentButton, TrackersMasterList);
}
),
new ProgressSection(
"Configuring Dashboards",
() =>
{
SetVisibility(DashboardsDashboardButton, Security.IsAllowed());
SetVisibility(DashboardMessagesButton, Security.CanView());
SetVisibility(DashboardsTaskButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(DashboardsAttendanceButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(DashboardsMapButton, bMaps);
SetVisibility(DashboardsDailyReportButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(FactoryProductivityButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(TemplateAnalysisButton,
ClientFactory.IsSupported() &&
Security.IsAllowed());
SetVisibility(FactoryAnalysisButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(DatabaseActivityButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(UserActivityButton, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(QAAnalysisButton, Security.IsAllowed());
SetVisibility(QuickStatusButton, Security.IsAllowed());
SetVisibleIfEither(DashboardsTaskSeparator,
new FrameworkElement[]
{
DashboardsDashboardButton, DashboardMessagesButton, DashboardsTaskButton, DashboardsAttendanceButton,
DashboardsMapButton,
DashboardsDailyReportButton
},
new FrameworkElement[]
{
FactoryProductivityButton, TemplateAnalysisButton, FactoryAnalysisButton, DatabaseActivityButton, UserActivityButton,
QAAnalysisButton, QuickStatusButton
});
SetVisibleIfAny(DashboardsActions, DashboardsDashboardButton, DashboardMessagesButton, DashboardsTaskButton,
DashboardsAttendanceButton, DashboardsDailyReportButton, FactoryProductivityButton, TemplateAnalysisButton,
FactoryAnalysisButton, DatabaseActivityButton, UserActivityButton, QAAnalysisButton, QuickStatusButton);
//DashboardsActions.IsLauncherButtonVisible = Security.IsAllowed();
//DashboardsReports.IsLauncherButtonVisible = Security.IsAllowed();
AddSetupModulesAndReports(DashboardsTab);
SetVisibleIfAny(DashboardsTab, FactoryProductivityButton, TemplateAnalysisButton, FactoryAnalysisButton,
DatabaseActivityButton,
UserActivityButton, QAAnalysisButton, QuickStatusButton);
}
),
new ProgressSection(
"Configuring System Modules",
() =>
{
SetVisibility(CompanyInformation, Security.CanView());
SetVisibleIfAny(BackstageSeparator0, CompanyInformation);
SetVisibility(SecurityDefaultsButton,
ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibleIfAny(BackstageSeparator1, SecurityDefaultsButton);
BackstageSeparator1a.Visibility = Visibility.Visible;
SystemLogsButton.Visibility = Visibility.Visible;
SetVisibility(DocumentTypeList, ClientFactory.IsSupported() && Security.IsAllowed());
SetVisibility(DocumentList, ClientFactory.IsSupported