Telerik Forums
UI for ASP.NET AJAX Forum
2 answers
153 views

Hi,

 

I have upgraded Telerik dlls from 2012 to 2015 version and have a RadEditor issue inside a user control on Chrome.

This user control is placed inside a Modal popup within an Update panel on the parent page.

 

When the Radeditor is loaded, IFrame extends beyond the content body area in Design mode but it works fine in HTML mode.

If we set IFrame height to 100%, it works fine in design mode but misaligned in HTML mode(since for HTML mode Iframe height should be 0).

I have also tried to set Iframe height through javascript for different tabs but javascript function is not firing.

 

Please let me know how to resolve this issue.

 

Arpita
Top achievements
Rank 1
 answered on 11 Dec 2015
7 answers
315 views
Hello,
What can be the reason for the textbox in the Batch Edit mode  to be wider than a column itself (like in the attached image)?

Thank you,
Vadim
Humberto
Top achievements
Rank 1
 answered on 10 Dec 2015
4 answers
1.1K+ views
Since the last update I do not have controls in my toolbox for Telerik ASP.NET (well to be fair any telerik items accept openaccess)

I tried running the toolbox configurator and selecting latest version. Nothing
Figured my control cache was corrupted so deleted that (TBD Files) and reran configurator. Nothing
Did the forum searches and google sleuthing, could not find the next steps for troubleshooting.

Where do I go next?

Richard
Momchil
Telerik team
 answered on 10 Dec 2015
5 answers
172 views

I have a radGantt utilizing a custom C# provider. If i select a task in the gantt chart on the left and hit the delete key the code triggers the following server side event..

 

