Telerik Forums
UI for ASP.NET AJAX Forum
0 answers
41 views

RadNotification seemingly does not have focus trap

Am i missing something?

David
Top achievements
Rank 1
Iron
Iron
Veteran
 asked on 11 May 2023
1 answer
38 views

I allow the user to create in runtime, zones (my sections) and docks.

<asp:Repeater ID="repSections" runat="server" OnItemDataBound="repSections_ItemDataBound">
        <ItemTemplate>
            <asp:Panel ID="panelSection" runat="server" CssClass="container">
		
			A RadDockZone(section) and it's RadDocks are injected here in runtime...

		</asp:Panel>
        </ItemTemplate>        
    </asp:Repeater>

This repeater is populated from database and zones and it's docks injected in runtime, assigning the DockPositionChanged event to each of the created docks. Since I also inject in runtime, controls before and after each zone to manage it (Add, configure, move up/down) and I want them to postback using ajax, I'm configuring the ajax behavior in the ItemDataBound event of the Repeater:

protected void repSections_ItemDataBound(object sender, RepeaterItemEventArgs e)

{

LinkButton linkbtAddNormalSection = e.Item.FindControl("linkbtAddNormalSection") as LinkButton;
linkbtAddNormalSection.CommandArgument = section.Id.ToString();
AjaxSetting ajaxSetting_linkbtAddNormalSection = new AjaxSetting();
ajaxSetting_linkbtAddNormalSection.AjaxControlID = linkbtAddNormalSection.UniqueID;
ajaxSetting_linkbtAddNormalSection.EventName = "Click";
ajaxSetting_linkbtAddNormalSection.UpdatedControls.AddRange(new AjaxUpdatedControlsCollection()
{
 new AjaxUpdatedControl(repSections.UniqueID,""),
                            new AjaxUpdatedControl(panelNosections.UniqueID,""),
                            new AjaxUpdatedControl(radNotification.UniqueID, "")
});
ajaxManagerProxy.AjaxSettings.Add(ajaxSetting_linkbtAddNormalSection);

...

}

Because of this, RadAjax places a RadAjaxPanel that includes all the created zones inside of the repeater causing the DockPositionChanged event to function in ajax mode. That's fine, and works great since avoids a regular postback each time a dock changes position. 

The issue is that I need to show a RadNotification that is outside the repeater and consequently, outside that RadAjaxPanel and I can't show it from the  DockPositionChanged event. 

Any suggestion to overcome this?

 

Thank you!

Hugo Augusto
Top achievements
Rank 2
Iron
Veteran
Iron
 answered on 13 Jan 2023
12 answers
730 views
http://demos.telerik.com/aspnet-ajax/notification/examples/sessiontimeout/defaultcs.aspx

The demo at this URL is horribly confusing with unclear references to "UI counters" and a different demo than the "recommended" setup. Please cleanup this demo so it accurately portrays the application scenario!


For my project, I'm trying to implement a session timeout popup without using a postback. I've added RadNotification tag to the aspx page, assigned ShowInterval and Value properties on the RadNotification from code behind, and now I'm stuck trying to get the javascript to work for the countdown and redirect. I want the notification popup to countdown from 60 and then redirect to another page, however I can not figure out the javascript piece from the demo. Am I correct in assuming I only need the UpdateTimeLabel() and ContinueSession() functions? How do i wire these up so they start firing when the notification is displayed? Is the pageLoad() javascript function needed for this scenario (unclear from the demo)?

Here is my tag in aspx:
<telerik:RadNotification ID="RadNotification1" runat="server" Position="Center" Width="240"
                            Height="100" OnCallbackUpdate="OnCallbackUpdate" LoadContentOn="PageLoad" AutoCloseDelay="60000"
                            Title="Continue Your Session" TitleIcon="" Skin="Office2007" EnableRoundedCorners="true"
                            ShowCloseButton="false" KeepOnMouseOver="false">
                            <ContentTemplate>
                                <div class="infoIcon">
                                    <img src="images/infoIcon.jpg" alt="info icon" />
                                </div>
                                <div class="notificationContent">
                                    Time remaining:  <span id="timeLbl">60</span>
                                    <telerik:RadButton Skin="Office2007" ID="continueSession" runat="server" Text="Continue Your Session"
                                        Style="margin-top: 10px;" AutoPostBack="false" OnClientClicked="ContinueSession">
                                    </telerik:RadButton>
                                </div>
                            </ContentTemplate>
                        </telerik:RadNotification>

