dm_core 4.2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.md +25 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/images/dm_core/draft_menu_bg.png +0 -0
  6. data/app/assets/images/dm_core/expand.png +0 -0
  7. data/app/assets/images/dm_core/flags/ad.gif +0 -0
  8. data/app/assets/images/dm_core/flags/ae.gif +0 -0
  9. data/app/assets/images/dm_core/flags/af.gif +0 -0
  10. data/app/assets/images/dm_core/flags/ag.gif +0 -0
  11. data/app/assets/images/dm_core/flags/ai.gif +0 -0
  12. data/app/assets/images/dm_core/flags/al.gif +0 -0
  13. data/app/assets/images/dm_core/flags/am.gif +0 -0
  14. data/app/assets/images/dm_core/flags/an.gif +0 -0
  15. data/app/assets/images/dm_core/flags/ao.gif +0 -0
  16. data/app/assets/images/dm_core/flags/ar.gif +0 -0
  17. data/app/assets/images/dm_core/flags/as.gif +0 -0
  18. data/app/assets/images/dm_core/flags/at.gif +0 -0
  19. data/app/assets/images/dm_core/flags/au.gif +0 -0
  20. data/app/assets/images/dm_core/flags/aw.gif +0 -0
  21. data/app/assets/images/dm_core/flags/ax.gif +0 -0
  22. data/app/assets/images/dm_core/flags/az.gif +0 -0
  23. data/app/assets/images/dm_core/flags/ba.gif +0 -0
  24. data/app/assets/images/dm_core/flags/bb.gif +0 -0
  25. data/app/assets/images/dm_core/flags/bd.gif +0 -0
  26. data/app/assets/images/dm_core/flags/be.gif +0 -0
  27. data/app/assets/images/dm_core/flags/bf.gif +0 -0
  28. data/app/assets/images/dm_core/flags/bg.gif +0 -0
  29. data/app/assets/images/dm_core/flags/bh.gif +0 -0
  30. data/app/assets/images/dm_core/flags/bi.gif +0 -0
  31. data/app/assets/images/dm_core/flags/bj.gif +0 -0
  32. data/app/assets/images/dm_core/flags/bm.gif +0 -0
  33. data/app/assets/images/dm_core/flags/bn.gif +0 -0
  34. data/app/assets/images/dm_core/flags/bo.gif +0 -0
  35. data/app/assets/images/dm_core/flags/br.gif +0 -0
  36. data/app/assets/images/dm_core/flags/bs.gif +0 -0
  37. data/app/assets/images/dm_core/flags/bt.gif +0 -0
  38. data/app/assets/images/dm_core/flags/bv.gif +0 -0
  39. data/app/assets/images/dm_core/flags/bw.gif +0 -0
  40. data/app/assets/images/dm_core/flags/by.gif +0 -0
  41. data/app/assets/images/dm_core/flags/bz.gif +0 -0
  42. data/app/assets/images/dm_core/flags/ca.gif +0 -0
  43. data/app/assets/images/dm_core/flags/cc.gif +0 -0
  44. data/app/assets/images/dm_core/flags/cd.gif +0 -0
  45. data/app/assets/images/dm_core/flags/cf.gif +0 -0
  46. data/app/assets/images/dm_core/flags/cg.gif +0 -0
  47. data/app/assets/images/dm_core/flags/ch.gif +0 -0
  48. data/app/assets/images/dm_core/flags/ci.gif +0 -0
  49. data/app/assets/images/dm_core/flags/ck.gif +0 -0
  50. data/app/assets/images/dm_core/flags/cl.gif +0 -0
  51. data/app/assets/images/dm_core/flags/cm.gif +0 -0
  52. data/app/assets/images/dm_core/flags/cn.gif +0 -0
  53. data/app/assets/images/dm_core/flags/co.gif +0 -0
  54. data/app/assets/images/dm_core/flags/cr.gif +0 -0
  55. data/app/assets/images/dm_core/flags/cs.gif +0 -0
  56. data/app/assets/images/dm_core/flags/cu.gif +0 -0
  57. data/app/assets/images/dm_core/flags/cv.gif +0 -0
  58. data/app/assets/images/dm_core/flags/cx.gif +0 -0
  59. data/app/assets/images/dm_core/flags/cy.gif +0 -0
  60. data/app/assets/images/dm_core/flags/cz.gif +0 -0
  61. data/app/assets/images/dm_core/flags/de.gif +0 -0
  62. data/app/assets/images/dm_core/flags/dj.gif +0 -0
  63. data/app/assets/images/dm_core/flags/dk.gif +0 -0
  64. data/app/assets/images/dm_core/flags/dm.gif +0 -0
  65. data/app/assets/images/dm_core/flags/do.gif +0 -0
  66. data/app/assets/images/dm_core/flags/dz.gif +0 -0
  67. data/app/assets/images/dm_core/flags/ec.gif +0 -0
  68. data/app/assets/images/dm_core/flags/ee.gif +0 -0
  69. data/app/assets/images/dm_core/flags/eg.gif +0 -0
  70. data/app/assets/images/dm_core/flags/eh.gif +0 -0
  71. data/app/assets/images/dm_core/flags/en.gif +0 -0
  72. data/app/assets/images/dm_core/flags/england.gif +0 -0
  73. data/app/assets/images/dm_core/flags/er.gif +0 -0
  74. data/app/assets/images/dm_core/flags/es.gif +0 -0
  75. data/app/assets/images/dm_core/flags/et.gif +0 -0
  76. data/app/assets/images/dm_core/flags/fam.gif +0 -0
  77. data/app/assets/images/dm_core/flags/fi.gif +0 -0
  78. data/app/assets/images/dm_core/flags/fj.gif +0 -0
  79. data/app/assets/images/dm_core/flags/fk.gif +0 -0
  80. data/app/assets/images/dm_core/flags/fm.gif +0 -0
  81. data/app/assets/images/dm_core/flags/fo.gif +0 -0
  82. data/app/assets/images/dm_core/flags/fr.gif +0 -0
  83. data/app/assets/images/dm_core/flags/ga.gif +0 -0
  84. data/app/assets/images/dm_core/flags/gb.gif +0 -0
  85. data/app/assets/images/dm_core/flags/gd.gif +0 -0
  86. data/app/assets/images/dm_core/flags/ge.gif +0 -0
  87. data/app/assets/images/dm_core/flags/gh.gif +0 -0
  88. data/app/assets/images/dm_core/flags/gi.gif +0 -0
  89. data/app/assets/images/dm_core/flags/gl.gif +0 -0
  90. data/app/assets/images/dm_core/flags/gm.gif +0 -0
  91. data/app/assets/images/dm_core/flags/gn.gif +0 -0
  92. data/app/assets/images/dm_core/flags/gp.gif +0 -0
  93. data/app/assets/images/dm_core/flags/gq.gif +0 -0
  94. data/app/assets/images/dm_core/flags/gr.gif +0 -0
  95. data/app/assets/images/dm_core/flags/gs.gif +0 -0
  96. data/app/assets/images/dm_core/flags/gt.gif +0 -0
  97. data/app/assets/images/dm_core/flags/gu.gif +0 -0
  98. data/app/assets/images/dm_core/flags/gw.gif +0 -0
  99. data/app/assets/images/dm_core/flags/gy.gif +0 -0
  100. data/app/assets/images/dm_core/flags/hk.gif +0 -0
  101. data/app/assets/images/dm_core/flags/hn.gif +0 -0
  102. data/app/assets/images/dm_core/flags/hr.gif +0 -0
  103. data/app/assets/images/dm_core/flags/ht.gif +0 -0
  104. data/app/assets/images/dm_core/flags/hu.gif +0 -0
  105. data/app/assets/images/dm_core/flags/id.gif +0 -0
  106. data/app/assets/images/dm_core/flags/ie.gif +0 -0
  107. data/app/assets/images/dm_core/flags/il.gif +0 -0
  108. data/app/assets/images/dm_core/flags/in.gif +0 -0
  109. data/app/assets/images/dm_core/flags/io.gif +0 -0
  110. data/app/assets/images/dm_core/flags/iq.gif +0 -0
  111. data/app/assets/images/dm_core/flags/ir.gif +0 -0
  112. data/app/assets/images/dm_core/flags/is.gif +0 -0
  113. data/app/assets/images/dm_core/flags/it.gif +0 -0
  114. data/app/assets/images/dm_core/flags/ja.gif +0 -0
  115. data/app/assets/images/dm_core/flags/jm.gif +0 -0
  116. data/app/assets/images/dm_core/flags/jo.gif +0 -0
  117. data/app/assets/images/dm_core/flags/ke.gif +0 -0
  118. data/app/assets/images/dm_core/flags/kg.gif +0 -0
  119. data/app/assets/images/dm_core/flags/kh.gif +0 -0
  120. data/app/assets/images/dm_core/flags/ki.gif +0 -0
  121. data/app/assets/images/dm_core/flags/km.gif +0 -0
  122. data/app/assets/images/dm_core/flags/kn.gif +0 -0
  123. data/app/assets/images/dm_core/flags/kp.gif +0 -0
  124. data/app/assets/images/dm_core/flags/kr.gif +0 -0
  125. data/app/assets/images/dm_core/flags/kw.gif +0 -0
  126. data/app/assets/images/dm_core/flags/ky.gif +0 -0
  127. data/app/assets/images/dm_core/flags/kz.gif +0 -0
  128. data/app/assets/images/dm_core/flags/la.gif +0 -0
  129. data/app/assets/images/dm_core/flags/lb.gif +0 -0
  130. data/app/assets/images/dm_core/flags/lc.gif +0 -0
  131. data/app/assets/images/dm_core/flags/li.gif +0 -0
  132. data/app/assets/images/dm_core/flags/lk.gif +0 -0
  133. data/app/assets/images/dm_core/flags/lr.gif +0 -0
  134. data/app/assets/images/dm_core/flags/ls.gif +0 -0
  135. data/app/assets/images/dm_core/flags/lt.gif +0 -0
  136. data/app/assets/images/dm_core/flags/lu.gif +0 -0
  137. data/app/assets/images/dm_core/flags/lv.gif +0 -0
  138. data/app/assets/images/dm_core/flags/ly.gif +0 -0
  139. data/app/assets/images/dm_core/flags/ma.gif +0 -0
  140. data/app/assets/images/dm_core/flags/mc.gif +0 -0
  141. data/app/assets/images/dm_core/flags/md.gif +0 -0
  142. data/app/assets/images/dm_core/flags/mg.gif +0 -0
  143. data/app/assets/images/dm_core/flags/mh.gif +0 -0
  144. data/app/assets/images/dm_core/flags/mk.gif +0 -0
  145. data/app/assets/images/dm_core/flags/ml.gif +0 -0
  146. data/app/assets/images/dm_core/flags/mm.gif +0 -0
  147. data/app/assets/images/dm_core/flags/mn.gif +0 -0
  148. data/app/assets/images/dm_core/flags/mo.gif +0 -0
  149. data/app/assets/images/dm_core/flags/mp.gif +0 -0
  150. data/app/assets/images/dm_core/flags/mq.gif +0 -0
  151. data/app/assets/images/dm_core/flags/mr.gif +0 -0
  152. data/app/assets/images/dm_core/flags/ms.gif +0 -0
  153. data/app/assets/images/dm_core/flags/mt.gif +0 -0
  154. data/app/assets/images/dm_core/flags/mu.gif +0 -0
  155. data/app/assets/images/dm_core/flags/mv.gif +0 -0
  156. data/app/assets/images/dm_core/flags/mw.gif +0 -0
  157. data/app/assets/images/dm_core/flags/mx.gif +0 -0
  158. data/app/assets/images/dm_core/flags/my.gif +0 -0
  159. data/app/assets/images/dm_core/flags/mz.gif +0 -0
  160. data/app/assets/images/dm_core/flags/na.gif +0 -0
  161. data/app/assets/images/dm_core/flags/nc.gif +0 -0
  162. data/app/assets/images/dm_core/flags/ne.gif +0 -0
  163. data/app/assets/images/dm_core/flags/nf.gif +0 -0
  164. data/app/assets/images/dm_core/flags/ng.gif +0 -0
  165. data/app/assets/images/dm_core/flags/ni.gif +0 -0
  166. data/app/assets/images/dm_core/flags/nl.gif +0 -0
  167. data/app/assets/images/dm_core/flags/no.gif +0 -0
  168. data/app/assets/images/dm_core/flags/np.gif +0 -0
  169. data/app/assets/images/dm_core/flags/nr.gif +0 -0
  170. data/app/assets/images/dm_core/flags/nu.gif +0 -0
  171. data/app/assets/images/dm_core/flags/nz.gif +0 -0
  172. data/app/assets/images/dm_core/flags/om.gif +0 -0
  173. data/app/assets/images/dm_core/flags/pa.gif +0 -0
  174. data/app/assets/images/dm_core/flags/pe.gif +0 -0
  175. data/app/assets/images/dm_core/flags/pf.gif +0 -0
  176. data/app/assets/images/dm_core/flags/pg.gif +0 -0
  177. data/app/assets/images/dm_core/flags/ph.gif +0 -0
  178. data/app/assets/images/dm_core/flags/pk.gif +0 -0
  179. data/app/assets/images/dm_core/flags/pl.gif +0 -0
  180. data/app/assets/images/dm_core/flags/pm.gif +0 -0
  181. data/app/assets/images/dm_core/flags/pn.gif +0 -0
  182. data/app/assets/images/dm_core/flags/pr.gif +0 -0
  183. data/app/assets/images/dm_core/flags/ps.gif +0 -0
  184. data/app/assets/images/dm_core/flags/pt.gif +0 -0
  185. data/app/assets/images/dm_core/flags/pw.gif +0 -0
  186. data/app/assets/images/dm_core/flags/py.gif +0 -0
  187. data/app/assets/images/dm_core/flags/qa.gif +0 -0
  188. data/app/assets/images/dm_core/flags/ro.gif +0 -0
  189. data/app/assets/images/dm_core/flags/ru.gif +0 -0
  190. data/app/assets/images/dm_core/flags/rw.gif +0 -0
  191. data/app/assets/images/dm_core/flags/sa.gif +0 -0
  192. data/app/assets/images/dm_core/flags/sb.gif +0 -0
  193. data/app/assets/images/dm_core/flags/sc.gif +0 -0
  194. data/app/assets/images/dm_core/flags/scotland.gif +0 -0
  195. data/app/assets/images/dm_core/flags/sd.gif +0 -0
  196. data/app/assets/images/dm_core/flags/se.gif +0 -0
  197. data/app/assets/images/dm_core/flags/sg.gif +0 -0
  198. data/app/assets/images/dm_core/flags/sh.gif +0 -0
  199. data/app/assets/images/dm_core/flags/si.gif +0 -0
  200. data/app/assets/images/dm_core/flags/sk.gif +0 -0
  201. data/app/assets/images/dm_core/flags/sl.gif +0 -0
  202. data/app/assets/images/dm_core/flags/sm.gif +0 -0
  203. data/app/assets/images/dm_core/flags/sn.gif +0 -0
  204. data/app/assets/images/dm_core/flags/so.gif +0 -0
  205. data/app/assets/images/dm_core/flags/sr.gif +0 -0
  206. data/app/assets/images/dm_core/flags/st.gif +0 -0
  207. data/app/assets/images/dm_core/flags/sv.gif +0 -0
  208. data/app/assets/images/dm_core/flags/sy.gif +0 -0
  209. data/app/assets/images/dm_core/flags/sz.gif +0 -0
  210. data/app/assets/images/dm_core/flags/tc.gif +0 -0
  211. data/app/assets/images/dm_core/flags/td.gif +0 -0
  212. data/app/assets/images/dm_core/flags/tf.gif +0 -0
  213. data/app/assets/images/dm_core/flags/tg.gif +0 -0
  214. data/app/assets/images/dm_core/flags/th.gif +0 -0
  215. data/app/assets/images/dm_core/flags/tj.gif +0 -0
  216. data/app/assets/images/dm_core/flags/tk.gif +0 -0
  217. data/app/assets/images/dm_core/flags/tl.gif +0 -0
  218. data/app/assets/images/dm_core/flags/tm.gif +0 -0
  219. data/app/assets/images/dm_core/flags/tn.gif +0 -0
  220. data/app/assets/images/dm_core/flags/to.gif +0 -0
  221. data/app/assets/images/dm_core/flags/tr.gif +0 -0
  222. data/app/assets/images/dm_core/flags/tt.gif +0 -0
  223. data/app/assets/images/dm_core/flags/tv.gif +0 -0
  224. data/app/assets/images/dm_core/flags/tw.gif +0 -0
  225. data/app/assets/images/dm_core/flags/tz.gif +0 -0
  226. data/app/assets/images/dm_core/flags/ua.gif +0 -0
  227. data/app/assets/images/dm_core/flags/ug.gif +0 -0
  228. data/app/assets/images/dm_core/flags/um.gif +0 -0
  229. data/app/assets/images/dm_core/flags/us.gif +0 -0
  230. data/app/assets/images/dm_core/flags/uy.gif +0 -0
  231. data/app/assets/images/dm_core/flags/uz.gif +0 -0
  232. data/app/assets/images/dm_core/flags/va.gif +0 -0
  233. data/app/assets/images/dm_core/flags/vc.gif +0 -0
  234. data/app/assets/images/dm_core/flags/ve.gif +0 -0
  235. data/app/assets/images/dm_core/flags/vg.gif +0 -0
  236. data/app/assets/images/dm_core/flags/vi.gif +0 -0
  237. data/app/assets/images/dm_core/flags/vn.gif +0 -0
  238. data/app/assets/images/dm_core/flags/vu.gif +0 -0
  239. data/app/assets/images/dm_core/flags/wales.gif +0 -0
  240. data/app/assets/images/dm_core/flags/wf.gif +0 -0
  241. data/app/assets/images/dm_core/flags/ws.gif +0 -0
  242. data/app/assets/images/dm_core/flags/ye.gif +0 -0
  243. data/app/assets/images/dm_core/flags/yt.gif +0 -0
  244. data/app/assets/images/dm_core/flags/za.gif +0 -0
  245. data/app/assets/images/dm_core/flags/zm.gif +0 -0
  246. data/app/assets/images/dm_core/flags/zw.gif +0 -0
  247. data/app/assets/images/dm_core/user.gif +0 -0
  248. data/app/assets/javascripts/dm_core/admin.js +223 -0
  249. data/app/assets/javascripts/dm_core/admin_extra.js.coffee +118 -0
  250. data/app/assets/javascripts/dm_core/application.js +14 -0
  251. data/app/assets/javascripts/dm_core/common_js.js.coffee +61 -0
  252. data/app/assets/javascripts/dm_core/underscore-1.4.4-min.js +1 -0
  253. data/app/assets/javascripts/dm_core/underscore-1.4.4.js +1227 -0
  254. data/app/assets/stylesheets/dm_core/admin.css +250 -0
  255. data/app/assets/stylesheets/dm_core/application.css +31 -0
  256. data/app/assets/stylesheets/dm_core/font-awesome.css +1479 -0
  257. data/app/assets/stylesheets/dm_core/font/FontAwesome.otf +0 -0
  258. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.eot +0 -0
  259. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.svg +399 -0
  260. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.ttf +0 -0
  261. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.woff +0 -0
  262. data/app/controllers/dm_core/admin/accounts_controller.rb +125 -0
  263. data/app/controllers/dm_core/admin/admin_controller.rb +133 -0
  264. data/app/controllers/dm_core/admin/comments_controller.rb +70 -0
  265. data/app/controllers/dm_core/admin/dashboard_controller.rb +38 -0
  266. data/app/controllers/dm_core/admin/system_controller.rb +44 -0
  267. data/app/controllers/dm_core/admin/users_controller.rb +106 -0
  268. data/app/controllers/dm_core/application_controller.rb +253 -0
  269. data/app/controllers/dm_core/concerns/profile_controller.rb +41 -0
  270. data/app/controllers/dm_core/profile_controller.rb +8 -0
  271. data/app/datatables/user_datatable.rb +75 -0
  272. data/app/helpers/devise_helper.rb +25 -0
  273. data/app/helpers/dm_core/account_helper.rb +70 -0
  274. data/app/helpers/dm_core/admin/application_helper.rb +23 -0
  275. data/app/helpers/dm_core/application_helper.rb +58 -0
  276. data/app/helpers/dm_core/liquid_helper.rb +79 -0
  277. data/app/helpers/dm_core/params_helper.rb +19 -0
  278. data/app/helpers/dm_core/render_helper.rb +104 -0
  279. data/app/helpers/dm_core/url_helper.rb +189 -0
  280. data/app/helpers/dm_utilities/currency_helper.rb +24 -0
  281. data/app/helpers/dm_utilities/date_helper.rb +72 -0
  282. data/app/inputs/code_editor_input.rb +51 -0
  283. data/app/inputs/text_full_width_input.rb +9 -0
  284. data/app/inputs/toggle_checked_input.rb +9 -0
  285. data/app/inputs/toggle_input.rb +9 -0
  286. data/app/mailers/dm_core/site_mailer.rb +18 -0
  287. data/app/models/account.rb +241 -0
  288. data/app/models/activity.rb +10 -0
  289. data/app/models/address.rb +24 -0
  290. data/app/models/category.rb +18 -0
  291. data/app/models/comment.rb +24 -0
  292. data/app/models/custom_field.rb +99 -0
  293. data/app/models/custom_field_def.rb +61 -0
  294. data/app/models/dm_core/concerns/ability.rb +17 -0
  295. data/app/models/dm_core/concerns/defines_custom_fields.rb +17 -0
  296. data/app/models/dm_core/concerns/friendly_id.rb +57 -0
  297. data/app/models/dm_core/concerns/has_custom_fields.rb +28 -0
  298. data/app/models/dm_core/concerns/public_private.rb +151 -0
  299. data/app/models/dm_core/concerns/user.rb +144 -0
  300. data/app/models/dm_core/concerns/user_profile.rb +113 -0
  301. data/app/models/dm_core/concerns/user_site_profile.rb +65 -0
  302. data/app/models/dm_core/country.rb +8 -0
  303. data/app/models/dm_core/language.rb +59 -0
  304. data/app/models/dm_core/permitted_params.rb +52 -0
  305. data/app/models/follow.rb +13 -0
  306. data/app/models/liquid_validator.rb +26 -0
  307. data/app/models/payment_history.rb +57 -0
  308. data/app/models/presence_default_locale_validator.rb +12 -0
  309. data/app/models/role.rb +12 -0
  310. data/app/models/system_email.rb +15 -0
  311. data/app/models/ultracart/notification.rb +107 -0
  312. data/app/models/ultracart/payment_history.rb +55 -0
  313. data/app/models/user.rb +22 -0
  314. data/app/models/user_profile.rb +9 -0
  315. data/app/models/user_site_profile.rb +11 -0
  316. data/app/presenters/base_presenter.rb +30 -0
  317. data/app/presenters/comment_presenter.rb +20 -0
  318. data/app/presenters/user_presenter.rb +48 -0
  319. data/app/uploaders/avatar_uploader.rb +75 -0
  320. data/app/views/devise/mailer/confirmation_instructions.html.erb +7 -0
  321. data/app/views/devise/mailer/confirmation_instructions.text.erb +7 -0
  322. data/app/views/devise/mailer/reset_password_instructions.html.erb +9 -0
  323. data/app/views/devise/mailer/reset_password_instructions.text.erb +9 -0
  324. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  325. data/app/views/devise/mailer/unlock_instructions.text.erb +7 -0
  326. data/app/views/dm_core/admin/accounts/_settings_menu.html.erb +24 -0
  327. data/app/views/dm_core/admin/accounts/analytics.html.erb +38 -0
  328. data/app/views/dm_core/admin/accounts/email.html.erb +26 -0
  329. data/app/views/dm_core/admin/accounts/general.html.erb +22 -0
  330. data/app/views/dm_core/admin/accounts/media.html.erb +37 -0
  331. data/app/views/dm_core/admin/accounts/metadata.html.erb +22 -0
  332. data/app/views/dm_core/admin/comments/_comment.html.erb +14 -0
  333. data/app/views/dm_core/admin/comments/_comment_edit_form.html.erb +3 -0
  334. data/app/views/dm_core/admin/comments/_comment_form.html.erb +15 -0
  335. data/app/views/dm_core/admin/comments/_comment_list.html.erb +5 -0
  336. data/app/views/dm_core/admin/comments/_comment_section.html.erb +7 -0
  337. data/app/views/dm_core/admin/comments/create.js.erb +4 -0
  338. data/app/views/dm_core/admin/comments/destroy.js.erb +1 -0
  339. data/app/views/dm_core/admin/comments/edit.js.erb +2 -0
  340. data/app/views/dm_core/admin/comments/update.js.erb +2 -0
  341. data/app/views/dm_core/admin/custom_fields/_check_box_collection.html.erb +4 -0
  342. data/app/views/dm_core/admin/custom_fields/_custom_field_def_fields.html.erb +34 -0
  343. data/app/views/dm_core/admin/custom_fields/_divider.html.erb +1 -0
  344. data/app/views/dm_core/admin/custom_fields/_number_field.html.erb +4 -0
  345. data/app/views/dm_core/admin/custom_fields/_radio_buttons.html.erb +4 -0
  346. data/app/views/dm_core/admin/custom_fields/_select.html.erb +4 -0
  347. data/app/views/dm_core/admin/custom_fields/_text_area.html.erb +4 -0
  348. data/app/views/dm_core/admin/custom_fields/_text_field.html.erb +4 -0
  349. data/app/views/dm_core/admin/dashboard/_index_sidebar.html.erb +22 -0
  350. data/app/views/dm_core/admin/dashboard/_widget_recent_new_users.html.erb +23 -0
  351. data/app/views/dm_core/admin/dashboard/_widget_recent_user_activity.html.erb +21 -0
  352. data/app/views/dm_core/admin/dashboard/index.html.erb +7 -0
  353. data/app/views/dm_core/admin/dashboard/update_site_assets.html.erb +5 -0
  354. data/app/views/dm_core/admin/shared/_header_stats_new_users.html.erb +2 -0
  355. data/app/views/dm_core/admin/shared/_header_stats_user_activity.html.erb +2 -0
  356. data/app/views/dm_core/admin/system/show.html.erb +23 -0
  357. data/app/views/dm_core/admin/users/_form.html.erb +44 -0
  358. data/app/views/dm_core/admin/users/edit.html.erb +201 -0
  359. data/app/views/dm_core/admin/users/index.html.erb +30 -0
  360. data/app/views/dm_core/profile/_profile_sidebar.html.erb +6 -0
  361. data/app/views/dm_core/profile/account.html.erb +38 -0
  362. data/app/views/dm_core/profile/details.html.erb +38 -0
  363. data/app/views/layouts/dm_core/application.html.erb +14 -0
  364. data/app/views/layouts/dm_core/maintenance.html.erb +31 -0
  365. data/app/views/layouts/email_templates/default_email_layout.html.erb +289 -0
  366. data/config/initializers/_dm_core.rb +7 -0
  367. data/config/initializers/carrierwave.rb +33 -0
  368. data/config/initializers/devise.rb +252 -0
  369. data/config/initializers/friendly_id.rb +88 -0
  370. data/config/initializers/globalize_easy_accessors.rb +67 -0
  371. data/config/initializers/globalize_papertrail_fix.rb +20 -0
  372. data/config/initializers/globalize_reflections.rb +22 -0
  373. data/config/initializers/rolify.rb +8 -0
  374. data/config/initializers/simple_form.rb +161 -0
  375. data/config/initializers/simple_form_amsterdam.rb +31 -0
  376. data/config/initializers/simple_form_bootstrap.rb +87 -0
  377. data/config/initializers/simple_form_bootstrap3.rb +175 -0
  378. data/config/initializers/will_paginate.rb +87 -0
  379. data/config/locales/custom.cs.yml +82 -0
  380. data/config/locales/custom.de.yml +82 -0
  381. data/config/locales/custom.en.yml +84 -0
  382. data/config/locales/custom.fi.yml +84 -0
  383. data/config/locales/custom.ja.yml +84 -0
  384. data/config/locales/devise.cs.yml +70 -0
  385. data/config/locales/devise.de.yml +60 -0
  386. data/config/locales/devise.en.yml +59 -0
  387. data/config/locales/devise.fi.yml +57 -0
  388. data/config/locales/devise.ja.yml +102 -0
  389. data/config/locales/rails.cs.yml +211 -0
  390. data/config/locales/rails.de-AT.yml +203 -0
  391. data/config/locales/rails.de.yml +203 -0
  392. data/config/locales/rails.en-GB.yml +205 -0
  393. data/config/locales/rails.en-IN.yml +205 -0
  394. data/config/locales/rails.en.yml +205 -0
  395. data/config/locales/rails.fi.yml +199 -0
  396. data/config/locales/rails.fr-CH.yml +207 -0
  397. data/config/locales/rails.fr.yml +215 -0
  398. data/config/locales/rails.ja.yml +197 -0
  399. data/config/locales/simple_form.cs.yml +26 -0
  400. data/config/locales/simple_form.de.yml +26 -0
  401. data/config/locales/simple_form.en.yml +26 -0
  402. data/config/locales/simple_form.fi.yml +26 -0
  403. data/config/locales/simple_form.ja.yml +26 -0
  404. data/config/routes.rb +33 -0
  405. data/db/globalize_seed_data.sql +76 -0
  406. data/db/migrate/20121023202117_add_globalize_countries.rb +49 -0
  407. data/db/migrate/20121028125329_devise_create_users.rb +45 -0
  408. data/db/migrate/20121028125831_add_user_fields.rb +13 -0
  409. data/db/migrate/20121028153317_rolify_create_roles.rb +19 -0
  410. data/db/migrate/20121105205634_add_last_access.rb +9 -0
  411. data/db/migrate/20121110213512_create_versions.rb +18 -0
  412. data/db/migrate/20121110213513_add_object_changes_column_to_versions.rb +11 -0
  413. data/db/migrate/20130206121535_create_dm_core_accounts.rb +12 -0
  414. data/db/migrate/20130206223323_add_account_to_users.rb +8 -0
  415. data/db/migrate/20130207170247_create_preferences.rb +12 -0
  416. data/db/migrate/20130321144726_create_comments.rb +21 -0
  417. data/db/migrate/20130402203739_add_activity.rb +20 -0
  418. data/db/migrate/20130415095617_add_type_to_comments.rb +8 -0
  419. data/db/migrate/20130429191051_add_category.rb +27 -0
  420. data/db/migrate/20130513112751_create_email_table.rb +25 -0
  421. data/db/migrate/20130516143539_add_user_profile.rb +45 -0
  422. data/db/migrate/20130518155712_add_profile_email.rb +13 -0
  423. data/db/migrate/20130620145610_create_payment_history.rb +36 -0
  424. data/db/migrate/20130625091108_change_anchor_field.rb +9 -0
  425. data/db/migrate/20130628112848_create_user_site_profile.rb +26 -0
  426. data/db/migrate/20130708150236_add_avatar.rb +11 -0
  427. data/db/migrate/20130914132041_add_notify_to_payment_history.rb +7 -0
  428. data/db/migrate/20140105133446_acts_as_votable_migration.rb +27 -0
  429. data/db/migrate/20140107112418_add_user_site_profile_uuid.rb +18 -0
  430. data/db/migrate/20140129110547_add_invoice_id.rb +6 -0
  431. data/db/migrate/20140201092656_acts_as_follower_migration.rb +17 -0
  432. data/db/migrate/20140203131320_rename_invoice_id.rb +11 -0
  433. data/db/migrate/20140210195143_add_core_addresses.rb +17 -0
  434. data/db/migrate/20140411190454_papertrail_increase_column.rb +8 -0
  435. data/db/migrate/20140501160009_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +31 -0
  436. data/db/migrate/20140501160010_add_missing_unique_indices.acts_as_taggable_on_engine.rb +22 -0
  437. data/db/migrate/20140501160011_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +15 -0
  438. data/db/migrate/20140529164730_create_custom_fields.rb +39 -0
  439. data/db/migrate/20140709145503_add_missing_taggable_index.acts_as_taggable_on_engine.rb +10 -0
  440. data/db/migrate/20141216094639_add_favored_locale.rb +18 -0
  441. data/db/migrate/20160128094739_update_papertrail_v4.rb +73 -0
  442. data/db/migrate/20160630095745_create_delayed_jobs.rb +22 -0
  443. data/db/migrate/20160821150111_index_foreign_keys_in_core_accounts.rb +5 -0
  444. data/db/migrate/20160821150113_index_foreign_keys_in_core_addresses.rb +5 -0
  445. data/db/migrate/20160821150114_index_foreign_keys_in_core_categories.rb +5 -0
  446. data/db/migrate/20160821150115_index_foreign_keys_in_core_comments.rb +5 -0
  447. data/db/migrate/20160821150116_index_foreign_keys_in_core_custom_fields.rb +5 -0
  448. data/db/migrate/20160821150117_index_foreign_keys_in_core_payment_histories.rb +7 -0
  449. data/db/migrate/20160821150118_index_foreign_keys_in_core_system_email_translations.rb +5 -0
  450. data/db/migrate/20160821150119_index_foreign_keys_in_core_system_emails.rb +6 -0
  451. data/db/migrate/20160821150128_index_foreign_keys_in_preferences.rb +5 -0
  452. data/db/migrate/20160821150129_index_foreign_keys_in_roles.rb +5 -0
  453. data/db/migrate/20160821150130_index_foreign_keys_in_taggings.rb +5 -0
  454. data/db/migrate/20160821150131_index_foreign_keys_in_user_profiles.rb +7 -0
  455. data/db/migrate/20160821150132_index_foreign_keys_in_user_site_profiles.rb +6 -0
  456. data/db/migrate/20160821150133_index_foreign_keys_in_users_roles.rb +5 -0
  457. data/db/migrate/20160821150134_index_foreign_keys_in_version_associations.rb +5 -0
  458. data/db/migrate/20160821150135_index_foreign_keys_in_versions.rb +5 -0
  459. data/db/seeds.rb +433 -0
  460. data/db/seeds/globalize_countries.rb +239 -0
  461. data/db/seeds/globalize_languages.rb +186 -0
  462. data/lib/dm_core.rb +38 -0
  463. data/lib/dm_core/csv_exporter.rb +210 -0
  464. data/lib/dm_core/csv_importer.rb +16 -0
  465. data/lib/dm_core/engine.rb +51 -0
  466. data/lib/dm_core/liquid_extensions.rb +125 -0
  467. data/lib/dm_core/nls.rb +31 -0
  468. data/lib/dm_core/scio_excel.rb +501 -0
  469. data/lib/dm_core/state_select.rb +135 -0
  470. data/lib/dm_core/version.rb +3 -0
  471. data/lib/tasks/dm_core_tasks.rake +60 -0
  472. data/spec/dummy/README.rdoc +28 -0
  473. data/spec/dummy/Rakefile +6 -0
  474. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  475. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  476. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  477. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  478. data/spec/dummy/app/models/ability.rb +10 -0
  479. data/spec/dummy/app/models/user.rb +6 -0
  480. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  481. data/spec/dummy/bin/bundle +3 -0
  482. data/spec/dummy/bin/rails +4 -0
  483. data/spec/dummy/bin/rake +4 -0
  484. data/spec/dummy/config.ru +4 -0
  485. data/spec/dummy/config/application.rb +27 -0
  486. data/spec/dummy/config/boot.rb +5 -0
  487. data/spec/dummy/config/database.yml +25 -0
  488. data/spec/dummy/config/environment.rb +5 -0
  489. data/spec/dummy/config/environments/development.rb +37 -0
  490. data/spec/dummy/config/environments/production.rb +82 -0
  491. data/spec/dummy/config/environments/test.rb +39 -0
  492. data/spec/dummy/config/initializers/assets.rb +8 -0
  493. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  494. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  495. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  496. data/spec/dummy/config/initializers/inflections.rb +16 -0
  497. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  498. data/spec/dummy/config/initializers/session_store.rb +3 -0
  499. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  500. data/spec/dummy/config/locales/en.yml +23 -0
  501. data/spec/dummy/config/routes.rb +11 -0
  502. data/spec/dummy/config/secrets.yml +22 -0
  503. data/spec/dummy/db/development.sqlite3 +0 -0
  504. data/spec/dummy/db/schema.rb +399 -0
  505. data/spec/dummy/db/test.sqlite3 +0 -0
  506. data/spec/dummy/log/test.log +374 -0
  507. data/spec/dummy/public/404.html +67 -0
  508. data/spec/dummy/public/422.html +67 -0
  509. data/spec/dummy/public/500.html +66 -0
  510. data/spec/dummy/public/favicon.ico +0 -0
  511. data/spec/factories/accounts.rb +9 -0
  512. data/spec/factories/user_profiles.rb +10 -0
  513. data/spec/factories/users.rb +19 -0
  514. data/spec/helpers/account_helper_spec.rb +50 -0
  515. data/spec/models/account_spec.rb +20 -0
  516. data/spec/models/user_spec.rb +99 -0
  517. data/spec/rails_helper.rb +70 -0
  518. data/spec/spec_helper.rb +85 -0
  519. data/spec/support/accounts.rb +19 -0
  520. data/spec/support/devise.rb +44 -0
  521. data/spec/support/fix_locale.rb +57 -0
  522. metadata +1124 -0
