manage 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +7 -10
  3. data/app/assets/javascripts/manage/application.js +1 -2
  4. data/app/assets/stylesheets/manage/application.css.scss +1 -1
  5. data/app/controllers/manage/admin_users_controller.rb +12 -0
  6. data/app/controllers/manage/application_controller.rb +4 -10
  7. data/app/controllers/manage/resource_controller.rb +74 -0
  8. data/app/controllers/manage/sessions_controller.rb +8 -3
  9. data/app/helpers/manage/form_helper.rb +1 -1
  10. data/app/helpers/manage/resource_helper.rb +56 -0
  11. data/app/models/admin_user.rb +4 -0
  12. data/app/views/layouts/manage/_main_menu.html.slim +1 -5
  13. data/app/views/layouts/manage/sign_in.html.slim +13 -13
  14. data/app/views/manage/resource/_form.html.slim +3 -3
  15. data/app/views/manage/resource/index/_count.html.slim +6 -0
  16. data/app/views/manage/resource/index/_filters.html.slim +18 -7
  17. data/app/views/manage/resource/index/_table.html.slim +7 -5
  18. data/app/views/manage/resource/index.html.slim +3 -2
  19. data/app/views/{sessions → manage/sessions}/new.html.slim +2 -3
  20. data/config/initializers/devise.rb +247 -0
  21. data/config/initializers/session_store.rb +3 -0
  22. data/config/initializers/simple_form_foundation.rb +2 -0
  23. data/config/locales/devise.en.yml +59 -0
  24. data/config/routes.rb +6 -4
  25. data/db/migrate/20131204142720_create_admin_users.rb +24 -0
  26. data/lib/manage/engine.rb +16 -5
  27. data/lib/manage/fields/reader.rb +57 -0
  28. data/lib/manage/fields/searcher.rb +48 -0
  29. data/lib/manage/fields.rb +6 -0
  30. data/lib/manage/version.rb +1 -1
  31. data/lib/manage.rb +2 -0
  32. data/lib/tasks/manage_tasks.rake +11 -0
  33. data/lib/templates/erb/scaffold/_form.html.erb +1 -1
  34. data/spec/controllers/manage/resource_controller_spec.rb +29 -0
  35. data/spec/dummy/app/controllers/manage/posts_controller.rb +4 -0
  36. data/spec/dummy/app/models/post.rb +3 -0
  37. data/spec/dummy/app/models/user.rb +5 -0
  38. data/{test → spec}/dummy/config/application.rb +1 -0
  39. data/{test → spec}/dummy/config/database.yml +1 -1
  40. data/spec/dummy/config/routes.rb +10 -0
  41. data/spec/dummy/db/migrate/20130716083410_init_migration.rb +21 -0
  42. data/spec/dummy/db/schema.rb +53 -0
  43. data/spec/fields/reader_spec.rb +79 -0
  44. data/spec/spec_helper.rb +24 -0
  45. metadata +163 -104
  46. data/test/controllers/manage/resource_controller_test.rb +0 -9
  47. data/test/dummy/config/routes.rb +0 -4
  48. data/test/helpers/manage/resource_helper_test.rb +0 -6
  49. data/test/integration/navigation_test.rb +0 -10
  50. data/test/manage_test.rb +0 -7
  51. data/test/test_helper.rb +0 -15
  52. /data/{test → spec}/dummy/README.rdoc +0 -0
  53. /data/{test → spec}/dummy/Rakefile +0 -0
  54. /data/{test → spec}/dummy/app/assets/javascripts/application.js +0 -0
  55. /data/{test → spec}/dummy/app/assets/stylesheets/application.css +0 -0
  56. /data/{test → spec}/dummy/app/controllers/application_controller.rb +0 -0
  57. /data/{test → spec}/dummy/app/helpers/application_helper.rb +0 -0
  58. /data/{test → spec}/dummy/app/views/layouts/application.html.erb +0 -0
  59. /data/{test → spec}/dummy/bin/bundle +0 -0
  60. /data/{test → spec}/dummy/bin/rails +0 -0
  61. /data/{test → spec}/dummy/bin/rake +0 -0
  62. /data/{test → spec}/dummy/config/boot.rb +0 -0
  63. /data/{test → spec}/dummy/config/environment.rb +0 -0
  64. /data/{test → spec}/dummy/config/environments/development.rb +0 -0
  65. /data/{test → spec}/dummy/config/environments/production.rb +0 -0
  66. /data/{test → spec}/dummy/config/environments/test.rb +0 -0
  67. /data/{test → spec}/dummy/config/initializers/backtrace_silencers.rb +0 -0
  68. /data/{test → spec}/dummy/config/initializers/filter_parameter_logging.rb +0 -0
  69. /data/{test → spec}/dummy/config/initializers/inflections.rb +0 -0
  70. /data/{test → spec}/dummy/config/initializers/mime_types.rb +0 -0
  71. /data/{test → spec}/dummy/config/initializers/secret_token.rb +0 -0
  72. /data/{test → spec}/dummy/config/initializers/session_store.rb +0 -0
  73. /data/{test → spec}/dummy/config/initializers/wrap_parameters.rb +0 -0
  74. /data/{test → spec}/dummy/config/locales/en.yml +0 -0
  75. /data/{test → spec}/dummy/config.ru +0 -0
  76. /data/{test → spec}/dummy/public/404.html +0 -0
  77. /data/{test → spec}/dummy/public/422.html +0 -0
  78. /data/{test → spec}/dummy/public/500.html +0 -0
  79. /data/{test → spec}/dummy/public/favicon.ico +0 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b46432d4fd1f5036e85a8a0187d609e413bdc0d4
