Hi all,
Here's my latest problem. I have an abmList onto which I am placing containers which contain both a label and a combo box. See my code below.
This is a test page where data is coming from two global lists.
Please have a look at the fillList sub. The combo's seem to work BUT they do not show content. I note that no click events are being generated just got and lost focus events.
Here's my latest problem. I have an abmList onto which I am placing containers which contain both a label and a combo box. See my code below.
This is a test page where data is coming from two global lists.
Please have a look at the fillList sub. The combo's seem to work BUT they do not show content. I note that no click events are being generated just got and lost focus events.
B4X:
'How To create a new page:-
'
'1] Use Project | Add new model | Class | ABM web page To create page class.
' Call this File the same Name As your page Name.
'2] Set Public Name As String = "yourPageName" (top of class File around line 20)
'3] In Main class File add a page :-
' Dim pregTestPage As pregTest <<<< This is name of class file (around line 50)
' pregTestPage.Initialize
'
' Add page To site myApp.AddPage(pregTestPage.page) ' <<<<< Add to app (site)
'4] Change these (abt line 130) :-
' page.PageTitle = "Template"
' page.PageDescription = "Template"
'
'5] In BuildPage Sub :- Build a grid eg
' '
' page.AddRowsM(2,True,20,0, "").AddCells12MP(1,0,0,0,0,"")
'
'6] Connect controls eg
' Dim lblTitle As ABMLabel
' lblTitle.Initialize(page, "lblobservtitle", ABMShared.TitleStr("Observation"), ABM.SIZE_H3, False, "lbltheme1")
' lblTitle.SetTooltip("Eunony farming",ABM.POSITION_BOTTOMRIGHT,100)
'
'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 = "Testing" ' <<<<<<- IMPORTANT
' will hold the unique browsers window id
Private ABMPageId As String = ""
' your own variables
Dim calves As List
Dim mothers As List
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
mothers.Initialize
calves.Initialize
Dim M1 As beast
M1.Initialize
M1.NLIS = 111111
M1.EarTag = "111"
M1.OffspringDOB = 123456
M1.Sex= "C"
Dim M2 As beast
M2.Initialize
M2.NLIS = 222222
M2.EarTag = "222"
M2.OffspringDOB = 123456
M2.Sex= "C"
Dim M3 As beast
M3.Initialize
M3.NLIS = 333333
M3.EarTag = "333"
M3.OffspringDOB = 123456
M3.Sex= "C"
Dim M4 As beast
M4.Initialize
M4.NLIS = 444444
M4.EarTag = "444"
M4.OffspringDOB = 123456
M4.Sex= "C"
Dim C1 As beast
C1.Initialize
C1.NLIS = 555555
C1.EarTag = "S55"
C1.OffspringDOB = 123456
C1.Sex= "H"
Dim C2 As beast
C2.Initialize
C2.NLIS = 666666
C2.EarTag ="S66"
C2.OffspringDOB = 123456
C2.Sex= "H"
Dim C3 As beast
C3.Initialize
C3.NLIS = 777777
C3.EarTag = "S77"
C3.OffspringDOB = 123456
C3.Sex= "S"
Dim C4 As beast
C4.Initialize
C4.NLIS = 888888
C4.EarTag = "S88"
C4.OffspringDOB = 123456
C4.Sex= "S"
mothers.Add(M1)
mothers.Add(M2)
mothers.Add(M3)
mothers.Add(M4)
calves.Add(M1)
calves.Add(M2)
calves.Add(M3)
calves.Add(M4)
' 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)
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
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} raised"$)
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")
If eventName = "page_dropped" Then
page.ProcessDroppedEvent(Params)
End If
Select Case Params.Size
Case 0
Log($".........................>> ${eventName} has 0 args"$)
CallSub(Me, eventName)
Case 1
Log($".........................>> ${eventName} has 1 arg ${Params.Get(eventParams(0))}"$)
CallSub2(Me, eventName, Params.Get(eventParams(0)))
Case 2
If Params.get(eventParams(0)) = "abmistable" Then
Log($".........................>> 'abmistable' ${Params.Get(eventParams(0))}"$)
Dim PassedTables As List = ABM.ProcessTablesFromTargetName(Params.get(eventParams(1)))
CallSub2(Me, eventName, PassedTables)
Else
Log($".........................>> ${eventName} callSub3 ${Params.Get(eventParams(0))} , ${Params.Get(eventParams(1))}"$)
CallSub3(Me, eventName, Params.Get(eventParams(0)), Params.Get(eventParams(1)))
End If
Case Else
' cannot be called directly, to many param
Log(".........................>> cannot be called directly, to many param")
CallSub2(Me, eventName, Params)
End Select
End If
Else
Log(".........................>> Caller NOT me")
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)
' add your specific page themes
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 = "Testing"
page.PageDescription = "Tests only"
page.PageKeywords = ""
page.PageSiteMapPriority = ""
page.PageSiteMapFrequency = ABM.SITEMAP_FREQ_YEARLY
page.ShowConnectedIndicator = True
' adding a navigation bar
' ABMShared.BuildNavigationBar(page, "My Page","../images/logo.png", "", "", "")
' create the page grid - 2 rows with one cell in each.
page.AddRowsM(2,True,20,0, "").AddCells12MP(1,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)
Dim LST As ABMList
LST.Initialize(page,"lst",ABM.COLLAPSE_ACCORDION,"")
page.Cell(1,1).AddComponent(LST)
'page.Cell(2,1).AddComponent(btn)
' refresh the page
page.Refresh
' Tell the browser we finished loading
page.FinishedLoading
fillList
' restoring the navigation bar position
page.RestoreNavigationBarPosition
End Sub
#end region
Sub fillList
Dim L As ABMList = page.Component("lst")
For i = 0 To calves.Size-1
Dim C As beast = calves.Get(i)
Dim con As ABMContainer
con.Initialize(page,"con"&i,"")
Dim lblCalf As ABMLabel
lblCalf.Initialize(page,"lblcalf",C.EarTag,ABM.SIZE_H5,False,"")
con.AddRows(1,True,"").AddCellsOS(1,0,0,0,5,5,5,"").AddCellsOS(1,2,2,2,5,5,5,"")
con.BuildGrid
Dim cmbMths As ABMCombo
cmbMths.Initialize(page,"cmbmths"&i,"Mother",400,"")
For j = 0 To mothers.Size-1
Dim M As beast = mothers.Get(j)
Dim lbl As ABMLabel
lbl.Initialize(page,"lbl"&j,M.EarTag,ABM.SIZE_H5,False,"")
cmbMths.AddItem("C"&j,"",lbl)
cmbMths.SetActiveItemId("C"&j)
Next
cmbMths.Refresh
con.Cell(1,1).AddComponent(lblCalf)
con.Cell(1,2).AddComponent(cmbMths)
L.AddItem("con"&i,con)
Next
L.refresh
End Sub
#Region ABMPage
' 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_DebugConsole(message As String)
Log("---> " & message)
End Sub
#end region