protected void radGanttPlanning_OnTaskDelete(object sender, TaskEventArgs e)
        {​

 

In this section of code in the code behind  how would i obtain the currently selected taskId of the task I need to delete?

 

Here is the custom provider's getTask method just to show you the structure of the CustomTask should you need it. 

public override List<ITask> GetTasks()
    {
        if (taskList == null)
        {
         
            List<CurrencyRates> lsCurrencyRates = CurrencyRate.GetEffectiveCurrencyRates();
            var tasks = (from DataRow drDataRow in dtResultTable.Rows
                select new CustomTask
                {
                    DatabaseID = int.Parse(drDataRow["id"].ToString()),
                    ID = drDataRow["projecttaskid"].ToString(),
                    ParentID = (drDataRow["parentId"] == DBNull.Value) ? null : drDataRow["parentId"],
                    OrderID = int.Parse(drDataRow["OrderId"].ToString()),
                    Start = DateTime.Parse(drDataRow["startdate"].ToString()),
                    End = DateTime.Parse(drDataRow["enddate"].ToString()),
                    Summary = bool.Parse(drDataRow["issummarytask"].ToString()),
                    Title = drDataRow["taskname"].ToString(),
                    Active = bool.Parse(drDataRow["active"].ToString()),
                    PreferredStart = DateTime.Parse(drDataRow["preferredstartdate"].ToString()),
                    Expanded = bool.Parse(drDataRow["expandable"].ToString()),
                    PercentComplete = (Decimal.Parse(drDataRow["percentageComplete"].ToString())/100),
                    ProjectID = int.Parse(drDataRow["projectid"].ToString()),
                    GuidID = Guid.Parse(drDataRow["guidid"].ToString()),
                    PredecessorIndicies = drDataRow["predecessorIndicies"].ToString(),
                    SchedulingGranularity = int.Parse(drDataRow["schedulingGranularity"].ToString()),
                    IndentLevel = int.Parse(drDataRow["indentlevel"].ToString()),
                    //Effort = int.Parse(drDataRow["effort"].ToString()),
                    TotalActualHours = double.Parse(drDataRow["TotalActualHours"].ToString()),
                    IsVave = bool.Parse(drDataRow["projectisvave"].ToString()),
                    lsCurrencyRates = lsCurrencyRates
                }).Cast<ITask>().ToList();

            taskList = tasks;
        }
        return taskList;
    }

Julian
Top achievements
Rank 1
 answered on 10 Dec 2015
6 answers
69 views

Hi there,
I'm currently using a Radgrid with render mode auto.  In Desktop browser, export button does fine. In mobile browser,  if I tap filter icon, then open Filter options, but tap export not open export options . I used UI for ASP.NET AJAX Q3 2015 SP1 (version 2015.3.1111).

How can I solve this?

Kind Regards,

Maria Ilieva
Telerik team
 answered on 10 Dec 2015
2 answers
168 views

I'm using the ExportType.ExcelXslx to export my grid as "Xslx" file, It's working well.

Unfortunatly, when I try to export the grid as Excel file to an email, the Excel file is corrupt.

I get the e.ExportOutput and get bytes from en AsciiEncoding like I did with ExcelML export type in the GridExporting method.

var gridMemoryStream = new MemoryStream(new ASCIIEncoding().GetBytes(e.ExportOutput));

 

What's the proper way to get the "Xlsx" file from an RadGrid at the ExportExcel() without file corruption ?

 

Louis
Top achievements
Rank 1
 answered on 10 Dec 2015
1 answer
311 views

Hi! I have a problem with rendering in RadWizardStep. I create step programmatically.During this creation i insert UserControl wich contains RadTreeView

control. Everything is fine until i expand nodes of TreeView. There is no scrollbars and a bottom part of nodes becomes invisible.

I've read the topic http://www.telerik.com/forums/height-attribute-of-radwizard, but this not works. Any suggestions to fix this issue?

Here's my code:

User Control

 

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TreeControl.ascx.cs" Inherits="Wizard.TreeControl" %>
 <div>
      
        <telerik:RadTextBox ClientEvents-OnLoad="clientLoad" ID="RadTextBoxFilter1" runat="server" />
        <telerik:RadTreeView ID="RadTreeViewFilter1" runat="server">
            <Nodes>
                <telerik:RadTreeNode runat="server" Text="Microsoft">
                    <Nodes>
                        <telerik:RadTreeNode runat="server" Text="Windows">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="Office">
                        </telerik:RadTreeNode>
                    </Nodes>
                </telerik:RadTreeNode>
                <telerik:RadTreeNode runat="server" Text="Oracle">
                    <Nodes>
                        <telerik:RadTreeNode runat="server" Text="Database 10g">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="Data Integrator">
                        </telerik:RadTreeNode>
                    </Nodes>
                </telerik:RadTreeNode>
                <telerik:RadTreeNode runat="server" Text="Adobe">
                    <Nodes>
                        <telerik:RadTreeNode runat="server" Text="Photoshop">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="Illustrator">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="Premier">
                        </telerik:RadTreeNode>
                    </Nodes>
                </telerik:RadTreeNode>
                <telerik:RadTreeNode runat="server" Text="Telerik">
                    <Nodes>
                        <telerik:RadTreeNode runat="server" Text="1">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="2">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="3">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="4">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="5">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="6">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="7">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="8">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="9">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="10">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="11">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="12">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="13">
                        </telerik:RadTreeNode>
                        <telerik:RadTreeNode runat="server" Text="14">
                        </telerik:RadTreeNode>
                    </Nodes>
                </telerik:RadTreeNode>
            </Nodes>
        <ExpandAnimation Type="None" />
            <CollapseAnimation Type="None" />
        </telerik:RadTreeView>
     
    </div>
   <script type="text/javascript">
 
        var timer = null;
         
        function clientLoad(sender) {
            $telerik.$(".riTextBox", sender.get_element().parentNode).bind("keydown", valueChanging);
        }
 
        function valueChanging(sender, args) {
            if(timer)
            {
                clearTimeout(timer);
            }
 
            timer = setTimeout(function() {
                var tree = $find("<%= RadTreeViewFilter1.ClientID %>");
                var textbox = $find("<%= RadTextBoxFilter1.ClientID %>");
                var searchString = textbox.get_element().value;
             
                for (var i = 0; i < tree.get_nodes().get_count(); i++) {
                    findNodes(tree.get_nodes().getNode(i), searchString);
                }
            }, 200);
        }
 
        function findNodes(node, searchString) {
            node.set_expanded(true);
 
            var hasFoundChildren = false;
            for (var i = 0; i < node.get_nodes().get_count(); i++) {
                hasFoundChildren = findNodes(node.get_nodes().getNode(i), searchString) || hasFoundChildren;
            }
 
            if (hasFoundChildren || node.get_text().toLowerCase().indexOf(searchString.toLowerCase()) != -1) {
                node.set_visible(true);
                return true;
            }
            else {
                node.set_visible(false);
                return false;
            }
        }
 
    </script>

Code behind

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace Wizard
{
    public partial class TreeControl : System.Web.UI.UserControl
    {
        public string clientLoad { get; set; }
 
 
 
        protected void Page_PreRender(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(clientLoad))
            {
                ScriptManager.RegisterStartupScript(this, GetType(), "script",
                clientLoad, true);
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
 
        }
    }
}

Wizard

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Default" %>
 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<head runat="server">
    <title></title>
    <telerik:RadStyleSheetManager id="RadStyleSheetManager1" runat="server" />
    <link rel="stylesheet" type="text/css" href="styles.css" />
     
<style type="text/css">
        .rwzContent {
            height: 500px !important;
        }
    </style>
 
</head>
<body>
    <form id="form1" runat="server">
    <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
        <Scripts>
            <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" />
            <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" />
            <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" />
        </Scripts>
    </telerik:RadScriptManager>
    <script type="text/javascript">
        (function () {
 
            window.pageLoad = function () {
                var $ = $telerik.$;
                var cssSelectors = ["accountInfo", "personalInfo", "contactDetails", "confirmation"];
                var breadCrumbButtons = $(".rwzBreadCrumb .rwzLI");
 
                for (var i = 0; i < cssSelectors.length; i++) {
                    $(breadCrumbButtons[i]).addClass(cssSelectors[i]);
                }
            }
 
           
 
            window.AcceptTermsCheckBoxValidation = function (source, args) {
                var termsChecked = $telerik.$("input[id*='AcceptTermsCheckBox']")[0].checked;
                args.IsValid = termsChecked;
            }
 
            window.UserNameLenghthValidation = function (source, args) {
                var userNameConditions = $telerik.$(".conditions")[0];
                var isValid = (args.Value.length >= 4 && args.Value.length <= 15);
                args.IsValid = isValid;
                $telerik.$(userNameConditions).toggleClass("redColor", !isValid);
 
            }
 
            window.PasswordLenghthValidation = function (source, args) {
                var passwordConditions = $telerik.$(".conditions")[1];
                var isValid = args.Value.length >= 6;
                args.IsValid = isValid;
                $telerik.$(passwordConditions).toggleClass("redColor", !isValid);
            }
        })();
 
    </script>
    <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
    </telerik:RadAjaxManager>
      <div class="demo-container">
        <div class="wizardHeader"></div>
        <telerik:RadWizard ID="RadWizard1" runat="server" Height="420px"
            
             OnNextButtonClick="RadWizard1_NextButtonClick"
            OnWizardStepCreated="RadWizard1_WizardStepCreated"
                 DisplayCancelButton="True" OnCancelButtonClick="RadWizard1_CancelButtonClick">
            <WizardSteps>
                <telerik:RadWizardStep ID="RadWizardStep1" Title="Your account" runat="server" StepType="Start" ValidationGroup="accountInfo" CausesValidation="true" SpriteCssClass="accountInfo">
                    
                    <div class="inputWapper first">
                         
                                   
                        <asp:Label Text="User Name: *" runat="server" AssociatedControlID="UserNameTextBox" />
                        <telerik:RadTextBox ID="UserNameTextBox" runat="server" ValidationGroup="accountInfo" Width="320px"></telerik:RadTextBox>
                        <asp:CustomValidator ID="UserNameLenghthValidator" ValidationGroup="accountInfo" runat="server" ControlToValidate="UserNameTextBox" EnableClientScript="true" ClientValidationFunction="UserNameLenghthValidation"></asp:CustomValidator>
                        <asp:RequiredFieldValidator ID="UserNameTextBoxRequiredFieldValidator" runat="server" ControlToValidate="UserNameTextBox" EnableClientScript="true" ValidationGroup="accountInfo" ForeColor="red" ErrorMessage="required field" CssClass="validator"></asp:RequiredFieldValidator>
                        <span class="conditions">Minimum 4 characters, maximum 15 characters.</span>
                    </div>
  
                    <div class="inputWapper">
                        <asp:Label Text="Password: *" runat="server" AssociatedControlID="RadComboBox1" />
                         
                         <telerik:RadComboBox ID="RadComboBox1" Runat="server"  ValidationGroup="accountInfo" Width="320px">
                            <Items>
                                <telerik:RadComboBoxItem runat="server" Text="1" Value="1" />
                                <telerik:RadComboBoxItem runat="server" Text="2" Value="2" />
                                <telerik:RadComboBoxItem runat="server" Text="3" Value="3" />
                            </Items>
                        </telerik:RadComboBox>
                         
                        <asp:RequiredFieldValidator ID="PasswordTextBoxRequiredFieldValidator" runat="server"
                            ControlToValidate="RadComboBox1" EnableClientScript="true" ValidationGroup="accountInfo" ErrorMessage="required field" CssClass="validator"></asp:RequiredFieldValidator>
                        <span class="conditions">The password has to be at least 6 characters long.</span>
                    </div>
                </telerik:RadWizardStep>
  
                
  
            </WizardSteps>
        </telerik:RadWizard>
    </div>
 
    </form>
</body>
</html>
 

Code behind

using System.Web.UI.WebControls;
 
using System.Data;
using System.Configuration;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Telerik.Web.UI;
using Wizard;
 
public partial class Default : System.Web.UI.Page
{
    private static bool _stepCreated = false;
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack && !_stepCreated)
        {
            
            RadWizardStep step2 = new RadWizardStep();
            step2.ID = "Second";
          
 
            RadWizard1.WizardSteps.Add(step2);
 
           
 
            RadWizardStep completeStep = new RadWizardStep();
            completeStep.ID = "Complete";
            
            RadWizard1.WizardSteps.Add(completeStep);
            _stepCreated = true;
            RadComboBox1.Enabled = false;
            RadWizard1.ActiveStepIndex = RadWizard1.WizardSteps[1].Index;
        }
 
    }
 
 
     
 
    protected void RadWizard1_WizardStepCreated(object sender, Telerik.Web.UI.WizardStepCreatedEventArgs e)
    {
        if (e.RadWizardStep.ID == "Complete")
        {
            e.RadWizardStep.StepType = RadWizardStepType.Complete;
            Label label = new Label();
            label.Text = "Registration succeeded!";
            e.RadWizardStep.Controls.Add(label);
        }
        else
        {
             
            Control wizardStepContents = LoadControl("TreeControl.ascx");
            wizardStepContents.ID = e.RadWizardStep.ID + "userControl";
            
          
            e.RadWizardStep.Controls.Add(wizardStepContents);
 
           
        }
    }
    protected void RadWizard1_NextButtonClick(object sender, WizardEventArgs e)
    {
        
    }
 
    protected void RadWizard1_CancelButtonClick(object sender, WizardEventArgs e)
    {
        if (_stepCreated)
        {
            
            RadWizardStep step2 = RadWizard1.WizardSteps[2];
            RadWizard1.WizardSteps.Remove(step2);
            RadWizardStep step1 = RadWizard1.WizardSteps[1];
            RadWizard1.WizardSteps.Remove(step1);
        }
        RadWizard1.ActiveStepIndex = 0;
        RadComboBox1.Enabled = true;
        _stepCreated = false;
 
    }
}

