module_settings.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. package modules
  2. import (
  3. "html"
  4. "io/ioutil"
  5. "os"
  6. "golang-fave/engine/assets"
  7. "golang-fave/engine/builder"
  8. "golang-fave/engine/consts"
  9. "golang-fave/engine/utils"
  10. "golang-fave/engine/wrapper"
  11. )
  12. func (this *Modules) RegisterModule_Settings() *Module {
  13. return this.newModule(MInfo{
  14. Mount: "settings",
  15. Name: "Settings",
  16. Order: 801,
  17. System: true,
  18. Icon: assets.SysSvgIconGear,
  19. Sub: &[]MISub{
  20. {Mount: "default", Name: "General", Show: true, Icon: assets.SysSvgIconGear},
  21. {Mount: "robots-txt", Name: "Robots.txt", Show: true, Icon: assets.SysSvgIconBug},
  22. {Mount: "pagination", Name: "Pagination", Show: true, Icon: assets.SysSvgIconPagination},
  23. {Mount: "thumbnails", Name: "Thumbnails", Show: true, Icon: assets.SysSvgIconThumbnails},
  24. {Mount: "smtp", Name: "SMTP", Show: true, Icon: assets.SysSvgIconEmail},
  25. {Mount: "shop", Name: "Shop", Show: true, Icon: assets.SysSvgIconShop},
  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.DFKCheckBox,
  78. Caption: "Maintenance",
  79. Name: "maintenance",
  80. Value: utils.IntToStr((*wrap.Config).Engine.Maintenance),
  81. Hint: "Close web site for maintenance",
  82. },
  83. {
  84. Kind: builder.DFKSubmit,
  85. Value: "Save",
  86. Target: "add-edit-button",
  87. },
  88. })
  89. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  90. } else if wrap.CurrSubModule == "robots-txt" {
  91. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  92. {Name: "Robots.txt"},
  93. })
  94. fcont := []byte(``)
  95. fcont, _ = ioutil.ReadFile(wrap.DTemplate + string(os.PathSeparator) + "robots.txt")
  96. content += builder.DataForm(wrap, []builder.DataFormField{
  97. {
  98. Kind: builder.DFKHidden,
  99. Name: "action",
  100. Value: "settings-robots-txt",
  101. },
  102. {
  103. Kind: builder.DFKText,
  104. CallBack: func(field *builder.DataFormField) string {
  105. 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>`
  106. },
  107. },
  108. {
  109. Kind: builder.DFKSubmit,
  110. CallBack: func(field *builder.DataFormField) string {
  111. 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>`
  112. },
  113. },
  114. })
  115. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  116. } else if wrap.CurrSubModule == "pagination" {
  117. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  118. {Name: "Pagination"},
  119. })
  120. content += builder.DataForm(wrap, []builder.DataFormField{
  121. {
  122. Kind: builder.DFKHidden,
  123. Name: "action",
  124. Value: "settings-pagination",
  125. },
  126. {
  127. Kind: builder.DFKNumber,
  128. Caption: "Blog main page",
  129. Name: "blog-index",
  130. Min: "1",
  131. Max: "100",
  132. Required: true,
  133. Value: utils.IntToStr((*wrap.Config).Blog.Pagination.Index),
  134. },
  135. {
  136. Kind: builder.DFKNumber,
  137. Caption: "Blog category page",
  138. Name: "blog-category",
  139. Min: "1",
  140. Max: "100",
  141. Required: true,
  142. Value: utils.IntToStr((*wrap.Config).Blog.Pagination.Category),
  143. },
  144. {
  145. Kind: builder.DFKText,
  146. Caption: "",
  147. Name: "",
  148. Value: "",
  149. CallBack: func(field *builder.DataFormField) string {
  150. return `<hr>`
  151. },
  152. },
  153. {
  154. Kind: builder.DFKNumber,
  155. Caption: "Shop main page",
  156. Name: "shop-index",
  157. Min: "1",
  158. Max: "100",
  159. Required: true,
  160. Value: utils.IntToStr((*wrap.Config).Shop.Pagination.Index),
  161. },
  162. {
  163. Kind: builder.DFKNumber,
  164. Caption: "Shop category page",
  165. Name: "shop-category",
  166. Min: "1",
  167. Max: "100",
  168. Required: true,
  169. Value: utils.IntToStr((*wrap.Config).Shop.Pagination.Category),
  170. },
  171. {
  172. Kind: builder.DFKSubmit,
  173. Value: "Save",
  174. Target: "add-edit-button",
  175. },
  176. })
  177. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  178. } else if wrap.CurrSubModule == "thumbnails" {
  179. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  180. {Name: "Thumbnails"},
  181. })
  182. content += builder.DataForm(wrap, []builder.DataFormField{
  183. {
  184. Kind: builder.DFKHidden,
  185. Name: "action",
  186. Value: "settings-thumbnails",
  187. },
  188. {
  189. Kind: builder.DFKText,
  190. CallBack: func(field *builder.DataFormField) string {
  191. resize_list := ``
  192. resize_list += `<select class="form-control" name="shop-thumbnail-r-1">`
  193. resize_list += `<option value="0"`
  194. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 0 {
  195. resize_list += ` selected`
  196. }
  197. resize_list += `>Crop</option>`
  198. resize_list += `<option value="1"`
  199. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 1 {
  200. resize_list += ` selected`
  201. }
  202. resize_list += `>Resize</option>`
  203. resize_list += `<option value="2"`
  204. if (*wrap.Config).Shop.Thumbnails.Thumbnail1[2] == 2 {
  205. resize_list += ` selected`
  206. }
  207. resize_list += `>Fit into size</option>`
  208. resize_list += `</select>`
  209. return `<div class="form-group n3">` +
  210. `<div class="row">` +
  211. `<div class="col-md-3">` +
  212. `<label>Shop thumbnail 1</label>` +
  213. `</div>` +
  214. `<div class="col-md-9">` +
  215. `<div>` +
  216. `<div class="row">` +
  217. `<div class="col-md-3">` +
  218. `<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>` +
  219. `<div class="d-md-none mb-3"></div>` +
  220. `</div>` +
  221. `<div class="col-md-3">` +
  222. `<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>` +
  223. `<div class="d-md-none mb-3"></div>` +
  224. `</div>` +
  225. `<div class="col-md-6">` +
  226. resize_list +
  227. `</div>` +
  228. `</div>` +
  229. `</div>` +
  230. `</div>` +
  231. `</div>` +
  232. `</div>`
  233. },
  234. },
  235. {
  236. Kind: builder.DFKText,
  237. CallBack: func(field *builder.DataFormField) string {
  238. resize_list := ``
  239. resize_list += `<select class="form-control" name="shop-thumbnail-r-2">`
  240. resize_list += `<option value="0"`
  241. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 0 {
  242. resize_list += ` selected`
  243. }
  244. resize_list += `>Crop</option>`
  245. resize_list += `<option value="1"`
  246. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 1 {
  247. resize_list += ` selected`
  248. }
  249. resize_list += `>Resize</option>`
  250. resize_list += `<option value="2"`
  251. if (*wrap.Config).Shop.Thumbnails.Thumbnail2[2] == 2 {
  252. resize_list += ` selected`
  253. }
  254. resize_list += `>Fit into size</option>`
  255. resize_list += `</select>`
  256. return `<div class="form-group n3">` +
  257. `<div class="row">` +
  258. `<div class="col-md-3">` +
  259. `<label>Shop thumbnail 2</label>` +
  260. `</div>` +
  261. `<div class="col-md-9">` +
  262. `<div>` +
  263. `<div class="row">` +
  264. `<div class="col-md-3">` +
  265. `<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>` +
  266. `<div class="d-md-none mb-3"></div>` +
  267. `</div>` +
  268. `<div class="col-md-3">` +
  269. `<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>` +
  270. `<div class="d-md-none mb-3"></div>` +
  271. `</div>` +
  272. `<div class="col-md-6">` +
  273. resize_list +
  274. `</div>` +
  275. `</div>` +
  276. `</div>` +
  277. `</div>` +
  278. `</div>` +
  279. `</div>`
  280. },
  281. },
  282. {
  283. Kind: builder.DFKText,
  284. CallBack: func(field *builder.DataFormField) string {
  285. resize_list := ``
  286. resize_list += `<select class="form-control" name="shop-thumbnail-r-3">`
  287. resize_list += `<option value="0"`
  288. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 0 {
  289. resize_list += ` selected`
  290. }
  291. resize_list += `>Crop</option>`
  292. resize_list += `<option value="1"`
  293. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 1 {
  294. resize_list += ` selected`
  295. }
  296. resize_list += `>Resize</option>`
  297. resize_list += `<option value="2"`
  298. if (*wrap.Config).Shop.Thumbnails.Thumbnail3[2] == 2 {
  299. resize_list += ` selected`
  300. }
  301. resize_list += `>Fit into size</option>`
  302. resize_list += `</select>`
  303. return `<div class="form-group n3">` +
  304. `<div class="row">` +
  305. `<div class="col-md-3">` +
  306. `<label>Shop thumbnail 3</label>` +
  307. `</div>` +
  308. `<div class="col-md-9">` +
  309. `<div>` +
  310. `<div class="row">` +
  311. `<div class="col-md-3">` +
  312. `<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>` +
  313. `<div class="d-md-none mb-3"></div>` +
  314. `</div>` +
  315. `<div class="col-md-3">` +
  316. `<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>` +
  317. `<div class="d-md-none mb-3"></div>` +
  318. `</div>` +
  319. `<div class="col-md-6">` +
  320. resize_list +
  321. `</div>` +
  322. `</div>` +
  323. `</div>` +
  324. `</div>` +
  325. `</div>` +
  326. `</div>`
  327. },
  328. },
  329. {
  330. Kind: builder.DFKText,
  331. CallBack: func(field *builder.DataFormField) string {
  332. resize_list := ``
  333. resize_list += `<select class="form-control" name="shop-thumbnail-r-full">`
  334. resize_list += `<option value="0"`
  335. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 0 {
  336. resize_list += ` selected`
  337. }
  338. resize_list += `>Crop</option>`
  339. resize_list += `<option value="1"`
  340. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 1 {
  341. resize_list += ` selected`
  342. }
  343. resize_list += `>Resize</option>`
  344. resize_list += `<option value="2"`
  345. if (*wrap.Config).Shop.Thumbnails.ThumbnailFull[2] == 2 {
  346. resize_list += ` selected`
  347. }
  348. resize_list += `>Fit into size</option>`
  349. resize_list += `</select>`
  350. return `<div class="form-group n3">` +
  351. `<div class="row">` +
  352. `<div class="col-md-3">` +
  353. `<label>Shop thumbnail full</label>` +
  354. `</div>` +
  355. `<div class="col-md-9">` +
  356. `<div>` +
  357. `<div class="row">` +
  358. `<div class="col-md-3">` +
  359. `<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>` +
  360. `<div class="d-md-none mb-3"></div>` +
  361. `</div>` +
  362. `<div class="col-md-3">` +
  363. `<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>` +
  364. `<div class="d-md-none mb-3"></div>` +
  365. `</div>` +
  366. `<div class="col-md-6">` +
  367. resize_list +
  368. `</div>` +
  369. `</div>` +
  370. `</div>` +
  371. `</div>` +
  372. `</div>` +
  373. `</div>`
  374. },
  375. },
  376. {
  377. Kind: builder.DFKSubmit,
  378. Value: "Save",
  379. Target: "add-edit-button",
  380. },
  381. })
  382. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  383. } else if wrap.CurrSubModule == "smtp" {
  384. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  385. {Name: "SMTP"},
  386. })
  387. content += builder.DataForm(wrap, []builder.DataFormField{
  388. {
  389. Kind: builder.DFKHidden,
  390. Name: "action",
  391. Value: "settings-smtp",
  392. },
  393. {
  394. Kind: builder.DFKText,
  395. Caption: "SMTP server host",
  396. Name: "smtp-host",
  397. Value: (*wrap.Config).SMTP.Host,
  398. Hint: "Example: smtp.gmail.com",
  399. },
  400. {
  401. Kind: builder.DFKNumber,
  402. Caption: "SMTP server port",
  403. Name: "smtp-port",
  404. Min: "0",
  405. Max: "9999",
  406. Required: true,
  407. Value: utils.IntToStr((*wrap.Config).SMTP.Port),
  408. Hint: "Example: 587",
  409. },
  410. {
  411. Kind: builder.DFKText,
  412. Caption: "SMTP user login",
  413. Name: "smtp-login",
  414. Value: (*wrap.Config).SMTP.Login,
  415. Hint: "Example: example@gmail.com",
  416. },
  417. {
  418. Kind: builder.DFKPassword,
  419. Caption: "SMTP user password",
  420. Name: "smtp-password",
  421. Value: "",
  422. Hint: "Leave this field empty if you don't want change password",
  423. },
  424. {
  425. Kind: builder.DFKText,
  426. Caption: "Email address for testing",
  427. Name: "smtp-test-email",
  428. Value: "",
  429. Hint: "To this email address will be send test email message if settings are correct",
  430. },
  431. {
  432. Kind: builder.DFKSubmit,
  433. Value: "Save",
  434. Target: "add-edit-button",
  435. },
  436. })
  437. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  438. } else if wrap.CurrSubModule == "shop" {
  439. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  440. {Name: "Shop"},
  441. })
  442. content += builder.DataForm(wrap, []builder.DataFormField{
  443. {
  444. Kind: builder.DFKHidden,
  445. Name: "action",
  446. Value: "settings-shop",
  447. },
  448. {
  449. Kind: builder.DFKText,
  450. CallBack: func(field *builder.DataFormField) string {
  451. price_format_list := ``
  452. price_format_list += `<select class="form-control" id="lbl_price-fomat" name="price-fomat">`
  453. price_format_list += `<option value="0"`
  454. if (*wrap.Config).Shop.Price.Format == 0 {
  455. price_format_list += ` selected`
  456. }
  457. price_format_list += `>100</option>`
  458. price_format_list += `<option value="1"`
  459. if (*wrap.Config).Shop.Price.Format == 1 {
  460. price_format_list += ` selected`
  461. }
  462. price_format_list += `>100.0</option>`
  463. price_format_list += `<option value="2"`
  464. if (*wrap.Config).Shop.Price.Format == 2 {
  465. price_format_list += ` selected`
  466. }
  467. price_format_list += `>100.00</option>`
  468. price_format_list += `<option value="3"`
  469. if (*wrap.Config).Shop.Price.Format == 3 {
  470. price_format_list += ` selected`
  471. }
  472. price_format_list += `>100.000</option>`
  473. price_format_list += `<option value="4"`
  474. if (*wrap.Config).Shop.Price.Format == 4 {
  475. price_format_list += ` selected`
  476. }
  477. price_format_list += `>100.0000</option>`
  478. price_format_list += `</select>`
  479. price_round_list := ``
  480. price_round_list += `<select class="form-control" id="lbl_price-round" name="price-round">`
  481. price_round_list += `<option value="0"`
  482. if (*wrap.Config).Shop.Price.Round == 0 {
  483. price_round_list += ` selected`
  484. }
  485. price_round_list += `>Don't round</option>`
  486. price_round_list += `<option value="1"`
  487. if (*wrap.Config).Shop.Price.Round == 1 {
  488. price_round_list += ` selected`
  489. }
  490. price_round_list += `>Round to ceil</option>`
  491. price_round_list += `<option value="2"`
  492. if (*wrap.Config).Shop.Price.Round == 2 {
  493. price_round_list += ` selected`
  494. }
  495. price_round_list += `>Round to floor</option>`
  496. price_round_list += `</select>`
  497. return `<div class="form-group n2">` +
  498. `<div class="row">` +
  499. `<div class="col-md-3">` +
  500. `<label for="lbl_price-fomat">Price format</label>` +
  501. `</div>` +
  502. `<div class="col-md-9">` +
  503. `<div>` +
  504. price_format_list +
  505. `</div>` +
  506. `</div>` +
  507. `</div>` +
  508. `</div>` +
  509. `<div class="form-group n3">` +
  510. `<div class="row">` +
  511. `<div class="col-md-3">` +
  512. `<label for="lbl_price-round">Price round</label>` +
  513. `</div>` +
  514. `<div class="col-md-9">` +
  515. `<div>` +
  516. price_round_list +
  517. `</div>` +
  518. `</div>` +
  519. `</div>` +
  520. `</div>`
  521. },
  522. },
  523. {
  524. Kind: builder.DFKText,
  525. CallBack: func(field *builder.DataFormField) string {
  526. make_checkbox := func(name, caption string, value int) string {
  527. checked := ""
  528. if value > 0 {
  529. checked = " checked"
  530. }
  531. return `<div class="checkbox-clickable"><input class="form-control" type="checkbox" id="lbl_` +
  532. name + `" name="` + name + `" value="1" "="" autocomplete="off"` + checked +
  533. `><label for="lbl_` + name + `">` + caption + `</label></div>`
  534. }
  535. checkboxes := ""
  536. checkboxes += make_checkbox("require-last-name", "Last Name", (*wrap.Config).Shop.Orders.RequiredFields.LastName)
  537. checkboxes += make_checkbox("require-first-name", "First Name", (*wrap.Config).Shop.Orders.RequiredFields.FirstName)
  538. checkboxes += make_checkbox("require-middle-name", "Middle Name", (*wrap.Config).Shop.Orders.RequiredFields.MiddleName)
  539. checkboxes += make_checkbox("require-mobile-phone", "Mobile Phone", (*wrap.Config).Shop.Orders.RequiredFields.MobilePhone)
  540. checkboxes += make_checkbox("require-email-address", "Email Address", (*wrap.Config).Shop.Orders.RequiredFields.EmailAddress)
  541. checkboxes += make_checkbox("require-delivery", "Delivery", (*wrap.Config).Shop.Orders.RequiredFields.Delivery)
  542. checkboxes += make_checkbox("require-comment", "Comment", (*wrap.Config).Shop.Orders.RequiredFields.Comment)
  543. return `<div class="form-group n4">` +
  544. `<div class="row">` +
  545. `<div class="col-md-3">` +
  546. `<label for="lbl_price-fomat">Order require fields</label>` +
  547. `</div>` +
  548. `<div class="col-md-9">` +
  549. `<div>` +
  550. checkboxes +
  551. `</div>` +
  552. `</div>` +
  553. `</div>` +
  554. `</div>`
  555. },
  556. },
  557. {
  558. Kind: builder.DFKCheckBox,
  559. Caption: "Accept orders",
  560. Name: "accept-orders",
  561. Value: utils.IntToStr((*wrap.Config).Shop.Orders.Enabled),
  562. },
  563. {
  564. Kind: builder.DFKText,
  565. Caption: "New order notify email",
  566. Name: "new-order-notify-email",
  567. Value: (*wrap.Config).Shop.Orders.NotifyEmail,
  568. Hint: "Example: example@gmail.com",
  569. },
  570. {
  571. Kind: builder.DFKText,
  572. Caption: "New order email theme (CP)",
  573. Name: "new-order-email-theme-cp",
  574. Value: (*wrap.Config).Shop.Orders.NewOrderEmailThemeCp,
  575. },
  576. {
  577. Kind: builder.DFKText,
  578. Caption: "New order email theme (User)",
  579. Name: "new-order-email-theme-user",
  580. Value: (*wrap.Config).Shop.Orders.NewOrderEmailThemeUser,
  581. },
  582. {
  583. Kind: builder.DFKCheckBox,
  584. Caption: "Custom field 1 enabled",
  585. Name: "custom-field-1-enabled",
  586. Value: utils.IntToStr((*wrap.Config).Shop.CustomFields.Field1.Enabled),
  587. },
  588. {
  589. Kind: builder.DFKText,
  590. Caption: "Custom field 1 caption",
  591. Name: "custom-field-1-caption",
  592. Value: (*wrap.Config).Shop.CustomFields.Field1.Caption,
  593. Hint: "Caption for product custom field",
  594. },
  595. {
  596. Kind: builder.DFKCheckBox,
  597. Caption: "Custom field 2 enabled",
  598. Name: "custom-field-2-enabled",
  599. Value: utils.IntToStr((*wrap.Config).Shop.CustomFields.Field2.Enabled),
  600. },
  601. {
  602. Kind: builder.DFKText,
  603. Caption: "Custom field 2 caption",
  604. Name: "custom-field-2-caption",
  605. Value: (*wrap.Config).Shop.CustomFields.Field2.Caption,
  606. Hint: "Caption for product custom field",
  607. },
  608. {
  609. Kind: builder.DFKSubmit,
  610. Value: "Save",
  611. Target: "add-edit-button",
  612. },
  613. })
  614. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  615. } else if wrap.CurrSubModule == "api" {
  616. content += this.getBreadCrumbs(wrap, &[]consts.BreadCrumb{
  617. {Name: "API"},
  618. })
  619. content += builder.DataForm(wrap, []builder.DataFormField{
  620. {
  621. Kind: builder.DFKHidden,
  622. Name: "action",
  623. Value: "settings-api",
  624. },
  625. {
  626. Kind: builder.DFKCheckBox,
  627. Caption: "XML enabled",
  628. Name: "xml-enabled",
  629. Value: utils.IntToStr((*wrap.Config).API.XML.Enabled),
  630. Hint: "XML: <a href=\"/api/products/\" target=\"_blank\">/api/products/</a>",
  631. },
  632. {
  633. Kind: builder.DFKText,
  634. Caption: "XML name",
  635. Name: "xml-name",
  636. Value: (*wrap.Config).API.XML.Name,
  637. },
  638. {
  639. Kind: builder.DFKText,
  640. Caption: "XML company",
  641. Name: "xml-company",
  642. Value: (*wrap.Config).API.XML.Company,
  643. },
  644. {
  645. Kind: builder.DFKText,
  646. Caption: "XML url",
  647. Name: "xml-url",
  648. Value: (*wrap.Config).API.XML.Url,
  649. },
  650. {
  651. Kind: builder.DFKSubmit,
  652. Value: "Save",
  653. Target: "add-edit-button",
  654. },
  655. })
  656. sidebar += `<button class="btn btn-primary btn-sidebar" id="add-edit-button">Save</button>`
  657. }
  658. return this.getSidebarModules(wrap), content, sidebar
  659. })
  660. }