para 0.4.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 (203) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +65 -0
  4. data/Rakefile +21 -0
  5. data/app/assets/images/para/admin/bg.png +0 -0
  6. data/app/assets/javascripts/admin/app.coffee +1 -0
  7. data/app/assets/javascripts/para/admin/table.coffee +46 -0
  8. data/app/assets/javascripts/para/admin/theme_actions.coffee +26 -0
  9. data/app/assets/javascripts/para/admin/tree.coffee +53 -0
  10. data/app/assets/javascripts/para/admin.coffee +18 -0
  11. data/app/assets/javascripts/para/application.js +13 -0
  12. data/app/assets/javascripts/para/inputs/nested_many.coffee +57 -0
  13. data/app/assets/javascripts/para/lib/ajax.coffee +11 -0
  14. data/app/assets/stylesheets/admin/app.sass +0 -0
  15. data/app/assets/stylesheets/admin/theme.sass +0 -0
  16. data/app/assets/stylesheets/para/admin/theme/_base.sass +170 -0
  17. data/app/assets/stylesheets/para/admin/theme/_breadcrumb.sass +29 -0
  18. data/app/assets/stylesheets/para/admin/theme/_buttons.sass +24 -0
  19. data/app/assets/stylesheets/para/admin/theme/_checkable.sass +107 -0
  20. data/app/assets/stylesheets/para/admin/theme/_commonds.sass +213 -0
  21. data/app/assets/stylesheets/para/admin/theme/_dropdown.sass +53 -0
  22. data/app/assets/stylesheets/para/admin/theme/_form.sass +141 -0
  23. data/app/assets/stylesheets/para/admin/theme/_list.sass +138 -0
  24. data/app/assets/stylesheets/para/admin/theme/_navigation.sass +287 -0
  25. data/app/assets/stylesheets/para/admin/theme/_navtabs.sass +127 -0
  26. data/app/assets/stylesheets/para/admin/theme/_orderable.sass +44 -0
  27. data/app/assets/stylesheets/para/admin/theme/_panel.sass +288 -0
  28. data/app/assets/stylesheets/para/admin/theme/_responsive.sass +123 -0
  29. data/app/assets/stylesheets/para/admin/theme/_sorting.sass +30 -0
  30. data/app/assets/stylesheets/para/admin/theme/_table.sass +24 -0
  31. data/app/assets/stylesheets/para/admin/theme/_tree.sass +74 -0
  32. data/app/assets/stylesheets/para/admin/theme/_variables.sass +31 -0
  33. data/app/assets/stylesheets/para/admin/theme.sass +22 -0
  34. data/app/assets/stylesheets/para/admin.sass +10 -0
  35. data/app/assets/stylesheets/para/application.css +15 -0
  36. data/app/assets/stylesheets/para/lib/_variables.scss +646 -0
  37. data/app/assets/stylesheets/para/overrides/datetimepicker.sass +17 -0
  38. data/app/assets/stylesheets/para/overrides/fuelux.sass +43 -0
  39. data/app/assets/stylesheets/para/overrides/jasny.bootstrap.sass +41 -0
  40. data/app/assets/stylesheets/para/overrides/redactor.sass +88 -0
  41. data/app/assets/stylesheets/para/overrides/responsive.sass +63 -0
  42. data/app/assets/stylesheets/para/overrides/selectize.sass +45 -0
  43. data/app/assets/stylesheets/para/overrides/slider.sass +13 -0
  44. data/app/assets/stylesheets/para/overrides/theme.sass +172 -0
  45. data/app/controllers/concerns/para/admin/resource_controller_concerns.rb +17 -0
  46. data/app/controllers/para/admin/base_controller.rb +46 -0
  47. data/app/controllers/para/admin/component_controller.rb +9 -0
  48. data/app/controllers/para/admin/crud_component_controller.rb +17 -0
  49. data/app/controllers/para/admin/crud_resources_controller.rb +71 -0
  50. data/app/controllers/para/admin/main_controller.rb +8 -0
  51. data/app/controllers/para/admin/resources_controller.rb +163 -0
  52. data/app/controllers/para/admin/settings_component_controller.rb +11 -0
  53. data/app/controllers/para/admin/settings_form_controller.rb +21 -0
  54. data/app/controllers/para/admin/singleton_resource_component_controller.rb +14 -0
  55. data/app/controllers/para/admin/singleton_resources_controller.rb +30 -0
  56. data/app/controllers/para/application_controller.rb +7 -0
  57. data/app/decorators/para/component/base_decorator.rb +48 -0
  58. data/app/decorators/para/component/crud_decorator.rb +32 -0
  59. data/app/decorators/para/component/settings_decorator.rb +11 -0
  60. data/app/decorators/para/component/singleton_resource_decorator.rb +11 -0
  61. data/app/decorators/para/component_section_decorator.rb +4 -0
  62. data/app/helpers/para/admin/base_helper.rb +57 -0
  63. data/app/helpers/para/admin/component_groups_helper.rb +4 -0
  64. data/app/helpers/para/admin/components_helper.rb +4 -0
  65. data/app/helpers/para/admin/resources_helper.rb +27 -0
  66. data/app/helpers/para/application_helper.rb +14 -0
  67. data/app/helpers/para/exports_helper.rb +11 -0
  68. data/app/helpers/para/flash_helper.rb +48 -0
  69. data/app/helpers/para/form_helper.rb +28 -0
  70. data/app/helpers/para/markup_helper.rb +15 -0
  71. data/app/helpers/para/model_helper.rb +38 -0
  72. data/app/helpers/para/navigation_helper.rb +8 -0
  73. data/app/helpers/para/ordering_helper.rb +20 -0
  74. data/app/helpers/para/search_helper.rb +22 -0
  75. data/app/helpers/para/tag_helper.rb +50 -0
  76. data/app/helpers/para/tree_helper.rb +41 -0
  77. data/app/models/para/component/base.rb +70 -0
  78. data/app/models/para/component/crud.rb +45 -0
  79. data/app/models/para/component/resource.rb +33 -0
  80. data/app/models/para/component/settings.rb +17 -0
  81. data/app/models/para/component/singleton_resource.rb +25 -0
  82. data/app/models/para/component_resource.rb +6 -0
  83. data/app/models/para/component_section.rb +18 -0
  84. data/app/views/layouts/para/admin.html.haml +32 -0
  85. data/app/views/layouts/para/application.html.erb +14 -0
  86. data/app/views/para/admin/component_sections/_form.html.haml +10 -0
  87. data/app/views/para/admin/component_sections/edit.html.haml +5 -0
  88. data/app/views/para/admin/component_sections/new.html.haml +5 -0
  89. data/app/views/para/admin/components/_form.html.haml +15 -0
  90. data/app/views/para/admin/components/new.html.haml +4 -0
  91. data/app/views/para/admin/crud_component/show.html.haml +4 -0
  92. data/app/views/para/admin/dashboard.html.haml +10 -0
  93. data/app/views/para/admin/main/index.html.haml +1 -0
  94. data/app/views/para/admin/resources/_exports_menu.html.haml +12 -0
  95. data/app/views/para/admin/resources/_fields.html.haml +5 -0
  96. data/app/views/para/admin/resources/_filters.html.haml +9 -0
  97. data/app/views/para/admin/resources/_form.html.haml +6 -0
  98. data/app/views/para/admin/resources/_list.html.haml +22 -0
  99. data/app/views/para/admin/resources/_table.html.haml +8 -0
  100. data/app/views/para/admin/resources/_tree.html.haml +15 -0
  101. data/app/views/para/admin/resources/_tree_item.html.haml +16 -0
  102. data/app/views/para/admin/resources/edit.html.haml +6 -0
  103. data/app/views/para/admin/resources/new.html.haml +6 -0
  104. data/app/views/para/admin/settings_component/show.html.haml +12 -0
  105. data/app/views/para/admin/shared/_breadcrumb.html.haml +3 -0
  106. data/app/views/para/admin/shared/_header.html.haml +27 -0
  107. data/app/views/para/admin/shared/_navigation.html.haml +21 -0
  108. data/app/views/para/admin/singleton_resource_component/show.html.haml +5 -0
  109. data/app/views/para/inputs/_nested_many.html.haml +10 -0
  110. data/app/views/para/inputs/_nested_many_container.html.haml +19 -0
  111. data/app/views/para/inputs/_nested_one.html.haml +3 -0
  112. data/config/locales/en.yml +86 -0
  113. data/config/locales/fr.yml +101 -0
  114. data/db/migrate/20140911091225_create_para_components.rb +19 -0
  115. data/db/migrate/20140911112150_add_slug_to_para_components.rb +6 -0
  116. data/db/migrate/20140929125733_create_para_component_sections.rb +8 -0
  117. data/db/migrate/20140929131111_add_identifier_to_para_component_sections.rb +5 -0
  118. data/db/migrate/20140930121822_add_position_to_para_component_section.rb +5 -0
  119. data/db/migrate/20150129170710_create_para_component_resources.rb +13 -0
  120. data/db/migrate/20150203173219_add_identifier_to_para_components.rb +5 -0
  121. data/lib/generators/para/admin_user/admin_user_generator.rb +16 -0
  122. data/lib/generators/para/component/component_generator.rb +59 -0
  123. data/lib/generators/para/component/templates/component.rb +3 -0
  124. data/lib/generators/para/component/templates/component_controller.rb +7 -0
  125. data/lib/generators/para/component/templates/show.html.haml +2 -0
  126. data/lib/generators/para/exporter/exporter_generator.rb +42 -0
  127. data/lib/generators/para/exporter/templates/base_exporter.rb +15 -0
  128. data/lib/generators/para/exporter/templates/csv_exporter.rb +13 -0
  129. data/lib/generators/para/form/form_generator.rb +15 -0
  130. data/lib/generators/para/form/templates/_form.html.haml +7 -0
  131. data/lib/generators/para/install/install_generator.rb +112 -0
  132. data/lib/generators/para/install/templates/components.rb +13 -0
  133. data/lib/generators/para/install/templates/initializer.rb +23 -0
  134. data/lib/generators/para/nested_fields/nested_fields_generator.rb +15 -0
  135. data/lib/generators/para/nested_fields/templates/_nested_fields.html.haml +3 -0
  136. data/lib/generators/para/orderable/orderable_generator.rb +53 -0
  137. data/lib/generators/para/orderable/templates/orderable_migration.rb +6 -0
  138. data/lib/generators/para/resource/resource_generator.rb +71 -0
  139. data/lib/generators/para/resource/templates/resource_controller.rb +5 -0
  140. data/lib/generators/para/table/table_generator.rb +34 -0
  141. data/lib/generators/para/table/templates/_table.html.haml +10 -0
  142. data/lib/para/attribute_field/base.rb +77 -0
  143. data/lib/para/attribute_field/belongs_to.rb +29 -0
  144. data/lib/para/attribute_field/boolean.rb +15 -0
  145. data/lib/para/attribute_field/datetime.rb +9 -0
  146. data/lib/para/attribute_field/file.rb +20 -0
  147. data/lib/para/attribute_field/has_many.rb +31 -0
  148. data/lib/para/attribute_field/image.rb +25 -0
  149. data/lib/para/attribute_field/nested_many.rb +26 -0
  150. data/lib/para/attribute_field/nested_one.rb +27 -0
  151. data/lib/para/attribute_field/password.rb +18 -0
  152. data/lib/para/attribute_field/redactor.rb +20 -0
  153. data/lib/para/attribute_field/relation.rb +52 -0
  154. data/lib/para/attribute_field/translation.rb +9 -0
  155. data/lib/para/attribute_field_mappings.rb +82 -0
  156. data/lib/para/cloneable.rb +20 -0
  157. data/lib/para/component/exportable.rb +25 -0
  158. data/lib/para/component.rb +27 -0
  159. data/lib/para/components_configuration.rb +156 -0
  160. data/lib/para/config.rb +21 -0
  161. data/lib/para/engine.rb +59 -0
  162. data/lib/para/errors.rb +15 -0
  163. data/lib/para/exporter/base.rb +27 -0
  164. data/lib/para/exporter/csv.rb +49 -0
  165. data/lib/para/exporter.rb +57 -0
  166. data/lib/para/ext/cancan.rb +26 -0
  167. data/lib/para/ext/paperclip.rb +67 -0
  168. data/lib/para/ext.rb +13 -0
  169. data/lib/para/form_builder/containers.rb +70 -0
  170. data/lib/para/form_builder/field_mappings.rb +9 -0
  171. data/lib/para/form_builder/nested_form.rb +80 -0
  172. data/lib/para/form_builder/ordering.rb +15 -0
  173. data/lib/para/form_builder/settings.rb +24 -0
  174. data/lib/para/form_builder.rb +22 -0
  175. data/lib/para/generators/field_helpers.rb +32 -0
  176. data/lib/para/generators/name_helpers.rb +9 -0
  177. data/lib/para/generators/named_base.rb +7 -0
  178. data/lib/para/generators.rb +11 -0
  179. data/lib/para/inputs/nested_many_input.rb +40 -0
  180. data/lib/para/inputs/nested_one_input.rb +24 -0
  181. data/lib/para/inputs.rb +11 -0
  182. data/lib/para/markup/alert.rb +37 -0
  183. data/lib/para/markup/component.rb +20 -0
  184. data/lib/para/markup/modal.rb +52 -0
  185. data/lib/para/markup/panel.rb +41 -0
  186. data/lib/para/markup/resources_table.rb +178 -0
  187. data/lib/para/markup.rb +10 -0
  188. data/lib/para/model_field_parsers/base.rb +20 -0
  189. data/lib/para/model_field_parsers/devise.rb +37 -0
  190. data/lib/para/model_field_parsers/globalize.rb +23 -0
  191. data/lib/para/model_field_parsers/orderable.rb +15 -0
  192. data/lib/para/model_field_parsers/paperclip.rb +51 -0
  193. data/lib/para/model_field_parsers/redactor.rb +19 -0
  194. data/lib/para/model_field_parsers/relations.rb +67 -0
  195. data/lib/para/model_field_parsers.rb +22 -0
  196. data/lib/para/orderable.rb +44 -0
  197. data/lib/para/routes.rb +49 -0
  198. data/lib/para/version.rb +3 -0
  199. data/lib/para.rb +65 -0
  200. data/lib/rails/relation_length_validator.rb +45 -0
  201. data/lib/rails/routing_mapper.rb +27 -0
  202. data/lib/tasks/para_tasks.rake +22 -0
  203. 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,6 @@
