Create a new Visual Studio "Class Library" using the ".NET Framework 4".
The Release version of these components need to be built using the latest source code.
using System;
using System.Collections.Generic;
using System.Text;
using Hurkin.Shipper.Client.Interfaces;
using System.Windows.Forms;
namespace Hurkin.Shipper.Client.Forms
{
public class Main : Interfaces.IPlugIn
{
private IPlugInHost _host = null;
private Control _control = null;
public System.Windows.Forms.Control Initialize(IPlugInHost host)
{
_host = host;
if (_control == null || _control.IsDisposed)
_control = new Calaway.Fumigation.UserControl1(MenuItem);
return _control;
}
public MenuItemInfo MenuItem
{
get
{
return new MenuItemInfo(String.Empty, "Fumigation Tool", EditLevel.Write, true);
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Hurkin.Shipper.Client;
using Hurkin.Shipper.Client.Forms;
using Hurkin.Shipper.Data.EntityClasses;
using Hurkin.Shipper.Data.HelperClasses;
using Hurkin.Shipper.Data.TypedListClasses;
using SD.LLBLGen.Pro.ORMSupportClasses;
namespace Calaway.Fumigation
{
public partial class UserControl1 : Hurkin.Shipper.Client.Forms.baseForm
{
public UserControl1(Hurkin.Shipper.Client.MenuItemInfo info)
{
InitializeComponent();
InitializeBaseForm(info);
colLocation.DataSource = Hurkin.Shipper.Client.Cache.GetItem(ItemType.LocationForCargo);
colLocation.ValueMember = LocationFields.LocationId.Name;
colLocation.DisplayMember = LocationFields.Description.Name;
}
}
private void ddlCargo_ValueChanged(object sender, EventArgs e)
{
// If the Cargo Number changes, get existing values
if (ddlCargo.Value.HasValue)
{
CargoEntity cargo = Program.Global.ShipperService.GetCargo(Program.Global.SessionId, ddlCargo.Value.Value) as CargoEntity;
Program.Global.StopWaiting();
ddlCargoLocation.Value = cargo.LocationId;
if (cargo.PlannedAvailableToShip.HasValue)
dtReadyToShip.DateTimeValue = cargo.PlannedAvailableToShip;
if (cargo.CargoContainer != null)
{
txtCuPlate.Text = cargo.CargoContainer.CuPlate;
if (cargo.CargoContainer.ActualFumigated.HasValue)
dtFumigated.DateTimeValue = cargo.CargoContainer.ActualFumigated;
if (cargo.CargoContainer.ActualOpened.HasValue)
dtOpened.DateTimeValue = cargo.CargoContainer.ActualOpened;
}
}
}
public override void SaveData()
{
// A collection for saved records
IEntityCollection2 toSave = new EntityCollection(new Hurkin.Shipper.Data.FactoryClasses.CargoEntityFactory());
// Loop through the grid, retrieve rows, and add to collection
foreach (DataGridViewRow row in grid.Rows)
{
int CargoId = (int)row.Cells[colCargoNumber.Index].Tag;
string CuPlate = row.Cells[colCuPlate.Index].Value.ToString();
int? LocationId = (int?)row.Cells[colLocation.Index].Tag;
DateTime? Fumigated = (DateTime?)row.Cells[colFumigated.Index].Tag;
DateTime? Opened = (DateTime?)row.Cells[colOpened.Index].Tag;
DateTime? ReadyToShip = (DateTime?)row.Cells[colReadyToShip.Index].Tag;
CargoEntity cargo = Program.Global.ShipperService.GetCargo(Program.Global.SessionId, CargoId) as CargoEntity;
if (cargo != null && cargo.CargoContainer != null)
{
cargo.CargoContainer.CuPlate = CuPlate;
cargo.CargoContainer.ActualFumigated = Fumigated;
cargo.CargoContainer.ActualOpened = Opened;
cargo.PlannedAvailableToShip = ReadyToShip;
cargo.LocationId = LocationId;
toSave.Add(cargo);
}
}
// Perform Save
Program.Global.ShipperService.SaveCollectionRecursive(Program.Global.SessionId, toSave, null);
Program.Global.StopWaiting();
grid.Rows.Clear();
base.SaveData();
}
First, the Custom Forms (CFM) feature needs to be enabled for a role. This can easily be done in HAAL.
Second, the DLL you produce needs to be placed in the appropriate PlugIns folder. This will always be on the same server(s) that provide your web services (Shipper.svc).
Whatever plugins you add will automatically be checked, downloaded and added to clients as they log in. They will appear under “Custom Items”.