Code behind:
if (!IsPostBack)
            {
                //set the expire timeout for the session
                Session.Timeout = 2;
                //configure the notification to automatically show 1 min before session expiration
                RadNotification1.ShowInterval = (Session.Timeout - 1) * 60000;
                //set the redirect url as a value for an easier and faster extraction in on the client
                RadNotification1.Value = Page.ResolveClientUrl("default.aspx");
            }

And javascript (using a <script> tag directly under <body> tag):
function UpdateTimeLabel(toReset) {
            var sessionExpired = (seconds == 0);
            if (sessionExpired) {
                //stopTimer("timeLeftCounter");
                //redirect to session expired page - simply take the url which RadNotification sent from the server to the client as value
                window.location.href = $find("<%= RadNotification1.ClientID %>").get_value();
            }
            else {
                var timeLbl = $get("timeLbl");
                timeLbl.innerHTML = seconds--;
            }
        }
 
        function ContinueSession() {
            var notification = $find("<%= RadNotification1.ClientID %>");
            //we need to contact the server to restart the Session - the fastest way is via callback
            //calling update() automatically performs the callback, no need for any additional code or control
            notification.update();
            notification.hide();
 
            //resets the showInterval for the scenario where the Notification is not disposed (e.g. an AJAX request is made)
            //You need to inject a call to the ContinueSession() function from the code behind in such a request
            var showIntervalStorage = notification.get_showInterval(); //store the original value
            notification.set_showInterval(0); //change the timer to avoid untimely showing, 0 disables automatic showing
            notification.set_showInterval(showIntervalStorage); //sets back the original interval which will start counting from its full value again
 
            //stopTimer("timeLeftCounter");
            //seconds = 60;
            //updateMainLabel(true);
        }
Eyup
Telerik team
 answered on 14 Oct 2019
2 answers
91 views

this is client side code:

<code>

  function OnClientUpdated(sender, args) {
  
  var message = "Update (check) was done!";
  var newMsgs = sender.get_value();
  if (newMsgs != 0) {
  sender.show();
  message += (newMsgs == 1) ? (" There is 1 new message!") : (" There are " + newMsgs + " new messages!");
  }
  else {

  sender.hide();
  
  }
  console.log(message);
  }

 

 

    <telerik:RadNotification ID="ClientNotification" Visible="true" runat="server" RenderMode="Lightweight" EnableRoundedCorners="false" EnableShadow="true" 
                                Width="100%" Height="90" VisibleOnPageLoad="false"
                                Animation="Slide" AnimationDuration="500" VisibleTitlebar="false" ShowTitleMenu="false" KeepOnMouseOver="true"
                                Position="BottomCenter" AutoCloseDelay="4000" LoadContentOn="TimeInterval" UpdateInterval="12000" Skin="Telerik"
                                OnClientUpdated="OnClientUpdated" OnClientUpdating="OnClientUpdating" OnCallbackUpdate="OnCallbackUpdateClient">
                       <%--         <NotificationMenu>
                                  <Items>
                                    <telerik:RadMenuItem Text="Classic" Value="Classic" />
                                    <telerik:RadMenuItem Text="Business" Value="Business" />
                                  </Items>
                                </NotificationMenu>--%>
                                <ContentTemplate>
                                <blockquote>
                               <asp:image ID="notifyIconClient" runat="server" />&nbsp;&nbsp;<asp:Literal ID="WriteMsgClient" EnableViewState="false" runat="server" />
                               <br />
              <asp:HyperLink ID="instantmsgLinkClient" EnableViewState="false" Text="Go to your TMN Members instant message page to view and respond to them now" runat="server" />
                               <br />
                               <br />
                               </blockquote>
                               </ContentTemplate>
              </telerik:RadNotification>