1
+ module Para
2
+ class ComponentResource < ActiveRecord::Base
3
+ belongs_to :component, class_name: 'Para::Component::Base'
4
+ belongs_to :resource, polymorphic: true
5
+ end
6
+ 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,5 @@
1
+ .page-title
2
+ %h1
3
+ = resource_title_for(@component_section)
4
+
5
+ = render partial: 'form'
@@ -0,0 +1,5 @@
1
+ .page-title
2
+ %h1
3
+ = t('para.form.shared.new.title', model: @component_section.class.model_name.human)
4
+
5
+ = render partial: 'form'
@@ -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,4 @@
1
+ .page-title
2
+ %h1= t('para.form.shared.new.title', model: @component.class.model_name.human)
3
+
4
+ = render partial: 'form'
@@ -0,0 +1,4 @@
1
+ .page-title
2
+ %h1= @component.name
3
+
4
+ = listing_for(@resources)
@@ -0,0 +1,10 @@
1
+ .page-title
2
+ %h1
3
+ Dashboard
4
+ .page-content-wrap
5
+ .row
6
+ .col-md-12
7
+ .panel.panel-default
8
+ .panel-body
9
+ %p Override the dashboard view by Creating a view at :
10
+ %pre app/views/admin/dashboard.html.(haml|erb)
@@ -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,5 @@
1
+ - form.nested_fields.each do |field|
2
+ - if field.field_type
3
+ = form.send(field.field_method, field.field_name, as: field.field_type)
4
+ - else
5
+ = form.send(field.field_method, field.field_name)
@@ -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,6 @@
1
+ = para_form_for(resource) do |form|
2
+ = form.fieldset do
3
+ - model_field_mappings(resource.class).fields.each do |field|
4
+ = form.send(field.field_method, field.field_name, field.field_options)
5
+
6
+ = form.actions
@@ -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,8 @@
1
+ = resources_table(model: model, component: component) do |table|
2
+ = table.header do
3
+ - attributes.each do |field|
4
+ = table.header_for(field.name)
5
+
6
+ = table.rows(resources) do |resource|
7
+ - attributes.each do |field|
8
+ = table.data_for(resource, field.name)
@@ -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,6 @@
1
+ .page-title
2
+ %h1
3
+ = resource_title_for(resource)
4
+
5
+ .page-content-wrap
6
+ = render find_partial_for(resource, :form)
@@ -0,0 +1,6 @@
1
+ .page-title
2
+ %h1
3
+ = t('para.form.shared.new.title', model: resource.class.model_name.human)
4
+
5
+ .page-content-wrap
6
+ = render find_partial_for(resource, :form)
@@ -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,3 @@
1
+ %ul.breadcrumb
2
+ %li
3
+ = link_to "Acceuil", admin_path
@@ -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,5 @@
1
+ .page-title
2
+ %h1= @component.name
3
+
4
+ .page-content-wrap
5
+ = render find_partial_for(resource, :form)
@@ -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