using System; using System.Data; using System.Linq; using System.Web.UI.WebControls; using CMS.CMSHelper; using CMS.GlobalHelper; using CMS.LicenseProvider; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.DocumentEngine; using CMS.UIControls; using CMS.DataEngine; using CMS.ExtendedControls; [RegisterTitle("content.ui.propertieslanguages")] public partial class CMSModules_Content_CMSDesk_Properties_Languages : CMSPropertiesPage { #region "Variables" private UserInfo currentUserInfo = null; private SiteInfo currentSiteInfo = null; private DateTime defaultLastModification = DateTimeHelper.ZERO_TIME; private DateTime defaultLastPublished = DateTimeHelper.ZERO_TIME; private string mDefaultSiteCulture = null; #endregion #region "Properties" /// /// Default culture of the site. /// protected string DefaultSiteCulture { get { return mDefaultSiteCulture ?? (mDefaultSiteCulture = CultureHelper.GetDefaultCulture(CMSContext.CurrentSiteName)); } } #endregion #region "Page events" protected override void OnInit(EventArgs e) { base.OnInit(e); if (!CMSContext.CurrentUser.IsAuthorizedPerUIElement("CMS.Content", "Properties.Languages")) { RedirectToCMSDeskUIElementAccessDenied("CMS.Content", "Properties.Languages"); } } protected void Page_Load(object sender, EventArgs e) { gridLanguages.FilteredZeroRowsText = GetString("transman.nodocumentculture"); gridLanguages.OnDataReload += gridDocuments_OnDataReload; gridLanguages.OnExternalDataBound += gridLanguages_OnExternalDataBound; gridLanguages.ShowActionsMenu = true; gridLanguages.Columns = "DocumentName, Published"; IDataClass nodeClass = DataClassFactory.NewDataClass("CMS.Tree"); DocumentInfo di = new DocumentInfo(); gridLanguages.AllColumns = SqlHelperClass.MergeColumns(SqlHelperClass.MergeColumns(di.ColumnNames), SqlHelperClass.MergeColumns(nodeClass.ColumnNames)); pnlContainer.Enabled = !DocumentManager.ProcessingAction; } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); ScriptHelper.RegisterDialogScript(Page); // Check license limitations if (!CultureInfoProvider.LicenseVersionCheck()) { LicenseHelper.GetAllAvailableKeys(FeatureEnum.Multilingual); } // Set selected tab UIContext.PropertyTab = PropertyTabEnum.Languages; } #endregion #region "Grid events" protected object gridLanguages_OnExternalDataBound(object sender, string sourceName, object parameter) { TranslationStatusEnum status = TranslationStatusEnum.NotAvailable; DataRowView drv = null; sourceName = sourceName.ToLowerCSafe(); if (currentUserInfo == null) { currentUserInfo = CMSContext.CurrentUser; } if (currentSiteInfo == null) { currentSiteInfo = CMSContext.CurrentSite; } switch (sourceName) { case "translate": case "action": ImageButton img = sender as CMSImageButton; if (img != null) { if ((sourceName == "translate") && (!CMS.TranslationServices.TranslationServiceHelper.AnyServiceAvailable(CurrentSiteName) || !CMS.TranslationServices.TranslationServiceHelper.IsTranslationAllowed(CurrentSiteName))) { img.Visible = false; return img; } GridViewRow gvr = parameter as GridViewRow; if (gvr != null) { // Get datarowview drv = gvr.DataItem as DataRowView; if ((drv != null) && (drv.Row["TranslationStatus"] != DBNull.Value)) { // Get translation status status = (TranslationStatusEnum)drv.Row["TranslationStatus"]; } else { status = TranslationStatusEnum.NotAvailable; } string culture = (drv != null) ? ValidationHelper.GetString(drv.Row["DocumentCulture"], string.Empty) : string.Empty; // Set appropriate icon if (sourceName == "action") { switch (status) { case TranslationStatusEnum.NotAvailable: img.ImageUrl = GetImageUrl("CMSModules/CMS_Content/Properties/addculture.png"); img.ToolTip = GetString("transman.createnewculture"); break; default: img.ImageUrl = GetImageUrl("CMSModules/CMS_Content/Properties/editculture.png"); img.ToolTip = GetString("transman.editculture"); break; } // Register redirect script if (RequiresDialog) { if ((sourceName == "action") && (status == TranslationStatusEnum.NotAvailable)) { // New culture version img.OnClientClick = "parent.parent.parent.NewDocumentCulture(" + NodeID + ",'" + culture + "');"; } else { // Existing culture version ScriptHelper.RegisterWOpenerScript(Page); string url = ResolveUrl(CMSContext.GetUrl(Node.NodeAliasPath, Node.DocumentUrlPath, currentSiteInfo.SiteName)); url = URLHelper.AppendQuery(url, "lang=" + culture); img.OnClientClick = "window.refreshPageOnClose = true; window.reloadPageUrl = " + ScriptHelper.GetString(url) + "; if (wopener.RefreshWOpener) { wopener.RefreshWOpener(window); } CloseDialog();"; } } else { img.OnClientClick = "RedirectItem(" + NodeID + ", '" + culture + "');"; } img.ID = "imgAction"; } else { // Add parameters identifier and hash, encode query string if (LicenseHelper.CheckFeature(URLHelper.GetCurrentDomain(), FeatureEnum.TranslationServices)) { string returnUrl = CMSContext.ResolveDialogUrl("~/CMSModules/Translations/Pages/TranslateDocuments.aspx") + "?targetculture=" + culture + "&modal=1&nodeid=" + NodeID; returnUrl = URLHelper.AddParameterToUrl(returnUrl, "hash", QueryHelper.GetHash(URLHelper.GetQuery(returnUrl))); img.ImageUrl = GetImageUrl("CMSModules/CMS_Content/Properties/translate.png"); img.ToolTip = GetString("transman.translate"); img.OnClientClick = "modalDialog('" + returnUrl + "', 'TranslateDocument', 550, 440); "; } else { img.Visible = false; } break; } } } return img; case "translationstatus": if (parameter == DBNull.Value) { status = TranslationStatusEnum.NotAvailable; } else { status = (TranslationStatusEnum)parameter; } string statusName = GetString("transman." + status); string statusHtml = "" + statusName + ""; // .Outdated return statusHtml; case "documentculturedisplayname": drv = (DataRowView)parameter; // Add icon return UniGridFunctions.DocumentCultureFlag(drv, Page); case "documentmodifiedwhen": case "documentmodifiedwhentooltip": if (string.IsNullOrEmpty(parameter.ToString())) { return "-"; } else { DateTime modifiedWhen = ValidationHelper.GetDateTime(parameter, DateTimeHelper.ZERO_TIME); bool displayGMT = (sourceName == "documentmodifiedwhentooltip"); return TimeZoneHelper.ConvertToUserTimeZone(modifiedWhen, displayGMT, currentUserInfo, currentSiteInfo); } case "versionnumber": if (string.IsNullOrEmpty(parameter.ToString())) { return "-"; } break; case "documentname": if (string.IsNullOrEmpty(parameter.ToString())) { parameter = "-"; } return HTMLHelper.HTMLEncode(parameter.ToString()); case "published": bool published = ValidationHelper.GetBoolean(parameter, false); if (published) { return "" + GetString("General.Yes") + ""; } else { return "" + GetString("General.No") + ""; } } return parameter; } protected DataSet gridDocuments_OnDataReload(string completeWhere, string currentOrder, int currentTopN, string columns, int currentOffset, int currentPageSize, ref int totalRecords) { string currentSiteName = CMSContext.CurrentSiteName; // Check if node is not null if (Node != null) { // Get documents int topN = gridLanguages.GridView.PageSize * (gridLanguages.GridView.PageIndex + 1 + gridLanguages.GridView.PagerSettings.PageButtonCount); columns = SqlHelperClass.MergeColumns(SqlHelperClass.MergeColumns(TreeProvider.SELECTNODES_REQUIRED_COLUMNS, columns), "DocumentModifiedWhen, VersionNumber, DocumentLastPublished, DocumentIsWaitingForTranslation"); DataSet documentsDS = DocumentHelper.GetDocuments(currentSiteName, Node.NodeAliasPath, TreeProvider.ALL_CULTURES, false, null, null, null, -1, false, topN, columns, Tree); DataTable documents = documentsDS.Tables[0]; if (!DataHelper.DataSourceIsEmpty(documents)) { // Get site cultures DataSet allSiteCultures = CultureInfoProvider.GetSiteCultures(currentSiteName).Copy(); // Rename culture column to enable row transfer allSiteCultures.Tables[0].Columns[2].ColumnName = "DocumentCulture"; // Create where condition for row transfer string where = documents.Rows.Cast().Aggregate("DocumentCulture NOT IN (", (current, row) => current + ("'" + SqlHelperClass.GetSafeQueryString(ValidationHelper.GetString(row["DocumentCulture"], string.Empty)) + "',")); where = where.TrimEnd(',') + ")"; // Transfer missing cultures, keep original list of site cultures DataHelper.TransferTableRows(documents, allSiteCultures.Copy().Tables[0], where, null); DataHelper.EnsureColumn(documents, "DocumentCultureDisplayName", typeof(string)); // Ensure culture names foreach (DataRow cultDR in documents.Rows) { string cultureCode = cultDR["DocumentCulture"].ToString(); DataRow[] cultureRow = allSiteCultures.Tables[0].Select("DocumentCulture='" + cultureCode + "'"); if (cultureRow.Length > 0) { cultDR["DocumentCultureDisplayName"] = cultureRow[0]["CultureName"].ToString(); } } // Ensure default culture to be first DataRow[] culturreDRs = documents.Select("DocumentCulture='" + DefaultSiteCulture + "'"); if (culturreDRs.Length <= 0) { throw new Exception("[ReloadData]: Default site culture '" + DefaultSiteCulture + "' is not assigned to the current site."); } DataRow defaultCultureRow = culturreDRs[0]; DataRow dr = documents.NewRow(); dr.ItemArray = defaultCultureRow.ItemArray; documents.Rows.InsertAt(dr, 0); documents.Rows.Remove(defaultCultureRow); // Get last modification date of default culture defaultCultureRow = documents.Select("DocumentCulture='" + DefaultSiteCulture + "'")[0]; defaultLastModification = ValidationHelper.GetDateTime(defaultCultureRow["DocumentModifiedWhen"], DateTimeHelper.ZERO_TIME); defaultLastPublished = ValidationHelper.GetDateTime(defaultCultureRow["DocumentLastPublished"], DateTimeHelper.ZERO_TIME); // Add column containing translation status documents.Columns.Add("TranslationStatus", typeof(TranslationStatusEnum)); // Get proper translation status and store it to datatable foreach (DataRow document in documents.Rows) { TranslationStatusEnum status = TranslationStatusEnum.NotAvailable; int documentId = ValidationHelper.GetInteger(document["DocumentID"], 0); if (documentId == 0) { status = TranslationStatusEnum.NotAvailable; } else { string versionNumber = ValidationHelper.GetString(DataHelper.GetDataRowValue(document, "VersionNumber"), null); DateTime lastModification = DateTimeHelper.ZERO_TIME; if (ValidationHelper.GetBoolean(document["DocumentIsWaitingForTranslation"], false)) { status = TranslationStatusEnum.WaitingForTranslation; } else { // Check if document is outdated if (versionNumber != null) { lastModification = ValidationHelper.GetDateTime(document["DocumentLastPublished"], DateTimeHelper.ZERO_TIME); status = (lastModification < defaultLastPublished) ? TranslationStatusEnum.Outdated : TranslationStatusEnum.Translated; } else { lastModification = ValidationHelper.GetDateTime(document["DocumentModifiedWhen"], DateTimeHelper.ZERO_TIME); status = (lastModification < defaultLastModification) ? TranslationStatusEnum.Outdated : TranslationStatusEnum.Translated; } } } document["TranslationStatus"] = status; } // Bind datasource DataSet filteredDocuments = documentsDS.Clone(); DataRow[] filteredDocs = documents.Select(gridLanguages.GetDataTableFilter()); foreach (DataRow row in filteredDocs) { filteredDocuments.Tables[0].ImportRow(row); } return filteredDocuments; } } return null; } #endregion }