4
+ data.tar.gz: bb3c8fcb086a0c47ea700940da85e721df96e31a
5
+ SHA512:
6
+ metadata.gz: a07c1505b5592327ca8e7229de3f4601a245c1eaec0fe8e63f319e74456f91800b741e4b3f182a024e7aeb1f6273bc03ae1f3dacfe582c3e9e30d5bf8544aff5
7
+ data.tar.gz: 89c6e920b1dd516e29cca17a7246b334f6ef4129d81d2f3989c7efe52ba66cb6da3b131953cde16ba1e187ca62800eb42a3393d2abfc7c66e1a25d246c6f7c1c
data/Rakefile CHANGED
@@ -14,21 +14,18 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
18
  load 'rails/tasks/engine.rake'
19
19
 
20
20
 
21
-
22
21
  Bundler::GemHelper.install_tasks
23
22
 
24
- require 'rake/testtask'
23
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
25
24
 
26
- Rake::TestTask.new(:test) do |t|
27
- t.libs << 'lib'
28
- t.libs << 'test'
29
- t.pattern = 'test/**/*_test.rb'
30
- t.verbose = false
31
- end
25
+ require 'rspec/core'
26
+ require 'rspec/core/rake_task'
32
27
 
28
+ desc "Run all specs in spec directory (excluding plugin specs)"
29
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
33
30
 
34
- task default: :test
31
+ task default: :spec
@@ -1,4 +1,3 @@
1
1
  //= require jquery
2
- //= require jquery_ujs
3
2
  //= require foundation
4
- //= require manage/init
3
+ //= require manage/init
@@ -1,2 +1,2 @@
1
1
  @import "foundation";
2
- @import "manage/layout";
2
+ @import "manage/layout.css.scss";
@@ -1,3 +1,15 @@
1
1
  class Manage::AdminUsersController < Manage::ResourceController
2
+ index_fields :email, :sign_in_count, :current_sign_in_ip, :last_sign_in_ip
3
+ search_fields :email, :sign_in_count, :current_sign_in_ip, :last_sign_in_ip
4
+
5
+ def show
6
+ if params[:id] == 'sign_out'
7
+ signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
8
+ redirect_to '/manage/admin_users/sign_in'
9
+ return
10
+ end
11
+
12
+ super
13
+ end
2
14
 
3
15
  end
@@ -1,19 +1,13 @@
1
1
  class Manage::ApplicationController < ActionController::Base
2
- # before_filter :authenticate_admin_user!
3
- before_filter :authenticate_admin
2
+ before_filter :auth_user!
4
3
 
5
- def authenticate_admin
6
- authenticate_or_request_with_http_basic do |username, password|
7
- @current_user = AdminUser.where(email: username).first
8
- return request_http_basic_authentication if @current_user.blank?
9
- return request_http_basic_authentication unless @current_user.valid_password?(password)
10
- @current_user
11
- end
4
+ def auth_user!
5
+ redirect_to new_admin_user_session_path unless admin_user_signed_in?
12
6
  end
