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,50 @@
|
|
1
|
+
module Para
|
2
|
+
module TagHelper
|
3
|
+
def icon_link_to(name, url_options = nil, options = nil, &block)
|
4
|
+
if block
|
5
|
+
options, url_options = url_options, name
|
6
|
+
name = capture { block.call }
|
7
|
+
end
|
8
|
+
|
9
|
+
if (icon = options.delete(:icon))
|
10
|
+
icon_tag = content_tag(:i, '', class: "fa fa-#{ icon }")
|
11
|
+
name = [icon_tag, name].join(' ').html_safe
|
12
|
+
end
|
13
|
+
|
14
|
+
link_to(name, url_options, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def listing_for(resources, options = {})
|
18
|
+
model = resources.model
|
19
|
+
attributes = model_field_mappings(model).fields
|
20
|
+
relation = options.fetch(:relation, model.name.to_s.underscore.pluralize)
|
21
|
+
allow_adding_resource = options.fetch(:addable, true)
|
22
|
+
|
23
|
+
partial = :list
|
24
|
+
partial = :tree if model.respond_to? :roots
|
25
|
+
|
26
|
+
render(
|
27
|
+
partial: find_partial_for(relation, partial),
|
28
|
+
locals: {
|
29
|
+
component: @component,
|
30
|
+
resources: resources,
|
31
|
+
relation: relation,
|
32
|
+
model: model,
|
33
|
+
attributes: attributes,
|
34
|
+
allow_adding_resource: allow_adding_resource
|
35
|
+
}
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def table_for(options)
|
40
|
+
partial = :table
|
41
|
+
render(
|
42
|
+
partial: find_partial_for(
|
43
|
+
options[:model].name.underscore.pluralize,
|
44
|
+
partial
|
45
|
+
),
|
46
|
+
locals: options
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Para
|
2
|
+
module TreeHelper
|
3
|
+
def needs_placeholder?(node)
|
4
|
+
node.children.empty? && node.depth < max_depth_for(node.class)
|
5
|
+
end
|
6
|
+
|
7
|
+
def max_depth_for(model)
|
8
|
+
model.max_depth || Para.config.default_tree_max_depth
|
9
|
+
end
|
10
|
+
|
11
|
+
def actions(resource)
|
12
|
+
content_tag(:div, class: 'pull-right btn-group') do
|
13
|
+
edit_button(resource) + delete_button(resource)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def edit_button(resource)
|
18
|
+
link_to(
|
19
|
+
component.relation_path(
|
20
|
+
resource, action: :edit, return_to: view.request.fullpath
|
21
|
+
),
|
22
|
+
class: 'btn btn-primary'
|
23
|
+
) do
|
24
|
+
content_tag(:i, '', class: 'fa fa-pencil')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def delete_button(resource)
|
29
|
+
link_to(
|
30
|
+
component.relation_path(resource),
|
31
|
+
method: :delete,
|
32
|
+
data: {
|
33
|
+
confirm: I18n.t('para.list.delete_confirmation')
|
34
|
+
},
|
35
|
+
class: 'btn btn-danger'
|
36
|
+
) do
|
37
|
+
content_tag(:i, '', class: 'fa fa-trash')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Para
|
2
|
+
module Component
|
3
|
+
class Base < ActiveRecord::Base
|
4
|
+
self.table_name = 'para_components'
|
5
|
+
|
6
|
+
class_attribute :component_name, :configurable_attributes
|
7
|
+
|
8
|
+
def self.register(name, component)
|
9
|
+
self.component_name = name
|
10
|
+
Para::Component.registered_components[name] = component
|
11
|
+
end
|
12
|
+
|
13
|
+
extend FriendlyId
|
14
|
+
friendly_id :name, use: [:slugged, :finders, :history]
|
15
|
+
|
16
|
+
validates :identifier, :type, presence: true
|
17
|
+
|
18
|
+
belongs_to :component_section, class_name: 'Para::ComponentSection'
|
19
|
+
|
20
|
+
scope :ordered, -> { order(position: :asc) }
|
21
|
+
|
22
|
+
def name
|
23
|
+
read_attribute(:name) || I18n.t(
|
24
|
+
"components.component.#{ identifier }",
|
25
|
+
default: identifier.humanize
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def exportable?
|
30
|
+
false
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.model_name
|
34
|
+
@model_name ||= ModelName.new(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.configurable_on(key, options = {})
|
38
|
+
store_accessor(:configuration, key)
|
39
|
+
configurable_attributes[key] = options
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.configurable?
|
43
|
+
configurable_attributes.length > 0
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.configurable_attributes
|
47
|
+
@configurable_attributes ||= {}
|
48
|
+
end
|
49
|
+
|
50
|
+
def should_generate_new_friendly_id?
|
51
|
+
slug.blank? || name_changed?
|
52
|
+
end
|
53
|
+
|
54
|
+
def default_form_actions
|
55
|
+
[:submit, :submit_and_edit, :submit_and_add_another, :cancel]
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
class ModelName < ActiveModel::Name
|
61
|
+
def route_key
|
62
|
+
super.gsub(/(para_|component_|_component$)/, '')
|
63
|
+
end
|
64
|
+
|
65
|
+
def singular_route_key
|
66
|
+
super.gsub(/(para_|component_|_component$)/, '')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Para
|
2
|
+
module Component
|
3
|
+
class Crud < Para::Component::Resource
|
4
|
+
register :crud, self
|
5
|
+
|
6
|
+
include Para::Component::Exportable
|
7
|
+
|
8
|
+
configurable_on :model_type
|
9
|
+
configurable_on :namespaced
|
10
|
+
|
11
|
+
has_many :component_resources, class_name: 'Para::ComponentResource',
|
12
|
+
foreign_key: :component_id, autosave: true
|
13
|
+
|
14
|
+
def namespaced?
|
15
|
+
case namespaced
|
16
|
+
when 'true' then true
|
17
|
+
else false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def resources
|
22
|
+
namespaced? ? namespaced_resources : model.all
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_resource(resource)
|
26
|
+
component_resources.create(resource: resource)
|
27
|
+
end
|
28
|
+
|
29
|
+
def remove_resource(resource)
|
30
|
+
component_resources.where(resource: resource).first.destroy
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def namespaced_resources
|
36
|
+
model.joins(
|
37
|
+
"INNER JOIN para_component_resources ON " +
|
38
|
+
"para_component_resources.resource_id = #{ model_table_name }.id"
|
39
|
+
).where(
|
40
|
+
para_component_resources: { component_id: id }
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Para
|
2
|
+
module Component
|
3
|
+
class Resource < Para::Component::Base
|
4
|
+
def model
|
5
|
+
@model ||= model_type.presence && model_type.constantize
|
6
|
+
end
|
7
|
+
|
8
|
+
def available_models
|
9
|
+
Rails.application.eager_load!
|
10
|
+
|
11
|
+
ActiveRecord::Base.descendants.map(&:name).sort.reject do |name|
|
12
|
+
next true if name == 'ActiveRecord::SchemaMigration'
|
13
|
+
next true if name.match(/^HABTM_/)
|
14
|
+
next true if name.match(/Component$/)
|
15
|
+
next true if name.match(/^Para::Component/)
|
16
|
+
next true if excluded_models.include?(name)
|
17
|
+
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def model_table_name
|
23
|
+
model && model.table_name
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def excluded_models
|
29
|
+
%w(FriendlyId::Slug)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Para
|
2
|
+
module Component
|
3
|
+
class Settings < Para::Component::Base
|
4
|
+
register :settings, self
|
5
|
+
|
6
|
+
configurable_on :settings, as: :selectize
|
7
|
+
|
8
|
+
def settings
|
9
|
+
eval(configuration['settings'])
|
10
|
+
end
|
11
|
+
|
12
|
+
def default_form_actions
|
13
|
+
[:submit]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Para
|
2
|
+
module Component
|
3
|
+
class SingletonResource < Para::Component::Resource
|
4
|
+
register :singleton_resource, self
|
5
|
+
|
6
|
+
configurable_on :model_type, as: :selectize, collection: :available_models
|
7
|
+
|
8
|
+
has_one :component_resource, class_name: 'Para::ComponentResource',
|
9
|
+
foreign_key: :component_id, autosave: true
|
10
|
+
|
11
|
+
def resource
|
12
|
+
build_component_resource(resource: model.new) unless component_resource
|
13
|
+
component_resource.resource ||= model.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def resource=(value)
|
17
|
+
build_component_resource(resource: value) unless component_resource
|
18
|
+
end
|
19
|
+
|
20
|
+
def default_form_actions
|
21
|
+
[:submit]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Para
|
2
|
+
class ComponentSection < ActiveRecord::Base
|
3
|
+
has_many :components, -> { ordered }, class_name: 'Para::Component::Base',
|
4
|
+
autosave: true, foreign_key: :component_section_id,
|
5
|
+
dependent: :destroy
|
6
|
+
|
7
|
+
scope :ordered, -> { order(position: :asc) }
|
8
|
+
|
9
|
+
validates :identifier, presence: true
|
10
|
+
|
11
|
+
def name
|
12
|
+
read_attribute(:name) || I18n.t(
|
13
|
+
"components.section.#{ identifier }",
|
14
|
+
default: identifier.humanize
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
!!!
|
2
|
+
%html{ lang: 'en' }
|
3
|
+
%head
|
4
|
+
%title= Para.config.admin_title || I18n.t('para.admin.title')
|
5
|
+
|
6
|
+
%meta{ charset: 'utf-8' }/
|
7
|
+
%meta{ content: 'IE=edge', 'http-equiv' => 'X-UA-Compatible' }/
|
8
|
+
%meta{ content: 'width=device-width, initial-scale=1', :name => 'viewport' }/
|
9
|
+
|
10
|
+
= stylesheet_link_tag 'para/admin', media: 'all'
|
11
|
+
|
12
|
+
/ HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries
|
13
|
+
/ WARNING: Respond.js doesn't work if you view the page via file://
|
14
|
+
/[if lt IE 9]
|
15
|
+
<script src='https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js'></script>
|
16
|
+
<script src='https://oss.maxcdn.com/respond/1.4.2/respond.min.js'></script>
|
17
|
+
|
18
|
+
= csrf_meta_tags
|
19
|
+
|
20
|
+
%body
|
21
|
+
.page-container.page-navigation-top-fixed
|
22
|
+
|
23
|
+
.page-sidebar.collapse.navbar-collapse#menu-sidebar
|
24
|
+
= render partial: 'para/admin/shared/navigation'
|
25
|
+
|
26
|
+
.page-content
|
27
|
+
= render partial: 'para/admin/shared/header'
|
28
|
+
= display_admin_flash
|
29
|
+
|
30
|
+
= yield
|
31
|
+
|
32
|
+
= javascript_include_tag 'para/admin', :'data-turbolinks-eval' => false
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Para</title>
|
5
|
+
<%= stylesheet_link_tag "para/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "para/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.page-content-wrap
|
2
|
+
= simple_form_for [:admin, @component_section], as: :component_section, wrapper: :horizontal_form, html: { class: "form-horizontal form-group-separated" } do |form|
|
3
|
+
|
4
|
+
.block.form-inputs
|
5
|
+
= form.input :name
|
6
|
+
|
7
|
+
.block.form-actions
|
8
|
+
.col-sm-9.col-sm-offset-3
|
9
|
+
= form.button :submit, class: 'btn-success'
|
10
|
+
= link_to t('para.shared.cancel'), admin_path, class: 'btn btn-danger'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
.page-content-wrap
|
2
|
+
= simple_form_for @component, as: :component, url: admin_component_section_components_path(@component_section), wrapper: :horizontal_form, html: { class: "form-horizontal form-group-separated" } do |form|
|
3
|
+
.block.form-inputs
|
4
|
+
= form.input :name
|
5
|
+
|
6
|
+
/ Configurable attributes
|
7
|
+
- if form.object.class.configurable?
|
8
|
+
- form.object.class.configurable_attributes.each do |key, options|
|
9
|
+
= form.input key, options
|
10
|
+
|
11
|
+
= form.hidden_field :type, value: params[:type] || form.object.type
|
12
|
+
|
13
|
+
.block.form-actions
|
14
|
+
.col-sm-9.col-sm-offset-3
|
15
|
+
= form.button :submit, class: 'btn-success'
|
@@ -0,0 +1 @@
|
|
1
|
+
= render file: template_path_lookup('admin/dashboard', 'para/admin/dashboard')
|
@@ -0,0 +1,12 @@
|
|
1
|
+
- if component.exportable?
|
2
|
+
- component.exports.each do |export|
|
3
|
+
.btn-group
|
4
|
+
%button.btn.btn-default.dropdown-toggle{"aria-expanded" => "false", "data-toggle" => "dropdown", :type => "button"}
|
5
|
+
%i.fa.fa-download
|
6
|
+
= export_name_for(model, export)
|
7
|
+
%span.caret
|
8
|
+
%ul.dropdown-menu{:role => "menu"}
|
9
|
+
- export[:formats].each do |format|
|
10
|
+
%li
|
11
|
+
= link_to component.relation_path(model.model_name.route_key, action: :export, format: format) do
|
12
|
+
= t('para.export.as', extension: format)
|
@@ -0,0 +1,9 @@
|
|
1
|
+
= search_form_for @q, builder: SimpleForm::FormBuilder, url: @component.path do |form|
|
2
|
+
.input-group
|
3
|
+
%span.input-group-addon
|
4
|
+
%i.fa.fa-search
|
5
|
+
|
6
|
+
= form.input_field fulltext_search_param_for(attributes), as: :string, autofocus: true, label: t('para.shared.search'), class: 'form-control'
|
7
|
+
|
8
|
+
%span.input-group-btn
|
9
|
+
= form.submit t('para.shared.search'), class: 'btn btn-default'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
.page-content-wrap
|
2
|
+
= panel do |panel|
|
3
|
+
= panel.header do
|
4
|
+
= icon_link_to t('para.shared.add'), component.relation_path(model.model_name.singular_route_key, action: :new), icon: 'plus', class: 'btn btn-primary' if allow_adding_resource
|
5
|
+
|
6
|
+
= render partial: find_partial_for(relation, :exports_menu), locals: { component: component, model: model }
|
7
|
+
|
8
|
+
= panel.body do
|
9
|
+
= render partial: find_partial_for(relation, :filters), locals: { attributes: attributes }
|
10
|
+
|
11
|
+
- if resources.length > 0
|
12
|
+
= panel.body class: '' do
|
13
|
+
= table_for(resources: resources, model: model, component: component, attributes: attributes)
|
14
|
+
|
15
|
+
- else
|
16
|
+
= panel.body do
|
17
|
+
= alert class: 'no-margin-bottom', dismissable: false do
|
18
|
+
= filtered?(attributes) ? t('para.list.no_results') : t('para.list.empty')
|
19
|
+
|
20
|
+
- if resources.total_count > resources.length
|
21
|
+
= panel.footer do
|
22
|
+
= paginate resources, theme: Para.config.pagination_theme
|
@@ -0,0 +1,15 @@
|
|
1
|
+
.page-content-wrap
|
2
|
+
= panel do |panel|
|
3
|
+
= panel.header do
|
4
|
+
= icon_link_to t('para.shared.add'), component.relation_path(model.model_name.singular_route_key, action: :new), icon: 'plus', class: 'btn btn-primary'
|
5
|
+
|
6
|
+
- if resources.length > 0
|
7
|
+
= panel.body do
|
8
|
+
%ul.tree.root-tree{ data: { url: component.relation_path(model.model_name.route_key, action: :tree), :"max-depth" => max_depth_for(model) } }
|
9
|
+
= render partial: 'para/admin/resources/tree_item', collection: resources.roots, as: :root
|
10
|
+
|
11
|
+
- else
|
12
|
+
= panel.body do
|
13
|
+
= alert class: 'no-margin-bottom', dismissable: false do
|
14
|
+
= filtered?(attributes) ? t('para.list.no_results') : t('para.list.empty')
|
15
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
%li.node{ data: { id: root.id } }
|
2
|
+
.node-row
|
3
|
+
%span.handle
|
4
|
+
%i.fa.fa-bars.fa-fw
|
5
|
+
%span.node-name
|
6
|
+
= root.name
|
7
|
+
.pull-right.btn-group
|
8
|
+
= link_to @component.relation_path(root, action: :edit, return_to: request.fullpath), class: "btn btn-primary" do
|
9
|
+
%i.fa.fa-pencil
|
10
|
+
= link_to @component.relation_path(root), method: :delete, data: { confirm: I18n.t('para.list.delete_confirmation') }, class: 'btn btn-danger' do
|
11
|
+
%i.fa.fa-trash
|
12
|
+
.clearfix
|
13
|
+
%ul.tree
|
14
|
+
%li.placeholder{ class: "#{ 'hidden' unless needs_placeholder?(root) }"}
|
15
|
+
= render partial: 'para/admin/resources/tree_item', collection: root.children.ordered, as: :root
|
16
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
.page-title
|
2
|
+
%h1= @component.name
|
3
|
+
|
4
|
+
.page-content-wrap
|
5
|
+
= para_form_for @settings, url: admin_settings_settings_form_path(@component) do |form|
|
6
|
+
= form.fieldset do
|
7
|
+
- @component.settings.each do |setting, type|
|
8
|
+
= form.settings_input setting, type: type
|
9
|
+
|
10
|
+
= form.actions
|
11
|
+
|
12
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
%ul.navigation-horizontal{ data: { header: true } }
|
2
|
+
%li.brand-logo
|
3
|
+
= link_to admin_path do
|
4
|
+
.hidden-sm.hidden-xs
|
5
|
+
= t('para.admin.title')
|
6
|
+
.visible-sm.visible-xs
|
7
|
+
%i.fa.fa-home
|
8
|
+
|
9
|
+
%li
|
10
|
+
= link_to root_path do
|
11
|
+
%i.fa.fa-long-arrow-left
|
12
|
+
%span.text-hidden
|
13
|
+
= t('para.admin.back_to_app')
|
14
|
+
|
15
|
+
%li.pull-right
|
16
|
+
%button.navbar-toggle.collapsed{ type: 'button', data: { toggle: 'collapse', target: '#menu-sidebar' } }
|
17
|
+
%span.sr-only
|
18
|
+
= t('para.admin.toggle_navigation')
|
19
|
+
%span.icon-bar
|
20
|
+
%span.icon-bar
|
21
|
+
%span.icon-bar
|
22
|
+
|
23
|
+
%li.pull-right
|
24
|
+
= link_to destroy_admin_user_session_path, method: :delete do
|
25
|
+
%i.fa.fa-power-off
|
26
|
+
%span.text-hidden
|
27
|
+
= t('para.admin.sign_out')
|
@@ -0,0 +1,21 @@
|
|
1
|
+
%ul.sidebar-navigation.collapse.navbar-collapse#menu-sidebar
|
2
|
+
%li.brand-logo
|
3
|
+
= link_to admin_path do
|
4
|
+
= t('para.admin.title')
|
5
|
+
|
6
|
+
- if @component_sections.any?
|
7
|
+
- @component_sections.each do |component_section|
|
8
|
+
%li.component-section-item
|
9
|
+
= link_to "#", class: 'component-section-title' do
|
10
|
+
= component_section.name
|
11
|
+
|
12
|
+
%ul.component-section-list-items
|
13
|
+
- component_section.components.each do |component|
|
14
|
+
- active = request.fullpath.split('/')[3] == component.slug
|
15
|
+
%li.component-item{ class: active && 'active' }
|
16
|
+
= link_to component.name, component.path
|
17
|
+
|
18
|
+
- else
|
19
|
+
%li.component-section-item
|
20
|
+
.component-section-title
|
21
|
+
= t('para.component.none_created')
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.nested-many-field{ class: ('orderable' if orderable) }
|
2
|
+
.fields-list{ id: dom_identifier }
|
3
|
+
= form.simple_fields_for attribute_name, resources, nested_attribute_name: attribute_name, orderable: orderable do |nested_form|
|
4
|
+
= render partial: 'para/inputs/nested_many_container', locals: { form: nested_form, model: model }
|
5
|
+
|
6
|
+
-# Add button
|
7
|
+
- if add_button
|
8
|
+
= link_to_add_association form, attribute_name, partial: 'para/inputs/nested_many_container', form_name: 'form', class: 'btn btn-primary', data: { :'association-insertion-node' => "##{ dom_identifier }", :'association-insertion-method' => 'append' }, render_options: { nested_attribute_name: attribute_name, orderable: orderable, locals: { model: model } } do
|
9
|
+
%i.fa.fa-plus
|
10
|
+
= t('para.form.nested.add')
|
@@ -0,0 +1,19 @@
|
|
1
|
+
.panel.panel-default.form-fields
|
2
|
+
.panel-heading
|
3
|
+
= form.reorder_anchor
|
4
|
+
|
5
|
+
%h3.panel-title
|
6
|
+
= link_to "##{ form.nested_resource_dom_id }", class: 'collapsed', data: { toggle: 'collapse', :'open-on-insert' => true } do
|
7
|
+
= form.nested_resource_name
|
8
|
+
%span.caret
|
9
|
+
|
10
|
+
%ul.panel-controls
|
11
|
+
%li
|
12
|
+
= form.remove_association_button
|
13
|
+
|
14
|
+
.clearfix
|
15
|
+
|
16
|
+
.panel-body.form-inputs.collapse{ id: form.nested_resource_dom_id }
|
17
|
+
= render partial: find_partial_for(model, :fields), locals: { form: form }
|
18
|
+
|
19
|
+
.clearfix
|