udongo 0.1.0

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 (280) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +26 -0
  4. data/app/assets/fonts/FontAwesome.otf +0 -0
  5. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  6. data/app/assets/fonts/fontawesome-webfont.svg +685 -0
  7. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  8. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  9. data/app/assets/fonts/fontawesome-webfont.woff2 +0 -0
  10. data/app/assets/javascripts/backend/application.js +22 -0
  11. data/app/assets/javascripts/backend/bootstrap.js +3560 -0
  12. data/app/assets/javascripts/backend/datepickers.js +67 -0
  13. data/app/assets/javascripts/backend/general.js +7 -0
  14. data/app/assets/javascripts/backend/pages.js +7 -0
  15. data/app/assets/javascripts/backend/plugins/autocomplete.js +147 -0
  16. data/app/assets/javascripts/backend/plugins/tagbox.js +52 -0
  17. data/app/assets/javascripts/backend/sortable.js +46 -0
  18. data/app/assets/javascripts/backend/tags.js +37 -0
  19. data/app/assets/javascripts/backend/tree.js +158 -0
  20. data/app/assets/stylesheets/backend/application.scss +18 -0
  21. data/app/assets/stylesheets/backend/bootstrap.scss +6211 -0
  22. data/app/assets/stylesheets/backend/components/_breadcrumb.scss +7 -0
  23. data/app/assets/stylesheets/backend/components/_form.scss +23 -0
  24. data/app/assets/stylesheets/backend/components/_nav.scss +3 -0
  25. data/app/assets/stylesheets/backend/components/_navbar.scss +3 -0
  26. data/app/assets/stylesheets/backend/components/_tabs.scss +3 -0
  27. data/app/assets/stylesheets/backend/font-awesome.scss +2182 -0
  28. data/app/assets/stylesheets/backend/pages/_flexible_content.scss +11 -0
  29. data/app/assets/stylesheets/backend/pages/_logged_in.scss +3 -0
  30. data/app/assets/stylesheets/backend/pages/_login.scss +3 -0
  31. data/app/assets/stylesheets/backend/udongo.scss +17 -0
  32. data/app/controllers/backend/admins_controller.rb +56 -0
  33. data/app/controllers/backend/content/rows/columns_controller.rb +75 -0
  34. data/app/controllers/backend/content/rows/images_controller.rb +6 -0
  35. data/app/controllers/backend/content/rows/texts_controller.rb +6 -0
  36. data/app/controllers/backend/content/rows_controller.rb +45 -0
  37. data/app/controllers/backend/dashboard_controller.rb +2 -0
  38. data/app/controllers/backend/email_templates_controller.rb +50 -0
  39. data/app/controllers/backend/emails_controller.rb +18 -0
  40. data/app/controllers/backend/navigation/items_controller.rb +64 -0
  41. data/app/controllers/backend/navigations_controller.rb +7 -0
  42. data/app/controllers/backend/pages_controller.rb +89 -0
  43. data/app/controllers/backend/redirects_controller.rb +50 -0
  44. data/app/controllers/backend/seo_controller.rb +6 -0
  45. data/app/controllers/backend/sessions_controller.rb +22 -0
  46. data/app/controllers/backend/snippets_controller.rb +49 -0
  47. data/app/controllers/backend/tagbox_controller.rb +52 -0
  48. data/app/controllers/backend/webserver_controller.rb +6 -0
  49. data/app/controllers/backend_controller.rb +34 -0
  50. data/app/controllers/catch_all_controller.rb +12 -0
  51. data/app/controllers/concerns/backend/content_type_controller.rb +44 -0
  52. data/app/controllers/concerns/backend/positionable_controller.rb +12 -0
  53. data/app/controllers/concerns/backend/translatable_controller.rb +41 -0
  54. data/app/controllers/concerns/pagination_controller.rb +38 -0
  55. data/app/controllers/redirects_controller.rb +18 -0
  56. data/app/decorators/content_image_decorator.rb +7 -0
  57. data/app/decorators/content_text_decorator.rb +11 -0
  58. data/app/decorators/navigation_item_decorator.rb +29 -0
  59. data/app/decorators/page_decorator.rb +29 -0
  60. data/app/decorators/redirect_decorator.rb +13 -0
  61. data/app/decorators/snippet_decorator.rb +11 -0
  62. data/app/forms/backend/email_template_translation_form.rb +11 -0
  63. data/app/forms/backend/navigation_item_translation_form.rb +8 -0
  64. data/app/forms/backend/page_translation_form.rb +17 -0
  65. data/app/forms/backend/snippet_translation_form.rb +8 -0
  66. data/app/helpers/backend/dropdown_helper.rb +9 -0
  67. data/app/helpers/backend/pagination_helper.rb +17 -0
  68. data/app/helpers/icon_helper.rb +6 -0
  69. data/app/helpers/link_helper.rb +33 -0
  70. data/app/helpers/snippet_helper.rb +5 -0
  71. data/app/helpers/udongo_helper.rb +27 -0
  72. data/app/inputs/date_picker_input.rb +30 -0
  73. data/app/inputs/date_range_picker_input.rb +13 -0
  74. data/app/mailers/general_mailer.rb +13 -0
  75. data/app/models/address.rb +5 -0
  76. data/app/models/admin.rb +9 -0
  77. data/app/models/ckeditor/asset.rb +7 -0
  78. data/app/models/ckeditor/attachment_file.rb +7 -0
  79. data/app/models/ckeditor/picture.rb +7 -0
  80. data/app/models/comment.rb +39 -0
  81. data/app/models/concerns/cacheable.rb +37 -0
  82. data/app/models/concerns/commentable.rb +9 -0
  83. data/app/models/concerns/content_type.rb +13 -0
  84. data/app/models/concerns/deletable.rb +13 -0
  85. data/app/models/concerns/draggable.rb +13 -0
  86. data/app/models/concerns/emailable.rb +7 -0
  87. data/app/models/concerns/flexible_content.rb +9 -0
  88. data/app/models/concerns/locale.rb +10 -0
  89. data/app/models/concerns/loggable.rb +13 -0
  90. data/app/models/concerns/notable.rb +9 -0
  91. data/app/models/concerns/parentable.rb +39 -0
  92. data/app/models/concerns/person.rb +7 -0
  93. data/app/models/concerns/publishable.rb +22 -0
  94. data/app/models/concerns/seo.rb +31 -0
  95. data/app/models/concerns/sortable.rb +30 -0
  96. data/app/models/concerns/spammable.rb +38 -0
  97. data/app/models/concerns/storable/collection.rb +117 -0
  98. data/app/models/concerns/storable/config.rb +40 -0
  99. data/app/models/concerns/storable.rb +32 -0
  100. data/app/models/concerns/taggable.rb +29 -0
  101. data/app/models/concerns/translatable/collection.rb +60 -0
  102. data/app/models/concerns/translatable/config.rb +19 -0
  103. data/app/models/concerns/translatable.rb +39 -0
  104. data/app/models/concerns/visible.rb +24 -0
  105. data/app/models/content_column.rb +14 -0
  106. data/app/models/content_image.rb +9 -0
  107. data/app/models/content_row.rb +11 -0
  108. data/app/models/content_text.rb +7 -0
  109. data/app/models/email.rb +13 -0
  110. data/app/models/email_template.rb +10 -0
  111. data/app/models/form.rb +9 -0
  112. data/app/models/form_field.rb +15 -0
  113. data/app/models/form_field_validation.rb +11 -0
  114. data/app/models/form_submission.rb +16 -0
  115. data/app/models/form_submission_data.rb +5 -0
  116. data/app/models/log.rb +7 -0
  117. data/app/models/meta.rb +11 -0
  118. data/app/models/navigation.rb +6 -0
  119. data/app/models/navigation_item.rb +12 -0
  120. data/app/models/note.rb +7 -0
  121. data/app/models/page.rb +23 -0
  122. data/app/models/queued_task.rb +45 -0
  123. data/app/models/redirect.rb +16 -0
  124. data/app/models/setting.rb +13 -0
  125. data/app/models/snippet.rb +10 -0
  126. data/app/models/store.rb +10 -0
  127. data/app/models/tag.rb +6 -0
  128. data/app/models/tagged_item.rb +8 -0
  129. data/app/models/translation.rb +10 -0
  130. data/app/uploaders/ckeditor_attachment_file_uploader.rb +36 -0
  131. data/app/uploaders/ckeditor_picture_uploader.rb +47 -0
  132. data/app/uploaders/content_image_uploader.rb +52 -0
  133. data/app/validators/email_validator.rb +7 -0
  134. data/app/validators/url_validator.rb +13 -0
  135. data/app/views/backend/_breadcrumbs.html.erb +18 -0
  136. data/app/views/backend/_flash_messages.html.erb +9 -0
  137. data/app/views/backend/_form_actions.html.erb +4 -0
  138. data/app/views/backend/_form_errors.html.erb +15 -0
  139. data/app/views/backend/_navigation.html.erb +8 -0
  140. data/app/views/backend/_seo_form.html.erb +13 -0
  141. data/app/views/backend/_tags.html.erb +18 -0
  142. data/app/views/backend/admins/_form.html.erb +32 -0
  143. data/app/views/backend/admins/edit.html.erb +4 -0
  144. data/app/views/backend/admins/index.html.erb +33 -0
  145. data/app/views/backend/admins/new.html.erb +4 -0
  146. data/app/views/backend/content/_image.html.erb +17 -0
  147. data/app/views/backend/content/_rows.html.erb +63 -0
  148. data/app/views/backend/content/_text.html.erb +1 -0
  149. data/app/views/backend/content/rows/columns/edit.html.erb +25 -0
  150. data/app/views/backend/content/rows/columns/new.html.erb +25 -0
  151. data/app/views/backend/content/rows/images/edit.html.erb +22 -0
  152. data/app/views/backend/content/rows/texts/edit.html.erb +13 -0
  153. data/app/views/backend/dashboard/show.html.erb +1 -0
  154. data/app/views/backend/email_templates/_form.html.erb +31 -0
  155. data/app/views/backend/email_templates/_tabs.html.erb +21 -0
  156. data/app/views/backend/email_templates/edit.html.erb +6 -0
  157. data/app/views/backend/email_templates/edit_translation.html.erb +51 -0
  158. data/app/views/backend/email_templates/index.html.erb +27 -0
  159. data/app/views/backend/email_templates/new.html.erb +4 -0
  160. data/app/views/backend/emails/index.html.erb +50 -0
  161. data/app/views/backend/emails/show.html.erb +68 -0
  162. data/app/views/backend/navigation/items/_form.html.erb +22 -0
  163. data/app/views/backend/navigation/items/_tabs.html.erb +21 -0
  164. data/app/views/backend/navigation/items/edit.html.erb +7 -0
  165. data/app/views/backend/navigation/items/edit_translation.html.erb +21 -0
  166. data/app/views/backend/navigation/items/new.html.erb +4 -0
  167. data/app/views/backend/navigations/index.html.erb +59 -0
  168. data/app/views/backend/pages/_form.html.erb +30 -0
  169. data/app/views/backend/pages/_tabs.html.erb +21 -0
  170. data/app/views/backend/pages/edit.html.erb +6 -0
  171. data/app/views/backend/pages/edit_translation.html.erb +35 -0
  172. data/app/views/backend/pages/index.html.erb +19 -0
  173. data/app/views/backend/pages/new.html.erb +4 -0
  174. data/app/views/backend/redirects/_filter.html.erb +21 -0
  175. data/app/views/backend/redirects/_form.html.erb +36 -0
  176. data/app/views/backend/redirects/edit.html.erb +4 -0
  177. data/app/views/backend/redirects/index.html.erb +50 -0
  178. data/app/views/backend/redirects/new.html.erb +3 -0
  179. data/app/views/backend/sessions/new.html.erb +19 -0
  180. data/app/views/backend/snippets/_form.html.erb +18 -0
  181. data/app/views/backend/snippets/_tabs.html.erb +21 -0
  182. data/app/views/backend/snippets/edit.html.erb +6 -0
  183. data/app/views/backend/snippets/edit_translation.html.erb +23 -0
  184. data/app/views/backend/snippets/index.html.erb +26 -0
  185. data/app/views/backend/snippets/new.html.erb +4 -0
  186. data/app/views/layouts/backend/_top_navigation.html.erb +27 -0
  187. data/app/views/layouts/backend/application.html.erb +27 -0
  188. data/app/views/layouts/backend/lightbox.html.erb +21 -0
  189. data/app/views/layouts/backend/login.html.erb +21 -0
  190. data/app/views/layouts/frontend/application.html.erb +16 -0
  191. data/config/initializers/assets.rb +13 -0
  192. data/config/initializers/ckeditor.rb +38 -0
  193. data/config/initializers/core_ext/string.rb +8 -0
  194. data/config/initializers/inflections.rb +20 -0
  195. data/config/initializers/simple_form_bootstrap.rb +150 -0
  196. data/config/locales/de.yml +196 -0
  197. data/config/locales/en.yml +206 -0
  198. data/config/locales/fr.yml +214 -0
  199. data/config/locales/nl.yml +212 -0
  200. data/config/locales/nl_backend.yml +106 -0
  201. data/config/locales/nl_forms.yml +68 -0
  202. data/config/routes.rb +83 -0
  203. data/config/spring.rb +1 -0
  204. data/db/migrate/20150404133314_create_udongo_admins.rb +12 -0
  205. data/db/migrate/20150404203549_remove_udongo_admins.rb +5 -0
  206. data/db/migrate/20150404203648_add_admins_table.rb +12 -0
  207. data/db/migrate/20150405202002_create_logs.rb +15 -0
  208. data/db/migrate/20150411152042_create_addresses.rb +19 -0
  209. data/db/migrate/20150411152619_create_comments.rb +21 -0
  210. data/db/migrate/20150411200227_create_notes.rb +14 -0
  211. data/db/migrate/20150412094419_create_settings.rb +13 -0
  212. data/db/migrate/20150412095257_create_meta.rb +21 -0
  213. data/db/migrate/20150413190019_create_tags.rb +15 -0
  214. data/db/migrate/20150413190713_create_tagged_items.rb +14 -0
  215. data/db/migrate/20150417113400_create_translations.rb +15 -0
  216. data/db/migrate/20150515113332_content_tables.rb +42 -0
  217. data/db/migrate/20150515134044_create_pages.rb +22 -0
  218. data/db/migrate/20150620121834_remove_trashed_from_page.rb +5 -0
  219. data/db/migrate/20150629120253_add_locales_to_translatables.rb +5 -0
  220. data/db/migrate/20150706083925_create_snippets.rb +13 -0
  221. data/db/migrate/20150706084145_add_locales_to_snippet.rb +5 -0
  222. data/db/migrate/20150706085213_add_description_to_snippet.rb +5 -0
  223. data/db/migrate/20150706085733_change_snippet_desc_field.rb +5 -0
  224. data/db/migrate/20150706093016_change_desc_column_for_snippet.rb +5 -0
  225. data/db/migrate/20150706113918_create_ckeditor_assets.rb +26 -0
  226. data/db/migrate/20150824090457_create_redirects.rb +12 -0
  227. data/db/migrate/20150824113723_rename_source_and_destination_to_redirects.rb +6 -0
  228. data/db/migrate/20150825094254_create_shortened_urls.rb +11 -0
  229. data/db/migrate/20150826084004_remove_shortened_urls.rb +5 -0
  230. data/db/migrate/20150826084234_add_times_used_to_redirect.rb +5 -0
  231. data/db/migrate/20150826134153_add_index_on_page_visible.rb +5 -0
  232. data/db/migrate/20151003191846_add_some_indexes.rb +15 -0
  233. data/db/migrate/20151006131720_add_editable_content_to_page.rb +5 -0
  234. data/db/migrate/20151007090541_create_navigations.rb +10 -0
  235. data/db/migrate/20151007091131_create_navigation_items.rb +12 -0
  236. data/db/migrate/20151007092529_add_index_to_nav_items.rb +5 -0
  237. data/db/migrate/20151007093812_change_nav_description_type.rb +5 -0
  238. data/db/migrate/20151007173557_add_route_to_page.rb +5 -0
  239. data/db/migrate/20151008114433_add_extra_to_navigation_item.rb +5 -0
  240. data/db/migrate/20151009114823_create_forms.rb +9 -0
  241. data/db/migrate/20151009115326_create_form_fields.rb +12 -0
  242. data/db/migrate/20151009115803_create_form_field_validations.rb +11 -0
  243. data/db/migrate/20151009131957_create_form_submissions.rb +10 -0
  244. data/db/migrate/20151009132657_create_form_submission_data.rb +11 -0
  245. data/db/migrate/20151009140754_rename_form_field_id_to_field_id_for_form_field_validations.rb +5 -0
  246. data/db/migrate/20151009141123_rename_form_submission_id_to_submission_id_for_form_submission_data.rb +5 -0
  247. data/db/migrate/20151009141822_add_locales_to_form_fields.rb +5 -0
  248. data/db/migrate/20151009142242_add_locales_to_form_field_validations.rb +5 -0
  249. data/db/migrate/20151023135358_add_locales_to_forms.rb +5 -0
  250. data/db/migrate/20151117190950_add_external_reference_to_tags.rb +6 -0
  251. data/db/migrate/20151205202815_rename_nav_name_to_identifier.rb +5 -0
  252. data/db/migrate/20160108100104_create_stores.rb +13 -0
  253. data/db/migrate/20160125154648_rename_name_to_identifier_for_forms.rb +5 -0
  254. data/db/migrate/20160128080029_create_email_templates.rb +18 -0
  255. data/db/migrate/20160201121021_create_emails.rb +17 -0
  256. data/db/migrate/20160201123128_create_queued_tasks.rb +13 -0
  257. data/db/migrate/20160205132009_reoraganize_snippet_html_fields.rb +7 -0
  258. data/db/migrate/20160303141417_add_data_to_logs.rb +5 -0
  259. data/db/migrate/20160513110925_addd_more_column_widths.rb +9 -0
  260. data/lib/generators/udongo/form/form_generator.rb +63 -0
  261. data/lib/generators/udongo/form/templates/form.rb +18 -0
  262. data/lib/tasks/task_extras.rb +10 -0
  263. data/lib/tasks/udongo_tasks.rake +41 -0
  264. data/lib/udongo/active_model_simulator.rb +21 -0
  265. data/lib/udongo/assets/loader.rb +40 -0
  266. data/lib/udongo/assets/precompiler.rb +50 -0
  267. data/lib/udongo/breadcrumb.rb +27 -0
  268. data/lib/udongo/config.rb +26 -0
  269. data/lib/udongo/crypt.rb +19 -0
  270. data/lib/udongo/cryptography.rb +5 -0
  271. data/lib/udongo/email_vars/address.rb +19 -0
  272. data/lib/udongo/email_vars/form_submission.rb +18 -0
  273. data/lib/udongo/email_vars_parser.rb +31 -0
  274. data/lib/udongo/engine.rb +10 -0
  275. data/lib/udongo/meta_info.rb +12 -0
  276. data/lib/udongo/object_path.rb +24 -0
  277. data/lib/udongo/version.rb +3 -0
  278. data/lib/udongo/will_paginate/renderer.rb +26 -0
  279. data/lib/udongo.rb +44 -0
  280. metadata +772 -0
