module_settings.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. package modules
  2. import (
  3. "html"
  4. "io/ioutil"
  5. "os"
  6. "golang-fave/assets"
  7. "golang-fave/consts"
  8. "golang-fave/engine/builder"
  9. "golang-fave/engine/wrapper"
  10. "golang-fave/utils"
  11. )
  12. func (this *Modules) RegisterModule_Settings() *Module {
  13. return this.newModule(MInfo{
  14. WantDB: false,
  15. Mount: "settings",
  16. Name: "Settings",
  17. Order: 801,
  18. System: true,
  19. Icon: assets.SysSvgIconGear,
  20. Sub: &[]MISub{
  21. {Mount: "default", Name: "General", Show: true, Icon: assets.SysSvgIconGear},
  22. {Mount: "robots-txt", Name: "Robots.txt", Show: true, Icon: assets.SysSvgIconBug},
  23. {Mount: "pagination", Name: "Pagination", Show: true, Icon: assets.SysSvgIconPagination},
  24. {Mount: "thumbnails", Name: "Thumbnails", Show: true, Icon: assets.SysSvgIconThumbnails},
  25. {Mount: "smtp", Name: "SMTP", Show: true, Icon: assets.SysSvgIconEmail},
  26. {Mount: "api", Name: "API", Show: true, Icon: assets.SysSvgIconApi},
  27. },
  28. }, nil, func(wrap *wrapper.Wrapper) (string, string, string) {
  29. content := ""
  30. sidebar := ""
  31. if wrap.CurrSubModule == "" || wrap.CurrSubModule == "default" {
  32. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  33. {Name: "General"},
  34. })
  35. content += builder.DataForm(wrap, []builder.DataFormField{
  36. {
  37. Kind: builder.DFKHidden,
  38. Name: "action",
  39. Value: "settings-general",
  40. },
  41. {
  42. Kind: builder.DFKText,
  43. CallBack: func(field *builder.DataFormField) string {
  44. modules_list := ``
  45. modules_list += `<select class="form-control" id="lbl_module-at-home" name="module-at-home">`
  46. modules_list += `<option value="0"`
  47. if (*wrap.Config).Engine.MainModule == 0 {
  48. modules_list += ` selected`
  49. }
  50. modules_list += `>Pages</option>`
  51. modules_list += `<option value="1"`
  52. if (*wrap.Config).Engine.MainModule == 1 {
  53. modules_list += ` selected`
  54. }
  55. modules_list += `>Blog</option>`
  56. modules_list += `<option value="2"`
  57. if (*wrap.Config).Engine.MainModule == 2 {
  58. modules_list += ` selected`
  59. }
  60. modules_list += `>Shop</option>`
  61. modules_list += `</select>`
  62. return `<div class="form-group n3">` +
  63. `<div class="row">` +
  64. `<div class="col-md-3">` +
  65. `<label for="lbl_module-at-home">Module at home page</label>` +
  66. `</div>` +
  67. `<div class="col-md-9">` +
  68. `<div>` +
  69. modules_list +
  70. `</div>` +
  71. `</div>` +
  72. `</div>` +
  73. `</div>`
  74. },
  75. },
  76. {
  77. Kind: builder.DFKSubmit,
  78. Value: "Save",
  79. Target: "add-edit-button",
  80. },
  81. })
  82. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  83. } else if wrap.CurrSubModule == "robots-txt" {
  84. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  85. {Name: "Robots.txt"},
  86. })
  87. fcont := []byte(``)
  88. fcont, _ = ioutil.ReadFile(wrap.DTemplate + string(os.PathSeparator) + "robots.txt")
  89. content += builder.DataForm(wrap, []builder.DataFormField{
  90. {
  91. Kind: builder.DFKHidden,
  92. Name: "action",
  93. Value: "settings-robots-txt",
  94. },
  95. {
  96. Kind: builder.DFKText,
  97. CallBack: func(field *builder.DataFormField) string {
  98. return `<div class="form-group last"><div class="row"><div class="col-12"><textarea class="form-control autosize" id="lbl_content" name="content" placeholder="" autocomplete="off">` + html.EscapeString(string(fcont)) + `</textarea></div></div></div>`
  99. },
  100. },
  101. {
  102. Kind: builder.DFKSubmit,
  103. CallBack: func(field *builder.DataFormField) string {
  104. return `<div class="row d-lg-none"><div class="col-12"><div class="pt-3"><button type="submit" class="btn btn-primary" data-target="add-edit-button">Save</button></div></div></div>`
  105. },
  106. },
  107. })
  108. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  109. } else if wrap.CurrSubModule == "pagination" {
  110. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  111. {Name: "Pagination"},
  112. })
  113. content += builder.DataForm(wrap, []builder.DataFormField{
  114. {
  115. Kind: builder.DFKHidden,
  116. Name: "action",
  117. Value: "settings-pagination",
  118. },
  119. {
  120. Kind: builder.DFKNumber,
  121. Caption: "Blog main page",
  122. Name: "blog-index",
  123. Min: "1",
  124. Max: "100",
  125. Required: true,
  126. Value: utils.IntToStr((*wrap.Config).Blog.Pagination.Index),
  127. },
  128. {
  129. Kind: builder.DFKNumber,
  130. Caption: "Blog category page",
  131. Name: "blog-category",
  132. Min: "1",
  133. Max: "100",
  134. Required: true,
  135. Value: utils.IntToStr((*wrap.Config).Blog.Pagination.Category),
  136. },
  137. {
  138. Kind: builder.DFKText,
  139. Caption: "",
  140. Name: "",
  141. Value: "",
  142. CallBack: func(field *builder.DataFormField) string {
  143. return `<hr>`
  144. },
  145. },
  146. {
  147. Kind: builder.DFKNumber,
  148. Caption: "Shop main page",
  149. Name: "shop-index",
  150. Min: "1",
  151. Max: "100",
  152. Required: true,
  153. Value: utils.IntToStr((*wrap.Config).Shop.Pagination.Index),
  154. },
  155. {
  156. Kind: builder.DFKNumber,
  157. Caption: "Shop category page",
  158. Name: "shop-category",
  159. Min: "1",
  160. Max: "100",
  161. Required: true,
  162. Value: utils.IntToStr((*wrap.Config).Shop.Pagination.Category),
  163. },
  164. {
  165. Kind: builder.DFKSubmit,
  166. Value: "Save",
  167. Target: "add-edit-button",
  168. },
  169. })
  170. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  171. } else if wrap.CurrSubModule == "thumbnails" {
  172. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  173. {Name: "Thumbnails"},
  174. })
  175. content += builder.DataForm(wrap, []builder.DataFormField{
  176. {
  177. Kind: builder.DFKHidden,
  178. Name: "action",
  179. Value: "settings-thumbnails",
  180. },
  181. {
  182. Kind: builder.DFKText,
  183. CallBack: func(field *builder.DataFormField) string {
  184. resize_list := ``
  185. resize_list += `<select class="form-control" name="shop-thumbnail-r-1">`
  186. resize_list += `<option value="0"`
  187. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 0 {
  188. resize_list += ` selected`
  189. }
  190. resize_list += `>Crop</option>`
  191. resize_list += `<option value="1"`
  192. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 1 {
  193. resize_list += ` selected`
  194. }
  195. resize_list += `>Resize</option>`
  196. resize_list += `<option value="2"`
  197. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 2 {
  198. resize_list += ` selected`
  199. }
  200. resize_list += `>Fit into size</option>`
  201. resize_list += `</select>`
  202. return `<div class="form-group n3">` +
  203. `<div class="row">` +
  204. `<div class="col-md-3">` +
  205. `<label>Shop thumbnail 1</label>` +
  206. `</div>` +
  207. `<div class="col-md-9">` +
  208. `<div>` +
  209. `<div class="row">` +
  210. `<div class="col-md-3">` +
  211. `<div><input class="form-control" type="number" name="shop-thumbnail-w-1" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.Thumbnail1[0]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  212. `<div class="d-md-none mb-3"></div>` +
  213. `</div>` +
  214. `<div class="col-md-3">` +
  215. `<div><input class="form-control" type="number" name="shop-thumbnail-h-1" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.Thumbnail1[1]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  216. `<div class="d-md-none mb-3"></div>` +
  217. `</div>` +
  218. `<div class="col-md-6">` +
  219. resize_list +
  220. `</div>` +
  221. `</div>` +
  222. `</div>` +
  223. `</div>` +
  224. `</div>` +
  225. `</div>`
  226. },
  227. },
  228. {
  229. Kind: builder.DFKText,
  230. CallBack: func(field *builder.DataFormField) string {
  231. resize_list := ``
  232. resize_list += `<select class="form-control" name="shop-thumbnail-r-2">`
  233. resize_list += `<option value="0"`
  234. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 0 {
  235. resize_list += ` selected`
  236. }
  237. resize_list += `>Crop</option>`
  238. resize_list += `<option value="1"`
  239. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 1 {
  240. resize_list += ` selected`
  241. }
  242. resize_list += `>Resize</option>`
  243. resize_list += `<option value="2"`
  244. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 2 {
  245. resize_list += ` selected`
  246. }
  247. resize_list += `>Fit into size</option>`
  248. resize_list += `</select>`
  249. return `<div class="form-group n3">` +
  250. `<div class="row">` +
  251. `<div class="col-md-3">` +
  252. `<label>Shop thumbnail 2</label>` +
  253. `</div>` +
  254. `<div class="col-md-9">` +
  255. `<div>` +
  256. `<div class="row">` +
  257. `<div class="col-md-3">` +
  258. `<div><input class="form-control" type="number" name="shop-thumbnail-w-2" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.Thumbnail2[0]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  259. `<div class="d-md-none mb-3"></div>` +
  260. `</div>` +
  261. `<div class="col-md-3">` +
  262. `<div><input class="form-control" type="number" name="shop-thumbnail-h-2" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.Thumbnail2[1]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  263. `<div class="d-md-none mb-3"></div>` +
  264. `</div>` +
  265. `<div class="col-md-6">` +
  266. resize_list +
  267. `</div>` +
  268. `</div>` +
  269. `</div>` +
  270. `</div>` +
  271. `</div>` +
  272. `</div>`
  273. },
  274. },
  275. {
  276. Kind: builder.DFKText,
  277. CallBack: func(field *builder.DataFormField) string {
  278. resize_list := ``
  279. resize_list += `<select class="form-control" name="shop-thumbnail-r-3">`
  280. resize_list += `<option value="0"`
  281. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 0 {
  282. resize_list += ` selected`
  283. }
  284. resize_list += `>Crop</option>`
  285. resize_list += `<option value="1"`
  286. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 1 {
  287. resize_list += ` selected`
  288. }
  289. resize_list += `>Resize</option>`
  290. resize_list += `<option value="2"`
  291. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 2 {
  292. resize_list += ` selected`
  293. }
  294. resize_list += `>Fit into size</option>`
  295. resize_list += `</select>`
  296. return `<div class="form-group n3">` +
  297. `<div class="row">` +
  298. `<div class="col-md-3">` +
  299. `<label>Shop thumbnail 3</label>` +
  300. `</div>` +
  301. `<div class="col-md-9">` +
  302. `<div>` +
  303. `<div class="row">` +
  304. `<div class="col-md-3">` +
  305. `<div><input class="form-control" type="number" name="shop-thumbnail-w-3" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.Thumbnail3[0]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  306. `<div class="d-md-none mb-3"></div>` +
  307. `</div>` +
  308. `<div class="col-md-3">` +
  309. `<div><input class="form-control" type="number" name="shop-thumbnail-h-3" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.Thumbnail3[1]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  310. `<div class="d-md-none mb-3"></div>` +
  311. `</div>` +
  312. `<div class="col-md-6">` +
  313. resize_list +
  314. `</div>` +
  315. `</div>` +
  316. `</div>` +
  317. `</div>` +
  318. `</div>` +
  319. `</div>`
  320. },
  321. },
  322. {
  323. Kind: builder.DFKText,
  324. CallBack: func(field *builder.DataFormField) string {
  325. resize_list := ``
  326. resize_list += `<select class="form-control" name="shop-thumbnail-r-full">`
  327. resize_list += `<option value="0"`
  328. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 0 {
  329. resize_list += ` selected`
  330. }
  331. resize_list += `>Crop</option>`
  332. resize_list += `<option value="1"`
  333. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 1 {
  334. resize_list += ` selected`
  335. }
  336. resize_list += `>Resize</option>`
  337. resize_list += `<option value="2"`
  338. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 2 {
  339. resize_list += ` selected`
  340. }
  341. resize_list += `>Fit into size</option>`
  342. resize_list += `</select>`
  343. return `<div class="form-group n3">` +
  344. `<div class="row">` +
  345. `<div class="col-md-3">` +
  346. `<label>Shop thumbnail full</label>` +
  347. `</div>` +
  348. `<div class="col-md-9">` +
  349. `<div>` +
  350. `<div class="row">` +
  351. `<div class="col-md-3">` +
  352. `<div><input class="form-control" type="number" name="shop-thumbnail-w-full" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.ThumbnailFull[0]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  353. `<div class="d-md-none mb-3"></div>` +
  354. `</div>` +
  355. `<div class="col-md-3">` +
  356. `<div><input class="form-control" type="number" name="shop-thumbnail-h-full" value="` + utils.IntToStr((*wrap.Config).Shop.Thumbnails.ThumbnailFull[1]) + `" min="100" max="1000" placeholder="" autocomplete="off" required></div>` +
  357. `<div class="d-md-none mb-3"></div>` +
  358. `</div>` +
  359. `<div class="col-md-6">` +
  360. resize_list +
  361. `</div>` +
  362. `</div>` +
  363. `</div>` +
  364. `</div>` +
  365. `</div>` +
  366. `</div>`
  367. },
  368. },
  369. {
  370. Kind: builder.DFKSubmit,
  371. Value: "Save",
  372. Target: "add-edit-button",
  373. },
  374. })
  375. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  376. } else if wrap.CurrSubModule == "smtp" {
  377. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  378. {Name: "SMTP"},
  379. })
  380. content += builder.DataForm(wrap, []builder.DataFormField{
  381. {
  382. Kind: builder.DFKHidden,
  383. Name: "action",
  384. Value: "settings-smtp",
  385. },
  386. {
  387. Kind: builder.DFKText,
  388. Caption: "SMTP server host",
  389. Name: "smtp-host",
  390. Value: (*wrap.Config).SMTP.Host,
  391. Hint: "Example: smtp.gmail.com",
  392. },
  393. {
  394. Kind: builder.DFKNumber,
  395. Caption: "SMTP server port",
  396. Name: "smtp-port",
  397. Min: "0",
  398. Max: "9999",
  399. Required: true,
  400. Value: utils.IntToStr((*wrap.Config).SMTP.Port),
  401. Hint: "Example: 587",
  402. },
  403. {
  404. Kind: builder.DFKText,
  405. Caption: "SMTP user login",
  406. Name: "smtp-login",
  407. Value: (*wrap.Config).SMTP.Login,
  408. Hint: "Example: example@gmail.com",
  409. },
  410. {
  411. Kind: builder.DFKPassword,
  412. Caption: "SMTP user password",
  413. Name: "smtp-password",
  414. Value: "",
  415. Hint: "Leave this field empty if you don't want change password",
  416. },
  417. {
  418. Kind: builder.DFKText,
  419. Caption: "Email address for testing",
  420. Name: "smtp-test-email",
  421. Value: "",
  422. Hint: "To this email address will be send test email message if settings are correct",
  423. },
  424. {
  425. Kind: builder.DFKSubmit,
  426. Value: "Save",
  427. Target: "add-edit-button",
  428. },
  429. })
  430. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  431. } else if wrap.CurrSubModule == "api" {
  432. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  433. {Name: "API"},
  434. })
  435. content += builder.DataForm(wrap, []builder.DataFormField{
  436. {
  437. Kind: builder.DFKHidden,
  438. Name: "action",
  439. Value: "settings-api",
  440. },
  441. {
  442. Kind: builder.DFKCheckBox,
  443. Caption: "XML enabled",
  444. Name: "xml-enabled",
  445. Value: utils.IntToStr((*wrap.Config).API.XML.Enabled),
  446. Hint: "XML: <a href=\"/api/products/\" target=\"_blank\">/api/products/</a>",
  447. },
  448. {
  449. Kind: builder.DFKText,
  450. Caption: "XML name",
  451. Name: "xml-name",
  452. Value: (*wrap.Config).API.XML.Name,
  453. },
  454. {
  455. Kind: builder.DFKText,
  456. Caption: "XML company",
  457. Name: "xml-company",
  458. Value: (*wrap.Config).API.XML.Company,
  459. },
  460. {
  461. Kind: builder.DFKText,
  462. Caption: "XML url",
  463. Name: "xml-url",
  464. Value: (*wrap.Config).API.XML.Url,
  465. },
  466. {
  467. Kind: builder.DFKSubmit,
  468. Value: "Save",
  469. Target: "add-edit-button",
  470. },
  471. })
  472. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  473. }
  474. return this.getSidebarModules(wrap), content, sidebar
  475. })
  476. }