13
7
 
14
8
  helper_method :current_user
15
9
  def current_user
16
- @current_user
10
+ current_admin_user
17
11
  end
18
12
 
19
13
  end
@@ -12,6 +12,19 @@ class Manage::ResourceController < Manage::ApplicationController
12
12
 
13
13
  respond_to :html
14
14
 
15
+ helper_method :list_index_fields, :list_edit_fields, :list_search_fields, :list_action_links
16
+
17
+ def end_of_association_chain
18
+ if self.resources_configuration[:self][:search_fields].blank?
19
+ self.class.search_fields :all
20
+ end
21
+
22
+ config = self.resources_configuration[:self]
23
+ @search = config[:search].new(params[:f])
24
+
25
+ @search.results
26
+ end
27
+
15
28
  protected
16
29
  def collection
17
30
  assocation = end_of_association_chain.page(params[:page] || 1)
@@ -22,4 +35,65 @@ class Manage::ResourceController < Manage::ApplicationController
22
35
  params.permit!
23
36
  end
24
37
 
38
+ def self.index_fields(*fields)
39
+ setup_fields(:index_fields, *fields)
40
+ end
41
+
42
+ def self.edit_fields(*fields)
43
+ setup_fields(:edit_fields, *fields)
44
+ end
45
+
46
+ def self.search_fields(*fields)
47
+ setup_fields(:search_fields, *fields)
48
+
49
+ config = self.resources_configuration[:self]
50
+ config[:search] = Manage::Fields::Searcher.generate_search_object(resource_class, config[:search_fields])
51
+ end
52
+
53
+ def self.action_links(*fields)
54
+ setup_fields(:action_links, *fields)
55
+ end
56
+
57
+ def list_index_fields
58
+ list_fields(:index_fields)
59
+ end
60
+
61
+ def list_edit_fields
62
+ list_fields(:edit_fields)
63
+ end
64
+
65
+ def list_search_fields
66
+ list_fields(:search_fields)
67
+ end
68
+
69
+ def list_action_links
70
+ if self.resources_configuration[:self][:action_links].blank?
71
+ []
72
+ else
73
+ self.resources_configuration[:self][:action_links]
74
+ end
75
+ end
76
+
77
+ private
78
+ def self.setup_fields(key, *fields)
79
+ # :all means all the fields - default
80
+ if not fields.first.is_a?(Hash) and fields.first.to_sym == :all
81
+ options = fields.extract_options!
82
+ options[:except] ||= []
83
+ options[:include] ||= []
84
+
85
+ self.resources_configuration[:self][key] = (resource_class.attribute_names + Array(options[:include])) - Array(options[:except]).map(&:to_s)
86
+ else
87
+ self.resources_configuration[:self][key] = fields
88
+ end
89
+ end
90
+
91
+ def list_fields(key)
92
+ if self.resources_configuration[:self][key].blank?
93
+ resource_class.attribute_names - %w(id created_at updated_at)
94
+ else
95
+ self.resources_configuration[:self][key]
96
+ end
97
+ end
98
+
25
99
  end
@@ -1,6 +1,11 @@
1
- # class Devise::Users::SessionsController < Devise::SessionsController
2
- class Manage::SessionsController < ::Devise::SessionsController
3
- layout "manage/sign_in"
1
+ module Manage
2
+ class SessionsController < ::Devise::SessionsController
3
+ layout "manage/sign_in"
4
4
 
5
+ def destroy
6
+ p 'what?'
7
+ super
8
+ end
9
+ end
5
10
  end
6
11
 
@@ -17,4 +17,4 @@ module Manage
17
17
 
18
18
  end
19
19
 
20
- end
20
+ end
@@ -1,7 +1,63 @@
1
1
  module Manage
2
2
  module ResourceHelper
3
+ def index_fields
4
+ list_index_fields
5
+ end
6
+
7
+ def edit_fields
8
+ list_edit_fields
9
+ end
10
+
3
11
  def attributes
4
12
  resource_class.attribute_names - %w(id created_at updated_at)
5
13
  end
