namespace Framework.Json
{
using Database.dbo;
using DatabaseIntegrate.dbo;
using Framework.DataAccessLayer;
using Framework.Session;
using System;
using System.Linq;
using System.Threading.Tasks;
///
/// Page to configure data grid and columns.
///
internal class PageConfigGrid : PageModal
{
///
/// Constructor.
///
/// Table to configure.
/// If to configure. If null all fiels are shown.
/// Config row to select.
/// User clicked developer (coffee icon).
public PageConfigGrid(ComponentJson owner, string tableNameCSharp, string fieldNameCSharp, string configName, bool isDeveloper)
: base(owner)
{
TableNameCSharp = tableNameCSharp;
FieldNameCSharp = fieldNameCSharp;
ConfigName = configName;
IsDeveloper = isDeveloper;
ConfigNameDeveloper = FrameworkConfigGridIntegrateFramework.IdEnum.dboFrameworkConfigFieldDisplayDeveloper.Row().ConfigName;
}
///
/// Gets TableNameCSharp. This is the table name for which this page is for.
///
public string TableNameCSharp { get; }
///
/// Gets FieldNameCSharp. This is the field name for which this page is for. If null, all fields are shown.
///
public string FieldNameCSharp { get; }
///
/// Gets ConfigName. This is the data grid ConfigName for GridConfigGrid and GridConfigField.
///
public string ConfigName { get; }
///
/// Gets or sets IsDeveloper. If ture, user clicked developer (coffee icon). Show config data grid in developer config (mode).
///
public bool IsDeveloper { get; }
///
/// Gets ConfigNameDeveloper. This is strongly typed Developer.
///
public string ConfigNameDeveloper { get; }
///
/// Returns null or "Developer".
///
public string ConfigNameDeveloperGet()
{
return !IsDeveloper ? null : ConfigNameDeveloper;
}
public override async Task InitAsync()
{
new Html(DivHeader) { TextHtml = "
Config
" };
new Html(DivBody) { TextHtml = "Config Grid
" };
GridConfigGrid = new GridConfigGrid(DivBody);
new Html(DivBody) { TextHtml = "Config Field
" };
GridConfigField = new GridConfigField(DivBody);
await GridConfigGrid.LoadAsync();
if (GridConfigGrid.RowList.Count == 0)
{
throw new Exception(string.Format("Grid has no entry in table FrameworkTable! Run cli command deployDb to register for config. ({0})", TableNameCSharp));
}
// Select grid config row
var rowSelect = GridConfigGrid.RowList.SingleOrDefault(item => item.ConfigName == ConfigName);
GridConfigGrid.RowSelect = rowSelect;
}
public GridConfigGrid GridConfigGrid;
///
/// Gets GridConfigGridSelect. Master row.
///
public FrameworkConfigGridDisplay GridConfigGridRowSelect => (FrameworkConfigGridDisplay)GridConfigGrid.RowSelect;
public GridConfigField GridConfigField;
///
/// User clicked close button. Reload grids with new config.
///
protected internal override async Task ProcessAsync()
{
if (ButtonClose.IsClick)
{
foreach (var grid in this.ComponentOwner().ComponentListAll())
{
if (grid.TypeRow != null) // Grid has been loaded.
{
string tableNameCSharp = UtilDalType.TypeRowToTableNameCSharp(grid.TypeRow);
if (TableNameCSharp == tableNameCSharp)
{
await UtilGrid.LoadConfigOnlyAsync(grid);
}
}
}
}
await base.ProcessAsync();
}
}
internal class GridConfigGrid : Grid
{
public GridConfigGrid(ComponentJson owner) : base(owner) { }
public string TableNameCSharp
{
get
{
return this.ComponentOwner().TableNameCSharp;
}
}
private static async Task Reload(FrameworkConfigGridDisplay row)
{
var result = (await Data.Query().Where(
item => item.TableId == row.TableId &&
item.ConfigName == row.ConfigName).QueryExecuteAsync()).Single();
return result;
}
protected override void Query(QueryArgs args, QueryResult result)
{
if (TableNameCSharp != null)
{
result.Query = Data.Query().Where(item => item.TableNameCSharp == TableNameCSharp);
if (RowSelect == null)
{
result.IsRowSelectFirst = false;
}
}
}
protected override void QueryConfig(QueryConfigArgs args, QueryConfigResult result)
{
result.ConfigName = this.ComponentOwner().ConfigNameDeveloperGet();
}
///
/// Load detail grid (config field).
///
protected internal override async Task RowSelectAsync()
{
await this.ComponentOwner().GridConfigField.LoadAsync();
}
protected override async Task UpdateAsync(UpdateArgs args, UpdateResult result)
{
// Insert
bool isInsert = false;
if (args.Row.Id == null)
{
var rowReload = await Reload(args.RowOld);
args.Row.Id = rowReload.Id;
if (args.Row.Id == null)
{
var rowDest = new FrameworkConfigGrid();
Data.RowCopy(args.Row, rowDest);
rowDest.IsDelete = false;
await Data.InsertAsync(rowDest);
args.Row.Id = rowDest.Id;
isInsert = true;
}
}
// Update
if (isInsert == false)
{
var rowDest = new FrameworkConfigGrid();
Data.RowCopy(args.Row, rowDest);
rowDest.IsDelete = false;
await Data.UpdateAsync(rowDest);
}
// Reload
{
var rowDisplayReload = await Reload(args.Row);
Data.RowCopy(rowDisplayReload, args.Row);
}
result.IsHandled = true;
}
protected override async Task InsertAsync(InsertArgs args, InsertResult result)
{
var rowDest = new FrameworkConfigGrid();
Data.RowCopy(args.Row, rowDest);
int tableId = (await Data.Query().Where(item => item.TableNameCSharp == TableNameCSharp).QueryExecuteAsync()).Single().Id;
rowDest.TableId = tableId;
rowDest.IsDelete = false;
await Data.InsertAsync(rowDest);
Data.RowCopy(rowDest, result.Row);
var rowReload = await Reload(result.Row);
Data.RowCopy(rowReload, result.Row);
result.IsHandled = true;
}
}
internal class GridConfigField : Grid
{
public GridConfigField(ComponentJson owner) : base(owner) { }
public string FieldNameCSharp
{
get
{
return this.ComponentOwner().FieldNameCSharp;
}
}
///
/// Gets GridConfigGridSelect. Master row.
///
public FrameworkConfigGridDisplay GridConfigGridRowSelect
{
get
{
return this.ComponentOwner().GridConfigGrid.RowSelect;
}
}
private static async Task Reload(FrameworkConfigFieldDisplay row)
{
var result = (await Data.Query().Where(
item => item.ConfigGridTableId == row.ConfigGridTableId &&
item.ConfigGridConfigName == row.ConfigGridConfigName &&
item.FieldId == row.FieldId &&
item.ConfigFieldInstanceName == row.ConfigFieldInstanceName).QueryExecuteAsync()).Single();
return result;
}
protected override void Query(QueryArgs args, QueryResult result)
{
var rowSelect = GridConfigGridRowSelect;
result.Query = Data.Query().Where(item => item.ConfigGridTableId == rowSelect.TableId && item.ConfigGridConfigName == rowSelect.ConfigName);
if (FieldNameCSharp != null)
{
result.Query = result.Query.Where(item => item.FieldFieldNameCSharp == FieldNameCSharp);
}
result.Query = result.Query.OrderBy(item => item.FieldFieldSort);
}
protected override void QueryConfig(QueryConfigArgs args, QueryConfigResult result)
{
result.ConfigName = this.ComponentOwner().ConfigNameDeveloperGet();
}
protected override async Task UpdateAsync(UpdateArgs args, UpdateResult result)
{
// ConfigGrid
if (args.Row.ConfigGridId == null)
{
var rowDisplayReload = await Reload(args.RowOld); // ConfigGrid row might have been added in the meantime, if multiple ConfigField rows are in the grid.
args.Row.ConfigGridId = rowDisplayReload.ConfigGridId;
if (args.Row.ConfigGridId == null)
{
var rowDest = new FrameworkConfigGrid();
Data.RowCopy(args.Row, rowDest, "ConfigGrid");
rowDest.IsDelete = false;
await Data.InsertAsync(rowDest);
args.Row.ConfigGridId = rowDest.Id;
}
}
// ConfigField
if (args.Row.ConfigFieldId == null)
{
var rowDest = new FrameworkConfigField();
Data.RowCopy(args.Row, rowDest, "ConfigField");
rowDest.ConfigGridId = args.Row.ConfigGridId.Value;
rowDest.FieldId = args.Row.FieldId;
rowDest.IsDelete = false;
await Data.InsertAsync(rowDest);
args.Row.ConfigFieldId = rowDest.Id;
}
else
{
var rowDest = new FrameworkConfigField();
Data.RowCopy(args.Row, rowDest, "ConfigField");
await Data.UpdateAsync(rowDest);
}
// Reload
{
var rowDisplayReload = await Reload(args.Row);
Data.RowCopy(rowDisplayReload, args.Row);
}
result.IsHandled = true;
}
protected override void CellAnnotation(AnnotationArgs args, AnnotationResult result)
{
var pageConfigGrid = this.ComponentOwner();
if (pageConfigGrid.IsDeveloper)
{
// User needs flag SettingResult.GridIsShowConfigDeveloper and (coffee icon) button clicked to modify developer config.
result.IsReadOnly = args.Row.ConfigGridConfigName == pageConfigGrid.ConfigNameDeveloper;
}
}
protected override async Task InsertAsync(InsertArgs args, InsertResult result)
{
args.Row.ConfigGridTableId = GridConfigGridRowSelect.TableId; // Master
args.Row.ConfigGridConfigName = GridConfigGridRowSelect.ConfigName; // Master
var rowDest = new FrameworkConfigField();
Data.RowCopy(args.Row, rowDest, "ConfigField");
if (GridConfigGridRowSelect.Id == null) // Master does not have FrameworkConfigGrid in database
{
var rowDestConfigGrid = new FrameworkConfigGrid();
Data.RowCopy(GridConfigGridRowSelect, rowDestConfigGrid);
rowDestConfigGrid.IsDelete = false;
await Data.InsertAsync(rowDestConfigGrid);
GridConfigGridRowSelect.Id = rowDestConfigGrid.Id;
}
rowDest.ConfigGridId = GridConfigGridRowSelect.Id.Value; // Master
// Lookup field
string fieldNameCSharp = ((FrameworkConfigFieldDisplay)args.Row).FieldFieldNameCSharp; // Text entered by user.
var fieldList = await Data.Query().Where(item => item.TableId == GridConfigGridRowSelect.TableId && item.FieldNameCSharp == fieldNameCSharp).QueryExecuteAsync();
if (fieldList.Count == 0)
{
throw new Exception("Field not found!");
}
int fieldId = fieldList.Single().Id;
rowDest.FieldId = fieldId;
args.Row.FieldId = fieldId;
rowDest.IsDelete = false;
await Data.InsertAsync(rowDest);
var rowReload = await Reload(args.Row);
Data.RowCopy(rowReload, args.Row);
result.IsHandled = true;
}
}
}