Added lorem ipsum generation and Javascript search
This commit is contained in:
parent
05be8548fe
commit
8d6ec8b4ff
8 changed files with 87 additions and 1 deletions
3
go.mod
3
go.mod
|
|
@ -5,8 +5,11 @@ go 1.23.0
|
|||
require (
|
||||
git.gibonuddevalla.se/go/dbschema v1.3.1
|
||||
git.gibonuddevalla.se/go/wrappederror v0.3.5
|
||||
github.com/derektata/lorem v0.0.2
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/jmoiron/sqlx v1.4.0
|
||||
github.com/lib/pq v1.10.9
|
||||
)
|
||||
|
||||
require golang.org/x/text v0.11.0 // indirect
|
||||
|
|
|
|||
4
go.sum
4
go.sum
|
|
@ -4,6 +4,8 @@ git.gibonuddevalla.se/go/dbschema v1.3.1 h1:TGPvbNO/u7IK5TU0HT92mVzqdF179lLCfdTx
|
|||
git.gibonuddevalla.se/go/dbschema v1.3.1/go.mod h1:BNw3q/574nXbGoeWyK+tLhRfggVkw2j2aXZzrBKC3ig=
|
||||
git.gibonuddevalla.se/go/wrappederror v0.3.5 h1:/EzrdXETlZfNpS6TcK1Ix6BaV+Fl7qcGoxUM0GkrIN8=
|
||||
git.gibonuddevalla.se/go/wrappederror v0.3.5/go.mod h1:j4w320Hk1wvhOPjUaK4GgLvmtnjUUM5yVu6JFO1OCSc=
|
||||
github.com/derektata/lorem v0.0.2 h1:6esAdZDRz+hHiGO8AWxvDf2CwEb1wV7oi6pRWikG+Os=
|
||||
github.com/derektata/lorem v0.0.2/go.mod h1:4elDc+N81tciTDNFVCO3TxJKM+HRVJLszBcG00iREcA=
|
||||
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
||||
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
||||
|
|
@ -16,3 +18,5 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
|
|||
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
|
||||
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
|
|
|
|||
13
main.go
13
main.go
|
|
@ -25,10 +25,11 @@ import (
|
|||
|
||||
const VERSION = "v1"
|
||||
const CONTEXT_USER = 1
|
||||
const SYNC_PAGINATION = 250
|
||||
const SYNC_PAGINATION = 100
|
||||
|
||||
var (
|
||||
FlagGenerate bool
|
||||
FlagLoremIpsum bool
|
||||
FlagDev bool
|
||||
FlagConfig string
|
||||
FlagCreateUser string
|
||||
|
|
@ -60,6 +61,7 @@ func init() { // {{{
|
|||
flag.StringVar(&FlagConfig, "config", cfgFilename, "Configuration file")
|
||||
flag.BoolVar(&FlagDev, "dev", false, "Use local files instead of embedded files")
|
||||
flag.BoolVar(&FlagGenerate, "generate", false, "Generate test data")
|
||||
flag.BoolVar(&FlagLoremIpsum, "lorem-ipsum", false, "Replace all G- nodes with lorem ipsum paragraphs")
|
||||
flag.StringVar(&FlagCreateUser, "create-user", "", "Username for creating a new user")
|
||||
flag.StringVar(&FlagChangePassword, "change-password", "", "Change the password for the given username")
|
||||
flag.Parse()
|
||||
|
|
@ -99,6 +101,15 @@ func main() { // {{{
|
|||
return
|
||||
}
|
||||
|
||||
if FlagLoremIpsum {
|
||||
err := LoremIpsum()
|
||||
if err != nil {
|
||||
fmt.Printf("%s\n", err)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// A new user?
|
||||
if FlagCreateUser != "" {
|
||||
createNewUser(FlagCreateUser)
|
||||
|
|
|
|||
36
node.go
36
node.go
|
|
@ -4,9 +4,11 @@ import (
|
|||
// External
|
||||
werr "git.gibonuddevalla.se/go/wrappederror"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/derektata/lorem/ipsum"
|
||||
|
||||
// Standard
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
|
@ -285,6 +287,40 @@ func NodeCrumbs(nodeUUID string) (nodes []Node, err error) { // {{{
|
|||
return
|
||||
} // }}}
|
||||
|
||||
func LoremIpsum() (err error) {
|
||||
var numNodesRow *sql.Row
|
||||
var numNodes int
|
||||
numNodesRow = db.QueryRow(`SELECT COUNT(id) FROM node WHERE name LIKE 'G-%'`)
|
||||
err = numNodesRow.Scan(&numNodes)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
var rows *sql.Rows
|
||||
rows, err = db.Query(`SELECT id FROM node WHERE name LIKE 'G-%'`)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
lipsum := lorem.NewGenerator()
|
||||
var id, counter int
|
||||
for rows.Next() {
|
||||
counter++
|
||||
if counter&100 == 0 {
|
||||
fmt.Printf("%04d\n", counter)
|
||||
}
|
||||
err = rows.Scan(&id)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
db.Exec(`UPDATE node SET content=$2 WHERE id=$1`, id, lipsum.GenerateParagraphs(2))
|
||||
}
|
||||
fmt.Printf("%04d\n", counter)
|
||||
return
|
||||
}
|
||||
|
||||
func TestData() (err error) {
|
||||
for range 8 {
|
||||
hash1, name1, _ := generateOneTestNode("", "G")
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ html {
|
|||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 32px;
|
||||
gap: 8px;
|
||||
}
|
||||
#tree .node {
|
||||
display: grid;
|
||||
|
|
|
|||
|
|
@ -242,6 +242,35 @@ export class NodeStore {
|
|||
req.onerror = (event) => reject(event.target.error)
|
||||
})
|
||||
}//}}}
|
||||
async search(searchfor, parent) {//{{{
|
||||
return new Promise((resolve, reject) => {
|
||||
const trx = this.db.transaction('nodes', 'readonly')
|
||||
const nodeStore = trx.objectStore('nodes')
|
||||
const index = nodeStore.index('byParent')
|
||||
const req = index.getAll(parent)
|
||||
req.onsuccess = async (event) => {
|
||||
let nodes = []
|
||||
for (const i in event.target.result) {
|
||||
const nodeData = event.target.result[i]
|
||||
const children = await this.search(searchfor, nodeData.UUID)
|
||||
|
||||
// Data is searched for the provided text.
|
||||
// TODO: implement an array of words to search?
|
||||
if (nodeData.Content.toLowerCase().includes(searchfor))
|
||||
nodes.push({
|
||||
uuid: nodeData.UUID,
|
||||
name: nodeData.Name,
|
||||
ancestry: await this.getNodeAncestry(nodeData, []),
|
||||
})
|
||||
|
||||
nodes = nodes.concat(children)
|
||||
}
|
||||
resolve(nodes)
|
||||
return
|
||||
}
|
||||
req.onerror = (event) => reject(event.target.error)
|
||||
})
|
||||
}//}}}
|
||||
|
||||
async add(records) {//{{{
|
||||
return new Promise((resolve, reject) => {
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ class Tree extends Component {
|
|||
<div id="tree" ref=${this.treeDiv} tabindex="0">
|
||||
<div id="logo" onclick=${() => _notes2.current.goToNode(ROOT_NODE)}><img src="/images/${_VERSION}/logo.svg" /></div>
|
||||
<div class="icons">
|
||||
<img src="/images/${_VERSION}/icon_search.svg" style="height: 22px" onclick=${()=>_sync.run()} />
|
||||
<img src="/images/${_VERSION}/icon_refresh.svg" onclick=${()=>_sync.run()} />
|
||||
</div>
|
||||
${renderedTreeTrunk}
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ html {
|
|||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 32px;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.node {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue