carload 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/carload/_select2.scss +4 -0
- data/app/assets/stylesheets/carload/dashboard.scss +16 -2
- data/app/controllers/carload/dashboard_controller.rb +6 -6
- data/app/helpers/carload/dashboard_helper.rb +71 -7
- data/app/policies/{dashboard_policy.rb → carload_dashboard_policy.rb} +1 -1
- data/app/views/carload/dashboard/_form.html.erb +2 -2
- data/app/views/carload/dashboard/shared/_search_fields.html.erb +1 -2
- data/app/views/layouts/carload/dashboard.html.erb +1 -0
- data/config/locales/en.yml +8 -0
- data/config/locales/zh-CN.yml +8 -0
- data/lib/carload/dashboard.rb +131 -7
- data/lib/carload/version.rb +1 -1
- data/lib/generators/carload/dash_generator.rb +45 -0
- metadata +18 -4
- data/app/policies/application_policy.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8cd7d8e37f5576e78d936449c1e5037208db1789
|
4
|
+
data.tar.gz: feed52ae809a23d8cdc1f591e8ea76760e387945
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbc8dcf229e5789e2f7517b8b8c7e1b717abfc63372fd76bc537571969072a0f260d8cd5b90b56aba35ea5d5780f20a6b3a2cb7222552eb1828548ba528100d2
|
7
|
+
data.tar.gz: 4faa773c891477b8f1b72c9b54e33ecebdd55d8c9e333ced189a8acec895c24309d54bf4ae4ca14fd4133ef4075c5d74e92cf4d1aa78b52ce68ead454f862df8
|
@@ -4,6 +4,7 @@
|
|
4
4
|
//= require upload-image
|
5
5
|
|
6
6
|
$spacing: 16px;
|
7
|
+
$half-spacing: 8px;
|
7
8
|
|
8
9
|
@import 'bootstrap-sprockets';
|
9
10
|
@import 'bootstrap';
|
@@ -42,17 +43,30 @@ $spacing: 16px;
|
|
42
43
|
|
43
44
|
#main-container {
|
44
45
|
width: 100%;
|
45
|
-
padding-left: $spacing;
|
46
|
-
padding-right: $spacing;
|
47
46
|
#main-content {
|
48
47
|
margin-top: 50px;
|
48
|
+
padding-left: $spacing;
|
49
|
+
padding-right: $spacing;
|
49
50
|
}
|
50
51
|
}
|
51
52
|
|
52
53
|
.model-index-panel {
|
53
54
|
width: 100%;
|
55
|
+
.panel-body {
|
56
|
+
overflow: scroll;
|
57
|
+
padding-left: 0;
|
58
|
+
padding-right: 0;
|
59
|
+
}
|
54
60
|
table {
|
55
61
|
margin-bottom: 0;
|
62
|
+
table-layout: fixed;
|
63
|
+
width: 100%;
|
64
|
+
td {
|
65
|
+
overflow: scroll;
|
66
|
+
}
|
67
|
+
th:last-child {
|
68
|
+
width: 50px;
|
69
|
+
}
|
56
70
|
}
|
57
71
|
}
|
58
72
|
.model-new-panel, .model-edit-panel {
|
@@ -11,7 +11,7 @@ module Carload
|
|
11
11
|
include Croppable
|
12
12
|
|
13
13
|
def index
|
14
|
-
authorize :
|
14
|
+
authorize :carload_dashboard, :index? unless Carload.auth_solution == :none
|
15
15
|
@search = @model_class.search(params[:q])
|
16
16
|
@objects = @search.result.page(params[:page])
|
17
17
|
@show_attributes = Dashboard.model(@model_name).index_page[:shows][:attributes] + [:created_at, :updated_at]
|
@@ -20,16 +20,16 @@ module Carload
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def new
|
23
|
-
authorize :
|
23
|
+
authorize :carload_dashboard, :new? unless Carload.auth_solution == :none
|
24
24
|
@object = @model_class.new
|
25
25
|
end
|
26
26
|
|
27
27
|
def edit
|
28
|
-
authorize :
|
28
|
+
authorize :carload_dashboard, :edit? unless Carload.auth_solution == :none
|
29
29
|
end
|
30
30
|
|
31
31
|
def create
|
32
|
-
authorize :
|
32
|
+
authorize :carload_dashboard, :create? unless Carload.auth_solution == :none
|
33
33
|
@object = @model_class.create model_params
|
34
34
|
if @object.save
|
35
35
|
redirect_to action: :index, model: @model_names # TODO: To show page.
|
@@ -39,7 +39,7 @@ module Carload
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def update
|
42
|
-
authorize :
|
42
|
+
authorize :carload_dashboard, :update? unless Carload.auth_solution == :none
|
43
43
|
if @object.update model_params
|
44
44
|
redirect_to action: :index, model: @model_names # TODO: To show page.
|
45
45
|
else
|
@@ -48,7 +48,7 @@ module Carload
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def destroy
|
51
|
-
authorize :
|
51
|
+
authorize :carload_dashboard, :destroy? unless Carload.auth_solution == :none
|
52
52
|
@object.destroy
|
53
53
|
redirect_to action: :index, model: @model_names
|
54
54
|
end
|
@@ -1,16 +1,63 @@
|
|
1
1
|
module Carload
|
2
2
|
module DashboardHelper
|
3
3
|
def generate_input form, model_name, attribute_name, column
|
4
|
-
if
|
5
|
-
associated_model = attribute_name.
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
if Dashboard::ModelSpec.foreign_key? attribute_name
|
5
|
+
associated_model = attribute_name.gsub(/_id$/, '').to_sym
|
6
|
+
options = Dashboard.model(model_name).associated_models[associated_model]
|
7
|
+
label_attribute = options[:choose_by]
|
8
|
+
if options[:polymorphic]
|
9
|
+
forms = ''
|
10
|
+
options[:available_models].each_with_index do |real_model, i|
|
11
|
+
forms << form.input(attribute_name,
|
12
|
+
label: t("activerecord.attributes.#{model_name}.#{real_model}.#{label_attribute}"),
|
13
|
+
collection: real_model.camelize.constantize.all,
|
14
|
+
label_method: label_attribute,
|
15
|
+
value_method: :id,
|
16
|
+
input_html: {
|
17
|
+
class: 'use-select2',
|
18
|
+
data: {
|
19
|
+
placeholder: t('carload.placeholder.select', thing: t("activerecord.attributes.#{real_model}.#{label_attribute}"))
|
20
|
+
}
|
21
|
+
},
|
22
|
+
wrapper_html: {
|
23
|
+
id: "#{real_model.camelize}-#{label_attribute}"
|
24
|
+
}
|
25
|
+
)
|
26
|
+
end
|
27
|
+
# Add JavaScript to select which real model to work on.
|
28
|
+
forms << <<-EOT
|
29
|
+
<script>
|
30
|
+
$('.#{model_name}_#{associated_model}_id').hide()
|
31
|
+
if ($('##{model_name}_#{associated_model}_type').val() != '') {
|
32
|
+
$('#' + $('##{model_name}_#{associated_model}_type').val() + '-#{label_attribute}').show()
|
33
|
+
}
|
34
|
+
$('##{model_name}_#{associated_model}_type').change(function() {
|
35
|
+
$('.#{model_name}_#{associated_model}_id').hide()
|
36
|
+
$('#' + $(this).val() + '-#{label_attribute}').show()
|
37
|
+
$('.package_packagable_id > .select2-container').css('width', '100%')
|
38
|
+
})
|
39
|
+
</script>
|
40
|
+
EOT
|
41
|
+
raw forms.html_safe
|
42
|
+
else
|
43
|
+
form.association associated_model,
|
44
|
+
label_method: label_attribute,
|
45
|
+
label: t("activerecord.models.#{associated_model}"),
|
46
|
+
input_html: {
|
47
|
+
class: 'use-select2',
|
48
|
+
data: {
|
49
|
+
placeholder: t('carload.placeholder.select', thing: t("activerecord.attributes.#{associated_model}.#{label_attribute}"))
|
50
|
+
}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
elsif attribute_name =~ /_type$/
|
54
|
+
associated_model = attribute_name.gsub(/_type$/, '').to_sym
|
55
|
+
options = Dashboard.model(model_name).associated_models[associated_model]
|
56
|
+
form.input attribute_name, collection: options[:available_models].map(&:camelize),
|
10
57
|
input_html: {
|
11
58
|
class: 'use-select2',
|
12
59
|
data: {
|
13
|
-
placeholder: t('carload.placeholder.select', thing: t("activerecord.attributes.#{
|
60
|
+
placeholder: t('carload.placeholder.select', thing: t("activerecord.attributes.#{model_name}.#{attribute_name}"))
|
14
61
|
}
|
15
62
|
}
|
16
63
|
elsif needs_upload?(model_name, attribute_name) and image?(attribute_name)
|
@@ -20,6 +67,23 @@ module Carload
|
|
20
67
|
end
|
21
68
|
end
|
22
69
|
|
70
|
+
def generate_search_input form, model_name, attribute
|
71
|
+
if attribute[:options]
|
72
|
+
form.input "#{attribute[:name].to_s.gsub('.', '_')}_#{attribute[:term]}",
|
73
|
+
required: false, label: false, collection: attribute[:options],
|
74
|
+
input_html: {
|
75
|
+
class: 'use-select2',
|
76
|
+
data: {
|
77
|
+
placeholder: t('carload.placeholder.select', thing: t("activerecord.attributes.#{model_name}.#{attribute[:name]}"))
|
78
|
+
}
|
79
|
+
}
|
80
|
+
else
|
81
|
+
form.input "#{attribute[:name].to_s.gsub('.', '_')}_#{attribute[:term]}",
|
82
|
+
placeholder: t("activerecord.attributes.#{@model_name}.#{attribute[:name]}"),
|
83
|
+
required: false, label: false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
23
87
|
def generate_show object, attribute
|
24
88
|
case attribute
|
25
89
|
when Symbol
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= simple_form_for @object, url: "/carload/dashboard/#{@model_names}/#{@object.id}" do |f| %>
|
2
2
|
<% @model_class.columns_hash.each do |name, column| %>
|
3
|
-
<% next if
|
4
|
-
<%= generate_input
|
3
|
+
<% next if Dashboard::ModelSpec::SkippedAttributes.include? name %>
|
4
|
+
<%= generate_input(f, @model_name, name, column) rescue nil %>
|
5
5
|
<% end %>
|
6
6
|
<%= f.button :submit, t('carload.action.submit'), class: 'btn btn-primary' %>
|
7
7
|
<% end %>
|
@@ -1,8 +1,7 @@
|
|
1
1
|
<%= simple_form_for @search, url: dashboard_search_path(@model_names), method: :post do |f| %>
|
2
2
|
<div class='search-fields'>
|
3
3
|
<% @search_attributes.each do |attribute| %>
|
4
|
-
<%= f
|
5
|
-
placeholder: t("activerecord.attributes.#{@model_name}.#{attribute[:name]}") %>
|
4
|
+
<%= generate_search_input f, @model_name, attribute %>
|
6
5
|
<% end %>
|
7
6
|
</div>
|
8
7
|
<div class='search-buttons'>
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>Carload</title>
|
5
|
+
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'/>
|
5
6
|
<%= stylesheet_link_tag 'carload/dashboard', media: 'all' %>
|
6
7
|
<%= javascript_include_tag 'carload/dashboard' %>
|
7
8
|
<%= csrf_meta_tags %>
|
data/config/locales/en.yml
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
en:
|
2
|
+
date:
|
3
|
+
order:
|
4
|
+
- :year
|
5
|
+
- :month
|
6
|
+
- :day
|
7
|
+
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
|
8
|
+
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
|
9
|
+
|
2
10
|
carload:
|
3
11
|
actions: Actions
|
4
12
|
action:
|
data/config/locales/zh-CN.yml
CHANGED
data/lib/carload/dashboard.rb
CHANGED
@@ -3,21 +3,110 @@ module Carload
|
|
3
3
|
class ModelSpec
|
4
4
|
attr_accessor :default, :attributes, :index_page, :associated_models
|
5
5
|
|
6
|
-
|
6
|
+
SkippedAttributes = [
|
7
|
+
'id', 'created_at', 'updated_at',
|
8
|
+
'encrypted_password', 'reset_password_token',
|
9
|
+
'reset_password_sent_at', 'remember_created_at',
|
10
|
+
'sign_in_count', 'current_sign_in_at',
|
11
|
+
'last_sign_in_at', 'current_sign_in_ip',
|
12
|
+
'last_sign_in_ip'
|
13
|
+
].freeze
|
14
|
+
|
15
|
+
def self.foreign_key? attribute
|
16
|
+
attribute =~ /_id$/
|
17
|
+
end
|
18
|
+
|
19
|
+
def foreign_key? attribute
|
20
|
+
ModelSpec.foreign_key? attribute
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.polymorphic? model_class, attribute
|
24
|
+
return false unless foreign_key? attribute
|
25
|
+
model_class.column_names.include? "#{attribute.to_s.gsub('_id', '')}_type"
|
26
|
+
end
|
27
|
+
|
28
|
+
def polymorphic? model_class, attribute
|
29
|
+
ModelSpec.polymorphic? model_class, attribute
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize model_class = nil
|
7
33
|
@default = false
|
8
34
|
@attributes = ExtendedHash.new
|
9
35
|
@index_page = ExtendedHash.new
|
10
36
|
@index_page[:shows] = ExtendedHash.new
|
11
37
|
@index_page[:searches] = ExtendedHash.new
|
12
38
|
@associated_models = {}
|
39
|
+
if model_class
|
40
|
+
@attributes[:permitted] = model_class.column_names - SkippedAttributes
|
41
|
+
@attributes[:permitted].each do |attribute|
|
42
|
+
@index_page[:shows][:attributes] ||= []
|
43
|
+
@index_page[:searches][:attributes] ||= []
|
44
|
+
if foreign_key? attribute
|
45
|
+
associated_model = attribute.gsub('_id', '')
|
46
|
+
@associated_models[associated_model] = {
|
47
|
+
choose_by: nil, # Wait for setting.
|
48
|
+
polymorphic: polymorphic?(model_class, attribute),
|
49
|
+
model: model_class.name.underscore.to_sym
|
50
|
+
}
|
51
|
+
else
|
52
|
+
@index_page[:shows][:attributes] << attribute
|
53
|
+
@index_page[:searches][:attributes] << { name: attribute.to_sym, term: :cont }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def changed? spec
|
60
|
+
not @attributes[:permitted] == spec.attributes[:permitted] or
|
61
|
+
not @index_page[:searches][:attributes] == spec.index_page[:searches][:attributes]
|
62
|
+
end
|
63
|
+
|
64
|
+
def revise_stage_1!
|
65
|
+
# Handle polymorphic associated models if necessary.
|
66
|
+
@associated_models.each do |associated_model, options|
|
67
|
+
next if not options or not options[:polymorphic]
|
68
|
+
ActiveRecord::Base.descendants.each do |model|
|
69
|
+
next if model.name == 'ApplicationRecord'
|
70
|
+
if not model.reflect_on_all_associations.map(&:name).select { |x| x.to_s =~ /\b(#{options[:model]}|#{options[:model].to_s.pluralize})\b/ }.empty?
|
71
|
+
options[:available_models] ||= []
|
72
|
+
options[:available_models] << model.name.underscore
|
73
|
+
if not options[:common_attributes]
|
74
|
+
options[:common_attributes] = model.column_names - SkippedAttributes
|
75
|
+
else
|
76
|
+
options[:common_attributes] = options[:common_attributes] & model.column_names
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def revise_stage_2!
|
84
|
+
# Handle associated models if necessary.
|
85
|
+
@associated_models.each do |associated_model, options|
|
86
|
+
next if not options
|
87
|
+
if options[:polymorphic]
|
88
|
+
# There should be a <associated_model>_type already.
|
89
|
+
@index_page[:shows][:attributes] << "#{associated_model}.#{options[:choose_by]}"
|
90
|
+
@index_page[:searches][:attributes].each do |attribute|
|
91
|
+
next unless attribute[:name] == :"#{associated_model}_type"
|
92
|
+
attribute[:options] = options[:available_models]
|
93
|
+
end
|
94
|
+
else
|
95
|
+
@index_page[:searches][:attributes] << {
|
96
|
+
name: "#{associated_model}.#{options[:choose_by]}",
|
97
|
+
term: :cont
|
98
|
+
}
|
99
|
+
end
|
100
|
+
end
|
13
101
|
end
|
14
102
|
end
|
15
103
|
|
16
104
|
class << self
|
17
105
|
def model name, &block
|
106
|
+
name = name.to_sym
|
18
107
|
if block_given?
|
19
108
|
@@models ||= {}
|
20
|
-
spec = ModelSpec.new
|
109
|
+
spec = @@models[name] || ModelSpec.new
|
21
110
|
yield spec
|
22
111
|
@@models[name] = spec
|
23
112
|
else
|
@@ -25,11 +114,16 @@ module Carload
|
|
25
114
|
end
|
26
115
|
end
|
27
116
|
|
28
|
-
def associate
|
29
|
-
model_a =
|
30
|
-
model_b =
|
31
|
-
|
32
|
-
@@models[
|
117
|
+
def associate options
|
118
|
+
model_a = options.keys.first
|
119
|
+
model_b = options.values.first
|
120
|
+
options.shift
|
121
|
+
@@models[model_a] ||= ModelSpec.new
|
122
|
+
@@models[model_a].associated_models[model_b] = options
|
123
|
+
unless options[:polymorphic]
|
124
|
+
@@models[model_b] ||= ModelSpec.new
|
125
|
+
@@models[model_b].associated_models[model_a] = nil
|
126
|
+
end
|
33
127
|
end
|
34
128
|
|
35
129
|
def models
|
@@ -41,6 +135,36 @@ module Carload
|
|
41
135
|
@@models.each do |name, spec|
|
42
136
|
return @@default_model = name if spec.default
|
43
137
|
end
|
138
|
+
@@default_model = @@models.keys.first
|
139
|
+
end
|
140
|
+
|
141
|
+
def write file_path
|
142
|
+
content = File.read("#{Carload::Engine.root}/lib/generators/carload/templates/dashboard.rb")
|
143
|
+
content.gsub!(/^end$/, '')
|
144
|
+
default = true
|
145
|
+
models.each do |name, spec|
|
146
|
+
content << <<-RUBY
|
147
|
+
model :#{name} do |spec|
|
148
|
+
spec.default = #{default}
|
149
|
+
spec.attributes.permitted = #{spec.attributes.permitted}
|
150
|
+
spec.index_page.shows.attributes = #{spec.index_page.shows.attributes}
|
151
|
+
spec.index_page.searches.attributes = #{spec.index_page.searches.attributes}
|
152
|
+
end
|
153
|
+
RUBY
|
154
|
+
default = false
|
155
|
+
next if spec.associated_models.empty?
|
156
|
+
spec.associated_models.each do |associated_model, options|
|
157
|
+
next if not options.class == Hash or not options[:choose_by]
|
158
|
+
content << <<-RUBY
|
159
|
+
associate(#{{ name.to_sym => associated_model.to_sym }.merge options})
|
160
|
+
RUBY
|
161
|
+
end
|
162
|
+
end
|
163
|
+
content << "end\n"
|
164
|
+
File.open('app/carload/dashboard.rb', 'w') do |file|
|
165
|
+
file.write content
|
166
|
+
file.close
|
167
|
+
end
|
44
168
|
end
|
45
169
|
end
|
46
170
|
end
|
data/lib/carload/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Carload
|
2
|
+
class DashGenerator < Rails::Generators::NamedBase
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
def change_dashboard_file
|
6
|
+
# Process model once atime.
|
7
|
+
model = file_name
|
8
|
+
model_specs = {}
|
9
|
+
Rails.application.eager_load! # It is necessary to load models manually.
|
10
|
+
ActiveRecord::Base.descendants.each do |model| # Rails 5 can use ApplicationRecord.
|
11
|
+
next if model.name == 'ApplicationRecord'
|
12
|
+
name = model.name.underscore
|
13
|
+
model_specs[name] = Dashboard::ModelSpec.new model
|
14
|
+
end
|
15
|
+
spec = model_specs[model]
|
16
|
+
if not spec.associated_models.empty?
|
17
|
+
spec.revise_stage_1!
|
18
|
+
cli = HighLine.new
|
19
|
+
cli.say "\nModel #{model} has associated with other models."
|
20
|
+
spec.associated_models.each do |associated_model, options|
|
21
|
+
spec.associated_models[associated_model][:choose_by] = cli.choose do |menu|
|
22
|
+
menu.prompt = "Choose the attribute of model #{associated_model} for choosing in #{model}? "
|
23
|
+
attributes = options[:polymorphic] ? options[:common_attributes] : model_specs[associated_model].attributes.permitted
|
24
|
+
attributes.each do |attribute|
|
25
|
+
next if attribute =~ /_id$/
|
26
|
+
menu.choice attribute.to_sym
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
spec.revise_stage_2!
|
31
|
+
end
|
32
|
+
# Check if model exists in dashboard file, but it may be changed.
|
33
|
+
begin
|
34
|
+
load 'app/carload/dashboard.rb'
|
35
|
+
rescue LoadError
|
36
|
+
Dashboard.models[model.to_sym] = spec
|
37
|
+
Dashboard.write 'app/carload/dashboard.rb'
|
38
|
+
end
|
39
|
+
if not Dashboard.models.keys.include? model.to_sym or Dashboard.model(model).changed? spec
|
40
|
+
Dashboard.models[model.to_sym] = spec
|
41
|
+
Dashboard.write 'app/carload/dashboard.rb'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carload
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Li Dong
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -198,6 +198,20 @@ dependencies:
|
|
198
198
|
- - "~>"
|
199
199
|
- !ruby/object:Gem::Version
|
200
200
|
version: '0.1'
|
201
|
+
- !ruby/object:Gem::Dependency
|
202
|
+
name: highline
|
203
|
+
requirement: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
205
|
+
- - "~>"
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '1.7'
|
208
|
+
type: :runtime
|
209
|
+
prerelease: false
|
210
|
+
version_requirements: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - "~>"
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '1.7'
|
201
215
|
description: Carload is built with taste, and tries to be just right!
|
202
216
|
email:
|
203
217
|
- dongli.init@gmail.com
|
@@ -225,8 +239,7 @@ files:
|
|
225
239
|
- app/jobs/carload/application_job.rb
|
226
240
|
- app/mailers/carload/application_mailer.rb
|
227
241
|
- app/models/carload/application_record.rb
|
228
|
-
- app/policies/
|
229
|
-
- app/policies/dashboard_policy.rb
|
242
|
+
- app/policies/carload_dashboard_policy.rb
|
230
243
|
- app/views/carload/dashboard/_form.html.erb
|
231
244
|
- app/views/carload/dashboard/edit.html.erb
|
232
245
|
- app/views/carload/dashboard/index.html.erb
|
@@ -258,6 +271,7 @@ files:
|
|
258
271
|
- lib/carload/extended_hash.rb
|
259
272
|
- lib/carload/version.rb
|
260
273
|
- lib/generators/carload/USAGE
|
274
|
+
- lib/generators/carload/dash_generator.rb
|
261
275
|
- lib/generators/carload/install_generator.rb
|
262
276
|
- lib/generators/carload/templates/carload.rb
|
263
277
|
- lib/generators/carload/templates/dashboard.rb
|
@@ -1,53 +0,0 @@
|
|
1
|
-
class ApplicationPolicy
|
2
|
-
attr_reader :user, :record
|
3
|
-
|
4
|
-
def initialize(user, record)
|
5
|
-
@user = user
|
6
|
-
@record = record
|
7
|
-
end
|
8
|
-
|
9
|
-
def index?
|
10
|
-
false
|
11
|
-
end
|
12
|
-
|
13
|
-
def show?
|
14
|
-
scope.where(:id => record.id).exists?
|
15
|
-
end
|
16
|
-
|
17
|
-
def create?
|
18
|
-
false
|
19
|
-
end
|
20
|
-
|
21
|
-
def new?
|
22
|
-
create?
|
23
|
-
end
|
24
|
-
|
25
|
-
def update?
|
26
|
-
false
|
27
|
-
end
|
28
|
-
|
29
|
-
def edit?
|
30
|
-
update?
|
31
|
-
end
|
32
|
-
|
33
|
-
def destroy?
|
34
|
-
false
|
35
|
-
end
|
36
|
-
|
37
|
-
def scope
|
38
|
-
Pundit.policy_scope!(user, record.class)
|
39
|
-
end
|
40
|
-
|
41
|
-
class Scope
|
42
|
-
attr_reader :user, :scope
|
43
|
-
|
44
|
-
def initialize(user, scope)
|
45
|
-
@user = user
|
46
|
-
@scope = scope
|
47
|
-
end
|
48
|
-
|
49
|
-
def resolve
|
50
|
-
scope
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|