Telerik Forums
UI for ASP.NET AJAX Forum
9 answers
306 views
Hi.

Our application uses both splitters and iframes for layout. So, we have the following structure:
<Splitter1>
  <Pane11>
     <RadMenu/>
  </Pane11>
  <Pane12>
     <Splitter2>
        <Pane21/>
        <Pane22>
            <Iframe/>
        </Pane22>
     </Splitter2>
  </Pane12>
</Splitter1>

The Iframe takes the biggest part of the screen. The problem is that in FireFox, menu subitems go below Iframe and are not visible. Please note, that I applied your advice from knowledge base for menu+splitter, and menu started work fine WITHOUT Iframe but it still doesn't show well WITH Iframe. Without splitter, menu + iframe work fine as well...

Hope I described the situation clearly. We are using Prometheus.
---
TIA,
Mike
Simon
Telerik team
 answered on 20 Oct 2008
1 answer
176 views
I am using custom skin for radgrid. But, the sort icons are not appearing.
Dimo
Telerik team
 answered on 20 Oct 2008
1 answer
121 views
Hi,

I have a radwindow that opens (small size of 200px x 200px)., which contains a radcombobox.

The drop-down of the combobox is restricted to the radwindow..How do i get the drop-down to be larger, so that is appears outside the radwindow border boundary? is this possible ?

I have tried EnableScreenBoundaryDetection="false" but it does not seem to do anything.

Any ideas please, thanks
Mark
Rosi
Telerik team
 answered on 20 Oct 2008
1 answer
86 views
Hello

I am using Q2 2008 Rad Controls and .net 3.5
when I write a filter criteria in the Rad Editor filter textbox and press ener it redirects me to my login page I wonder what cuses this !!!
Vlad
Telerik team
 answered on 20 Oct 2008
2 answers
100 views
Hi,

I have a grid. When i am selecting the rows in grid the alternate row is not completely selected, half of the row from vertically is selecting. But other than alternate rows are selected properly.

please suggest..

Thanks & Regards,
sai
Dimo
Telerik team
 answered on 20 Oct 2008
1 answer
68 views
hello
    I  am using schedular control in my project.i have connected to sqlserver database.i need insert,update,delete in sql through coding.
thanx in advance.

Paul
Telerik team
 answered on 20 Oct 2008
16 answers
778 views

I am seeing an issue with having a Drop Down Tree View and having the drop down text area set at run time, the issue is when I select a tree view node the first time, the drop down text area becomes blank. But selecting a second node and then after, the drop down text area shows the selected node.

The interesting part is the first select I am able to get the node’s data that was selected, which I use with “comboBox.set_text(node.get_text());” to set the drop down text area. Although the comboBox object shows that its text was set, the page still shows the drop down text area as blank.  

I tried multiple approaches to try to solve this but each one ending  up in the same result.

If I do not set the drop down text at run time, then the issue of selecting a node the first time goes away. I need to have the drop down text set at run time.

I implemented the Drop Down Tree View control into two user controls; one control to handle the Drop Down and the other to handle the Tree View.  I have included the code, the .ascx, .cs and .js info of the controls with some explanation of each

Drop Down  .ascx Page

Simple enough just the drop down that has the tree view user control embedded and the OnClientNodeClicked is handled by the javascript.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucOrgTreeViewDropDown.ascx.cs" Inherits="WebControls_ucOrgTreeViewDropDown" %> 
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %> 
<%@ Register src="../WebControls/ucOrgTreeView.ascx" tagname="ucOrgTreeView" tagprefix="uc1" %> 
 
<telerik:RadComboBox  
    ID="OrgComboBox"   
    runat="server"   
    Height="140px"   
    Width="215px" 
    ShowToggleImage="True"   
    Skin="MyApp"   
    EnableEmbeddedSkins="false" 
    style="vertical-align:middle;" 
    > 
    <ItemTemplate> 
        <div id="div1" onclick="MyApp.Controls.ucOrgTreeViewDropDown.StopPropagation">  
            <uc1:ucOrgTreeView ID="OrgTreeView" runat="server" OnClientNodeClicked="MyApp.Controls.ucOrgTreeViewDropDown.HandleNodeClicked"/>  
        </div> 
    </ItemTemplate> 
    <Items> 
        <telerik:RadComboBoxItem Text="" /> 
    </Items> 
</telerik:RadComboBox> 
 

Drop Down .cs  File

The Drop Down properties is setup to be a pass through to the Tree View control. OnPreRender method sets up what javascript file will be used. And the OnLoad method will set the Drop Down text area to the selected Node Text on load of the dropdown control by doing the following:

WebControls_ucOrgTreeView
orgtree = (WebControls_ucOrgTreeView)item.FindControl("OrgTreeView");

OrgComboBox.Text = orgtree.SelectedOrgName;

, which works great, the text of the selected node shows up just fine on load. However I wonder if I need to do something else here to force the node to be selected, which I attempted to do with:

int treeviewNodeIndex = orgtree.GetIndexFromOrgID(orgtree.SelectedOrgID);

orgtree.SelectNode = treeviewNodeIndex; 

But this did not help.

using System;  
using System.Collections;  
using System.Collections.Generic;  
using System.Configuration;  
using System.Data;  
using System.Linq;  
using System.Web;  
using System.Web.Security;  
using System.Web.UI;  
using System.Web.UI.HtmlControls;  
using System.Web.UI.WebControls;  
using System.Web.UI.WebControls.WebParts;  
using System.Xml.Linq;  
using Telerik.Web.UI;  
 
public partial class WebControls_ucOrgTreeViewDropDown : System.Web.UI.UserControl  
{  
    // Properties  
    public int SelectedOrgID  
    {  
        get 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            return Convert.ToInt32(tree_view.SelectedOrgID);  
        }  
        set 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            tree_view.SelectedOrgID = value;  
        }  
    }  
 
    public int FirstOrgID  
    {  
        get 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            return tree_view.FirstOrgID;  
        }  
    }  
 
    public string SelectedOrgName  
    {  
        get 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            return tree_view.SelectedOrgName;  
        }  
    }  
 
    public bool UseAllOrg  
    {  
        get 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            return tree_view.UseAllOrg;   
        }  
        set 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            tree_view.UseAllOrg = value;   
        }  
    }  
 
    public bool Enabled  
    {  
        get 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            return tree_view.Enabled;   
        }  
        set 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            tree_view.Enabled = value;  
        }  
    }  
 
    public int RootOrgID  
    {  
        get 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            return tree_view.RootOrgID;  
        }  
        set 
        {  
            WebControls_ucOrgTreeView tree_view = (WebControls_ucOrgTreeView)(OrgComboBox.Items[0].FindControl("OrgTreeView"));  
            tree_view.RootOrgID = value;  
        }  
    }  
 
    // Methods  
    protected override void OnPreRender(EventArgs e)  
    {  
        base.OnPreRender(e);  
        ScriptManager.RegisterClientScriptInclude(thisthis.GetType(), "MyApp.Controls.ucOrgTreeViewDropDown", ResolveClientUrl("~/js/script_handler.ashx?s=~/js/Controls/ucOrgTreeViewDropDown.js"));  
    }  
 
    protected void Page_Load(object sender, EventArgs e)  
    {  
        if (!IsPostBack)  
        {  
            string assign_OrgComboBox_ID = string.Format("var {0} = new MyApp.Controls.ucOrgTreeViewDropDown('{1}', '{2}');\n", ID, OrgComboBox.ClientID, OrgComboBox.Items[0].FindControl("OrgTreeView").FindControl("RadTreeView1").ClientID);  
            ScriptManager.RegisterStartupScript(thisthis.GetType(), string.Format("assign_{0}", ID), assign_OrgComboBox_ID, true);  
      
            foreach (RadComboBoxItem item in OrgComboBox.Items)  
            {  
                RadTreeView tree_view = (RadTreeView)(item.FindControl("OrgTreeView").FindControl("RadTreeView1"));  
                tree_view.Attributes.Add("ParentComboBoxID", OrgComboBox.ClientID);  
                  
                WebControls_ucOrgTreeView orgtree = (WebControls_ucOrgTreeView)item.FindControl("OrgTreeView");  
                OrgComboBox.Text = orgtree.SelectedOrgName;  
                int treeviewNodeIndex = orgtree.GetIndexFromOrgID(orgtree.SelectedOrgID);  
                orgtree.SelectNode = treeviewNodeIndex;               
            }  
        }  
    }  
 
}  
 

Tree View .ascx file

Simple enough just the RadTreeView

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucOrgTreeView.ascx.cs" Inherits="WebControls_ucOrgTreeView" %> 
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %> 
 
<telerik:RadTreeView   
    runat="server"   
    ID="RadTreeView1"   
    Skin="MyApp"   
    EnableEmbeddedSkins="false">    
</telerik:RadTreeView> 
 

Tree View .cs file

Some of this code is specific to my application, especially when it comes to getting the org info. On my box the treeview is created just fine and so I suspect the way that it is created is not the issue. ,