</code>

this is server side code:

<code>

Protected Sub OnCallbackUpdateClient(sender As Object, e As RadNotificationEventArgs)

        Dim getClientFirstName_Parameter As SqlParameter
        Dim NotifyClientIMCount_Parameter As SqlParameter
        Dim MyClientName As String = String.Empty
        Dim MsgCntClient As Integer
        Dim globalLog As LoginView = CType(Page.Master.FindControl("globalinmsge"), LoginView)
        Dim ClientNotify As RadNotification = CType(globalLog.FindControl("ClientNotification"), RadNotification)


        Using getClientFirstName_conn = New SqlConnection(ConnectionStrings("TMNall").ConnectionString)
            Using getClientFirstName_cmd = New SqlCommand("dbo.getTMNClientFristName", getClientFirstName_conn)

                getClientFirstName_cmd.CommandType = CommandType.StoredProcedure
                getClientFirstName_cmd.CommandTimeout = 0
                getClientFirstName_cmd.CommandText = "dbo.getTMNClientFristName"

                getClientFirstName_Parameter = getClientFirstName_cmd.CreateParameter()
                getClientFirstName_Parameter.ParameterName = "@username"
                getClientFirstName_Parameter.Direction = ParameterDirection.Input
                getClientFirstName_Parameter.SqlDbType = SqlDbType.NVarChar
                getClientFirstName_Parameter.Value = "badboy69" 'Membership.GetUser(Page.User.Identity.Name).ToString()

                getClientFirstName_cmd.Parameters.Add(getClientFirstName_Parameter)

                getClientFirstName_conn.Open()

                Using getClientFirstName_Reader = getClientFirstName_cmd.ExecuteReader()

                    If getClientFirstName_Reader.Read() Then

                        MyClientName = getClientFirstName_Reader("TMNmem_FirstName").ToString()

                    End If

                End Using
            End Using
        End Using

        Using NotifyClientIMCount_conn = New SqlConnection(ConnectionStrings("TMNall").ConnectionString)
            Using NotifyClientIMCount_cmd = New SqlCommand("dbo.getClientNotifyIMmsgCnt", NotifyClientIMCount_conn)

                NotifyClientIMCount_cmd.CommandType = CommandType.StoredProcedure
                NotifyClientIMCount_cmd.CommandTimeout = 0
                NotifyClientIMCount_cmd.CommandText = "dbo.getClientNotifyIMmsgCnt"

                NotifyClientIMCount_Parameter = NotifyClientIMCount_cmd.CreateParameter()
                NotifyClientIMCount_Parameter.ParameterName = "@username"
                NotifyClientIMCount_Parameter.Direction = ParameterDirection.Input
                NotifyClientIMCount_Parameter.SqlDbType = SqlDbType.NVarChar
                NotifyClientIMCount_Parameter.Value = "badboy69" 'Membership.GetUser(Page.User.Identity.Name).ToString()

                NotifyClientIMCount_cmd.Parameters.Add(NotifyClientIMCount_Parameter)

                NotifyClientIMCount_conn.Open()

                Using NotifyClientIMCount_Reader = NotifyClientIMCount_cmd.ExecuteReader()

                    If NotifyClientIMCount_Reader.Read() Then
                        If CInt(NotifyClientIMCount_Reader("NotifyIMClientCnt").ToString()) <> 0 Then

                            MsgCntClient = CInt(NotifyClientIMCount_Reader("NotifyIMClientCnt").ToString())

                        Else

                            MsgCntClient = 0

                        End If

                    End If

                End Using
            End Using
        End Using

        Dim clientmesg As Literal = CType(ClientNotify.ContentContainer.FindControl("WriteMsgClient"), Literal)
        Dim linkclient As HyperLink = CType(ClientNotify.ContentContainer.FindControl("instantmsgLinkClient"), HyperLink)
        Dim ClientImg As Image = CType(ClientNotify.ContentContainer.FindControl("notifyIconClient"), Image)

        clientmesg.Text = [String].Concat(New Object() {MyClientName.ToString(), " you have ", MsgCntClient, " new instant message(s)!"})
        linkclient.NavigateUrl = "~/Account/clientsMain"
        ClientNotify.Value = MsgCntClient.ToString()
        ClientImg.ImageUrl = "~/images/radlaerticon.jpg"


    End Sub

 

