Telerik Forums
Kendo UI for jQuery Forum
1 answer
999 views
Hi Everyone,

I'm the lead developer on an ASP.NET WebForms project (Sadly, this choice was mine just prior to my arrival and the lead at the time left shortly thereafter leaving me stuck with a less than preferred ASP.NET option).
Anyways, I recently recommended purchase of 2 licenses for the DevCraft Complete package to my employeer. One license is mine while the other goes to another developer who strongly prefers the ASP.NET AJAX controls for WebForms. We're both preparing some proof of concepts to present to the project manager. I need to show that using Kendo UI with MVVM  will offer better performance both client and server side, less latency, less bandwidth and the easiest to learn for our other developers.

I need to create a simple read-only page which uses two models . For each Category I need to display the Name. Just under this header, For each Ticket associated with this category, I need to display the Name and Date of submission for the 20 most recent tickets (I intend to use serverPaging on the DataSource). I then want to attach a click handler to each Ticket Name which will make a call and pass the ID of this Ticket causing the system to return the content for this ticket which will be displayed in a pop-up window.

As my business objects typically contain more properties than I need for a given page - we're creating the JSON models separately. (Fig 1a & 1b respectively)

What I first tried was creating a web service call which returns  an array of Category objects which each contain the Tickets associated with that Category. The JSON for this can be seen in Fig 2.

I've found mixed examples switching between a standard DataSource and a HierarchicalDataSource for this scenario. My current javascript can be seen in Fig 3.

Finally the MVVM portion -- the HTML can be seen in Fig 4. I don't feel this is too complex but it seems some I'm missing a few things. When I run this, only the Categories JSON is returned and no binding occurs. No errors are thrown either.

These are the entity models server side:
Fig. 1a
01.namespace ProofOfConcept.BO
02.{
03.    public class Ticket
04.    {
05.        public int ID { get;set; }
06.        public int CategoryID { get;set; }
07.        public string Name { get;set; }
08.        public string Content { get;set; }
09.        public DateTime DateSubmitted { get;set; }
10.    }
11. 
12.    public class Category
13.    {
14.        public int ID { get;set; }
15.        public string Name { get;set; }
16.        public List<Ticket> Tickets { get;set; }
17.    }
18.}



These are the models which I serialize into JSON. I read that I should modify them as shown below -- see comments.

Fig 1b
01.namespace ProofOfConcept.JSONModels
02.{
03. 
04.    public class Ticket
05.    {
06.        // Key values are encrypted into a string before being sent to the client
07.        public string ID { get;set; }
08.        public string CategoryID { get;set; }
09.        public string Name { get;set; }
10.        public string Content { get;set; }
11. 
12.        // I would prefer a DateTime value but I don't know if
13.        // converting the value and displaying it properly is supported
14.        public string DateSubmitted { get; set; }
15.    }
16. 
17.    public class Category
18.    {
19.        // Key values are encrypted into a string before being sent to the client
20.        public string ID { get;set; }
21.        public string Name { get;set; }
22.     
23.        // I read that the property for the nested object(s) should
24.        // be removed from the JSON model -- is this correct? 
25.        // public List<Ticket> Tickets { get;set; }
26.    }
27. 
28.}

Is it possible that I can just send all the data across in this format from just one handler and have the MVVM function with the nested templates? or am I correct that I must use a HierarchicalDataSource? If so, do I have it correctly implemented as shown below?

Fig 2
01.[
02.    {
03.        "ID": "1",
04.        "Name": "CategoryName1",
05.        "Tickets": [
06.            {
07.                "ID": "10",
08.                "Name": "name value",
09.                "CategoryID": "1",
10.                "Content": "content here",
11.                "DateSubmitted": "serialized DateTime here"
12.            },
13.            {
14.                "ID": "11",
15.                "Name": "name value",
16.                "CategoryID": "1",
17.                "Content": "content here",
18.                "DateSubmitted": "serialized DateTime here"
19.            },
20.            {
21.                "ID": "12",
22.                "Name": "name value",
23.                "CategoryID": "1",
24.                "Content": "content here",
25.                "DateSubmitted": "serialized DateTime here"
26.            }
27.        ]
28.    }, // ... Removed for readability
29.]

