module_settings.go 23 KB

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