carload 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +125 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/carload_manifest.js +2 -0
  6. data/app/assets/javascripts/carload/application.js +5 -0
  7. data/app/assets/javascripts/carload/dashboard.js +12 -0
  8. data/app/assets/stylesheets/carload/_select2.scss +13 -0
  9. data/app/assets/stylesheets/carload/application.scss +25 -0
  10. data/app/assets/stylesheets/carload/colors.scss +2 -0
  11. data/app/assets/stylesheets/carload/common.scss +77 -0
  12. data/app/assets/stylesheets/carload/dashboard.scss +82 -0
  13. data/app/assets/stylesheets/carload/error.scss +4 -0
  14. data/app/controllers/carload/application_controller.rb +21 -0
  15. data/app/controllers/carload/dashboard_controller.rb +85 -0
  16. data/app/controllers/carload/errors_controller.rb +21 -0
  17. data/app/helpers/carload/application_helper.rb +4 -0
  18. data/app/helpers/carload/dashboard_helper.rb +30 -0
  19. data/app/jobs/carload/application_job.rb +4 -0
  20. data/app/mailers/carload/application_mailer.rb +6 -0
  21. data/app/models/carload/application_record.rb +5 -0
  22. data/app/policies/application_policy.rb +53 -0
  23. data/app/policies/dashboard_policy.rb +21 -0
  24. data/app/views/carload/dashboard/_form.html.erb +7 -0
  25. data/app/views/carload/dashboard/edit.html.erb +12 -0
  26. data/app/views/carload/dashboard/index.html.erb +46 -0
  27. data/app/views/carload/dashboard/new.html.erb +12 -0
  28. data/app/views/carload/dashboard/shared/_index_buttons.html.erb +3 -0
  29. data/app/views/carload/dashboard/shared/_search_fields.html.erb +11 -0
  30. data/app/views/carload/errors/dashboard_error.html.erb +8 -0
  31. data/app/views/carload/errors/unauthorized_error.html.erb +8 -0
  32. data/app/views/kaminari/_first_page.html.erb +3 -0
  33. data/app/views/kaminari/_gap.html.erb +3 -0
  34. data/app/views/kaminari/_last_page.html.erb +3 -0
  35. data/app/views/kaminari/_next_page.html.erb +3 -0
  36. data/app/views/kaminari/_page.html.erb +9 -0
  37. data/app/views/kaminari/_paginator.html.erb +15 -0
  38. data/app/views/kaminari/_prev_page.html.erb +3 -0
  39. data/app/views/layouts/carload/application.html.erb +20 -0
  40. data/app/views/layouts/carload/dashboard.html.erb +32 -0
  41. data/config/initializers/assets.rb +1 -0
  42. data/config/initializers/simple_form.rb +165 -0
  43. data/config/initializers/simple_form_bootstrap.rb +149 -0
  44. data/config/locales/en.yml +37 -0
  45. data/config/locales/simple_form.en.yml +31 -0
  46. data/config/locales/zh-CN.yml +37 -0
  47. data/config/routes.rb +16 -0
  48. data/lib/carload/dashboard.rb +47 -0
  49. data/lib/carload/engine.rb +12 -0
  50. data/lib/carload/exceptions.rb +17 -0
  51. data/lib/carload/extended_hash.rb +12 -0
  52. data/lib/carload/version.rb +3 -0
  53. data/lib/carload.rb +27 -0
  54. data/lib/generators/carload/USAGE +15 -0
  55. data/lib/generators/carload/install_generator.rb +30 -0
  56. data/lib/generators/carload/templates/carload.rb +18 -0
  57. data/lib/generators/carload/templates/dashboard.rb +19 -0
  58. data/lib/tasks/carload_tasks.rake +4 -0
  59. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  60. metadata +277 -0
