Telerik Forums
UI for ASP.NET AJAX Forum
2 answers
126 views
I am defining a Grid Template Column using a label when in display and using a dropdown during edit and "add new". I am doing this exactly as given in example here. There is an important flaw in this example. When editiing, the example selects the Country in the drop down that matches the record that was previously saved, not the Country of the item being edited. Can anyone help me using this example to determine how to pull the Country of the item you are editing and in turn select the appropriate drop down.
Greg Barretta
Top achievements
Rank 1
 answered on 24 Mar 2010
2 answers
139 views
Hi,

I'm trying to do something similar to this example: http://demos.telerik.com/aspnet-ajax/grid/examples/dataediting/popupeditform/defaultcs.aspx

But I can't find the property SelectedValue in the dropdownlist to bind it with the value, like this:

<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Bind("TitleOfCourtesy") %> 
There is another way to do this?

Regards,


Andrés Salinas
Top achievements
Rank 1
 answered on 24 Mar 2010
1 answer
114 views
Hi,

I'm using the WAVE toolbar for firefox to detect accessibility issues with my asp.net pages.

One common issue I've found with RADInputs (textboxes, datepickers etc) is that WAVE highlights the following error:

"A form <input>, <select> or <textarea> does not have a corresponding label (Note:labels are not required for image, submit, reset, button or hidden for element types)."

...now I have a <label for="myctl"> associated with each of my RAD inputs, so I am assuming that the WAVE error is related to the hidden fields that comprise the internals of the RAD input? Indeed, if i remove my <label for=""> elements, I get one more WAVE error per RAD input, so this seems to confirm my thinking.

So is there a simple way to make the hidden fields accessible too, so they don't show up as errors?

Thanks in advance,
Gordopolis

Dimo
Telerik team
 answered on 24 Mar 2010
1 answer
116 views
Hi
,i have two problem.

first ;

i put a button within a grid's line like this
<MasterTableView TableLayout="Fixed" ClientDataKeyNames="Myid">

<ItemTemplate>

<asp:button ID="mybut" runat="server" Text="Mytext" OnClientClick="Myfunc()" />

</ItemTemplate>

</MasterTableView>
...


and put a javascript named Myfunc in my asp code.

all they ok.
but i want to retrieve the myid value of the record that belongs to the row that user clicked the button within Myfunc() script with client javascript

the second problem is

i open a Window with radopen in my script named Myfunc like this

radopen ("MySecondPage.Aspx", "Mywin")

on firefox it opens the window when user clicked the button wihin the row
and after closing the modal window it stays on the record which user clicked.

but on ie it goes to the top of the page.

i searched the forum all the answers are make the grid scrollable but i  dont want to do it scrollable.
isn't there another way ?.. and is there a bug or problem in telerik rad components ?..

best regards






fer
Top achievements
Rank 1
 answered on 24 Mar 2010
5 answers
399 views
Hi,

I'm trying to input schedule data into a RadScheduler that comes from a foreign system. For the purposes of this exercise let's just say it schedule data being imported into my App's SQL DB from another SQL server DB.

I have my own business object data layer and have an object called WorkSchedule which contains an instance of a class that contains multiple instances of another object called WorkScheduleTimeCollection (as an ArrayList). WorkScheduleTImeCollection in essence contains multiple instances of the class WorkScheduleTime (which is for all intents and purposes an object to represent an Appointment), this collection can thus be bound as a DataSource to RadScheduler.

When WorkScheduleTimeCollection is populated with data, an instance of a RadScheduler Recurrence Rule is created, both it and its string representation have been added as properties to the WorkScheduleTime Class. WorkScheduleTime also contains general data (like "Name" and "UniqueID"), as well as a StartTime and EndTime.

Also note I did find that formatting the RecurrenceRule string representation as discussed here: http://www.telerik.com/community/forums/aspnet-ajax/scheduler/daily-recurrence-string-is-correct.aspx to be useful.

Therefore I am attempting to bind this data to the RadScheduler as such:

With rsSchedule 
 
    Dim stcWorkSchedule As New WorkScheduleTimeCollection
    stcWorkSchedule = Database.SelectWorkScheduleTimes(ScheduleUniqueID, .VisibleRangeStart, .VisibleRangeEnd, True) 
 
    .DataSource = stcWorkSchedule 
    .DataKeyField = "UniqueID" 
    .DataSubjectField = "Name" 
    .DataStartField = "StartTime" 
    .DataEndField = "EndTime" 
    .DataRecurrenceParentKeyField = "UniqueID" 
    .DataRecurrenceField = "RecurrenceRuleValue" 
    .DataBind()                 
 
End With 

In the code the first line simply retrieves the collection of "appointment" objects in the current schedule from a database method for the current visible range, and then it is bound to the RadScheduler

Here is an example of what kind of data would be in a typical WorkScheduleTime Appointment object, including the recurrence rule:

ID: 562
UniqueID: 562.008
Name: 562.008
DateActiveFrom: 1/1/2000 12:00:00 AM
DateActiveTo: 1/1/2099 12:00:00 AM
StartTime: 1/1/2000 12:34:00 PM (UTC)
EndTime: 1/1/2000 1:10:00 PM (UTC)
DayFrequency: M,T,W,U,F
RecurrenceRuleValue: DTSTART:20000101T000000Z/r/nDTEND:20000101T003600Z/r/nRRULE:FREQ=WEEKLY;UNTIL=20990101T000000Z;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR/r/n

Here is (a simplified example of, but the same lines of code exist in the actual method of) how the recurrence rule is created, BTW:
 
Private Function CreateRecurrenceRule(wstTime As WorkScheduleTime) As WorkScheduleTime

    With wstTime 
       
        Dim rrRange As New RecurrenceRange() 
        rrRange.Start = .DateActiveFrom 
        rrRange.RecursUntil = .DateActiveTo 
        rrRange.EventDuration = .EndTime - .StartTime 
 
        'Here ".DayFrequency" is a class of boolean values representing the 7 character comma delimited day
        'frequency list I receive from the foreign schedule data, that class is "converted" to the Telerik
        'RecurrenceDay object.
        Dim rdDays As RecurrenceDay = Me.BuildScheduleDayRecurrence(.DayFrequency) 
 
        Dim wrRule As New WeeklyRecurrenceRule(1, rdDays, rrRange) 
 
        .RecurrenceRule = wrRule 
        .RecurrenceRuleValue = wrRule.ToString 
        .RecurrenceRuleValue = .RecurrenceRuleValue.Replace(vbCr, "/r") 
        .RecurrenceRuleValue = .RecurrenceRuleValue.Replace(vbLf, "/n") 
 
    End With 
 
    Return wstTime
End Sub 
 
 
 

Now my problem is, when the page loads all I get is one instance of each appointment created on the start date (DateActiveFrom) of the appointment and no others (it just so happens 1/1/2000 is a Saturday so the recurrence is truly not working correctly as these appointments almost always happen during the week as does the example). In essence the above example appointment does not recur every week day on M/W/T/U/F at 12:34p - 1:10p from 1/1/2000 - 1/1/2099. And at this point I'm not sure why.

The scheduler does see the appointment as a recurring appointment and will attempt to edit the individual occurence but If I try to "edit" the whole series the control breaks citing "not an instance of an object".

Any help would be appreciated, a trouble ticket can be submitted if that becomes necessary.

Thanks!

T. Tsonev
Telerik team
 answered on 24 Mar 2010
7 answers
171 views
Hi,

I am trying to figure out how to disable the "active row" functionality.  I have no need for an active row, but i want to do keyboard up down selection.  I want it to be selected, not activated.  I want no distinction between an active row and a selected row.  I have tried javascript functions like

set_activeRow

and

grid.MasterTableView.SetActiveRow

Each of these does nothing.  Can i just disable the active row concept all together?
Mira
Telerik team
 answered on 24 Mar 2010
4 answers
347 views
I really like how the RegEx Text Boxes behave when their validation is required.  If I load my page and just click submit right away every RegEx box I have on the form that is required pops up the little exclaimation point, displays my error message, and won't let them use submit until they put something into each required field that satisfies the Regular Expression.

I would like my various date boxes to do the same... right now the user can fill in all required RegEx text boxes and click submit and the page will let them, despite having blank required date fields.  I know I could write some little Javascript function, or use the ASP.Net field validators, but I'd rather keep everything consistent and use the Telerik-style validations if possible.

So is there a way I can make the DatePicker require some input and if the user leaves the filed blank and clicks away, or tries to submit the form with nothing in the required Date Picker field, then have it display the exclaimation icon inside the DatePicker field and stop the submission?
T. Tsonev
Telerik team
 answered on 24 Mar 2010
2 answers
94 views
I want to not only style the row being edited when using InPlace edition (using <EditItemStyle/>) but I also need to change the placement and add some additional text to the "Update Cancel" link buttons.

What I need to do is make that: "Cancel | Save" instead. Basically reversing the position and adding a pipe character between. So, I'm guessing that I need some sort of EditItemTemplate but there doesn't seem to be one available.

Do you have any samples that come close to the modifications I need to do to the link buttons?

Thanks.
Charles
Top achievements
Rank 2
 answered on 24 Mar 2010
1 answer
166 views
Hi ,

I am making a UserControl having Nested RadGrid, Everything is made dynamically in codebehind. I am adding Edit button to ParentTable in ItemDatabound. When i expand parentrow my ParentRow Edit button binding is gone.

NeedDataSource of ParentGrid is not firing. These are my Grid Event
#region Grid Events  
 
        protected void RadGridNestedControl_DetailTableDataBind(object source, Telerik.Web.UI.GridDetailTableDataBindEventArgs e)  
        {     
            GridDataItem dataItem = (GridDataItem)e.DetailTableView.ParentItem;  
            string strParentRelationID = dataItem.GetDataKeyValue(this.ParentRelationColumn).ToString();  
            e.DetailTableView.DataSource = Source.Tables[1].Select(ChildRelationColumn + "=" + strParentRelationID);  
            RadGrid obj = (RadGrid)source ;  
            //obj.Rebind();  
        }  
          
        protected void RadGridNestedControl_ItemDataBound(object source, Telerik.Web.UI.GridItemEventArgs e)  
        {  
            if (this.PageType == (int)PageName.HeaderFooterListing)  
            {  
                if (e.Item is GridDataItem && e.Item.OwnerTableView.Name == "ParentView")  
                {  
                    GridDataItem dataItem = e.Item as GridDataItem;  
                    GridTableCell wgColEdit = (GridTableCell)dataItem["Edit"];  
 
                    if (wgColEdit != null)  
                    {  
                        //Creating QueryString  
                        string[] editParam = this.NavigationEditParameters;  
                        string strQueryString = string.Empty;  
                        foreach (string str in editParam)  
                        {  
                            if (dataItem[str] != null)  
                            {  
                                if (dataItem[str].Text != "&nbsp;")  
                                    strQueryString += str + "=" + dataItem[str].Text + "&";  
                                else  
                                    strQueryString += str + "=" + ServiceNet.BLL.Global.NullInteger.ToString() + "&";  
                            }  
                        }  
                        strQueryString += "PKSourceClientID=" + intClientID;  
 
                        wgColEdit.HorizontalAlign = HorizontalAlign.Center;  
                        (wgColEdit.Controls[0] as ImageButton).Style.Add("Cursor", "Pointer");  
                        wgColEdit.ToolTip = ResourceLang.GetString("C_Edit");  
                        string url = ((ServiceNet.Web.BasePage)Page).ImagesLocation + "btn_edit_small" + ((ServiceNet.Web.BasePage)Page).ImageExtension;  
                        wgColEdit.Text = "<a href='" + this.NavigationEditURL + "?" + strQueryString + "' ><img src='" + url + "'  OnMouseOver=ChangeImage(this,'btn_edit_small',1) OnMouseOut=ChangeImage(this,'btn_edit_small',2) OnMouseDown=ChangeImage(this,'btn_edit_small',3) OnMouseUp=ChangeImage(this,'btn_edit_small',4) onKeyDown=ChangeImage(this,'btn_edit_small',5)   OnKeyUp=ChangeImage(this,'btn_edit_small',6)></a>";  
                    }  
 
                }  
 
                if (e.Item is GridDataItem && e.Item.OwnerTableView.Name == "ChildView")  
                {  
                    GridDataItem dataItem = e.Item as GridDataItem;  
                    GridTableCell wgColPreview = (GridTableCell)dataItem["Add"];  
 
                    if (wgColPreview != null)  
                    {  
                        int intPKID = Convert.ToInt32(dataItem.GetDataKeyValue(this.ChildRelationColumn).ToString());  
                        int intTypeValueID = ServiceNet.BLL.Global.NullInteger;  
                        int intPKUserSourceID = ServiceNet.BLL.Global.NullInteger;  
                        int intPopUpHeight = ServiceNet.BLL.Global.NullInteger;  
                        int intPopUpWidth = ServiceNet.BLL.Global.NullInteger;  
 
                        string strDisplayText = dataItem["DisplayText"].Text;  
 
                        //Getting ParentRow Data  
                        DataRow[] drParent = Source.Tables[0].Select("PKID =" + intPKID);  
                        if (drParent != null && drParent.Length > 0)  
                        {  
                            intTypeValueID = DatabaseHelper.GetNullableInt32(drParent[0], "TypeValueID");  
                            intPKUserSourceID = DatabaseHelper.GetNullableInt32(drParent[0], "PKUserSourceID");  
                            intPopUpHeight = DatabaseHelper.GetNullableInt32(drParent[0], "PopUpHeight");  
                            intPopUpWidth = DatabaseHelper.GetNullableInt32(drParent[0], "PopUpWidth");  
                        }  
 
 
                        wgColPreview.HorizontalAlign = HorizontalAlign.Center;  
                        wgColPreview.ToolTip = ResourceLang.GetString("C_Preview");  
                        string url = ((ServiceNet.Web.BasePage)Page).ImagesLocation + "btn_ViewSchedules" + ((ServiceNet.Web.BasePage)Page).ImageExtension;  
                        wgColPreview.Text = "<a href='# style=cursor:hand;'><img onclick=\"javascript:ShowDataPopUp('" + this.ControlSessionData.LoggedUserPreferences.LanguageID + "','" + intTypeValueID + "','" + strDisplayText + "','" + intPKUserSourceID + "','" + intPopUpHeight + "','" + intPopUpWidth + "');\" src='" + url + "'  OnMouseOver=ChangeImage(this,'btn_ViewSchedules',1) OnMouseOut=ChangeImage(this,'btn_ViewSchedules',2) OnMouseDown=ChangeImage(this,'btn_ViewSchedules',3) OnMouseUp=ChangeImage(this,'btn_ViewSchedules',4) onKeyDown=ChangeImage(this,'btn_ViewSchedules',5)   OnKeyUp=ChangeImage(this,'btn_ViewSchedules',6)></a>";  
                    }  
                }  
            }  
        }  
                
        protected void RadGridNestedControl_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e)  
        {  
            //if (!e.IsFromDetailTable)  
            //{     
            //    LoadData(this.Source);                  
            //}  
        }  
 
        #endregion 



