using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.DocumentEngine;
using CMS.GlobalHelper;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.WorkflowEngine;
using TreeNode = CMS.DocumentEngine.TreeNode;
using CMS.EventLog;
public partial class CMSModules_Content_Controls_Versions : CMSUserControl
{
#region "Variables"
private WorkflowInfo mWorkflowInfo = null;
#endregion
#region "Properties"
///
/// Identifier of edited node.
///
public int NodeID
{
get
{
return versionsElem.NodeID;
}
}
///
/// Currently edited node.
///
public TreeNode Node
{
get
{
return versionsElem.Node;
}
set
{
versionsElem.Node = value;
}
}
///
/// Tree provider.
///
public TreeProvider Tree
{
get
{
return versionsElem.TreeProvider;
}
}
///
/// Version manager.
///
public VersionManager VersionManager
{
get
{
return versionsElem.VersionManager;
}
}
///
/// Workflow manager.
///
public WorkflowManager WorkflowManager
{
get
{
return versionsElem.WorkflowManager;
}
}
///
/// Returns workflow step information of current node.
///
public WorkflowInfo WorkflowInfo
{
get
{
return mWorkflowInfo ?? (mWorkflowInfo = WorkflowManager.GetNodeWorkflow(Node));
}
set
{
mWorkflowInfo = value;
}
}
///
/// Returns workflow step information of current node.
///
public WorkflowStepInfo WorkflowStepInfo
{
get
{
return versionsElem.WorkflowStepInfo;
}
}
///
/// Indicates if control is enabled
///
public bool Enabled
{
get
{
return pnlVersions.Enabled;
}
set
{
pnlVersions.Enabled = value;
}
}
#endregion
#region "Page events"
protected void Page_Load(object sender, EventArgs e)
{
// Register the scripts
ScriptHelper.RegisterProgress(Page);
// Register the dialog script
ScriptHelper.RegisterDialogScript(Page);
CMSPage page = Page as CMSPage;
if (page != null)
{
versionsElem.InfoLabel = page.CurrentMaster.InfoLabel;
versionsElem.ErrorLabel = page.CurrentMaster.ErrorLabel;
}
versionsElem.AfterDestroyHistory += versionsElem_AfterDestroyHistory;
versionsElem.CombineWithDefaultCulture = false;
if (Node != null)
{
// Check read permissions
if (CMSContext.CurrentUser.IsAuthorizedPerDocument(Node, NodePermissionsEnum.Read) == AuthorizationResultEnum.Denied)
{
RedirectToAccessDenied(String.Format(GetString("cmsdesk.notauthorizedtoreaddocument"), Node.NodeAliasPath));
}
ReloadData();
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
lblWorkflow.Visible = !string.IsNullOrEmpty(lblWorkflow.Text);
DocumentManager.DocumentInfo = DocumentManager.GetDocumentInfo(true);
}
#endregion
#region "Methods"
private void ShowInfo(string message, bool persistent)
{
if (IsLiveSite)
{
ShowInformation(message, null, persistent);
}
else
{
DocumentManager.DocumentInfo = message;
}
}
///
/// Reloads the page data.
///
private void ReloadData()
{
// If no workflow set for node, hide the data
if (WorkflowInfo == null)
{
lblWorkflow.Text = GetString("properties.scopenotset");
DisableForm();
pnlVersions.Visible = false;
}
else
{
if (!WorkflowStepInfo.StepIsDefault && !WorkflowManager.CheckStepPermissions(Node, WorkflowActionEnum.Approve))
{
ShowInfo(GetString("EditContent.NotAuthorizedToApprove"), true);
}
}
bool useCheckInCheckOut = false;
if (WorkflowInfo != null)
{
useCheckInCheckOut = WorkflowInfo.UseCheckInCheckOut(CMSContext.CurrentSiteName);
}
// Check modify permissions
if (!versionsElem.CanModify)
{
DisableForm();
plcForm.Visible = false;
ShowInfo(String.Format(GetString("cmsdesk.notauthorizedtoeditdocument"), Node.NodeAliasPath), true);
}
else if (useCheckInCheckOut || (versionsElem.CheckedOutByUserID != 0))
{
btnCheckout.Visible = false;
btnCheckout.Enabled = true;
btnCheckin.Visible = false;
btnCheckin.Enabled = true;
btnUndoCheckout.Visible = false;
btnUndoCheckout.Enabled = true;
txtComment.Enabled = true;
txtVersion.Enabled = true;
lblComment.Enabled = true;
lblVersion.Enabled = true;
// Check whether to check out or in
if (WorkflowInfo == null)
{
btnCheckout.Visible = true;
lblCheckInfo.Text = GetString("VersionsProperties.CheckOut");
lblWorkflow.Text = GetString("properties.scopenotset");
DisableForm();
}
else if (!Node.IsCheckedOut)
{
lblCheckInfo.Text = GetString("VersionsProperties.CheckOut");
lblWorkflow.Text = GetString("VersionsProperties.InfoCheckedIn");
DisableForm();
btnCheckout.Visible = true;
// Do not allow checkout for published or archived step in advanced workflow
btnCheckout.Enabled = (WorkflowInfo.IsBasic || (!WorkflowStepInfo.StepIsPublished && !WorkflowStepInfo.StepIsArchived));
}
else
{
// If checked out by current user, allow to check-in
if (versionsElem.CheckedOutByUserID == CMSContext.CurrentUser.UserID)
{
btnCheckin.Visible = true;
btnUndoCheckout.Visible = true;
lblCheckInfo.Text = GetString("VersionsProperties.CheckIn");
lblWorkflow.Text = GetString("VersionsProperties.InfoCheckedOut");
}
else
{
// Else checked out by somebody else
btnCheckin.Visible = true;
btnCheckout.Visible = false;
lblCheckInfo.Text = GetString("VersionsProperties.CheckIn");
btnUndoCheckout.Visible = versionsElem.CanCheckIn;
btnUndoCheckout.Enabled = versionsElem.CanCheckIn;
btnCheckin.Enabled = versionsElem.CanCheckIn;
txtComment.Enabled = versionsElem.CanCheckIn;
txtVersion.Enabled = versionsElem.CanCheckIn;
}
}
if (!WorkflowManager.CheckStepPermissions(Node, WorkflowActionEnum.Approve))
{
DisableForm();
}
}
else
{
plcForm.Visible = false;
}
}
///
/// Disables the editing form.
///
private void DisableForm()
{
txtComment.Enabled = false;
txtVersion.Enabled = false;
btnCheckin.Enabled = false;
btnCheckout.Enabled = false;
btnUndoCheckout.Enabled = false;
}
///
/// Add java script for refresh tree view.
///
private void AddAfterActionScript()
{
if (!IsLiveSite & (Node!= null))
{
ScriptHelper.RefreshTree(Page, Node.NodeID, Node.NodeParentID);
}
}
#endregion
#region "Button handling"
protected void versionsElem_AfterDestroyHistory(object sender, EventArgs e)
{
AddAfterActionScript();
ReloadData();
}
protected void btnCheckout_Click(object sender, EventArgs e)
{
try
{
// Check permissions
if (!WorkflowManager.CheckStepPermissions(Node, WorkflowActionEnum.Approve))
{
DisableForm();
return;
}
VersionManager.EnsureVersion(Node, Node.IsPublished);
// Check out the document
VersionManager.CheckOut(Node);
// Refresh tree if icon checked out should be displayed
if (UIHelper.DisplayCheckedOutIcon(CMSContext.CurrentSiteName))
{
AddAfterActionScript();
}
ReloadData();
versionsElem.ReloadData();
}
catch (WorkflowException)
{
ShowError(GetString("EditContent.DocumentCannotCheckOut"));
}
catch (Exception ex)
{
// Log exception
EventLogProvider ep = new EventLogProvider();
ep.LogEvent("Content", "CHECKOUT", ex);
ShowError(ex.Message);
}
}
protected void btnCheckin_Click(object sender, EventArgs e)
{
try
{
// Check permissions
if (!WorkflowManager.CheckStepPermissions(Node, WorkflowActionEnum.Approve) || ((versionsElem.CheckedOutByUserID != CMSContext.CurrentUser.UserID) && !versionsElem.CanCheckIn))
{
DisableForm();
return;
}
// Check in the document
string version = null;
if (txtVersion.Text.Trim() != string.Empty)
{
version = txtVersion.Text.Trim();
}
string comment = null;
if (txtComment.Text.Trim() != string.Empty)
{
comment = txtComment.Text.Trim();
}
VersionManager.CheckIn(Node, version, comment);
txtComment.Text = "";
txtVersion.Text = "";
// Refresh tree if icon checked out was displayed
if (UIHelper.DisplayCheckedOutIcon(CMSContext.CurrentSiteName))
{
AddAfterActionScript();
}
ReloadData();
versionsElem.ReloadData();
}
catch (WorkflowException)
{
ShowError(GetString("EditContent.DocumentCannotCheckIn"));
}
catch (Exception ex)
{
// Log exception
EventLogProvider ep = new EventLogProvider();
ep.LogEvent("Content", "CHECKIN", ex);
ShowError(ex.Message);
}
}
protected void btnUndoCheckout_Click(object sender, EventArgs e)
{
try
{
// Check permissions
if (!WorkflowManager.CheckStepPermissions(Node, WorkflowActionEnum.Approve))
{
DisableForm();
return;
}
// Undo check out
VersionManager.UndoCheckOut(Node);
txtComment.Text = "";
txtVersion.Text = "";
// Refresh tree if icon checked out was displayed
if (UIHelper.DisplayCheckedOutIcon(CMSContext.CurrentSiteName))
{
AddAfterActionScript();
}
ReloadData();
versionsElem.ReloadData();
}
catch (WorkflowException)
{
ShowError(GetString("EditContent.DocumentCannotCheckIn"));
}
catch (Exception ex)
{
// Log exception
EventLogProvider ep = new EventLogProvider();
ep.LogEvent("Content", "UNDOCHECKOUT", ex);
ShowError(ex.Message);
}
}
#endregion
}