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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +22 -0
- data/README.md +25 -0
- data/Rakefile +34 -0
- data/app/assets/images/dm_core/draft_menu_bg.png +0 -0
- data/app/assets/images/dm_core/expand.png +0 -0
- data/app/assets/images/dm_core/flags/ad.gif +0 -0
- data/app/assets/images/dm_core/flags/ae.gif +0 -0
- data/app/assets/images/dm_core/flags/af.gif +0 -0
- data/app/assets/images/dm_core/flags/ag.gif +0 -0
- data/app/assets/images/dm_core/flags/ai.gif +0 -0
- data/app/assets/images/dm_core/flags/al.gif +0 -0
- data/app/assets/images/dm_core/flags/am.gif +0 -0
- data/app/assets/images/dm_core/flags/an.gif +0 -0
- data/app/assets/images/dm_core/flags/ao.gif +0 -0
- data/app/assets/images/dm_core/flags/ar.gif +0 -0
- data/app/assets/images/dm_core/flags/as.gif +0 -0
- data/app/assets/images/dm_core/flags/at.gif +0 -0
- data/app/assets/images/dm_core/flags/au.gif +0 -0
- data/app/assets/images/dm_core/flags/aw.gif +0 -0
- data/app/assets/images/dm_core/flags/ax.gif +0 -0
- data/app/assets/images/dm_core/flags/az.gif +0 -0
- data/app/assets/images/dm_core/flags/ba.gif +0 -0
- data/app/assets/images/dm_core/flags/bb.gif +0 -0
- data/app/assets/images/dm_core/flags/bd.gif +0 -0
- data/app/assets/images/dm_core/flags/be.gif +0 -0
- data/app/assets/images/dm_core/flags/bf.gif +0 -0
- data/app/assets/images/dm_core/flags/bg.gif +0 -0
- data/app/assets/images/dm_core/flags/bh.gif +0 -0
- data/app/assets/images/dm_core/flags/bi.gif +0 -0
- data/app/assets/images/dm_core/flags/bj.gif +0 -0
- data/app/assets/images/dm_core/flags/bm.gif +0 -0
- data/app/assets/images/dm_core/flags/bn.gif +0 -0
- data/app/assets/images/dm_core/flags/bo.gif +0 -0
- data/app/assets/images/dm_core/flags/br.gif +0 -0
- data/app/assets/images/dm_core/flags/bs.gif +0 -0
- data/app/assets/images/dm_core/flags/bt.gif +0 -0
- data/app/assets/images/dm_core/flags/bv.gif +0 -0
- data/app/assets/images/dm_core/flags/bw.gif +0 -0
- data/app/assets/images/dm_core/flags/by.gif +0 -0
- data/app/assets/images/dm_core/flags/bz.gif +0 -0
- data/app/assets/images/dm_core/flags/ca.gif +0 -0
- data/app/assets/images/dm_core/flags/cc.gif +0 -0
- data/app/assets/images/dm_core/flags/cd.gif +0 -0
- data/app/assets/images/dm_core/flags/cf.gif +0 -0
- data/app/assets/images/dm_core/flags/cg.gif +0 -0
- data/app/assets/images/dm_core/flags/ch.gif +0 -0
- data/app/assets/images/dm_core/flags/ci.gif +0 -0
- data/app/assets/images/dm_core/flags/ck.gif +0 -0
- data/app/assets/images/dm_core/flags/cl.gif +0 -0
- data/app/assets/images/dm_core/flags/cm.gif +0 -0
- data/app/assets/images/dm_core/flags/cn.gif +0 -0
- data/app/assets/images/dm_core/flags/co.gif +0 -0
- data/app/assets/images/dm_core/flags/cr.gif +0 -0
- data/app/assets/images/dm_core/flags/cs.gif +0 -0
- data/app/assets/images/dm_core/flags/cu.gif +0 -0
- data/app/assets/images/dm_core/flags/cv.gif +0 -0
- data/app/assets/images/dm_core/flags/cx.gif +0 -0
- data/app/assets/images/dm_core/flags/cy.gif +0 -0
- data/app/assets/images/dm_core/flags/cz.gif +0 -0
- data/app/assets/images/dm_core/flags/de.gif +0 -0
- data/app/assets/images/dm_core/flags/dj.gif +0 -0
- data/app/assets/images/dm_core/flags/dk.gif +0 -0
- data/app/assets/images/dm_core/flags/dm.gif +0 -0
- data/app/assets/images/dm_core/flags/do.gif +0 -0
- data/app/assets/images/dm_core/flags/dz.gif +0 -0
- data/app/assets/images/dm_core/flags/ec.gif +0 -0
- data/app/assets/images/dm_core/flags/ee.gif +0 -0
- data/app/assets/images/dm_core/flags/eg.gif +0 -0
- data/app/assets/images/dm_core/flags/eh.gif +0 -0
- data/app/assets/images/dm_core/flags/en.gif +0 -0
- data/app/assets/images/dm_core/flags/england.gif +0 -0
- data/app/assets/images/dm_core/flags/er.gif +0 -0
- data/app/assets/images/dm_core/flags/es.gif +0 -0
- data/app/assets/images/dm_core/flags/et.gif +0 -0
- data/app/assets/images/dm_core/flags/fam.gif +0 -0
- data/app/assets/images/dm_core/flags/fi.gif +0 -0
- data/app/assets/images/dm_core/flags/fj.gif +0 -0
- data/app/assets/images/dm_core/flags/fk.gif +0 -0
- data/app/assets/images/dm_core/flags/fm.gif +0 -0
- data/app/assets/images/dm_core/flags/fo.gif +0 -0
- data/app/assets/images/dm_core/flags/fr.gif +0 -0
- data/app/assets/images/dm_core/flags/ga.gif +0 -0
- data/app/assets/images/dm_core/flags/gb.gif +0 -0
- data/app/assets/images/dm_core/flags/gd.gif +0 -0
- data/app/assets/images/dm_core/flags/ge.gif +0 -0
- data/app/assets/images/dm_core/flags/gh.gif +0 -0
- data/app/assets/images/dm_core/flags/gi.gif +0 -0
- data/app/assets/images/dm_core/flags/gl.gif +0 -0
- data/app/assets/images/dm_core/flags/gm.gif +0 -0
- data/app/assets/images/dm_core/flags/gn.gif +0 -0
- data/app/assets/images/dm_core/flags/gp.gif +0 -0
- data/app/assets/images/dm_core/flags/gq.gif +0 -0
- data/app/assets/images/dm_core/flags/gr.gif +0 -0
- data/app/assets/images/dm_core/flags/gs.gif +0 -0
- data/app/assets/images/dm_core/flags/gt.gif +0 -0
- data/app/assets/images/dm_core/flags/gu.gif +0 -0
- data/app/assets/images/dm_core/flags/gw.gif +0 -0
- data/app/assets/images/dm_core/flags/gy.gif +0 -0
- data/app/assets/images/dm_core/flags/hk.gif +0 -0
- data/app/assets/images/dm_core/flags/hn.gif +0 -0
- data/app/assets/images/dm_core/flags/hr.gif +0 -0
- data/app/assets/images/dm_core/flags/ht.gif +0 -0
- data/app/assets/images/dm_core/flags/hu.gif +0 -0
- data/app/assets/images/dm_core/flags/id.gif +0 -0
- data/app/assets/images/dm_core/flags/ie.gif +0 -0
- data/app/assets/images/dm_core/flags/il.gif +0 -0
- data/app/assets/images/dm_core/flags/in.gif +0 -0
- data/app/assets/images/dm_core/flags/io.gif +0 -0
- data/app/assets/images/dm_core/flags/iq.gif +0 -0
- data/app/assets/images/dm_core/flags/ir.gif +0 -0
- data/app/assets/images/dm_core/flags/is.gif +0 -0
- data/app/assets/images/dm_core/flags/it.gif +0 -0
- data/app/assets/images/dm_core/flags/ja.gif +0 -0
- data/app/assets/images/dm_core/flags/jm.gif +0 -0
- data/app/assets/images/dm_core/flags/jo.gif +0 -0
- data/app/assets/images/dm_core/flags/ke.gif +0 -0
- data/app/assets/images/dm_core/flags/kg.gif +0 -0
- data/app/assets/images/dm_core/flags/kh.gif +0 -0
- data/app/assets/images/dm_core/flags/ki.gif +0 -0
- data/app/assets/images/dm_core/flags/km.gif +0 -0
- data/app/assets/images/dm_core/flags/kn.gif +0 -0
- data/app/assets/images/dm_core/flags/kp.gif +0 -0
- data/app/assets/images/dm_core/flags/kr.gif +0 -0
- data/app/assets/images/dm_core/flags/kw.gif +0 -0
- data/app/assets/images/dm_core/flags/ky.gif +0 -0
- data/app/assets/images/dm_core/flags/kz.gif +0 -0
- data/app/assets/images/dm_core/flags/la.gif +0 -0
- data/app/assets/images/dm_core/flags/lb.gif +0 -0
- data/app/assets/images/dm_core/flags/lc.gif +0 -0
- data/app/assets/images/dm_core/flags/li.gif +0 -0
- data/app/assets/images/dm_core/flags/lk.gif +0 -0
- data/app/assets/images/dm_core/flags/lr.gif +0 -0
- data/app/assets/images/dm_core/flags/ls.gif +0 -0
- data/app/assets/images/dm_core/flags/lt.gif +0 -0
- data/app/assets/images/dm_core/flags/lu.gif +0 -0
- data/app/assets/images/dm_core/flags/lv.gif +0 -0
- data/app/assets/images/dm_core/flags/ly.gif +0 -0
- data/app/assets/images/dm_core/flags/ma.gif +0 -0
- data/app/assets/images/dm_core/flags/mc.gif +0 -0
- data/app/assets/images/dm_core/flags/md.gif +0 -0
- data/app/assets/images/dm_core/flags/mg.gif +0 -0
- data/app/assets/images/dm_core/flags/mh.gif +0 -0
- data/app/assets/images/dm_core/flags/mk.gif +0 -0
- data/app/assets/images/dm_core/flags/ml.gif +0 -0
- data/app/assets/images/dm_core/flags/mm.gif +0 -0
- data/app/assets/images/dm_core/flags/mn.gif +0 -0
- data/app/assets/images/dm_core/flags/mo.gif +0 -0
- data/app/assets/images/dm_core/flags/mp.gif +0 -0
- data/app/assets/images/dm_core/flags/mq.gif +0 -0
- data/app/assets/images/dm_core/flags/mr.gif +0 -0
- data/app/assets/images/dm_core/flags/ms.gif +0 -0
- data/app/assets/images/dm_core/flags/mt.gif +0 -0
- data/app/assets/images/dm_core/flags/mu.gif +0 -0
- data/app/assets/images/dm_core/flags/mv.gif +0 -0
- data/app/assets/images/dm_core/flags/mw.gif +0 -0
- data/app/assets/images/dm_core/flags/mx.gif +0 -0
- data/app/assets/images/dm_core/flags/my.gif +0 -0
- data/app/assets/images/dm_core/flags/mz.gif +0 -0
- data/app/assets/images/dm_core/flags/na.gif +0 -0
- data/app/assets/images/dm_core/flags/nc.gif +0 -0
- data/app/assets/images/dm_core/flags/ne.gif +0 -0
- data/app/assets/images/dm_core/flags/nf.gif +0 -0
- data/app/assets/images/dm_core/flags/ng.gif +0 -0
- data/app/assets/images/dm_core/flags/ni.gif +0 -0
- data/app/assets/images/dm_core/flags/nl.gif +0 -0
- data/app/assets/images/dm_core/flags/no.gif +0 -0
- data/app/assets/images/dm_core/flags/np.gif +0 -0
- data/app/assets/images/dm_core/flags/nr.gif +0 -0
- data/app/assets/images/dm_core/flags/nu.gif +0 -0
- data/app/assets/images/dm_core/flags/nz.gif +0 -0
- data/app/assets/images/dm_core/flags/om.gif +0 -0
- data/app/assets/images/dm_core/flags/pa.gif +0 -0
- data/app/assets/images/dm_core/flags/pe.gif +0 -0
- data/app/assets/images/dm_core/flags/pf.gif +0 -0
- data/app/assets/images/dm_core/flags/pg.gif +0 -0
- data/app/assets/images/dm_core/flags/ph.gif +0 -0
- data/app/assets/images/dm_core/flags/pk.gif +0 -0
- data/app/assets/images/dm_core/flags/pl.gif +0 -0
- data/app/assets/images/dm_core/flags/pm.gif +0 -0
- data/app/assets/images/dm_core/flags/pn.gif +0 -0
- data/app/assets/images/dm_core/flags/pr.gif +0 -0
- data/app/assets/images/dm_core/flags/ps.gif +0 -0
- data/app/assets/images/dm_core/flags/pt.gif +0 -0
- data/app/assets/images/dm_core/flags/pw.gif +0 -0
- data/app/assets/images/dm_core/flags/py.gif +0 -0
- data/app/assets/images/dm_core/flags/qa.gif +0 -0
- data/app/assets/images/dm_core/flags/ro.gif +0 -0
- data/app/assets/images/dm_core/flags/ru.gif +0 -0
- data/app/assets/images/dm_core/flags/rw.gif +0 -0
- data/app/assets/images/dm_core/flags/sa.gif +0 -0
- data/app/assets/images/dm_core/flags/sb.gif +0 -0
- data/app/assets/images/dm_core/flags/sc.gif +0 -0
- data/app/assets/images/dm_core/flags/scotland.gif +0 -0
- data/app/assets/images/dm_core/flags/sd.gif +0 -0
- data/app/assets/images/dm_core/flags/se.gif +0 -0
- data/app/assets/images/dm_core/flags/sg.gif +0 -0
- data/app/assets/images/dm_core/flags/sh.gif +0 -0
- data/app/assets/images/dm_core/flags/si.gif +0 -0
- data/app/assets/images/dm_core/flags/sk.gif +0 -0
- data/app/assets/images/dm_core/flags/sl.gif +0 -0
- data/app/assets/images/dm_core/flags/sm.gif +0 -0
- data/app/assets/images/dm_core/flags/sn.gif +0 -0
- data/app/assets/images/dm_core/flags/so.gif +0 -0
- data/app/assets/images/dm_core/flags/sr.gif +0 -0
- data/app/assets/images/dm_core/flags/st.gif +0 -0
- data/app/assets/images/dm_core/flags/sv.gif +0 -0
- data/app/assets/images/dm_core/flags/sy.gif +0 -0
- data/app/assets/images/dm_core/flags/sz.gif +0 -0
- data/app/assets/images/dm_core/flags/tc.gif +0 -0
- data/app/assets/images/dm_core/flags/td.gif +0 -0
- data/app/assets/images/dm_core/flags/tf.gif +0 -0
- data/app/assets/images/dm_core/flags/tg.gif +0 -0
- data/app/assets/images/dm_core/flags/th.gif +0 -0
- data/app/assets/images/dm_core/flags/tj.gif +0 -0
- data/app/assets/images/dm_core/flags/tk.gif +0 -0
- data/app/assets/images/dm_core/flags/tl.gif +0 -0
- data/app/assets/images/dm_core/flags/tm.gif +0 -0
- data/app/assets/images/dm_core/flags/tn.gif +0 -0
- data/app/assets/images/dm_core/flags/to.gif +0 -0
- data/app/assets/images/dm_core/flags/tr.gif +0 -0
- data/app/assets/images/dm_core/flags/tt.gif +0 -0
- data/app/assets/images/dm_core/flags/tv.gif +0 -0
- data/app/assets/images/dm_core/flags/tw.gif +0 -0
- data/app/assets/images/dm_core/flags/tz.gif +0 -0
- data/app/assets/images/dm_core/flags/ua.gif +0 -0
- data/app/assets/images/dm_core/flags/ug.gif +0 -0
- data/app/assets/images/dm_core/flags/um.gif +0 -0
- data/app/assets/images/dm_core/flags/us.gif +0 -0
- data/app/assets/images/dm_core/flags/uy.gif +0 -0
- data/app/assets/images/dm_core/flags/uz.gif +0 -0
- data/app/assets/images/dm_core/flags/va.gif +0 -0
- data/app/assets/images/dm_core/flags/vc.gif +0 -0
- data/app/assets/images/dm_core/flags/ve.gif +0 -0
- data/app/assets/images/dm_core/flags/vg.gif +0 -0
- data/app/assets/images/dm_core/flags/vi.gif +0 -0
- data/app/assets/images/dm_core/flags/vn.gif +0 -0
- data/app/assets/images/dm_core/flags/vu.gif +0 -0
- data/app/assets/images/dm_core/flags/wales.gif +0 -0
- data/app/assets/images/dm_core/flags/wf.gif +0 -0
- data/app/assets/images/dm_core/flags/ws.gif +0 -0
- data/app/assets/images/dm_core/flags/ye.gif +0 -0
- data/app/assets/images/dm_core/flags/yt.gif +0 -0
- data/app/assets/images/dm_core/flags/za.gif +0 -0
- data/app/assets/images/dm_core/flags/zm.gif +0 -0
- data/app/assets/images/dm_core/flags/zw.gif +0 -0
- data/app/assets/images/dm_core/user.gif +0 -0
- data/app/assets/javascripts/dm_core/admin.js +223 -0
- data/app/assets/javascripts/dm_core/admin_extra.js.coffee +118 -0
- data/app/assets/javascripts/dm_core/application.js +14 -0
- data/app/assets/javascripts/dm_core/common_js.js.coffee +61 -0
- data/app/assets/javascripts/dm_core/underscore-1.4.4-min.js +1 -0
- data/app/assets/javascripts/dm_core/underscore-1.4.4.js +1227 -0
- data/app/assets/stylesheets/dm_core/admin.css +250 -0
- data/app/assets/stylesheets/dm_core/application.css +31 -0
- data/app/assets/stylesheets/dm_core/font-awesome.css +1479 -0
- data/app/assets/stylesheets/dm_core/font/FontAwesome.otf +0 -0
- data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.eot +0 -0
- data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.svg +399 -0
- data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.ttf +0 -0
- data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.woff +0 -0
- data/app/controllers/dm_core/admin/accounts_controller.rb +125 -0
- data/app/controllers/dm_core/admin/admin_controller.rb +133 -0
- data/app/controllers/dm_core/admin/comments_controller.rb +70 -0
- data/app/controllers/dm_core/admin/dashboard_controller.rb +38 -0
- data/app/controllers/dm_core/admin/system_controller.rb +44 -0
- data/app/controllers/dm_core/admin/users_controller.rb +106 -0
- data/app/controllers/dm_core/application_controller.rb +253 -0
- data/app/controllers/dm_core/concerns/profile_controller.rb +41 -0
- data/app/controllers/dm_core/profile_controller.rb +8 -0
- data/app/datatables/user_datatable.rb +75 -0
- data/app/helpers/devise_helper.rb +25 -0
- data/app/helpers/dm_core/account_helper.rb +70 -0
- data/app/helpers/dm_core/admin/application_helper.rb +23 -0
- data/app/helpers/dm_core/application_helper.rb +58 -0
- data/app/helpers/dm_core/liquid_helper.rb +79 -0
- data/app/helpers/dm_core/params_helper.rb +19 -0
- data/app/helpers/dm_core/render_helper.rb +104 -0
- data/app/helpers/dm_core/url_helper.rb +189 -0
- data/app/helpers/dm_utilities/currency_helper.rb +24 -0
- data/app/helpers/dm_utilities/date_helper.rb +72 -0
- data/app/inputs/code_editor_input.rb +51 -0
- data/app/inputs/text_full_width_input.rb +9 -0
- data/app/inputs/toggle_checked_input.rb +9 -0
- data/app/inputs/toggle_input.rb +9 -0
- data/app/mailers/dm_core/site_mailer.rb +18 -0
- data/app/models/account.rb +241 -0
- data/app/models/activity.rb +10 -0
- data/app/models/address.rb +24 -0
- data/app/models/category.rb +18 -0
- data/app/models/comment.rb +24 -0
- data/app/models/custom_field.rb +99 -0
- data/app/models/custom_field_def.rb +61 -0
- data/app/models/dm_core/concerns/ability.rb +17 -0
- data/app/models/dm_core/concerns/defines_custom_fields.rb +17 -0
- data/app/models/dm_core/concerns/friendly_id.rb +57 -0
- data/app/models/dm_core/concerns/has_custom_fields.rb +28 -0
- data/app/models/dm_core/concerns/public_private.rb +151 -0
- data/app/models/dm_core/concerns/user.rb +144 -0
- data/app/models/dm_core/concerns/user_profile.rb +113 -0
- data/app/models/dm_core/concerns/user_site_profile.rb +65 -0
- data/app/models/dm_core/country.rb +8 -0
- data/app/models/dm_core/language.rb +59 -0
- data/app/models/dm_core/permitted_params.rb +52 -0
- data/app/models/follow.rb +13 -0
- data/app/models/liquid_validator.rb +26 -0
- data/app/models/payment_history.rb +57 -0
- data/app/models/presence_default_locale_validator.rb +12 -0
- data/app/models/role.rb +12 -0
- data/app/models/system_email.rb +15 -0
- data/app/models/ultracart/notification.rb +107 -0
- data/app/models/ultracart/payment_history.rb +55 -0
- data/app/models/user.rb +22 -0
- data/app/models/user_profile.rb +9 -0
- data/app/models/user_site_profile.rb +11 -0
- data/app/presenters/base_presenter.rb +30 -0
- data/app/presenters/comment_presenter.rb +20 -0
- data/app/presenters/user_presenter.rb +48 -0
- data/app/uploaders/avatar_uploader.rb +75 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +7 -0
- data/app/views/devise/mailer/confirmation_instructions.text.erb +7 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +9 -0
- data/app/views/devise/mailer/reset_password_instructions.text.erb +9 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/mailer/unlock_instructions.text.erb +7 -0
- data/app/views/dm_core/admin/accounts/_settings_menu.html.erb +24 -0
- data/app/views/dm_core/admin/accounts/analytics.html.erb +38 -0
- data/app/views/dm_core/admin/accounts/email.html.erb +26 -0
- data/app/views/dm_core/admin/accounts/general.html.erb +22 -0
- data/app/views/dm_core/admin/accounts/media.html.erb +37 -0
- data/app/views/dm_core/admin/accounts/metadata.html.erb +22 -0
- data/app/views/dm_core/admin/comments/_comment.html.erb +14 -0
- data/app/views/dm_core/admin/comments/_comment_edit_form.html.erb +3 -0
- data/app/views/dm_core/admin/comments/_comment_form.html.erb +15 -0
- data/app/views/dm_core/admin/comments/_comment_list.html.erb +5 -0
- data/app/views/dm_core/admin/comments/_comment_section.html.erb +7 -0
- data/app/views/dm_core/admin/comments/create.js.erb +4 -0
- data/app/views/dm_core/admin/comments/destroy.js.erb +1 -0
- data/app/views/dm_core/admin/comments/edit.js.erb +2 -0
- data/app/views/dm_core/admin/comments/update.js.erb +2 -0
- data/app/views/dm_core/admin/custom_fields/_check_box_collection.html.erb +4 -0
- data/app/views/dm_core/admin/custom_fields/_custom_field_def_fields.html.erb +34 -0
- data/app/views/dm_core/admin/custom_fields/_divider.html.erb +1 -0
- data/app/views/dm_core/admin/custom_fields/_number_field.html.erb +4 -0
- data/app/views/dm_core/admin/custom_fields/_radio_buttons.html.erb +4 -0
- data/app/views/dm_core/admin/custom_fields/_select.html.erb +4 -0
- data/app/views/dm_core/admin/custom_fields/_text_area.html.erb +4 -0
- data/app/views/dm_core/admin/custom_fields/_text_field.html.erb +4 -0
- data/app/views/dm_core/admin/dashboard/_index_sidebar.html.erb +22 -0
- data/app/views/dm_core/admin/dashboard/_widget_recent_new_users.html.erb +23 -0
- data/app/views/dm_core/admin/dashboard/_widget_recent_user_activity.html.erb +21 -0
- data/app/views/dm_core/admin/dashboard/index.html.erb +7 -0
- data/app/views/dm_core/admin/dashboard/update_site_assets.html.erb +5 -0
- data/app/views/dm_core/admin/shared/_header_stats_new_users.html.erb +2 -0
- data/app/views/dm_core/admin/shared/_header_stats_user_activity.html.erb +2 -0
- data/app/views/dm_core/admin/system/show.html.erb +23 -0
- data/app/views/dm_core/admin/users/_form.html.erb +44 -0
- data/app/views/dm_core/admin/users/edit.html.erb +201 -0
- data/app/views/dm_core/admin/users/index.html.erb +30 -0
- data/app/views/dm_core/profile/_profile_sidebar.html.erb +6 -0
- data/app/views/dm_core/profile/account.html.erb +38 -0
- data/app/views/dm_core/profile/details.html.erb +38 -0
- data/app/views/layouts/dm_core/application.html.erb +14 -0
- data/app/views/layouts/dm_core/maintenance.html.erb +31 -0
- data/app/views/layouts/email_templates/default_email_layout.html.erb +289 -0
- data/config/initializers/_dm_core.rb +7 -0
- data/config/initializers/carrierwave.rb +33 -0
- data/config/initializers/devise.rb +252 -0
- data/config/initializers/friendly_id.rb +88 -0
- data/config/initializers/globalize_easy_accessors.rb +67 -0
- data/config/initializers/globalize_papertrail_fix.rb +20 -0
- data/config/initializers/globalize_reflections.rb +22 -0
- data/config/initializers/rolify.rb +8 -0
- data/config/initializers/simple_form.rb +161 -0
- data/config/initializers/simple_form_amsterdam.rb +31 -0
- data/config/initializers/simple_form_bootstrap.rb +87 -0
- data/config/initializers/simple_form_bootstrap3.rb +175 -0
- data/config/initializers/will_paginate.rb +87 -0
- data/config/locales/custom.cs.yml +82 -0
- data/config/locales/custom.de.yml +82 -0
- data/config/locales/custom.en.yml +84 -0
- data/config/locales/custom.fi.yml +84 -0
- data/config/locales/custom.ja.yml +84 -0
- data/config/locales/devise.cs.yml +70 -0
- data/config/locales/devise.de.yml +60 -0
- data/config/locales/devise.en.yml +59 -0
- data/config/locales/devise.fi.yml +57 -0
- data/config/locales/devise.ja.yml +102 -0
- data/config/locales/rails.cs.yml +211 -0
- data/config/locales/rails.de-AT.yml +203 -0
- data/config/locales/rails.de.yml +203 -0
- data/config/locales/rails.en-GB.yml +205 -0
- data/config/locales/rails.en-IN.yml +205 -0
- data/config/locales/rails.en.yml +205 -0
- data/config/locales/rails.fi.yml +199 -0
- data/config/locales/rails.fr-CH.yml +207 -0
- data/config/locales/rails.fr.yml +215 -0
- data/config/locales/rails.ja.yml +197 -0
- data/config/locales/simple_form.cs.yml +26 -0
- data/config/locales/simple_form.de.yml +26 -0
- data/config/locales/simple_form.en.yml +26 -0
- data/config/locales/simple_form.fi.yml +26 -0
- data/config/locales/simple_form.ja.yml +26 -0
- data/config/routes.rb +33 -0
- data/db/globalize_seed_data.sql +76 -0
- data/db/migrate/20121023202117_add_globalize_countries.rb +49 -0
- data/db/migrate/20121028125329_devise_create_users.rb +45 -0
- data/db/migrate/20121028125831_add_user_fields.rb +13 -0
- data/db/migrate/20121028153317_rolify_create_roles.rb +19 -0
- data/db/migrate/20121105205634_add_last_access.rb +9 -0
- data/db/migrate/20121110213512_create_versions.rb +18 -0
- data/db/migrate/20121110213513_add_object_changes_column_to_versions.rb +11 -0
- data/db/migrate/20130206121535_create_dm_core_accounts.rb +12 -0
- data/db/migrate/20130206223323_add_account_to_users.rb +8 -0
- data/db/migrate/20130207170247_create_preferences.rb +12 -0
- data/db/migrate/20130321144726_create_comments.rb +21 -0
- data/db/migrate/20130402203739_add_activity.rb +20 -0
- data/db/migrate/20130415095617_add_type_to_comments.rb +8 -0
- data/db/migrate/20130429191051_add_category.rb +27 -0
- data/db/migrate/20130513112751_create_email_table.rb +25 -0
- data/db/migrate/20130516143539_add_user_profile.rb +45 -0
- data/db/migrate/20130518155712_add_profile_email.rb +13 -0
- data/db/migrate/20130620145610_create_payment_history.rb +36 -0
- data/db/migrate/20130625091108_change_anchor_field.rb +9 -0
- data/db/migrate/20130628112848_create_user_site_profile.rb +26 -0
- data/db/migrate/20130708150236_add_avatar.rb +11 -0
- data/db/migrate/20130914132041_add_notify_to_payment_history.rb +7 -0
- data/db/migrate/20140105133446_acts_as_votable_migration.rb +27 -0
- data/db/migrate/20140107112418_add_user_site_profile_uuid.rb +18 -0
- data/db/migrate/20140129110547_add_invoice_id.rb +6 -0
- data/db/migrate/20140201092656_acts_as_follower_migration.rb +17 -0
- data/db/migrate/20140203131320_rename_invoice_id.rb +11 -0
- data/db/migrate/20140210195143_add_core_addresses.rb +17 -0
- data/db/migrate/20140411190454_papertrail_increase_column.rb +8 -0
- data/db/migrate/20140501160009_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +31 -0
- data/db/migrate/20140501160010_add_missing_unique_indices.acts_as_taggable_on_engine.rb +22 -0
- data/db/migrate/20140501160011_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +15 -0
- data/db/migrate/20140529164730_create_custom_fields.rb +39 -0
- data/db/migrate/20140709145503_add_missing_taggable_index.acts_as_taggable_on_engine.rb +10 -0
- data/db/migrate/20141216094639_add_favored_locale.rb +18 -0
- data/db/migrate/20160128094739_update_papertrail_v4.rb +73 -0
- data/db/migrate/20160630095745_create_delayed_jobs.rb +22 -0
- data/db/migrate/20160821150111_index_foreign_keys_in_core_accounts.rb +5 -0
- data/db/migrate/20160821150113_index_foreign_keys_in_core_addresses.rb +5 -0
- data/db/migrate/20160821150114_index_foreign_keys_in_core_categories.rb +5 -0
- data/db/migrate/20160821150115_index_foreign_keys_in_core_comments.rb +5 -0
- data/db/migrate/20160821150116_index_foreign_keys_in_core_custom_fields.rb +5 -0
- data/db/migrate/20160821150117_index_foreign_keys_in_core_payment_histories.rb +7 -0
- data/db/migrate/20160821150118_index_foreign_keys_in_core_system_email_translations.rb +5 -0
- data/db/migrate/20160821150119_index_foreign_keys_in_core_system_emails.rb +6 -0
- data/db/migrate/20160821150128_index_foreign_keys_in_preferences.rb +5 -0
- data/db/migrate/20160821150129_index_foreign_keys_in_roles.rb +5 -0
- data/db/migrate/20160821150130_index_foreign_keys_in_taggings.rb +5 -0
- data/db/migrate/20160821150131_index_foreign_keys_in_user_profiles.rb +7 -0
- data/db/migrate/20160821150132_index_foreign_keys_in_user_site_profiles.rb +6 -0
- data/db/migrate/20160821150133_index_foreign_keys_in_users_roles.rb +5 -0
- data/db/migrate/20160821150134_index_foreign_keys_in_version_associations.rb +5 -0
- data/db/migrate/20160821150135_index_foreign_keys_in_versions.rb +5 -0
- data/db/seeds.rb +433 -0
- data/db/seeds/globalize_countries.rb +239 -0
- data/db/seeds/globalize_languages.rb +186 -0
- data/lib/dm_core.rb +38 -0
- data/lib/dm_core/csv_exporter.rb +210 -0
- data/lib/dm_core/csv_importer.rb +16 -0
- data/lib/dm_core/engine.rb +51 -0
- data/lib/dm_core/liquid_extensions.rb +125 -0
- data/lib/dm_core/nls.rb +31 -0
- data/lib/dm_core/scio_excel.rb +501 -0
- data/lib/dm_core/state_select.rb +135 -0
- data/lib/dm_core/version.rb +3 -0
- data/lib/tasks/dm_core_tasks.rake +60 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/ability.rb +10 -0
- data/spec/dummy/app/models/user.rb +6 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +27 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +82 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +11 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +399 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +374 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/accounts.rb +9 -0
- data/spec/factories/user_profiles.rb +10 -0
- data/spec/factories/users.rb +19 -0
- data/spec/helpers/account_helper_spec.rb +50 -0
- data/spec/models/account_spec.rb +20 -0
- data/spec/models/user_spec.rb +99 -0
- data/spec/rails_helper.rb +70 -0
- data/spec/spec_helper.rb +85 -0
- data/spec/support/accounts.rb +19 -0
- data/spec/support/devise.rb +44 -0
- data/spec/support/fix_locale.rb +57 -0
- 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
|