Al
Top achievements
Rank 1
 answered on 10 Dec 2015
1 answer
108 views

Hi

I have a little issue with a custom column i have created for the treelist.

The column is almost working as expected - it can get the value from the datasource, however when the value should be updated back to the database it dosnt happen, althou the ExtraceValues() is called and is returning the new value - i think i might be missing something simple - how you are able to help, thanks.

 

here is the asp markup for the column:

 

<%@ Register TagPrefix="CustomColumns" Namespace="CustomColumns" %>

        <telerik:RadTreeList runat="server" ID="MenuTree" DataSourceID="IPPlanV4Menu" DataKeyNames="MenuID" ParentDataKeyNames="ParentMenuID" AutoGenerateColumns="False" EditMode="InPlace" >
            <Columns>
.....
                <CustomColumns:ValueSetColumn ValueSet="No=0,Yes=1" UniqueName="ForceVisible" HeaderText="Force Visible" DefaultInsertValue="0" DataField="ForceVisible">
                    <HeaderStyle Width="70px" />
                    <ItemStyle Width="60px" />
                </CustomColumns:ValueSetColumn>
                <telerik:TreeListEditCommandColumn AddRecordText="Add" CancelText="Cancel" EditText="Edit" InsertText="Insert" ShowAddButton="true" ShowEditButton="true" HeaderText="">
                    <HeaderStyle Width="70px" />
                </telerik:TreeListEditCommandColumn>
                <telerik:TreeListButtonColumn UniqueName="DeleteCommandColumn" Text="Delete" CommandName="Delete" HeaderText="">
                    <HeaderStyle Width="40px" />
                </telerik:TreeListButtonColumn>
            </Columns>
        </telerik:RadTreeList>

 

