Wish Ability to create custom Module templates in the menu

alwaysbusy

Expert
Licensed User
Longtime User
It would be nice to be able to create custom module templates that can be inserted from the menu:

Project
-- Add New Module
---- Custom Module
------ mymodule1
------ mymodule2
------ mymodule3

This would be especially handy for ABM apps.

I could create templates for e.g. an ABMPage, ABMCustomComponent, ABM B4JS Module etc...

Project
-- Add New Module
---- Custom Module
------ ABMPage
------ ABMCustomComponent
------ ABM B4JS Module

So that when one clicks on e.g. ABMPage, the IDE would load my template that would look something like this:

B4X:
'Class module
Sub Class_Globals
   Private ws As WebSocket 'ignore
   ' will hold our page information
   Public page As ABMPage
   ' page theme
   Private theme As ABMTheme
   ' to access the constants
   Private ABM As ABMaterial 'ignore
   ' name of the page, must be the same as the class name (case sensitive!)
   Public Name As String = "TemplatePage"  '<-------------------------------------------------------- IMPORTANT
   ' will hold the unique browsers window id
   Private ABMPageId As String = ""
   ' your own variables
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
   ' build the local structure IMPORTANT!
   BuildPage
End Sub

#Region ABM
Private Sub WebSocket_Connected (WebSocket1 As WebSocket)
   Log("Connected")
       
   ws = WebSocket1
   
   ABMPageId = ABM.GetPageID(page, Name,ws)
   
   Dim session As HttpSession = ABM.GetSession(ws, ABMShared.SessionMaxInactiveIntervalSeconds)
   
   '----------------------START MODIFICATION 4.00-------------------------------
   If session.IsNew Then
       session.Invalidate
       ABMShared.NavigateToPage(ws, "", "./")
       Return
   End If
   '----------------------END MODIFICATION 4.00-------------------------------
   
   If ABMShared.NeedsAuthorization Then
       If session.GetAttribute2("IsAuthorized", "") = "" Then
           ABMShared.NavigateToPage(ws, ABMPageId, "../")
           Return
       End If
   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)
End Sub

Private Sub WebSocket_Disconnected
   Log("Disconnected")
End Sub

Sub Page_ParseEvent(Params As Map)
   Dim eventName As String = Params.Get("eventname")
   Dim eventParams() As String = Regex.Split(",",Params.Get("eventparams"))
   'Log(eventName)
   If eventName = "beforeunload" Then
       Log("preparing for url refresh")
       ABM.RemoveMeFromCache(ABMShared.CachedPages, ABMPageId)
       Return
   End If
   Dim caller As Object = page.GetEventHandler(Me, eventName)
   If caller = Me Then
       If SubExists(Me, eventName) Then
           Params.Remove("eventname")
           Params.Remove("eventparams")
           ' BEGIN NEW DRAGDROP
           If eventName = "page_dropped" Then
               page.ProcessDroppedEvent(Params)
           End If
           ' END NEW DRAGDROP
           Select Case Params.Size
               Case 0
                   CallSub(Me, eventName)
               Case 1
                   CallSub2(Me, eventName, Params.Get(eventParams(0)))
               Case 2
                   If Params.get(eventParams(0)) = "abmistable" Then
                       Dim PassedTables As List = ABM.ProcessTablesFromTargetName(Params.get(eventParams(1)))
                       CallSub2(Me, eventName, PassedTables)
                   Else
                       CallSub3(Me, eventName, Params.Get(eventParams(0)), Params.Get(eventParams(1)))
                   End If
               Case Else
                   ' cannot be called directly, to many param
                   CallSub2(Me, eventName, Params)
           End Select
       End If
   Else
       CallSubDelayed2(caller, "ParseEvent", Params) 'ignore
   End If
End Sub

public Sub BuildTheme()
   ' start with the base theme defined in ABMShared
   theme.Initialize("pagetheme")
   theme.AddABMTheme(ABMShared.MyTheme)
   
End Sub

