} // _getUniquePrefix() public JObject TreeToJson(string Title, CswNbtView View, ICswNbtTree Tree, bool IsPropertyGrid = false, string GroupByCol = "") { JObject Ret = new JObject(); if (null != View) { string gridUniquePrefix = _getUniquePrefix(View); CswExtJsGrid grid = new CswExtJsGrid(gridUniquePrefix); if (string.IsNullOrEmpty(GroupByCol)) { GroupByCol = View.GridGroupByCol; } grid.groupfield = GroupByCol; grid.title = Title; if (_CswNbtResources.CurrentNbtUser != null && _CswNbtResources.CurrentNbtUser.PageSize > 0) { grid.PageSize = _CswNbtResources.CurrentNbtUser.PageSize; } if (IsPropertyGrid && Tree.getChildNodeCount() > 0) { Tree.goToNthChild(0); } grid.Truncated = Tree.getCurrentNodeChildrenTruncated(); CswExtJsGridDataIndex nodeIdDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodeId"); { CswExtJsGridField nodeIdFld = new CswExtJsGridField { dataIndex = nodeIdDataIndex }; grid.fields.Add(nodeIdFld); CswExtJsGridColumn nodeIdCol = new CswExtJsGridColumn { header = "Internal ID", dataIndex = nodeIdDataIndex, hidden = true }; grid.columns.Add(nodeIdCol); } CswExtJsGridDataIndex nodekeyDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodekey"); { CswExtJsGridField nodekeyFld = new CswExtJsGridField { dataIndex = nodekeyDataIndex }; grid.fields.Add(nodekeyFld); CswExtJsGridColumn nodekeyCol = new CswExtJsGridColumn { header = "Internal Key", dataIndex = nodekeyDataIndex, hidden = true }; grid.columns.Add(nodekeyCol); } CswExtJsGridDataIndex nodenameDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodename"); { CswExtJsGridField nodenameFld = new CswExtJsGridField { dataIndex = nodenameDataIndex }; grid.fields.Add(nodenameFld); CswExtJsGridColumn nodenameCol = new CswExtJsGridColumn { header = "Internal Name", dataIndex = nodenameDataIndex, hidden = true }; grid.columns.Add(nodenameCol); } CswExtJsGridDataIndex NodeTypeDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodetypeid"); { CswExtJsGridField NodeTypeField = new CswExtJsGridField { dataIndex = NodeTypeDataIndex }; grid.fields.Add(NodeTypeField); CswExtJsGridColumn NodeTypeColumn = new CswExtJsGridColumn { header = "Internal Type ID", dataIndex = NodeTypeDataIndex, hidden = true }; grid.columns.Add(NodeTypeColumn); } CswExtJsGridDataIndex ObjectClassDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "objectclassid"); { CswExtJsGridField ObjectClassField = new CswExtJsGridField { dataIndex = ObjectClassDataIndex }; grid.fields.Add(ObjectClassField); CswExtJsGridColumn ObjectClassColumn = new CswExtJsGridColumn { header = "Internal Parent Type ID", dataIndex = ObjectClassDataIndex, hidden = true }; grid.columns.Add(ObjectClassColumn); } // View Properties determine Columns and Fields foreach (CswNbtViewProperty ViewProp in View.getOrderedViewProps(true)) { if (null != ViewProp) { ICswNbtMetaDataProp MetaDataProp = null; if (ViewProp.Type == CswEnumNbtViewPropType.NodeTypePropId) { MetaDataProp = ViewProp.NodeTypeProp; } else if (ViewProp.Type == CswEnumNbtViewPropType.ObjectClassPropId) { MetaDataProp = ViewProp.ObjectClassProp; } // Because properties in the view might be by object class, but properties on the tree will always be by nodetype, // we have to use name, not id, as the dataIndex if (null != MetaDataProp) { string header = MetaDataProp.PropNameWithQuestionNo; CswExtJsGridDataIndex dataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, MetaDataProp.PropName); // don't use PropNameWithQuestionNo here, because it won't match the propname from the tree // Potential bug here! // If the same property is added to the view more than once, we'll only use the grid definition for the first instance if (false == grid.columnsContains(header)) { CswExtJsGridField fld = new CswExtJsGridField { dataIndex = dataIndex }; CswExtJsGridColumn col = new CswExtJsGridColumn { header = header, dataIndex = dataIndex, hidden = (false == ViewProp.ShowInGrid) }; switch (ViewProp.FieldType) { case CswEnumNbtFieldType.Button: col.MenuDisabled = true; col.IsSortable = false; break; case CswEnumNbtFieldType.Number: fld.type = "number"; col.xtype = CswEnumExtJsXType.numbercolumn; break; case CswEnumNbtFieldType.DateTime: fld.type = "date"; col.xtype = CswEnumExtJsXType.datecolumn; // case 26782 - Set dateformat as client date format string dateformat = string.Empty; string DateDisplayMode = CswEnumNbtDateDisplayMode.Date.ToString(); if (ViewProp.Type == CswEnumNbtViewPropType.NodeTypePropId && ViewProp.NodeTypeProp != null) { DateDisplayMode = ViewProp.NodeTypeProp.DesignNode.getAttributeValueByName(CswNbtFieldTypeRuleDateTime.AttributeName.DateType); } else if (ViewProp.Type == CswEnumNbtViewPropType.ObjectClassPropId && ViewProp.ObjectClassProp != null) { DateDisplayMode = ViewProp.ObjectClassProp.Extended; } if (DateDisplayMode == string.Empty || DateDisplayMode == CswEnumNbtDateDisplayMode.Date.ToString() || DateDisplayMode == CswEnumNbtDateDisplayMode.DateTime.ToString()) { dateformat += CswTools.ConvertNetToPHP(_CswNbtResources.CurrentNbtUser.DateFormat); if (DateDisplayMode == CswEnumNbtDateDisplayMode.DateTime.ToString()) { dateformat += " "; } } if (DateDisplayMode == CswEnumNbtDateDisplayMode.Time.ToString() || DateDisplayMode == CswEnumNbtDateDisplayMode.DateTime.ToString()) { dateformat += CswTools.ConvertNetToPHP(_CswNbtResources.CurrentNbtUser.TimeFormat); } col.dateformat = dateformat; break; } if (ViewProp.Width > 0) { col.width = ViewProp.Width * 7; // approx. characters to pixels } grid.columns.Add(col); grid.fields.Add(fld); } // if( false == grid.columnsContains( header ) ) } // if(null != MetaDataProp ) } // if( ViewProp != null ) } // foreach( CswNbtViewProperty ViewProp in View.getOrderedViewProps() ) // Nodes in the Tree determine Rows for (Int32 c = 0; c < Tree.getChildNodeCount(); c++) { CswExtJsGridRow gridrow = new CswExtJsGridRow(c, gridUniquePrefix); Tree.goToNthChild(c); CswNbtTreeNode TreeNode = Tree.getCurrentTreeNode(); gridrow.data.Add(nodeIdDataIndex, Tree.getNodeIdForCurrentPosition().ToString()); gridrow.data.Add(nodekeyDataIndex, Tree.getNodeKeyForCurrentPosition().ToString()); gridrow.data.Add(nodenameDataIndex, Tree.getNodeNameForCurrentPosition().ToString()); gridrow.data.Add(NodeTypeDataIndex, TreeNode.NodeTypeId.ToString()); gridrow.data.Add(ObjectClassDataIndex, TreeNode.ObjectClassId.ToString()); CswNbtMetaDataNodeType NodeType = _CswNbtResources.MetaData.getNodeType(Tree.getNodeKeyForCurrentPosition().NodeTypeId); gridrow.canView = _CswNbtResources.Permit.canNodeType(CswEnumNbtNodeTypePermission.View, NodeType) && _CswNbtResources.Permit.isNodeWritable(CswEnumNbtNodeTypePermission.View, NodeType, Tree.getNodeIdForCurrentPosition()); gridrow.canEdit = (_CswNbtResources.Permit.canNodeType(CswEnumNbtNodeTypePermission.Edit, NodeType) && (_CswNbtResources.CurrentNbtUser.IsAdministrator() || _CswNbtResources.Permit.isNodeWritable(CswEnumNbtNodeTypePermission.Edit, NodeType, NodeId: Tree.getNodeIdForCurrentPosition())) && false == Tree.getNodeLockedForCurrentPosition()); gridrow.canDelete = (_CswNbtResources.Permit.canNodeType(CswEnumNbtNodeTypePermission.Delete, NodeType) && _CswNbtResources.Permit.isNodeWritable(CswEnumNbtNodeTypePermission.Delete, NodeType, NodeId: Tree.getNodeIdForCurrentPosition()) ); gridrow.isLocked = Tree.getNodeLockedForCurrentPosition(); gridrow.isDisabled = (false == Tree.getNodeIncludedForCurrentPosition()); if (null != _CswNbtResources.CurrentNbtUser) { gridrow.isFavorite = Tree.getNodeFavoritedForCurrentPosition(); } _TreeNodeToGrid(View, Tree, grid, gridrow); Tree.goToParentNode(); grid.rowData.rows.Add(gridrow); } Ret = grid.ToJson(); } return(Ret); } // TreeToJson()
} // _treeNodeJObject() public void runTree(Contract.Response.ResponseData ResponseData, Contract.Request Request, Int32 PerLevelNodeLimit = Int32.MinValue, Int32 TotalNodeLimit = Int32.MinValue) { ResponseData.Tree = ResponseData.Tree ?? new Collection <CswExtTree.TreeNode>(); ICswNbtTree Tree = null; string RootName = string.Empty; if (null != _View) { Tree = _CswNbtResources.Trees.getTreeFromView(_View, Request.RequireViewPermissions, false, false, PerLevelNodeLimit: PerLevelNodeLimit); _View.SaveToCache(Request.IncludeInQuickLaunch); RootName = _View.ViewName; } CswPrimaryKey IncludeNodeId = null; CswNbtNodeKey SelectKey = null; Int32 IncludeNodeTypeId = Int32.MinValue; if (null != Request.IncludeNodeKey) { IncludeNodeId = Request.IncludeNodeKey.NodeId; IncludeNodeTypeId = Request.IncludeNodeKey.NodeTypeId; if (null != Tree) { Tree.makeNodeCurrent(Request.IncludeNodeKey); if (Tree.isCurrentNodeDefined()) { SelectKey = Request.IncludeNodeKey; } } } else if (CswTools.IsPrimaryKey(Request.IncludeNodeId)) { IncludeNodeId = Request.IncludeNodeId; CswNbtNode IncludeNode = _CswNbtResources.Nodes[IncludeNodeId]; if (null != IncludeNode) { IncludeNodeTypeId = IncludeNode.NodeTypeId; } if (null != Tree) { SelectKey = Tree.getNodeKeyByNodeId(IncludeNodeId); } } if ((CswTools.IsPrimaryKey(IncludeNodeId) && IncludeNodeTypeId != Int32.MinValue) && (Tree == null || (Request.IncludeNodeRequired && SelectKey == null))) { CswNbtMetaDataNodeType IncludeNodeType = _CswNbtResources.MetaData.getNodeType(IncludeNodeTypeId); if (null != IncludeNodeType) { _View = IncludeNodeType.CreateDefaultView(false); _View.ViewName = IncludeNodeType.NodeTypeName; _View.Root.ChildRelationships[0].NodeIdsToFilterIn.Add(IncludeNodeId); _View.SaveToCache(Request.IncludeInQuickLaunch); // case 22713 RootName = _View.ViewName; Tree = _CswNbtResources.Trees.getTreeFromView(_View, false, false, false); } } bool HasResults = false; if (null != Tree) { Tree.goToRoot(); HasResults = (Tree.getChildNodeCount() > 0); //ReturnObj["result"] = HasResults.ToString().ToLower(); //ReturnObj["types"] = getTypes(); ResponseData.PageSize = _CswNbtResources.CurrentNbtUser.PageSize; ResponseData.SelectedNodeKey = null; if (HasResults) { // Determine the default selected node: // If the requested node to select is on the tree, return it. // If the requested node to select is not on the tree, return the first child of the root. if (SelectKey != null) { Tree.makeNodeCurrent(SelectKey); if (Tree.isCurrentNodeDefined()) { ResponseData.SelectedNodeKey = SelectKey; } } if (ResponseData.SelectedNodeKey == null) { switch (Request.DefaultSelect) { case "none": break; case "root": break; case "firstchild": Tree.goToRoot(); CswNbtNodeKey CurrentKey = Tree.getNodeKeyForCurrentPosition(); while (CurrentKey != null && CurrentKey.NodeSpecies != CswEnumNbtNodeSpecies.Plain && Tree.getChildNodeCount() > 0) { Tree.goToNthChild(0); CurrentKey = Tree.getNodeKeyForCurrentPosition(); } if (CurrentKey != null && CurrentKey.NodeSpecies == CswEnumNbtNodeSpecies.Plain) { ResponseData.SelectedNodeKey = CurrentKey; } break; } // switch( DefaultSelect ) } // if( ReturnObj["selectid"] == null ) } // if( HasResults ) else { Request.DefaultSelect = "root"; } Tree.goToRoot(); } //Build the Response: ResponseData.Name = RootName; //#1: the Root node CswExtTree.TreeNode RootNode = new CswExtTree.TreeNode(); ResponseData.Tree.Add(RootNode); RootNode.Name = RootName; RootNode.IsRoot = true; RootNode.Expanded = true; RootNode.Path = "|root"; RootNode.Id = "root"; RootNode.Icon = "Images/view/viewtree.gif"; //#2: the columns for the Tree Grid ResponseData.Columns.Add(new CswExtJsGridColumn { dataIndex = new CswExtJsGridDataIndex(_View.ViewName, "text"), xtype = CswEnumExtJsXType.treecolumn, MenuDisabled = true, width = 269, header = "Tree", resizable = false, }); ResponseData.Columns.Add(new CswExtJsGridColumn { dataIndex = new CswExtJsGridDataIndex(_View.ViewName, "nodetypeid"), header = "NodeTypeId", hidden = true, resizable = false, width = 0, xtype = CswEnumExtJsXType.gridcolumn, MenuDisabled = false }); ResponseData.Columns.Add(new CswExtJsGridColumn { dataIndex = new CswExtJsGridDataIndex(_View.ViewName, "objectclassid"), header = "ObjectClassId", hidden = true, resizable = false, width = 0, xtype = CswEnumExtJsXType.gridcolumn, MenuDisabled = false }); ResponseData.Columns.Add(new CswExtJsGridColumn { dataIndex = new CswExtJsGridDataIndex(_View.ViewName, "nodeid"), header = "NodeId", hidden = true, resizable = false, width = 0, xtype = CswEnumExtJsXType.gridcolumn, MenuDisabled = false }); ResponseData.Columns.Add(new CswExtJsGridColumn { dataIndex = new CswExtJsGridDataIndex(_View.ViewName, "disabled"), header = "Disabled", hidden = true, resizable = false, width = 0, xtype = CswEnumExtJsXType.booleancolumn, MenuDisabled = false }); //#3: The fields to map the columns to the data store ResponseData.Fields.Add(new CswExtJsGridField { name = "text", type = "string" }); ResponseData.Fields.Add(new CswExtJsGridField { name = "nodetypeid", type = "string" }); ResponseData.Fields.Add(new CswExtJsGridField { name = "objectclassid", type = "string" }); ResponseData.Fields.Add(new CswExtJsGridField { name = "nodeid", type = "string" }); ResponseData.Fields.Add(new CswExtJsGridField { name = "disabled", type = "bool" }); //#4: View Properties are columns now too Collection <string> UniqueColumnNames = new Collection <string>() { "text", "nodetypeid", "objectclassid", "nodeid", "disabled" }; CswNbtViewRoot.forEachProperty AddProp = (ViewProperty) => { string PropName = ViewProperty.Name.ToLower().Trim(); bool HideProp = (null != Request.PropsToShow && false == Request.PropsToShow.Contains(PropName)); if (false == UniqueColumnNames.Contains(PropName)) { UniqueColumnNames.Add(PropName); CswExtJsGridColumn Col = new CswExtJsGridColumn { dataIndex = new CswExtJsGridDataIndex(_View.ViewName, PropName), header = ViewProperty.Name, hidden = HideProp, resizable = false, width = ViewProperty.Width * 7, xtype = CswEnumExtJsXType.gridcolumn, MenuDisabled = false }; CswExtJsGridField Fld = new CswExtJsGridField { name = PropName, type = "string" }; Fld.dataIndex = Col.dataIndex; ResponseData.Columns.Add(Col); ResponseData.Fields.Add(Fld); } }; _View.Root.eachRelationship(relationshipCallBack: null, propertyCallBack: AddProp); //#5: the tree RootNode.Children = new Collection <CswExtTree.TreeNode>(); if (HasResults) { Tree.goToRoot(); int count = 0; _runTreeNodesRecursive(Tree, RootNode.Children, RootNode, Request, TotalNodeLimit, ref count); if (Int32.MinValue != TotalNodeLimit && count >= TotalNodeLimit && RootNode.Children[0].Name != "Results Truncated") { CswExtTree.TreeNode TruncatedTreeNode = _getTreeNode(Tree, RootNode, null); TruncatedTreeNode.Name = "Results Truncated"; TruncatedTreeNode.IsLeaf = true; TruncatedTreeNode.Icon = "Images/icons/truncated.gif"; TruncatedTreeNode.Id = TruncatedTreeNode.Id + "_truncated"; TruncatedTreeNode.NodeId = ""; RootNode.Children.Insert(0, TruncatedTreeNode); } } else { CswExtTree.TreeNode EmptyNode = new CswExtTree.TreeNode(); EmptyNode.Name = "No Results"; EmptyNode.IsLeaf = true; EmptyNode.Selected = true; EmptyNode.Id = "empty"; EmptyNode.ParentId = RootNode.Id; EmptyNode.Path = RootNode.Path + "|empty"; RootNode.Children.Add(EmptyNode); } //} } // runTree()
} // _TreeNodeToGrid() public CswExtJsGrid DataTableToGrid(DataTable DT, bool Editable = false, string GroupByCol = "", CswEnumExtJsXType GroupByColType = null, bool IncludeEditFields = true, Dictionary <string, Type> ColumnTypeOverrides = null) { string NodeIdColName = "nodeid"; string MenuOptionsColName = "menuoptions"; string gridUniquePrefix = DT.TableName; CswExtJsGrid grid = new CswExtJsGrid(gridUniquePrefix, IncludeEditFields); grid.groupfield = GroupByCol; grid.title = DT.TableName; if (_CswNbtResources.CurrentNbtUser != null && _CswNbtResources.CurrentNbtUser.PageSize > 0) { grid.PageSize = _CswNbtResources.CurrentNbtUser.PageSize; } //CswExtJsGridDataIndex nodeIdDataIndex = new CswExtJsGridDataIndex( gridUniquePrefix, NodeIdColName ); //{ // CswExtJsGridField nodeIdFld = new CswExtJsGridField { dataIndex = nodeIdDataIndex }; // grid.fields.Add( nodeIdFld ); // CswExtJsGridColumn nodeIdCol = new CswExtJsGridColumn { header = "nodeId", dataIndex = nodeIdDataIndex, hidden = true }; // grid.columns.Add( nodeIdCol ); //} foreach (DataColumn CurrentColumn in DT.Columns) { Type CurrentColumnType = null; if (null != ColumnTypeOverrides) { if (false == ColumnTypeOverrides.ContainsKey(CurrentColumn.ColumnName)) { CurrentColumnType = CurrentColumn.DataType; } else { CurrentColumnType = ColumnTypeOverrides[CurrentColumn.ColumnName]; } } else { CurrentColumnType = CurrentColumn.DataType; } CswExtJsGridDataIndex dataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, CurrentColumn.ColumnName); CswExtJsGridField fld = new CswExtJsGridField(); grid.fields.Add(fld); fld.dataIndex = dataIndex; CswExtJsGridColumn gridcol = new CswExtJsGridColumn(); gridcol.header = CurrentColumn.ColumnName; gridcol.dataIndex = dataIndex; gridcol.width = Math.Max(100, (7 + CurrentColumn.ColumnName.Length * 8)); if ((NodeIdColName.ToLower() == CurrentColumn.ColumnName.ToLower()) || (MenuOptionsColName.ToLower() == CurrentColumn.ColumnName.ToLower())) { gridcol.hidden = true; } if (CurrentColumnType == typeof(string)) { fld.type = "string"; } else if (CurrentColumnType == typeof(bool)) { fld.type = "bool"; gridcol.xtype = CswEnumExtJsXType.booleancolumn; } else if (CurrentColumnType == typeof(Int32) || (GroupByColType != null && CurrentColumn.ColumnName.ToLower().Equals(GroupByCol.ToLower()) && GroupByColType.Equals(CswEnumExtJsXType.numbercolumn))) { fld.type = "number"; gridcol.xtype = CswEnumExtJsXType.numbercolumn; gridcol.Format = "0"; } else if (CurrentColumnType == typeof(DateTime) || (GroupByColType != null && CurrentColumn.ColumnName.ToLower().Equals(GroupByCol.ToLower()) && GroupByColType.Equals(CswEnumExtJsXType.datecolumn))) { string userDateFormat = _CswNbtResources.CurrentNbtUser.DateFormat; string userTimeFormat = _CswNbtResources.CurrentNbtUser.TimeFormat; gridcol.dateformat = CswTools.ConvertNetToPHP(userDateFormat) + " " + CswTools.ConvertNetToPHP(userTimeFormat); fld.type = "date"; gridcol.xtype = CswEnumExtJsXType.datecolumn; gridcol.Format = "m/d/y H:i:s"; } else if (CurrentColumnType == typeof(sbyte)) //sbyte indidcates a "button" column :-( { gridcol.xtype = CswEnumExtJsXType.gridcolumn; gridcol.MenuDisabled = true; gridcol.IsSortable = false; } grid.columns.Add(gridcol); } Int32 RowNo = 0; foreach (DataRow Row in DT.Rows) { CswExtJsGridRow gridrow = new CswExtJsGridRow(RowNo, gridUniquePrefix); string NodeIdForGridRowData = string.Empty; foreach (DataColumn CurrentColumn in DT.Columns) { Type CurrentColumnType = null; if (null != ColumnTypeOverrides) { if (false == ColumnTypeOverrides.ContainsKey(CurrentColumn.ColumnName)) { CurrentColumnType = CurrentColumn.DataType; } else { CurrentColumnType = ColumnTypeOverrides[CurrentColumn.ColumnName]; } } else { CurrentColumnType = CurrentColumn.DataType; } CswExtJsGridDataIndex index = null; index = new CswExtJsGridDataIndex(gridUniquePrefix, CurrentColumn.ColumnName); gridrow.data[index] = CswConvert.ToString(Row[CurrentColumn]); if (Row.Table.Columns.Contains(NodeIdColName) && DBNull.Value != Row[NodeIdColName] && typeof(sbyte) == CurrentColumnType) { string MenuOptions = string.Empty; if (Row.Table.Columns.Contains(MenuOptionsColName)) { MenuOptions = Row[MenuOptionsColName].ToString(); } NodeIdForGridRowData = Row[NodeIdColName].ToString(); CswExtJsGridButton CurrentButton = new CswExtJsGridButton { DataIndex = index.ToString(), RowNo = RowNo, MenuOptions = MenuOptions, SelectedText = CurrentColumn.ColumnName, PropAttr = NodeIdForGridRowData }; //nu the button grid.rowData.btns.Add(CurrentButton); //add the button }//if it's the hi-jacked data tabe that means BUTTON }//iterate collumns grid.rowData.rows.Add(gridrow); RowNo += 1; } // foreach( DataRow Row in DT.Rows ) return(grid); } // DataTableToGrid()