simple-admin 0.1.0.pre.alpha

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