Please see the attached video pertaining to the description below.
I have an ABMPage, in which the user navigates on a tree-like table, and then makes a selection from another table on a ModalSheet.
Then the ModalSheet is closed and the NavigateToPageNewTab is called succesfully.
However, the source page (i.e. the page in which the call to NavigatetoPageNewTab is made) is reset and all user's selection up to that point is lost.
(In the Log list, the log data of the websocket_connected of the target page (which opens in the new tab), appear, followed by the log data of Line 25 (see below) of the websocket_connected of the source page.
Is there a way to maintain the user's selection in the source page up to that point, i.e. the changes made to the tree-like table (not the Modal Sheet).
This is where the call to NavigateToPageNewTab is made:
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
This is the main part of the Web_Socket_connected of the source page
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
This is the main part of the Web_Socket_connected of the target page
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
This is the NavigateToPageNewTab
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
			
			I have an ABMPage, in which the user navigates on a tree-like table, and then makes a selection from another table on a ModalSheet.
Then the ModalSheet is closed and the NavigateToPageNewTab is called succesfully.
However, the source page (i.e. the page in which the call to NavigatetoPageNewTab is made) is reset and all user's selection up to that point is lost.
(In the Log list, the log data of the websocket_connected of the target page (which opens in the new tab), appear, followed by the log data of Line 25 (see below) of the websocket_connected of the source page.
Is there a way to maintain the user's selection in the source page up to that point, i.e. the changes made to the tree-like table (not the Modal Sheet).
This is where the call to NavigateToPageNewTab is made:
			
				Call to NavigateToPageNewTab:
			
		
		
		Sub OpenArticlesModal(row As Int, col As Int)
'    Log(row)
'    Log(col)
    Dim myModal As ABMModalSheet = page.ModalSheet("ArticlesModal")
    Dim tblArtList As ABMTable = myModal.content.Component("tblArtList")  
    If col = 3 Then ' view article button was clicked
        Dim ActiveArticle As Long= tblArtList.GetString(row,0)
        page.CloseModalSheet("ArticlesModal")
        ABMShared.NavigateToPageNewTab(ws, ABMPageId, "../Article/?prmtr="& ActiveArticle, True)
    End If
End SubThis is the main part of the Web_Socket_connected of the source page
			
				B4X:
			
		
		
		Private Sub WebSocket_Connected (WebSocket1 As WebSocket)
    '----------------------MODIFICATION-------------------------------
    'log("connected")
    ws = WebSocket1
    ABMPageId = ABM.GetPageID(page, Name,ws)
    DateTime.DateFormat="dd/MM/yyyy"
    DateTime.timeFormat="HH:mm"
    Dim session As HttpSession = ABM.GetSession(ws, ABMShared.SessionMaxInactiveIntervalSeconds)
    If session.IsNew Then
        session.Invalidate
        ABMShared.NavigateToPage(ws, "", "./")
        Return
    End If
    If ABMShared.NeedsAuthorization Then
        If session.GetAttribute2("IsAuthorized", "") = "" Then
            ABMShared.NavigateToPage(ws, ABMPageId, "../")
            Return
        End If
    End If
   
    UserId=session.GetAttribute("UserId")
    ABMShared.UpdateUserTimestamp(UserId)
    Log("*PAGE: " & Name & " ***" & ws.Session.GetAttribute("authName") & "@" & ABMShared.timestamp & ", Expired Subscription: " & ws.Session.GetAttribute("Expired"))
   
   
    If session.GetAttribute("Expired")="Yes" Then
        ABMShared.NavigateToPage(ws, ABMPageId, "../UserInfo")
        Return
    End If
   
   
   
    ABM.UpdateFromCache(Me, ABMShared.CachedPages, ABMPageId, ws)
    If page.ComesFromPageCache Then
        ' when we have a page that is cached it doesn't matter if it comes or not from a new connection we serve the cached version.
        'Log("comes from cache")
        page.Refresh
        page.FinishedLoading
    Else
        If page.WebsocketReconnected Then
            Log("websocket reconnected")
            ' when we have a client that doesn't have the page in cache and it's websocket reconnected and also it's session is new - basically when the client
            ' had internet problems and it's session (and also cache) expired before he reconnected so the user has content in the browser but we don't have
            ' any on the server. So we need to reload the page.
            ' when a client that doesn't have the page in cache and it's websocket reconnected but it's session is not new - when the client had internet
            ' problems and when he reconnected it's session was valid but he had no cache for this page we need to reload the page as the user browser has
            ' content, reconnected but we have no content in cache
            ABMShared.NavigateToPage (ws, ABMPageId, "./" & page.PageHTMLName)
        Else
            ' when the client did not reconnected it doesn't matter if the session was new or not because this is the websockets first connection so no dynamic
            ' content in the browser ... we are going to serve the dynamic content...
            Log("websocket first connection")
            page.Prepare
            ConnectPage
        End If
    End If
    'log("abmPageId)
    '----------------------MODIFICATION-------------------------------This is the main part of the Web_Socket_connected of the target page
			
				B4X:
			
		
		
		Private Sub WebSocket_Connected (WebSocket1 As WebSocket)
    '----------------------MODIFICATION-------------------------------
    'log("connected")
    ws = WebSocket1
    Dim txt As String = ws.UpgradeRequest.GetParameter("prmtr")
    ActiveArticle = txt.Replace("/","")
'    Log(ActiveArticle)
    ABMPageId = ABM.GetPageID(page, Name,ws)
    DateTime.DateFormat="dd/MM/yyyy"
    DateTime.timeFormat="HH:mm"
   
    Dim session As HttpSession = ABM.GetSession(ws, ABMShared.SessionMaxInactiveIntervalSeconds)
   
    If session.IsNew Then
        session.Invalidate
        ABMShared.NavigateToPage(ws, "", "./")
        Return
    End If
    If ABMShared.NeedsAuthorization Then
        If session.GetAttribute2("IsAuthorized", "") = "" Then
            ABMShared.NavigateToPage(ws, ABMPageId, "../")
            Return
        End If
    End If
   
    UserId=session.GetAttribute("UserId")
    ABMShared.UpdateUserTimestamp(UserId)
    Log("*PAGE: " & Name & " ***" & ws.Session.GetAttribute("authName") & "@" & ABMShared.timestamp & ", Expired Subscription: " & ws.Session.GetAttribute("Expired"))
   
   
   
    ABM.UpdateFromCache(Me, ABMShared.CachedPages, ABMPageId, ws)
    If page.ComesFromPageCache Then
        ' when we have a page that is cached it doesn't matter if it comes or not from a new connection we serve the cached version.
        'log("comes from cache")
        page.Refresh
        page.FinishedLoading
    Else
        If page.WebsocketReconnected Then
            'log("websocket reconnected")
            ' when we have a client that doesn't have the page in cache and it's websocket reconnected and also it's session is new - basically when the client
            ' had internet problems and it's session (and also cache) expired before he reconnected so the user has content in the browser but we don't have
            ' any on the server. So we need to reload the page.
            ' when a client that doesn't have the page in cache and it's websocket reconnected but it's session is not new - when the client had internet
            ' problems and when he reconnected it's session was valid but he had no cache for this page we need to reload the page as the user browser has
            ' content, reconnected but we have no content in cache
            ABMShared.NavigateToPage (ws, ABMPageId, "./" & page.PageHTMLName)
        Else
            ' when the client did not reconnected it doesn't matter if the session was new or not because this is the websockets first connection so no dynamic
            ' content in the browser ... we are going to serve the dynamic content...
            'log("websocket first connection")
            page.Prepare
            ConnectPage
        End If
    End If
    'log("abmPageId)
    '----------------------MODIFICATION-------------------------------This is the NavigateToPageNewTab
			
				B4X:
			
		
		
		'----------------------START MODIFICATION 4.00-------------------------------
Public Sub NavigateToPageNewTab(ws As WebSocket, PageId As String, TargetUrl As String, OpenInNewTab As Boolean) 'ignore
    Dim testTargetUrl As String = TargetUrl
    If Not(testTargetUrl.EndsWith(".htm") Or testTargetUrl.EndsWith(".html") Or testTargetUrl.EndsWith("/")) Then
        TargetUrl = TargetUrl & "/"
    End If
    If PageId.Length > 0 Then ABM.RemoveMeFromCache(CachedPages, PageId)
    If ws.Open Then
        If OpenInNewTab Then
            Dim s As String
            ' check if a mobile phone only
'            s = $"var check = false;
            '              (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
            '              if (check) {
            '                  window.location = arguments[0];
            '              } else {
            '                  window.open(arguments[0],'_blank');
            '              }"$
           
            ' check if a mobile phone or a tablet
            s = $"var check = false;
              (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
               if (check) {
                  window.location = arguments[0];
              } else {
                window.open(arguments[0],'_blank');                
              }"$          
            ws.Eval(s, Array As Object(TargetUrl))
        Else
            ws.Eval("window.location = arguments[0]", Array As Object(TargetUrl))
        End If
        ws.Flush
        ws.Close ' ALSO NEW 4.00
    End If
End Sub
'----------------------END MODIFICATION 4.00-------------------------------Attachments
			
				Last edited: