udongo 2.0.4 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/backend/application.js +1 -0
  3. data/app/assets/javascripts/backend/bootstrap.js +3 -3569
  4. data/app/assets/javascripts/backend/tree.js +106 -65
  5. data/app/assets/stylesheets/backend/application.scss +2 -0
  6. data/app/assets/stylesheets/backend/bootstrap.scss +29 -51
  7. data/app/assets/stylesheets/backend/components/_page_tree.scss +9 -0
  8. data/app/assets/stylesheets/backend/custom.scss +0 -0
  9. data/app/assets/stylesheets/backend/font-awesome.scss +644 -1977
  10. data/app/assets/stylesheets/backend/udongo.scss +1 -0
  11. data/app/controllers/backend/admins_controller.rb +2 -2
  12. data/app/controllers/{backend_controller.rb → backend/base_controller.rb} +13 -5
  13. data/app/controllers/backend/content/rows/columns_controller.rb +1 -1
  14. data/app/controllers/backend/content/rows/images_controller.rb +1 -1
  15. data/app/controllers/backend/content/rows/texts_controller.rb +1 -1
  16. data/app/controllers/backend/content/rows_controller.rb +1 -1
  17. data/app/controllers/backend/dashboard_controller.rb +1 -1
  18. data/app/controllers/backend/email_templates_controller.rb +12 -12
  19. data/app/controllers/backend/emails_controller.rb +1 -1
  20. data/app/controllers/backend/navigation/items_controller.rb +9 -11
  21. data/app/controllers/backend/navigations_controller.rb +1 -1
  22. data/app/controllers/backend/pages_controller.rb +17 -39
  23. data/app/controllers/backend/redirects_controller.rb +1 -1
  24. data/app/controllers/backend/seo_controller.rb +1 -1
  25. data/app/controllers/backend/sessions_controller.rb +1 -1
  26. data/app/controllers/backend/snippets_controller.rb +14 -13
  27. data/app/controllers/backend/tagbox_controller.rb +1 -1
  28. data/app/controllers/catch_all_controller.rb +1 -1
  29. data/app/controllers/concerns/backend/content_type_controller.rb +3 -1
  30. data/app/controllers/redirects_controller.rb +1 -1
  31. data/app/decorators/page_decorator.rb +1 -4
  32. data/app/forms/backend/email_template_translation_form.rb +1 -23
  33. data/app/forms/backend/navigation_item_translation_form.rb +1 -23
  34. data/app/forms/backend/page_translation_form.rb +13 -18
  35. data/app/forms/backend/snippet_translation_form.rb +1 -23
  36. data/app/forms/backend/translation_form.rb +22 -0
  37. data/app/helpers/udongo_helper.rb +0 -4
  38. data/app/mailers/general_mailer.rb +14 -4
  39. data/app/models/admin.rb +2 -2
  40. data/app/models/comment.rb +1 -2
  41. data/app/models/concerns/addressable.rb +40 -0
  42. data/app/models/concerns/addressable/config.rb +33 -0
  43. data/app/models/concerns/cacheable.rb +1 -1
  44. data/app/models/email.rb +2 -2
  45. data/app/models/email_template.rb +2 -1
  46. data/app/views/backend/_general_form_error.html.erb +6 -0
  47. data/app/views/backend/admins/_form.html.erb +3 -0
  48. data/app/views/backend/content/rows/columns/_dimension_fields.html.erb +3 -0
  49. data/app/views/backend/content/rows/columns/edit.html.erb +3 -5
  50. data/app/views/backend/content/rows/columns/new.html.erb +3 -5
  51. data/app/views/backend/content/rows/images/edit.html.erb +2 -0
  52. data/app/views/backend/dashboard/show.html.erb +1 -1
  53. data/app/views/backend/email_templates/_form.html.erb +29 -7
  54. data/app/views/backend/email_templates/_tabs.html.erb +1 -1
  55. data/app/views/backend/email_templates/edit_translation.html.erb +1 -0
  56. data/app/views/backend/navigation/items/_form.html.erb +4 -2
  57. data/app/views/backend/navigation/items/_tabs.html.erb +1 -1
  58. data/app/views/backend/navigation/items/edit_translation.html.erb +1 -0
  59. data/app/views/backend/pages/_form.html.erb +4 -2
  60. data/app/views/backend/pages/_tabs.html.erb +1 -1
  61. data/app/views/backend/pages/edit_translation.html.erb +1 -0
  62. data/app/views/backend/redirects/_form.html.erb +2 -0
  63. data/app/views/backend/snippets/_form.html.erb +3 -1
  64. data/app/views/backend/snippets/_tabs.html.erb +1 -1
  65. data/app/views/backend/snippets/edit.html.erb +1 -1
  66. data/app/views/backend/snippets/edit_translation.html.erb +1 -0
  67. data/app/views/backend/snippets/new.html.erb +1 -1
  68. data/app/views/layouts/backend/_top_navigation.html.erb +1 -2
  69. data/changelog.md +38 -0
  70. data/config/initializers/simple_form_bootstrap.rb +13 -9
  71. data/config/locales/en_backend.yml +1 -4
  72. data/config/locales/en_forms.yml +3 -0
  73. data/config/locales/nl_backend.yml +3 -4
  74. data/config/locales/nl_forms.yml +3 -0
  75. data/config/routes.rb +5 -7
  76. data/db/migrate/20160815100903_remove_form_models.rb +9 -0
  77. data/db/migrate/20161014135637_add_category_to_admin.rb +5 -0
  78. data/db/migrate/20161029124558_add_locale_to_admin.rb +6 -0
  79. data/db/migrate/20161029130557_add_bcc_and_cc_to_email_templates.rb +6 -0
  80. data/db/migrate/20161029171056_add_ccc_and_bcc_to_email.rb +6 -0
  81. data/lib/udongo/configs/flexible_content.rb +7 -0
  82. data/lib/udongo/configs/i18n.rb +5 -3
  83. data/lib/udongo/configs/i18ns/app.rb +12 -0
  84. data/lib/udongo/configs/i18ns/cms.rb +12 -0
  85. data/lib/udongo/flexible_content/column_width_calculator.rb +4 -2
  86. data/lib/udongo/pages/tree.rb +15 -0
  87. data/lib/udongo/pages/tree_node.rb +43 -0
  88. data/lib/udongo/version.rb +1 -1
  89. data/readme.md +103 -43
  90. data/vendor/assets/javascripts/backend/select2.min.js +3 -0
  91. data/vendor/assets/stylesheets/backend/jstree/default/style.scss +3 -3
  92. data/vendor/assets/stylesheets/backend/select2.min.scss +1 -0
  93. metadata +22 -30
  94. data/app/controllers/backend/forms/base_controller.rb +0 -14
  95. data/app/controllers/backend/forms/submissions_controller.rb +0 -8
  96. data/app/controllers/backend/forms_controller.rb +0 -7
  97. data/app/controllers/backend/webserver_controller.rb +0 -6
  98. data/app/decorators/form_decorator.rb +0 -16
  99. data/app/decorators/form_submission_decorator.rb +0 -3
  100. data/app/forms/backend/email_template_form.rb +0 -38
  101. data/app/forms/backend/navigation_item_form.rb +0 -23
  102. data/app/forms/backend/page_form.rb +0 -26
  103. data/app/forms/backend/snippet_form.rb +0 -35
  104. data/app/models/form.rb +0 -10
  105. data/app/models/form_field.rb +0 -15
  106. data/app/models/form_field_validation.rb +0 -11
  107. data/app/models/form_submission.rb +0 -15
  108. data/app/models/form_submission_data.rb +0 -5
  109. data/app/views/backend/_form_errors.html.erb +0 -15
  110. data/app/views/backend/forms/index.html.erb +0 -27
  111. data/app/views/backend/forms/submissions/_filter.html.erb +0 -16
  112. data/app/views/backend/forms/submissions/index.html.erb +0 -34
  113. data/lib/generators/udongo/form/form_generator.rb +0 -62
  114. data/lib/generators/udongo/form/templates/form.rb +0 -18
  115. data/lib/udongo/configs/forms.rb +0 -18
  116. data/lib/udongo/configs/routes.rb +0 -13
  117. data/lib/udongo/email_vars/form_submission.rb +0 -18
  118. data/lib/udongo/forms/submission_datagrid.rb +0 -27
  119. data/lib/udongo/forms/submission_filter.rb +0 -31
