using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Sarand.Core.Bus; using Sarand.PatientMgr.Core.Bus; using Sarand.Win.Forms.Utils; using Sarand.Core.Base; using Sarand.PatientMgr.Core.App; using Sarand.PatientMgr.Win.Forms.Maint; using Sarand.PatientMgr.Win.Forms.Controls; using Sarand.PatientMgr.Win.Forms.TabPages; using Sarand.PatientMgr.Win.Forms.Filters; using Sarand.PatientMgr.Win.Forms.Base; namespace Sarand.PatientMgr.Win.Forms.Panels { //======================================================================= public partial class SpmPanel_Employees : SpmPanel_Items { //------------------------------------------------------------------- // Configuration. public enum PanelMode { Search, Maintain, } public new class Config : SpmPanel_Items.Config { public Config (PanelMode mode) { Mode = mode; // Defaults based on mode. DisplayFilter = false; // Mode == PanelMode.Maintain || Mode == PanelMode.Search; DisplayTabs = Mode == PanelMode.Maintain; DisplayActionButtons = Mode == PanelMode.Maintain; DisplayNavigationButtons = Mode == PanelMode.Search; } public PanelMode Mode { get; } = PanelMode.Maintain; public SpmForm SearchForm { get; set; } // Display options. public bool DisplayFilter { get; set; } = false; public bool DisplayContextMenu { get; set; } = true; public bool DisplayActionButtons { get; set; } = false; public bool DisplayNavigationButtons { get; set; } = false; public bool DisplayTabs { get; set; } = false; } //------------------------------------------------------------------- // Data members. private Config config = new Config(PanelMode.Search); private readonly List tabPages = new List(); //------------------------------------------------------------------- // Construction. private SpmPanel_Employees () : this(new Config(PanelMode.Search)) { } public SpmPanel_Employees (Config config) : base(config) { this.config = config; InitializeComponent(); } protected override void Dispose (bool disposing) { if (disposing) { if (components != null) components.Dispose(); } base.Dispose(disposing); } //------------------------------------------------------------------- // Properties. protected override String DefaultMessageTitle { get { return "Employee"; } } public override int ItemTotal { get { return listViewEmployee.ItemTotal; } } public override int ItemCount { get { return listViewEmployee.ItemCount; } } public override int SelectedItemCount { get { return listViewEmployee.SelectedItemCount; } } public SysId SelectedItemId { get { return listViewEmployee.SelectedItemId; } } public List SelectedItemIds { get { return listViewEmployee.SelectedItemIds; } } public SpmEmployee SelectedEmployee { get { return listViewEmployee.SelectedEmployee; } } //------------------------------------------------------------------- // Configure. public void SetConfig (Config config) { base.SetConfig(config); this.config = config; ConfigurePanel(); } //------------------------------------------------------------------- // I n i t i a l i s a t i o n //------------------------------------------------------------------- protected override void OnCreateControl () { base.OnCreateControl(); if (this.IsDesignerHosted()) return; ConfigurePanel(); } private void ConfigurePanel () { if (!Created || this.IsDesignerHosted()) return; // Configure filter. if (config.DisplayFilter) { SpmItemListFilter_Employee.Config configFilter = new SpmItemListFilter_Employee.Config(); configFilter.Internals = Internals; listFilterEmployee.SetConfig(configFilter); } listFilterEmployee.Visible = config.DisplayFilter; // Configure list. SpmItemListView_Employee.Config configList = new SpmItemListView_Employee.Config(); configList.Internals = Internals; configList.Mode = SpmItemListView_Employee.ListMode.General; listViewEmployee.SetConfig(configList); // Tabs. tabControl.TabPages.Clear(); tabControl.Visible = config.DisplayTabs; RefreshTabs(); // Configure buttons. buttonCreate.Visible = config.DisplayActionButtons && SecurityProfile.Admin.CanManageConfig(); buttonUpdate.Visible = config.DisplayActionButtons; buttonRemove.Visible = config.DisplayActionButtons && buttonCreate.Visible; buttonOk.Visible = config.DisplayNavigationButtons && config.Mode == PanelMode.Search; buttonCancel.Visible = config.DisplayNavigationButtons; // Complete form initialisation. RefreshDataItems(); SetControlActivity(); PositionControls(); } //------------------------------------------------------------------- // Initialise tabs. private void InitTabs () { String fn = GetType().Name + ".InitTabs"; tabControl.TabPages.Clear(); tabPages.Clear(); if (!config.DisplayTabs) { tabPages.Clear(); tabControl.TabPages.Clear(); tabControl.Visible = false; return; } // Selected Employee. SpmEmployee employee = SelectedEmployee; // Updates. List panelTypes_Updates = new List(); panelTypes_Updates.Add(SpmTabPage_Employee.PanelType.Updates); if (panelTypes_Updates.Count > 0) { SpmTabPage_Employee.Config configTabPage = new SpmTabPage_Employee.Config(); configTabPage.Internals = Internals; configTabPage.ReadOnly = ReadOnly; configTabPage.PanelTypes.AddRange(panelTypes_Updates); SpmTabPage_Employee tabPage = new SpmTabPage_Employee(configTabPage) { Text = "Updates" }; tabPages.Add(tabPage); } // Populate tab pages. tabControl.Visible = tabPages.Count > 0; foreach (var tabPage in tabPages) tabControl.TabPages.Add(tabPage); } //------------------------------------------------------------------- // P a n e l I n t e r f a c e //------------------------------------------------------------------- private String previouslySelectedTabPageText = ""; private void RefreshTabs () { if (tabControl.SelectedTab != null) previouslySelectedTabPageText = tabControl.SelectedTab.Text; // Reinitialise tabs whenever the selection changes in case the set of tab pages displayed needs to be changed. InitTabs(); // Select previous tab page if still present. if (!StringUtil.IsEmpty(previouslySelectedTabPageText)) { foreach (TabPage tabPage in tabControl.TabPages) { if (tabPage.Text.Equals(previouslySelectedTabPageText)) { tabControl.SelectTab(tabPage); break; } } } RefreshTabPages(); SetControlActivity(); PositionControls(); } private void RefreshTabPages () { // Selected Employee - populated when needed. SpmEmployee employee = null; // Refresh tabs. if (tabControl.Visible) { if (employee == null) employee = SelectedEmployee; SpmEmployee.Data employeeData = employee != null ? employee.GetData() : new SpmEmployee.Data(); tabPages.PopulateToControls(employeeData); } } //------------------------------------------------------------------- // F i l t e r //------------------------------------------------------------------- public bool ParamsAreValid (SpmEmployee.Params prmEmployee) { return true; } public SpmEmployee.Params GetParams () { SpmEmployee.Params prmEmployee = new SpmEmployee.Params(); // Sort columns. prmEmployee.SortColumns.AddRange(listViewEmployee.GetSortColumns()); return prmEmployee; } //------------------------------------------------------------------- // A c t i o n s //------------------------------------------------------------------- // Refresh. public override void RefreshDataItems () { SpmEmployee.Params prmEmployee = GetParams(); if (!ParamsAreValid(prmEmployee)) prmEmployee = null; listViewEmployee.RefreshEmployees(prmEmployee); } public override void RefreshDataItem (SysId id) { listViewEmployee.RefreshEmployee(id); } public override void RemoveDataItem (SysId id) { listViewEmployee.RemoveItemById(id); } //------------------------------------------------------------------- // Create item. public override bool CanCreateItem () { if (ReadOnly) return false; if (!SecurityProfile.Admin.CanManageConfig()) return false; return true; } public override void CreateItem () { if (!CanCreateItem()) return; if (config.Mode == PanelMode.Search) return; // Create new Employee. SpmForm_Employee.Config configEmployee = new SpmForm_Employee.Config(); using (var form = new SpmForm_Employee(configEmployee)) { if (form.ShowDialog() == DialogResult.OK) { RefreshDataItem(form.NewItemId); InvokeItemCreatedEvent(Spm.DataItemType.Employee, form.NewItemId); } } } //------------------------------------------------------------------- // View/Update item. public override bool CanViewItem () { return true; } public override bool CanUpdateItem () { if (ReadOnly) return false; if (!SecurityProfile.Admin.CanManageConfig()) return false; return true; } public override void UpdateItem (bool updateItem = true) { if (config.Mode == PanelMode.Search) return; SpmEmployee employee = SelectedEmployee; if (SelectedItemCount != 1) return; if (!CanUpdateItem() && !CanViewItem()) return; if (!CanUpdateItem()) updateItem = false; if (employee == null) { MessageConsole.ShowMessageWarning("Failed to retrieve selected item"); return; } SpmForm_Employee.Config configEmployee = new SpmForm_Employee.Config(); configEmployee.EmployeeToUpdate = employee; configEmployee.ReadOnly = (config.ReadOnly || !updateItem); using (SpmForm_Employee formEmployee = new SpmForm_Employee(configEmployee)) { // Perform the update. if (formEmployee.ShowDialog() == DialogResult.OK) { // Employee has been updated. RefreshDataItem(employee.Id); listViewEmployee.RefreshEmployee(employee.Id); InvokeItemUpdatedEvent(Spm.DataItemType.Employee, employee.Id); } } } //------------------------------------------------------------------- // Delete item. public override bool CanDeleteItem () { if (ReadOnly) return false; if (!SecurityProfile.Admin.CanManageConfig()) return false; return true; } public override void DeleteItem () { if (!CanDeleteItem()) return; if (config.Mode == PanelMode.Search) return; if (SelectedItemCount != 1) return; SpmEmployee employee = SelectedEmployee; if (employee == null) { MessageConsole.ShowMessageWarning("Failed to retrieve item for deletion."); return; } if (!InstitutionMgr.EmployeeCanBeDeleted(employee)) { MessageConsole.ShowMessageError("Unable to remove employee - " + InstitutionMgr.ErrorStateMessage + "."); return; } if (MessageConsole.ShowMessageConfirm("Are you sure that this employee should be removed from the system?")) { if (InstitutionMgr.DeleteEmployee(employee, DbUpdateInfo)) { int selectIdx = listViewEmployee.SelectedIndex; listViewEmployee.RemoveItemById(employee.Id.ToString()); if (selectIdx >= listViewEmployee.ItemCount - 1) selectIdx--; listViewEmployee.SelectedIndices.Clear(); listViewEmployee.SelectedIndices.Add(selectIdx); } else MessageConsole.ShowMessageError("Failed to remove employee - " + InstitutionMgr.ErrorStateMessage + "."); } } //------------------------------------------------------------------- // Import data. public override bool CanImportData () { return false; } public override void ImportData () { if (!CanImportData()) return; } //------------------------------------------------------------------- // Export data. public override bool CanExportData () { return false; } public override void ExportData () { } //------------------------------------------------------------------- // C o n t e x t M e n u //------------------------------------------------------------------- private SpmContextMenuStrip contextMenuStrip = new SpmContextMenuStrip(); private void RefreshContextMenu () { contextMenuStrip.Name = "Employee"; contextMenuStrip.Items.Clear(); if (CanCreateItem()) contextMenuStrip.Items.Add("Create", null, CreateItem); if (SysId.IsValid(listViewEmployee.SelectedItemId)) { SpmEmployee employee = SelectedEmployee; if (employee != null) { if (CanUpdateItem() || CanDeleteItem()) { if (contextMenuStrip.Items.Count > 0) contextMenuStrip.Items.Add(new ToolStripSeparator()); contextMenuStrip.Items.Add(CanUpdateItem() ? "Update" : "View", null, UpdateItem); if (CanDeleteItem()) contextMenuStrip.Items.Add("Remove", null, DeleteItem); } } } if (CanExportData() || CanImportData()) { if (contextMenuStrip.Items.Count > 0) contextMenuStrip.Items.Add(new ToolStripSeparator()); if (CanImportData()) contextMenuStrip.Items.Add("Import", null, ImportData); if (CanExportData()) contextMenuStrip.Items.Add("Export", null, ExportData); } } //------------------------------------------------------------------- // C o n t r o l A c t i v i t y //------------------------------------------------------------------- protected override void SetControlActivity () { SetControlsReadOnly(); bool itemSelected = SysId.IsValid(SelectedItemId); listViewEmployee.Enabled = Enabled; buttonCreate.Enabled = Enabled; buttonUpdate.Enabled = Enabled && itemSelected; buttonRemove.Enabled = Enabled && itemSelected; buttonOk.Enabled = Enabled; buttonCancel.Enabled = Enabled; } protected override void SetControlsReadOnly () { } //------------------------------------------------------------------- // P o s i t i o n C o n t r o l s //------------------------------------------------------------------- protected override void PositionControls () { if (this.IsDesignerHosted() || !Created) return; Rectangle clientRect = ClientRectangle; //--------------------------------------------------------------- // Filter panel. if (listFilterEmployee.Visible) { listFilterEmployee.PositionAtTopLeftOf(this); listFilterEmployee.SetFullWidthOf(this); listFilterEmployee.ResizeToBottomControl(); listViewEmployee.PositionBelow(listFilterEmployee); } else { listViewEmployee.PositionAtTopLeftOf(this); } //--------------------------------------------------------------- // List view. int buttonLeft = clientRect.Width - buttonCreate.Width - buttonCreate.Margin.Right - Padding.Right; listViewEmployee.Left = listViewEmployee.Margin.Left; listViewEmployee.Width = buttonLeft - buttonCreate.Margin.Left - listViewEmployee.Left - listViewEmployee.Margin.Right; if (!(buttonCreate.Visible || buttonUpdate.Visible || buttonRemove.Visible || buttonOk.Visible || buttonCancel.Visible)) listViewEmployee.Width = clientRect.Width - Padding.Right - listViewEmployee.Left - listViewEmployee.Margin.Right; //--------------------------------------------------------------- // Tab control. if (tabControl.Visible) { tabControl.Left = listViewEmployee.Left; tabControl.Width = clientRect.Width - (tabControl.Left * 2); listViewEmployee.Height = (int)((clientRect.Height - listViewEmployee.Top) * 0.40); tabControl.Top = listViewEmployee.Bottom + listViewEmployee.Margin.Bottom + tabControl.Margin.Top; tabControl.Height = clientRect.Height - tabControl.Top - tabControl.Margin.Bottom - Padding.Bottom; } else { listViewEmployee.Height = clientRect.Height - listViewEmployee.Top - listViewEmployee.Margin.Bottom - Padding.Bottom; } //--------------------------------------------------------------- // Create button. int buttonTop = listViewEmployee.Top + listViewEmployee.HeaderHeight; buttonCreate.Top = buttonTop; buttonCreate.Left = buttonLeft; if (buttonCreate.Visible) buttonTop += buttonCreate.Height + buttonCreate.Margin.Bottom; // Update button. buttonUpdate.Top = buttonTop; buttonUpdate.Left = buttonLeft; if (buttonUpdate.Visible) buttonTop += buttonUpdate.Height + buttonUpdate.Margin.Bottom; // Remove button. buttonRemove.Top = buttonTop; buttonRemove.Left = buttonLeft; if (buttonRemove.Visible) buttonTop += buttonRemove.Height + buttonRemove.Margin.Bottom; //--------------------------------------------------------------- // Navigation buttons. // Cancel button. buttonCancel.Top = clientRect.Bottom - Padding.Bottom - buttonCancel.Margin.Bottom - buttonCancel.Height; buttonCancel.Left = buttonLeft; // OK button. buttonOk.Top = buttonCancel.Top - buttonOk.Height - buttonCancel.Padding.Top - buttonCancel.Margin.Bottom; buttonOk.Left = buttonLeft; if (buttonOk.Visible) buttonTop += buttonOk.Height + buttonOk.Margin.Bottom; //--------------------------------------------------------------- } //------------------------------------------------------------------- // P a n e l E v e n t s //------------------------------------------------------------------- // Filter. private void listFilterEmployee_FilterChanged (object sender, EventArgs e) { RefreshDataItems(); SetControlActivity(); } //------------------------------------------------------------------- // Item list. private void listViewEmployee_ColumnClick (object sender, ColumnClickEventArgs e) { RefreshDataItems(); } private void listViewEmployee_ItemCountChanged (object sender, Sarand.Win.Forms.Controls.SacsListView.ItemCountChangedEventArgs e) { InvokeItemCountChangedEvent(e); } private void listViewEmployee_SelectedIndexChanged (object sender, EventArgs e) { RefreshTabs(); InvokeItemSelectionChangedEvent(e); SetControlActivity(); } private void listViewEmployee_DoubleClick (object sender, EventArgs e) { if (config.Mode == PanelMode.Search) { //if (config.SearchForm != null) config.SearchForm.OnOK(); } else UpdateItem(); SetControlActivity(); } private void listViewEmployee_MouseUp (object sender, MouseEventArgs e) { switch (e.Button) { case MouseButtons.Right: // Refresh the context menu and display at pointer position. RefreshContextMenu(); contextMenuStrip.Show(listViewEmployee, new Point(e.X, e.Y), ToolStripDropDownDirection.Default); break; } SetControlActivity(); } //------------------------------------------------------------------- // Actions. private void buttonCreate_Click (object sender, EventArgs e) { CreateItem(); SetControlActivity(); } private void buttonUpdate_Click (object sender, EventArgs e) { UpdateItem(); SetControlActivity(); } private void buttonRemove_Click (object sender, EventArgs e) { DeleteItem(); SetControlActivity(); } private void buttonOk_Click (object sender, EventArgs e) { if (config.SearchForm != null) { //config.SearchForm.OnOK(); return; } SetControlActivity(); } private void buttonCancel_Click (object sender, EventArgs e) { if (config.SearchForm != null) { //config.SearchForm.OnCancel(); return; } SetControlActivity(); } //------------------------------------------------------------------- } //======================================================================= }