para 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +65 -0
- data/Rakefile +21 -0
- data/app/assets/images/para/admin/bg.png +0 -0
- data/app/assets/javascripts/admin/app.coffee +1 -0
- data/app/assets/javascripts/para/admin/table.coffee +46 -0
- data/app/assets/javascripts/para/admin/theme_actions.coffee +26 -0
- data/app/assets/javascripts/para/admin/tree.coffee +53 -0
- data/app/assets/javascripts/para/admin.coffee +18 -0
- data/app/assets/javascripts/para/application.js +13 -0
- data/app/assets/javascripts/para/inputs/nested_many.coffee +57 -0
- data/app/assets/javascripts/para/lib/ajax.coffee +11 -0
- data/app/assets/stylesheets/admin/app.sass +0 -0
- data/app/assets/stylesheets/admin/theme.sass +0 -0
- data/app/assets/stylesheets/para/admin/theme/_base.sass +170 -0
- data/app/assets/stylesheets/para/admin/theme/_breadcrumb.sass +29 -0
- data/app/assets/stylesheets/para/admin/theme/_buttons.sass +24 -0
- data/app/assets/stylesheets/para/admin/theme/_checkable.sass +107 -0
- data/app/assets/stylesheets/para/admin/theme/_commonds.sass +213 -0
- data/app/assets/stylesheets/para/admin/theme/_dropdown.sass +53 -0
- data/app/assets/stylesheets/para/admin/theme/_form.sass +141 -0
- data/app/assets/stylesheets/para/admin/theme/_list.sass +138 -0
- data/app/assets/stylesheets/para/admin/theme/_navigation.sass +287 -0
- data/app/assets/stylesheets/para/admin/theme/_navtabs.sass +127 -0
- data/app/assets/stylesheets/para/admin/theme/_orderable.sass +44 -0
- data/app/assets/stylesheets/para/admin/theme/_panel.sass +288 -0
- data/app/assets/stylesheets/para/admin/theme/_responsive.sass +123 -0
- data/app/assets/stylesheets/para/admin/theme/_sorting.sass +30 -0
- data/app/assets/stylesheets/para/admin/theme/_table.sass +24 -0
- data/app/assets/stylesheets/para/admin/theme/_tree.sass +74 -0
- data/app/assets/stylesheets/para/admin/theme/_variables.sass +31 -0
- data/app/assets/stylesheets/para/admin/theme.sass +22 -0
- data/app/assets/stylesheets/para/admin.sass +10 -0
- data/app/assets/stylesheets/para/application.css +15 -0
- data/app/assets/stylesheets/para/lib/_variables.scss +646 -0
- data/app/assets/stylesheets/para/overrides/datetimepicker.sass +17 -0
- data/app/assets/stylesheets/para/overrides/fuelux.sass +43 -0
- data/app/assets/stylesheets/para/overrides/jasny.bootstrap.sass +41 -0
- data/app/assets/stylesheets/para/overrides/redactor.sass +88 -0
- data/app/assets/stylesheets/para/overrides/responsive.sass +63 -0
- data/app/assets/stylesheets/para/overrides/selectize.sass +45 -0
- data/app/assets/stylesheets/para/overrides/slider.sass +13 -0
- data/app/assets/stylesheets/para/overrides/theme.sass +172 -0
- data/app/controllers/concerns/para/admin/resource_controller_concerns.rb +17 -0
- data/app/controllers/para/admin/base_controller.rb +46 -0
- data/app/controllers/para/admin/component_controller.rb +9 -0
- data/app/controllers/para/admin/crud_component_controller.rb +17 -0
- data/app/controllers/para/admin/crud_resources_controller.rb +71 -0
- data/app/controllers/para/admin/main_controller.rb +8 -0
- data/app/controllers/para/admin/resources_controller.rb +163 -0
- data/app/controllers/para/admin/settings_component_controller.rb +11 -0
- data/app/controllers/para/admin/settings_form_controller.rb +21 -0
- data/app/controllers/para/admin/singleton_resource_component_controller.rb +14 -0
- data/app/controllers/para/admin/singleton_resources_controller.rb +30 -0
- data/app/controllers/para/application_controller.rb +7 -0
- data/app/decorators/para/component/base_decorator.rb +48 -0
- data/app/decorators/para/component/crud_decorator.rb +32 -0
- data/app/decorators/para/component/settings_decorator.rb +11 -0
- data/app/decorators/para/component/singleton_resource_decorator.rb +11 -0
- data/app/decorators/para/component_section_decorator.rb +4 -0
- data/app/helpers/para/admin/base_helper.rb +57 -0
- data/app/helpers/para/admin/component_groups_helper.rb +4 -0
- data/app/helpers/para/admin/components_helper.rb +4 -0
- data/app/helpers/para/admin/resources_helper.rb +27 -0
- data/app/helpers/para/application_helper.rb +14 -0
- data/app/helpers/para/exports_helper.rb +11 -0
- data/app/helpers/para/flash_helper.rb +48 -0
- data/app/helpers/para/form_helper.rb +28 -0
- data/app/helpers/para/markup_helper.rb +15 -0
- data/app/helpers/para/model_helper.rb +38 -0
- data/app/helpers/para/navigation_helper.rb +8 -0
- data/app/helpers/para/ordering_helper.rb +20 -0
- data/app/helpers/para/search_helper.rb +22 -0
- data/app/helpers/para/tag_helper.rb +50 -0
- data/app/helpers/para/tree_helper.rb +41 -0
- data/app/models/para/component/base.rb +70 -0
- data/app/models/para/component/crud.rb +45 -0
- data/app/models/para/component/resource.rb +33 -0
- data/app/models/para/component/settings.rb +17 -0
- data/app/models/para/component/singleton_resource.rb +25 -0
- data/app/models/para/component_resource.rb +6 -0
- data/app/models/para/component_section.rb +18 -0
- data/app/views/layouts/para/admin.html.haml +32 -0
- data/app/views/layouts/para/application.html.erb +14 -0
- data/app/views/para/admin/component_sections/_form.html.haml +10 -0
- data/app/views/para/admin/component_sections/edit.html.haml +5 -0
- data/app/views/para/admin/component_sections/new.html.haml +5 -0
- data/app/views/para/admin/components/_form.html.haml +15 -0
- data/app/views/para/admin/components/new.html.haml +4 -0
- data/app/views/para/admin/crud_component/show.html.haml +4 -0
- data/app/views/para/admin/dashboard.html.haml +10 -0
- data/app/views/para/admin/main/index.html.haml +1 -0
- data/app/views/para/admin/resources/_exports_menu.html.haml +12 -0
- data/app/views/para/admin/resources/_fields.html.haml +5 -0
- data/app/views/para/admin/resources/_filters.html.haml +9 -0
- data/app/views/para/admin/resources/_form.html.haml +6 -0
- data/app/views/para/admin/resources/_list.html.haml +22 -0
- data/app/views/para/admin/resources/_table.html.haml +8 -0
- data/app/views/para/admin/resources/_tree.html.haml +15 -0
- data/app/views/para/admin/resources/_tree_item.html.haml +16 -0
- data/app/views/para/admin/resources/edit.html.haml +6 -0
- data/app/views/para/admin/resources/new.html.haml +6 -0
- data/app/views/para/admin/settings_component/show.html.haml +12 -0
- data/app/views/para/admin/shared/_breadcrumb.html.haml +3 -0
- data/app/views/para/admin/shared/_header.html.haml +27 -0
- data/app/views/para/admin/shared/_navigation.html.haml +21 -0
- data/app/views/para/admin/singleton_resource_component/show.html.haml +5 -0
- data/app/views/para/inputs/_nested_many.html.haml +10 -0
- data/app/views/para/inputs/_nested_many_container.html.haml +19 -0
- data/app/views/para/inputs/_nested_one.html.haml +3 -0
- data/config/locales/en.yml +86 -0
- data/config/locales/fr.yml +101 -0
- data/db/migrate/20140911091225_create_para_components.rb +19 -0
- data/db/migrate/20140911112150_add_slug_to_para_components.rb +6 -0
- data/db/migrate/20140929125733_create_para_component_sections.rb +8 -0
- data/db/migrate/20140929131111_add_identifier_to_para_component_sections.rb +5 -0
- data/db/migrate/20140930121822_add_position_to_para_component_section.rb +5 -0
- data/db/migrate/20150129170710_create_para_component_resources.rb +13 -0
- data/db/migrate/20150203173219_add_identifier_to_para_components.rb +5 -0
- data/lib/generators/para/admin_user/admin_user_generator.rb +16 -0
- data/lib/generators/para/component/component_generator.rb +59 -0
- data/lib/generators/para/component/templates/component.rb +3 -0
- data/lib/generators/para/component/templates/component_controller.rb +7 -0
- data/lib/generators/para/component/templates/show.html.haml +2 -0
- data/lib/generators/para/exporter/exporter_generator.rb +42 -0
- data/lib/generators/para/exporter/templates/base_exporter.rb +15 -0
- data/lib/generators/para/exporter/templates/csv_exporter.rb +13 -0
- data/lib/generators/para/form/form_generator.rb +15 -0
- data/lib/generators/para/form/templates/_form.html.haml +7 -0
- data/lib/generators/para/install/install_generator.rb +112 -0
- data/lib/generators/para/install/templates/components.rb +13 -0
- data/lib/generators/para/install/templates/initializer.rb +23 -0
- data/lib/generators/para/nested_fields/nested_fields_generator.rb +15 -0
- data/lib/generators/para/nested_fields/templates/_nested_fields.html.haml +3 -0
- data/lib/generators/para/orderable/orderable_generator.rb +53 -0
- data/lib/generators/para/orderable/templates/orderable_migration.rb +6 -0
- data/lib/generators/para/resource/resource_generator.rb +71 -0
- data/lib/generators/para/resource/templates/resource_controller.rb +5 -0
- data/lib/generators/para/table/table_generator.rb +34 -0
- data/lib/generators/para/table/templates/_table.html.haml +10 -0
- data/lib/para/attribute_field/base.rb +77 -0
- data/lib/para/attribute_field/belongs_to.rb +29 -0
- data/lib/para/attribute_field/boolean.rb +15 -0
- data/lib/para/attribute_field/datetime.rb +9 -0
- data/lib/para/attribute_field/file.rb +20 -0
- data/lib/para/attribute_field/has_many.rb +31 -0
- data/lib/para/attribute_field/image.rb +25 -0
- data/lib/para/attribute_field/nested_many.rb +26 -0
- data/lib/para/attribute_field/nested_one.rb +27 -0
- data/lib/para/attribute_field/password.rb +18 -0
- data/lib/para/attribute_field/redactor.rb +20 -0
- data/lib/para/attribute_field/relation.rb +52 -0
- data/lib/para/attribute_field/translation.rb +9 -0
- data/lib/para/attribute_field_mappings.rb +82 -0
- data/lib/para/cloneable.rb +20 -0
- data/lib/para/component/exportable.rb +25 -0
- data/lib/para/component.rb +27 -0
- data/lib/para/components_configuration.rb +156 -0
- data/lib/para/config.rb +21 -0
- data/lib/para/engine.rb +59 -0
- data/lib/para/errors.rb +15 -0
- data/lib/para/exporter/base.rb +27 -0
- data/lib/para/exporter/csv.rb +49 -0
- data/lib/para/exporter.rb +57 -0
- data/lib/para/ext/cancan.rb +26 -0
- data/lib/para/ext/paperclip.rb +67 -0
- data/lib/para/ext.rb +13 -0
- data/lib/para/form_builder/containers.rb +70 -0
- data/lib/para/form_builder/field_mappings.rb +9 -0
- data/lib/para/form_builder/nested_form.rb +80 -0
- data/lib/para/form_builder/ordering.rb +15 -0
- data/lib/para/form_builder/settings.rb +24 -0
- data/lib/para/form_builder.rb +22 -0
- data/lib/para/generators/field_helpers.rb +32 -0
- data/lib/para/generators/name_helpers.rb +9 -0
- data/lib/para/generators/named_base.rb +7 -0
- data/lib/para/generators.rb +11 -0
- data/lib/para/inputs/nested_many_input.rb +40 -0
- data/lib/para/inputs/nested_one_input.rb +24 -0
- data/lib/para/inputs.rb +11 -0
- data/lib/para/markup/alert.rb +37 -0
- data/lib/para/markup/component.rb +20 -0
- data/lib/para/markup/modal.rb +52 -0
- data/lib/para/markup/panel.rb +41 -0
- data/lib/para/markup/resources_table.rb +178 -0
- data/lib/para/markup.rb +10 -0
- data/lib/para/model_field_parsers/base.rb +20 -0
- data/lib/para/model_field_parsers/devise.rb +37 -0
- data/lib/para/model_field_parsers/globalize.rb +23 -0
- data/lib/para/model_field_parsers/orderable.rb +15 -0
- data/lib/para/model_field_parsers/paperclip.rb +51 -0
- data/lib/para/model_field_parsers/redactor.rb +19 -0
- data/lib/para/model_field_parsers/relations.rb +67 -0
- data/lib/para/model_field_parsers.rb +22 -0
- data/lib/para/orderable.rb +44 -0
- data/lib/para/routes.rb +49 -0
- data/lib/para/version.rb +3 -0
- data/lib/para.rb +65 -0
- data/lib/rails/relation_length_validator.rb +45 -0
- data/lib/rails/routing_mapper.rb +27 -0
- data/lib/tasks/para_tasks.rake +22 -0
- metadata +595 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
module Para
|
2
|
+
module ModelFieldParsers
|
3
|
+
class Redactor < Para::ModelFieldParsers::Base
|
4
|
+
register :redactor, self
|
5
|
+
|
6
|
+
def parse!
|
7
|
+
%w(content description).each do |field_name|
|
8
|
+
field = fields_hash[field_name]
|
9
|
+
|
10
|
+
if field && field.type == :text
|
11
|
+
fields_hash[field_name] = Para::AttributeField::Redactor.new(
|
12
|
+
field.model, name: field_name
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Para
|
2
|
+
module ModelFieldParsers
|
3
|
+
class Relations < Para::ModelFieldParsers::Base
|
4
|
+
register :relations, self
|
5
|
+
|
6
|
+
def parse!
|
7
|
+
model.reflections.each do |name, reflection|
|
8
|
+
# We ensure that name is a symbol and not a string for 4.2+
|
9
|
+
# versions of AR
|
10
|
+
# We may find a better solution to handle strings, since our
|
11
|
+
# `fields_hash` is already a `HashWithIndifferentAccess`
|
12
|
+
name = name.to_sym
|
13
|
+
|
14
|
+
next if name == :component
|
15
|
+
|
16
|
+
# Remove foreign key, if existing, from fields
|
17
|
+
fields_hash.delete(reflection.foreign_key.to_s)
|
18
|
+
|
19
|
+
if reflection.options[:polymorphic] == true
|
20
|
+
fields_hash.delete(reflection.foreign_type.to_s)
|
21
|
+
next
|
22
|
+
end
|
23
|
+
|
24
|
+
if model.nested_attributes_options[name]
|
25
|
+
if reflection.collection?
|
26
|
+
fields_hash[name] = AttributeField::NestedManyField.new(
|
27
|
+
model, name: name, type: 'has_many', field_type: 'nested_many'
|
28
|
+
)
|
29
|
+
else
|
30
|
+
fields_hash[name] = AttributeField::NestedOneField.new(
|
31
|
+
model, name: name, type: 'belongs_to', field_type: 'nested_one'
|
32
|
+
)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
if reflection.collection?
|
36
|
+
remove_counter_cache_column!(name, reflection)
|
37
|
+
|
38
|
+
fields_hash[name] = AttributeField::HasManyField.new(
|
39
|
+
model, name: name, type: 'has_many', field_type: 'selectize'
|
40
|
+
)
|
41
|
+
else
|
42
|
+
fields_hash[name] = AttributeField::BelongsToField.new(
|
43
|
+
model, name: name, type: 'belongs_to', field_type: 'selectize'
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Allows removing counter cache columns from fields from has_many
|
51
|
+
# relations, when :inverse_of option is set
|
52
|
+
#
|
53
|
+
def remove_counter_cache_column!(name, reflection)
|
54
|
+
return unless (inverse_relation = reflection.inverse_of)
|
55
|
+
return unless (counter_name = inverse_relation.options[:counter_cache])
|
56
|
+
|
57
|
+
counter_name = if String === counter_name
|
58
|
+
counter_name
|
59
|
+
else
|
60
|
+
"#{ name }_count"
|
61
|
+
end
|
62
|
+
|
63
|
+
fields_hash.delete(counter_name)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Para
|
2
|
+
module ModelFieldParsers
|
3
|
+
def self.registered_parsers
|
4
|
+
@registered_parsers ||= {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.parse!(model, fields_hash)
|
8
|
+
registered_parsers.each do |_, parser_class|
|
9
|
+
parser = parser_class.new(model, fields_hash)
|
10
|
+
parser.parse! if parser.applicable?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'para/model_field_parsers/base'
|
17
|
+
require 'para/model_field_parsers/devise'
|
18
|
+
require 'para/model_field_parsers/paperclip'
|
19
|
+
require 'para/model_field_parsers/orderable'
|
20
|
+
require 'para/model_field_parsers/relations'
|
21
|
+
require 'para/model_field_parsers/redactor'
|
22
|
+
require 'para/model_field_parsers/globalize'
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Para
|
2
|
+
module Orderable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
scope :ordered, -> { order('position ASC') }
|
7
|
+
before_create :orederable_assign_position
|
8
|
+
end
|
9
|
+
|
10
|
+
def orederable_assign_position
|
11
|
+
last_resource = self.class.order('position DESC')
|
12
|
+
.where.not(position: nil)
|
13
|
+
.select(:position)
|
14
|
+
.first
|
15
|
+
|
16
|
+
self.position = if last_resource && last_resource.position
|
17
|
+
last_resource.position + 1
|
18
|
+
else
|
19
|
+
0
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module ActiveRecordOrderableMixin
|
25
|
+
extend ActiveSupport::Concern
|
26
|
+
|
27
|
+
included do
|
28
|
+
class_attribute :orderable
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
def acts_as_orderable
|
33
|
+
return if orderable?
|
34
|
+
|
35
|
+
self.orderable = true
|
36
|
+
include Para::Orderable
|
37
|
+
end
|
38
|
+
|
39
|
+
def orderable?
|
40
|
+
!!orderable
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/para/routes.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
module Para
|
2
|
+
class Routes
|
3
|
+
attr_reader :router
|
4
|
+
|
5
|
+
def initialize(router)
|
6
|
+
@router = router
|
7
|
+
end
|
8
|
+
|
9
|
+
def draw(mount_location = '/', &block)
|
10
|
+
routes = self
|
11
|
+
|
12
|
+
router.instance_eval do
|
13
|
+
scope mount_location do
|
14
|
+
scope module: :para do
|
15
|
+
namespace :admin do
|
16
|
+
get '/' => 'main#index'
|
17
|
+
|
18
|
+
component :crud do
|
19
|
+
scope ':model' do
|
20
|
+
resources :crud_resources, path: '/' do
|
21
|
+
collection do
|
22
|
+
patch :order
|
23
|
+
patch :tree
|
24
|
+
get :export
|
25
|
+
end
|
26
|
+
|
27
|
+
member do
|
28
|
+
post :clone
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
component :singleton_resource, path: 'resource-form' do
|
35
|
+
resource :singleton_resource, path: 'resource', only: [:create, :update]
|
36
|
+
end
|
37
|
+
|
38
|
+
component :settings do
|
39
|
+
resource :settings_form, controller: 'settings_form', only: [:update]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
block.call if block
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/para/version.rb
ADDED
data/lib/para.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'devise'
|
2
|
+
require 'paperclip'
|
3
|
+
require 'simple_form'
|
4
|
+
require 'simple_form_extension'
|
5
|
+
require 'active_decorator'
|
6
|
+
require 'friendly_id'
|
7
|
+
require 'haml-rails'
|
8
|
+
require 'truncate_html'
|
9
|
+
require 'cocoon'
|
10
|
+
require 'cancan'
|
11
|
+
require 'request_store'
|
12
|
+
|
13
|
+
require 'sass-rails'
|
14
|
+
require 'selectize-rails'
|
15
|
+
require 'bootstrap-sass'
|
16
|
+
require 'compass-rails'
|
17
|
+
require 'font-awesome-rails'
|
18
|
+
|
19
|
+
require 'rails/routing_mapper'
|
20
|
+
require 'rails/relation_length_validator'
|
21
|
+
|
22
|
+
require 'para/ext'
|
23
|
+
require 'para/errors'
|
24
|
+
require 'para/config'
|
25
|
+
require 'para/model_field_parsers'
|
26
|
+
require 'para/attribute_field_mappings'
|
27
|
+
require 'para/inputs'
|
28
|
+
require 'para/cloneable'
|
29
|
+
require 'para/orderable'
|
30
|
+
require 'para/form_builder'
|
31
|
+
require 'para/markup'
|
32
|
+
require 'para/engine'
|
33
|
+
require 'para/components_configuration'
|
34
|
+
require 'para/exporter'
|
35
|
+
|
36
|
+
module Para
|
37
|
+
extend ActiveSupport::Autoload
|
38
|
+
|
39
|
+
eager_autoload do
|
40
|
+
autoload :Config
|
41
|
+
autoload :Component
|
42
|
+
autoload :Generators
|
43
|
+
autoload :Routes
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.config(&block)
|
47
|
+
if block
|
48
|
+
block.call(Para::Config)
|
49
|
+
else
|
50
|
+
Para::Config
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.components
|
55
|
+
Para::Component.config
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.store
|
59
|
+
RequestStore.store
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.table_name_prefix
|
63
|
+
'para_'
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class RelationLengthValidator < ActiveModel::EachValidator
|
2
|
+
def validate_each(record, attribute, value)
|
3
|
+
if smaller?(value)
|
4
|
+
record.errors.add(attribute, smaller_error_message, options)
|
5
|
+
elsif greater?(value)
|
6
|
+
record.errors.add(attribute, greater_error_message, options)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def minimum
|
13
|
+
options[:minimum] || 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def maximum
|
17
|
+
options[:maximum] || Float::INFINITY
|
18
|
+
end
|
19
|
+
|
20
|
+
def smaller?(value)
|
21
|
+
value.length < minimum
|
22
|
+
end
|
23
|
+
|
24
|
+
def greater?(value)
|
25
|
+
value.length > minimum
|
26
|
+
end
|
27
|
+
|
28
|
+
def smaller_error_message
|
29
|
+
message = options[:message] && options[:message][:minimum]
|
30
|
+
message || I18n.t(
|
31
|
+
"activerecord.errors.relation_length_is_smaller",
|
32
|
+
minimum: minimum,
|
33
|
+
default: "must have at least #{ minimum } elements"
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def greater_error_message
|
38
|
+
message = options[:message] && options[:message][:maximum]
|
39
|
+
message || I18n.t(
|
40
|
+
"activerecord.errors.relation_length_is_greater",
|
41
|
+
maximum: maximum,
|
42
|
+
default: "must have at most #{ maximum } elements"
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ActionDispatch
|
2
|
+
module Routing
|
3
|
+
class Mapper
|
4
|
+
def para_at(mount_location, &block)
|
5
|
+
Para::Routes.new(self).draw(mount_location, &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
def para_plugin(plugin_name)
|
9
|
+
routes = ['', plugin_name.to_s.camelize, 'Routes'].join('::').constantize
|
10
|
+
routes.new(self).draw
|
11
|
+
end
|
12
|
+
|
13
|
+
def component(component_name, options = {}, &block)
|
14
|
+
path = options.fetch(:path, component_name.to_s)
|
15
|
+
as = options.fetch(:as, component_name)
|
16
|
+
controller = options.fetch(:controller, "#{ component_name }_component")
|
17
|
+
|
18
|
+
endpoint = "#{ path }/:component_id"
|
19
|
+
|
20
|
+
get endpoint => "#{ controller }#show", as: as
|
21
|
+
delete endpoint => "#{ controller }#destroy", as: "destroy_#{as}"
|
22
|
+
|
23
|
+
scope(endpoint, as: component_name, &block) if block
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
namespace :para do
|
2
|
+
namespace :components do
|
3
|
+
desc <<-DESC
|
4
|
+
Remove all components that are no longer referenced in the components.rb
|
5
|
+
configuration file
|
6
|
+
DESC
|
7
|
+
|
8
|
+
task clean: :environment do
|
9
|
+
Para::Component::Base.find_each do |component|
|
10
|
+
unless Para.components.component_for(component.identifier)
|
11
|
+
component.destroy
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Para::ComponentSection.find_each do |section|
|
16
|
+
unless Para.components.section_for(section.identifier)
|
17
|
+
section.destroy
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|