Add Ormin ORM support for BaraDB (Nim client)
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled

This commit is contained in:
2026-05-15 21:49:08 +03:00
parent 2e945c1dcb
commit 4e54075078
63 changed files with 9764 additions and 0 deletions
@@ -0,0 +1,92 @@
## Frontend for our chat application example.
## You need to have 'karax' installed in order for this to work.
import karax / [kbase, karax, vdom, karaxdsl, kajax, jwebsockets, jjson,
jstrutils, errors]
# Custom UI element with input validation:
proc validateNotEmpty(field: kstring): proc () =
result = proc () =
let x = getVNodeById(field)
if x.text.isNil or x.text == "":
setError(field, field & " must not be empty")
else:
setError(field, "")
proc loginField(desc, field, class: kstring;
validator: proc (field: kstring): proc ()): VNode =
result = buildHtml(tdiv):
label(`for` = field):
text desc
input(`type` = class, id = field, onchange = validator(field))
# here we setup the connection to the server:
let conn = newWebSocket("ws://localhost:8080", "orminchat")
proc send(msg: JsonNode) =
# The Ormin "protocol" requires us to have 'send' implementation.
conn.send(toJson(msg))
type User* = ref object
name*, password: kstring
const
username = kstring"username"
password = kstring"password"
message = kstring"message"
# Include the 'chatclient' helper that Ormin produced for us:
include chatclient
template loggedIn(): bool = userId > 0
proc doLogin() =
registerUser(User(name: getVNodeById(username).text,
password: getVNodeById(password).text))
proc doSendMessage() =
let inputField = getVNodeById(message)
sendMessage(TextMessage(author: userId, content: inputField.text))
inputField.setInputText ""
proc registerOnUpdate() =
conn.onmessage =
proc (e: MessageEvent) =
let msg = fromJson[JsonNode](e.data)
# 'recvMsg' was generated for us:
recvMsg(msg)
karax.redraw()
proc main(): VNode =
result = buildHtml(tdiv):
tdiv:
if not loggedIn:
loginField("Name :", username, "input", validateNotEmpty)
loginField("Password: ", password, "password", validateNotEmpty)
button(onclick = doLogin, disabled = disableOnError()):
text "Login"
p:
text getError(username)
p:
text getError(password)
tdiv:
table:
for m in allMessages:
tr:
td:
bold:
text m.name
td:
text m.content
tdiv:
if loggedIn:
label(`for` = message):
text "Message: "
input(class = "input", id = message, onkeyupenter = doSendMessage)
registerOnUpdate()
runLater proc() =
getRecentMessages()
setRenderer(main)