This is the javascript I've got so far -- I've bounced between a simple DataSource and a HierarchicalDataSource but I've been unable to find enough examples on this site (with the documentation and forums) that nail down a concrete implementation.

Fig 3
01.$(document).ready(function ()
02.{
03.    // Objects are defined individually as I want to create
04.    // a single file with all object definitions so that other
05.    // developers can recycle them.
06.    var Ticket = kendo.data.Model.define(
07.    {
08.        id: "ID",
09.        fields:
10.        {
11.            ID: { type: "string" },
12.            CategoryID: { type: "string" },
13.            Name: { type: "string" },
14.            Content: { type: "string" },
15. 
16.            // Is there a Date (or DateTime) type?
17.            DateSubmitted: { type: "string" },
18.            hasChildren: false
19.        }
20.    });
21. 
22.    var Category = kendo.data.Model.define(
23.    {
24.        id: "ID",
25.        fields:
26.        {
27.            ID: { type: "string" },
28.            Name: { type: "string" },
29.            hasChildren: true,
30.            children: Tickets
31.        }
32.    });
33. 
34.    // The ID of the Category is passed to the handler 
35.    // in this format: Tickets.ashx?CID=2
36.    // If possible, I'd also like to pass the ID of the ticket,
37.    // Tickets.ashx?ID=44 which would return the full Ticket (ie: with Content)
38.    var Tickets =
39.    {
40.        transport:
41.        {
42.            read:
43.            {
44.                 url: "Tickets.ashx",
45.                 type: "GET",
46.                 dataType: "json",
47.                 contentType: "application/json; charset=utf-8"
48.            }
49.         },
50.         schema:
51.         {
52.            data: "d",
53.            model: Ticket
54.         }
55.    };
56. 
57. 
58.    var Categories = new kendo.data.HierarchicalDataSource(
59.    {
60.        transport:
61.        {
62.            read:
63.            {
64.                url: "Categories.ashx",
65.                type: "GET",
66.                dataType: "json",
67.                contentType: "application/json; charset=utf-8"
68.            }
69.        },
70.        schema:
71.        {
72.            data: "d",
73.            model: Category
74.        }
75.    });
76. 
77. 
78.    var viewModel = kendo.observableHierarchy(
79.    {
80.            Categories: Categories
81.    });
82. 
83.    kendo.bind($("#divCategory"), viewModel);
84. 
85.});
Fig 4
01.<section>
02. 
03.   <div id="divCategory" data-template="category-template" data-bind="source: Categories" >
04.       <ul data-template="ticket-template" data-bind="source: Tickets" id="divTicket">
05.       </ul>
06.   </div>
07. 
08.   <script id="category-template" type="text/x-kendo-template">
09.       <h2 data-bind="text: Name"></h2>
10.   </script>
11. 
12. <script id="ticket-template" type="text/x-kendo-template">
13.       <li>
14.           <a data-bind="attr: { href: ID }">
15.               <span data-bind="text: Name" ></span>
16.           </a>
17.           <span data-bind="text: DateSubmitted" ></span>
18.       </li>
19. </script>
20. 
21.</section>

I look forward to your reply.

Thank you,
Daniel
Telerik team
 answered on 24 Jul 2013
1 answer
277 views
What I want is to list all books in a ListView. Then, clicking a button related with a category, I want to filter them. All books are loaded in the client side (there are not many). Server is not called for filtering.  

When I press a button, the following function is called:

function filterByCategory() {
 var list = $("#reportlistview").data("kendoListView");
  list.dataSource.filter({
field: "Category",
operator: "contains",
value: "xx"
});
}

I expected that the ListView only shows items with Category=xx, but the listview does not change. It continuous showing all books.

The ListView is created with:

