B4J Question [ABMaterial]NavigateToPageNewTab : Effects on the source page.

Philip Chatzigeorgiadis

Active Member
Licensed User
Longtime User
Please see the attached video pertaining to the description below.
I have an ABMPage, in which the user navigates on a tree-lie 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 Sub

This 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

  • vid2.gif
    485.5 KB · Views: 14
Cookies are required to use this site. You must accept them to continue using the site. Learn more…