public Sub BuildPage()
   ' initialize the theme
   BuildTheme
   
   ' initialize this page using our theme
   page.InitializeWithTheme(Name, "/ws/" & ABMShared.AppName & "/" & Name, False, ABMShared.SessionMaxInactiveIntervalSeconds, theme)
   page.ShowLoader=True
   page.PageHTMLName = "index.html"
   page.PageTitle = "Template"
   page.PageDescription = "Template"
   page.PageKeywords = ""
   page.PageSiteMapPriority = ""
   page.PageSiteMapFrequency = ABM.SITEMAP_FREQ_YEARLY
       
   page.ShowConnectedIndicator = True
               
   ' adding a navigation bar
   ' ABMShared.BuildNavigationBar(page, "ABMComposer","../images/logo.png", "", "", "")
           
   ' create the page grid
   page.AddRowsM(1,True,20,0, "").AddCellsOSMP(2,0,0,0,6,6,6,0,0,0,0,"")
       
   page.BuildGrid 'IMPORTANT once you loaded the complete grid AND before you start adding components       
End Sub

public Sub ConnectPage()
   '   connecting the navigation bar
   ' ABMShared.ConnectNavigationBar(page)   
   
   ' refresh the page
   page.Refresh
   
   ' Tell the browser we finished loading
   page.FinishedLoading
   ' restoring the navigation bar position
   page.RestoreNavigationBarPosition
End Sub
#end region

#Region ABMPage
Sub page_MsgboxResult(returnName As String, result As String)
   
End Sub

Sub Page_VisibilityState(State As String)
   Log(State)
End Sub

Sub Page_Dropped(Params As Map)
   If Params.Get("before") = "" Then
       Log("'" & Params.Get("component") & "' moved from " & Params.Get("source") & " to " & Params.Get("target"))
   Else
       Log("'" & Params.Get("component") & "' moved from " & Params.Get("source") & " to " & Params.Get("target") & " before component " & Params.Get("before"))
   End If
End Sub

' clicked on the navigation bar
Sub Page_NavigationbarClicked(Action As String, Value As String)
   ' saving the navigation bar position
   page.SaveNavigationBarPosition
   If Action = "LogOff" Then
       ABMShared.LogOff(page)
       Return
   End If

   ABMShared.NavigateToPage(ws, ABMPageId, Value)
End Sub

Sub Page_InputboxResult(returnName As String, result As String)
   
End Sub

Sub Page_DebugConsole(message As String)
   Log("---> " & message)
End Sub

Sub Page_FileUploaded(FileName As String, success As Boolean)
   
End Sub

Sub Page_ToastClicked(toastID As String, Action As String)
       
End Sub

Sub Page_ToastDismissed(ToastId As String)
   
End Sub

Sub Page_Authenticated(Params As Map)
   
End Sub

Sub Page_FirebaseAuthError(extra As String)
   
End Sub

Sub Page_FirebaseAuthStateChanged(IsLoggedIn As Boolean)
   
End Sub

Sub Page_FirebaseStorageError(jobID As String, extra As String)
   
End Sub

Sub Page_FirebaseStorageResult(jobID As String, extra As String)
   
End Sub

Sub Page_ModalSheetDismissed(ModalSheetName As String)
   
End Sub

Sub Page_NextContent(TriggerComponent As String)
   
End Sub

Sub Page_SignedOffSocialNetwork(Network As String, Extra As String)
   
End Sub

Sub page_CellClicked(Target As String, RowCell As String)
   
End Sub

Sub page_RowClicked(Target As String, Row As String)
   
End Sub

Sub Page_NativeResponse(jsonMessage As String)
   
End Sub

Sub Page_NavigationbarSearch(search As String)
   
End Sub
#end region

The easiest way to create such a template would be within the IDE. Standing on a module, one could add the template code and then:

1. press Project - Create Module Template
2. Give the template a name: My New Template

And now in the Add New Module - Custom Module menu, one can pick My New Template

Project
-- Add New Module
---- Custom Module
------ ABMPage
------ ABMCustomComponent
------ ABM B4JS Module
------ My New Template
 

Jack Cole

Well-Known Member
Licensed User
Longtime User
You could also do it by creating a templates folder. Then the templates path would be set up under paths. Whatever you put in that folder would show up as a custom template. Seems like it wouldn't be too hard to implement. This would be a real time saver.
 
Top