@@ -0,0 +1,41 @@
1
+ module DmCore
2
+ module Concerns
3
+ module ProfileController
4
+ extend ActiveSupport::Concern
5
+ include DmCore::PermittedParams
6
+
7
+ included do
8
+ before_filter :authenticate_user!
9
+ end
10
+
11
+ #------------------------------------------------------------------------------
12
+ def account
13
+ @user = current_user
14
+ if put_or_post?
15
+ if @user.update_with_password(user_params)
16
+ #--- Sign in the user bypassing validation in case his password changed
17
+ sign_in @user, :bypass => true
18
+ if params[:user][:email] != @user.email
19
+ flash.now[:notice] = I18n.t('core.profile_email_confirmation')
20
+ else
21
+ flash.now[:notice] = I18n.t('core.profile_password_updated')
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ #------------------------------------------------------------------------------
28
+ def details
29
+ @user_profile = current_user.user_profile
30
+ if put_or_post?
31
+ if @user_profile.update_attributes(user_profile_params)
32
+ flash.now[:notice] = I18n.t('core.profile_profile_updated')
33
+ end
34
+ end
35
+ end
36
+
37
+ module ClassMethods
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,8 @@
1
+ # Subclass from main ApplicationController, which will subclass from DmCore
2
+ #------------------------------------------------------------------------------
3
+ class DmCore::ProfileController < ::ApplicationController
4
+ include DmCore::Concerns::ProfileController
5
+
6
+ layout 'layouts/general_templates/user_profile'
7
+
8
+ end
@@ -0,0 +1,75 @@
1
+ class UserDatatable
2
+ include ActionView::Helpers::TagHelper
3
+ include DmCore::ApplicationHelper
4
+
5
+ delegate :params, :link_to, :image_tag, :number_to_currency, :time_ago_in_words, to: :@view
6
+ delegate :url_helpers, to: 'DmCore::Engine.routes'
7
+
8
+ #------------------------------------------------------------------------------
9
+ def initialize(view)
10
+ @view = view
11
+ end
12
+
13
+ #------------------------------------------------------------------------------
14
+ def as_json(options = {})
15
+ {
16
+ sEcho: params[:sEcho].to_i,
17
+ iTotalRecords: User.count,
18
+ iTotalDisplayRecords: users.total_entries,
19
+ aaData: data
20
+ }
21
+ end
22
+
23
+ private
24
+
25
+ #------------------------------------------------------------------------------
26
+ def data
27
+ users.map do |user|
28
+ [
29
+ "<div class='avatar'>#{link_to present(user).avatar_for(35), user.user_profile.public_avatar_url}</div>",
30
+ link_to(user.full_name.to_s_default, url_helpers.edit_admin_user_path(user, :locale => DmCore::Language.locale), :title => "Edit #{user.full_name}"),
31
+ user.email,
32
+ user.country.nil? ? 'n/a' : user.country.english_name,
33
+ "<span style='white-space:nowrap'>#{present(user).last_access}</span>",
34
+ present(user).role_label
35
+ ]
36
+ end
37
+ end
38
+
39
+ #------------------------------------------------------------------------------
40
+ def users
41
+ @users ||= fetch_users
42
+ end
43
+
44
+ #------------------------------------------------------------------------------
45
+ def fetch_users
46
+ users = User.current_account_users.includes({:user_profile => [ :country ]}).order("#{sort_column} #{sort_direction}")
47
+ users = users.page(page).per_page(per_page)
48
+ if params[:sSearch].present?
49
+ users = users.where("LOWER(user_profiles.first_name) like :search OR LOWER(user_profiles.last_name) like :search OR LOWER(users.email) like :search", search: "%#{params[:sSearch]}%".downcase)
50
+ end
51
+ users
52
+ end
53
+
54
+ #------------------------------------------------------------------------------
55
+ def page
56
+ params[:iDisplayStart].to_i/per_page + 1
57
+ end
58
+
59
+ #------------------------------------------------------------------------------
60
+ def per_page
61
+ params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 50
62
+ end
63
+
64
+ #------------------------------------------------------------------------------
65
+ def sort_column
66
+ columns = ['', "LOWER(user_profiles.first_name) #{sort_direction}, LOWER(user_profiles.last_name)", 'LOWER(user_profiles.email)', 'globalize_countries.english_name', 'user_site_profiles.last_access_at']
67
+ columns[params[:iSortCol_0].to_i]
68
+ end
69
+
70
+ #------------------------------------------------------------------------------
71
+ def sort_direction
72
+ params[:sSortDir_0] == "desc" ? "desc" : "asc"
73
+ end
74
+
75
+ end
@@ -0,0 +1,25 @@
1
+ module DeviseHelper
2
+ # A simple way to show error messages for the current devise resource. If you need
3
+ # to customize this method, you can either overwrite it in your application helpers or
4
+ # copy the views to your application.
5
+ #
6
+ # This method is intended to stay simple and it is unlikely that we are going to change
7
+ # it to add more behavior or options.
8
+ def devise_error_messages!
9
+ return "" if resource.errors.empty?
10
+
11
+ messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
12
+ sentence = I18n.t("errors.messages.not_saved",
13
+ :count => resource.errors.count,
14
+ :resource => resource.class.model_name.human.downcase)
15
+
16
+ html = <<-HTML
17
+ <div id="error_explanation" class=" alert alert-error">
18
+ <p class="alert-heading"><strong>#{sentence}</strong></p>
19
+ <ul>#{messages}</ul>
20
+ </div>
21
+ HTML
22
+
23
+ html.html_safe
24
+ end
25
+ end
@@ -0,0 +1,70 @@
1
+ module DmCore
2
+ module AccountHelper
3
+
4
+ #------------------------------------------------------------------------------
5
+ def current_account
6
+ Account.current
7
+ end
8
+
9
+ # Get the account prefix that is used for locating items on the filesystem.
10
+ #------------------------------------------------------------------------------
11
+ def account_prefix
12
+ current_account.account_prefix
13
+ end
14
+
15
+ # Returns the path (from the root of the site) to the site general asset files
16
+ # Pass in false not to include leading slash
17
+ #------------------------------------------------------------------------------
18
+ def account_site_assets(leading_slash = true)
19
+ leading_slash ? "/site_assets/#{account_prefix}/site" : "site_assets/#{account_prefix}/site"
20
+ end
21
+
22
+ # Returns the path (from the root of the site) to the protected asset files
23
+ # Pass in false not to include leading slash
24
+ #------------------------------------------------------------------------------
25
+ def account_protected_assets(leading_slash = true)
26
+ leading_slash ? "/protected_assets/#{account_prefix}" : "protected_assets/#{account_prefix}"
27
+ end
28
+
29
+ # Returns the path (from the root of the site) to the site's uploadable asset
30
+ # folder, which is 'media'
31
+ # Pass in false not to include leading slash
32
+ #------------------------------------------------------------------------------
33
+ def account_site_assets_media(leading_slash = true)
34
+ account_site_assets(leading_slash) + '/media'
35
+ end
36
+
37
+ # Returns the url of the site's general asset files
38
+ # Pass in false not to include leading slash
39
+ #------------------------------------------------------------------------------
40
+ def account_site_assets_url
41
+ Account.current.url_base + account_site_assets(true)
42
+ end
43
+
44
+ # Returns the url of the site's media asset files
45
+ # Pass in false not to include leading slash
46
+ #------------------------------------------------------------------------------
47
+ def account_site_assets_media_url
48
+ Account.current.url_base + account_site_assets_media(true)
49
+ end
50
+
51
+ private
52
+
53
+ # setup the account scope, used for scoping models to an Account
54
+ #------------------------------------------------------------------------------
55
+ def scope_current_account
56
+ Account.current = Account.find_account(request.host)
57
+ #--- set the current request site url for use where request object is not avail,
58
+ # like in ActionMailer
59
+ Account.current.set_url_parts(request.protocol, request.host_with_port)
60
+ yield
61
+ ensure
62
+ # Ensure that once this request is done, the Account.current (which
63
+ # is stored in thread storage) is cleared.
64
+ # When testing, it's better *not* to clear it, since expectations
65
+ # after the controller call may need the current account
66
+ Account.current = nil unless Rails.env.test?
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,23 @@
1
+ module DmCore::Admin::ApplicationHelper
2
+
3
+ # Switch to the different user
4
+ #------------------------------------------------------------------------------
5
+ def switch_user(user)
6
+ sign_in(:user, user)
7
+ end
8
+
9
+ #------------------------------------------------------------------------------
10
+ def is_current_controller(controller_name)
11
+ controller.controller_name == controller_name
12
+ end
13
+
14
+ # http://stackoverflow.com/questions/8552763/best-way-to-highlight-current-page-in-rails-3-apply-a-css-class-to-links-con
15
+ #------------------------------------------------------------------------------
16
+ def admin_path_active_class?(*paths)
17
+ active = false
18
+ # paths.each { |path| active ||= current_page?(path) }
19
+ paths.each { |path| active ||= request.url.include?(path) }
20
+ active ? 'active' : nil
21
+ end
22
+
23
+ end
@@ -0,0 +1,58 @@
1
+ module DmCore
2
+ module ApplicationHelper
3
+
4
+ # Used for accessing a models presenter object - can also accept a block
5
+ #------------------------------------------------------------------------------
6
+ def present(object, klass = nil)
7
+ klass ||= "#{object.class}Presenter".constantize
8
+ presenter = klass.new(object, self)
9
+ yield presenter if block_given?
10
+ presenter
11
+ end
12
+
13
+ #------------------------------------------------------------------------------
14
+ def flash_notices
15
+ #--- use Bootstrap class values
16
+ flash_class = {:notice => 'alert-success', :error => 'alert-error', :alert => 'alert-info'}
17
+ raw([:notice, :error, :alert].collect {|type| content_tag('div', flash[type], :id => type, :class => "alert #{flash_class[type]}") if flash[type] }.join)
18
+ end
19
+
20
+ #------------------------------------------------------------------------------
21
+ def is_admin?
22
+ user_signed_in? && current_user.is_admin?
23
+ end
24
+
25
+ #------------------------------------------------------------------------------
26
+ def is_sysadmin?
27
+ user_signed_in? && current_user.is_sysadmin?
28
+ end
29
+
30
+ # for determining if use is on a paritcular page, for active nav highlighting
31
+ # http://stackoverflow.com/questions/3705898/best-way-to-add-current-class-to-nav-in-rails-3
32
+ #------------------------------------------------------------------------------
33
+ def controller?(*controller)
34
+ controller.include?(params[:controller])
35
+ end
36
+
37
+ #------------------------------------------------------------------------------
38
+ def action?(*action)
39
+ action.include?(params[:action])
40
+ end
41
+
42
+ # Usually don't care if a form submits a PUT or POST. Was something submitted?
43
+ #------------------------------------------------------------------------------
44
+ def put_or_post?
45
+ request.put? || request.post? || request.patch?
46
+ end
47
+
48
+ #------------------------------------------------------------------------------
49
+ def link_to_add_custom_fields(name, f, association)
50
+ new_object = f.object.send(association).klass.new
51
+ id = new_object.object_id
52
+ fields = f.simple_fields_for(association, new_object, child_index: id) do |builder|
53
+ render('dm_core/admin/custom_fields/' + association.to_s.singularize + "_fields", f: builder)
54
+ end
55
+ link_to(name, '#', class: 'add_custom_fields btn btn-xs btn-default', data: {id: id, fields: fields.gsub("\n", "")})
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,79 @@
1
+ require 'kramdown'
2
+
3
+ # Note: do not make a call to current_user in this file. Was not able to get
4
+ # that helper included in the mailers.
5
+ #------------------------------------------------------------------------------
6
+ module DmCore::LiquidHelper
7
+
8
+ # Pass :view in a register so this view (with helpers) can be used inside of a tag
9
+ # This assumes that the content is from a trusted source
10
+ #------------------------------------------------------------------------------
11
+ def liquidize_textile(content, arguments = {})
12
+ doc = RedCloth.new(Liquid::Template.parse(content).render(arguments, :filters => [LiquidFilters],
13
+ :registers => { :controller => controller, :view => self,
14
+ :account_site_assets => account_site_assets_url }))
15
+ #doc.hard_breaks = false
16
+ return doc.to_html.html_safe
17
+ end
18
+
19
+ # use the kramdown library
20
+ # This assumes that the content is from a trusted source
21
+ #------------------------------------------------------------------------------
22
+ def liquidize_markdown(content, arguments = {})
23
+ doc = ::Kramdown::Document.new(Liquid::Template.parse(content).render(arguments, :filters => [LiquidFilters],
24
+ :registers => { :controller => controller, :view => self,
25
+ :account_site_assets => account_site_assets_url }),
26
+ :parse_block_html => true)
27
+ return doc.to_html.html_safe
28
+ end
29
+
30
+ # This assumes that the content is from a trusted source
31
+ #------------------------------------------------------------------------------
32
+ def liquidize_html(content, arguments = {})
33
+ doc = Liquid::Template.parse(content).render(arguments, :filters => [LiquidFilters],
34
+ :registers => { :controller => controller, :view => self,
35
+ :account_site_assets => account_site_assets_url })
36
+ return doc.html_safe
37
+ end
38
+
39
+ # Use Kramdown for parsing, then sanitize output.
40
+ # Goal is to allow untrusted users to add comments/text with some formatting and
41
+ # linking, but provide safe output
42
+ #------------------------------------------------------------------------------
43
+ def markdown(content = '', options = {safe: true}, &block)
44
+ content ||= ''
45
+ if block_given?
46
+ html = ::Kramdown::Document.new(capture(&block)).to_html.html_safe
47
+ else
48
+ html = ::Kramdown::Document.new(content).to_html.html_safe
49
+ end
50
+ return options[:safe] ? sanitize_text(html, level: :relaxed).html_safe : html
51
+ end
52
+
53
+ # Uses Sanitize gem to fully sanitize any text.
54
+ # Note: Default setting will make any markdown source (like user comments, etc)
55
+ # safe for sending out in emails
56
+ #------------------------------------------------------------------------------
57
+ def sanitize_text(content, options = {level: :default})
58
+ case options[:level]
59
+ when :default
60
+ # strip all html
61
+ Sanitize.clean(content)
62
+ when :restricted
63
+ # Allows only very simple inline formatting markup. No links, images, or block elements.
64
+ Sanitize.clean(content, Sanitize::Config::RESTRICTED)
65
+ when :basic
66
+ #Allows a variety of markup including formatting tags, links, and lists.
67
+ # Images and tables are not allowed, links are limited to FTP, HTTP, HTTPS, and
68
+ # mailto protocols, and a rel="nofollow" attribute is added to all links to
69
+ # mitigate SEO spam.
70
+ Sanitize.clean(content, Sanitize::Config::BASIC)
71
+ when :relaxed
72
+ # Allows an even wider variety of markup than BASIC, including images and tables.
73
+ # Links are still limited to FTP, HTTP, HTTPS, and mailto protocols, while images
74
+ # are limited to HTTP and HTTPS. In this mode, rel="nofollow" is not added to links.
75
+ Sanitize.clean(content, Sanitize::Config::RELAXED)
76
+ end
77
+ end
78
+
79
+ end
@@ -0,0 +1,19 @@
1
+ module DmCore
2
+ module ParamsHelper
3
+
4
+ # given a "width" parameter, make it into a valid css width value
5
+ #------------------------------------------------------------------------------
6
+ def css_style_width(width = '')
7
+ width = width.to_s.as_css_size
8
+ return width.blank? ? '' : "width:#{width};"
9
+ end
10
+
11
+ # given a "height" parameter, make it into a valid css height value
12
+ #------------------------------------------------------------------------------
13
+ def css_style_height(height = '')
14
+ height = height.to_s.as_css_size
15
+ return height.blank? ? '' : "height:#{height};"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,104 @@
1
+ module DmCore
2
+ module RenderHelper
3
+
4
+ # gives the public avatar for a user
5
+ #------------------------------------------------------------------------------
6
+ def avatar_for(user, size=32)
7
+ user = User.new(user_profile: UserProfile.new) if user.nil? # avatar comes from the user profile
8
+ present(user).avatar_for(size)
9
+ end
10
+
11
+ # Used in pagination - get the current page number being displayed
12
+ #------------------------------------------------------------------------------
13
+ def page_number
14
+ @page_number ||= [1, params[:page].to_i].max
15
+ end
16
+
17
+ # Wrapper to pull the list of countries from our table
18
+ #------------------------------------------------------------------------------
19
+ def ut_country_select(object, method, options = {include_blank: true}, html_options = {})
20
+ collection = ut_country_select_collection(include_blank: false, as: options[:as])
21
+ select(object, method, collection, options, html_options)
22
+ end
23
+
24
+ # Wrapper to pull the list of countries from our table
25
+ #------------------------------------------------------------------------------
26
+ def ut_country_select_tag(name, selected = nil, options = {include_blank: true}, html_options = {})
27
+ collection = ut_country_select_collection(options)
28
+ select_tag(name, options_for_select(collection, selected), html_options)
29
+ end
30
+
31
+ # Just return the collection for the countries
32
+ # as: :id return the ids of the Country objects
33
+ # as: :code return the 2-letter country code
34
+ # as: :name return the country's english name
35
+ # (old interface passed in only a true or false to indicate include_blank)
36
+ #------------------------------------------------------------------------------
37
+ def ut_country_select_collection(options = {include_blank: true, as: :id})
38
+ options = {include_blank: options, as: :id} if !options.is_a?(Hash)
39
+
40
+ collection = (options[:include_blank] ? [[" ", ""]] : [])
41
+ case options[:as]
42
+ when :code
43
+ collection += ::StateCountryConstants::PRIMARY_COUNTRIES_CODE + DmCore::Country.order('english_name').collect {|p| [ p.english_name, p.code ] }
44
+ when :name
45
+ collection += ::StateCountryConstants::PRIMARY_COUNTRIES_NAME + DmCore::Country.order('english_name').collect {|p| [ p.english_name, p.english_name ] }
46
+ else
47
+ collection += ::StateCountryConstants::PRIMARY_COUNTRIES + DmCore::Country.order('english_name').collect {|p| [ p.english_name, p.id ] }
48
+ end
49
+ end
50
+
51
+ # Wrapper to pull a list of countries from our table
52
+ # It will also call an Ajax function which changes a container with
53
+ # an id of 'state_select_container' to a drop down with the proper states
54
+ # for that country.
55
+ #------------------------------------------------------------------------------
56
+ def ut_country_select_with_states(object, method, method_state, options = {include_blank: true}, html_options = {})
57
+ collection = ut_country_select_collection(include_blank: false, as: options[:as])
58
+ state_object_method = "#{object.to_s}[#{method_state.to_s}]"
59
+ html_options[:id] ||= 'country_select'
60
+ html_options.merge!({data: {progressid: "indicator_country", objectname: state_object_method}})
61
+
62
+ select(object, method, collection, options, html_options)
63
+ end
64
+
65
+ # Generates a select menu or a text field, depending on if there are states
66
+ # associated with the chosen country.
67
+ # => object_method: name of model 'state' field, used for the tag, such as 'student[state]'
68
+ # => country_id: globlized id of the selected country
69
+ # => selected_state: name of the current state selected
70
+ #------------------------------------------------------------------------------
71
+ def ut_state_selection(object_method, country_id = 0, selected_state = nil)
72
+ if country_id == 0 or country_id.nil?
73
+ select_tag(object_method, "<option value=''>Please select a country".html_safe)
74
+ else
75
+ selected_country = ::StateCountryConstants::COUNTRIES_WITH_STATES.find {|x| x[:id] == country_id}
76
+ if selected_country
77
+ select_tag(object_method, state_options_for_select(selected_state, selected_country[:code]), {include_blank: true}).html_safe
78
+ else
79
+ text_field_tag(object_method, selected_state)
80
+ end
81
+ end
82
+ end
83
+
84
+ #------------------------------------------------------------------------------
85
+ def pagination(collection, options = {version: :original})
86
+ if collection.total_entries > 1
87
+ if options[:version] == :original
88
+ content_tag(:div, class: 'pagination') do
89
+ will_paginate(collection, {inner_window: 8, next_label: I18n.t('core.next_page').html_safe, previous_label: I18n.t('core.prev_page').html_safe}.merge(options))
90
+ end
91
+ else
92
+ will_paginate(collection, {inner_window: 8, next_label: I18n.t('core.next_page').html_safe, previous_label: I18n.t('core.prev_page').html_safe}.merge(options))
93
+ end
94
+ end
95
+ end
96
+
97
+ # Return the name of the simple_form wrapper to use, which the theme can
98
+ # specify. Typically either :bs2_horizontal_form or :bs3_horizontal_form.
99
+ #------------------------------------------------------------------------------
100
+ def simple_form_theme_wrapper
101
+ Account.current.theme_option(:simple_form_wrapper) || :bs2_horizontal_form
102
+ end
103
+ end
104
+ end