using System;
using System.Text;
using System.Web.UI.WebControls;
using CMS.DataEngine;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.UIControls;
public partial class CMSModules_AdminControls_Controls_Class_QueryEdit : CMSUserControl
{
#region "Variables"
private int mQueryID;
private int mClassID;
private bool mShowHelp = true;
private string mClassName;
private string mQueryName;
private Query mQuery;
private string mRefreshPageURL;
private CMSMasterPage mCurrentMaster;
#endregion
#region "Properties"
///
/// ID of the current query.
///
public int QueryID
{
get
{
return mQueryID;
}
set
{
mQueryID = value;
}
}
///
/// ID of the class current query belongs to.
///
public int ClassID
{
get
{
return mClassID;
}
set
{
mClassID = value;
}
}
///
/// Indicates whether the help should be displayed in the bottom of the page.
///
public bool ShowHelp
{
get
{
return mShowHelp;
}
set
{
mShowHelp = value;
}
}
///
/// Page that should be refreshed after button click.
///
public string RefreshPageURL
{
get
{
return mRefreshPageURL;
}
set
{
mRefreshPageURL = value;
}
}
///
/// If true, control is used in site manager.
///
public bool IsSiteManager
{
get
{
return filter.IsSiteManager;
}
set
{
filter.IsSiteManager = value;
}
}
///
/// Gets or sets whether the control is in dialog mode.
///
public bool DialogMode
{
get;
set;
}
///
/// Gets or sets whether the contorl is in edit mode.
///
public bool EditMode
{
get;
set;
}
///
/// Query to edit.
///
private Query Query
{
get
{
return mQuery;
}
set
{
mQuery = value;
}
}
///
/// Name of the class query belongs to.
///
private string ClassName
{
get
{
return mClassName;
}
set
{
mClassName = value;
}
}
///
/// Name of the actual query.
///
private string QueryName
{
get
{
return mQueryName;
}
set
{
mQueryName = value;
}
}
#endregion
#region "Methods"
protected void Page_Init(object sender, EventArgs e)
{
// Register save
ComponentEvents.RequestEvents.RegisterForEvent(ComponentEvents.SAVE, (s, args) => { Save(false); });
mCurrentMaster = Page.Master as CMSMasterPage;
if (mCurrentMaster == null)
{
throw new Exception("Page using this control must have CMSMasterPage master page.");
}
// Create and add help control to dialog's header if not in tab mode
if (!mCurrentMaster.TabMode)
{
mCurrentMaster.Title.HelpTopicName = "newedit_query";
mCurrentMaster.Title.HelpName = "helpTopic";
}
txtQueryText.FullScreenParentElementID = "divContent";
}
protected void Page_Load(object sender, EventArgs e)
{
// Initialize the control
SetupControl();
if (!RequestHelper.IsPostBack())
{
// Shows that the query was created or updated successfully
if (QueryHelper.GetInteger("saved", 0) == 1)
{
ShowChangesSaved();
}
}
// Set correct help title for custom table
if (!String.IsNullOrEmpty(ClassName))
{
DataClassInfo classInfo = DataClassInfoProvider.GetDataClass(ClassName);
if (classInfo.ClassIsCustomTable)
{
mCurrentMaster.Title.HelpTopicName = "customtable_edit_newedit_query";
}
}
}
///
/// Generate default query.
///
protected void btnGenerate_Click(object sender, EventArgs e)
{
rblQueryType.SelectedIndex = 0;
try
{
txtQueryText.Text = SqlGenerator.GetSqlQuery(ClassName, QueryProvider.GetQueryType(QueryName), null);
}
catch (Exception ex)
{
ShowError(ex.Message);
}
}
public bool Save(bool closeOnSave)
{
// Validate query name for emptiness and code name format
string result = new Validator()
.NotEmpty(txtQueryName.Text.Trim(), GetString("queryedit.erroremptyqueryname"))
.IsIdentifier(txtQueryName.Text.Trim(), GetString("queryedit.querynameformat"))
.Result;
// If the entries were successfully validated
if (result != string.Empty)
{
ShowError(result);
return false;
}
bool isSaved = false;
if (filter.Visible)
{
ClassID = filter.ClassId;
ClassName = DataClassInfoProvider.GetClassName(filter.ClassId);
}
// Gets full query name in the form - "ClassName.QueryName"
string fullQueryName = !string.IsNullOrEmpty(ClassName) ?
string.Concat(ClassName, ".", txtQueryName.Text) : txtQueryName.Text;
// Finds whether new or edited query is unique in the document type
Query newQuery = QueryProvider.GetQueryFromDB(fullQueryName);
// If query with specified name already exist
if (newQuery != null)
{
// Check if it is the same query as one being edited
if (newQuery.QueryId != QueryID)
{
// The new query tries to use the same code name
ShowError(GetString("queryedit.errorexistingqueryid"));
return false;
}
Query = newQuery;
isSaved = SaveQuery();
}
else
{
// Query with specified name doesn't exist yet
isSaved = SaveQuery();
}
// If the query was successfully saved
RedirectOnSave(isSaved, closeOnSave);
if (isSaved)
{
ShowChangesSaved();
}
return true;
}
///
/// Initializes the controls.
///
private void SetupControl()
{
DataClassInfo newClass = null;
mQueryName = GetString("queryedit.newquery");
// If the existing query is being edited
if (QueryID > 0)
{
// Get information on existing query
Query = QueryProvider.GetQuery(QueryID);
if (Query != null)
{
ClassName = DataClassInfoProvider.GetClassName(Query.QueryClassId);
QueryName = Query.QueryName;
if (!RequestHelper.IsPostBack())
{
// Fills form with the existing query information
LoadValues();
txtQueryText.Focus();
}
}
}
// New query is being created
else if (ClassID > 0)
{
newClass = DataClassInfoProvider.GetDataClass(ClassID);
ClassName = newClass.ClassName;
if (!RequestHelper.IsPostBack())
{
ucSelectString.Value = newClass.ClassConnectionString;
}
txtQueryName.Focus();
}
plcLoadGeneration.Visible = SettingsKeyProvider.DevelopmentMode;
// Ensure generate button and custom checkbox for default queries
if (QueryProvider.IsSystemQuery(QueryName))
{
btnGenerate.Visible = true;
plcIsCustom.Visible = true;
}
// For new query with hidden Is custom checkbox
if ((newClass != null) && !plcIsCustom.Visible)
{
// Do not set queries as custom in development mode except document types and custom tables
chckIsCustom.Checked = !SettingsKeyProvider.DevelopmentMode || newClass.ClassIsDocumentType || newClass.ClassIsCustomTable;
}
// Initialize the validator
RequiredFieldValidatorQueryName.ErrorMessage = GetString("queryedit.erroremptyqueryname");
if (ShowHelp)
{
DisplayHelperTable();
}
// Filter available only when creating new query in dialog mode
plcDocTypeFilter.Visible = filter.Visible = DialogMode && !EditMode;
// Set filter preselection
if (plcDocTypeFilter.Visible)
{
filter.SelectedValue = QueryHelper.GetString("selectedvalue", null);
filter.FilterMode = SettingsObjectType.QUERY;
}
// Hide header actions when creating new query in dialog mode
mCurrentMaster.HeaderActions.Parent.Visible = (!DialogMode || EditMode) && Visible;
txtQueryName.Enabled = !DialogMode || !EditMode;
// Set dialog's content panel css class
if (DialogMode)
{
if (EditMode)
{
mCurrentMaster.PanelContent.CssClass = "PageContent";
}
else
{
pnlContainer.CssClass = "PageContent";
}
}
}
///
/// Displays helper table with transformation examples.
///
private void DisplayHelperTable()
{
// Add header row
TableRow headerRow = new TableRow() { TableSection = TableRowSection.TableHeader, CssClass = "UniGridHead" };
headerRow.Cells.Add(new TableCell() { Text = GetString("queryedit.helpcaption"), Wrap = false });
headerRow.Cells.Add(new TableCell() { Text = GetString("queryedit.helpdescription"), Width = Unit.Percentage(100) });
tblHelp.Rows.Add(headerRow);
// Add macro rows
string[,] rows =
{
{ "##WHERE##", GetString("queryedit.help_where") },
{ "##TOPN##", GetString("queryedit.help_topn") },
{ "##ORDERBY##", GetString("queryedit.help_orderby") },
{ "##COLUMNS##", GetString("queryedit.help_columns") }
};
TableRow macroRow;
for (int i = 0; i <= rows.GetUpperBound(0); i++)
{
macroRow = new TableRow() { CssClass = ((i % 2) == 0) ? "EvenRow" : "OddRow" };
macroRow.Cells.Add(new TableCell() { Text = rows[i, 0], Wrap = false });
macroRow.Cells.Add(new TableCell() { Text = rows[i, 1] });
tblHelp.Rows.Add(macroRow);
}
// Make help table visible on click only
tblHelp.Attributes["style"] = "display: none;";
}
///
/// Loads values from query.
///
private void LoadValues()
{
txtQueryName.Text = QueryName;
rblQueryType.SelectedValue = Query.QueryType.ToString();
chbTransaction.Checked = Query.RequiresTransaction;
txtQueryText.Text = Query.QueryText;
drpGeneration.Value = Query.QueryLoadGeneration;
chckIsCustom.Checked = Query.QueryIsCustom || Query.QueryIsLocked;
ucSelectString.Value = Query.QueryConnectionString;
}
///
/// Saves new or edited query of the given name and returns to the query list.
///
/// True if query was succesfully saved
private bool SaveQuery()
{
// The query ID was specified, edit existing
bool existing = (QueryID > 0);
Query newQuery = existing ? QueryProvider.GetQuery(QueryID) : new Query();
// Sets query object's properties
newQuery.QueryName = txtQueryName.Text;
DataClassInfo dci = DataClassInfoProvider.GetDataClass(ClassName);
if (dci != null)
{
newQuery.QueryClassId = dci.ClassID;
}
else
{
ShowError(GetString("editedobject.notexists"));
return false;
}
// Check the query type
newQuery.QueryType = rblQueryType.SelectedValue == "SQLQuery" ? QueryTypeEnum.SQLQuery : QueryTypeEnum.StoredProcedure;
newQuery.RequiresTransaction = chbTransaction.Checked;
// Non-system queries for classes other than document types, custom tables are always set to NOT custom
if (!QueryProvider.IsSystemQuery(QueryName) && !dci.ClassIsDocumentType && !dci.ClassIsCustomTable && !dci.ClassShowAsSystemTable)
{
newQuery.QueryIsCustom = false;
newQuery.QueryIsLocked = false;
}
else
{
newQuery.QueryIsCustom = chckIsCustom.Checked;
newQuery.QueryIsLocked = chckIsCustom.Checked;
}
newQuery.QueryText = txtQueryText.Text.TrimEnd('\r', '\n');
newQuery.QueryLoadGeneration = drpGeneration.Value;
newQuery.QueryConnectionString = ValidationHelper.GetString(ucSelectString.Value, String.Empty);
// Insert new / update existing query
QueryProvider.SetQuery(newQuery);
Query = newQuery;
return true;
}
private void RedirectOnSave(bool isSaved, bool closeOnSave)
{
if (RefreshPageURL == null || !isSaved)
{
return;
}
if (DialogMode)
{
// Check for selector ID
string selector = QueryHelper.GetString("selectorid", string.Empty);
if (!string.IsNullOrEmpty(selector))
{
// Add selector refresh
StringBuilder script = new StringBuilder();
if (!EditMode)
{
ScriptHelper.RegisterWOpenerScript(Page);
script.AppendFormat(@"
if (wopener) {{
wopener.US_SelectNewValue_{0}('{1}');
}}",
selector, Query.QueryFullName);
}
script.AppendFormat(@"
window.name = '{2}';
window.open('{0}?name={1}&saved=1&editonlycode=true&selectorid={2}&tabmode={3}', window.name);
",
URLHelper.ResolveUrl(RefreshPageURL), Query.QueryFullName, selector, QueryHelper.GetInteger("tabmode", 0));
if (closeOnSave)
{
script.AppendLine("CloseDialog();");
}
ScriptHelper.RegisterStartupScript(this, GetType(), "UpdateSelector", script.ToString(), true);
}
}
else
{
string redirectUrl = URLHelper.AddParameterToUrl(RefreshPageURL, "saved", "1");
redirectUrl = URLHelper.AddParameterToUrl(redirectUrl, "queryid", Query.QueryId.ToString());
redirectUrl = URLHelper.AddParameterToUrl(redirectUrl, "tabmode", QueryHelper.GetInteger("tabmode", 0).ToString());
URLHelper.Redirect(redirectUrl);
}
}
#endregion
}