simple-admin 0.1.0.pre.alpha

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 (139) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +17 -0
  5. data/.hound.yml +2 -0
  6. data/.inch.yml +4 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +68 -0
  9. data/.travis.yml +11 -0
  10. data/CODE_OF_CONDUCT.md +74 -0
  11. data/CONTRIBUTING.md +51 -0
  12. data/Gemfile +27 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +87 -0
  15. data/Rakefile +20 -0
  16. data/app/assets/fonts/Simple-Line-Icons.woff +0 -0
  17. data/app/assets/javascripts/simple_admin/application.js +28 -0
  18. data/app/assets/stylesheets/simple_admin/application.scss +48 -0
  19. data/app/assets/stylesheets/simple_admin/global/buttons.css +473 -0
  20. data/app/assets/stylesheets/simple_admin/global/errors.css +12 -0
  21. data/app/assets/stylesheets/simple_admin/global/fontawesome-icons.css +3024 -0
  22. data/app/assets/stylesheets/simple_admin/global/fonts.css +560 -0
  23. data/app/assets/stylesheets/simple_admin/global/jquery.dataTables.css +169 -0
  24. data/app/assets/stylesheets/simple_admin/global/pagination.css +11 -0
  25. data/app/assets/stylesheets/simple_admin/global/reset.css +197 -0
  26. data/app/assets/stylesheets/simple_admin/global/simple-line-icons.css +672 -0
  27. data/app/assets/stylesheets/simple_admin/global/table.css +214 -0
  28. data/app/assets/stylesheets/simple_admin/global/tags.css +87 -0
  29. data/app/assets/stylesheets/simple_admin/page/aside.css +324 -0
  30. data/app/assets/stylesheets/simple_admin/page/header.css +332 -0
  31. data/app/assets/stylesheets/simple_admin/page/main-container.css +222 -0
  32. data/app/assets/stylesheets/simple_admin/page/sign_in.css +15 -0
  33. data/app/assets/stylesheets/simple_admin/tabs.css +26 -0
  34. data/app/controllers/simple_admin/admin/application_controller.rb +21 -0
  35. data/app/controllers/simple_admin/admin/search_controller.rb +29 -0
  36. data/app/controllers/simple_admin/admin/system/entities_controller.rb +37 -0
  37. data/app/controllers/simple_admin/admin/system/entity_field_types_controller.rb +31 -0
  38. data/app/controllers/simple_admin/admin/system/entity_fields_controller.rb +20 -0
  39. data/app/helpers/simple_admin_helper.rb +15 -0
  40. data/app/models/simple_admin/base.rb +14 -0
  41. data/app/models/simple_admin/entity.rb +50 -0
  42. data/app/models/simple_admin/entity_field.rb +77 -0
  43. data/app/models/simple_admin/entity_field_setting.rb +5 -0
  44. data/app/models/simple_admin/entity_field_type.rb +79 -0
  45. data/app/views/kaminari/_next_page.html.erb +5 -0
  46. data/app/views/kaminari/_page.html.erb +3 -0
  47. data/app/views/kaminari/_paginator.html.erb +26 -0
  48. data/app/views/kaminari/_prev_page.html.erb +5 -0
  49. data/app/views/layouts/devise.html.erb +11 -0
  50. data/app/views/layouts/simple_admin.html.erb +28 -0
  51. data/app/views/simple_admin/admin/resource/_form.html.erb +19 -0
  52. data/app/views/simple_admin/admin/resource/edit.html.erb +21 -0
  53. data/app/views/simple_admin/admin/resource/index.html.erb +13 -0
  54. data/app/views/simple_admin/admin/resource/new.html.erb +21 -0
  55. data/app/views/simple_admin/admin/search/index.html.erb +55 -0
  56. data/app/views/simple_admin/admin/shared/_aside.html.erb +46 -0
  57. data/app/views/simple_admin/admin/shared/_footer.html.erb +5 -0
  58. data/app/views/simple_admin/admin/shared/_header.html.erb +7 -0
  59. data/app/views/simple_admin/admin/shared/collection/_header.html.erb +12 -0
  60. data/app/views/simple_admin/admin/shared/collection/_table_body.html.erb +29 -0
  61. data/app/views/simple_admin/admin/shared/collection/_table_header.html.erb +11 -0
  62. data/app/views/simple_admin/admin/shared/components/_logout.html.erb +6 -0
  63. data/app/views/simple_admin/admin/shared/components/_search.html.erb +14 -0
  64. data/app/views/simple_admin/admin/shared/messages/_errors.html.erb +9 -0
  65. data/app/views/simple_admin/admin/shared/messages/_flash.html.erb +8 -0
  66. data/app/views/simple_admin/admin/system/entities/_form.html.erb +32 -0
  67. data/app/views/simple_admin/admin/system/entities/edit.html.erb +27 -0
  68. data/app/views/simple_admin/admin/system/entities/entity_fields/_form.html.erb +62 -0
  69. data/app/views/simple_admin/admin/system/entities/entity_fields/edit.html.erb +9 -0
  70. data/app/views/simple_admin/admin/system/entities/entity_fields/index.html.erb +39 -0
  71. data/app/views/simple_admin/admin/system/entities/entity_fields/new.html.erb +12 -0
  72. data/app/views/simple_admin/admin/system/entities/index.html.erb +59 -0
  73. data/app/views/simple_admin/admin/system/entities/new.html.erb +21 -0
  74. data/app/views/simple_admin/admin/system/entity_field_types/_form.html.erb +21 -0
  75. data/app/views/simple_admin/admin/system/entity_field_types/edit.html.erb +24 -0
  76. data/app/views/simple_admin/admin/system/entity_field_types/index.html.erb +55 -0
  77. data/app/views/simple_admin/admin/system/entity_field_types/new.html.erb +21 -0
  78. data/app/views/simple_admin/admin/system/entity_fields/create.js.erb +18 -0
  79. data/app/views/simple_admin/admin/system/entity_fields/destroy.js.erb +18 -0
  80. data/app/views/simple_admin/admin/system/entity_fields/update.js.erb +1 -0
  81. data/app/views/simple_admin/fields/boolean/_form.html.erb +6 -0
  82. data/app/views/simple_admin/fields/boolean/_index.html.erb +5 -0
  83. data/app/views/simple_admin/fields/image/_collection.html.erb +5 -0
  84. data/app/views/simple_admin/fields/image/_form.html.erb +6 -0
  85. data/app/views/simple_admin/fields/number/_collection.html.erb +5 -0
  86. data/app/views/simple_admin/fields/number/_form.html.erb +6 -0
  87. data/app/views/simple_admin/fields/password/_form.html.erb +6 -0
  88. data/app/views/simple_admin/fields/relation/_collection.html.erb +3 -0
  89. data/app/views/simple_admin/fields/relation/_form.html.erb +6 -0
  90. data/app/views/simple_admin/fields/select/_form.html.erb +8 -0
  91. data/app/views/simple_admin/fields/select/_index.html.erb +5 -0
  92. data/app/views/simple_admin/fields/string/_collection.html.erb +3 -0
  93. data/app/views/simple_admin/fields/string/_form.html.erb +6 -0
  94. data/app/views/simple_admin/fields/tags/_collection.html.erb +3 -0
  95. data/app/views/simple_admin/fields/tags/_form.html.erb +6 -0
  96. data/app/views/simple_admin/fields/text/_collection.html.erb +3 -0
  97. data/app/views/simple_admin/fields/text/_form.html.erb +6 -0
  98. data/bin/bundle +4 -0
  99. data/bin/rails +5 -0
  100. data/codecov.yml +21 -0
  101. data/config/locales/en.yml +23 -0
  102. data/config/locales/ru.yml +20 -0
  103. data/config/routes.rb +19 -0
  104. data/lib/generators/simple_admin/install_generator.rb +41 -0
  105. data/lib/generators/simple_admin/migration_generator.rb +24 -0
  106. data/lib/generators/templates/application_controller.rb +20 -0
  107. data/lib/generators/templates/initializers/simple_admin.rb.erb +3 -0
  108. data/lib/generators/templates/migrations/core_data_migration.rb +12 -0
  109. data/lib/generators/templates/migrations/core_migrations/entities_migration.rb +13 -0
  110. data/lib/generators/templates/migrations/core_migrations/entity_field_settings_migration.rb +12 -0
  111. data/lib/generators/templates/migrations/core_migrations/entity_field_types_migration.rb +12 -0
  112. data/lib/generators/templates/migrations/core_migrations/entity_fields_migration.rb +18 -0
  113. data/lib/generators/templates/user.rb +24 -0
  114. data/lib/generators/templates/views/devise/registrations/new.html.erb +46 -0
  115. data/lib/generators/templates/views/devise/sessions/new.html.erb +35 -0
  116. data/lib/generators/templates/views/devise/shared/_footer.html.erb +3 -0
  117. data/lib/simple_admin.rb +39 -0
  118. data/lib/simple_admin/config.rb +19 -0
  119. data/lib/simple_admin/engine.rb +15 -0
  120. data/lib/simple_admin/helpers/boolean_helper.rb +36 -0
  121. data/lib/simple_admin/helpers/url_helper.rb +29 -0
  122. data/lib/simple_admin/refinements/boolean.rb +36 -0
  123. data/lib/simple_admin/resource_controller/actions_builder.rb +40 -0
  124. data/lib/simple_admin/resource_controller/controller_builder.rb +31 -0
  125. data/lib/simple_admin/resource_controller/crudify.rb +111 -0
  126. data/lib/simple_admin/resource_controller/crudify_dynamic_resource.rb +55 -0
  127. data/lib/simple_admin/resource_controller/dynamic_fields.rb +53 -0
  128. data/lib/simple_admin/search.rb +23 -0
  129. data/lib/simple_admin/version.rb +3 -0
  130. data/simple_admin.gemspec +38 -0
  131. data/vendor/assets/fonts/Simple-Line-Icons.eot +0 -0
  132. data/vendor/assets/fonts/Simple-Line-Icons.ttf +0 -0
  133. data/vendor/assets/fonts/Simple-Line-Icons.woff +0 -0
  134. data/vendor/assets/fonts/fontawesome-webfont.eot +0 -0
  135. data/vendor/assets/fonts/fontawesome-webfont.svg +2671 -0
  136. data/vendor/assets/fonts/fontawesome-webfont.ttf +0 -0
  137. data/vendor/assets/fonts/fontawesome-webfont.woff +0 -0
  138. data/vendor/assets/fonts/fontawesome-webfont.woff2 +0 -0
  139. metadata +307 -0
