Mostly done now, search works.
This commit is contained in:
parent
51b18823ae
commit
c29077aa4c
4 changed files with 72 additions and 12 deletions
46
admin/db.go
46
admin/db.go
|
@ -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));
|
||||
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();
|
||||
|
||||
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…
Add table
Add a link
Reference in a new issue