However the code does show some of the properties that are used in javascript. The property of SelectedOrgID will return the ID of the row that was selected. The UseAll, just creates a new node with the Text value of “All” and an ID of 0, etc.

using System;  
using System.Collections;  
using System.Collections.Generic;  
using System.Configuration;  
using System.Data;  
using System.Linq;  
using System.Web;  
using System.Web.Security;  
using System.Web.UI;  
using System.Web.UI.HtmlControls;  
using System.Web.UI.WebControls;  
using System.Web.UI.WebControls.WebParts;  
using System.Xml.Linq;  
using Telerik.Web.UI;  
using Medicity.MyApp.BusinessLogic;  
using Medicity.MyApp.CommonObjects;  
using Medicity.MyApp.TestScripts;  
 
public partial class WebControls_ucOrgTreeView : System.Web.UI.UserControl  
{  
    private Medicity.MyApp.BusinessLogic.BusinessLogic bl = new BusinessLogic();  
    private SessionManager sm = new SessionManager();  
    private bool _UseAllOrg = false;  
    private bool _Enabled = true;  
    private int _RootOrgID = -1;  
    private int _SelectedOrgID;  
    private RadTreeNode _SelectedNode = new RadTreeNode();
    
    #region Properties  
    public int SelectedOrgID  
    {  
        get 
        {  
            if (RadTreeView1.SelectedNode != null)  
                return Convert.ToInt32(RadTreeView1.SelectedNode.Value);  
            return -1;  
        }  
        set 
        {  
            _SelectedOrgID = value;  
            ApplyTelerikOrgTreeViewProperties();  
        }  
    }  
 
    public int SelectNode  
    {  
        set   
        {   
            int index = value;  
            RadTreeView1.Nodes[index].Selected = true;  
        }  
    }  
 
    public RadTreeNode SelectedNode  
    {  
        get 
        {  
            return RadTreeView1.SelectedNode;  
        }  
    }  
 
    public int FirstOrgID  
    {  
        get   
        {   
            return Convert.ToInt32(RadTreeView1.Nodes[0].Value);  
        }  
    }  
 
    public string SelectedOrgName  
    {  
        get 
        {  
            if (RadTreeView1.SelectedNode != null)  
                return RadTreeView1.SelectedNode.Text;  
            return string.Empty;  
        }  
    }  
 
    public string OnClientNodeClicked  
    {  
        set 
        {  
            RadTreeView1.OnClientNodeClicked = value;  
        }  
    }  
 
    public bool UseAllOrg  
    {  
        get 
        {  
            return _UseAllOrg;  
        }  
        set 
        {  
            _UseAllOrg = value;  
            ApplyTelerikOrgTreeViewProperties();  
        }  
    }  
 
    public bool Enabled  
    {  
        get 
        {  
            return _Enabled;  
        }  
        set 
        {  
            _Enabled = value;  
            ApplyTelerikOrgTreeViewProperties();  
        }  
    }  
 
    public int RootOrgID  
    {  
        get 
        {  
            return _RootOrgID;  
        }  
        set 
        {  
            _RootOrgID = value;  
            ApplyTelerikOrgTreeViewProperties();  
        }  
    }
    #endregion  
 
    /// <summary>  
    /// The Tree View will be populated with all Orgs of the BOrg before the Properties are applied  
    /// </summary>  
    /// <param name="sender"></param>  
    /// <param name="e"></param>  
    protected void Page_Init(object sender, EventArgs e)  
    {  
        PopulatedAllOrgsIntoTreeView();   
    }  
 
    private void PopulatedAllOrgsIntoTreeView()  
    {  
        List<Org> orgs = new List<Org>();  
        orgs = bl.GetBorgOrgs(sm.UserData.Org.BorgID);  
        orgs = bl.GenerateOrgHierarchies(orgs, false);  
        RadTree_GenerateOrgHierarchies(orgs, false);      
    }  
 