@@ -0,0 +1,36 @@
1
+ module SimpleAdmin
2
+ module Helpers
3
+ module BooleanHelper
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ using Refinements::Boolean
8
+
9
+ class << self
10
+ def boolean_fields(*model_column_names)
11
+ model_column_names.each do |column_name|
12
+ build_humanized_method!(column_name)
13
+ build_predicate_method!(column_name)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def build_humanized_method!(column_name)
20
+ postfix = :humanized
21
+
22
+ define_method "#{column_name}_#{postfix}" do
23
+ public_send(column_name).humanize
24
+ end
25
+ end
26
+
27
+ def build_predicate_method!(column_name)
28
+ define_method "#{column_name}?" do
29
+ public_send(column_name)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ module SimpleAdmin
2
+ module Helpers
3
+ module UrlHelper
4
+ def resource_link(resource, method, namespace=:admin)
5
+ singular_name = resource.class.model_name.element
6
+ plural_name = singular_name.pluralize
7
+
8
+ postfix = :path
9
+
10
+ case method
11
+ when :index
12
+ resource_path = "#{namespace}_#{plural_name}_#{postfix}"
13
+ when :new
14
+ resource_path = "#{method}_#{namespace}_#{singular_name}_#{postfix}"
15
+ when :create
16
+ resource_path = "#{namespace}_#{plural_name}_#{postfix}"
17
+ when :edit
18
+ resource_path = "#{method}_#{namespace}_#{singular_name}_#{postfix}"
19
+ when :update
20
+ resource_path = "#{namespace}_#{singular_name}_#{postfix}"
21
+ when :destroy
22
+ resource_path = "#{namespace}_#{singular_name}_#{postfix}"
23
+ end
24
+
25
+ public_send(resource_path, resource)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+ module SimpleAdmin
2
+ module Refinements
3
+ module Boolean
4
+ # Module with refinements for Boolean classes
5
+ # @since 0.1.0
6
+
7
+ refine TrueClass do
8
+ # Refinement for TrueClass, add humanize method
9
+ #
10
+ # @example True class humanize
11
+ # true.humanize
12
+ # => Yes
13
+ # true.humanize('Example')
14
+ # => Example
15
+ #
16
+ def humanize(format='Yes')
17
+ format
18
+ end
19
+ end
20
+
21
+ refine FalseClass do
22
+ # Refinement for FalseClass, add humanize method
23
+ #
24
+ # @example False class humanize
25
+ # false.humanize
26
+ # => No
27
+ # true.humanize('Example')
28
+ # => Example
29
+ #
30
+ def humanize(format='No')
31
+ format
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ module SimpleAdmin
2
+ module ResourceController
3
+ class ActionsBuilder
4
+ # Build CRUD actions for controller
5
+ #
6
+ # @since 0.1.0
7
+
8
+ def self.initialize_actions!(controller_klass, model_name)
9
+ controller_klass.class_eval do
10
+ include ResourceController::DynamicFields
11
+ include ResourceController::Crudify
12
+
13
+ include Helpers::UrlHelper
14
+
15
+ def after_create_path
16
+ resource_link(model_klass.new, :index)
17
+ end
18
+
19
+ def after_update_path
20
+ resource_link(model_klass.new, :index)
21
+ end
22
+
23
+ def after_destroy_path
24
+ resource_link(model_klass.new, :index)
25
+ end
26
+
27
+ define_method :model_klass do
28
+ model_name.constantize
29
+ end
30
+
31
+ private
32
+
33
+ def template_path(controller_action=nil)
34
+ "simple_admin/admin/resource/#{controller_action || params[:action]}"
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,31 @@
1
+ module SimpleAdmin
2
+ module ResourceController
3
+ class ControllerBuilder
4
+ # Build controller class by resource name
5
+ # @example ArticlesController
6
+ # controller_builder = SimpleAdmin::ResourceController::ControllerBuilder.new(:articles)
7
+ # controller_builder.build!
8
+ #
9
+ # => controller_builder.controller_klass
10
+ # => SimpleAdmin::Admin::ArticlesController
11
+ #
12
+ # @since 0.1.0
13
+
14
+ attr_reader :controller_name
15
+
16
+ def initialize(resource_name)
17
+ @controller_name = "#{resource_name.camelize}Controller"
18
+ end
19
+
20
+ def build!
21
+ unless SimpleAdmin::Admin.const_defined?(controller_name)
22
+ Admin.const_set(controller_name, Class.new(SimpleAdmin::Admin::ApplicationController))
23
+ end
24
+ end
25
+
26
+ def controller_klass
27
+ Admin.const_get(controller_name)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,111 @@
1
+ module SimpleAdmin
2
+ module ResourceController
3
+ module Crudify
4
+ # Concern that include all CRUD methods
5
+ #
6
+ # @example
7
+ # class PostsController
8
+ # include SimpleAdmin::ResourceController::Crudify
9
+ #
10
+ # def model_klass
11
+ # SimpleAdmin::Post
12
+ # end
13
+ #
14
+ # def after_create_path
15
+ # admin_posts_path
16
+ # end
17
+ #
18
+ # def after_update_path
19
+ # admin_posts_path
20
+ # end
21
+ #
22
+ # def after_destroy_path
23
+ # admin_posts_path
24
+ # end
25
+ #
26
+ # private
27
+ #
28
+ # def resource_params
29
+ # params.require(:simple_admin_post).permit(:title, :description)
30
+ # end
31
+ # end
32
+ #
33
+ # @since 0.1.0
34
+
35
+ extend ActiveSupport::Concern
36
+
37
+ included do
38
+ def index
39
+ @resources = model_klass.page(params[:page]).per(per_page)
40
+ @resource_name = resource_name
41
+
42
+ render template_path
43
+ end
44
+
45
+ def new
46
+ @resource = model_klass.new
47
+ @resource_name = resource_name
48
+
49
+ render template_path
50
+ end
51
+
52
+ def edit
53
+ @resource = model_klass.find(params[:id])
54
+ @resource_name = resource_name
55
+
56
+ render template_path
57
+ end
58
+
59
+ def update
60
+ @resource = model_klass.find(params[:id])
61
+
62
+ if @resource.update(resource_params)
63
+ redirect_to after_update_path, notice: t('simple_admin.resource.update.success', resource_name: resource_name)
64
+ else
65
+ render template: template_path(:edit)
66
+ end
67
+ end
68
+
69
+ def create
70
+ @resource =
71
+ if defined?(resource_modificator)
72
+ resource_modificator.build(resource_params)
73
+ else
74
+ model_klass.new(resource_params)
75
+ end
76
+
77
+ if @resource.save
78
+ redirect_to after_create_path, notice: t('simple_admin.resource.create.success', resource_name: resource_name)
79
+ else
80
+ render template: template_path(:new)
81
+ end
82
+ end
83
+
84
+ def destroy
85
+ @resource = model_klass.find(params[:id])
86
+ @resource.destroy
87
+
88
+ redirect_to after_destroy_path, notice: t('simple_admin.resource.destroy.success', resource_name: resource_name)
89
+ end
90
+
91
+ private
92
+
93
+ def resource_params
94
+ params.require(resource_params_name).permit(resource_attributes)
95
+ end
96
+
97
+ def resource_name
98
+ model_klass.model_name.element.capitalize
99
+ end
100
+
101
+ def template_path(controller_action=nil)
102
+ "#{params[:controller]}/#{controller_action || params[:action]}"
103
+ end
104
+
105
+ def per_page
106
+ SimpleAdmin::Config.per_page
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,55 @@
1
+ module SimpleAdmin
2
+ module ResourceController
3
+ module CrudifyDynamicResource
4
+ # Concern that include methods for remote actions
5
+ #
6
+ # @example
7
+ # class PostsController
8
+ # include SimpleAdmin::ResourceController::CrudifyDynamicResource
9
+ #
10
+ # def model_klass
11
+ # Post
12
+ # end
13
+ #
14
+ # private
15
+ #
16
+ # def resource_params
17
+ # params.require(:simple_admin_post).permit(:title, :description)
18
+ # end
19
+ # end
20
+ #
21
+ # @since 0.1.0
22
+
23
+ extend ActiveSupport::Concern
24
+
25
+ included do
26
+ def create
27
+ @resource = model_klass.new(resource_params)
28
+ @resource.save
29
+
30
+ respond_to do |format|
31
+ format.js { render layout: false }
32
+ end
33
+ end
34
+
35
+ def update
36
+ @resource = model_klass.find(params[:id])
37
+ @resource.update(resource_params)
38
+
39
+ respond_to do |format|
40
+ format.js { render layout: false }
41
+ end
42
+ end
43
+
44
+ def destroy
45
+ @resource = model_klass.find(params[:id])
46
+ @resource.destroy
47
+
48
+ respond_to do |format|
49
+ format.js { render layout: false }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,53 @@
1
+ module SimpleAdmin
2
+ module ResourceController
3
+ module DynamicFields
4
+ # Concern that include methods for getting entity and entity fields
5
+ # Working together with ResourceCrud
6
+ # @example PostsController with ResourceCrud and ResourceFields
7
+ # class PostsController
8
+ # include ResourceController::Crudify
9
+ # include SimpleAdmin::ResourceFields
10
+ #
11
+ # ...
12
+ # end
13
+ # @since 0.1.0
14
+
15
+ extend ActiveSupport::Concern
16
+
17
+ included do
18
+ before_action :initialize_fields_entities!
19
+
20
+ # Receives entity and entity fields by model class and field_presentation
21
+ #
22
+ # @since 0.1.0
23
+ def initialize_fields_entities!
24
+ @entity = SimpleAdmin::Entity.find_by(model_klass_name: model_klass.to_s)
25
+ @entity_fields = @entity.entity_fields.where(presentation: field_presentation)
26
+ end
27
+
28
+ private
29
+
30
+ def field_presentation
31
+ case params[:action]
32
+ when 'index'
33
+ :collection
34
+ when 'new'
35
+ :form
36
+ when 'create'
37
+ :form
38
+ when 'edit'
39
+ :form
40
+ end
41
+ end
42
+
43
+ def resource_params_name
44
+ model_klass.model_name.singular
45
+ end
46
+
47
+ def resource_attributes
48
+ SimpleAdmin::Entity.form_attributes(model_klass)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,23 @@
1
+ module SimpleAdmin
2
+ class Search
3
+ attr_reader :search_query, :resource_klass, :model_attributes
4
+
5
+ def initialize(search_query, resource_klass)
6
+ @search_query = search_query
7
+ @resource_klass = resource_klass
8
+
9
+ @model_attributes = SimpleAdmin::EntityField.joins(:entity)
10
+ .where(simple_admin_entities: { model_klass_name: resource_klass.to_s })
11
+ .search_indexable_columns
12
+ end
13
+
14
+ def process
15
+ return [] if model_attributes.empty?
16
+
17
+ query = model_attributes.map { |model_attribute| "#{model_attribute} LIKE ?" }.join(' OR ')
18
+ query_arguments = model_attributes.map { "%#{search_query}%" }
19
+
20
+ resource_klass.where(query, *query_arguments)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module SimpleAdmin
2
+ VERSION = '0.1.0-alpha'.freeze
3
+ end
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'simple_admin/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'simple-admin'
10
+ spec.version = SimpleAdmin::VERSION
11
+ spec.authors = ['Dmitriy Strukov']
12
+ spec.email = ['dmitiry_strukov2011@mail.ru']
13
+
14
+ spec.summary = 'simple-admin'
15
+ spec.description = 'simple-admin'
16
+ spec.homepage = 'https://evil-raccoon.github.io/'
17
+ spec.license = 'MIT'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+
23
+ spec.bindir = 'exe'
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ['lib']
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.15'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.0'
30
+
31
+ spec.add_development_dependency 'actionpack'
32
+ spec.add_development_dependency 'actionview'
33
+ spec.add_development_dependency 'activerecord'
34
+
35
+ spec.add_dependency 'bootstrap-sass'
36
+ spec.add_dependency 'jquery-ui-rails'
37
+ spec.add_dependency 'kaminari'
38
+ end