@@ -0,0 +1,11 @@
1
+ #content-rows {
2
+ margin-bottom: 35px;
3
+ }
4
+
5
+ .lightbox {
6
+ margin-top: 35px;
7
+ }
8
+
9
+ .img-fluid {
10
+ margin-bottom: 1rem;
11
+ }
@@ -0,0 +1,3 @@
1
+ body.logged-in {
2
+ padding-top: 15px;
3
+ }
@@ -0,0 +1,3 @@
1
+ body.login-page {
2
+ padding-top: 25px;
3
+ }
@@ -0,0 +1,17 @@
1
+ @charset "utf-8";
2
+
3
+ // Base
4
+ // fonts
5
+ @import 'font-awesome';
6
+
7
+ // Components
8
+ @import 'components/navbar';
9
+ @import 'components/tabs';
10
+ @import 'components/breadcrumb';
11
+ @import 'components/form';
12
+ @import 'components/nav';
13
+
14
+ // Page specific styles
15
+ @import 'pages/login';
16
+ @import 'pages/logged_in';
17
+ @import 'pages/flexible_content';
@@ -0,0 +1,56 @@
1
+ class Backend::AdminsController < BackendController
2
+ before_action :find_admin, only: [:show, :edit, :update, :destroy]
3
+ before_action -> { breadcrumb.add t('b.admins'), backend_admins_path }
4
+
5
+ def index
6
+ @admins = ::Admin.all
7
+ end
8
+
9
+ def show
10
+ redirect_to edit_backend_admin_path(@admin)
11
+ end
12
+
13
+ def new
14
+ @admin = ::Admin.new
15
+ end
16
+
17
+ def create
18
+ @admin = ::Admin.new allowed_params
19
+
20
+ if @admin.save
21
+ redirect_to backend_admins_path, notice: t('b.msg.admins.added')
22
+ else
23
+ render :new
24
+ end
25
+ end
26
+
27
+ def update
28
+ if @admin.update_attributes allowed_params
29
+ redirect_to backend_admins_path, notice: t('b.msg.changes_saved')
30
+ else
31
+ render :edit
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ @admin.destroy
37
+ redirect_to backend_admins_path, notice: t('b.msg.admins.deleted')
38
+ end
39
+
40
+ private
41
+
42
+ def find_admin
43
+ @admin = ::Admin.find params[:id]
44
+ end
45
+
46
+ def allowed_params
47
+ params[:admin].permit(
48
+ :first_name, :last_name, :email, :password, :password_confirmation
49
+ )
50
+ end
51
+
52
+ def password_required?
53
+ @admin.new_record?
54
+ end
55
+ helper_method :password_required?
56
+ end
@@ -0,0 +1,75 @@
1
+ class Backend::Content::Rows::ColumnsController < BackendController
2
+ before_action :find_row
3
+ before_action :find_column, only: [:edit, :update, :move_up, :move_down, :destroy]
4
+ layout 'backend/lightbox'
5
+
6
+ def new
7
+ @column = @row.columns.new
8
+ cancel_url
9
+ end
10
+
11
+ def create
12
+ @column = @row.columns.new allowed_params
13
+
14
+ if @column.save
15
+ @column.content = @column.content_type.constantize.create!
16
+ @column.save!
17
+
18
+ redirect_to_edit @column
19
+ else
20
+ render :new
21
+ end
22
+ end
23
+
24
+ def update
25
+ if @column.update_attributes allowed_params
26
+ redirect_to cancel_url
27
+ else
28
+ render :edit
29
+ end
30
+ end
31
+
32
+ def move_up
33
+ @column.move_higher
34
+ redirect_to cancel_url
35
+ end
36
+
37
+ def move_down
38
+ @column.move_lower
39
+ redirect_to cancel_url
40
+ end
41
+
42
+ def destroy
43
+ @column.destroy
44
+
45
+ path = "edit_translation_backend_#{@column.row.rowable.class.to_s.downcase}_path"
46
+ redirect_to send(path, @column.row.rowable, @column.row.locale, anchor: "content-row-#{@column.row.id}")
47
+ end
48
+
49
+ private
50
+
51
+ def find_row
52
+ @row = ::ContentRow.find params[:row_id]
53
+ end
54
+
55
+ def find_column
56
+ @column = ::ContentColumn.find params[:id]
57
+ end
58
+
59
+ def allowed_params
60
+ params.require(:content_column).permit(
61
+ :width_xs, :width_sm, :width_md, :width_lg, :width_xl, :content_type
62
+ )
63
+ end
64
+
65
+ def redirect_to_edit(column)
66
+ redirect_to send("edit_backend_content_#{column.content.decorate.content_type}_path", column.content)
67
+ end
68
+
69
+ def cancel_url
70
+ instance = @row.rowable
71
+ path = "edit_translation_backend_#{instance.class.to_s.downcase}_path"
72
+ send(path, instance, @row.locale, anchor: "content-row-#{@row.id}")
73
+ end
74
+ helper_method :cancel_url
75
+ end
@@ -0,0 +1,6 @@
1
+ class Backend::Content::Rows::ImagesController < BackendController
2
+ include Concerns::Backend::ContentTypeController
3
+
4
+ model ::ContentImage
5
+ allowed_params :file, :caption, :url
6
+ end
@@ -0,0 +1,6 @@
1
+ class Backend::Content::Rows::TextsController < BackendController
2
+ include Concerns::Backend::ContentTypeController
3
+
4
+ model ::ContentText
5
+ allowed_params :content
6
+ end
@@ -0,0 +1,45 @@
1
+ class Backend::Content::RowsController < BackendController
2
+ before_action :find_row, only: [:move_up, :move_down, :destroy]
3
+
4
+ def new
5
+ if params[:klass] && params[:id] && params[:locale]
6
+ instance = params[:klass].constantize.find params[:id]
7
+ row = instance.content_rows.create!(locale: params[:locale])
8
+
9
+ redirect_to content_path(instance, params[:locale], "content-row-#{row.id}")
10
+ else
11
+ render text: 'Insufficient params. Please provide klass, id and locale.'
12
+ end
13
+ end
14
+
15
+ def move_up
16
+ @row.move_higher
17
+ redirect_back_to_content
18
+ end
19
+
20
+ def move_down
21
+ @row.move_lower
22
+ redirect_back_to_content
23
+ end
24
+
25
+ def destroy
26
+ @row.destroy
27
+ redirect_back_to_content('content-rows')
28
+ end
29
+
30
+ private
31
+
32
+ def find_row
33
+ @row = ::ContentRow.find params[:id]
34
+ end
35
+
36
+ def content_path(instance, locale, anchor)
37
+ path = "edit_translation_backend_#{instance.class.to_s.downcase}_path"
38
+ send(path, instance, locale, anchor: anchor)
39
+ end
40
+
41
+ def redirect_back_to_content(anchor = nil)
42
+ anchor = "content-row-#{@row.id}" unless anchor.present?
43
+ redirect_to content_path(@row.rowable, @row.locale, anchor)
44
+ end
45
+ end
@@ -0,0 +1,2 @@
1
+ class Backend::DashboardController < BackendController
2
+ end
@@ -0,0 +1,50 @@
1
+ class Backend::EmailTemplatesController < BackendController
2
+ include Concerns::Backend::TranslatableController
3
+ include Concerns::Backend::PositionableController
4
+
5
+ before_action :find_model, only: [:edit, :update]
6
+ before_action -> { breadcrumb.add t('b.email_templates'), backend_email_templates_path }
7
+
8
+ def index
9
+ @email_templates = ::EmailTemplate.all
10
+ end
11
+
12
+ def new
13
+ @model = ::EmailTemplate.new
14
+ end
15
+
16
+ def create
17
+ @model = ::EmailTemplate.new allowed_params
18
+
19
+ if @model.save
20
+ redirect_to edit_translation_backend_email_template_path(@model, translation_locale: default_locale), notice: translate_notice(:added, :email_template)
21
+ else
22
+ render :new
23
+ end
24
+ end
25
+
26
+ def update
27
+ if @model.update_attributes(allowed_params)
28
+ redirect_to edit_backend_email_template_path(@model), notice: translate_notice(:edited, :email_template)
29
+ else
30
+ render :edit
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def find_model
37
+ @model = ::EmailTemplate.find params[:id]
38
+ end
39
+
40
+ def translation_form
41
+ Backend::EmailTemplateTranslationForm.new(
42
+ email_template: @model,
43
+ translation: @model.translation(params[:translation_locale])
44
+ )
45
+ end
46
+
47
+ def allowed_params
48
+ params.require('email_template').permit(:identifier, :description, :from_name, :from_email)
49
+ end
50
+ end
@@ -0,0 +1,18 @@
1
+ class Backend::EmailsController < BackendController
2
+ include Concerns::PaginationController
3
+
4
+ before_action -> { breadcrumb.add t('b.emails'), backend_emails_path }
5
+
6
+ def index
7
+ @emails = paginate ::Email.all.order('id DESC')
8
+ end
9
+
10
+ def show
11
+ @email = ::Email.find params[:id]
12
+ end
13
+
14
+ def html_content
15
+ @email = ::Email.find params[:id]
16
+ render text: @email.html_content
17
+ end
18
+ end
@@ -0,0 +1,64 @@
1
+ class Backend::Navigation::ItemsController < BackendController
2
+ include Concerns::Backend::TranslatableController
3
+ include Concerns::Backend::PositionableController
4
+
5
+ before_action :find_navigation
6
+ before_action :find_model, only: [:edit, :update, :destroy]
7
+ before_action { breadcrumb.add t('b.navigation'), backend_navigations_path }
8
+
9
+ def new
10
+ @model = @navigation.items.new.decorate
11
+ end
12
+
13
+ def create
14
+ @model = @navigation.items.new(allowed_params).decorate
15
+
16
+ if @model.save
17
+ redirect_to backend_navigations_path, notice: t('b.msg.navigation.added')
18
+ else
19
+ render :new
20
+ end
21
+ end
22
+
23
+ def update
24
+ if @model.update_attributes allowed_params
25
+ redirect_to backend_navigations_path, notice: t('b.msg.changes_saved')
26
+ else
27
+ render :edit
28
+ end
29
+ end
30
+
31
+ def destroy
32
+ @model.destroy
33
+ redirect_to backend_navigations_path, notice: t('b.msg.navigation.deleted')
34
+ end
35
+
36
+ private
37
+
38
+ def find_navigation
39
+ @navigation = ::Navigation.find params[:navigation_id]
40
+ end
41
+
42
+ def find_model
43
+ @model = ::NavigationItem.find(params[:id]).decorate
44
+ end
45
+
46
+ def allowed_params
47
+ params[:navigation_item].permit(:page_id, :extra)
48
+ end
49
+
50
+ def translation_form
51
+ Backend::NavigationItemTranslationForm.new(
52
+ navigation_item: @model,
53
+ translation: @model.translation(params[:translation_locale])
54
+ )
55
+ end
56
+
57
+ def translatable_path
58
+ edit_translation_backend_navigation_item_path(
59
+ @navigation,
60
+ @model,
61
+ params[:translation_locale]
62
+ )
63
+ end
64
+ end
@@ -0,0 +1,7 @@
1
+ class Backend::NavigationsController < BackendController
2
+ before_action -> { breadcrumb.add t('b.navigation'), backend_navigations_path }
3
+
4
+ def index
5
+ @navigations = ::Navigation.all
6
+ end
7
+ end
@@ -0,0 +1,89 @@
1
+ class Backend::PagesController < BackendController
2
+ include Concerns::Backend::TranslatableController
3
+
4
+ before_action :find_model, only: [:edit, :update, :tree_drag_and_drop, :destroy]
5
+ before_action -> { breadcrumb.add t('b.pages'), backend_pages_path }
6
+
7
+ def index
8
+ @pages = ::Page.all
9
+
10
+ respond_to do |format|
11
+ format.html
12
+ format.json {
13
+ render json: page_tree_data.to_json
14
+ }
15
+ end
16
+ end
17
+
18
+ def new
19
+ @model = ::Page.new.decorate
20
+ end
21
+
22
+ def create
23
+ @model = ::Page.new(params.require('page').permit(:description, :visible, :parent_id)).decorate
24
+
25
+ if @model.save
26
+ redirect_to edit_backend_page_path(@model), notice: translate_notice(:added, :page)
27
+ else
28
+ render :new
29
+ end
30
+ end
31
+
32
+ def update
33
+ if @model.update_attributes(params.require('page').permit(:description, :visible, :parent_id))
34
+ redirect_to edit_backend_page_path(@model), notice: translate_notice(:edited, :page)
35
+ else
36
+ render :edit
37
+ end
38
+ end
39
+
40
+ def tree_drag_and_drop
41
+ render json: { moved: @model.set_position(params[:position], params[:parent_id]) }
42
+ end
43
+
44
+ def edit_translation
45
+ end
46
+
47
+ def destroy
48
+ render json: { trashed: @model.destroy }
49
+ end
50
+
51
+ def page_tree_data(parent_id: nil)
52
+ ::Page.where(parent_id: parent_id).inject([]) do |data, p|
53
+ hash = node_data p
54
+ hash[:children] = page_tree_data(parent_id: p.id) if p.children.any?
55
+ data << hash
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def find_model
62
+ @model = ::Page.find(params[:id]).decorate
63
+ end
64
+
65
+ def translation_form
66
+ Backend::PageTranslationForm.new(
67
+ page: @model,
68
+ translation: @model.translation(params[:translation_locale]),
69
+ seo: @model.seo(params[:translation_locale])
70
+ )
71
+ end
72
+
73
+ def node_data(page)
74
+ {
75
+ text: page.description,
76
+ type: :file,
77
+ state: { selected: false },
78
+ data: {
79
+ id: page.id,
80
+ url: edit_backend_page_path(page),
81
+ delete_url: backend_page_path(page, format: :json),
82
+ deletable: page.deletable?,
83
+ draggable: page.draggable?,
84
+ update_position_url: tree_drag_and_drop_backend_page_path(page)
85
+ },
86
+ children: []
87
+ }
88
+ end
89
+ end
@@ -0,0 +1,50 @@
1
+ class Backend::RedirectsController < BackendController
2
+ include Concerns::PaginationController
3
+
4
+ before_action -> { breadcrumb.add t('b.redirects'), backend_redirects_path }
5
+ before_action :find_model, only: [:edit, :update, :destroy]
6
+
7
+ def index
8
+ @search = ::Redirect.ransack params[:q]
9
+ @redirects = @search.result(distinct: true).order('times_used DESC').page(page_number).per_page(per_page)
10
+ end
11
+
12
+ def new
13
+ @redirect = ::Redirect.new(status_code: 301).decorate
14
+ end
15
+
16
+ def create
17
+ @redirect = ::Redirect.new(allowed_params).decorate
18
+
19
+ if @redirect.save
20
+ redirect_to backend_redirects_path, notice: translate_notice(:added, :redirect)
21
+ else
22
+ render :new
23
+ end
24
+ end
25
+
26
+ def destroy
27
+ @redirect.destroy
28
+ redirect_to backend_redirects_path, notice: translate_notice(:deleted, :redirect)
29
+ end
30
+
31
+ def update
32
+ if @redirect.update_attributes allowed_params
33
+ redirect_to backend_redirects_path, notice: translate_notice(:edited, :redirect)
34
+ else
35
+ render :edit
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def allowed_params
42
+ params.require(:redirect).permit(
43
+ :source_uri, :destination_uri, :status_code, :disabled
44
+ )
45
+ end
46
+
47
+ def find_model
48
+ @redirect = ::Redirect.find(params[:id]).decorate
49
+ end
50
+ end
@@ -0,0 +1,6 @@
1
+ class Backend::SeoController < BackendController
2
+ def slugify
3
+ result = params[:value] ? params[:value].parameterize : nil
4
+ render json: { result: result }
5
+ end
6
+ end
@@ -0,0 +1,22 @@
1
+ class Backend::SessionsController < BackendController
2
+ skip_before_action :check_login
3
+ layout 'backend/login'
4
+
5
+ def create
6
+ admin = ::Admin.find_by(email: params[:session][:email])
7
+
8
+ if admin && admin.authenticate(params[:session][:password])
9
+ session[:admin_id] = admin.id
10
+
11
+ redirect_to session[:backend_redirect] ? session[:backend_redirect] : backend_path
12
+ else
13
+ flash.now.alert = t 'b.msg.incorrect_login'
14
+ render :new
15
+ end
16
+ end
17
+
18
+ def destroy
19
+ session[:admin_id] = nil
20
+ redirect_to new_backend_session_path
21
+ end
22
+ end
@@ -0,0 +1,49 @@
1
+ class Backend::SnippetsController < BackendController
2
+ include Concerns::Backend::TranslatableController
3
+
4
+ before_action :find_model, only: [:edit, :update]
5
+ before_action -> { breadcrumb.add t('b.snippets'), backend_snippets_path }
6
+
7
+ def index
8
+ @snippets = ::Snippet.order(:description)
9
+ end
10
+
11
+ def new
12
+ @model = ::Snippet.new
13
+ end
14
+
15
+ def create
16
+ @model = ::Snippet.new allowed_params
17
+
18
+ if @model.save
19
+ redirect_to edit_translation_backend_snippet_path(@model, translation_locale: default_locale), notice: translate_notice(:added, :snippet)
20
+ else
21
+ render :new
22
+ end
23
+ end
24
+
25
+ def update
26
+ if @model.update_attributes(allowed_params)
27
+ redirect_to edit_backend_snippet_path(@model), notice: translate_notice(:edited, :snippet)
28
+ else
29
+ render :edit
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def find_model
36
+ @model = ::Snippet.find params[:id]
37
+ end
38
+
39
+ def translation_form
40
+ Backend::SnippetTranslationForm.new(
41
+ snippet: @model,
42
+ translation: @model.translation(params[:translation_locale])
43
+ )
44
+ end
45
+
46
+ def allowed_params
47
+ params.require('snippet').permit(:identifier, :description)
48
+ end
49
+ end
@@ -0,0 +1,52 @@
1
+ class Backend::TagboxController < BackendController
2
+ def index
3
+ tags = ::Tag.by_locale(locale).pluck(:name).map do |name|
4
+ { label: name, value: name }
5
+ end
6
+
7
+ render json: tags
8
+ end
9
+
10
+ def create
11
+ create_tag if tag_creatable?
12
+ render json: { tag: params[:tag], valid: item_tagged?(find_tag) }
13
+ end
14
+
15
+ def destroy
16
+ tag = find_tag
17
+ find_model.tagged_items.where(tag_id: tag.id).destroy_all if tag.present?
18
+ render json: { success: true }
19
+ end
20
+
21
+ private
22
+
23
+ def find_model
24
+ @model ||= params[:taggable_type].to_s.constantize.find params[:taggable_id]
25
+ end
26
+
27
+ def find_tag
28
+ ::Tag.find_by locale: params[:locale], name: params[:tag]
29
+ end
30
+
31
+ def tag_creatable?
32
+ !::Tag.exists?(tag_params) && Udongo.config.allow_new_tags?
33
+ end
34
+
35
+ def create_tag
36
+ ::Tag.create! tag_params
37
+ end
38
+
39
+ def tag_params
40
+ {
41
+ locale: params[:locale],
42
+ name: params[:tag],
43
+ slug: params[:tag].parameterize
44
+ }
45
+ end
46
+
47
+ def item_tagged?(tag)
48
+ return false unless tag
49
+ find_model.tagged_items.create tag: tag
50
+ true
51
+ end
52
+ end
@@ -0,0 +1,6 @@
1
+ class Backend::WebserverController < BackendController
2
+ def restart
3
+ `touch tmp/restart.txt`
4
+ redirect_to backend_path, notice: t('b.msg.webserver.restarted')
5
+ end
6
+ end
@@ -0,0 +1,34 @@
1
+ class BackendController < ActionController::Base
2
+ include Udongo::Cryptography
3
+
4
+ layout 'backend/application'
5
+ before_action :check_login
6
+
7
+ def breadcrumb
8
+ @breadcrumb ||= Udongo::Breadcrumb.new
9
+ end
10
+ helper_method :breadcrumb
11
+
12
+ def current_admin
13
+ @current_admin ||= ::Admin.find(session[:admin_id]) if session[:admin_id]
14
+ end
15
+ helper_method :current_admin
16
+
17
+ def translate_notice(notice, actor)
18
+ I18n.t("b.msg.#{notice}") % I18n.t("b.#{actor}")
19
+ end
20
+
21
+ def default_locale
22
+ Udongo.config.default_locale
23
+ end
24
+ helper_method :default_locale
25
+
26
+ private
27
+
28
+ def check_login
29
+ unless current_admin
30
+ session[:backend_redirect] = request.url
31
+ redirect_to new_backend_session_path
32
+ end
33
+ end
34
+ end