14
+
15
+ def field_value(scope, field_data)
16
+ Fields::Reader.field_value(scope, field_data).to_s
17
+ end
18
+
19
+ def field_title(resource_class, field_data)
20
+ Fields::Reader.field_title(resource_class, field_data)
21
+ end
22
+
23
+ def action_link(scope, link_data)
24
+ value = nil
25
+
26
+ if link_data.is_a? (Hash)
27
+ relation = link_data.keys.first
28
+ entity = Fields::Reader.field_value(scope, relation)
29
+ unless entity.present?
30
+ return ''
31
+ end
32
+ if link_data[relation][:label_field].present?
33
+ value = field_value(scope, link_data[relation][:label_field])
34
+ elsif link_data[relation][:label].present?
35
+ value = link_data[relation][:label]
36
+ end
37
+
38
+ path = entity.class.name.dasherize.pluralize.downcase
39
+ return link_to value, [scope.public_send(relation)]
40
+ end
41
+
42
+ if link_data.is_a? (Symbol) or link_data.is_a?(String)
43
+ relation = link_data.to_s
44
+ if scope.class.reflect_on_association(link_data.to_sym).options[:class_name].present?
45
+ rel_name = scope.class.reflect_on_association(link_data.to_sym).options[:class_name]
46
+ relation = rel_name.downcase.dasherize.pluralize
47
+ end
48
+ if scope.class.reflect_on_association(link_data.to_sym).options[:as].present?
49
+ key = scope.class.reflect_on_association(link_data.to_sym).options[:as].to_s + '_id'
50
+ else
51
+ key = scope.class.name.downcase.dasherize + '_id'
52
+ end
53
+ return "<a href=\"#{relation}?f%5B#{key}%5D=#{scope.id}\">#{resource_class.human_attribute_name(link_data.to_s)}</a>".html_safe
54
+ end
55
+
56
+ unless value
57
+ raise 'Unsupported link data'
58
+ end
59
+
60
+ end
61
+
6
62
  end
7
63
  end
@@ -0,0 +1,4 @@
1
+ class AdminUser < ActiveRecord::Base
2
+ devise :database_authenticatable, :registerable, :lockable, :timeoutable,
3
+ :recoverable, :rememberable, :trackable, :validatable
4
+ end
@@ -4,14 +4,10 @@ ul.right
4
4
  li.divider.hide-for-small
5
5
  li = link_to current_user.email, current_user
6
6
  li.divider.hide-for-small
7
- li = link_to City.model_name.human(count: 2), manage.cities_path
8
- li.divider.hide-for-small
9
7
  li = link_to 'users', users_path
10
8
  li.divider.hide-for-small
11
9
  li = link_to AdminUser.model_name.human(count:2), admin_users_path
12
10
  li.divider.hide-for-small
13
- li = link_to 'terms', main_app.about_us_pages_path
14
- li.divider.hide-for-small
15
11
  li.has-dropdown
16
12
  a href="#" Main Item 1
17
13
  ul.dropdown
@@ -53,4 +49,4 @@ ul.right
53
49
  li
54
50
  a href="#" Dropdown Level 1f
55
51
  li.has-form
56
- a.button href="http://foundation.zurb.com/docs" Sample button
52
+ a.button href="http://foundation.zurb.com/docs" Sample button
@@ -5,23 +5,23 @@ html
5
5
  title Manage
6
6
  = stylesheet_link_tag "manage/application", media: "all"
7
7
  = javascript_include_tag "vendor/custom.modernizr"
8
- = javascript_include_tag "manage/application"
9
8
  = csrf_meta_tags
10
9
 
11
- body class="#{controller.action_name} #{controller_path.gsub(/[-\/]/, '-')} simple" data-locale=I18n.locale
12
- row
10
+ body class="simple" data-locale=I18n.locale
11
+ section.main
13
12
  #flash
14
13
  - flash.each do |key, value|
15
14
  - key = 'info' if key == :notice
16
- .alert_wrapper data-dismiss="alert"
17
- div(class="alert alert-#{key} #{key}")
18
- button(type="button" class="close" data-dismiss="alert") &times;
19
- - if value.is_a?(Array)
20
- - value.each do |element|
21
- p #{element.html_safe}
22
- - else
23
- p #{value.html_safe}
24
- .clearfix
15
+ - key = 'alert' if key == :error
16
+ div data-alert="" class="alert-box #{key}"
17
+ - if value.is_a?(Array)
18
+ - value.each do |element|
19
+ p #{element.html_safe}
20
+ - elsif value.is_a?(String)
21
+ p #{value.html_safe}
22
+ a.close href="#" &times;
25
23
 
