para 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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