package builder import ( "fmt" "html" "math" "strconv" "golang-fave/engine/wrapper" ) type DataTableRow struct { DBField string NameInTable string CallBack func(values *[]string) string } func DataTable(wrap *wrapper.Wrapper, table string, order_by string, order_way string, data []DataTableRow, action func(values *[]string) string, pagination_url string) string { var num int err := wrap.DB.QueryRow("SELECT COUNT(*) FROM `" + table + "`;").Scan(&num) if err != nil { return "" } pear_page := 10 max_pages := int(math.Ceil(float64(num) / float64(pear_page))) curr_page := 1 p := wrap.R.URL.Query().Get("p") if p != "" { pi, err := strconv.Atoi(p) if err != nil { curr_page = 1 } else { if pi < 1 { curr_page = 1 } else if pi > max_pages { curr_page = max_pages } else { curr_page = pi } } } limit_offset := curr_page*pear_page - pear_page result := `` result += `` result += `` sql := "SELECT" for i, column := range data { if column.NameInTable != "" { result += `` } sql += " `" + column.DBField + "`" if i+1 < len(data) { sql += "," } } sql += " FROM `" + table + "` ORDER BY `" + order_by + "` " + order_way + " LIMIT ?, ?;" if action != nil { result += `` } result += `` result += `` result += `` if num > 0 { rows, err := wrap.DB.Query(sql, limit_offset, pear_page) if err == nil { values := make([]string, len(data)) scan := make([]interface{}, len(values)) for i := range values { scan[i] = &values[i] } for rows.Next() { err = rows.Scan(scan...) if err == nil { result += `` for i, val := range values { if data[i].NameInTable != "" { if data[i].CallBack == nil { result += `` } else { result += `` } } } if action != nil { result += `` } result += `` } } } } else { result += `` } result += `
` + html.EscapeString(column.NameInTable) + ` 
` + html.EscapeString(string(val)) + `` + data[i].CallBack(&values) + `` + action(&values) + `
No any data found
` // Show page navigation only if pages more then one if max_pages > 1 { result += `` } return result }