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; } } }