/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
using Everest.Library.ExtensionMethod;
namespace Everest.Forms.ExtForm{
/// <summary>
///
/// </summary>
public class ExtGridFormGenerator : ExtformGenerator
{
const string DefualtGrid = "Everest.GridPanel";
public ExtGridFormGenerator(ISchemaProvider provider) : base(provider) { }
const string GridLayout = @"
new {6}({{{7}
title:'{0}',
store:{1},
containerType:'grid',
schemaName:'{2}',
queryables:[{4}],
deleteUrl:['{5}'],
columns:[{3}]
}})
";
const string Store = @"
new Ext.data.JsonStore({{
root: 'Rows',
url: '{1}',
totalProperty: 'TotalCount',
remoteSort: true,{2}
fields: [{0}]
}})";
public override string Generate(string schemaName, NameValueCollection config)
{
ISchema schema = SchemaProvider.GetSchema(schemaName, config);
NameValueCollection gridConfig = new NameValueCollection(schema.GridAttributes);
if (config != null)
{
foreach (var key in config.AllKeys)
{
gridConfig[key] = config[key];
}
}
if (!string.IsNullOrEmpty(schema.SubmitUrl))
{
gridConfig.Add("submitUrl", schema.SubmitUrl);
}
string fields, cm;
IterateColumns(schema.Columns, out fields, out cm);
string queryables = BuildQueryables(schema);
StringBuilder storeProperties = new StringBuilder();
if (!string.IsNullOrEmpty(gridConfig["idProperty"]))
{
storeProperties.AppendFormat("idProperty:'{0}',", gridConfig["idProperty"]);
}
return string.Format(GridLayout, schema.Title, string.Format(Store, fields, schema.QueryUrl, storeProperties.ToString()), schemaName, cm, queryables, schema.DeleteUrl,
string.IsNullOrEmpty(schema.GridType) ? DefualtGrid : schema.GridType, GetAttributes(gridConfig));
}
private static string BuildQueryables(ISchema schema)
{
var queryableColumns = schema.Columns.Where(c => c.Queryable);
StringBuilder queryablesBuilder = new StringBuilder();
foreach (var column in queryableColumns)
{
queryablesBuilder.AppendFormat("{0},", column.Control.Render(column));
}
queryablesBuilder = queryablesBuilder.RemoveLastSpecifiedChar(',');
return queryablesBuilder.ToString();
}
private void IterateColumns(IColumn[] columns, out string fields, out string cm)
{
var listColumns = GetColumnsInList(columns);
StringBuilder fieldsBuilder = new StringBuilder();
StringBuilder cmBuilder = new StringBuilder();
foreach (Column c in listColumns)
{
fieldsBuilder.AppendFormat("{{name:'{0}',defaultValue:'{1}'}},", c.DataIndexInList, string.IsNullOrEmpty(c.DefaultValue) ? "" : c.DefaultValue);
cmBuilder.AppendFormat("{{header:'{0}',sortable: true,dataIndex:'{1}'", c.Label, c.DataIndexInList);
AttachColumnAttribute(cmBuilder, c);
foreach (string k in c.ListAttributes)
{
cmBuilder.AppendFormat(",{0}", GetConfigValue(k, c.ListAttributes[k]));
}
cmBuilder.Append("},");
}
fields = fieldsBuilder.RemoveLastSpecifiedChar(',').ToString();
cm = cmBuilder.RemoveLastSpecifiedChar(',').ToString();
}
private IEnumerable<IColumn> GetColumnsInList(IColumn[] columns)
{
List<IColumn> columnsInList = new List<IColumn>();
foreach (var column in columns)
{
if (column is IColumnContainer)
{
columnsInList.AddRange(GetColumnsInList(((IColumnContainer)column).Columns));
}
if (!string.IsNullOrEmpty(column.DataIndexInList))
{
columnsInList.Add(column);
}
}
return columnsInList.OrderBy(c => c.Order);
}
protected virtual void AttachColumnAttribute(StringBuilder cmBuilder, Column c)
{
}
}
}
|