module_users.go 8.4 KB

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