This is my LoadGrid Event which is fired from Page_Load()

public void LoadData(DataSet dsSource)  
        {  
 
            this.RadGridNestedControl = new RadGrid();  
 
            this.RadGridNestedControl.ID = "RadGrid1";  
            this.RadGridNestedControl.NeedDataSource += new GridNeedDataSourceEventHandler(this.RadGridNestedControl_NeedDataSource);  
            this.RadGridNestedControl.DetailTableDataBind += new GridDetailTableDataBindEventHandler(this.RadGridNestedControl_DetailTableDataBind);  
            this.RadGridNestedControl.ItemDataBound += new GridItemEventHandler(this.RadGridNestedControl_ItemDataBound);  
 
            this.RadGridNestedControl.EnableEmbeddedScripts = true;  
 
            this.RadGridNestedControl.Width = Unit.Percentage(100);  
            thisthis.RadGridNestedControl.PageSize = this.ParentNumberofRecords;  
            this.RadGridNestedControl.AllowPaging = true;  
            this.RadGridNestedControl.AllowSorting = true;  
            this.RadGridNestedControl.AutoGenerateColumns = false;  
 
            if (this.Source != null)  
            {  
 
                RadGridNestedControl.DataSource = dsSource.Tables[0];  
                RadGridNestedControl.MasterTableView.DataKeyNames = new string[] { this.ParentRelationColumn };  
                RadGridNestedControl.MasterTableView.Name = "ParentView";  
 
                //Creating Columns  
                foreach (DataColumn dcol in dsSource.Tables[0].Columns)  
                {  
                    if (this.ParentExcludedFields != ServiceNet.BLL.Global.NullString)  
                    {  
                        if (this.ParentExcludedFields.IndexOf("," + dcol.ColumnName.ToUpper() + ",") < 0)  
                        {  
                            if (this.ResourceLangPrefix != null && this.ResourceLangPrefix != "")  
                                dcol.Caption = ResourceLang.GetString(this.ResourceLangPrefix + "_" + dcol.ColumnName);  
                            else  
                                dcol.Caption = ResourceLang.GetString(dcol.ColumnName);  
                            if (dcol.Caption == string.Empty)  
                                dcoldcol.Caption = dcol.ColumnName;  
                            GridBoundColumn wgCol = new GridBoundColumn();  
                            RadGridNestedControl.MasterTableView.Columns.Add(wgCol);  
                            wgCol.DataField = dcol.ColumnName;  
                            wgCol.HeaderText = dcol.Caption;  
                            wgCol.UniqueName = dcol.ColumnName;  
                            wgCol.AllowSorting = true;  
                        }  
                        else  
                        {  
                            GridBoundColumn wgCol = new GridBoundColumn();  
                            RadGridNestedControl.MasterTableView.Columns.Add(wgCol);  
                            wgCol.DataField = dcol.ColumnName;  
                            wgCol.Display = false;  
                        }  
                    }  
                    else  
                    {  
                        dcol.Caption = ResourceLang.GetString(this.ResourceLangPrefix + "_" + dcol.ColumnName);  
                        if (dcol.Caption == string.Empty)  
                            dcoldcol.Caption = dcol.ColumnName;  
                        GridBoundColumn wgCol = new GridBoundColumn();  
                        RadGridNestedControl.MasterTableView.Columns.Add(wgCol);  
                        wgCol.DataField = dcol.ColumnName;  
                        wgCol.HeaderText = dcol.Caption;  
                        wgCol.UniqueName = dcol.ColumnName;  
                        wgCol.AllowSorting = true;  
                    }  
 
                }  
 
                  
                //Adding Buttons to ParentGrid  
                if (this.IsParentRecordEditButton)  
                    AddButtonColumnsToGrid("Edit", ResourceLang.GetString("C_Edit"));  
 
 
                if (this.IsParentRecordAddButton)  
                    AddButtonColumnsToGrid("Add", ResourceLang.GetString("C_Add"));  
 
                if (this.IsParentRecordDeleteButton)  
                    AddButtonColumnsToGrid("Delete", ResourceLang.GetString("C_Delete"));  
                  
 
                //Detail Table  
                GridTableView tableDetailView = new GridTableView(RadGridNestedControl);  
                tableDetailView.Width = Unit.Percentage(100);  
                tableDetailView.DataSource = dsSource.Tables[1];  
                tableDetailView.DataKeyNames = new string[] { this.ChildRelationColumn };  
                tableDetailView.PageSize = this.ChildNumberofRecords;  
                tableDetailView.Name = "ChildView";  
 
                GridRelationFields relationFields = new GridRelationFields();  
                relationFields.MasterKeyField = this.ParentRelationColumn;  
                relationFields.DetailKeyField = this.ChildRelationColumn;  
                tableDetailView.ParentTableRelation.Add(relationFields);  
 
                //Creating Child Columns  
                foreach (DataColumn dcol in dsSource.Tables[1].Columns)  
                {  
                    if (this.ChildExcludedFields != ServiceNet.BLL.Global.NullString)  
                    {  
                        if (this.ChildExcludedFields.IndexOf("," + dcol.ColumnName.ToUpper() + ",") < 0)  
                        {  
                            if (this.ResourceLangPrefix != null && this.ResourceLangPrefix != "")  
                                dcol.Caption = ResourceLang.GetString(this.ResourceLangPrefix + "_" + dcol.ColumnName);  
                            else  
                                dcol.Caption = ResourceLang.GetString(dcol.ColumnName);  
                            if (dcol.Caption == string.Empty)  
                                dcoldcol.Caption = dcol.ColumnName;  
                            GridBoundColumn wgCol = new GridBoundColumn();  
                            wgCol.DataField = dcol.ColumnName;  
                            wgCol.HeaderText = dcol.Caption;  
                            wgCol.UniqueName = dcol.ColumnName;  
                            wgCol.AllowSorting = true;  
                            tableDetailView.Columns.Add(wgCol);  
 
                        }  
                        else  
                        {  
                            GridBoundColumn wgCol = new GridBoundColumn();  
                            tableDetailView.Columns.Add(wgCol);  
                            wgCol.DataField = dcol.ColumnName;  
                            wgCol.Display = false;  
                        }  
                    }  
                    else  
                    {  
                        dcol.Caption = ResourceLang.GetString(this.ResourceLangPrefix + "_" + dcol.ColumnName);  
                        if (dcol.Caption == string.Empty)  
                            dcoldcol.Caption = dcol.ColumnName;  
                        GridBoundColumn wgCol = new GridBoundColumn();  
                        wgCol.DataField = dcol.ColumnName;  
                        wgCol.HeaderText = dcol.Caption;  
                        wgCol.UniqueName = dcol.ColumnName;  
                        wgCol.AllowSorting = true;  
                        tableDetailView.Columns.Add(wgCol);  
                    }  
                }  
 
                //Adding Buttons to ChildGrid  
                if (this.IsChildRecordAddButton)  
                    AddButtonColumnsToChildGrid("Add", ResourceLang.GetString("C_Add"), tableDetailView);  
 
                if (this.IsChildRecordEditButton)  
                    AddButtonColumnsToChildGrid("Edit", ResourceLang.GetString("C_Edit"), tableDetailView);  
 
                if (this.IsChildRecordDeleteButton)  
                    AddButtonColumnsToChildGrid("Delete", ResourceLang.GetString("C_Delete"), tableDetailView);  
 
                RadGridNestedControl.MasterTableView.DetailTables.Add(tableDetailView);  
                this.PlaceHolder1.Controls.Add(RadGridNestedControl);  
            }  
        } 

