Browse Source

Adaptation for blog categories data

Vova Tkach 6 years ago
parent
commit
f222af804d
4 changed files with 186 additions and 115 deletions
  1. 42 14
      engine/builder/data_table.go
  2. 25 2
      modules/module_blog.go
  3. 59 49
      modules/module_index.go
  4. 60 50
      modules/module_users.go

+ 42 - 14
engine/builder/data_table.go

@@ -1,6 +1,7 @@
 package builder
 
 import (
+	"database/sql"
 	"fmt"
 	"html"
 	"math"
@@ -17,11 +18,25 @@ type DataTableRow struct {
 	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 {
+func DataTable(
+	wrap *wrapper.Wrapper,
+	table string,
+	order_by string,
+	order_way string,
+	data *[]DataTableRow,
+	action func(values *[]string) string,
+	pagination_url string,
+	custom_sql_count func() int,
+	custom_sql_data func(limit_offset int, pear_page int) (*sql.Rows, error),
+) string {
 	var num int
-	err := wrap.DB.QueryRow("SELECT COUNT(*) FROM `" + table + "`;").Scan(&num)
-	if err != nil {
-		return ""
+	if custom_sql_count != nil {
+		num = custom_sql_count()
+	} else {
+		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)))
@@ -45,7 +60,10 @@ func DataTable(wrap *wrapper.Wrapper, table string, order_by string, order_way s
 	result := `<table id="cp-table-` + table + `" class="table data-table table-striped table-bordered table-hover table_` + table + `">`
 	result += `<thead>`
 	result += `<tr>`
-	sql := "SELECT"
+	qsql := ""
+	if custom_sql_data == nil {
+		qsql = "SELECT"
+	}
 	for i, column := range *data {
 		if column.NameInTable != "" {
 			classes := column.Classes
@@ -54,16 +72,20 @@ func DataTable(wrap *wrapper.Wrapper, table string, order_by string, order_way s
 			}
 			result += `<th scope="col" class="col_` + column.DBField + classes + `">` + html.EscapeString(column.NameInTable) + `</th>`
 		}
-		if column.DBExp == "" {
-			sql += " `" + column.DBField + "`"
-		} else {
-			sql += " " + column.DBExp + " as `" + column.DBField + "`"
-		}
-		if i+1 < len(*data) {
-			sql += ","
+		if custom_sql_data == nil {
+			if column.DBExp == "" {
+				qsql += " `" + column.DBField + "`"
+			} else {
+				qsql += " " + column.DBExp + " as `" + column.DBField + "`"
+			}
+			if i+1 < len(*data) {
+				qsql += ","
+			}
 		}
 	}
-	sql += " FROM `" + table + "` ORDER BY `" + order_by + "` " + order_way + " LIMIT ?, ?;"
+	if custom_sql_data == nil {
+		qsql += " FROM `" + table + "` ORDER BY `" + order_by + "` " + order_way + " LIMIT ?, ?;"
+	}
 	if action != nil {
 		result += `<th scope="col" class="col_action">&nbsp;</th>`
 	}
@@ -71,7 +93,13 @@ func DataTable(wrap *wrapper.Wrapper, table string, order_by string, order_way s
 	result += `</thead>`
 	result += `<tbody>`
 	if num > 0 {
-		rows, err := wrap.DB.Query(sql, limit_offset, pear_page)
+		var rows *sql.Rows
+		var err error
+		if custom_sql_data == nil {
+			rows, err = wrap.DB.Query(qsql, limit_offset, pear_page)
+		} else {
+			rows, err = custom_sql_data(limit_offset, pear_page)
+		}
 		if err == nil {
 			values := make([]string, len(*data))
 			scan := make([]interface{}, len(values))

+ 25 - 2
modules/module_blog.go

@@ -5,7 +5,7 @@ import (
 
 	"golang-fave/assets"
 	"golang-fave/consts"
-	//"golang-fave/engine/builder"
+	"golang-fave/engine/builder"
 	"golang-fave/engine/wrapper"
 	//"golang-fave/utils"
 )
@@ -39,7 +39,30 @@ func (this *Modules) RegisterModule_Blog() *Module {
 			content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
 				{Name: "List of categories"},
 			})
-			//
+			content += builder.DataTable(
+				wrap,
+				"blog_cats",
+				"id",
+				"DESC",
+				&[]builder.DataTableRow{
+					{
+						DBField:     "id",
+						NameInTable: "Id",
+					},
+					{
+						DBField:     "name",
+						NameInTable: "Name",
+					},
+					{
+						DBField:     "alias",
+						NameInTable: "Alias",
+					},
+				},
+				nil,
+				"/cp/"+wrap.CurrModule+"/"+wrap.CurrSubModule+"/",
+				nil,
+				nil,
+			)
 		} else if wrap.CurrSubModule == "add" || wrap.CurrSubModule == "modify" {
 			if wrap.CurrSubModule == "add" {
 				content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{

+ 59 - 49
modules/module_index.go

@@ -95,63 +95,73 @@ func (this *Modules) RegisterModule_Index() *Module {
 			content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
 				{Name: "List of pages"},
 			})
-			content += builder.DataTable(wrap, "pages", "id", "DESC", &[]builder.DataTableRow{
-				{
-					DBField: "id",
-				},
-				{
-					DBField:     "name",
-					NameInTable: "Page / Alias",
-					CallBack: func(values *[]string) string {
-						name := `<a href="/cp/` + wrap.CurrModule + `/modify/` + (*values)[0] + `/">` + html.EscapeString((*values)[1]) + `</a>`
-						alias := html.EscapeString((*values)[2])
-						return `<div>` + name + `</div><div><small>` + alias + `</small></div>`
-					},
-				},
-				{
-					DBField: "alias",
-				},
-				{
-					DBField:     "datetime",
-					DBExp:       "UNIX_TIMESTAMP(`datetime`)",
-					NameInTable: "Date / Time",
-					Classes:     "d-none d-md-table-cell",
-					CallBack: func(values *[]string) string {
-						t := int64(utils.StrToInt((*values)[3]))
-						return `<div>` + utils.UnixTimestampToFormat(t, "02.01.2006") + `</div>` +
-							`<div><small>` + utils.UnixTimestampToFormat(t, "15:04:05") + `</small></div>`
+			content += builder.DataTable(
+				wrap,
+				"pages",
+				"id",
+				"DESC",
+				&[]builder.DataTableRow{
+					{
+						DBField: "id",
 					},
-				},
-				{
-					DBField:     "active",
-					NameInTable: "Active",
-					Classes:     "d-none d-sm-table-cell",
-					CallBack: func(values *[]string) string {
-						return builder.CheckBox(utils.StrToInt((*values)[4]))
+					{
+						DBField:     "name",
+						NameInTable: "Page / Alias",
+						CallBack: func(values *[]string) string {
+							name := `<a href="/cp/` + wrap.CurrModule + `/modify/` + (*values)[0] + `/">` + html.EscapeString((*values)[1]) + `</a>`
+							alias := html.EscapeString((*values)[2])
+							return `<div>` + name + `</div><div><small>` + alias + `</small></div>`
+						},
 					},
-				},
-			}, func(values *[]string) string {
-				return builder.DataTableAction(&[]builder.DataTableActionRow{
 					{
-						Icon:   assets.SysSvgIconView,
-						Href:   (*values)[2],
-						Hint:   "View",
-						Target: "_blank",
+						DBField: "alias",
 					},
 					{
-						Icon: assets.SysSvgIconEdit,
-						Href: "/cp/" + wrap.CurrModule + "/modify/" + (*values)[0] + "/",
-						Hint: "Edit",
+						DBField:     "datetime",
+						DBExp:       "UNIX_TIMESTAMP(`datetime`)",
+						NameInTable: "Date / Time",
+						Classes:     "d-none d-md-table-cell",
+						CallBack: func(values *[]string) string {
+							t := int64(utils.StrToInt((*values)[3]))
+							return `<div>` + utils.UnixTimestampToFormat(t, "02.01.2006") + `</div>` +
+								`<div><small>` + utils.UnixTimestampToFormat(t, "15:04:05") + `</small></div>`
+						},
 					},
 					{
-						Icon: assets.SysSvgIconRemove,
-						Href: "javascript:fave.ActionDataTableDelete(this,'index-delete','" +
-							(*values)[0] + "','Are you sure want to delete page?');",
-						Hint:    "Delete",
-						Classes: "delete",
+						DBField:     "active",
+						NameInTable: "Active",
+						Classes:     "d-none d-sm-table-cell",
+						CallBack: func(values *[]string) string {
+							return builder.CheckBox(utils.StrToInt((*values)[4]))
+						},
 					},
-				})
-			}, "/cp/"+wrap.CurrModule+"/")
+				},
+				func(values *[]string) string {
+					return builder.DataTableAction(&[]builder.DataTableActionRow{
+						{
+							Icon:   assets.SysSvgIconView,
+							Href:   (*values)[2],
+							Hint:   "View",
+							Target: "_blank",
+						},
+						{
+							Icon: assets.SysSvgIconEdit,
+							Href: "/cp/" + wrap.CurrModule + "/modify/" + (*values)[0] + "/",
+							Hint: "Edit",
+						},
+						{
+							Icon: assets.SysSvgIconRemove,
+							Href: "javascript:fave.ActionDataTableDelete(this,'index-delete','" +
+								(*values)[0] + "','Are you sure want to delete page?');",
+							Hint:    "Delete",
+							Classes: "delete",
+						},
+					})
+				},
+				"/cp/"+wrap.CurrModule+"/",
+				nil,
+				nil,
+			)
 		} else if wrap.CurrSubModule == "add" || wrap.CurrSubModule == "modify" {
 			if wrap.CurrSubModule == "add" {
 				content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{

+ 60 - 50
modules/module_users.go

@@ -30,63 +30,73 @@ func (this *Modules) RegisterModule_Users() *Module {
 			content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
 				{Name: "List of users"},
 			})
-			content += builder.DataTable(wrap, "users", "id", "DESC", &[]builder.DataTableRow{
-				{
-					DBField: "id",
-				},
-				{
-					DBField:     "email",
-					NameInTable: "Email / Name",
-					CallBack: func(values *[]string) string {
-						email := `<a href="/cp/` + wrap.CurrModule + `/modify/` + (*values)[0] + `/">` + html.EscapeString((*values)[1]) + `</a>`
-						name := html.EscapeString((*values)[2])
-						if name != "" && (*values)[3] != "" {
-							name += ` ` + (*values)[3]
-						}
-						if name != "" {
-							name = `<div><small>` + name + `</small></div>`
-						}
-						return `<div>` + email + `</div>` + name
+			content += builder.DataTable(
+				wrap,
+				"users",
+				"id",
+				"DESC",
+				&[]builder.DataTableRow{
+					{
+						DBField: "id",
 					},
-				},
-				{
-					DBField: "first_name",
-				},
-				{
-					DBField: "last_name",
-				},
-				{
-					DBField:     "active",
-					NameInTable: "Active",
-					Classes:     "d-none d-sm-table-cell",
-					CallBack: func(values *[]string) string {
-						return builder.CheckBox(utils.StrToInt((*values)[4]))
+					{
+						DBField:     "email",
+						NameInTable: "Email / Name",
+						CallBack: func(values *[]string) string {
+							email := `<a href="/cp/` + wrap.CurrModule + `/modify/` + (*values)[0] + `/">` + html.EscapeString((*values)[1]) + `</a>`
+							name := html.EscapeString((*values)[2])
+							if name != "" && (*values)[3] != "" {
+								name += ` ` + (*values)[3]
+							}
+							if name != "" {
+								name = `<div><small>` + name + `</small></div>`
+							}
+							return `<div>` + email + `</div>` + name
+						},
 					},
-				},
-				{
-					DBField:     "admin",
-					NameInTable: "Admin",
-					Classes:     "d-none d-md-table-cell",
-					CallBack: func(values *[]string) string {
-						return builder.CheckBox(utils.StrToInt((*values)[5]))
+					{
+						DBField: "first_name",
 					},
-				},
-			}, func(values *[]string) string {
-				return builder.DataTableAction(&[]builder.DataTableActionRow{
 					{
-						Icon: assets.SysSvgIconEdit,
-						Href: "/cp/" + wrap.CurrModule + "/modify/" + (*values)[0] + "/",
-						Hint: "Edit",
+						DBField: "last_name",
 					},
 					{
-						Icon: assets.SysSvgIconRemove,
-						Href: "javascript:fave.ActionDataTableDelete(this,'users-delete','" +
-							(*values)[0] + "','Are you sure want to delete user?');",
-						Hint:    "Delete",
-						Classes: "delete",
+						DBField:     "active",
+						NameInTable: "Active",
+						Classes:     "d-none d-sm-table-cell",
+						CallBack: func(values *[]string) string {
+							return builder.CheckBox(utils.StrToInt((*values)[4]))
+						},
 					},
-				})
-			}, "/cp/"+wrap.CurrModule+"/")
+					{
+						DBField:     "admin",
+						NameInTable: "Admin",
+						Classes:     "d-none d-md-table-cell",
+						CallBack: func(values *[]string) string {
+							return builder.CheckBox(utils.StrToInt((*values)[5]))
+						},
+					},
+				},
+				func(values *[]string) string {
+					return builder.DataTableAction(&[]builder.DataTableActionRow{
+						{
+							Icon: assets.SysSvgIconEdit,
+							Href: "/cp/" + wrap.CurrModule + "/modify/" + (*values)[0] + "/",
+							Hint: "Edit",
+						},
+						{
+							Icon: assets.SysSvgIconRemove,
+							Href: "javascript:fave.ActionDataTableDelete(this,'users-delete','" +
+								(*values)[0] + "','Are you sure want to delete user?');",
+							Hint:    "Delete",
+							Classes: "delete",
+						},
+					})
+				},
+				"/cp/"+wrap.CurrModule+"/",
+				nil,
+				nil,
+			)
 		} else if wrap.CurrSubModule == "add" || wrap.CurrSubModule == "modify" {
 			if wrap.CurrSubModule == "add" {
 				content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{