using System; using System.Data; using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using CMS.CMSHelper; using CMS.Controls; using CMS.DataEngine; using CMS.EventLog; using CMS.ExtendedControls; using CMS.GlobalHelper; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.Synchronization; using CMS.UIControls; public partial class CMSModules_Objects_Controls_Versioning_ObjectVersionList : CMSUserControl { #region "Variables" private BaseInfo mObject = null; private bool mCheckPermissions = true; private UserInfo currentUser = null; private SiteInfo currentSite = null; private bool? mAllowDestroy = null; private bool? mAllowModify = null; private bool mRegisterReloadHeaderScript = false; private bool mInvalidatePersistentEditedObject = false; #endregion #region "Events" /// /// Event triggered after rollback is made /// public EventHandler OnAfterRollback; #endregion #region "Properties" /// /// Messages placeholder /// public override MessagesPlaceHolder MessagesPlaceHolder { get { return plcMess; } } /// /// Gets or sets version history object type. /// public string ObjectType { get; set; } /// /// Gets or sets version history object type. /// public int ObjectID { get; set; } /// /// IInfo object representing object which version history is displayed. /// public BaseInfo Object { get { if (mObject == null) { if (!String.IsNullOrEmpty(ObjectType) && (ObjectID > 0)) { mObject = BaseAbstractInfoProvider.GetInfoById(ObjectType, ObjectID); if (mObject != null) { CMSContext.EditedObject = mObject; } } } return mObject; } set { mObject = value; if (mObject != null) { ObjectID = mObject.Generalized.ObjectID; ObjectType = mObject.ObjectType; CMSContext.EditedObject = mObject; } } } /// /// Indicates if control is used on live site. /// public override bool IsLiveSite { get { return gridHistory.IsLiveSite; } set { gridHistory.IsLiveSite = value; plcMess.IsLiveSite = value; } } /// /// Indicates if permissions should be checked. /// public bool CheckPermissions { get { return mCheckPermissions; } set { mCheckPermissions = value; } } /// /// Indicates if user can destroy object version history. /// private bool AllowDestroy { get { if ((Object != null) && (mAllowDestroy == null)) { mAllowDestroy = UserInfoProvider.IsAuthorizedPerObject(Object.ObjectType, PermissionsEnum.Destroy, CMSContext.CurrentSiteName, CMSContext.CurrentUser); } return ValidationHelper.GetBoolean(mAllowDestroy, false); } } /// /// Indicates if user can modify object. /// private bool AllowModify { get { if ((Object != null) && (mAllowModify == null)) { mAllowModify = UserInfoProvider.IsAuthorizedPerObject(Object.ObjectType, PermissionsEnum.Modify, CMSContext.CurrentSiteName, CMSContext.CurrentUser); } return ValidationHelper.GetBoolean(mAllowModify, false); } } /// /// Indicates if javascript to reload header should be rendered /// public bool RegisterReloadHeaderScript { get { return mRegisterReloadHeaderScript; } set { mRegisterReloadHeaderScript = value; } } /// /// Indicates if control should be displayed or not /// public override bool Visible { get { return base.Visible; } set { base.Visible = value; gridHistory.Visible = value; } } /// /// Reference to hidden refresh button /// public Button RefreshButton { get { return btnRefresh; } } /// /// Indicates if persistent edited object should be invalidated /// public bool InvalidatePersistentEditedObject { get { return (mInvalidatePersistentEditedObject && (Page is CMSPage)); } set { mInvalidatePersistentEditedObject = value; } } /// /// Gets or sets the value that indicates if the control is used in the dialog mode. /// public bool DialogMode { get; set; } #endregion #region "Control methods" protected override void OnInit(EventArgs e) { base.OnInit(e); if (InvalidatePersistentEditedObject) { Control ctrl = ControlsHelper.GetPostBackControl(Page); if ((ctrl != null) && (ctrl.ClientID == gridHistory.ClientID)) { CMSPage page = Page as CMSPage; if (page != null) { page.PersistentEditedObject = null; } } } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (StopProcessing) { gridHistory.StopProcessing = true; } else { SetupControl(); // Initialize javascript InitScript(); } } /// /// Setup control. /// public void SetupControl() { ObjectEditMenu menu = ControlsHelper.GetChildControl(Page, typeof(ObjectEditMenu)) as ObjectEditMenu; if (menu != null) { menu.ShowSave = false; } var abstractMenu = ControlsHelper.GetChildControl(Page, typeof(IObjectEditMenu)) as IObjectEditMenu; if (abstractMenu != null) { abstractMenu.AbstractObjectManager.OnAfterAction += (sender, args) => { if (DialogMode) { ScriptHelper.RegisterClientScriptBlock(Page, typeof(string), "parentWOpenerRefresh", ScriptHelper.GetScript("if (parent && parent.wopener && parent.wopener.refresh) { parent.wopener.refresh(); }")); } }; } gridHistory.ZeroRowsText = GetString("objectversioning.objecthasnohistory"); if (Object != null) { // Set buttons confirmation btnDestroy.OnClientClick = "return confirm(" + ScriptHelper.GetString(ResHelper.GetString("VersionProperties.ConfirmDestroy")) + ");"; btnMakeMajor.OnClientClick = "return confirm(" + ScriptHelper.GetString(ResHelper.GetString("VersionProperties.ConfirmMakeMajor")) + ");"; gridHistory.OnExternalDataBound += gridHistory_OnExternalDataBound; gridHistory.OnAction += gridHistory_OnAction; gridHistory.WhereCondition = "VersionObjectType = '" + SqlHelperClass.GetSafeQueryString(Object.ObjectType, false) + "' AND VersionObjectID = " + Object.Generalized.ObjectID; gridHistory.Columns = "VersionID, UserName, FullName, VersionModifiedWhen, VersionNumber"; } else { gridHistory.StopProcessing = true; lblHistory.Visible = false; btnDestroy.Visible = false; ShowError(GetString("objectversioning.uknownobject")); } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (Object != null) { btnDestroy.Visible = btnMakeMajor.Visible = !gridHistory.IsEmpty; CMSContext.EditedObject = Object; } else { btnDestroy.Visible = btnMakeMajor.Visible = false; CMSPage.EditedObject = null; } } #endregion #region "Grid events" protected object gridHistory_OnExternalDataBound(object sender, string sourceName, object parameter) { DataRowView data = null; sourceName = sourceName.ToLowerCSafe(); ImageButton imageButton = null; switch (sourceName) { case "view": imageButton = ((ImageButton)sender); if (imageButton != null) { GridViewRow gvr = (GridViewRow)parameter; data = (DataRowView)gvr.DataItem; string viewVersionUrl = ResolveUrl("~/CMSModules/Objects/Dialogs/ViewObjectVersion.aspx?versionhistoryid=" + ValidationHelper.GetInteger(data["VersionID"], 0) + "&clientid=" + ClientID); viewVersionUrl = URLHelper.AddParameterToUrl(viewVersionUrl, "hash", QueryHelper.GetHash(viewVersionUrl)); imageButton.OnClientClick = "window.open(" + ScriptHelper.GetString(viewVersionUrl) + ");return false;"; } break; case "allowdestroy": imageButton = ((ImageButton)sender); if (imageButton != null) { if ((CheckPermissions && !AllowDestroy)) { imageButton.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/deletedisabled.png"); imageButton.Enabled = false; } else { imageButton.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/delete.png"); } } break; case "rollback": imageButton = ((ImageButton)sender); if (imageButton != null) { if ((CheckPermissions && !AllowModify)) { imageButton.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/undodisabled.png"); imageButton.Enabled = false; } else { imageButton.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/undo.png"); } } break; case "contextmenu": imageButton = ((ImageButton)sender); break; case "modifiedwhen": case "modifiedwhentooltip": if (currentUser == null) { currentUser = CMSContext.CurrentUser; } if (currentSite == null) { currentSite = CMSContext.CurrentSite; } DateTime modifiedwhen = ValidationHelper.GetDateTime(((DataRowView)parameter)["VersionModifiedWhen"], DateTimeHelper.ZERO_TIME); bool displayGmt = (sourceName == "modifiedwhentooltip"); return TimeZoneHelper.ConvertToUserTimeZone(modifiedwhen, displayGmt, currentUser, currentSite); case "modifiedby": data = (DataRowView)parameter; string userName = ValidationHelper.GetString(data["UserName"], String.Empty); string fullName = ValidationHelper.GetString(data["FullName"], String.Empty); return HTMLHelper.HTMLEncode(Functions.GetFormattedUserName(userName, fullName)); } return parameter; } protected void gridHistory_OnAction(string actionName, object actionArgument) { int versionHistoryId = ValidationHelper.GetInteger(actionArgument, 0); actionName = actionName.ToLowerCSafe(); switch (actionName.ToLowerCSafe()) { case "rollback": case "fullrollback": if (versionHistoryId > 0) { // Check permissions if (CheckPermissions && !AllowModify) { ShowError(GetString("History.ErrorNotAllowedToModify")); } else { try { ObjectVersionManager.RollbackVersion(versionHistoryId, (actionName == "fullrollback") ? true : false); // Set object to null because after rollback it doesn't contain current data Object = null; gridHistory.ReloadData(); if (OnAfterRollback != null) { OnAfterRollback(this, null); } ShowConfirmation(GetString("objectversioning.rollbackOK")); ScriptHelper.RegisterStartupScript(this, typeof(string), "RefreshContent", ScriptHelper.GetScript("RefreshRelatedContent_" + ClientID + "();")); } catch (CodeNameNotUniqueException ex) { ShowError(String.Format(GetString("objectversioning.restorenotuniquecodename"), (ex.Object != null) ? "('" + ex.Object.ObjectCodeName + "')" : null)); } catch (Exception ex) { ShowError(GetString("objectversioning.recyclebin.restorationfailed") + " " + GetString("general.seeeventlog")); // Log to event log EventLogProvider.LogException("Object version list", "OBJECTRESTORE", ex); } } } break; case "destroy": if (versionHistoryId > 0) { // Check permissions if (CheckPermissions && !AllowDestroy) { ShowError(GetString("History.ErrorNotAllowedToDestroy")); } else { ObjectVersionManager.DestroyObjectVersion(versionHistoryId); ShowConfirmation(GetString("objectversioning.destroyOK")); } } break; } } #endregion #region "Button handling" /// /// Button destroy history click. /// protected void btnDestroy_Click(object sender, EventArgs e) { if (Object != null) { // Check permissions if (CheckPermissions && !AllowDestroy) { ShowError(GetString("History.ErrorNotAllowedToDestroy")); return; } ObjectVersionManager.DestroyObjectHistory(Object.ObjectType, Object.Generalized.ObjectID); UserInfo currentUser = CMSContext.CurrentUser; string objType = GetString("Objecttype." + Object.ObjectType.Replace(".", "_")); string description = GetString(String.Format("objectversioning.historydestroyed", SqlHelperClass.GetSafeQueryString(Object.Generalized.ObjectDisplayName, false))); EventLogProvider ev = new EventLogProvider(); ev.LogEvent(EventLogProvider.EVENT_TYPE_INFORMATION, DateTime.Now, objType, "DESTROYHISTORY", HTTPHelper.GetAbsoluteUri(), description); ReloadData(); } else { CMSPage.EditedObject = null; } } /// /// Button make version major click. /// protected void btnMakeMajor_Click(object sender, EventArgs e) { if (Object != null) { // Check permissions if (CheckPermissions && !AllowModify) { ShowError(GetString("History.ErrorNotAllowedToModify")); return; } ObjectVersionHistoryInfo version = ObjectVersionManager.GetLatestVersion(Object.ObjectType, Object.Generalized.ObjectID); if (version != null) { if (ObjectVersionManager.MakeVersionMajor(version)) { ShowConfirmation(GetString("objectversioning.makeversionmajorinfo")); } ReloadData(); } else { ShowError(GetString("objectversioning.makeversionmajornoversion") + " " + GetString("objectversioning.objecthasnohistory")); } } else { CMSPage.EditedObject = null; } } /// /// Button refresh click. /// protected void btnRefresh_Click(object sender, EventArgs e) { if (OnAfterRollback != null) { OnAfterRollback(this, null); } } protected void btnHidden_Click(object sender, EventArgs e) { // Process recycle bin action string[] args = hdnValue.Value.Split(';'); if (args.Length == 2) { gridHistory_OnAction(args[0], args[1]); } } #endregion #region "Methods" /// /// Reloads data in unigrid. /// public void ReloadData() { gridHistory.ReloadData(); } /// /// Register required javascript functions /// private void InitScript() { StringBuilder sbScript = new StringBuilder(); sbScript.Append("function RefreshRelatedContent_", ClientID, "(){if(window.RefreshContent != null) { window.RefreshContent(); }\n"); if (RegisterReloadHeaderScript) { sbScript.Append("if(parent.frames[0] && parent.frames[0].ReloadAndSetTab) {parent.frames[0].ReloadAndSetTab(escape('selecttab|##versioningtab##'));}\n"); } sbScript.Append("}\n"); sbScript.Append("function RefreshVersions_", ClientID, "(){var button = document.getElementById('", btnRefresh.ClientID, "'); if(button){button.click();}}"); sbScript.Append("function ContextVersionAction_", gridHistory.ClientID, @"(action, versionId) { document.getElementById('", hdnValue.ClientID, @"').value = action + ';' + versionId;", ControlsHelper.GetPostBackEventReference(btnHidden, null), ";}"); // Register required js to reload related content ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ReloadContent_" + ClientID, ScriptHelper.GetScript(sbScript.ToString())); } #endregion }