</code>

thanks guys

Vessy
Telerik team
 answered on 13 May 2019
11 answers
374 views
I am trying to create dynamic notifications based on the database content. As a simplified version of what i have, for the following database table : 

ID        Notification         NotificationText              NotificationTimeInterval
1          FillLog                   Fill the time log                   9000
2          CheckMesg          Check the message            500
3          Print                       Print report                         3000


Each notifications need to appear based on this table at the specified NotificationTimeInterval and the notifications should be created programatically since the number of records in the table itself is varying.  Can someone point me to the right direction or with a sample project on how to accomplish this?

Thanks,
Meera
Marin Bratanov
Telerik team
 answered on 28 Jun 2018
6 answers
261 views
Hi,

am using telerik notification for client-side validation. i have a rad button in my aspx page like this:
<telerik:RadButton ID="testButton" runat="server" Text="Click Me!" OnClientClicking="ValidateJScript();"></telerik:RadButton>
and a telerik notification like this:
<telerik:radnotification id="notification" runat="server"> </telerik:radnotification>

i'm trying to validate my fields one by one in a JScript file. but for simplicity let's say i just want to display "Hello World" in the telerik notification using the "ValidateJScript()" Java Script function like this:
function ValidateJScript() {
var notification = $find( '<%=RadNotification.ClientID %>');
var message = 'Hello World';
notification.text = message;
alert(notification.text);
notification.show();
first problem i encountered was that "set_text" method didn't work, and so i used ".text =" and that worked. Same goes for "set_title".
i made sure that ".text =" worked using the "alert(notification.text); statement. However,"notification.show();" never got executed at all, and i was never able to show the notification at all. moreover, if i add some test alert message after the "notification.show();" statement it never gets executed either. so can anyone help me and tell me how to get the notification to show using javascript in my scenario, and why did the "set_text" and "set_title" methods never worked here? thanks!


TechSystem
Top achievements
Rank 1
 answered on 18 Apr 2018
1 answer
109 views

Dear Team,

We are using ShowSound property and it doesn't work in mobiles and tablets. However it is working fine in desktop browsers. I have already tried below code which i got from your website but still no difference.

<script type="text/javascript">function pageLoad() {//Attach to the document touchstart event and initiate the notification audio $telerik.$(document).on("touchstart", initSound);}function initSound() {var notification = $find("<%=RadNotification1.ClientID%>");//If notification audio is not available initiate itif (!notification.verifySound()) { notification.userInitSound();}//Detach the initSound event listener $telerik.$(document).off("touchstart", initSound);}</script><telerik:RadNotification RenderMode="Lightweight" ID="RadNotification1" runat="server" ShowInterval="2000" AutoCloseDelay="1000" Text="Some Notification" ShowSound="warning"></telerik:RadNotification>

I have also tried in code behind but result is same.

RadNotification1.ShowSound = ResolveUrl("~/Images/OrderReceived.wav");

Kindly let me know how we can enable sound on mobile/tablet devices.

Thanks & Regards,

Jatin Kumar Verma

Peter Milchev
Telerik team
 answered on 23 Jan 2018
2 answers
164 views
Hi, I'm trying to fire the Notification on button click. The Notification is displaying but the title and content are empty, any ideas why?

<telerik:RadNotification ID="Notification" runat="server" Position="Center"
    AutoCloseDelay="10000" Width="350" EnableRoundedCorners="true" ContentIcon="none" KeepOnMouseOver="true" ShowCloseButton="false">
    <ContentTemplate>
        <asp:Literal ID="NotificationText" runat="server" />
    </ContentTemplate>
</telerik:RadNotification>

protected void SaveQuoteButton_Click(object sender, EventArgs e)
{
    Notification.Title = "Save Title";
    NotificationText.Text = "Save Text";
    Notification.Show();
}
Ahmad
Top achievements
Rank 1
 answered on 22 Jan 2018
6 answers
842 views
Hi all,

I love the new notification control. I have been playing around with it and had a quick question. Right now, I have placed the control on the MasterPage for our application. While testing out the SessionTimeout example, I noticed that if I open a link in another tab or window, you run the risk of the notification appearing in multiple windows. Any one have any ideas how I can control the notification from appearing more than once or appearing pre-maturely in the original window?

Thanks,
JE
Ian
Top achievements
Rank 1
 answered on 07 Nov 2017
1 answer
551 views

Dear Telerik Team,

We would like to use rad notification session timeout feature in my code but we have different project scenario.
We have master page in project but Form tag is inside content page so we are not able to add notification control in master page.
We don't want to add rad notification on each page.
We have created a dynamic control on page load but getting error on continue session button.

Master Page ASPX
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="SampleApplicationSession.Site1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
     <div class="clockSession">
            <div class="contSession">
                <div class="sesseionExpire">
                    Your Session will expire in minutes</div>
                <div class="showNotification">
                    Notification will be shown in:</div>
                <div class="timeRemain">
                    <span class="timeSeconds"><span id="mainLbl">60 </span></span>seconds</div>
            </div>
        </div>
    <div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        
        </asp:ContentPlaceHolder>
    </div>
</body>
</html>

Master page CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SampleApplicationSession
{
    public partial class Site1 : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}
WebForm1.CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SampleApplicationSession
{
    public partial class WebForm1 :BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Session["Userid"] = "Test";

        }
    }
}