24
+ = yield
25
+
26
+ = javascript_include_tag "manage/application"
26
27
 
27
- = yield
@@ -1,4 +1,4 @@
1
1
  = manage_form_for [ resource ] do |f|
2
- - attributes.each do |attr|
3
- = f.input attr
4
- = f.submit class: 'button small'
2
+ - edit_fields.each do |field|
3
+ = f.input field
4
+ = f.submit class: 'button small'
@@ -0,0 +1,6 @@
1
+ .panel
2
+ dl.sub-nav
3
+ dt Count:
4
+ dd.active
5
+ = collection.total_count
6
+
@@ -1,11 +1,22 @@
1
- form
1
+ = manage_form_for @search, as: :f, method: :get, url: "#{resource_class.name.underscore.pluralize}", html: {id: 'search-form'} do |f|
2
2
  fieldset
3
3
  legend Filter
4
+ - list_search_fields.each do |field|
5
+ .row
6
+ .columns.large-12
7
+ - label_text = resource_class.human_attribute_name(field)
8
+ - if resource_class.columns_hash[field.to_s].blank?
9
+ label #{label_text}
10
+ = f.search_field field.to_sym, placeholder: label_text
11
+ - elsif resource_class.columns_hash[field.to_s].type == :datetime
12
+ label #{label_text}
13
+ = f.date_field field.to_sym, placeholder: label_text
14
+ - elsif resource_class.columns_hash[field.to_s].type == :integer
15
+ label #{label_text}
16
+ = f.number_field field.to_sym, placeholder: label_text
17
+ - else
18
+ label #{label_text}
19
+ = f.search_field field.to_sym, placeholder: label_text
4
20
  .row
5
21
  .columns.large-12
6
- label Name
7
- input type="text" placeholder="Name"
8
- .row
9
- .columns.large-12
10
- label City
11
- input type="text" placeholder="City"
22
+ = f.submit 'Search', class: 'button small'
@@ -1,16 +1,18 @@
1
1
  table
2
2
  thead
3
3
  tr
4
- - attributes.each do |attr|
5
- th= resource_class.human_attribute_name(attr)
4
+ - index_fields.each do |field_data|
5
+ th = field_title(resource_class, field_data)
6
6
  th = t('.actions')
7
7
  tbody
8
8
  - collection.each do |resource|
9
9
  tr
10
- - attributes.each do |attr|
11
- td = resource.public_send(attr).to_s
10
+ - index_fields.each do |field_data|
11
+ td = field_value(resource, field_data)
12
12
  td
13
13
  ul.inline-list
14
14
  li = link_to t('manage.actions.show'), [resource]
15
15
  li = link_to t('manage.actions.edit'), [:edit, resource]
16
- li = link_to t('manage.actions.destroy'), [resource], method: :delete, data: { confirm: t('manage.confirmations.Are you sure')}
16
+ li = link_to t('manage.actions.destroy'), [resource], method: :delete, data: { confirm: t('manage.confirmations.Are you sure')}
17
+ - list_action_links.each do |link_data|
18
+ li = action_link(resource, link_data)
@@ -5,8 +5,9 @@ nav
5
5
 
6
6
  .row
7
7
  .columns.large-9
8
- = render "manage/resource/index/table", attributes: attributes
8
+ = render "manage/resource/index/table", index_fields: index_fields
9
9
  .columns.large-3
10
10
  = render "manage/resource/index/filters"
11
11
 
12
- = paginate collection
12
+ = paginate collection
13
+ = render "manage/resource/index/count"
@@ -1,11 +1,10 @@
1
1
  h2 = t('.sign_in')
2
2
 
3
- = simple_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
3
+ = simple_form_for(resource, :as => resource_name, :url => admin_user_session_path) do |f|
4
4
  .form-inputs
5
5
  = f.input :email, :required => false, :autofocus => true
6
6
  = f.input :password, :required => false
7
7
  = f.input :remember_me, :as => :boolean if devise_mapping.rememberable?
8
8
  .form-actions
9
- = f.button :submit, t('devise.users.registrations.login')
9
+ = f.submit t('devise.users.registrations.login')
10
10
 
11
- = render "devise/users/shared/links"