module_settings.go 23 KB

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