kuppayam 0.1.15 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/kuppayam/utilities.js +9 -0
- data/app/controllers/kuppayam/base_controller.rb +1 -0
- data/app/helpers/filter_helper.rb +4 -3
- data/app/helpers/image_helper.rb +7 -10
- data/app/helpers/navigation_helper.rb +11 -2
- data/app/helpers/resource_helper.rb +32 -0
- data/app/helpers/resource_view_helper.rb +227 -0
- data/app/models/concerns/approvable.rb +47 -0
- data/app/models/concerns/featureable.rb +23 -0
- data/app/models/concerns/publishable.rb +46 -0
- data/app/models/image/cover_image.rb +3 -0
- data/app/models/image/gallery_image.rb +11 -0
- data/app/models/image/logo_image.rb +3 -0
- data/app/models/image/profile_image.rb +3 -0
- data/app/uploaders/cover_image_uploader.rb +22 -0
- data/app/uploaders/gallery_image_uploader.rb +22 -0
- data/app/uploaders/logo_image_uploader.rb +22 -0
- data/app/uploaders/profile_image_uploader.rb +22 -0
- data/app/views/kuppayam/api/docs/_navbar.html.erb +12 -0
- data/app/views/kuppayam/api/docs/_navigation.html.erb +12 -19
- data/app/views/kuppayam/api/docs/show.html.erb +70 -80
- data/app/views/kuppayam/images/_form.html.erb +7 -1
- data/app/views/kuppayam/images/_multiple_images.html.erb +29 -0
- data/app/views/kuppayam/images/create.html.erb +20 -7
- data/app/views/kuppayam/images/destroy.js.erb +10 -2
- data/app/views/kuppayam/images/update.html.erb +2 -2
- data/app/views/layouts/dashboard/_items.html.erb +20 -0
- data/app/views/layouts/kuppayam/docs.html.erb +31 -55
- data/config/initializers/validators.rb +5 -1
- data/lib/generators/kuppayam/resource_generator.rb +254 -0
- data/lib/generators/kuppayam/templates/controllers/resource_controller.rb +84 -0
- data/lib/generators/kuppayam/templates/db/migrate/create_resources.rb +14 -0
- data/lib/generators/kuppayam/templates/models/resource.rb +72 -0
- data/lib/generators/kuppayam/templates/spec/controllers/resource_controller_spec.rb +154 -0
- data/lib/generators/kuppayam/templates/spec/factories/resource.rb +42 -0
- data/lib/generators/kuppayam/templates/spec/models/resource_spec.rb +36 -0
- data/lib/generators/kuppayam/templates/views/_form.html.erb +63 -0
- data/lib/generators/kuppayam/templates/views/_index.html.erb +53 -0
- data/lib/generators/kuppayam/templates/views/_row.html.erb +26 -0
- data/lib/generators/kuppayam/templates/views/_show.html.erb +112 -0
- data/lib/generators/kuppayam/templates/views/index.html.erb +46 -0
- data/lib/generators/resource/resource_generator.rb +337 -0
- data/lib/kuppayam/action_view/form_helper.rb +10 -2
- data/lib/kuppayam/action_view/theme_helper.rb +4 -2
- data/lib/kuppayam/version.rb +1 -1
- metadata +58 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46f9d0794f3975e51fc8db814e72a716b6f4efc3
|
4
|
+
data.tar.gz: 803a98db92f7c41678ba29111f17ea8c84c5cfc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 750dec101a2596eaf806373cabf8ae8c2de69d2566f1bef3b0f384075ddc06eeee7390e31db2f5a94fc5abf9271b0e493e4bdb85b6e686f118657c270eff56b4
|
7
|
+
data.tar.gz: d51130213fb36a466d05a3786dbf49b47ff34f7d999ecd3592daf07d7447a102e3081cf7d73acbdbbcf23b1788366413fa1d73da16e2380b000bc96332de47c4
|
@@ -230,7 +230,8 @@ module FilterHelper
|
|
230
230
|
filters_to_add: {},
|
231
231
|
url_method_name: 'root_path',
|
232
232
|
show_all_filter_on_top: true,
|
233
|
-
show_null_filter_on_top: false
|
233
|
+
show_null_filter_on_top: false,
|
234
|
+
drop_down_options: {}
|
234
235
|
)
|
235
236
|
|
236
237
|
raise "@filter_param_mapping not initialised" unless @filter_param_mapping
|
@@ -269,7 +270,7 @@ module FilterHelper
|
|
269
270
|
initial_list = {}
|
270
271
|
initial_list["All"] = send(filter_options[:url_method_name], filters) if filter_options[:show_all_filter_on_top]
|
271
272
|
initial_list["IS NOT SET"] = send(filter_options[:url_method_name], filters.merge({param_name => :null})) if filter_options[:show_null_filter_on_top]
|
272
|
-
|
273
|
+
|
273
274
|
# Values can be either Array or Hash
|
274
275
|
# If Array is passed, it will populate the Hash it want from the Hash
|
275
276
|
# For e.g: if values = ["Jan", "Feb"], theh the hash populated would be {"Jan" => "Jan", "Feb" => "Feb"}
|
@@ -288,7 +289,7 @@ module FilterHelper
|
|
288
289
|
results
|
289
290
|
end
|
290
291
|
|
291
|
-
drop_down_filter(selected_text, options)
|
292
|
+
drop_down_filter(selected_text, options, filter_options[:drop_down_options])
|
292
293
|
end
|
293
294
|
|
294
295
|
# Example
|
data/app/helpers/image_helper.rb
CHANGED
@@ -85,15 +85,7 @@ module ImageHelper
|
|
85
85
|
class: ""
|
86
86
|
)
|
87
87
|
|
88
|
-
|
89
|
-
image_object_name = method_name.split(".").first
|
90
|
-
image_object = object.send :eval, image_object_name
|
91
|
-
image_object_id = image_object ? image_object.id : nil
|
92
|
-
rescue
|
93
|
-
raise "Error with display_image method in kuppayam image_helper.rb"
|
94
|
-
end
|
95
|
-
|
96
|
-
options[:class] = options[:class] + (object.persisted? ? " #{image_object_id}-#{options[:size]}-image" : "")
|
88
|
+
options[:class] = options[:class] + (object.persisted? ? " #{object.id}-#{options[:size]}-image" : "")
|
97
89
|
|
98
90
|
img_url = image_url(object, method_name, **options)
|
99
91
|
return image_tag(img_url, class: options[:class], width: options[:width], height: options[:height])
|
@@ -141,7 +133,7 @@ module ImageHelper
|
|
141
133
|
remove_btn = link_to(remove_btn_display, delete_url, :class=>options[:delete_options][:class], :remote=>options[:delete_options][:remote], method: :delete)
|
142
134
|
end
|
143
135
|
|
144
|
-
link_to(image_tag, edit_url, :remote => options[:remote]) +
|
136
|
+
link_to(image_tag, edit_url, :remote => options[:edit_options][:remote]) +
|
145
137
|
content_tag(:div, class: "btn-group btn-group-justified mt-30") do
|
146
138
|
edit_btn + (object.persisted? ? remove_btn : "")
|
147
139
|
end
|
@@ -174,6 +166,11 @@ module ImageHelper
|
|
174
166
|
end
|
175
167
|
end
|
176
168
|
|
169
|
+
def upload_multiple_image_link(object, assoc_name=:photo, scope=:admin, **options)
|
170
|
+
image_object = object.class.new.send("#{assoc_name}").build
|
171
|
+
main_app.url_for([:new, scope, :image, imageable_id: object.id, imageable_type: object.class.to_s, image_type: image_object.class.name, multiple: true])
|
172
|
+
end
|
173
|
+
|
177
174
|
def remove_image_link(object, assoc_name=:photo, scope=:admin, **options)
|
178
175
|
image_object = nil
|
179
176
|
image_object = object.send(assoc_name) if object.respond_to?(assoc_name)
|
@@ -3,8 +3,17 @@ module NavigationHelper
|
|
3
3
|
@nav == name
|
4
4
|
end
|
5
5
|
|
6
|
-
def
|
7
|
-
|
6
|
+
def nav_include?(name)
|
7
|
+
@nav.include?(name)
|
8
|
+
end
|
9
|
+
|
10
|
+
# If check_include is passed, it check if the @nav has substring name else it should match
|
11
|
+
def nav_class(name, check_include=false)
|
12
|
+
if check_include
|
13
|
+
nav_include?(name) ? "active" : ""
|
14
|
+
else
|
15
|
+
nav_active?(name) ? "active" : ""
|
16
|
+
end
|
8
17
|
end
|
9
18
|
|
10
19
|
def set_nav(name)
|
@@ -110,6 +110,38 @@ module ResourceHelper
|
|
110
110
|
render_row
|
111
111
|
end
|
112
112
|
|
113
|
+
def mark_as_featured
|
114
|
+
@r_object = @resource_options[:class].find_by_id(params[:id])
|
115
|
+
if @r_object
|
116
|
+
instance_variable_set("@#{@resource_options[:item_name]}", @r_object)
|
117
|
+
@r_object.update_attribute(:featured, true)
|
118
|
+
if @r_object.errors.blank?
|
119
|
+
set_notification(true, I18n.t('status.success'), I18n.t('state.changed', item: default_item_name.titleize, new_state: :featured))
|
120
|
+
else
|
121
|
+
set_notification(false, I18n.t('status.error'), @r_object.errors.full_messages.join("<br>"))
|
122
|
+
end
|
123
|
+
else
|
124
|
+
set_notification(false, I18n.t('status.not_found'), I18n.t('status.not_found', item: default_item_name.titleize))
|
125
|
+
end
|
126
|
+
render_row
|
127
|
+
end
|
128
|
+
|
129
|
+
def remove_from_featured
|
130
|
+
@r_object = @resource_options[:class].find_by_id(params[:id])
|
131
|
+
if @r_object
|
132
|
+
instance_variable_set("@#{@resource_options[:item_name]}", @r_object)
|
133
|
+
@r_object.update_attribute(:featured, false)
|
134
|
+
if @r_object.errors.blank?
|
135
|
+
set_notification(true, I18n.t('status.success'), I18n.t('state.changed', item: default_item_name.titleize, new_state: :unfeatured))
|
136
|
+
else
|
137
|
+
set_notification(false, I18n.t('status.error'), @r_object.errors.full_messages.join("<br>"))
|
138
|
+
end
|
139
|
+
else
|
140
|
+
set_notification(false, I18n.t('status.not_found'), I18n.t('status.not_found', item: default_item_name.titleize))
|
141
|
+
end
|
142
|
+
render_row
|
143
|
+
end
|
144
|
+
|
113
145
|
private
|
114
146
|
|
115
147
|
def set_navs
|
@@ -0,0 +1,227 @@
|
|
1
|
+
module ResourceViewHelper
|
2
|
+
|
3
|
+
def edit_link(object)
|
4
|
+
url_for(action: 'edit', controller: object.class.to_s.tableize, id: object.id)
|
5
|
+
end
|
6
|
+
|
7
|
+
def delete_link(object)
|
8
|
+
url_for(action: 'destroy', controller: object.class.to_s.tableize, id: object.id)
|
9
|
+
end
|
10
|
+
|
11
|
+
def serial_number(i)
|
12
|
+
if i < 0
|
13
|
+
raw(content_tag(:i, "", class: "fa fa-check text-success"))
|
14
|
+
else
|
15
|
+
raw(i + 1 + (@per_page.to_i * (@current_page.to_i - 1)))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def display_thumbnail_small(object, **options)
|
20
|
+
options.reverse_merge!(
|
21
|
+
method_name: "cover_image.image.small.url",
|
22
|
+
image_class: "img-rectangle",
|
23
|
+
image_width: "120",
|
24
|
+
image_height: "auto",
|
25
|
+
)
|
26
|
+
url = url_for(action: 'show', controller: object.class.to_s.tableize, id: object.id)
|
27
|
+
link_to(url, remote: true) do
|
28
|
+
raw(display_image(object, options[:method_name], width: options[:image_width], height: options[:image_height], class: options[:image_class], alt: object.display_name))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def display_featured(object, **options)
|
33
|
+
options.reverse_merge!(
|
34
|
+
span_class: 'ml-5 mt-5 label',
|
35
|
+
)
|
36
|
+
if object.featured?
|
37
|
+
content_tag(:span, "Featured", class: "#{options[:span_class]} label-warning")
|
38
|
+
else
|
39
|
+
content_tag(:span, "Not Featured", class: "#{options[:span_class]} label-default")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def display_publishable_status(object, **options)
|
44
|
+
options.reverse_merge!(
|
45
|
+
span_class: 'ml-5 mt-5 label',
|
46
|
+
)
|
47
|
+
label_class = Publishable::STATUS_UI_CLASS[object.status]
|
48
|
+
content_tag(:span, object.display_status, class: "#{options[:span_class]} label-#{label_class}")
|
49
|
+
end
|
50
|
+
|
51
|
+
def display_publishable_links(object, **options)
|
52
|
+
options.reverse_merge!(
|
53
|
+
publish_icon: 'fa fa-check-square',
|
54
|
+
unpublish_icon: 'fa fa-square',
|
55
|
+
remove_icon: 'fa fa-close',
|
56
|
+
archive_icon: 'fa fa-archive',
|
57
|
+
|
58
|
+
publish_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "published"),
|
59
|
+
unpublish_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "unpublished"),
|
60
|
+
remove_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "removed"),
|
61
|
+
archive_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "archived"),
|
62
|
+
|
63
|
+
publish_text: "Publish",
|
64
|
+
unpublish_text: "UnPublish",
|
65
|
+
remove_text: "Remove",
|
66
|
+
archive_text: "Archive",
|
67
|
+
|
68
|
+
publish_class: "edit",
|
69
|
+
unpublish_class: "",
|
70
|
+
remove_class: "delete",
|
71
|
+
archive_class: "",
|
72
|
+
|
73
|
+
has_permission_to_edit: true
|
74
|
+
)
|
75
|
+
|
76
|
+
if @current_permission
|
77
|
+
options[:has_permission_to_edit] = @current_permission.can_update?
|
78
|
+
end
|
79
|
+
|
80
|
+
links = []
|
81
|
+
links << link_to(raw("<i class=\"#{options[:publish_icon]} mr-5\"></i> #{options[:publish_text]}"), options[:publish_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:publish_class]) if object.can_publish? && options[:has_permission_to_edit]
|
82
|
+
links << link_to(raw("<i class=\"#{options[:unpublish_icon]} mr-5\"></i> #{options[:unpublish_text]}"), options[:unpublish_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:unpublish_class]) if object.can_unpublish? && options[:has_permission_to_edit]
|
83
|
+
links << link_to(raw("<i class=\"#{options[:remove_icon]} mr-5\"></i> #{options[:remove_text]}"), options[:remove_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:remove_class]) if object.can_remove? && options[:has_permission_to_edit]
|
84
|
+
links << link_to(raw("<i class=\"#{options[:archive_icon]} mr-5\"></i> #{options[:archive_text]}"), options[:archive_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:archive_class]) if object.can_archive? && options[:has_permission_to_edit]
|
85
|
+
raw(links.join(""))
|
86
|
+
end
|
87
|
+
|
88
|
+
def display_featurable_links(object, **options)
|
89
|
+
options.reverse_merge!(
|
90
|
+
feature_icon: 'fa fa-star',
|
91
|
+
unfeature_icon: 'fa fa-star-o',
|
92
|
+
|
93
|
+
feature_link: url_for(action: 'mark_as_featured', controller: object.class.to_s.tableize, id: object.id),
|
94
|
+
unfeature_link: url_for(action: 'remove_from_featured', controller: object.class.to_s.tableize, id: object.id),
|
95
|
+
|
96
|
+
feature_text: "Mark as Featured",
|
97
|
+
unfeature_text: "Remove from Featured",
|
98
|
+
|
99
|
+
feature_class: "edit",
|
100
|
+
unfeature_class: "delete",
|
101
|
+
|
102
|
+
has_permission_to_edit: true
|
103
|
+
)
|
104
|
+
|
105
|
+
if @current_permission
|
106
|
+
options[:has_permission_to_edit] = @current_permission.can_update?
|
107
|
+
end
|
108
|
+
|
109
|
+
links = []
|
110
|
+
links << link_to(raw("<i class=\"#{options[:feature_icon]} mr-5\"></i> #{options[:feature_text]}"), options[:feature_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:feature_class]) unless object.featured? && options[:has_permission_to_edit]
|
111
|
+
links << link_to(raw("<i class=\"#{options[:unfeature_icon]} mr-5\"></i> #{options[:unfeature_text]}"), options[:unfeature_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:unfeature_class]) if object.featured? && options[:has_permission_to_edit]
|
112
|
+
raw(links.join(""))
|
113
|
+
end
|
114
|
+
|
115
|
+
def display_manage_links(object, current_user, **options)
|
116
|
+
options.reverse_merge!(
|
117
|
+
edit_icon: 'fa fa-edit',
|
118
|
+
delete_icon: 'fa fa-trash',
|
119
|
+
|
120
|
+
edit_link: url_for(action: "edit", controller: object.class.to_s.tableize, id: object.id),
|
121
|
+
delete_link: url_for(action: "destroy", controller: object.class.to_s.tableize, id: object.id),
|
122
|
+
|
123
|
+
edit_text: "Edit",
|
124
|
+
delete_text: "Delete",
|
125
|
+
|
126
|
+
edit_class: "edit",
|
127
|
+
delete_class: "",
|
128
|
+
|
129
|
+
has_permission_to_edit: true,
|
130
|
+
has_permission_to_delete: true
|
131
|
+
)
|
132
|
+
|
133
|
+
if @current_permission
|
134
|
+
options[:has_permission_to_edit] = @current_permission.can_update?
|
135
|
+
options[:has_permission_to_delete] = @current_permission.can_delete?
|
136
|
+
end
|
137
|
+
|
138
|
+
links = []
|
139
|
+
links << link_to(raw("<i class=\"#{options[:edit_icon]} mr-5\"></i> #{options[:edit_text]}"), options[:edit_link], remote: true, role: "menuitem", tabindex: "-1", class: options[:edit_class]) if object.can_be_edited? && options[:has_permission_to_edit]
|
140
|
+
links << link_to(raw("<i class=\"#{options[:delete_icon]} mr-5\"></i> #{options[:delete_text]}"), options[:delete_link], method: 'DELETE', remote: true, role: "menuitem", tabindex: "-1", class: options[:delete_class]) if object.can_be_deleted? && options[:has_permission_to_delete]
|
141
|
+
raw(links.join(""))
|
142
|
+
end
|
143
|
+
|
144
|
+
def display_publishable_buttons(object, **options)
|
145
|
+
options.reverse_merge!(
|
146
|
+
publish_icon: 'fa fa-check-square',
|
147
|
+
unpublish_icon: 'fa fa-square',
|
148
|
+
remove_icon: 'fa fa-close',
|
149
|
+
archive_icon: 'fa fa-archive',
|
150
|
+
|
151
|
+
publish_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "published"),
|
152
|
+
unpublish_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "unpublished"),
|
153
|
+
remove_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "removed"),
|
154
|
+
archive_link: url_for(action: 'update_status', controller: object.class.to_s.tableize, id: object.id, status: "archived"),
|
155
|
+
|
156
|
+
publish_text: "Publish",
|
157
|
+
unpublish_text: "UnPublish",
|
158
|
+
remove_text: "Remove",
|
159
|
+
archive_text: "Archive",
|
160
|
+
|
161
|
+
publish_class: "btn btn-block btn-success btn-only-hover",
|
162
|
+
unpublish_class: "btn btn-block btn-gray btn-only-hover",
|
163
|
+
remove_class: "btn btn-block btn-danger btn-only-hover",
|
164
|
+
archive_class: "btn btn-block btn-gray btn-only-hover",
|
165
|
+
|
166
|
+
has_permission_to_edit: true
|
167
|
+
)
|
168
|
+
|
169
|
+
if @current_permission
|
170
|
+
options[:has_permission_to_edit] = @current_permission.can_update?
|
171
|
+
end
|
172
|
+
|
173
|
+
links = []
|
174
|
+
links << link_to(raw("<i class=\"#{options[:publish_icon]} mr-5\"></i> #{options[:publish_text]}"), options[:publish_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:publish_class]) if object.can_publish? && options[:has_permission_to_edit]
|
175
|
+
links << link_to(raw("<i class=\"#{options[:unpublish_icon]} mr-5\"></i> #{options[:unpublish_text]}"), options[:unpublish_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:unpublish_class]) if object.can_unpublish? && options[:has_permission_to_edit]
|
176
|
+
links << link_to(raw("<i class=\"#{options[:remove_icon]} mr-5\"></i> #{options[:remove_text]}"), options[:remove_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:remove_class]) if object.can_remove? && options[:has_permission_to_edit]
|
177
|
+
links << link_to(raw("<i class=\"#{options[:archive_icon]} mr-5\"></i> #{options[:archive_text]}"), options[:archive_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:archive_class]) if object.can_archive? && options[:has_permission_to_edit]
|
178
|
+
raw(links.join(""))
|
179
|
+
end
|
180
|
+
|
181
|
+
def display_featurable_buttons(object, **options)
|
182
|
+
options.reverse_merge!(
|
183
|
+
feature_icon: 'fa fa-star',
|
184
|
+
unfeature_icon: 'fa fa-star-o',
|
185
|
+
|
186
|
+
feature_link: url_for(action: 'mark_as_featured', controller: object.class.to_s.tableize, id: object.id),
|
187
|
+
unfeature_link: url_for(action: 'remove_from_featured', controller: object.class.to_s.tableize, id: object.id),
|
188
|
+
|
189
|
+
feature_text: "Mark as Featured",
|
190
|
+
unfeature_text: "Remove from Featured",
|
191
|
+
|
192
|
+
feature_class: "btn btn-block btn-success btn-only-hover",
|
193
|
+
unfeature_class: "btn btn-block btn-danger btn-only-hover",
|
194
|
+
|
195
|
+
has_permission_to_edit: true
|
196
|
+
)
|
197
|
+
|
198
|
+
if @current_permission
|
199
|
+
options[:has_permission_to_edit] = @current_permission.can_update?
|
200
|
+
end
|
201
|
+
|
202
|
+
links = []
|
203
|
+
links << link_to(raw("<i class=\"#{options[:feature_icon]} mr-5\"></i> #{options[:feature_text]}"), options[:feature_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:feature_class]) unless object.featured? && options[:has_permission_to_edit]
|
204
|
+
links << link_to(raw("<i class=\"#{options[:unfeature_icon]} mr-5\"></i> #{options[:unfeature_text]}"), options[:unfeature_link], method: 'PUT', remote: true, role: "menuitem", tabindex: "-1", class: options[:unfeature_class]) if object.featured? && options[:has_permission_to_edit]
|
205
|
+
raw(links.join(""))
|
206
|
+
end
|
207
|
+
|
208
|
+
def display_manage_buttons(object, **options)
|
209
|
+
options.reverse_merge!(
|
210
|
+
edit_icon: 'fa fa-edit',
|
211
|
+
delete_icon: 'fa fa-trash',
|
212
|
+
|
213
|
+
edit_link: url_for(action: "edit", controller: object.class.to_s.tableize, id: object.id),
|
214
|
+
delete_link: url_for(action: "destroy", controller: object.class.to_s.tableize, id: object.id),
|
215
|
+
|
216
|
+
edit_text: "Edit",
|
217
|
+
delete_text: "Delete",
|
218
|
+
|
219
|
+
edit_class: "btn btn-block btn-success",
|
220
|
+
delete_class: "btn btn-block btn-danger btn-only-hover"
|
221
|
+
)
|
222
|
+
links = []
|
223
|
+
links << link_to(raw("<i class=\"#{options[:edit_icon]} mr-5\"></i> #{options[:edit_text]}"), options[:edit_link], remote: true, role: "menuitem", tabindex: "-1", class: options[:edit_class]) if object.can_be_edited?
|
224
|
+
links << link_to(raw("<i class=\"#{options[:delete_icon]} mr-5\"></i> #{options[:delete_text]}"), options[:delete_link], method: 'DELETE', remote: true, role: "menuitem", tabindex: "-1", class: options[:delete_class]) if object.can_be_deleted?
|
225
|
+
raw(links.join(""))
|
226
|
+
end
|
227
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Approvable
|
2
|
+
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
# Constants
|
6
|
+
APPROVED = "approved"
|
7
|
+
PENDING = "pending"
|
8
|
+
BLOCKED = "blocked"
|
9
|
+
SUSPENDED = "suspended"
|
10
|
+
REMOVED = "removed"
|
11
|
+
|
12
|
+
STATUS = {"Approved" => APPROVED, "Pending" => PENDING, "Suspended" => SUSPENDED, "Blocked" => BLOCKED, "Removed" => REMOVED}
|
13
|
+
STATUS_REVERSE = {APPROVED => "Approved", PENDING => "Pending", SUSPENDED => "Suspended", BLOCKED => "Blocked", REMOVED => "Removed"}
|
14
|
+
|
15
|
+
included do
|
16
|
+
|
17
|
+
validates :status, :presence=> true, :inclusion => {:in => STATUS_REVERSE.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
|
18
|
+
|
19
|
+
state_machine :status, initial: PENDING do
|
20
|
+
event :approve do
|
21
|
+
transition [PENDING, SUSPENDED] => APPROVED
|
22
|
+
end
|
23
|
+
event :pending do
|
24
|
+
transition [APPROVED, SUSPENDED, BLOCKED, REMOVED] => PENDING
|
25
|
+
end
|
26
|
+
event :suspend do
|
27
|
+
transition [APPROVED, PENDING, BLOCKED] => SUSPENDED
|
28
|
+
end
|
29
|
+
event :block do
|
30
|
+
transition [APPROVED, PENDING, SUSPENDED] => BLOCKED
|
31
|
+
end
|
32
|
+
event :remove do
|
33
|
+
transition [APPROVED, PENDING, SUSPENDED, BLOCKED] => REMOVED
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
scope :approved, -> { where(status: APPROVED) }
|
38
|
+
scope :pending, -> { where(status: PENDING) }
|
39
|
+
scope :blocked, -> { where(status: BLOCKED) }
|
40
|
+
scope :suspended, -> { where(status: SUSPENDED) }
|
41
|
+
scope :removed, -> { where(status: REMOVED) }
|
42
|
+
|
43
|
+
scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Featureable
|
2
|
+
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
# Constants
|
6
|
+
FEATURED = {"Featured" => true, "Non Featured" => false}
|
7
|
+
FEATURED_REVERSE = {true => "Featured", false => "Non Featured"}
|
8
|
+
|
9
|
+
included do
|
10
|
+
|
11
|
+
scope :featured, lambda { |val| where(featured: val) }
|
12
|
+
|
13
|
+
def mark_as_featured
|
14
|
+
self.update_attribute(:featured, true)
|
15
|
+
end
|
16
|
+
|
17
|
+
def remove_from_featured
|
18
|
+
self.update_attribute(:featured, false)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|