and the code for the column with the two item templates

Imports Microsoft.VisualBasic
Imports System
Imports System.Linq
Imports System.Web.UI.WebControls
Imports Telerik.Web.UI

Namespace CustomColumns

    Public Class ValueSetColumn
        Inherits TreeListTemplateColumn
        Private _valueSet As String
        Private ListItems As OrderedDictionary

        Public Property ValueSet As String
            Get
                Return _valueSet
            End Get
            Set(value As String)
                Dim strs As String()
                _valueSet = value
                For Each Str As String In value.Split(",")
                    strs = Str.Split("=")
                    ListItems.Add(strs(0), strs(1))
                Next
            End Set
        End Property

        Public Sub New()
            Me.ListItems = New OrderedDictionary()
            Me.ItemTemplate = New ItemValueSetTemplate(Me)
            Me.EditItemTemplate = New EditValueSetTemplate(Me)
        End Sub

#Region "EditValueSetTemplate"
        Private Class EditValueSetTemplate
            Implements IBindableTemplate
            Private owner As ValueSetColumn = Nothing
            Private ddl As RadDropDownList = Nothing

            Public Sub New(owner As ValueSetColumn)
                Me.owner = owner
            End Sub

            Public Function ExtractValues(container As Control) As IOrderedDictionary Implements IBindableTemplate.ExtractValues
                Dim values As New OrderedDictionary()
                values(owner.DataField) = ddl.SelectedItem.Value
                Return values
            End Function

            Public Sub InstantiateIn(container As Control) Implements ITemplate.InstantiateIn
                ddl = New RadDropDownList()
                ddl.Enabled = True
                ddl.MergeStyle(owner.ItemStyle)
                AddHandler ddl.DataBinding, AddressOf DataBinding
                container.Controls.Add(ddl)
            End Sub

            Private Sub DataBinding(ByVal sender As Object, ByVal e As EventArgs)
                Dim item As DropDownListItem
                Dim DDL As RadDropDownList = DirectCast(sender, RadDropDownList)
                Dim container As TreeListEditableItem = DirectCast(DDL.NamingContainer, TreeListEditableItem)
                Dim selectedvalue As String = DirectCast(container.DataItem, DataRowView)(owner.DataField).ToString()
                DDL.Items.Clear()
                For Each ditem In owner.ListItems
                    item = New DropDownListItem(ditem.Key, ditem.Value)
                    item.Selected = (item.Value = selectedvalue)
                    DDL.Items.Add(item)
                Next
            End Sub
        End Class
