using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.DocumentEngine;
using CMS.UIControls;
using CMS.DataEngine;
using TreeNode = CMS.DocumentEngine.TreeNode;
public partial class CMSModules_Content_CMSDesk_Properties_LinkedDocs : CMSPropertiesPage
{
#region "Protected variables"
protected string currentSiteName = null;
private CurrentUserInfo currentUser = null;
#endregion
#region "Methods"
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
currentUser = CMSContext.CurrentUser;
if (!currentUser.IsAuthorizedPerUIElement("CMS.Content", "Properties.LinkedDocs"))
{
RedirectToCMSDeskUIElementAccessDenied("CMS.Content", "Properties.LinkedDocs");
}
}
protected void Page_Load(object sender, EventArgs e)
{
UIContext.PropertyTab = PropertyTabEnum.LinkedDocs;
if (Node != null)
{
// Check modify permissions
if (!CheckDocumentPermissions(Node, PermissionsEnum.Modify))
{
pnlContainer.Enabled = false;
}
}
currentSiteName = CMSContext.CurrentSiteName.ToLowerCSafe();
gridDocs.OnExternalDataBound += gridDocuments_OnExternalDataBound;
gridDocs.OnAction += gridDocs_OnAction;
gridDocs.OnDataReload += gridDocs_OnDataReload;
gridDocs.ShowActionsMenu = true;
gridDocs.Columns = "NodeAliasPath, SiteName, NodeParentID, DocumentName, DocumentNamePath, ClassDisplayName";
// Get all possible columns to retrieve
IDataClass nodeClass = DataClassFactory.NewDataClass("CMS.Tree");
DocumentInfo di = new DocumentInfo();
gridDocs.AllColumns = SqlHelperClass.MergeColumns(SqlHelperClass.MergeColumns(di.ColumnNames), SqlHelperClass.MergeColumns(nodeClass.ColumnNames));
pnlContainer.Enabled = !DocumentManager.ProcessingAction;
}
protected DataSet gridDocs_OnDataReload(string completeWhere, string currentOrder, int currentTopN, string columns, int currentOffset, int currentPageSize, ref int totalRecords)
{
if (Node != null)
{
int linkedNodeId = Node.NodeID;
if (Node.IsLink)
{
linkedNodeId = ValidationHelper.GetInteger(Node.GetValue("NodeLinkedNodeID"), 0);
}
// Get the documents
columns = SqlHelperClass.MergeColumns(TreeProvider.SELECTNODES_REQUIRED_COLUMNS, columns);
DataSet nodes = DocumentManager.Tree.SelectNodes(TreeProvider.ALL_SITES, "/%", TreeProvider.ALL_CULTURES, true, null, "(NodeID = " + linkedNodeId + " AND NodeLinkedNodeID IS NULL) OR NodeLinkedNodeID = " + linkedNodeId, "NodeAliasPath ASC", -1, false, gridDocs.TopN, columns);
if (!DataHelper.DataSourceIsEmpty(nodes) && (nodes.Tables[0].Rows.Count > 1))
{
gridDocs.Visible = true;
lblInfo.Text = GetString("LinkedDocs.LinkedDocs");
return nodes;
}
else
{
lblInfo.Text = GetString("LinkedDocs.NoLinkedDocs");
gridDocs.Visible = false;
}
}
return null;
}
protected void gridDocs_OnAction(string actionName, object actionArgument)
{
switch (actionName.ToLowerCSafe())
{
case "delete":
int deleteNodeId = ValidationHelper.GetInteger(actionArgument, 0);
if (deleteNodeId > 0)
{
TreeNode deleteNode = DocumentManager.Tree.SelectSingleNode(deleteNodeId, TreeProvider.ALL_CULTURES);
if ((deleteNode != null) && (Node != null))
{
try
{
// Check user permissions
if (IsUserAuthorizedToDeleteDocument(deleteNode))
{
// Delete the document
DocumentHelper.DeleteDocument(deleteNode, DocumentManager.Tree, false, false, false);
ShowConfirmation(GetString("LinkedDocs.LinkDeleted"));
if ((deleteNode.NodeSiteID == Node.NodeSiteID) && (deleteNode.NodeID == NodeID))
{
// When deleting itself, select parent
ScriptHelper.RegisterStartupScript(this, typeof(string), "refreshScript", ScriptHelper.GetScript("SelectItem(" + deleteNode.NodeParentID + ", " + deleteNode.NodeParentID + ");"));
}
else
{
// When deleting from somewhere else, refresh tree
gridDocs.ReloadData();
ScriptHelper.RefreshTree(this, Node.NodeID, deleteNode.NodeParentID);
}
}
else
{
ShowError(String.Format(GetString("cmsdesk.notauthorizedtodeletedocument"), HTMLHelper.HTMLEncode(deleteNode.NodeAliasPath)));
}
}
catch (Exception ex)
{
ShowError(GetString("ContentRequest.DeleteFailed"), ex.Message, null);
}
}
}
break;
}
}
///
/// External data binding handler.
///
protected object gridDocuments_OnExternalDataBound(object sender, string sourceName, object parameter)
{
DataRowView data = null;
switch (sourceName.ToLowerCSafe())
{
case "documentname":
{
data = (DataRowView)parameter;
string name = ValidationHelper.GetString(data["NodeAliasPath"], "");
string siteName = ValidationHelper.GetString(data["SiteName"], "");
int currentNodeId = ValidationHelper.GetInteger(data["NodeID"], 0);
int currentNodeParentId = ValidationHelper.GetInteger(data["NodeParentID"], 0);
string result = null;
if (currentSiteName == siteName.ToLowerCSafe())
{
result = "" + HTMLHelper.HTMLEncode(TextHelper.LimitLength(name, 50)) + "";
}
else
{
result = "" + HTMLHelper.HTMLEncode(TextHelper.LimitLength(name, 50)) + "";
}
bool isLink = (data["NodeLinkedNodeID"] != DBNull.Value);
if (isLink)
{
result += UIHelper.GetDocumentMarkImage(this, DocumentMarkEnum.Link);
}
return result;
}
case "documentnametooltip":
data = (DataRowView)parameter;
return UniGridFunctions.DocumentNameTooltip(data);
case "type":
{
data = (DataRowView)parameter;
int currentNodeId = ValidationHelper.GetInteger(data["NodeID"], 0);
int linkedNodeId = ValidationHelper.GetInteger(data["NodeLinkedNodeID"], 0);
if (linkedNodeId == 0)
{
return GetString("LinkedDocs.Original");
}
else if (currentNodeId == Node.NodeID)
{
return GetString("LinkedDocs.Current");
}
else
{
return string.Empty;
}
}
case "sitename":
{
string siteName = (string)parameter;
SiteInfo si = SiteInfoProvider.GetSiteInfo(siteName);
if (si != null)
{
return HTMLHelper.HTMLEncode(si.DisplayName);
}
else
{
return parameter;
}
}
case "deleteaction":
{
GridViewRow container = (GridViewRow)parameter;
int currentNodeId = ValidationHelper.GetInteger(((DataRowView)container.DataItem)["NodeID"], 0);
bool current = (Node.NodeID == currentNodeId);
((Control)sender).Visible = ((((DataRowView)container.DataItem)["NodeLinkedNodeID"] != DBNull.Value) && !current);
((ImageButton)sender).CommandArgument = currentNodeId.ToString();
break;
}
}
return parameter;
}
///
/// Checks whether the user is authorized to delete document.
///
/// Document node
protected bool IsUserAuthorizedToDeleteDocument(TreeNode node)
{
// Check delete permission for document
return (currentUser.IsAuthorizedPerDocument(node, new NodePermissionsEnum[] { NodePermissionsEnum.Delete, NodePermissionsEnum.Read }) == AuthorizationResultEnum.Allowed);
}
#endregion
}