DataSource is passed from Page to the Control through properties of UserControl. So it is not available on Page_Init for the UserControl.

Attached are the screenshots : Beforeexpand - all looks fine. But AfterExpand, the ParentTableRow is not binded. So the images for the added buttons as well as click events are gone.

Please tell me what is missing and how to get it running.

Thanks a lot.

Best Regards,
Veenu Munjal


Radoslav
Telerik team
 answered on 24 Mar 2010
4 answers
106 views
We did some tests, as our site is leaking a lot of memory.
Took code from your documentation for example, nothing else

<

 

telerik:RadMenu ID="RadMenu1" runat="server" Flow="Horizontal">

 

 

<Items>

 

 

<telerik:RadMenuItem runat="server" Text="Root Item 1">

 

 

<Items>

 

 

<telerik:RadMenuItem runat="server" Text="Child Item 1">

 

 

<Items>

 

 

<telerik:RadMenuItem runat="server" Text="Child Item 1.1" />

 

 

<telerik:RadMenuItem runat="server" Text="Child Item 1.2" />

 

 

</Items>

 

 

</telerik:RadMenuItem>

 

 

<telerik:RadMenuItem runat="server" Text="Child Item 2" />

 

 

</Items>

 

 

</telerik:RadMenuItem>

 

 

<telerik:RadMenuItem runat="server" Text="Root Item 2">

 

 

<Items>

 

 

<telerik:RadMenuItem runat="server" Text="Child Item 2.1" />

 

 

</Items>

 

 

</telerik:RadMenuItem>

 

 

</Items>

 

</

 

telerik:RadMenu>

 


and added a submit button, every time you submit you have huge spike of memory that never gets released, before you know it it is gearing up to 1GB. Please advise.
T. Tsonev
Telerik team
 answered on 24 Mar 2010
Narrow your results
Selected tags
Tags
+? more
Top users last month
Jake
Top achievements
Rank 1
RBarnes
Top achievements
Rank 1
Iron
Iron
Rami
Top achievements
Rank 1
Iron
Veteran
Nathan
Top achievements
Rank 1
Kumeri
Top achievements
Rank 1
Iron
Veteran
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Jake
Top achievements
Rank 1
RBarnes
Top achievements
Rank 1
Iron
Iron
Rami
Top achievements
Rank 1
Iron
Veteran
Nathan
Top achievements
Rank 1
Kumeri
Top achievements
Rank 1
Iron
Veteran
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?