udongo 2.0.4 → 3.0.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 (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