@@ -0,0 +1,47 @@
1
+ module Carload
2
+ class Dashboard
3
+ class ModelSpec
4
+ attr_accessor :default, :attributes, :index_page, :associated_models
5
+
6
+ def initialize
7
+ @default = false
8
+ @attributes = ExtendedHash.new
9
+ @index_page = ExtendedHash.new
10
+ @index_page[:shows] = ExtendedHash.new
11
+ @index_page[:searches] = ExtendedHash.new
12
+ @associated_models = {}
13
+ end
14
+ end
15
+
16
+ class << self
17
+ def model name, &block
18
+ if block_given?
19
+ @@models ||= {}
20
+ spec = ModelSpec.new
21
+ yield spec
22
+ @@models[name] = spec
23
+ else
24
+ @@models[name]
25
+ end
26
+ end
27
+
28
+ def associate args
29
+ model_a = args.keys.first
30
+ model_b = args.values.first
31
+ @@models[model_a].associated_models[model_b] = args[:choose_by]
32
+ @@models[model_b].associated_models[model_a] = nil
33
+ end
34
+
35
+ def models
36
+ @@models ||= {}
37
+ end
38
+
39
+ def default_model
40
+ return @@default_model if defined? @@default_model
41
+ @@models.each do |name, spec|
42
+ return @@default_model = name if spec.default
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,12 @@
1
+ module Carload
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Carload
4
+
5
+ initializer :set_autoload_paths do |app|
6
+ # Load dashboard.rb in app.
7
+ Dir.glob("#{app.root}/app/carload/*.rb").each do |file|
8
+ require_dependency file
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module Carload
2
+ class Error < StandardError
3
+ attr_reader :message
4
+ end
5
+
6
+ class UnmanagedModelError < Error
7
+ def initialize data
8
+ @message = I18n.t('carload.error.message.unmanaged_model', model: data)
9
+ end
10
+ end
11
+
12
+ class UnsupportedError < Error
13
+ def initialize data
14
+ @message = "Carload does not support #{data} currently."
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ module Carload
2
+ class ExtendedHash < Hash
3
+ def method_missing method, *args, &block
4
+ key = method.to_s.gsub('=', '').to_sym
5
+ if method.to_s =~ /=$/
6
+ self[key] = args.first
7
+ else
8
+ self[key]
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module Carload
2
+ VERSION = '0.1.0'
3
+ end
data/lib/carload.rb ADDED
@@ -0,0 +1,27 @@
1
+ # Require all dependencies (Rails does not do this for us in default).
2
+ Gem.loaded_specs['carload'].dependencies.each do |dependency|
3
+ require dependency.name
4
+ end
5
+
6
+ require 'carload/extended_hash'
7
+ require 'carload/dashboard'
8
+ require 'carload/engine'
9
+ require 'carload/exceptions'
10
+
11
+ module Carload
12
+ def self.setup &block
13
+ @@config = ExtendedHash.new
14
+ @@config[:dashboard] = ExtendedHash.new
15
+ @@config[:dashboard][:permits_user] = ExtendedHash.new
16
+ yield @@config
17
+ if not [:devise, :none].include? @@config[:auth_solution]
18
+ raise UnsupportedError.new("authentication solution #{@@config[:auth_solution]}")
19
+ end
20
+
21
+ @@config.each do |key, value|
22
+ define_singleton_method key do
23
+ value
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ Description:
2
+ Mount Carload routes.
3
+
4
+ Copy initializer and dashboard template files.
5
+
6
+ Example:
7
+ rails generate carload:install
8
+
9
+ This will modify:
10
+ config/routes.rb
11
+ config/application.rb
12
+
13
+ This will create:
14
+ config/initializers/carload.rb
15
+ app/carload/dashboard.rb
@@ -0,0 +1,30 @@
1
+ module Carload
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../templates', __FILE__)
4
+
5
+ def mount_routes
6
+ return if File.read('config/routes.rb').include? 'mount Carload::Engine'
7
+ inject_into_file 'config/routes.rb', after: "Rails.application.routes.draw do\n" do <<-RUBY
8
+ mount Carload::Engine => '/carload'
9
+ RUBY
10
+ end
11
+ end
12
+
13
+ def add_require
14
+ return if File.read('config/application.rb') =~ /require ['|"]carload['|"]/
15
+ inject_into_file 'config/application.rb', after: "Bundler.require(*Rails.groups)\n" do <<-RUBY
16
+ require 'carload'
17
+ RUBY
18
+ end
19
+ end
20
+
21
+ def copy_initializer
22
+ return if File.exist? 'config/initializers/carload.rb'
23
+ copy_file 'carload.rb', 'config/initializers/carload.rb'
24
+ end
25
+
26
+ def copy_dashboard_file
27
+ copy_file 'dashboard.rb', 'app/carload/dashboard.rb'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ Carload.setup do |config|
2
+ # Specify which authentication solution is used. Currently, we only support Devise.
3
+ config.auth_solution = :devise
4
+
5
+ # Set the actions used to discern user's permission to access dashboard.
6
+ #
7
+ # config.dashboard.permits_user.<method> = '...'
8
+ #
9
+ # There are four access methods can be configured:
10
+ #
11
+ # index, new, edit, destroy
12
+ #
13
+ # Also you can use a special method 'all' to set the default permission.
14
+ # The permission can also be array, the relation among them is OR.
15
+ # By doing this, you have full control on the access permission.
16
+ # TODO: Set the permissions for each data table.
17
+ config.dashboard.permits_user.all = 'role.admin?'
18
+ end
@@ -0,0 +1,19 @@
1
+ # Dashboard class is used to tell Carload what models are needed to administrated,
2
+ # which attributes are shown, etc.
3
+
4
+ class Dashboard < Carload::Dashboard
5
+ # There are two DSL block types:
6
+ #
7
+ # model :<model_name> do |spec|
8
+ # # Whether model should be displayed when URL does not specify one
9
+ # spec.default = <true_or_false>
10
+ # # List of attributes that can be edited
11
+ # spec.attributes.permitted = [...]
12
+ # # List of attributes that will be shown on index page
13
+ # spec.index_page.shows.attributes = [...]
14
+ # # List of attributes with search terms that can be searched on index page (using Ransack gem)
15
+ # spec.index_page.searches.attributes = [ { name: ..., term: ...}, ... ]
16
+ # end
17
+ #
18
+ # associate :<model_name_a> => :<model_name_b>, choose_by: :<attribute_in_model_b>
19
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :carload do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,13 @@
1
+ <%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
2
+ <%%= f.error_notification %>
3
+
4
+ <div class="form-inputs">
5
+ <%- attributes.each do |attribute| -%>
6
+ <%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
7
+ <%- end -%>
8
+ </div>
9
+
10
+ <div class="form-actions">
11
+ <%%= f.button :submit %>
12
+ </div>
13
+ <%% end %>
metadata ADDED
@@ -0,0 +1,277 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: carload
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Li Dong
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.0.0
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 5.0.0.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 5.0.0
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: jquery-rails
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '4.2'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '4.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: turbolinks
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '5'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '5'
61
+ - !ruby/object:Gem::Dependency
62
+ name: sass-rails
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '5.0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '5.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: uglifier
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: font-awesome-rails
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '4.6'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '4.6'
103
+ - !ruby/object:Gem::Dependency
104
+ name: bootstrap-sass
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '3.3'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '3.3'
117
+ - !ruby/object:Gem::Dependency
118
+ name: simple_form
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.3'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.3'
131
+ - !ruby/object:Gem::Dependency
132
+ name: ransack
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.8'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '1.8'
145
+ - !ruby/object:Gem::Dependency
146
+ name: kaminari
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.17'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.17'
159
+ - !ruby/object:Gem::Dependency
160
+ name: pundit
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '1.1'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.1'
173
+ - !ruby/object:Gem::Dependency
174
+ name: select2-rails
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '4.0'
180
+ type: :runtime
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '4.0'
187
+ description: Carload is built with taste, and tries to be just right!
188
+ email:
189
+ - dongli.init@gmail.com
190
+ executables: []
191
+ extensions: []
192
+ extra_rdoc_files: []
193
+ files:
194
+ - MIT-LICENSE
195
+ - README.md
196
+ - Rakefile
197
+ - app/assets/config/carload_manifest.js
198
+ - app/assets/javascripts/carload/application.js
199
+ - app/assets/javascripts/carload/dashboard.js
200
+ - app/assets/stylesheets/carload/_select2.scss
201
+ - app/assets/stylesheets/carload/application.scss
202
+ - app/assets/stylesheets/carload/colors.scss
203
+ - app/assets/stylesheets/carload/common.scss
204
+ - app/assets/stylesheets/carload/dashboard.scss
205
+ - app/assets/stylesheets/carload/error.scss
206
+ - app/controllers/carload/application_controller.rb
207
+ - app/controllers/carload/dashboard_controller.rb
208
+ - app/controllers/carload/errors_controller.rb
209
+ - app/helpers/carload/application_helper.rb
210
+ - app/helpers/carload/dashboard_helper.rb
211
+ - app/jobs/carload/application_job.rb
212
+ - app/mailers/carload/application_mailer.rb
213
+ - app/models/carload/application_record.rb
214
+ - app/policies/application_policy.rb
215
+ - app/policies/dashboard_policy.rb
216
+ - app/views/carload/dashboard/_form.html.erb
217
+ - app/views/carload/dashboard/edit.html.erb
218
+ - app/views/carload/dashboard/index.html.erb
219
+ - app/views/carload/dashboard/new.html.erb
220
+ - app/views/carload/dashboard/shared/_index_buttons.html.erb
221
+ - app/views/carload/dashboard/shared/_search_fields.html.erb
222
+ - app/views/carload/errors/dashboard_error.html.erb
223
+ - app/views/carload/errors/unauthorized_error.html.erb
224
+ - app/views/kaminari/_first_page.html.erb
225
+ - app/views/kaminari/_gap.html.erb
226
+ - app/views/kaminari/_last_page.html.erb
227
+ - app/views/kaminari/_next_page.html.erb
228
+ - app/views/kaminari/_page.html.erb
229
+ - app/views/kaminari/_paginator.html.erb
230
+ - app/views/kaminari/_prev_page.html.erb
231
+ - app/views/layouts/carload/application.html.erb
232
+ - app/views/layouts/carload/dashboard.html.erb
233
+ - config/initializers/assets.rb
234
+ - config/initializers/simple_form.rb
235
+ - config/initializers/simple_form_bootstrap.rb
236
+ - config/locales/en.yml
237
+ - config/locales/simple_form.en.yml
238
+ - config/locales/zh-CN.yml
239
+ - config/routes.rb
240
+ - lib/carload.rb
241
+ - lib/carload/dashboard.rb
242
+ - lib/carload/engine.rb
243
+ - lib/carload/exceptions.rb
244
+ - lib/carload/extended_hash.rb
245
+ - lib/carload/version.rb
246
+ - lib/generators/carload/USAGE
247
+ - lib/generators/carload/install_generator.rb
248
+ - lib/generators/carload/templates/carload.rb
249
+ - lib/generators/carload/templates/dashboard.rb
250
+ - lib/tasks/carload_tasks.rake
251
+ - lib/templates/erb/scaffold/_form.html.erb
252
+ homepage: https://github.com/dongli/carload
253
+ licenses:
254
+ - MIT
255
+ metadata: {}
256
+ post_install_message:
257
+ rdoc_options: []
258
+ require_paths:
259
+ - lib
260
+ required_ruby_version: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ required_rubygems_version: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
270
+ requirements: []
271
+ rubyforge_project:
272
+ rubygems_version: 2.5.1
273
+ signing_key:
274
+ specification_version: 4
275
+ summary: Another Rails administration dashboard gem.
276
+ test_files: []
277
+ has_rdoc: