module_settings.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  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. price_format_list := ``
  63. price_format_list += `<select class="form-control" id="lbl_price-fomat" name="price-fomat">`
  64. price_format_list += `<option value="0"`
  65. if (*wrap.Config).Shop.Price.Format == 0 {
  66. price_format_list += ` selected`
  67. }
  68. price_format_list += `>100</option>`
  69. price_format_list += `<option value="1"`
  70. if (*wrap.Config).Shop.Price.Format == 1 {
  71. price_format_list += ` selected`
  72. }
  73. price_format_list += `>100.0</option>`
  74. price_format_list += `<option value="2"`
  75. if (*wrap.Config).Shop.Price.Format == 2 {
  76. price_format_list += ` selected`
  77. }
  78. price_format_list += `>100.00</option>`
  79. price_format_list += `<option value="3"`
  80. if (*wrap.Config).Shop.Price.Format == 3 {
  81. price_format_list += ` selected`
  82. }
  83. price_format_list += `>100.000</option>`
  84. price_format_list += `<option value="4"`
  85. if (*wrap.Config).Shop.Price.Format == 4 {
  86. price_format_list += ` selected`
  87. }
  88. price_format_list += `>100.0000</option>`
  89. price_format_list += `</select>`
  90. price_round_list := ``
  91. price_round_list += `<select class="form-control" id="lbl_price-round" name="price-round">`
  92. price_round_list += `<option value="0"`
  93. if (*wrap.Config).Shop.Price.Round == 0 {
  94. price_round_list += ` selected`
  95. }
  96. price_round_list += `>Don't round</option>`
  97. price_round_list += `<option value="1"`
  98. if (*wrap.Config).Shop.Price.Round == 1 {
  99. price_round_list += ` selected`
  100. }
  101. price_round_list += `>Round to ceil</option>`
  102. price_round_list += `<option value="2"`
  103. if (*wrap.Config).Shop.Price.Round == 2 {
  104. price_round_list += ` selected`
  105. }
  106. price_round_list += `>Round to floor</option>`
  107. price_round_list += `</select>`
  108. return `<div class="form-group n3">` +
  109. `<div class="row">` +
  110. `<div class="col-md-3">` +
  111. `<label for="lbl_module-at-home">Module at home page</label>` +
  112. `</div>` +
  113. `<div class="col-md-9">` +
  114. `<div>` +
  115. modules_list +
  116. `</div>` +
  117. `</div>` +
  118. `</div>` +
  119. `</div>` +
  120. `<div class="form-group n3">` +
  121. `<div class="row">` +
  122. `<div class="col-md-3">` +
  123. `<label for="lbl_price-fomat">Price format</label>` +
  124. `</div>` +
  125. `<div class="col-md-9">` +
  126. `<div>` +
  127. price_format_list +
  128. `</div>` +
  129. `</div>` +
  130. `</div>` +
  131. `</div>` +
  132. `<div class="form-group n3">` +
  133. `<div class="row">` +
  134. `<div class="col-md-3">` +
  135. `<label for="lbl_price-round">Price round</label>` +
  136. `</div>` +
  137. `<div class="col-md-9">` +
  138. `<div>` +
  139. price_round_list +
  140. `</div>` +
  141. `</div>` +
  142. `</div>` +
  143. `</div>`
  144. },
  145. },
  146. {
  147. Kind: builder.DFKSubmit,
  148. Value: "Save",
  149. Target: "add-edit-button",
  150. },
  151. })
  152. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  153. } else if wrap.CurrSubModule == "robots-txt" {
  154. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  155. {Name: "Robots.txt"},
  156. })
  157. fcont := []byte(``)
  158. fcont, _ = ioutil.ReadFile(wrap.DTemplate + string(os.PathSeparator) + "robots.txt")
  159. content += builder.DataForm(wrap, []builder.DataFormField{
  160. {
  161. Kind: builder.DFKHidden,
  162. Name: "action",
  163. Value: "settings-robots-txt",
  164. },
  165. {
  166. Kind: builder.DFKText,
  167. CallBack: func(field *builder.DataFormField) string {
  168. 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>`
  169. },
  170. },
  171. {
  172. Kind: builder.DFKSubmit,
  173. CallBack: func(field *builder.DataFormField) string {
  174. 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>`
  175. },
  176. },
  177. })
  178. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  179. } else if wrap.CurrSubModule == "pagination" {
  180. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  181. {Name: "Pagination"},
  182. })
  183. content += builder.DataForm(wrap, []builder.DataFormField{
  184. {
  185. Kind: builder.DFKHidden,
  186. Name: "action",
  187. Value: "settings-pagination",
  188. },
  189. {
  190. Kind: builder.DFKNumber,
  191. Caption: "Blog main page",
  192. Name: "blog-index",
  193. Min: "1",
  194. Max: "100",
  195. Required: true,
  196. Value: utils.IntToStr((*wrap.Config).Blog.Pagination.Index),
  197. },
  198. {
  199. Kind: builder.DFKNumber,
  200. Caption: "Blog category page",
  201. Name: "blog-category",
  202. Min: "1",
  203. Max: "100",
  204. Required: true,
  205. Value: utils.IntToStr((*wrap.Config).Blog.Pagination.Category),
  206. },
  207. {
  208. Kind: builder.DFKText,
  209. Caption: "",
  210. Name: "",
  211. Value: "",
  212. CallBack: func(field *builder.DataFormField) string {
  213. return `<hr>`
  214. },
  215. },
  216. {
  217. Kind: builder.DFKNumber,
  218. Caption: "Shop main page",
  219. Name: "shop-index",
  220. Min: "1",
  221. Max: "100",
  222. Required: true,
  223. Value: utils.IntToStr((*wrap.Config).Shop.Pagination.Index),
  224. },
  225. {
  226. Kind: builder.DFKNumber,
  227. Caption: "Shop category page",
  228. Name: "shop-category",
  229. Min: "1",
  230. Max: "100",
  231. Required: true,
  232. Value: utils.IntToStr((*wrap.Config).Shop.Pagination.Category),
  233. },
  234. {
  235. Kind: builder.DFKSubmit,
  236. Value: "Save",
  237. Target: "add-edit-button",
  238. },
  239. })
  240. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  241. } else if wrap.CurrSubModule == "thumbnails" {
  242. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  243. {Name: "Thumbnails"},
  244. })
  245. content += builder.DataForm(wrap, []builder.DataFormField{
  246. {
  247. Kind: builder.DFKHidden,
  248. Name: "action",
  249. Value: "settings-thumbnails",
  250. },
  251. {
  252. Kind: builder.DFKText,
  253. CallBack: func(field *builder.DataFormField) string {
  254. resize_list := ``
  255. resize_list += `<select class="form-control" name="shop-thumbnail-r-1">`
  256. resize_list += `<option value="0"`
  257. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 0 {
  258. resize_list += ` selected`
  259. }
  260. resize_list += `>Crop</option>`
  261. resize_list += `<option value="1"`
  262. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 1 {
  263. resize_list += ` selected`
  264. }
  265. resize_list += `>Resize</option>`
  266. resize_list += `<option value="2"`
  267. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 2 {
  268. resize_list += ` selected`
  269. }
  270. resize_list += `>Fit into size</option>`
  271. resize_list += `</select>`
  272. return `<div class="form-group n3">` +
  273. `<div class="row">` +
  274. `<div class="col-md-3">` +
  275. `<label>Shop thumbnail 1</label>` +
  276. `</div>` +
  277. `<div class="col-md-9">` +
  278. `<div>` +
  279. `<div class="row">` +
  280. `<div class="col-md-3">` +
  281. `<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>` +
  282. `<div class="d-md-none mb-3"></div>` +
  283. `</div>` +
  284. `<div class="col-md-3">` +
  285. `<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>` +
  286. `<div class="d-md-none mb-3"></div>` +
  287. `</div>` +
  288. `<div class="col-md-6">` +
  289. resize_list +
  290. `</div>` +
  291. `</div>` +
  292. `</div>` +
  293. `</div>` +
  294. `</div>` +
  295. `</div>`
  296. },
  297. },
  298. {
  299. Kind: builder.DFKText,
  300. CallBack: func(field *builder.DataFormField) string {
  301. resize_list := ``
  302. resize_list += `<select class="form-control" name="shop-thumbnail-r-2">`
  303. resize_list += `<option value="0"`
  304. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 0 {
  305. resize_list += ` selected`
  306. }
  307. resize_list += `>Crop</option>`
  308. resize_list += `<option value="1"`
  309. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 1 {
  310. resize_list += ` selected`
  311. }
  312. resize_list += `>Resize</option>`
  313. resize_list += `<option value="2"`
  314. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 2 {
  315. resize_list += ` selected`
  316. }
  317. resize_list += `>Fit into size</option>`
  318. resize_list += `</select>`
  319. return `<div class="form-group n3">` +
  320. `<div class="row">` +
  321. `<div class="col-md-3">` +
  322. `<label>Shop thumbnail 2</label>` +
  323. `</div>` +
  324. `<div class="col-md-9">` +
  325. `<div>` +
  326. `<div class="row">` +
  327. `<div class="col-md-3">` +
  328. `<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>` +
  329. `<div class="d-md-none mb-3"></div>` +
  330. `</div>` +
  331. `<div class="col-md-3">` +
  332. `<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>` +
  333. `<div class="d-md-none mb-3"></div>` +
  334. `</div>` +
  335. `<div class="col-md-6">` +
  336. resize_list +
  337. `</div>` +
  338. `</div>` +
  339. `</div>` +
  340. `</div>` +
  341. `</div>` +
  342. `</div>`
  343. },
  344. },
  345. {
  346. Kind: builder.DFKText,
  347. CallBack: func(field *builder.DataFormField) string {
  348. resize_list := ``
  349. resize_list += `<select class="form-control" name="shop-thumbnail-r-3">`
  350. resize_list += `<option value="0"`
  351. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 0 {
  352. resize_list += ` selected`
  353. }
  354. resize_list += `>Crop</option>`
  355. resize_list += `<option value="1"`
  356. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 1 {
  357. resize_list += ` selected`
  358. }
  359. resize_list += `>Resize</option>`
  360. resize_list += `<option value="2"`
  361. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 2 {
  362. resize_list += ` selected`
  363. }
  364. resize_list += `>Fit into size</option>`
  365. resize_list += `</select>`
  366. return `<div class="form-group n3">` +
  367. `<div class="row">` +
  368. `<div class="col-md-3">` +
  369. `<label>Shop thumbnail 3</label>` +
  370. `</div>` +
  371. `<div class="col-md-9">` +
  372. `<div>` +
  373. `<div class="row">` +
  374. `<div class="col-md-3">` +
  375. `<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>` +
  376. `<div class="d-md-none mb-3"></div>` +
  377. `</div>` +
  378. `<div class="col-md-3">` +
  379. `<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>` +
  380. `<div class="d-md-none mb-3"></div>` +
  381. `</div>` +
  382. `<div class="col-md-6">` +
  383. resize_list +
  384. `</div>` +
  385. `</div>` +
  386. `</div>` +
  387. `</div>` +
  388. `</div>` +
  389. `</div>`
  390. },
  391. },
  392. {
  393. Kind: builder.DFKText,
  394. CallBack: func(field *builder.DataFormField) string {
  395. resize_list := ``
  396. resize_list += `<select class="form-control" name="shop-thumbnail-r-full">`
  397. resize_list += `<option value="0"`
  398. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 0 {
  399. resize_list += ` selected`
  400. }
  401. resize_list += `>Crop</option>`
  402. resize_list += `<option value="1"`
  403. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 1 {
  404. resize_list += ` selected`
  405. }
  406. resize_list += `>Resize</option>`
  407. resize_list += `<option value="2"`
  408. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 2 {
  409. resize_list += ` selected`
  410. }
  411. resize_list += `>Fit into size</option>`
  412. resize_list += `</select>`
  413. return `<div class="form-group n3">` +
  414. `<div class="row">` +
  415. `<div class="col-md-3">` +
  416. `<label>Shop thumbnail full</label>` +
  417. `</div>` +
  418. `<div class="col-md-9">` +
  419. `<div>` +
  420. `<div class="row">` +
  421. `<div class="col-md-3">` +
  422. `<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>` +
  423. `<div class="d-md-none mb-3"></div>` +
  424. `</div>` +
  425. `<div class="col-md-3">` +
  426. `<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>` +
  427. `<div class="d-md-none mb-3"></div>` +
  428. `</div>` +
  429. `<div class="col-md-6">` +
  430. resize_list +
  431. `</div>` +
  432. `</div>` +
  433. `</div>` +
  434. `</div>` +
  435. `</div>` +
  436. `</div>`
  437. },
  438. },
  439. {
  440. Kind: builder.DFKSubmit,
  441. Value: "Save",
  442. Target: "add-edit-button",
  443. },
  444. })
  445. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  446. } else if wrap.CurrSubModule == "smtp" {
  447. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  448. {Name: "SMTP"},
  449. })
  450. content += builder.DataForm(wrap, []builder.DataFormField{
  451. {
  452. Kind: builder.DFKHidden,
  453. Name: "action",
  454. Value: "settings-smtp",
  455. },
  456. {
  457. Kind: builder.DFKText,
  458. Caption: "SMTP server host",
  459. Name: "smtp-host",
  460. Value: (*wrap.Config).SMTP.Host,
  461. Hint: "Example: smtp.gmail.com",
  462. },
  463. {
  464. Kind: builder.DFKNumber,
  465. Caption: "SMTP server port",
  466. Name: "smtp-port",
  467. Min: "0",
  468. Max: "9999",
  469. Required: true,
  470. Value: utils.IntToStr((*wrap.Config).SMTP.Port),
  471. Hint: "Example: 587",
  472. },
  473. {
  474. Kind: builder.DFKText,
  475. Caption: "SMTP user login",
  476. Name: "smtp-login",
  477. Value: (*wrap.Config).SMTP.Login,
  478. Hint: "Example: example@gmail.com",
  479. },
  480. {
  481. Kind: builder.DFKPassword,
  482. Caption: "SMTP user password",
  483. Name: "smtp-password",
  484. Value: "",
  485. Hint: "Leave this field empty if you don't want change password",
  486. },
  487. {
  488. Kind: builder.DFKText,
  489. Caption: "Email address for testing",
  490. Name: "smtp-test-email",
  491. Value: "",
  492. Hint: "To this email address will be send test email message if settings are correct",
  493. },
  494. {
  495. Kind: builder.DFKSubmit,
  496. Value: "Save",
  497. Target: "add-edit-button",
  498. },
  499. })
  500. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  501. } else if wrap.CurrSubModule == "api" {
  502. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  503. {Name: "API"},
  504. })
  505. content += builder.DataForm(wrap, []builder.DataFormField{
  506. {
  507. Kind: builder.DFKHidden,
  508. Name: "action",
  509. Value: "settings-api",
  510. },
  511. {
  512. Kind: builder.DFKCheckBox,
  513. Caption: "XML enabled",
  514. Name: "xml-enabled",
  515. Value: utils.IntToStr((*wrap.Config).API.XML.Enabled),
  516. Hint: "XML: <a href=\"/api/products/\" target=\"_blank\">/api/products/</a>",
  517. },
  518. {
  519. Kind: builder.DFKText,
  520. Caption: "XML name",
  521. Name: "xml-name",
  522. Value: (*wrap.Config).API.XML.Name,
  523. },
  524. {
  525. Kind: builder.DFKText,
  526. Caption: "XML company",
  527. Name: "xml-company",
  528. Value: (*wrap.Config).API.XML.Company,
  529. },
  530. {
  531. Kind: builder.DFKText,
  532. Caption: "XML url",
  533. Name: "xml-url",
  534. Value: (*wrap.Config).API.XML.Url,
  535. },
  536. {
  537. Kind: builder.DFKSubmit,
  538. Value: "Save",
  539. Target: "add-edit-button",
  540. },
  541. })
  542. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  543. }
  544. return this.getSidebarModules(wrap), content, sidebar
  545. })
  546. }