module_users.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. package modules
  2. import (
  3. "html"
  4. "golang-fave/assets"
  5. "golang-fave/consts"
  6. "golang-fave/engine/builder"
  7. "golang-fave/engine/wrapper"
  8. "golang-fave/utils"
  9. )
  10. func (this *Modules) RegisterModule_Users() *Module {
  11. return this.newModule(MInfo{
  12. WantDB: true,
  13. Mount: "users",
  14. Name: "Users",
  15. Order: 800,
  16. System: true,
  17. Icon: assets.SysSvgIconUser,
  18. Sub: &[]MISub{
  19. {Mount: "default", Name: "List of Users", Show: true, Icon: assets.SysSvgIconList},
  20. {Mount: "add", Name: "Add New User", Show: true, Icon: assets.SysSvgIconPlus},
  21. {Mount: "modify", Name: "Modify User", Show: false},
  22. },
  23. }, nil, func(wrap *wrapper.Wrapper) (string, string, string) {
  24. content := ""
  25. sidebar := ""
  26. if wrap.CurrSubModule == "" || wrap.CurrSubModule == "default" {
  27. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  28. {Name: "List of Users"},
  29. })
  30. content += builder.DataTable(wrap, "users", "id", "DESC", &[]builder.DataTableRow{
  31. {
  32. DBField: "id",
  33. },
  34. {
  35. DBField: "email",
  36. NameInTable: "Email / Name",
  37. CallBack: func(values *[]string) string {
  38. email := `<a href="/cp/` + wrap.CurrModule + `/modify/` + (*values)[0] + `/">` + html.EscapeString((*values)[1]) + `</a>`
  39. name := html.EscapeString((*values)[2])
  40. if name != "" && (*values)[3] != "" {
  41. name += ` ` + (*values)[3]
  42. }
  43. if name != "" {
  44. name = `<div><small>` + name + `</small></div>`
  45. }
  46. return `<div>` + email + `</div>` + name
  47. },
  48. },
  49. {
  50. DBField: "first_name",
  51. },
  52. {
  53. DBField: "last_name",
  54. },
  55. {
  56. DBField: "active",
  57. NameInTable: "Active",
  58. CallBack: func(values *[]string) string {
  59. return builder.CheckBox(utils.StrToInt((*values)[4]))
  60. },
  61. },
  62. {
  63. DBField: "admin",
  64. NameInTable: "Admin",
  65. CallBack: func(values *[]string) string {
  66. return builder.CheckBox(utils.StrToInt((*values)[5]))
  67. },
  68. },
  69. }, func(values *[]string) string {
  70. return builder.DataTableAction(&[]builder.DataTableActionRow{
  71. {
  72. Icon: assets.SysSvgIconEdit,
  73. Href: "/cp/" + wrap.CurrModule + "/modify/" + (*values)[0] + "/",
  74. Hint: "Edit",
  75. },
  76. {
  77. Icon: assets.SysSvgIconRemove,
  78. Href: "javascript:fave.ActionDataTableDelete(this,'users-delete','" +
  79. (*values)[0] + "','Are you sure want to delete user?');",
  80. Hint: "Delete",
  81. },
  82. })
  83. }, "/cp/"+wrap.CurrModule+"/")
  84. } else if wrap.CurrSubModule == "add" || wrap.CurrSubModule == "modify" {
  85. if wrap.CurrSubModule == "add" {
  86. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  87. {Name: "Add New User"},
  88. })
  89. } else {
  90. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  91. {Name: "Modify User"},
  92. })
  93. }
  94. data := utils.MySql_user{
  95. A_id: 0,
  96. A_first_name: "",
  97. A_last_name: "",
  98. A_email: "",
  99. A_admin: 0,
  100. A_active: 0,
  101. }
  102. if wrap.CurrSubModule == "modify" {
  103. if len(wrap.UrlArgs) != 3 {
  104. return "", "", ""
  105. }
  106. if !utils.IsNumeric(wrap.UrlArgs[2]) {
  107. return "", "", ""
  108. }
  109. err := wrap.DB.QueryRow(`
  110. SELECT
  111. id,
  112. first_name,
  113. last_name,
  114. email,
  115. admin,
  116. active
  117. FROM
  118. users
  119. WHERE
  120. id = ?
  121. LIMIT 1;`,
  122. utils.StrToInt(wrap.UrlArgs[2]),
  123. ).Scan(
  124. &data.A_id,
  125. &data.A_first_name,
  126. &data.A_last_name,
  127. &data.A_email,
  128. &data.A_admin,
  129. &data.A_active,
  130. )
  131. if err != nil {
  132. return "", "", ""
  133. }
  134. }
  135. pass_req := true
  136. pass_hint := ""
  137. if wrap.CurrSubModule == "modify" {
  138. pass_req = false
  139. pass_hint = "Leave the field blank to not change the password"
  140. }
  141. content += builder.DataForm(wrap, []builder.DataFormField{
  142. {
  143. Kind: builder.DFKHidden,
  144. Name: "action",
  145. Value: "users-modify",
  146. },
  147. {
  148. Kind: builder.DFKHidden,
  149. Name: "id",
  150. Value: utils.IntToStr(data.A_id),
  151. },
  152. {
  153. Kind: builder.DFKText,
  154. Caption: "First Name",
  155. Name: "first_name",
  156. Value: data.A_first_name,
  157. },
  158. {
  159. Kind: builder.DFKText,
  160. Caption: "Last Name",
  161. Name: "last_name",
  162. Value: data.A_last_name,
  163. },
  164. {
  165. Kind: builder.DFKEmail,
  166. Caption: "Email",
  167. Name: "email",
  168. Value: data.A_email,
  169. Required: true,
  170. },
  171. {
  172. Kind: builder.DFKPassword,
  173. Caption: "Password",
  174. Name: "password",
  175. Required: pass_req,
  176. Hint: pass_hint,
  177. },
  178. {
  179. Kind: builder.DFKCheckBox,
  180. Caption: "Active",
  181. Name: "active",
  182. Value: utils.IntToStr(data.A_active),
  183. },
  184. {
  185. Kind: builder.DFKCheckBox,
  186. Caption: "Admin",
  187. Name: "admin",
  188. Value: utils.IntToStr(data.A_admin),
  189. },
  190. {
  191. Kind: builder.DFKMessage,
  192. },
  193. {
  194. Kind: builder.DFKSubmit,
  195. Value: "Add",
  196. Target: "add-edit-button",
  197. },
  198. })
  199. if wrap.CurrSubModule == "add" {
  200. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Add</button>`
  201. } else {
  202. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  203. }
  204. }
  205. return this.getSidebarModules(wrap), content, sidebar
  206. })
  207. }
  208. func (this *Modules) RegisterAction_UsersModify() *Action {
  209. return this.newAction(AInfo{
  210. WantDB: true,
  211. Mount: "users-modify",
  212. WantAdmin: true,
  213. }, func(wrap *wrapper.Wrapper) {
  214. pf_id := wrap.R.FormValue("id")
  215. pf_first_name := wrap.R.FormValue("first_name")
  216. pf_last_name := wrap.R.FormValue("last_name")
  217. pf_email := wrap.R.FormValue("email")
  218. pf_password := wrap.R.FormValue("password")
  219. pf_admin := wrap.R.FormValue("admin")
  220. pf_active := wrap.R.FormValue("active")
  221. if pf_admin == "" {
  222. pf_admin = "0"
  223. }
  224. if pf_active == "" {
  225. pf_active = "0"
  226. }
  227. if !utils.IsNumeric(pf_id) {
  228. wrap.MsgError(`Inner system error`)
  229. return
  230. }
  231. if pf_email == "" {
  232. wrap.MsgError(`Please specify user email`)
  233. return
  234. }
  235. if !utils.IsValidEmail(pf_email) {
  236. wrap.MsgError(`Please specify correct user email`)
  237. return
  238. }
  239. // First user always super admin
  240. // Rewrite active and admin status
  241. if pf_id == "1" {
  242. pf_admin = "1"
  243. pf_active = "1"
  244. }
  245. if pf_id == "0" {
  246. // Add new user
  247. if pf_password == "" {
  248. wrap.MsgError(`Please specify user password`)
  249. return
  250. }
  251. _, err := wrap.DB.Query(
  252. `INSERT INTO users SET
  253. first_name = ?,
  254. last_name = ?,
  255. email = ?,
  256. password = MD5(?),
  257. admin = ?,
  258. active = ?
  259. ;`,
  260. pf_first_name,
  261. pf_last_name,
  262. pf_email,
  263. pf_password,
  264. pf_admin,
  265. pf_active,
  266. )
  267. if err != nil {
  268. wrap.MsgError(err.Error())
  269. return
  270. }
  271. wrap.Write(`window.location='/cp/users/';`)
  272. } else {
  273. // Update user
  274. if pf_password == "" {
  275. _, err := wrap.DB.Query(
  276. `UPDATE users SET
  277. first_name = ?,
  278. last_name = ?,
  279. email = ?,
  280. admin = ?,
  281. active = ?
  282. WHERE
  283. id = ?
  284. ;`,
  285. pf_first_name,
  286. pf_last_name,
  287. pf_email,
  288. pf_admin,
  289. pf_active,
  290. utils.StrToInt(pf_id),
  291. )
  292. if err != nil {
  293. wrap.MsgError(err.Error())
  294. return
  295. }
  296. } else {
  297. _, err := wrap.DB.Query(
  298. `UPDATE users SET
  299. first_name = ?,
  300. last_name = ?,
  301. email = ?,
  302. password = MD5(?)
  303. WHERE
  304. id = ?
  305. ;`,
  306. pf_first_name,
  307. pf_last_name,
  308. pf_email,
  309. pf_password,
  310. utils.StrToInt(pf_id),
  311. )
  312. if err != nil {
  313. wrap.MsgError(err.Error())
  314. return
  315. }
  316. }
  317. wrap.Write(`window.location='/cp/users/modify/` + pf_id + `/';`)
  318. }
  319. })
  320. }
  321. func (this *Modules) RegisterAction_UsersDelete() *Action {
  322. return this.newAction(AInfo{
  323. WantDB: true,
  324. Mount: "users-delete",
  325. WantAdmin: true,
  326. }, func(wrap *wrapper.Wrapper) {
  327. pf_id := wrap.R.FormValue("id")
  328. if !utils.IsNumeric(pf_id) {
  329. wrap.MsgError(`Inner system error`)
  330. return
  331. }
  332. // Delete user
  333. _, err := wrap.DB.Query(
  334. `DELETE FROM users WHERE id = ? and id <> 1;`,
  335. utils.StrToInt(pf_id),
  336. )
  337. if err != nil {
  338. wrap.MsgError(err.Error())
  339. return
  340. }
  341. // Reload current page
  342. wrap.Write(`window.location.reload(false);`)
  343. })
  344. }