@@ -1,14 +0,0 @@
1
- class Backend::Forms::BaseController < BackendController
2
- before_action :find_form
3
-
4
- before_action -> do
5
- breadcrumb.add t('b.forms'), backend_forms_path
6
- breadcrumb.add @form.description
7
- end
8
-
9
- private
10
-
11
- def find_form
12
- @form ||= Form.find(params[:form_id].to_i).decorate
13
- end
14
- end
@@ -1,8 +0,0 @@
1
- class Backend::Forms::SubmissionsController < Backend::Forms::BaseController
2
- include Concerns::PaginationController
3
-
4
- def index
5
- @filter = Udongo::Forms::SubmissionFilter.search(@form, params[:q])
6
- @submissions = paginate(@filter.result).decorate
7
- end
8
- end
@@ -1,7 +0,0 @@
1
- class Backend::FormsController < BackendController
2
- before_action -> { breadcrumb.add t('b.forms'), backend_forms_path }
3
-
4
- def index
5
- @forms = Form.all
6
- end
7
- end
@@ -1,6 +0,0 @@
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
@@ -1,16 +0,0 @@
1
- class FormDecorator < ApplicationDecorator
2
- delegate_all
3
-
4
- def datagrid
5
- @datagrid ||= Udongo::Forms::SubmissionDatagrid.new(object)
6
- end
7
-
8
- def datagrid_fields_configured?
9
- Udongo.config.forms.send(identifier).datagrid_fields.any?
10
- end
11
-
12
- def email_present?
13
- return false if datagrid_fields_configured?
14
- data.select('DISTINCT name').map(&:name).include?('email')
15
- end
16
- end
@@ -1,3 +0,0 @@
1
- class FormSubmissionDecorator < ApplicationDecorator
2
- delegate_all
3
- end
@@ -1,38 +0,0 @@
1
- class Backend::EmailTemplateForm < Udongo::Form
2
- attr_reader :email_template
3
-
4
- attribute :identifier, String
5
- attribute :description, String
6
- attribute :from_name, String
7
- attribute :from_email, String
8
-
9
- validates :identifier, :description, :from_name, :from_email, presence: true
10
- validates :from_email, email: true
11
- validate :unique_identifier
12
-
13
- delegate :id, to: :email_template
14
-
15
- def self.model_name
16
- EmailTemplate.model_name
17
- end
18
-
19
- def persisted?
20
- !@email_template.new_record?
21
- end
22
-
23
- private
24
-
25
- def unique_identifier
26
- qry = EmailTemplate.unscoped
27
- qry = qry.where.not(identifier: @email_template.identifier) if persisted?
28
-
29
- if qry.exists?(identifier: identifier)
30
- errors.add :identifier, I18n.t('errors.messages.taken')
31
- end
32
- end
33
-
34
- def save_object
35
- init_object_values(@email_template)
36
- @email_template.save!
37
- end
38
- end
@@ -1,23 +0,0 @@
1
- class Backend::NavigationItemForm < Udongo::Form
2
- attr_reader :navigation_item
3
-
4
- attribute :page_id, Integer
5
- attribute :extra, String
6
-
7
- delegate :id, to: :navigation_item
8
-
9
- def self.model_name
10
- NavigationItem.model_name
11
- end
12
-
13
- def persisted?
14
- !@navigation_item.new_record?
15
- end
16
-
17
- private
18
-
19
- def save_object
20
- init_object_values(@navigation_item)
21
- @navigation_item.save!
22
- end
23
- end
@@ -1,26 +0,0 @@
1
- class Backend::PageForm < Udongo::Form
2
- attr_reader :page
3
-
4
- attribute :parent_id, Integer
5
- attribute :description, String
6
- attribute :visible, Axiom::Types::Boolean
7
-
8
- validates :description, presence: true
9
-
10
- delegate :id, to: :page
11
-
12
- def self.model_name
13
- Page.model_name
14
- end
15
-
16
- def persisted?
17
- !@page.new_record?
18
- end
19
-
20
- private
21
-
22
- def save_object
23
- init_object_values(@page)
24
- @page.save!
25
- end
26
- end
@@ -1,35 +0,0 @@
1
- class Backend::SnippetForm < Udongo::Form
2
- attr_reader :snippet
3
-
4
- attribute :identifier, String
5
- attribute :description, String
6
-
7
- validates :identifier, :description, presence: true
8
- validate :unique_identifier
9
-
10
- delegate :id, to: :snippet
11
-
12
- def self.model_name
13
- Snippet.model_name
14
- end
15
-
16
- def persisted?
17
- !@snippet.new_record?
18
- end
19
-
20
- private
21
-
22
- def unique_identifier
23
- qry = Snippet.unscoped
24
- qry = qry.where.not(identifier: @snippet.identifier) if persisted?
25
-
26
- if qry.exists?(identifier: identifier)
27
- errors.add :identifier, I18n.t('errors.messages.taken')
28
- end
29
- end
30
-
31
- def save_object
32
- init_object_values(@snippet)
33
- @snippet.save!
34
- end
35
- end
data/app/models/form.rb DELETED
@@ -1,10 +0,0 @@
1
- class Form < ApplicationRecord
2
- include Concerns::Translatable
3
- translatable_fields :success_message
4
-
5
- has_many :fields, class_name: 'FormField', dependent: :destroy
6
- has_many :submissions, class_name: 'FormSubmission', dependent: :destroy
7
- has_many :data, through: :submissions
8
-
9
- validates :identifier, presence: true
10
- end
@@ -1,15 +0,0 @@
1
- class FormField < ApplicationRecord
2
- include Concerns::Sortable
3
- sortable scope: [:form_id]
4
-
5
- include Concerns::Translatable
6
- translatable_fields :label, :default_value, :placeholder
7
-
8
- belongs_to :form
9
- has_many :validations,
10
- class_name: 'FormFieldValidation',
11
- foreign_key: :field_id,
12
- dependent: :destroy
13
-
14
- validates :form, :name, :field_type, presence: true
15
- end
@@ -1,11 +0,0 @@
1
- class FormFieldValidation < ApplicationRecord
2
- include Concerns::Sortable
3
- sortable scope: [:field_id]
4
-
5
- include Concerns::Translatable
6
- translatable_fields :error_message
7
-
8
- belongs_to :field, class_name: 'FormField'
9
-
10
- validates :field, :validation_class, presence: true
11
- end
@@ -1,15 +0,0 @@
1
- class FormSubmission < ApplicationRecord
2
- include Concerns::Emailable
3
-
4
- belongs_to :form
5
- has_many :data, foreign_key: :submission_id, class_name: 'FormSubmissionData'
6
-
7
- validates :form, presence: true
8
-
9
- def data_object
10
- data.inject(OpenStruct.new) do |stack, d|
11
- stack.send("#{d.name}=", d.value)
12
- stack
13
- end
14
- end
15
- end
@@ -1,5 +0,0 @@
1
- class FormSubmissionData < ApplicationRecord
2
- belongs_to :submission, class_name: 'FormSubmission'
3
-
4
- validates :submission, presence: true
5
- end
@@ -1,15 +0,0 @@
1
- <% if object.errors.any? %>
2
- <div class="alert-box alert radius" data-alert>
3
- <% if object.errors.many? %>
4
- <ul>
5
- <% object.errors.full_messages.each do |error| %>
6
- <li><%= error %></li>
7
- <% end %>
8
- </ul>
9
- <% else %>
10
- <%= object.errors.full_messages.first %>
11
- <% end %>
12
-
13
- <%= link_to '&times;'.html_safe, '#', class: 'close' %>
14
- </div>
15
- <% end %>
@@ -1,27 +0,0 @@
1
- <%= render 'backend/breadcrumbs' %>
2
-
3
- <% if @forms.any? %>
4
- <table class="table table-striped table-hover">
5
- <thead class="thead-inverse">
6
- <tr>
7
- <th><%= t 'b.description' %></th>
8
- <th>&nbsp;</th>
9
- </tr>
10
- </thead>
11
-
12
- <tbody>
13
- <% @forms.each do |f| %>
14
- <tr>
15
- <td><%= f.description %></td>
16
- <td class="text-xs-right">
17
- <%= link_to_edit [:backend, f] %>
18
- <%= link_to icon(:list), backend_form_submissions_path(f) %>
19
- </td>
20
- </tr>
21
- <% end %>
22
- </tbody>
23
- </table>
24
-
25
- <% else %>
26
- <p><%= t 'b.msg.no_items' %></p>
27
- <% end %>
@@ -1,16 +0,0 @@
1
- <% if @filter.fields.any? %>
2
- <div class="filter">
3
- <%= form_for :filter, url: backend_form_submissions_path, method: 'get', html: { class: 'form-inline' } do |f| %>
4
- <div class="card">
5
- <div class="card-block">
6
- <% @filter.fields.each do |field| %>
7
- <div class="form-group">
8
- <%= text_field_tag "q[#{field.to_sym}]", @filter.params[field.to_sym], placeholder: t("b.#{field}"), class: 'form-control' %>
9
- </div>
10
- <% end %>
11
- <%= button_tag t('b.filter'), class: 'btn btn-primary' %>
12
- </div>
13
- </div>
14
- <% end %>
15
- </div>
16
- <% end %>
@@ -1,34 +0,0 @@
1
- <%= render 'backend/breadcrumbs' %>
2
- <%= render 'filter' %>
3
-
4
- <% if @submissions.any? %>
5
- <table class="table table-striped table-hover">
6
- <thead class="thead-inverse">
7
- <tr>
8
- <% if @form.email_present? %>
9
- <th><%= t('b.email') %></th>
10
- <% end %>
11
- <%= @form.datagrid.column_headers(@filter) %>
12
- <th>&nbsp;</th>
13
- </tr>
14
- </thead>
15
-
16
- <tbody>
17
- <% @submissions.each do |s| %>
18
- <tr>
19
- <% if @form.email_present? %>
20
- <td><%= mail_to s.data_object.email %></td>
21
- <% end %>
22
- <%= @form.datagrid.column_values(s) %>
23
- <td class="text-xs-right">
24
- <%= link_to icon(:pencil_square_o), edit_backend_form_submission_path(@form, s) %>
25
- </td>
26
- </tr>
27
- <% end %>
28
- </tbody>
29
- </table>
30
-
31
- <%= udongo_paginate @submissions %>
32
- <% else %>
33
- <p><%= t 'b.msg.no_items' %></p>
34
- <% end %>
@@ -1,62 +0,0 @@
1
- require 'rails/generators/generated_attribute'
2
-
3
- class Udongo::FormGenerator < Rails::Generators::Base
4
- source_root File.expand_path('../templates', __FILE__)
5
- argument :name, type: :string, required: true, banner: 'name'
6
- argument :namespace, type: :string, banner: 'app namespace', default: 'frontend'
7
-
8
- class_option :fields, type: :string, required: true, banner: 'field_name:type', desc: 'Creates the specified form fields for this form.'
9
-
10
- def initialize(*args, &block)
11
- super
12
- filter_fields
13
- end
14
-
15
- def class_name
16
- "#{namespace.camelcase}::#{name.camelcase}Form"
17
- end
18
-
19
- def copy_form_class
20
- say_status 'OK', "Copying to #{destination_file}", :yellow
21
- copy_file 'form.rb', destination_file
22
- gsub_file destination_file, 'klass', class_name
23
- gsub_file destination_file, 'form_name', name
24
- end
25
-
26
- def create_database_records
27
- f = Form.create!(locales: Udongo.config.i18n.locales, identifier: name)
28
-
29
- @fields.each do |field|
30
- field_object = f.fields.create!(locales: Udongo.config.i18n.locales, name: field.name, field_type: field.type)
31
- #field_object.validations.create!(locales: Udongo.config.locales, validation_class: 'Udongo::FormValidations::Required')
32
- end
33
-
34
- inject_into_file destination_file, after: "class #{class_name} < Udongo::ActiveModelSimulator\n" do
35
- <<-RUBY
36
- attr_accessor :#{f.fields.map(&:name).join(', :')}
37
- RUBY
38
- end
39
- end
40
-
41
- def destination_file
42
- "app/forms/#{namespace.underscore}/#{name.underscore}_form.rb"
43
- end
44
-
45
- def filter_fields
46
- @fields = options.fields.split(',').inject([]) do |fields, f|
47
- if f.to_s.include?(':')
48
- attr = f.split(':')[0]
49
- type = f.split(':')[1].to_sym
50
- else
51
- attr = f
52
- type = :text
53
- end
54
-
55
- fields << Rails::Generators::GeneratedAttribute.new(attr, type)
56
- end
57
- end
58
-
59
- def fields
60
- @fields || []
61
- end
62
- end
@@ -1,18 +0,0 @@
1
- class klass < Udongo::ActiveModelSimulator
2
-
3
- def form_instance
4
- Form.find_by(name: 'form_name')
5
- end
6
-
7
- def save
8
- if valid?
9
- submission = form_instance.submissions.create!
10
- form_instance.fields.each do |field|
11
- submission.data.new(name: field.name, value: send(field.name.to_sym))
12
- end
13
- submission.save!
14
- else
15
- false
16
- end
17
- end
18
- end