    /// <summary>  
    /// Apply the Properties  
    /// </summary>  
    /// <param name="treeNodeCollection"></param>  
    private void ApplyTelerikOrgTreeViewProperties()  
    {  
        //Reduce the tree list to what is viewable  
        if (_RootOrgID > -1)   
        {  
            List<Org> orgs = new List<Org>();  
            orgs = GenerateOrgHierarchies(); //FOR TESTING ONLY DO NOT ERASE  
            if (_RootOrgID != 0)  
            {  
                //Put code in here to reduce the number of orgs the user is able to view  
            }  
            if (orgs.Count > 0)  
            {   
                RadTree_GenerateOrgHierarchies(orgs, true); //This sets up the TreeView with Org data  
            }  
            else 
            {  
                throw new ApplicationException("What The");  
            }  
        }  
 
        //Create the tree list if the list is empty  
        if (RadTreeView1.Nodes.Count == 0)  
            PopulatedAllOrgsIntoTreeView();  
 
        //Add "All" to the top of the Tree View if needed  
        if (_UseAllOrg)  
        {  
            RadTreeNode all_node = new RadTreeNode("All""0");  
            RadTreeView1.Nodes.Insert(0, all_node);  
        }  
 
        //Set the selected node based on the SelectedOrgID -> This is fully implemented in ucOrgTreeViewDropDown.cs  
        if (_SelectedOrgID > -1)  
        {  
            bool nodeSelected = false;  
            foreach (RadTreeNode node in RadTreeView1.Nodes)  
            {  
                if (_SelectedOrgID == (Convert.ToInt32(node.Value)))  
                {  
                    node.Selected = true;  
                    nodeSelected = true;  
                    break;  
                }  
            }  
            if (!nodeSelected)  
            {  
                //Let the debugger know  
                System.Diagnostics.Debug.WriteLine("---");  
                System.Diagnostics.Debug.WriteLine("SelectedOrgID (" + _SelectedOrgID + ") was not found in the TreeView list. This could happen if the OrgID no longer exists in the Database or OrgID was removed from the TreeView due to the User's access rights.");  
                System.Diagnostics.Debug.WriteLine("---");  
            }  
        }  
 
        //Enable or disable the control  
        RadTreeView1.Enabled = _Enabled;  
    }  
 
    public int GetTopLevelID()  
    {  
        if(RadTreeView1.Nodes != null)  
            return Convert.ToInt32(RadTreeView1.Nodes[0].Value);  
        return -1;  
    }  
 
    public int GetIndexFromOrgID(int orgID)  
    {  
        RadTreeNode node = RadTreeView1.FindNodeByValue(orgID.ToString());  
        return node.Index;  
    }  
 
