udongo 2.0.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/backend/application.js +1 -0
- data/app/assets/javascripts/backend/bootstrap.js +3 -3569
- data/app/assets/javascripts/backend/tree.js +106 -65
- data/app/assets/stylesheets/backend/application.scss +2 -0
- data/app/assets/stylesheets/backend/bootstrap.scss +29 -51
- data/app/assets/stylesheets/backend/components/_page_tree.scss +9 -0
- data/app/assets/stylesheets/backend/custom.scss +0 -0
- data/app/assets/stylesheets/backend/font-awesome.scss +644 -1977
- data/app/assets/stylesheets/backend/udongo.scss +1 -0
- data/app/controllers/backend/admins_controller.rb +2 -2
- data/app/controllers/{backend_controller.rb → backend/base_controller.rb} +13 -5
- data/app/controllers/backend/content/rows/columns_controller.rb +1 -1
- data/app/controllers/backend/content/rows/images_controller.rb +1 -1
- data/app/controllers/backend/content/rows/texts_controller.rb +1 -1
- data/app/controllers/backend/content/rows_controller.rb +1 -1
- data/app/controllers/backend/dashboard_controller.rb +1 -1
- data/app/controllers/backend/email_templates_controller.rb +12 -12
- data/app/controllers/backend/emails_controller.rb +1 -1
- data/app/controllers/backend/navigation/items_controller.rb +9 -11
- data/app/controllers/backend/navigations_controller.rb +1 -1
- data/app/controllers/backend/pages_controller.rb +17 -39
- data/app/controllers/backend/redirects_controller.rb +1 -1
- data/app/controllers/backend/seo_controller.rb +1 -1
- data/app/controllers/backend/sessions_controller.rb +1 -1
- data/app/controllers/backend/snippets_controller.rb +14 -13
- data/app/controllers/backend/tagbox_controller.rb +1 -1
- data/app/controllers/catch_all_controller.rb +1 -1
- data/app/controllers/concerns/backend/content_type_controller.rb +3 -1
- data/app/controllers/redirects_controller.rb +1 -1
- data/app/decorators/page_decorator.rb +1 -4
- data/app/forms/backend/email_template_translation_form.rb +1 -23
- data/app/forms/backend/navigation_item_translation_form.rb +1 -23
- data/app/forms/backend/page_translation_form.rb +13 -18
- data/app/forms/backend/snippet_translation_form.rb +1 -23
- data/app/forms/backend/translation_form.rb +22 -0
- data/app/helpers/udongo_helper.rb +0 -4
- data/app/mailers/general_mailer.rb +14 -4
- data/app/models/admin.rb +2 -2
- data/app/models/comment.rb +1 -2
- data/app/models/concerns/addressable.rb +40 -0
- data/app/models/concerns/addressable/config.rb +33 -0
- data/app/models/concerns/cacheable.rb +1 -1
- data/app/models/email.rb +2 -2
- data/app/models/email_template.rb +2 -1
- data/app/views/backend/_general_form_error.html.erb +6 -0
- data/app/views/backend/admins/_form.html.erb +3 -0
- data/app/views/backend/content/rows/columns/_dimension_fields.html.erb +3 -0
- data/app/views/backend/content/rows/columns/edit.html.erb +3 -5
- data/app/views/backend/content/rows/columns/new.html.erb +3 -5
- data/app/views/backend/content/rows/images/edit.html.erb +2 -0
- data/app/views/backend/dashboard/show.html.erb +1 -1
- data/app/views/backend/email_templates/_form.html.erb +29 -7
- data/app/views/backend/email_templates/_tabs.html.erb +1 -1
- data/app/views/backend/email_templates/edit_translation.html.erb +1 -0
- data/app/views/backend/navigation/items/_form.html.erb +4 -2
- data/app/views/backend/navigation/items/_tabs.html.erb +1 -1
- data/app/views/backend/navigation/items/edit_translation.html.erb +1 -0
- data/app/views/backend/pages/_form.html.erb +4 -2
- data/app/views/backend/pages/_tabs.html.erb +1 -1
- data/app/views/backend/pages/edit_translation.html.erb +1 -0
- data/app/views/backend/redirects/_form.html.erb +2 -0
- data/app/views/backend/snippets/_form.html.erb +3 -1
- data/app/views/backend/snippets/_tabs.html.erb +1 -1
- data/app/views/backend/snippets/edit.html.erb +1 -1
- data/app/views/backend/snippets/edit_translation.html.erb +1 -0
- data/app/views/backend/snippets/new.html.erb +1 -1
- data/app/views/layouts/backend/_top_navigation.html.erb +1 -2
- data/changelog.md +38 -0
- data/config/initializers/simple_form_bootstrap.rb +13 -9
- data/config/locales/en_backend.yml +1 -4
- data/config/locales/en_forms.yml +3 -0
- data/config/locales/nl_backend.yml +3 -4
- data/config/locales/nl_forms.yml +3 -0
- data/config/routes.rb +5 -7
- data/db/migrate/20160815100903_remove_form_models.rb +9 -0
- data/db/migrate/20161014135637_add_category_to_admin.rb +5 -0
- data/db/migrate/20161029124558_add_locale_to_admin.rb +6 -0
- data/db/migrate/20161029130557_add_bcc_and_cc_to_email_templates.rb +6 -0
- data/db/migrate/20161029171056_add_ccc_and_bcc_to_email.rb +6 -0
- data/lib/udongo/configs/flexible_content.rb +7 -0
- data/lib/udongo/configs/i18n.rb +5 -3
- data/lib/udongo/configs/i18ns/app.rb +12 -0
- data/lib/udongo/configs/i18ns/cms.rb +12 -0
- data/lib/udongo/flexible_content/column_width_calculator.rb +4 -2
- data/lib/udongo/pages/tree.rb +15 -0
- data/lib/udongo/pages/tree_node.rb +43 -0
- data/lib/udongo/version.rb +1 -1
- data/readme.md +103 -43
- data/vendor/assets/javascripts/backend/select2.min.js +3 -0
- data/vendor/assets/stylesheets/backend/jstree/default/style.scss +3 -3
- data/vendor/assets/stylesheets/backend/select2.min.scss +1 -0
- metadata +22 -30
- data/app/controllers/backend/forms/base_controller.rb +0 -14
- data/app/controllers/backend/forms/submissions_controller.rb +0 -8
- data/app/controllers/backend/forms_controller.rb +0 -7
- data/app/controllers/backend/webserver_controller.rb +0 -6
- data/app/decorators/form_decorator.rb +0 -16
- data/app/decorators/form_submission_decorator.rb +0 -3
- data/app/forms/backend/email_template_form.rb +0 -38
- data/app/forms/backend/navigation_item_form.rb +0 -23
- data/app/forms/backend/page_form.rb +0 -26
- data/app/forms/backend/snippet_form.rb +0 -35
- data/app/models/form.rb +0 -10
- data/app/models/form_field.rb +0 -15
- data/app/models/form_field_validation.rb +0 -11
- data/app/models/form_submission.rb +0 -15
- data/app/models/form_submission_data.rb +0 -5
- data/app/views/backend/_form_errors.html.erb +0 -15
- data/app/views/backend/forms/index.html.erb +0 -27
- data/app/views/backend/forms/submissions/_filter.html.erb +0 -16
- data/app/views/backend/forms/submissions/index.html.erb +0 -34
- data/lib/generators/udongo/form/form_generator.rb +0 -62
- data/lib/generators/udongo/form/templates/form.rb +0 -18
- data/lib/udongo/configs/forms.rb +0 -18
- data/lib/udongo/configs/routes.rb +0 -13
- data/lib/udongo/email_vars/form_submission.rb +0 -18
- data/lib/udongo/forms/submission_datagrid.rb +0 -27
- 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,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,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
|
data/app/models/form_field.rb
DELETED
@@ -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,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 '×'.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> </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> </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
|