using System; using System.Collections.Generic; using System.Security.Principal; using System.Text; using System.Threading; using System.Web.UI.WebControls; using System.Collections; using System.Data; using System.Web.UI; using CMS.CMSHelper; 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_ObjectsRecycleBin : CMSUserControl { #region "Private variables" private string mSiteName = String.Empty; private string currentCulture = CultureHelper.DefaultUICulture; private SiteInfo mCurrentSite = null; private string mObjectType = String.Empty; private bool mIsSingleSite = true; private bool mRestrictUsers = true; private static readonly Hashtable mInfos = new Hashtable(); private string mOrderBy = "VersionDeletedWhen DESC"; private string mObjectDisplayName = String.Empty; private string mItemsPerPage = String.Empty; private What currentWhat = default(What); #endregion #region "Structures" /// /// Structure that holds settings for async operations. /// private struct BinSettingsContainer { public CurrentUserInfo User { get; private set; } public What CurrentWhat { get; private set; } public SiteInfo Site { get; private set; } public BinSettingsContainer(CurrentUserInfo user, What what, SiteInfo site) : this() { User = user; CurrentWhat = what; Site = site; } } #endregion #region "Enumerations" protected enum Action { SelectAction = 0, Restore = 1, RestoreWithoutSiteBindings = 2, RestoreToCurrentSite = 3, Delete = 4 } protected enum What { SelectedObjects = 0, AllObjects = 1 } #endregion #region "Properties" /// /// Messages placeholder /// public override MessagesPlaceHolder MessagesPlaceHolder { get { return plcMess; } } /// /// Indicates if control is used only in one site mode(CMSDesk or Widget). /// public bool IsSingleSite { get { return mIsSingleSite; } set { mIsSingleSite = value; } } /// /// Site name. /// public string SiteName { get { return mSiteName; } set { mSiteName = value; if (!String.IsNullOrEmpty(mSiteName) && (mSiteName != "##global##")) { SiteInfo siteInfo = SiteInfoProvider.GetSiteInfo(mSiteName); if (siteInfo != null) { mCurrentSite = siteInfo; } } } } /// /// Current log context. /// public LogContext CurrentLog { get { return EnsureLog(); } } /// /// Current Error. /// public string CurrentError { get { return ValidationHelper.GetString(mInfos["ObjectRestoreError_" + ctlAsync.ProcessGUID], string.Empty); } set { mInfos["ObjectRestoreError_" + ctlAsync.ProcessGUID] = value; } } /// /// Current Info. /// public string CurrentInfo { get { return ValidationHelper.GetString(mInfos["ObjectRestoreInfo_" + ctlAsync.ProcessGUID], string.Empty); } set { mInfos["ObjectRestoreInfo_" + ctlAsync.ProcessGUID] = value; } } /// /// Order by for grid. /// public string OrderBy { get { return mOrderBy; } set { mOrderBy = value; } } /// /// Filter by object type. /// public string ObjectType { get { return mObjectType; } set { mObjectType = value; } } /// /// Items per page. /// public string ItemsPerPage { get { return mItemsPerPage; } set { mItemsPerPage = value; } } /// /// Object display name for grid filter. /// public string ObjectDisplayName { get { return mObjectDisplayName; } set { mObjectDisplayName = value; } } /// /// Gets current selected site. /// public new SiteInfo CurrentSite { get { if ((mCurrentSite == null) && !String.IsNullOrEmpty(SiteName) && (SiteName != "##global##")) { SiteInfo siteInfo = SiteInfoProvider.GetSiteInfo(mSiteName); if (siteInfo != null) { mCurrentSite = siteInfo; } } return mCurrentSite; } } /// /// Indicates if control is used on live site. /// public override bool IsLiveSite { get { return ugRecycleBin.IsLiveSite; } set { plcMess.IsLiveSite = value; ugRecycleBin.IsLiveSite = value; } } /// /// Indicates if the control data should perform the operations. /// public bool DelayedLoading { get { return ugRecycleBin.DelayedReload; } set { ugRecycleBin.DelayedReload = value; } } /// /// Indicates if restrictions should be applied on users displayed in filter. /// public bool RestrictUsers { get { return mRestrictUsers; } set { mRestrictUsers = value; } } #endregion #region "Page events" protected void Page_Load(object sender, EventArgs e) { // Register the main CMS script ScriptHelper.RegisterCMS(Page); if (StopProcessing) { return; } // Register script for pendingCallbacks repair ScriptHelper.FixPendingCallbacks(Page); // Set current UI culture currentCulture = CultureHelper.PreferredUICulture; if (!RequestHelper.IsCallback()) { ControlsHelper.RegisterPostbackControl(btnOk); // Create action script StringBuilder actionScript = new StringBuilder(); actionScript.Append( @" function PerformAction(selectionFunction, selectionField, dropId, validationLabel, whatId) { var selectionFieldElem = document.getElementById(selectionField); var label = document.getElementById(validationLabel); var items = selectionFieldElem.value; var whatDrp = document.getElementById(whatId); var allDocs = whatDrp.value == '", (int)What.AllObjects, @"'; var action = document.getElementById(dropId).value; if (action == '", (int)Action.SelectAction, @"') { label.innerHTML = '", GetString("massaction.selectsomeaction"), @"'; return false; } if(!eval(selectionFunction) || allDocs) { var confirmed = false; var confMessage = ''; switch(action) { case '", (int)Action.RestoreToCurrentSite, @"': case '", (int)Action.RestoreWithoutSiteBindings, @"': case '", (int)Action.Restore, @"': confMessage = '", GetString("objectversioning.recyclebin.confirmrestores"), @"'; break; case '", (int)Action.Delete, @"': confMessage = allDocs ? '", GetString("objectversioning.recyclebin.confirmemptyrecbin"), @"' : '", GetString("objectversioning.recyclebin.confirmdeleteselected") + @"'; break; } return confirm(confMessage); } else { label.innerHTML = '", GetString("objectversioning.recyclebin.selectobjects"), @"'; return false; } } function ContextBinAction_", ugRecycleBin.ClientID, @"(action, versionId) { document.getElementById('", hdnValue.ClientID, @"').value = action + ';' + versionId;", ControlsHelper.GetPostBackEventReference(btnHidden, null), @"; }"); ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "recycleBinScript", ScriptHelper.GetScript(actionScript.ToString())); // Set page size int itemsPerPage = ValidationHelper.GetInteger(ItemsPerPage, 0); if ((itemsPerPage > 0) && !RequestHelper.IsPostBack()) { ugRecycleBin.Pager.DefaultPageSize = itemsPerPage; } // Add action to button btnOk.OnClientClick = "return PerformAction('" + ugRecycleBin.GetCheckSelectionScript() + "','" + ugRecycleBin.GetSelectionFieldClientID() + "','" + drpAction.ClientID + "','" + lblValidation.ClientID + "', '" + drpWhat.ClientID + "');"; // Initialize dropdown lists if (!RequestHelper.IsPostBack()) { drpAction.Items.Add(new ListItem(GetString("general." + Action.Restore), Convert.ToInt32(Action.Restore).ToString())); drpAction.Items.Add(new ListItem(GetString("objectversioning.recyclebin." + Action.RestoreWithoutSiteBindings), Convert.ToInt32(Action.RestoreWithoutSiteBindings).ToString())); // Display restore to current site only if current site available CurrentSiteInfo si = CMSContext.CurrentSite; if (si != null) { drpAction.Items.Add(new ListItem(String.Format(GetString("objectversioning.recyclebin." + Action.RestoreToCurrentSite), si.DisplayName), Convert.ToInt32(Action.RestoreToCurrentSite).ToString())); } drpAction.Items.Add(new ListItem(GetString("general." + Action.Delete), Convert.ToInt32(Action.Delete).ToString())); drpWhat.Items.Add(new ListItem(GetString("contentlisting." + What.SelectedObjects), Convert.ToInt32(What.SelectedObjects).ToString())); drpWhat.Items.Add(new ListItem(GetString("contentlisting." + What.AllObjects), Convert.ToInt32(What.AllObjects).ToString())); ugRecycleBin.OrderBy = OrderBy; } string where = (IsSingleSite || (SiteName == "##global##")) ? "VersionObjectSiteID IS NULL" : null; if (CurrentSite != null) { where = SqlHelperClass.AddWhereCondition(where, "VersionObjectSiteID = " + CurrentSite.SiteID, "OR"); } ugRecycleBin.WhereCondition = GetWhereCondition(where); ugRecycleBin.HideControlForZeroRows = false; ugRecycleBin.OnExternalDataBound += ugRecycleBin_OnExternalDataBound; ugRecycleBin.OnAction += ugRecycleBin_OnAction; // Register the dialog script ScriptHelper.RegisterDialogScript(Page); // Initialize buttons btnCancel.Attributes.Add("onclick", ctlAsync.GetCancelScript(true) + "return false;"); string error = QueryHelper.GetString("displayerror", String.Empty); if (error != String.Empty) { ShowError(GetString("objectversioning.recyclebin.errorsomenotdestroyed")); } // Set visibility of panels pnlLog.Visible = false; } else { ugRecycleBin.StopProcessing = true; } // Initialize filter ReloadFilter((CurrentSite != null) ? CurrentSite.SiteID : -1, IsSingleSite, false); // If filter is set if (filterBin.FilterIsSet) { ugRecycleBin.ZeroRowsText = GetString("unigrid.filteredzerorowstext"); } else { ugRecycleBin.ZeroRowsText = IsSingleSite ? GetString("objectversioning.RecycleBin.NoObjects") : GetString("RecycleBin.Empty"); } // Initialize events ctlAsync.OnFinished += ctlAsync_OnFinished; ctlAsync.OnError += ctlAsync_OnError; ctlAsync.OnRequestLog += ctlAsync_OnRequestLog; ctlAsync.OnCancel += ctlAsync_OnCancel; } protected override void OnPreRender(EventArgs e) { // Hide multiple actions if grid is empty pnlFooter.Visible = ugRecycleBin.GridView.Rows.Count > 0; // Check if postback caused by filter button Control ctrlPostBack = ControlsHelper.GetPostBackControl(Page); if ((ctrlPostBack != null) && (ctrlPostBack is Button)) { pnlGrid.Update(); } pnlFilter.Update(); base.OnPreRender(e); } #endregion #region "Restoring & destroying methods" /// /// Restores objects selected in UniGrid with binding to current site. /// private void RestoreToCurrentSite(object parameter) { Restore(parameter, Action.RestoreToCurrentSite); } /// /// Restores objects selected in UniGrid without site bindings. /// private void RestoreWithoutSiteBindings(object parameter) { Restore(parameter, Action.RestoreWithoutSiteBindings); } /// /// Restores objects selected in UniGrid with site bindings and children. /// private void RestoreWithChildren(object parameter) { Restore(parameter, Action.Restore); } /// /// Restores objects selected in UniGrid. /// private void Restore(object parameter, Action action) { try { // Begin log AddLog(ResHelper.GetString("objectversioning.recyclebin.restoringobjects", currentCulture)); BinSettingsContainer settings = (BinSettingsContainer)parameter; DataSet recycleBin = null; if (settings.User.IsAuthorizedPerResource("cms.globalpermissions", "RestoreObjects")) { string where = IsSingleSite ? "VersionObjectSiteID IS NULL" : null; switch (settings.CurrentWhat) { case What.AllObjects: if (settings.Site != null) { where = SqlHelperClass.AddWhereCondition(where, "VersionObjectSiteID = " + settings.Site.SiteID, "OR"); } recycleBin = ObjectVersionHistoryInfoProvider.GetRecycleBin(GetWhereCondition(where), null, -1, "VersionID, VersionObjectDisplayName, VersionObjectType, VersionObjectID"); break; case What.SelectedObjects: List toRestore = ugRecycleBin.SelectedItems; // Restore selected objects if (toRestore.Count > 0) { where = SqlHelperClass.GetWhereCondition("VersionID", toRestore); recycleBin = ObjectVersionHistoryInfoProvider.GetRecycleBin(where, OrderBy, -1, "VersionID, VersionObjectDisplayName, VersionObjectType, VersionObjectID"); } break; } if (!DataHelper.DataSourceIsEmpty(recycleBin)) { RestoreDataSet(settings, recycleBin, action); } } else { CurrentError = ResHelper.GetString("objectversioning.recyclebin.restorationfailedpermissions"); AddLog(CurrentError); } } catch (ThreadAbortException ex) { string state = ValidationHelper.GetString(ex.ExceptionState, string.Empty); if (state == CMSThread.ABORT_REASON_STOP) { // When canceled CurrentInfo = ResHelper.GetString("Recyclebin.RestorationCanceled", currentCulture); AddLog(CurrentInfo); } else { // Log error CurrentError = ResHelper.GetString("objectversioning.recyclebin.restorationfailed", currentCulture) + ": " + ResHelper.GetString("general.seeeventlog", currentCulture); AddLog(CurrentError); // Log to event log LogException("OBJECTRESTORE", ex); } } catch (Exception ex) { // Log error CurrentError = ResHelper.GetString("objectversioning.recyclebin.restorationfailed", currentCulture) + ": " + ResHelper.GetString("general.seeeventlog", currentCulture); AddLog(CurrentError); // Log to event log LogException("OBJECTRESTORE", ex); } } /// /// Restores set of given version histories. /// /// Current user info /// DataSet with nodes to restore private void RestoreDataSet(BinSettingsContainer settings, DataSet recycleBin, Action action) { // Result flags bool resultOK = true; if (!DataHelper.DataSourceIsEmpty(recycleBin)) { // Restore all objects foreach (DataRow dataRow in recycleBin.Tables[0].Rows) { int versionId = ValidationHelper.GetInteger(dataRow["VersionID"], 0); // Log current event string taskTitle = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(ValidationHelper.GetString(dataRow["VersionObjectDisplayName"], string.Empty))); // Restore object if (versionId > 0) { GeneralizedInfo restoredObj = null; try { switch (action) { case Action.Restore: restoredObj = ObjectVersionManager.RestoreObject(versionId, true); break; case Action.RestoreToCurrentSite: restoredObj = ObjectVersionManager.RestoreObject(versionId, CMSContext.CurrentSiteID); break; case Action.RestoreWithoutSiteBindings: restoredObj = ObjectVersionManager.RestoreObject(versionId, 0); break; } } catch (CodeNameNotUniqueException ex) { CurrentError = String.Format(GetString("objectversioning.restorenotuniquecodename"), (ex.Object != null) ? "('" + ex.Object.ObjectCodeName + "')" : null); AddLog(CurrentError); } if (restoredObj != null) { AddLog(ResHelper.GetString("general.object", currentCulture) + " '" + taskTitle + "'"); } else { // Set result flag if (resultOK) { resultOK = false; } } } } } if (resultOK) { CurrentInfo = ResHelper.GetString("ObjectVersioning.Recyclebin.RestorationOK", currentCulture); AddLog(CurrentInfo); } else { CurrentError = ResHelper.GetString("objectversioning.recyclebin.restorationfailed", currentCulture); AddLog(CurrentError); } } /// /// Empties recycle bin. /// private void EmptyBin(object parameter) { // Begin log AddLog(ResHelper.GetString("Recyclebin.EmptyingBin", currentCulture)); BinSettingsContainer settings = (BinSettingsContainer)parameter; CurrentUserInfo currentUserInfo = settings.User; SiteInfo currentSite = settings.Site; DataSet recycleBin = null; string where = IsSingleSite ? "VersionObjectSiteID IS NULL" : null; switch (settings.CurrentWhat) { case What.AllObjects: if (currentSite != null) { where = SqlHelperClass.AddWhereCondition(where, "VersionObjectSiteID = " + currentSite.SiteID, "OR"); } where = GetWhereCondition(where); break; case What.SelectedObjects: List toRestore = ugRecycleBin.SelectedItems; // Restore selected objects if (toRestore.Count > 0) { where = SqlHelperClass.GetWhereCondition("VersionID", toRestore); } break; } recycleBin = ObjectVersionHistoryInfoProvider.GetRecycleBin(where, null, -1, "VersionID, VersionObjectType, VersionObjectID, VersionObjectDisplayName, VersionObjectSiteID"); try { if (!DataHelper.DataSourceIsEmpty(recycleBin)) { foreach (DataRow dr in recycleBin.Tables[0].Rows) { int versionHistoryId = Convert.ToInt32(dr["VersionID"]); string versionObjType = Convert.ToString(dr["VersionObjectType"]); string objName = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(ValidationHelper.GetString(dr["VersionObjectDisplayName"], string.Empty))); string siteName = null; if (currentSite != null) { siteName = currentSite.SiteName; } else { int siteId = ValidationHelper.GetInteger(dr["VersionObjectSiteID"], 0); siteName = SiteInfoProvider.GetSiteName(siteId); } // Check permissions if (!currentUserInfo.IsAuthorizedPerObject(PermissionsEnum.Destroy, versionObjType, siteName)) { CurrentError = String.Format(ResHelper.GetString("objectversioning.Recyclebin.DestructionFailedPermissions", currentCulture), objName); AddLog(CurrentError); } else { AddLog(ResHelper.GetString("general.object", currentCulture) + " '" + objName + "'"); // Destroy the version int versionObjId = ValidationHelper.GetInteger(dr["VersionObjectID"], 0); ObjectVersionManager.DestroyObjectHistory(versionObjType, versionObjId); LogContext.LogEvent(EventLogProvider.EVENT_TYPE_INFORMATION, DateTime.Now, "Objects", "DESTROYOBJECT", currentUserInfo.UserID, currentUserInfo.UserName, 0, null, HTTPHelper.UserHostAddress, ResHelper.GetString("objectversioning.Recyclebin.objectdestroyed"), (currentSite != null) ? currentSite.SiteID : 0, HTTPHelper.GetAbsoluteUri(), HTTPHelper.MachineName, HTTPHelper.GetUrlReferrer(), HTTPHelper.GetUserAgent()); } } if (!String.IsNullOrEmpty(CurrentError)) { CurrentError = ResHelper.GetString("objectversioning.recyclebin.errorsomenotdestroyed", currentCulture); AddLog(CurrentError); } else { CurrentInfo = ResHelper.GetString("ObjectVersioning.Recyclebin.DestroyOK", currentCulture); AddLog(CurrentInfo); } } } catch (ThreadAbortException ex) { string state = ValidationHelper.GetString(ex.ExceptionState, string.Empty); if (state != CMSThread.ABORT_REASON_STOP) { // Log error CurrentError = "Error occurred: " + ResHelper.GetString("general.seeeventlog", currentCulture); AddLog(CurrentError); // Log to event log LogException("EMPTYINGBIN", ex); } } catch (Exception ex) { // Log error CurrentError = "Error occurred: " + ResHelper.GetString("general.seeeventlog", currentCulture); AddLog(CurrentError); // Log to event log LogException("EMPTYINGBIN", ex); } } #endregion #region "Handling async thread" private void ctlAsync_OnCancel(object sender, EventArgs e) { HandlePossibleErrors(); } private void ctlAsync_OnRequestLog(object sender, EventArgs e) { ctlAsync.Log = CurrentLog.Log; } private void ctlAsync_OnError(object sender, EventArgs e) { HandlePossibleErrors(); } private void ctlAsync_OnFinished(object sender, EventArgs e) { HandlePossibleErrors(); } /// /// Ensures the logging context. /// protected LogContext EnsureLog() { LogContext log = LogContext.EnsureLog(ctlAsync.ProcessGUID); log.Reversed = true; log.LineSeparator = "
"; return log; } /// /// Adds the log information. /// /// New log information protected void AddLog(string newLog) { EnsureLog(); LogContext.AppendLine(newLog); } private void HandlePossibleErrors() { CurrentLog.Close(); TerminateCallbacks(); if (!String.IsNullOrEmpty(CurrentError)) { ShowError(CurrentError); } if (!String.IsNullOrEmpty(CurrentInfo)) { ShowConfirmation(CurrentInfo); } ugRecycleBin.ResetSelection(); ReloadFilter((CurrentSite != null) ? CurrentSite.SiteID : -1, IsSingleSite, true); } private void TerminateCallbacks() { string terminatingScript = ScriptHelper.GetScript("var __pendingCallbacks = new Array();"); ScriptHelper.RegisterStartupScript(this, typeof(string), "terminatePendingCallbacks", terminatingScript); } /// /// Runs async thread. /// /// Method to run protected void RunAsync(AsyncAction action) { pnlLog.Visible = true; CurrentError = string.Empty; CurrentInfo = string.Empty; CurrentLog.Close(); EnsureLog(); ctlAsync.RunAsync(action, WindowsIdentity.GetCurrent()); } #endregion #region "Button handling" protected void btnOk_OnClick(object sender, EventArgs e) { pnlLog.Visible = true; CurrentError = string.Empty; CurrentLog.Close(); EnsureLog(); int actionValue = ValidationHelper.GetInteger(drpAction.SelectedValue, 0); Action action = (Action)actionValue; int whatValue = ValidationHelper.GetInteger(drpWhat.SelectedValue, 0); currentWhat = (What)whatValue; ctlAsync.Parameter = new BinSettingsContainer(CurrentUser, currentWhat, CurrentSite); switch (action) { case Action.Restore: case Action.RestoreToCurrentSite: case Action.RestoreWithoutSiteBindings: switch (currentWhat) { case What.AllObjects: titleElemAsync.TitleImage = GetImageUrl("CMSModules/CMS_RecycleBin/restoreall.png"); break; case What.SelectedObjects: titleElemAsync.TitleImage = GetImageUrl("CMSModules/CMS_RecycleBin/restoreselected.png"); if (ugRecycleBin.SelectedItems.Count <= 0) { return; } break; } titleElemAsync.TitleText = GetString("objectversioning.Recyclebin.Restoringobjects"); switch (action) { case Action.Restore: RunAsync(RestoreWithChildren); break; case Action.RestoreToCurrentSite: RunAsync(RestoreToCurrentSite); break; case Action.RestoreWithoutSiteBindings: RunAsync(RestoreWithoutSiteBindings); break; } break; case Action.Delete: switch (currentWhat) { case What.AllObjects: titleElemAsync.TitleImage = GetImageUrl("CMSModules/CMS_RecycleBin/emptybin.png"); break; case What.SelectedObjects: titleElemAsync.TitleImage = GetImageUrl("CMSModules/CMS_RecycleBin/emptyselected.png"); break; } titleElemAsync.TitleText = GetString("recyclebin.emptyingbin"); RunAsync(EmptyBin); break; } } protected void btnHidden_Click(object sender, EventArgs e) { // Process recycle bin action string[] args = hdnValue.Value.Split(';'); if (args.Length == 2) { ugRecycleBin_OnAction(args[0], args[1]); ReloadData(false); } } #endregion #region "Grid events" protected object ugRecycleBin_OnExternalDataBound(object sender, string sourceName, object parameter) { sourceName = sourceName.ToLowerCSafe(); DataRowView data = null; string objType = null; switch (sourceName) { case "view": ImageButton imgView = ((ImageButton)sender); if (imgView != null) { GridViewRow gvr = (GridViewRow)parameter; data = (DataRowView)gvr.DataItem; string viewVersionUrl = ResolveUrl("~/CMSModules/Objects/Dialogs/ViewObjectVersion.aspx?showall=1&nocompare=1&versionhistoryid=" + ValidationHelper.GetInteger(data["VersionID"], 0)); viewVersionUrl = URLHelper.AddParameterToUrl(viewVersionUrl, "hash", QueryHelper.GetHash(viewVersionUrl)); imgView.OnClientClick = "window.open(" + ScriptHelper.GetString(viewVersionUrl) + ");return false;"; } break; case "restorechilds": ImageButton imgRestore = sender as ImageButton; if (imgRestore != null) { imgRestore.ImageUrl = GetImageUrl("CMSModules/CMS_RecycleBin/restorechilds.png"); } break; case "deletedwhen": case "deletedwhentooltip": DateTime deletedWhen = ValidationHelper.GetDateTime(parameter, DateTimeHelper.ZERO_TIME); bool displayGMT = (sourceName == "deletedwhentooltip"); return TimeZoneHelper.ConvertToUserTimeZone(deletedWhen, displayGMT, CurrentUser, CurrentSite); case "versionobjecttype": objType = ValidationHelper.GetString(parameter, ""); return HTMLHelper.HTMLEncode(GetString("ObjectType." + objType.Replace(".", "_"))); } return HTMLHelper.HTMLEncode(parameter.ToString()); } /// /// Handles the UniGrid's OnAction event. /// /// Name of item (button) that throws event /// ID (value of Primary key) of corresponding data row protected void ugRecycleBin_OnAction(string actionName, object actionArgument) { int versionHistoryId = ValidationHelper.GetInteger(actionArgument, 0); actionName = actionName.ToLowerCSafe(); switch (actionName) { case "restorechilds": case "restorewithoutbindings": case "restorecurrentsite": try { if (CMSContext.CurrentUser.IsAuthorizedPerResource("cms.globalpermissions", "RestoreObjects")) { switch (actionName) { case "restorechilds": ObjectVersionManager.RestoreObject(versionHistoryId, true); break; case "restorewithoutbindings": ObjectVersionManager.RestoreObject(versionHistoryId, 0); break; case "restorecurrentsite": ObjectVersionManager.RestoreObject(versionHistoryId, CMSContext.CurrentSiteID); break; } ShowConfirmation(GetString("ObjectVersioning.Recyclebin.RestorationOK")); } else { ShowError(ResHelper.GetString("objectversioning.recyclebin.restorationfailedpermissions")); } } 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 LogException("OBJECTRESTORE", ex); } break; case "destroy": ObjectVersionHistoryInfo verInfo = ObjectVersionHistoryInfoProvider.GetVersionHistoryInfo(versionHistoryId); // Get object site name string siteName = null; if (CurrentSite != null) { siteName = CurrentSite.SiteName; } else { siteName = SiteInfoProvider.GetSiteName(verInfo.VersionObjectSiteID); } if ((verInfo != null) && CurrentUser.IsAuthorizedPerObject(PermissionsEnum.Destroy, verInfo.VersionObjectType, siteName)) { ObjectVersionManager.DestroyObjectHistory(verInfo.VersionObjectType, verInfo.VersionObjectID); ShowConfirmation(GetString("ObjectVersioning.Recyclebin.DestroyOK")); } else { ShowError(String.Format(ResHelper.GetString("objectversioning.recyclebin.destructionfailedpermissions"), HTMLHelper.HTMLEncode(ResHelper.LocalizeString(verInfo.VersionObjectDisplayName)))); } break; } ugRecycleBin.ResetSelection(); ReloadFilter((CurrentSite != null) ? CurrentSite.SiteID : -1, IsSingleSite, false); } #endregion #region "Helper methods" /// /// Merges given where condition with additional settings. /// /// Original where condition /// New where condition private string GetWhereCondition(string where) { // Apply filter settings if (!string.IsNullOrEmpty(filterBin.WhereCondition)) { where = SqlHelperClass.AddWhereCondition(where, filterBin.WhereCondition); } // Add recycle bin condition where = SqlHelperClass.AddWhereCondition(where, "VersionDeletedWhen IS NOT NULL"); // Filter by object name if (!string.IsNullOrEmpty(ObjectDisplayName)) { where = SqlHelperClass.AddWhereCondition(where, "VersionObjectDisplayName LIKE '%" + SqlHelperClass.GetSafeQueryString(ObjectDisplayName, false) + "%'"); } // Filter by object type if (!String.IsNullOrEmpty(ObjectType)) { where = SqlHelperClass.AddWhereCondition(where, "VersionObjectType LIKE '%" + SqlHelperClass.GetSafeQueryString(ObjectType, false) + "%'"); } return where; } /// /// Reload control data. /// public void ReloadData(bool refreshInfo) { int siteId = (CurrentSite != null) ? CurrentSite.SiteID : 0; string where = (IsSingleSite || (SiteName == "##global##")) ? "VersionObjectSiteID IS NULL" : null; if (siteId > 0) { where = SqlHelperClass.AddWhereCondition(where, "VersionObjectSiteID = " + siteId, "OR"); } // Reload filter data ReloadFilter(siteId, IsSingleSite, true); // Reload grid data ugRecycleBin.WhereCondition = GetWhereCondition(where); ugRecycleBin.ReloadData(); pnlGrid.Update(); } /// /// Reload filter data. /// private void ReloadFilter(int siteId, bool isSingleSite, bool forceReload) { filterBin.UsersPlaceHolder.Visible = CMSContext.CurrentUser.IsGlobalAdministrator; // Reload filter data filterBin.SiteID = siteId; filterBin.IsSingleSite = isSingleSite; filterBin.DisplayUsersFromAllSites = !RestrictUsers; if (forceReload) { filterBin.ReloadData(); pnlFilter.Update(); } } /// /// Method to log exceptions to event log. /// /// Code of event during which exception occurred private void LogException(string eventCode, Exception ex) { // Log exception to event log EventLogProvider.LogException("Object recycle bin", eventCode, ex); } #endregion }