@(Html.Kendo().ListView<Books>(Model)
.Name("reportlistview")
.TagName("div")
.ClientTemplateId("template")
.Selectable()



What am I doing wrong?

Thank you

Dimiter Madjarov
Telerik team
 answered on 24 Jul 2013
2 answers
220 views
Is it possible to post data back to a controller using a FormCollection object? I would like a user to be able to open a kendo window and select, by way of a checkbox, multiple entries. Then close the window, change data on the parent page and then submit the form (note: the kendo window div exists inside the form). I can get the kendo window to open and display all the data via a listview but I'm not sure how to get the checkbox values (the only piece of the kendo window the user can edit) back to my controller. I suspect kendo might be destroying all the data selected when the window is closed (note: I do not call the destroy command on the window) so I figured I could always create a bunch of hidden fields on the parent page and update them as the user checks off the check boxes but I was trying to avoid that.

I can always change my controller to a DataSource Object but I'd like to avoid rewriting code. The controller called is 
[HttpPost]
ActionResult BrowseTeeTimes(string club FormCollection formData)
Kelly
Top achievements
Rank 1
 answered on 24 Jul 2013
4 answers
179 views
Kendo Devs,

I am looking to display one line and one bar series upon the same set of axes, however each will pull from a different API URL, therefore does anyone know how to combine two DataSources into one chart?

Below is my code so far; the bar series (dataseries1) successfully pulls data from the API  and plots it as a bar chart on the axes; I have manually extracted Y values for the line series and passed them in as a .data array as you will see in the code; in an ideal world, i would like to be able to add 'dataSource: dataseries1,'  into the  line series. The commented out data is what the API returns.

// var dataseries1 = {"Id":4,"Legend":"Label","Description":"Description","DataSeries":{"Data":[{"X":"22","Y":[26000.0]},{"X":"79","Y":[24000.0]},{"X":"70","Y":[23400.0]},{"X":"34","Y":[22500.0]},{"X":"29","Y":[22050.0]},{"X":"10","Y":[21666.666666666668]},{"X":"42","Y":[20200.0]},{"X":"32","Y":[19500.0]},{"X":"59","Y":[19000.0]},{"X":"23","Y":[19000.0]},{"X":"80","Y":[18888.888888888891]},{"X":"19","Y":[18750.0]},{"X":"21","Y":[17399.909677419353]},{"X":"40","Y":[16227.272727272728]},{"X":"99","Y":[16028.571428571429]},{"X":"50","Y":[15000.0]},{"X":"11","Y":[14833.333333333334]},{"X":"60","Y":[14272.727272727272]},{"X":"61","Y":[13000.0]},{"X":"89","Y":[13000.0]},{"X":"82","Y":[12611.952380952382]},{"X":"33","Y":[12000.0]}]}};
            var dataseries1 = new kendo.data.DataSource({
                transport: {
                    read: {
                        url: "APIURL",
                        dataType: "json",
                    }
                },
                schema: { data: function(response) { return response.DataSeries.Data; } }
            });
            // var dataseries2 = {"Id":5,"Legend":"Label","Description":"Description","DataSeries":{"Data":[{"X":"22","Y":[2]},{"X":"79","Y":[3]},{"X":"70","Y":[5]},{"X":"34","Y":[2]},{"X":"29","Y":[20]},{"X":"10","Y":[3]},{"X":"42","Y":[5]},{"X":"32","Y":[2]},{"X":"59","Y":[3]},{"X":"23","Y":[1]},{"X":"80","Y":[9]},{"X":"19","Y":[4]},{"X":"21","Y":[155]},{"X":"40","Y":[22]},{"X":"99","Y":[420]},{"X":"50","Y":[10]},{"X":"11","Y":[6]},{"X":"60","Y":[11]},{"X":"61","Y":[1]},{"X":"89","Y":[1]},{"X":"82","Y":[21]},{"X":"33","Y":[1]}]}};
            var dataseries2 = new kendo.data.DataSource({
                transport: {
                    read: {
                        url: "APIURL",
                        dataType: "json",
                    }
                },
                schema: { data: function(response) { return response.DataSeries.Data; } }
            });
            $("#chart").kendoChart({
                title: { text: "TITLE" },
                dataSource: dataseries1,
                series: [
                    { type: "column", field: "Y[0]", name: "NAME", axis: "LABEL", visibleInLegend: false },
                    { type: "line", name: "NAME", visibleInLegend: false, axis: "LABEL", data: [ 2, 3, 5, 2, 20, 3, 5, 2, 3, 1, 9, 4, 155, 22, 420, 10, 6, 11, 1, 1, 21, 1 ]  }
                ],
                categoryAxis: { field: "X", title: { text: "LABEL" }, axisCrossingValue: [0, 99999999] },
                valueAxis: [
                    { name: "LABEL", title: { text: "UNITS" } },
                    { name: "LABEL", title: { text: "UNITS" } }
 
                ],
                tooltip: { visible: true }
            });


Thanks in advance,
Jamie
Jamie
Top achievements
Rank 1
 answered on 24 Jul 2013
2 answers
145 views
Hi, I am having a problem with the groupping of the telerik grid, in firefox is working, in IE8 is infinity loading, and it trows the error:

Line: 8
Error: 'aggregates' is null or not an object
 'length' is null or not an object


  @( Html.Kendo().Grid(Model)

                   .Name("Grid")
                   .ClientDetailTemplateId("inventoryTemplate")

                   .DataSource(ds => ds.Ajax()
                                   //TODO: Problem in here
                                   .Group(g => g.Add(c => c.GradeCode))
                                   .PageSize(50)
                                   
                                   .Sort(sort => {
                                       sort.Add(p => p.SizeThick).Ascending();
                                       sort.Add(p => p.SizeLength).Ascending();
                                       sort.Add(p => p.SizeWidth).Ascending();
                                       })
                                             //.Aggregates(aggregates =>
                                             //{
                                             //    aggregates.Add(x => x.GradeID);
                                             //})
                                    
                                   .Model(m =>
                                   {
                                       m.Id(p => p.StockID);
                                       m.Field(p => p.QuantityToEnquiry).DefaultValue(1);
                                   })
                           .Read(r => r.Action("Read", "Home"))
                   )

                        .ToolBar(toolBar =>
                                   toolBar.Custom()
                                       .HtmlAttributes(new { id = "sendEnquiry" })
                                       .Text("Send Enquiry")

                               )
                           .ToolBar(toolBar =>
                                       toolBar.Custom()
                                           .HtmlAttributes(new { id = "clearFilter" })
                                           .Text("Reset Filters")

                                   )
                       .ToolBar(toolBar =>
                           toolBar.Custom()

                               .Text("Export To Excel")
                               .HtmlAttributes(new { id = "export" })

                               .Url(Url.Action("Export", "Home", new { page = 1, pageSize = "~", filter = "~", sort = "~" }))


                       )

                   .Columns(columns =>
                   {
                       columns.Bound("Selected")//p => p.Selected)
                           .Sortable(false)
                           .Filterable(false)


                           .ClientTemplate(


                          "<input type='hidden' name='list.Index' value='#=StockID#'/>" +
                          "<input type='checkbox' id='list_#=StockID#__Selected' name='list[#=StockID#].Selected' value='false'/>"


                       ).Width(5);

                       columns.Bound(p => p.GradeCode).Width(10)
                           .Filterable(false).Sortable(false).HeaderTemplate(@<text>
                              @(Html.Kendo().ComboBox()

                            .DataValueField("GradeCode")
                            .Placeholder("Grade Code")


                                      .DataTextField("GradeCode")
                                      .Name("GradeCode")
                                                  .DataSource(ds => ds.Read(rea => rea.Action("GetGradeCodeList", "Home")))
                                          .Events(ev => ev.Change("onComboGradeCodeChange"))
                              )
                                </text>)

                           .ClientGroupHeaderTemplate("<b class='header-title'>Grade Code</b>: <label class='header-value'>" + "#=value# </label>");

                       columns.Bound(p => p.SizeLength).HeaderHtmlAttributes(
                             new { @class = "filter-class" }
                           ).Width(10).Filterable(true);
                       columns.Bound(p => p.SizeWidth).Width(10);
                       columns.Bound(p => p.SizeThick).Width(10);
                       columns.Bound(p => p.Qty).Width(10);
                       columns.Bound(p => p.WeightKG).Width(15);

                       columns.Bound(p => p.LocationDescriptionShort)
                           .ClientTemplate("#=LocationDescriptionShort# ")
                           .Width(20).Filterable(false).Sortable(false).HeaderTemplate(@<text>

                      @(Html.Kendo().ComboBox()
                      .DataValueField("LocationDescriptionShort")
                      .Placeholder("Location")


                              .DataTextField("LocationDescriptionShort")
                              .Name("LocationDescriptionShort")
                              .DataSource(ds => ds.Read(rea => rea.Action("GetLocationList", "Home")))

                          .Events(ev => ev.Change("onComboLocationChange"))
                      )
                        </text>);


                       columns.Bound(p => p.Opco).Filterable(false).Sortable(false).HeaderTemplate(@<text>
                      @(Html.Kendo().ComboBox()

                      .DataValueField("Opco")
                      .Placeholder("Company")


                      .DataTextField("Opco")
                      .Name("Opco")
                          .DataSource(ds => ds.Read(rea => rea.Action("GetCompanyList", "Home")))

                          .Events(ev => ev.Change("onComboCompanyChange"))
                      )
                        </text>);
                       columns.Bound("QuantityToEnquiry").Filterable(false).Sortable(false)
                           .ClientTemplate("<input class='qtyToEnquiry' type='text' value='1' />");
                        
                      
                   })  
                                                                                                 .Events(ev => { ev.DataBound("onDataBound"); })
                                                                       .Pageable()
                                                                       .Sortable(s => s.SortMode(GridSortMode.MultipleColumn))
                                                                       
                )



<script id="inventoryTemplate" type="text/kendo-tmpl">

   @(Html.Kendo().TabStrip()
            .Name("TabStrip_#=StockID#")
            .SelectedIndex(0)
            .Items(items =>
            {
                items.Add()
                .Text("Details")
                .Content(
                
                    "<div class='inventory-details'>" +
                        "<ul>" +
                            "<li><label>Full Grade: </label>#= GradeDescription #</li>" +
                            "<li><label>Stock Reference: </label>#= StockRef #</li>" +
                            "<li><label>Cut/Mill Edge: </label>#= MillEdges #</li>" +
                        "</ul>" +
                        "<ul>" +
                            "<li><label>Memo: </label>#= OtherDetails  #</li>" +
                            "<li><label>Vessel: </label>#= Vessel #</li>" +
                            "<li><label>Producer: </label>#= Producer #</li>" +
                            "<li><label>Detailed Location: </label>#= LocationDescription #</li>" +
                        "</ul>" +
                    "</div>"
                );
            })
            .ToClientTemplate())
        

</script>
Petur Subev
Telerik team
 answered on 24 Jul 2013
5 answers
252 views
Can we have a simple example with zoom capabilities of the new 2012.3 features in the chart.
Thanks.
T. Tsonev
Telerik team
 answered on 24 Jul 2013
1 answer
73 views
When a post has a ( or ) in the title, the page errors out when you try to click "mark as answered" As well, that post if in your Account view can't be licked as it's "not found"

http://www.kendoui.com/error-pages/error-500.aspx?aspxerrorpath=/forums/kendo-ui-dataviz/chart/moving-the-category-axis-to-bottom-when-negative-values-are-present-(mvc).aspx

Ralitsa Peneva
Telerik team
 answered on 24 Jul 2013
1 answer
72 views
In many of my posts I can't mark the post as answered. I get a 500 server error:

Here's an example, clicking the Mark as ANswered here throws the error

http://www.kendoui.com/forums/kendo-ui-dataviz/chart/make-columns-fat-when-few-used-in-mvc.aspx

Ralitsa Peneva
Telerik team
 answered on 24 Jul 2013
1 answer
596 views
Hi

I currently have the following but I would like to be able to specify the ranges dynamically using sliders. Can anyone tell me how to implement this?

Note - there will always be four ranges, its just where these start and stop is where I want to regulate.

@(Html.Kendo().RadialGauge()
.Name("testRadialGauge")
.Pointer(pointer => pointer
.Value(0)
.Color("Blue")
)
.Scale(scale => scale
.MinorUnit(200)
.StartAngle(-30)
.EndAngle(210)
.Max(5000)
.Labels(GaugeRadialScaleLabels => GaugeRadialScaleLabels
.Visible(true)
                         )
.Ranges(ranges =>
{
ranges.Add().From(0).To(800).Color("#c20000");
ranges.Add().From(800).To(1600).Color("#ff7a00");
ranges.Add().From(1600).To(2000).Color("#ffc700");
ranges.Add().From(2000).To(5000).Color("green");
})
)
)
            
      
Iliana Dyankova
Telerik team
 answered on 24 Jul 2013
4 answers
54 views
I have a simple set of charts that are in Windows working great under 2013.2. I upgraded to 2013.3 and now the Windows appears and the chart's X and Y axis, legend and labels on the axis appear, but the data is not rendered, the charts are empty. See attached image. It was working fine in 2013.2 but after I ran the 2013.3 update it stopped working. In the html output, the data is there serialized in json, it's just the lines and bars of the chart no longer appear.

I have experimented by removing as much of the settings for a chart and window as I can, but still, no data appears.

    Html.Kendo().Window()
        .Name(windowId)
        .Width(680)
        .Height(430)
        .Title(Model.ChartTitle)
        .Visible(false)
        .Modal(true)
        .Draggable(true)
        .Content(@<text>
                       
@{
    Html.Kendo().Chart<AccountPerformance>(Model.Results)
        .Name("chartPCT")
        .Title("% Return")
        .Series(series =>
                series.Column(model => model.Metrics.Return)
                      .Name(Model.ColumnTitle))
        .ValueAxis(axis => axis.Numeric())
        .CategoryAxis(axis => axis.Date().Categories(model => model.Observation))
        .Render();
 
}

Here's the data Kendo's MVC wrapper writes to HTML:

<div class="k-chart" id="chartPCT"></div><script>
    jQuery(function(){jQuery("#chartPCT").kendoChart({"title":{"text":"% Return"},"series":[{"name":"Month","type":"column","field":"Metrics.Return"}],"categoryAxis":[{"type":"Date","categories":["2013/01/31 00:00:00","2013/02/28 00:00:00","2013/03/31 00:00:00","2013/04/30 00:00:00","2013/05/31 00:00:00"]}],"dataSource":{"schema":{"model":{"fields":{"Granularity":{"type":"number"},"GranularityName":{"editable":false,"type":"string"},"Observation":{"type":"date"},"ObservationDescription":{"type":"string"},"IsTimeSeries":{"type":"boolean"},"Metrics":{"type":"object"},"ObservationDisplay":{"editable":false,"type":"string"}}}},"data":[{"Granularity":0,"GranularityName":"Monthly","Observation":"\/Date(1359619200000)\/","ObservationDescription":null,"IsTimeSeries":true,"Metrics":{"MarketValue":370505.870000,"NetInvested":494.280000,"Return":2.740981,"HasMarketValue":true,"HasNetInvested":true},"ObservationDisplay":"January"},{"Granularity":0,"GranularityName":"Monthly","Observation":"\/Date(1362038400000)\/","ObservationDescription":null,"IsTimeSeries":true,"Metrics":{"MarketValue":373901.670000,"NetInvested":284.740000,"Return":0.839149,"HasMarketValue":true,"HasNetInvested":true},"ObservationDisplay":"February"},{"Granularity":0,"GranularityName":"Monthly","Observation":"\/Date(1364713200000)\/","ObservationDescription":null,"IsTimeSeries":true,"Metrics":{"MarketValue":370930.070000,"NetInvested":0.000000,"Return":-0.794754,"HasMarketValue":true,"HasNetInvested":true},"ObservationDisplay":"March"},{"Granularity":0,"GranularityName":"Monthly","Observation":"\/Date(1367305200000)\/","ObservationDescription":null,"IsTimeSeries":true,"Metrics":{"MarketValue":361961.050000,"NetInvested":0.000000,"Return":-2.417981,"HasMarketValue":true,"HasNetInvested":true},"ObservationDisplay":"April"},{"Granularity":0,"GranularityName":"Monthly","Observation":"\/Date(1369983600000)\/","ObservationDescription":null,"IsTimeSeries":true,"Metrics":{"MarketValue":368352.560000,"NetInvested":0.000000,"Return":1.765800,"HasMarketValue":true,"HasNetInvested":true},"ObservationDisplay":"May"}]}});});
</script>
 </div><script>
    jQuery(function(){jQuery("#window_Monthly").kendoWindow({"modal":true,"iframe":false,"draggable":true,"pinned":false,"title":"Monthly Performance - Account ","resizable":false,"content":null,"width":680,"height":430,"actions":["Close"]});});
</script>


T. Tsonev
Telerik team
 answered on 24 Jul 2013
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?