From 8d6ec8b4ffeb9cc6d3002ee0aff7818d6f260409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Mon, 21 Apr 2025 17:56:25 +0200 Subject: [PATCH 1/2] Added lorem ipsum generation and Javascript search --- go.mod | 3 +++ go.sum | 4 ++++ main.go | 13 ++++++++++++- node.go | 36 ++++++++++++++++++++++++++++++++++++ static/css/notes2.css | 1 + static/js/node_store.mjs | 29 +++++++++++++++++++++++++++++ static/js/notes2.mjs | 1 + static/less/notes2.less | 1 + 8 files changed, 87 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c6765eb..f4ac7a0 100644 --- a/go.mod +++ b/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 diff --git a/go.sum b/go.sum index e447a59..afb8ca9 100644 --- a/go.sum +++ b/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= diff --git a/main.go b/main.go index 3c17136..a9ac728 100644 --- a/main.go +++ b/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) diff --git a/node.go b/node.go index 9ddebae..ffcc89f 100644 --- a/node.go +++ b/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") diff --git a/static/css/notes2.css b/static/css/notes2.css index 4dd71c4..4aabc0a 100644 --- a/static/css/notes2.css +++ b/static/css/notes2.css @@ -44,6 +44,7 @@ html { display: flex; justify-content: center; margin-bottom: 32px; + gap: 8px; } #tree .node { display: grid; diff --git a/static/js/node_store.mjs b/static/js/node_store.mjs index e57503e..80aa758 100644 --- a/static/js/node_store.mjs +++ b/static/js/node_store.mjs @@ -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) => { diff --git a/static/js/notes2.mjs b/static/js/notes2.mjs index 9632853..6c33502 100644 --- a/static/js/notes2.mjs +++ b/static/js/notes2.mjs @@ -99,6 +99,7 @@ class Tree extends Component {
+ _sync.run()} /> _sync.run()} />
${renderedTreeTrunk} diff --git a/static/less/notes2.less b/static/less/notes2.less index e537c45..08c8251 100644 --- a/static/less/notes2.less +++ b/static/less/notes2.less @@ -76,6 +76,7 @@ html { display: flex; justify-content: center; margin-bottom: 32px; + gap: 8px; } .node { From b36ca0d635e5250d2a08e0825c4505f8fd3bf2d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Mon, 21 Apr 2025 17:56:41 +0200 Subject: [PATCH 2/2] Added search icon --- static/images/icon_search.svg | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 static/images/icon_search.svg diff --git a/static/images/icon_search.svg b/static/images/icon_search.svg new file mode 100644 index 0000000..8be3977 --- /dev/null +++ b/static/images/icon_search.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + magnify + + +