WebForm ASPX

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SampleApplicationSession.WebForm1" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>




<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">


   

</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
 
<form id="GlmasterViewForm" runat="server">
<telerik:RadScriptManager ID="RadScriptManager1" runat="server">
    <Scripts>
        <asp:ScriptReference Assembly="Telerik.Web.UI" 
            Name="Telerik.Web.UI.Common.Core.js">
        </asp:ScriptReference>
        <asp:ScriptReference Assembly="Telerik.Web.UI" 
            Name="Telerik.Web.UI.Common.jQuery.js">
        </asp:ScriptReference>
        <asp:ScriptReference Assembly="Telerik.Web.UI" 
            Name="Telerik.Web.UI.Common.jQueryInclude.js">
        </asp:ScriptReference>
    </Scripts>
</telerik:RadScriptManager>
</form>

</asp:Content>


BaseFile
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Telerik.Web.UI;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;


namespace SampleApplicationSession
{
    public class BasePage : System.Web.UI.Page
    {

        RadNotification SessionTimeOutNotification = new RadNotification();

        protected void OnCallbackUpdate(object sender, RadNotificationEventArgs e)
        {

        }
        protected override void OnLoad(EventArgs e)
        {
            try
            {

                if (!Page.IsPostBack)
                {
      



                    SessionTimeOutNotification.ContentContainer.CssClass = "";
                    SessionTimeOutNotification.ID = "TestRad";
                    SessionTimeOutNotification.RenderMode = RenderMode.Lightweight;
                    //SessionTimeOutNotification.Position = NotificationPosition.TopCenter;
                    //rad.Width = 190;
                    SessionTimeOutNotification.Title = "Continue Your Session";
                    SessionTimeOutNotification.EnableRoundedCorners = true;
                    SessionTimeOutNotification.ShowCloseButton = false;
                    SessionTimeOutNotification.KeepOnMouseOver = false;
                    SessionTimeOutNotification.LoadContentOn = NotificationLoad.PageLoad;
                    //SessionTimeOutNotification.AutoCloseDelay = 6000;
                    
                   
                    //configure the notification to automatically show 1 min before session expiration
                    SessionTimeOutNotification.ShowInterval = (Session.Timeout - (Session.Timeout - 1)) * 60 * 1000;
                    SessionTimeOutNotification.AutoCloseDelay = 60000;

                    //set the redirect url as a value for an easier and faster extraction in on the client
                    SessionTimeOutNotification.Value = Page.ResolveClientUrl("SessionExpired.aspx");
                    MyTemplate1 objTemplate = new MyTemplate1();
                    SessionTimeOutNotification.ContentTemplate = objTemplate;
                    SessionTimeOutNotification.OnClientShowing = "notification_showing";
                    SessionTimeOutNotification.OnClientHidden = "notification_hidden";

                    SessionTimeOutNotification.CallbackUpdate += OnCallbackUpdate;

                    //SessionTimeOutNotification.CallbackUpdate += new EventHandler(OnCallbackUpdate);

                    this.Form.Controls.Add(SessionTimeOutNotification);

                    if (!ClientScript.IsStartupScriptRegistered("key1"))
                    {
                        ClientScript.RegisterStartupScript(GetType(), "key1", @"<script type=""text/javascript"" src=""../Resources/js/SessionExpired.js""></script>");
                    }

                    if (!ClientScript.IsStartupScriptRegistered("SessionControlScript"))
                    {
                        String cstext1 = "<script type=\"text/javascript\">" +
                        "serverIDs({ notificationID: 'ctl00_ContentPlaceHolder1_TestRad' });</" + "script>";
                        
                        ClientScript.RegisterStartupScript(GetType(), "SessionControlScript", cstext1);
                    }


                }
            }
            catch(Exception ex )
            {}


    
        }

        /// <summary>
        /// This is the base class for the web pages.
        /// We need to implement the common functionalities in this 
        /// class going forward.
        /// </summary>
        public class MyTemplate1 : ITemplate
        {
            protected RadButton btnMsg;
            string colnames;
            public MyTemplate1()
            {

            }
            public void InstantiateIn(System.Web.UI.Control container)
            {


                btnMsg = new RadButton();
                btnMsg.ID = "btnMsg";
                btnMsg.Text = "Continue Your Session";
                btnMsg.OnClientClicked = "ContinueSession";
                btnMsg.AutoPostBack = false;

                //boolValue.DataBinding += new EventHandler(boolValue_DataBinding);
                // boolValue.Enabled = false;
                HtmlGenericControl DivinfoIcon = new HtmlGenericControl("DIV");
                DivinfoIcon.Attributes.Add("class", "infoIcon");
                HtmlGenericControl DivinotificationContent = new HtmlGenericControl("DIV");
                DivinotificationContent.Attributes.Add("class", "notificationContent");
                HtmlGenericControl Div1 = new HtmlGenericControl("DIV");
                Label lblText = new Label();
                lblText.Text = "Time remaining: ";
                lblText.ID = "lblTime";
                HtmlGenericControl tiemlbl = new HtmlGenericControl("SPAN");
                tiemlbl.ID = "timeLbl";
                tiemlbl.InnerHtml = "60";
                tiemlbl.Attributes.Add("class", "timeLbl");
                Div1.Controls.AddAt(0, lblText);
                Div1.Controls.AddAt(1, tiemlbl);
                DivinotificationContent.Controls.AddAt(0, Div1);
                DivinotificationContent.Controls.AddAt(1, btnMsg);
                DivinfoIcon.Controls.Add(DivinotificationContent);
                container.Controls.Add(DivinfoIcon);
            }
        }

    }
}


i am getting attached error on this. Is there any better way to implement it ?

 

Please suggest is there is any better way to implement it.

Marin Bratanov
Telerik team
 answered on 02 May 2017
Narrow your results
Selected tags
Tags
+? more
Top users last month
horváth
Top achievements
Rank 2
Iron
Iron
Steve
Top achievements
Rank 2
Iron
Erkki
Top achievements
Rank 1
Iron
Mark
Top achievements
Rank 2
Iron
Iron
Veteran
Jakub
Top achievements
Rank 1
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
horváth
Top achievements
Rank 2
Iron
Iron
Steve
Top achievements
Rank 2
Iron
Erkki
Top achievements
Rank 1
Iron
Mark
Top achievements
Rank 2
Iron
Iron
Veteran
Jakub
Top achievements
Rank 1
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?