    private void RadTree_GenerateOrgHierarchies(List<Org> OrgList, bool ReducedList)  
    {  
        RadTreeView1.Nodes.Clear();  
        RadTreeNode nodes = new RadTreeNode();  
        if (!ReducedList || _RootOrgID == 0) //If _RootOrgID = 0 then show all Orgs  
        {  
            foreach (Org org in OrgList)  
            {  
                if (org.ParentOrgID == null//Found a top level org  
                {  
                    nodes = RadTree_GetAllChildern(OrgList, org, null);  
                    RadTreeView1.Nodes.Add(nodes);  
                }  
            }  
        }  
        else   
        {  
            nodes = RadTree_GetAllChildern(OrgList, OrgList[0], null);  
            RadTreeView1.Nodes.Add(nodes);  
        }  
    }  
 
    private RadTreeNode RadTree_GetAllChildern(List<Org> Orgs, Org pOrg, RadTreeNode pNode)  
    {  
        pNode = new RadTreeNode(pOrg.Name, pOrg.OrgID.ToString());  
        List<Org> childernList = bl.GetListOfChildern(pOrg.OrgID, Orgs);  
        foreach (Org org in childernList)  
        {  
            RadTreeNode cNode = RadTree_GetAllChildern(Orgs, org, pNode);  
            if(cNode.Nodes.Count == 0)  
                cNode = new RadTreeNode(org.Name, org.OrgID.ToString());  
            pNode.Nodes.Add(cNode);  
        }  
        return pNode;  
    }  
}  
 

The javascript file

The handlenodeclick method is where the selected node's text is placed into the drop down's text area. But for some reason when this happens on the first click, the drop down's text area is blank. But the backend still knows that the node is selected because when I select the search button for my application, it grabs that selected node's info to do the search. So some thing on setting up the drop down is not correct and I have played around with it for many hours trying to figure out why it is not working.

// Make sure the namespace is defined  
if (typeof(MyApp) == "undefined")  
    MyApp = {};  
if (typeof(MyApp.Controls) == "undefined")  
    MyApp.Controls = {};  
 
// Constructor  
MyApp.Controls.ucOrgTreeViewDropDown = function MyApp$Controls$ucOrgTreeViewDropDown(client_id, tree_client_id)  
{  
    this.ClientId = client_id;  
    this.TreeClientId = tree_client_id;  
      
    MyApp.Controls.ucOrgTreeViewDropDown.ObjectMap[client_id] = this;  
}  
 
MyApp.Controls.ucOrgTreeViewDropDown.ObjectMap = [];  
 
// static event handlers  
MyApp.Controls.ucOrgTreeViewDropDown.HandleNodeClicked = function MyApp$Controls$ucOrgTreeViewDropDown$HandleNodeClicked(sender, args)  
{  
    var combo_client_id = sender.get_attributes().getAttribute("ParentComboBoxID");  
    var comboBox = $find(combo_client_id);  
    var node = args.get_node();  
      
    comboBox.set_text(node.get_text());  
    comboBox.hideDropDown();  
}  
 
MyApp.Controls.ucOrgTreeViewDropDown.StopPropagation = function MyApp$Controls$ucOrgTreeViewDropDown$StopPropagation(e)  
{  
     if(!e)  
     {  
        e = window.event;  
     }  
     e.cancelBubble = true;  
}  
 
// member functions  
function MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgID()  
{  
    var org_tree_element = $find(this.TreeClientId);  
    if (org_tree_element == null)  
        return -1;  
    else 
        return org_tree_element.get_selectedNode().get_value();  
}  
 
function MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgName()  
{  
    var org_tree_element = $find(this.TreeClientId);  
    if (org_tree_element == null)  
        return -1;  
    else 
        return org_tree_element.get_selectedNode().get_text();  
}  
 
function MyApp$Controls$ucOrgTreeViewDropDown$SetSelectedOrgID(orgID)  
{  
    //debugger;  
    var comboBox = $find(this.ClientId);  
     
    comboBox.set_value(orgID);  
}  
 
// Prototype  
MyApp.Controls.ucOrgTreeViewDropDown.prototype =  
{  
    GetSelectedOrgID : MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgID,  
    GetSelectedOrgName : MyApp$Controls$ucOrgTreeViewDropDown$GetSelectedOrgName,  
    SetSelectedOrgID : MyApp$Controls$ucOrgTreeViewDropDown$SetSelectedOrgID  
}  
 

I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated.

I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated.

I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated.

I hope I have supplied enough information to help in debugging this issue. Any help would be much appriciated.
Rosi
Telerik team
 answered on 20 Oct 2008
1 answer
60 views

Hi,

I cannot find an adequate example of what I am trying to do. I'd appreciate any help or references to solve this problem:

I have a RadGrid with a custom edit form. In the form I would like to have two RadComboBoxes, say rcbState and rcbCity. I would like the rcbCity to automatically refresh its contents if rcbState changes. Again, I need to do this within the RadGrid FormTemplate.

I am using SQL Datasources:

<asp:SqlDataSource ID="sdsStates" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="SELECT * FROM [states] order by state_name"></asp:SqlDataSource>


I don't know what to do for the second "city" datasource.

I am currently using DropDownLists:

                                        <asp:DropDownList ID="ddlStateID" runat="server" SelectedValue='<%# Bind("state_id") %>' AppendDataBoundItems="True" DataSourceID="sdsStates" DataTextField="state_name" CssClass="select" DataValueField="state_id">
                                            <asp:ListItem Selected="True" Text="Select" Value=""></asp:ListItem>
                                        </asp:DropDownList>

... mostly because I can't find an equivalent easy method of binding for the RadComboBox.

Any help is greatly appreciated!

Thanks,
Joseph

Princy
Top achievements
Rank 2
 answered on 20 Oct 2008
1 answer
133 views
Hi there
I cannot figure out why the input box in the following code does not appear yellow.  Please help.
Regards
Edwin

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        .yellowbg
        {
            background-color: #FFFF00;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <telerik:RadTextBox ID="RadTextBox1" runat="server" CssClass="yellowbg"
            Width="125px">
        </telerik:RadTextBox>
    </div>
    </form>
</body>
</html>
Dimo
Telerik team
 answered on 20 Oct 2008
2 answers
100 views
I wanted to display the Total in the Group Header instead of the Group Footer
that I calculated in the ItemDataBound Event of the Radgrid.

How can I do this?
Princy
Top achievements
Rank 2
 answered on 20 Oct 2008
Narrow your results
Selected tags
Tags
+? more
Top users last month
Shiori
Top achievements
Rank 2
Iron
Tien
Top achievements
Rank 1
Iron
Robert
Top achievements
Rank 1
Rob
Top achievements
Rank 4
Bronze
Bronze
Iron
Geoff
Top achievements
Rank 1
Want to show your ninja superpower to fellow developers?
Top users last month
Shiori
Top achievements
Rank 2
Iron
Tien
Top achievements
Rank 1
Iron
Robert
Top achievements
Rank 1
Rob
Top achievements
Rank 4
Bronze
Bronze
Iron
Geoff
Top achievements
Rank 1
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?