#End Region

#Region "ItemValueSetTemplate"
        Private Class ItemValueSetTemplate
            Implements IBindableTemplate
            Private owner As ValueSetColumn = Nothing
            Private ddl As RadDropDownList = Nothing

            Public Sub New(owner As ValueSetColumn)
                Me.owner = owner
            End Sub

            Public Function ExtractValues(container As Control) As IOrderedDictionary Implements IBindableTemplate.ExtractValues
                Dim values As New OrderedDictionary()
                values(owner.DataField) = ddl.SelectedItem.Value
                Return Values
            End Function

            Public Sub InstantiateIn(container As Control) Implements ITemplate.InstantiateIn
                ddl = New RadDropDownList()
                AddHandler ddl.DataBinding, AddressOf DataBinding
                ddl.MergeStyle(owner.ItemStyle)
                ddl.Enabled = False
                container.Controls.Add(ddl)
            End Sub

            Private Sub DataBinding(ByVal sender As Object, ByVal e As EventArgs)
                Dim item As DropDownListItem
                Dim DDL As RadDropDownList = DirectCast(sender, RadDropDownList)
                Dim container As TreeListEditableItem = DirectCast(DDL.NamingContainer, TreeListEditableItem)
                Dim selectedvalue As String = DirectCast(container.DataItem, DataRowView)(owner.DataField).ToString()
                DDL.Items.Clear()
                For Each ditem In owner.ListItems
                    item = New DropDownListItem(ditem.Key, ditem.Value)
                    item.Selected = (item.Value = selectedvalue)
                    DDL.Items.Add(item)
                Next
            End Sub
        End Class
#End Region

    End Class

End Namespace

 

Eyup
Telerik team
 answered on 10 Dec 2015
1 answer
83 views

Hello,

 How I can change the comobobox button and arrow to look like this?

 

Thanks,

Ed

 

Veselin Tsvetanov
Telerik team
 answered on 10 Dec 2015
4 answers
406 views

How to Export RadChart to Excel?

 

Please provide code, Thanks in advance.

Danail Vasilev
Telerik team
 answered on 10 Dec 2015
Narrow your results
Selected tags
Tags
+? more
Top users last month
Will
Top achievements
Rank 2
Iron
Motti
Top achievements
Rank 1
Iron
Hester
Top achievements
Rank 1
Iron
Bob
Top achievements
Rank 3
Iron
Iron
Veteran
Thomas
Top achievements
Rank 2
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Will
Top achievements
Rank 2
Iron
Motti
Top achievements
Rank 1
Iron
Hester
Top achievements
Rank 1
Iron
Bob
Top achievements
Rank 3
Iron
Iron
Veteran
Thomas
Top achievements
Rank 2
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?