Mostly done now, search works.

main
Zed A. Shaw 1 day ago
parent 51b18823ae
commit c29077aa4c
  1. 46
      admin/db.go
  2. 16
      admin/handlers.go
  3. 17
      static/js/code.js
  4. 5
      views/admin/table/contents.html

@ -8,8 +8,48 @@ import (
sq "github.com/Masterminds/squirrel"
)
func SelectTable(table string, the_type reflect.Type, limit uint64, page uint64) ([]interface{}, error) {
var results []interface{}
func SearchTable(search string, table string, the_type reflect.Type, limit uint64, page uint64) ([]any, error) {
var results []any
like := fmt.Sprint("%", search, "%")
builder := sq.Select("*").
Limit(limit).
Offset(limit * page).
From(table)
field_num := the_type.NumField()
var or_clause sq.Or
for i := 0; i < field_num; i++ {
tag := the_type.Field(i).Tag.Get("db")
or_clause = append(or_clause, sq.Like{tag: like})
}
builder = builder.Where(or_clause)
sql_query, args, err := builder.ToSql()
fmt.Println("-------------- SQL QUERY:", sql_query);
if err != nil { return results, err }
// BUG: refactor this to share a common func with SelectTable
rows, err := data.DB.Queryx(sql_query, args...)
if err != nil { return results, err }
defer rows.Close()
for rows.Next() {
the_data := reflect.New(the_type).Interface()
err = rows.StructScan(the_data)
if err != nil { return results, err }
results = append(results, the_data)
}
return results, rows.Err()
}
func SelectTable(table string, the_type reflect.Type, limit uint64, page uint64) ([]any, error) {
var results []any
sql_query, args, err := sq.Select("*").Limit(limit).Offset(limit * page).From(table).ToSql()
if err != nil { return results, err }
@ -51,7 +91,7 @@ func Insert(table string, value reflect.Value) (int64, int64, error) {
type_of := value.Type()
field_num := value.NumField()
var columns []string
var values []interface{}
var values []any
for i := 0; i < field_num; i++ {
field := value.Field(i)

@ -25,11 +25,21 @@ func GetApiSelectAll(c *fiber.Ctx) error {
type_is := data.Models()[table]
page := c.QueryInt("page", 0)
fmt.Println("-------------------------", page)
if page < 0 { page = 0 }
result, err := SelectTable(table, type_is, 20, uint64(page));
if err != nil { return IfErrNil(err, c) }
search := c.Query("search", "")
var result []any
var err error
if search == "" {
result, err = SelectTable(table, type_is, 20, uint64(page));
if err != nil { return IfErrNil(err, c) }
} else {
// NOTE: need a 404 here when there's no result? or empty list?
fmt.Println("---------------- SEARCH", search)
result, err = SearchTable(search, table, type_is, 20, uint64(page));
if err != nil { return IfErrNil(err, c) }
}
return c.JSON(result)
}

@ -4,17 +4,28 @@ class PaginateTable {
this.items = [];
this.url = url;
this.headers = [];
this.search_query=""
}
async contents() {
if(this.page < 0) this.page = 0;
const resp = await fetch(`${this.url}?page=${this.page}`);
let url = `${this.url}?page=${this.page}`;
if(this.search_query !== "") {
this.page = 0;
url += `&search=${this.search_query}`
}
const resp = await fetch(url);
console.assert(resp.status == 200, "failed to get it");
this.items = await resp.json();
const items = await resp.json();
this.headers = Object.keys(this.items[0]);
if(items) {
this.items = items;
this.headers = Object.keys(this.items[0]);
}
return this.items;
}

@ -10,8 +10,7 @@
<button type="button"><a href="/admin/new/table/{{ .Table }}/">New</a></button>
<button type="button" @click="page -= 1">Prev</button>
<button type="button" @click="page += 1">Next</button>
<input type="text" name="search" size="35" placeholder="Search" />
<button type="button">Search</button>
<input type="text" x-model.debounce="search_query" name="search" size="40" placeholder="Search" />
</block>
<table>
<tr>
@ -20,7 +19,7 @@
<th x-text="header"></th>
</template>
</tr>
<template x-for="item in contents">
<template x-for="item in contents" :key="item.id">
<tr>
<td>
<a x-bind:href="'/admin/table/{{ .Table }}/' + item.id + '/'">

Loading…
Cancel
Save