permissify 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/generators/permissify/views/USAGE +3 -0
- data/lib/generators/permissify/views/template/permissions/_add_form.erb +13 -0
- data/lib/generators/permissify/views/template/permissions/_aggregate_permissions.html.erb +7 -0
- data/lib/generators/permissify/views/template/permissions/_color_coded_permission.erb +3 -0
- data/lib/generators/permissify/views/template/permissions/_copy_controls.erb +31 -0
- data/lib/generators/permissify/views/template/permissions/_cross_reference.html.erb +26 -0
- data/lib/generators/permissify/views/template/permissions/_form.erb +32 -0
- data/lib/generators/permissify/views/template/permissions/_list.erb +12 -0
- data/lib/generators/permissify/views/template/permissions/_list_header.erb +1 -0
- data/lib/generators/permissify/views/template/permissions/_model_permissions.html.erb +12 -0
- data/lib/generators/permissify/views/template/permissions/_permission.erb +11 -0
- data/lib/generators/permissify/views/template/permissions/_permission_category.erb +6 -0
- data/lib/generators/permissify/views/template/permissions/_row.erb +21 -0
- data/lib/generators/permissify/views/template/permissions/_section.html.erb +18 -0
- data/lib/generators/permissify/views/template/permissions/create_response.rjs +15 -0
- data/lib/generators/permissify/views/template/permissions/destroy_response.rjs +12 -0
- data/lib/generators/permissify/views/template/permissions/edit_response.js.erb +4 -0
- data/lib/generators/permissify/views/template/permissions/index.html.erb +52 -0
- data/lib/generators/permissify/views/template/permissions/update_response.js.erb +6 -0
- data/lib/generators/permissify/views/template/permissions_helper.rb +211 -0
- data/lib/generators/permissify/views/template/role.rb +66 -0
- data/lib/generators/permissify/views/template/roles/_additional_index_columns.erb +2 -0
- data/lib/generators/permissify/views/template/roles/_permissions_fields.erb +27 -0
- data/lib/generators/permissify/views/template/roles.rb +52 -0
- data/lib/generators/permissify/views/template/roles_helper.rb +8 -0
- data/lib/generators/permissify/views/views_generator.rb +16 -0
- metadata +33 -8
@@ -0,0 +1,13 @@
|
|
1
|
+
<tfoot>
|
2
|
+
<tr>
|
3
|
+
<td colspan="<%= @index_columns %>">
|
4
|
+
<br/>
|
5
|
+
<%= form_for Role.new, :remote => true do |f| %>
|
6
|
+
<%= f.text_field :name, :maxlength => 31, :size => 12 %>
|
7
|
+
|
8
|
+
<%= f.submit 'create role', :class => 'fncyBtn' %>
|
9
|
+
<%- end %>
|
10
|
+
</td>
|
11
|
+
</tr>
|
12
|
+
<tr><td colspan="<%= @index_columns %>" id='add_errors'></td></tr>
|
13
|
+
</tfoot>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<% category_permissions.each do |@permission| %>
|
2
|
+
<% next if (@permission[:key] == 'corporate_portal_delete') || (@permission[:key] == 'brand_portal_delete') %>
|
3
|
+
<%- mthp = models_that_have_permission %>
|
4
|
+
<a href='#' title='<%=mthp%>' style='color:<%= mthp == 'none' ? 'red':'green' %>'>
|
5
|
+
<%= @permission[:action] %>
|
6
|
+
</a>
|
7
|
+
<% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<%= form_for Role.new, :remote => true do |f| %>
|
2
|
+
<div id="copy_form_<%= @permissions_object.id %>" style="display:none;background-color:#fffff0;padding:3px;" class="copy_form">
|
3
|
+
|
4
|
+
<%= f.text_field :name, :value => @permissions_object.name + ' copy', :maxlength => 31, :size => 17 %>
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
<div class="buttonContainer newBtn">
|
9
|
+
<input type="submit" value="copy" class="fncyBtn"/>
|
10
|
+
<!-- TODO : figure out how to get the :with stuff specified below to actually post -->
|
11
|
+
<!-- %= link_to "copy", "/roles",
|
12
|
+
{ :method => :post,
|
13
|
+
:remote => true,
|
14
|
+
:class => 'fncyBtn',
|
15
|
+
:with => "'create[from]=#{@permissions_object.id}&create[name]='+document.getElementById(\"create_name#{@permissions_object.id}\").value"
|
16
|
+
}
|
17
|
+
% -->
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<br/><br/>
|
21
|
+
|
22
|
+
<div id="add<%= @permissions_object.id %>_errors" style="display:none;"></div>
|
23
|
+
|
24
|
+
<a href="#" onclick="return cancel_copy(<%= @permissions_object.id %>);">cancel</a>
|
25
|
+
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<a href="#" id="copy_link_<%= @permissions_object.id %>" onclick="return show_copy_form(<%= @permissions_object.id %>)" class="copy_link">
|
29
|
+
copy
|
30
|
+
</a>
|
31
|
+
<%- end %>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<table>
|
2
|
+
<tbody>
|
3
|
+
<tr>
|
4
|
+
<td colspan="3">
|
5
|
+
<br/>
|
6
|
+
<strong>
|
7
|
+
<a onclick="$('af_permissions_categories').toggle(); $('#af_permissions_categories').toggle(); return false;" style="color:#0A5DBB;">
|
8
|
+
Permissions Cross-reference
|
9
|
+
</a>
|
10
|
+
</strong>
|
11
|
+
<div id='af_permissions_categories' style='display:none;'>
|
12
|
+
<br/>
|
13
|
+
<table>
|
14
|
+
<tbody>
|
15
|
+
<%= @section_prefix = 'af_'
|
16
|
+
@permissions_partial = :aggregate_permissions
|
17
|
+
render(:partial => 'permissions/section', :collection => permissions_sections)
|
18
|
+
%>
|
19
|
+
</tbody>
|
20
|
+
</table>
|
21
|
+
</div>
|
22
|
+
</td>
|
23
|
+
</tr>
|
24
|
+
</tbody>
|
25
|
+
</table>
|
26
|
+
<br/>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<%- set_tag @permissions_object %>
|
2
|
+
<h1 class="pageName">Edit <%= @permissions_header %></h1>
|
3
|
+
<%= form_tag form_path, :method => :put, :remote => true do |f| %>
|
4
|
+
<!-- %= error_messages_for :product_tier % -->
|
5
|
+
<table>
|
6
|
+
<tbody>
|
7
|
+
<%= render :partial => 'permissions_fields' %>
|
8
|
+
<tr>
|
9
|
+
<td colspan="3">
|
10
|
+
<br/>
|
11
|
+
<strong>
|
12
|
+
<a id="permissions_expand" onclick="$('.permissionsCategory').show(); $('#permissions_collapse').show(); $('#permissions_expand').hide(); return false;" style="color:#0A5DBB;">Permissions</a>
|
13
|
+
<a id="permissions_collapse" onclick="$('.permissionsCategory').hide(); $('#permissions_collapse').hide(); $('#permissions_expand').show(); return false;" style="color:#0A5DBB; display:none;">Permissions</a>
|
14
|
+
</strong>
|
15
|
+
</td>
|
16
|
+
</tr>
|
17
|
+
|
18
|
+
<%= @section_prefix = ''; @permissions_partial = :model_permissions; render(:partial => 'permissions/section', :collection => permissions_sections) %>
|
19
|
+
|
20
|
+
<tr>
|
21
|
+
<td></td>
|
22
|
+
<td colspan="2">
|
23
|
+
<%- if allowed_to?(:update, @permissions_category) %>
|
24
|
+
<input type="submit" value="Save"/> or
|
25
|
+
<%- end %>
|
26
|
+
<a href="#" onclick="toggle_views(); self.scrollTo(0, 0); $('af_permissions_categories').hide();">cancel</a>
|
27
|
+
</td>
|
28
|
+
</tr>
|
29
|
+
|
30
|
+
</tbody>
|
31
|
+
</table>
|
32
|
+
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<h1 class="pageName" id='permissions_header'>
|
2
|
+
<%= render :partial => "permissions/list_header" %>
|
3
|
+
</h1>
|
4
|
+
|
5
|
+
<table width='100%'>
|
6
|
+
<tbody id='permissions'>
|
7
|
+
<% permissions_group.each do |@permissions_object| %><%= render :partial => 'permissions/row' %><% end %>
|
8
|
+
</tbody>
|
9
|
+
<%= render(:partial => "permissions/add_form") if allowed_to?(:create, @permissions_category) %>
|
10
|
+
</table>
|
11
|
+
|
12
|
+
<%= render(:partial => "permissions/cross_reference") %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= "#{permissions_group.size} #{@permissions_header}#{permissions_group.size == 1 ? '' : 's'}" %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<% category_permissions.each do |@permission| %>
|
2
|
+
<% next if (@permission[:key] == 'corporate_portal_delete') || (@permission[:key] == 'brand_portal_delete') %>
|
3
|
+
<%= render :partial => 'permissions/color_coded_permission' %>
|
4
|
+
<% end %>
|
5
|
+
<table id="<%=category_name%>" style="display:none;">
|
6
|
+
<tbody>
|
7
|
+
<% category_permissions.each do |@permission| %>
|
8
|
+
<% next if (@permission[:key] == 'corporate_portal_delete') || (@permission[:key] == 'brand_portal_delete') %>
|
9
|
+
<%= render :partial => 'permissions/permission' %>
|
10
|
+
<% end %>
|
11
|
+
</tbody>
|
12
|
+
</table>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<tr>
|
2
|
+
<td>
|
3
|
+
<label>
|
4
|
+
<%= check_box_tag "#{@permissions_name}[permissions][#{@permission[:key]}][0]", 1,
|
5
|
+
(@permissions_object.permissions[@permission[:key]]['0'] == '1' rescue false),
|
6
|
+
:onchange => "toggle_color_coded_permission('#{@permission[:key]}', this.checked);" %>
|
7
|
+
<%= @permission[:action] %>
|
8
|
+
</label>
|
9
|
+
<%= permission_values %>
|
10
|
+
</td>
|
11
|
+
</tr>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%- set_tag @permissions_object %>
|
2
|
+
<%- saved = params[:id] && params[:id].to_i == @permissions_object.id %>
|
3
|
+
<tr class="<%= cycle('odd', 'even') %>" id="<%=data_tag%>" <%= "style='background-color:palegreen;'" if saved %> >
|
4
|
+
|
5
|
+
<td><%= link_to permissions_group_name, edit_url, :method => :get, :remote => true, :id => "#{edit_tag}" %></td>
|
6
|
+
<%= render(:partial => 'additional_index_columns') %>
|
7
|
+
<td>
|
8
|
+
<%- if allowed_to?(:delete, @permissions_category) %>
|
9
|
+
<span id="<%=delete_tag%>">
|
10
|
+
<%= link_to("delete", form_path, :method => 'delete', :remote => true) unless @permissions_object.class.seeded?(@permissions_object) %>
|
11
|
+
</span>
|
12
|
+
<%- end %>
|
13
|
+
</td>
|
14
|
+
|
15
|
+
<td>
|
16
|
+
<%= render(:partial => 'permissions/copy_controls') if allowed_to?(:create, @permissions_category) %>
|
17
|
+
</td>
|
18
|
+
|
19
|
+
<td id="<%=status_tag%>"></td>
|
20
|
+
|
21
|
+
</tr>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%- @section = section %>
|
2
|
+
<tr>
|
3
|
+
<td colspan="3">
|
4
|
+
<strong>
|
5
|
+
<a onclick="$('#<%=@section_prefix+@section.gsub(' ','_').gsub(':','')%>').toggle(); return false;" style="color:#67B1E6"><%= @section %></a>
|
6
|
+
</strong>
|
7
|
+
<div id="<%=@section_prefix+@section.gsub(' ','_').gsub(':','')%>" class="permissionsCategory" style="display:none">
|
8
|
+
<table>
|
9
|
+
<tbody>
|
10
|
+
<%- section_categories.each do |@category| %>
|
11
|
+
<%= render :partial => 'permissions/permission_category' %>
|
12
|
+
<%- end %>
|
13
|
+
</tbody>
|
14
|
+
</table>
|
15
|
+
</div>
|
16
|
+
<br/>
|
17
|
+
</td>
|
18
|
+
</tr>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
set_page_tag page, @permissions_object
|
2
|
+
if @response_message.blank?
|
3
|
+
update_list_header 'permissions/list_header', 'permissions_header'
|
4
|
+
page.call '$("#permissions").append("' + escape_javascript(render(:partial => 'permissions/row')) + '"); fixme'
|
5
|
+
page.call '$("#role_name").val("");fixme'
|
6
|
+
|
7
|
+
# wrap_up_copy if @permissions_object.from
|
8
|
+
|
9
|
+
page.call '$("#permissions_list").hide();fixme'
|
10
|
+
page.call '$("#permissions_form").html("' + escape_javascript(render(:partial => 'permissions/form')) + '"); fixme'
|
11
|
+
page.call '$("#permissions_form").show();fixme'
|
12
|
+
page.call '$("#' + @permissions_prefix + 'name").focus();fixme'
|
13
|
+
else
|
14
|
+
show_errors "add#{@permissions_object.from}", "create_name#{@permissions_object.from}"
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
if @permissions_object.destroyed?
|
2
|
+
new_count = escape_javascript(destroy_message)
|
3
|
+
header = '$("#permissions_header").html("' + new_count + '")'
|
4
|
+
page.call("#{header};fixme");
|
5
|
+
remove_row = '$("#data_role_' + @permissions_object.id.to_s + '").remove()'
|
6
|
+
page.call("#{remove_row};fixme")
|
7
|
+
remove_errors = '$("#errors_role_' + @permissions_object.id.to_s + '").remove()'
|
8
|
+
page.call("#{remove_errors};fixme")
|
9
|
+
else
|
10
|
+
# set_page_tag_and_highlight_data page, @permissions_object
|
11
|
+
show_model_errors
|
12
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<script type="text/javascript">
|
2
|
+
function fixme() {}
|
3
|
+
function toggle_views() {
|
4
|
+
$('#permissions_form').toggle();
|
5
|
+
$('#permissions_list').toggle();
|
6
|
+
return false;
|
7
|
+
}
|
8
|
+
function toggle_color_coded_permission(permission_id, permission_checkbox) {
|
9
|
+
permission_link = document.getElementById(permission_id)
|
10
|
+
if (permission_checkbox.checked == true) {
|
11
|
+
permission_checkbox.checked = false;
|
12
|
+
permission_link.style.color = 'red';
|
13
|
+
} else {
|
14
|
+
permission_checkbox.checked = true;
|
15
|
+
permission_link.style.color = 'green';
|
16
|
+
}
|
17
|
+
}
|
18
|
+
function clear_all_in_category(element_in_category, permissions_prefix) {
|
19
|
+
var was_not_set = element_in_category.style.color == 'red';
|
20
|
+
var links = element_in_category.parentNode.getElementsByTagName('a');
|
21
|
+
for(var i = 0; i < links.length; i++){
|
22
|
+
clear_permission(links[i], permissions_prefix)
|
23
|
+
}
|
24
|
+
if (was_not_set == true) {
|
25
|
+
toggle_color_coded_permission(element_in_category.id, permission_checkbox(element_in_category, permissions_prefix))
|
26
|
+
}
|
27
|
+
}
|
28
|
+
function clear_permission(permission_link, permissions_prefix) {
|
29
|
+
permission_checkbox(permission_link, permissions_prefix).checked = false;
|
30
|
+
permission_link.style.color = 'red';
|
31
|
+
}
|
32
|
+
function permission_checkbox(permission_link, permissions_prefix) {
|
33
|
+
return document.getElementById(permissions_prefix + 'permissions_' + permission_link.id + '_0')
|
34
|
+
}
|
35
|
+
function show_copy_form(copy_from_id) {
|
36
|
+
$('.copy_form').hide();
|
37
|
+
$('.copy_link').show();
|
38
|
+
$('#copy_link_'+copy_from_id).hide();
|
39
|
+
$('#copy_form_'+copy_from_id).show();
|
40
|
+
$('#name_'+copy_from_id).focus();
|
41
|
+
$('#name_'+copy_from_id).select();
|
42
|
+
$('#add'+copy_from_id+'_errors').hide();
|
43
|
+
return false;
|
44
|
+
}
|
45
|
+
function cancel_copy(copy_from_id) {
|
46
|
+
$('#copy_link_'+copy_from_id).show();
|
47
|
+
$('#copy_form_'+copy_from_id).hide();
|
48
|
+
return false;
|
49
|
+
}
|
50
|
+
</script>
|
51
|
+
<div id="permissions_form" style="display: none;"></div>
|
52
|
+
<div id="permissions_list"><%= render :partial => "permissions/list" %></div>
|
@@ -0,0 +1,211 @@
|
|
1
|
+
module PermissionsHelper
|
2
|
+
def set_tag(model); @tag = "_#{model.class.name.titleize.downcase.gsub(' ','_')}_#{model.id}"; end
|
3
|
+
def data_tag ; tag_for 'data'; end
|
4
|
+
def tag_for(t); "#{t}#{@tag}"; end
|
5
|
+
def delete_tag ; tag_for 'delete'; end
|
6
|
+
def product_permissions; @permissions ||= Ability.all_for(@applicability); end
|
7
|
+
def section_categories
|
8
|
+
section_permissions = product_permissions.select{|permission| permission[:section] == @section }
|
9
|
+
section_permissions.collect{|sp| sp[:category]}.uniq.sort
|
10
|
+
end
|
11
|
+
def permissions_group; @permissions_group_list ||= @permissions_class.find(:all, :order => "#{@permissions_class.table_name}.#{@sort_field} ASC"); end
|
12
|
+
def permissions_group_name ; truncate(@permissions_object.name, :length => 40) ; end
|
13
|
+
def status_tag ; tag_for 'status' ; end
|
14
|
+
def edit_tag ; tag_for 'edit' ; end
|
15
|
+
def colorized_permission; @permissions_object.allows?(@permission[:key]) ? 'green' : 'red' ; end
|
16
|
+
def category_permissions
|
17
|
+
return @category_permissions if @category == @last_category
|
18
|
+
@last_category = @category
|
19
|
+
@category_permissions = @permissions.select{|pa| pa[:category] == @category}
|
20
|
+
@category_permissions.sort!{|pa1,pa2| pa1[:position] <=> pa2[:position]}
|
21
|
+
end
|
22
|
+
def category_name; 'category_' + @category.downcase.gsub(' ', '_'); end
|
23
|
+
|
24
|
+
def permission_click_actions
|
25
|
+
actions = category_allows_one_or_none ? clear_all_in_category : click_associated_checkbox
|
26
|
+
actions += expand_category + focus_and_select_first_additional_input if @permission[:number_of_values] > 1
|
27
|
+
actions
|
28
|
+
end
|
29
|
+
|
30
|
+
def category_allows_one_or_none
|
31
|
+
@permission[:category_allows] == :one_or_none
|
32
|
+
end
|
33
|
+
def clear_all_in_category
|
34
|
+
"clear_all_in_category(this, '#{@permissions_prefix}');"
|
35
|
+
end
|
36
|
+
def click_associated_checkbox
|
37
|
+
"toggle_color_coded_permission('#{@permission[:key]}', document.getElementById('#{@permissions_prefix}permissions_#{@permission[:key]}_0'));"
|
38
|
+
end
|
39
|
+
def expand_category ; "$('##{category_name}').show();" ; end
|
40
|
+
def focus_and_select_first_additional_input ; "$('##{@permissions_prefix}permissions_#{@permission[:key]}_1').focus().select()" ; end
|
41
|
+
|
42
|
+
def permission_values
|
43
|
+
@permission[:administration_expression].split('**').collect{|@token| permission_token }.join('')
|
44
|
+
end
|
45
|
+
|
46
|
+
def permission_token
|
47
|
+
@token.starts_with?('*') ? permission_input(@token.delete('*').split(':')) : @token
|
48
|
+
end
|
49
|
+
|
50
|
+
def permission_input(specification)
|
51
|
+
permission_text_input(specification) if specification[1] == 'text'
|
52
|
+
end
|
53
|
+
|
54
|
+
def permission_text_input(specification)
|
55
|
+
size = specification[2].to_i
|
56
|
+
size = 4 if size == 0
|
57
|
+
value = (@permissions_object.permissions[@permission[:key]][specification[0]] rescue nil)
|
58
|
+
value = @permission[:default_values][specification[0].to_i] if value.blank?
|
59
|
+
name = "#{@permissions_name}[permissions][#{@permission[:key]}][#{specification[0]}]"
|
60
|
+
id = "#{@permissions_prefix}permissions_#{@permission[:key]}_#{specification[0]}"
|
61
|
+
"<input type='text' id='#{id}' name='#{name}' value='#{value}' size='#{size}' maxlength='#{size}'/>"
|
62
|
+
end
|
63
|
+
|
64
|
+
def edit_url; send("edit_#{@permissions_name}_url", :id => @permissions_object); end
|
65
|
+
def add_url; send("#{@permissions_name}s_path") ; end
|
66
|
+
def copy_url; edit_url; end # TODO : same as edit for now
|
67
|
+
def form_path; send("#{@permissions_name}_path", :id => @permissions_object.id); end
|
68
|
+
def additional_column_id(i); "ac#{i}_#{@permissions_object.id}"; end
|
69
|
+
|
70
|
+
def permissions_sections
|
71
|
+
# send("BONK_#{@permissions_name}")
|
72
|
+
{ 'role' => [ 'Tabs',
|
73
|
+
'Admin',
|
74
|
+
'Dealer Admin',
|
75
|
+
'Corporate Admin',
|
76
|
+
'Brand Admin',
|
77
|
+
'Merchant Admin'
|
78
|
+
],
|
79
|
+
'products' => [ 'Branch and Location Portals : Settings',
|
80
|
+
'Branch and Location Portals : Social Media',
|
81
|
+
'Branch and Location Portals : Web Page',
|
82
|
+
'Solutions'
|
83
|
+
]
|
84
|
+
}[@permissions_name] # ugghhh : not working in helpers...
|
85
|
+
end
|
86
|
+
|
87
|
+
def models_that_have_permission
|
88
|
+
mthp = @permissions_group_list.select{|p| p.permissions[@permission[:key]] }.collect(&:name).sort.reverse.join(', ')
|
89
|
+
mthp.blank? ? 'none' : mthp
|
90
|
+
end
|
91
|
+
|
92
|
+
def copy_name
|
93
|
+
"#{@permissions_object.name} copy"
|
94
|
+
end
|
95
|
+
|
96
|
+
def destroy_message
|
97
|
+
"#{permissions_group.size} #{@permissions_header}#{permissions_group.size == 1 ? '' : 's'}<br/><div style='color:green; font-size:0.5em;'>'#{@permissions_object.name}' deleted</div>"
|
98
|
+
end
|
99
|
+
|
100
|
+
##### RJS stuff : ughhh... TODO : determine what is needed...
|
101
|
+
def set_page_tag(page, model) ; @page = page ; @page_model = model ; set_tag(model) ; end
|
102
|
+
def set_tag(model); @tag = "_#{model.class.name.titleize.downcase.gsub(' ','_')}_#{model.id}"; end
|
103
|
+
def data_tag ; tag_for 'data'; end
|
104
|
+
def delete_tag ; tag_for 'delete'; end
|
105
|
+
def errors_tag ; tag_for 'errors' ; end
|
106
|
+
def email_status_tag ; tag_for 'email_status'; end
|
107
|
+
def tag_for(t); "#{t}#{@tag}"; end
|
108
|
+
def update_list_header(header_partial, header_id=header_partial)
|
109
|
+
updated_header = render(:partial => header_partial)
|
110
|
+
@page.call '$("#' + header_id + '").html( "' + escape_javascript(updated_header) + '" );fixme'
|
111
|
+
end
|
112
|
+
|
113
|
+
def set_page_tag_and_highlight_data(page, model)
|
114
|
+
set_page_tag(page, model)
|
115
|
+
@page.visual_effect :highlight, data_tag, :duration => 1
|
116
|
+
end
|
117
|
+
|
118
|
+
def highlight_row_and_clear_add_form(table_id, add_errors_id, name_field_id)
|
119
|
+
insert_row_and_clear_add_form(table_id, add_errors_id, name_field_id)
|
120
|
+
@page.visual_effect :highlight, data_tag, :duration => 2
|
121
|
+
case name_field_id
|
122
|
+
when /create_email/
|
123
|
+
@page['#noticeExplanation'].replace_html('<h2>We will send a confirmation email to the address you entered. Click on the link in the email to activate the address and add it to your list.</h2>')
|
124
|
+
show_flash_notice_message
|
125
|
+
hide_flash_success_message
|
126
|
+
@page.show "add_email_address"
|
127
|
+
@page.hide "create_new_email"
|
128
|
+
when /create_keyword/
|
129
|
+
@page['#successExplanation'].replace_html('<h2>The keyword has been added.</h2>')
|
130
|
+
hide_flash_notice_message
|
131
|
+
show_flash_success_message
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def hide_flash_error_message
|
136
|
+
@page.hide "errorExplanation"
|
137
|
+
end
|
138
|
+
|
139
|
+
def hide_flash_success_message
|
140
|
+
@page.hide "successExplanation"
|
141
|
+
end
|
142
|
+
|
143
|
+
def hide_flash_notice_message
|
144
|
+
@page.hide "noticeExplanation"
|
145
|
+
end
|
146
|
+
|
147
|
+
def show_flash_error_message
|
148
|
+
@page.show "errorExplanation"
|
149
|
+
end
|
150
|
+
|
151
|
+
def show_flash_success_message
|
152
|
+
@page.show "successExplanation"
|
153
|
+
end
|
154
|
+
|
155
|
+
def show_flash_notice_message
|
156
|
+
@page.show "noticeExplanation"
|
157
|
+
end
|
158
|
+
|
159
|
+
def insert_row_and_clear_add_form(table_id, add_errors_id, name_field_id, row_partial='row')
|
160
|
+
@page.call '$("' + table_id + '").append("' + escape_javascript(render(:partial => row_partial)) + '"); fixme'
|
161
|
+
# @page.insert_html :bottom, table_id, :partial => row_partial
|
162
|
+
@page.hide add_errors_id
|
163
|
+
@page[name_field_id].value = ''
|
164
|
+
end
|
165
|
+
|
166
|
+
def wrap_up_copy
|
167
|
+
from_id = @permissions_object.from
|
168
|
+
@page.call '$("#copy_form_' + from_id + '").hide();fixme'
|
169
|
+
@page.call '$("#copy_link_' + from_id + '").show();fixme'
|
170
|
+
end
|
171
|
+
|
172
|
+
def show_errors(error_id, field_id)
|
173
|
+
error_id = '#' + error_id + '_errors'
|
174
|
+
@page.replace_html error_id, h(truncate(@response_message, 253, "..."))
|
175
|
+
@page.show error_id
|
176
|
+
@page.visual_effect :highlight, error_id.delete('#'), :duration => 2
|
177
|
+
@page[field_id].focus.select
|
178
|
+
end
|
179
|
+
|
180
|
+
def show_model_errors
|
181
|
+
@page[errors_tag].replace_html h(truncate(@page_model.errors.full_messages.join(' '), 253, "..."))
|
182
|
+
@page.show errors_tag
|
183
|
+
@page.visual_effect :highlight, errors_tag, :duration => 1
|
184
|
+
end
|
185
|
+
|
186
|
+
def update_list_header_and_animate_delete(header_partial, delete_id_tags=[], header_id=header_partial)
|
187
|
+
update_list_header header_partial, header_id
|
188
|
+
animate_delete header_partial, delete_id_tags
|
189
|
+
end
|
190
|
+
|
191
|
+
def animate_delete(header_partial='', id_tags=[])
|
192
|
+
@page[delete_tag].replace_html '<span style="color:red"><b>DELETED</b></span>'
|
193
|
+
case header_partial
|
194
|
+
when ''
|
195
|
+
@page['#successExplanation'].replace_html('<h2>This email address has been deleted.</h2>')
|
196
|
+
when /keyword_count/
|
197
|
+
@page['#successExplanation'].replace_html('<h2>The keyword has been deleted.</h2>')
|
198
|
+
end
|
199
|
+
@page.delay(1.5) { ([data_tag, errors_tag] + id_tags).each {|id_tag| @page[id_tag].prev().prev().remove;@page[id_tag].prev().remove;@page[id_tag].remove} }
|
200
|
+
show_flash_success_message
|
201
|
+
hide_flash_notice_message
|
202
|
+
end
|
203
|
+
|
204
|
+
def edit_model(list_id, form_id, field_id, form_partial = 'form')
|
205
|
+
@page.hide list_id
|
206
|
+
@page.replace_html form_id, :partial => form_partial
|
207
|
+
@page.show form_id
|
208
|
+
@page[field_id].focus.select
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
class Role < ActiveRecord::Base
|
2
|
+
DOMAIN_TYPES = %w(Admin Dealer Corporate Brand Merchant)
|
3
|
+
include Permissify::Model
|
4
|
+
# is_paranoid
|
5
|
+
# default_scope :conditions => {:deleted_at => nil}, :order => "roles.name"
|
6
|
+
has_and_belongs_to_many :users
|
7
|
+
validates_presence_of :name, :domain_type
|
8
|
+
validates_uniqueness_of :name
|
9
|
+
before_create :initialize_permissions
|
10
|
+
before_validation :initialize_non_permission_values
|
11
|
+
serialize :permissions
|
12
|
+
serialize :can_manage_roles
|
13
|
+
after_save :propagate_managed_by
|
14
|
+
|
15
|
+
class << self
|
16
|
+
include Permissify::ModelClass
|
17
|
+
include SystemFixtures::Roles
|
18
|
+
# def super_user; locate(1, 'super user'); end
|
19
|
+
# def system_admin; locate(2, 'system admin'); end
|
20
|
+
# def dealer_admin; locate(3, 'dealer admin'); end
|
21
|
+
# def corporate_admin; locate(4, 'corporate admin'); end
|
22
|
+
# def brand_admin; locate(5, 'brand admin'); end
|
23
|
+
# def merchant_admin; locate(6, 'merchant admin'); end
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize_non_permission_values
|
27
|
+
establish_from_permissions_model.nil? ? default_non_permissions_values : copy_non_permissions_values
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_non_permissions_values
|
31
|
+
self.can_manage_roles ||= []
|
32
|
+
self.domain_type = DOMAIN_TYPES.last if self.domain_type.blank?
|
33
|
+
self.name = self.name.gsub("'","")
|
34
|
+
end
|
35
|
+
|
36
|
+
def copy_non_permissions_values
|
37
|
+
self.domain_type = self.from_permissions_model.domain_type
|
38
|
+
self.managed_by = self.from_permissions_model.managed_by
|
39
|
+
self.can_manage_roles = self.from_permissions_model.can_manage_roles
|
40
|
+
end
|
41
|
+
|
42
|
+
def manages_roles
|
43
|
+
return [] if quoted_role_names.blank?
|
44
|
+
self.class.find(:all, :conditions => ["name in (#{quoted_role_names})"], :order => :name)
|
45
|
+
end
|
46
|
+
|
47
|
+
def remove(permissions_list); permissions_list.each{|permission| self.permissions.delete(permission)}; save; end
|
48
|
+
|
49
|
+
def quoted_role_names; self.can_manage_roles.collect{|n| "'#{n}'"}.join(', ') rescue []; end
|
50
|
+
|
51
|
+
def managed_by=(role_name_list); @managed_by = role_name_list; end
|
52
|
+
def managed_by
|
53
|
+
@managed_by ||= Role.all.select{|r| r.can_manage_roles.include?(self.name)}.collect(&:name)
|
54
|
+
end
|
55
|
+
|
56
|
+
def propagate_managed_by
|
57
|
+
Role.all.each{ |r| r.update_manages_roles(managed_by.include?(r.name), self.name) } unless @managed_by.nil?
|
58
|
+
end
|
59
|
+
|
60
|
+
def update_manages_roles(manages_role_name, role_name)
|
61
|
+
old = self.manages_roles
|
62
|
+
old = [] if old.blank?
|
63
|
+
new_value = manages_role_name ? old | [role_name] : old - [role_name]
|
64
|
+
update_attribute(:can_manage_roles, new_value) if old != new_value
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<tr>
|
2
|
+
<td><%= label :role, :name, "Name"%></td>
|
3
|
+
<td><b><%= @role.name %></b></td>
|
4
|
+
</tr>
|
5
|
+
|
6
|
+
<tr>
|
7
|
+
<td style="vertical-align:text-top;"><%= label :role, :domain_type, "Domain Type" %></td>
|
8
|
+
<td><%= select :role, :domain_type, Role::DOMAIN_TYPES %></td>
|
9
|
+
</tr>
|
10
|
+
|
11
|
+
<tr>
|
12
|
+
<td>
|
13
|
+
<%= label :role, :can_manage_roles, "Manages users with roles" %>
|
14
|
+
</td>
|
15
|
+
<td>
|
16
|
+
<%= label :role, :managed_by, "Managed by users with roles" %>
|
17
|
+
</td>
|
18
|
+
</tr>
|
19
|
+
|
20
|
+
<tr>
|
21
|
+
<td>
|
22
|
+
<%= select :role, :can_manage_roles, all_roles_grouped_by_domain_type.collect(&:name) - [@role.name], {}, {:multiple => true, :size => [all_roles.size, 12].min} %>
|
23
|
+
</td>
|
24
|
+
<td>
|
25
|
+
<%= select :role, :managed_by, all_roles_grouped_by_domain_type.collect(&:name), {}, {:multiple => true, :size => [all_roles.size, 12].min} %>
|
26
|
+
</td>
|
27
|
+
</tr>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module SystemFixtures::Roles
|
2
|
+
SEEDED_ORDERED_ROLES = ['super user', 'system admin', 'dealer admin', 'corporate admin', 'brand admin', 'merchant admin']
|
3
|
+
SEED_SPECIFICATIONS = (1..SEEDED_ORDERED_ROLES.length).zip(SEEDED_ORDERED_ROLES)
|
4
|
+
|
5
|
+
def seeded?(role); role.id <= SEEDED_ORDERED_ROLES.length; end
|
6
|
+
def seed; create_seeds :roles, SEED_SPECIFICATIONS; end
|
7
|
+
|
8
|
+
def create_super_user; create_with(1, SEEDED_ORDERED_ROLES, 'Admin') ; end
|
9
|
+
def create_system_admin; create_with(2, SEEDED_ORDERED_ROLES[1..5], 'Admin') ; end
|
10
|
+
def create_dealer_admin; create_with(3, SEEDED_ORDERED_ROLES[2..5], 'Dealer') ; end
|
11
|
+
def create_corporate_admin; create_with(4, SEEDED_ORDERED_ROLES[3..5], 'Corporate') ; end
|
12
|
+
def create_brand_admin; create_with(5, ['Merchant'], 'Brand') ; end
|
13
|
+
def create_merchant_admin; create_with(6, ['Merchant'], 'Merchant') ; end
|
14
|
+
|
15
|
+
def create_with(id, other_roles, domain_type)
|
16
|
+
role = create_with_id(:role, id, SEED_SPECIFICATIONS.assoc(id)[1])
|
17
|
+
role.can_manage_roles = other_roles
|
18
|
+
role.domain_type = domain_type
|
19
|
+
role.save
|
20
|
+
role
|
21
|
+
end
|
22
|
+
|
23
|
+
def super_user_permissions
|
24
|
+
@@permissions = Ability.create_permissions_hash
|
25
|
+
end
|
26
|
+
def system_admin_permissions
|
27
|
+
@@permissions = Ability.create_permissions_hash 'roles'
|
28
|
+
end
|
29
|
+
def dealer_admin_permissions
|
30
|
+
@@permissions = Ability.create_permissions_hash( [], %w(roles admin))
|
31
|
+
remove %w(tabs_admin)
|
32
|
+
end
|
33
|
+
|
34
|
+
def corporate_admin_permissions
|
35
|
+
msa_permissions %w(corporate_portal_create brand_portal_create)
|
36
|
+
end
|
37
|
+
def brand_admin_permissions
|
38
|
+
msa_permissions %w(corporate brand_portal_create brand_portal_update)
|
39
|
+
remove %w(tabs_corporate)
|
40
|
+
end
|
41
|
+
def merchant_admin_permissions
|
42
|
+
msa_permissions %w(corporate brand)
|
43
|
+
remove %w(tabs_brand tabs_corporate)
|
44
|
+
end
|
45
|
+
def msa_permissions(exclude_abilities)
|
46
|
+
no_abilities = exclude_abilities + %w(admin roles dealer)
|
47
|
+
@@permissions = Ability.create_permissions_hash([], no_abilities)
|
48
|
+
remove %w(tabs_admin tabs_dealer)
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove(permissions); permissions.each{|permission| @@permissions.delete(permission.to_s)}; @@permissions; end
|
52
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module RolesHelper
|
2
|
+
include PermissionsHelper
|
3
|
+
def all_roles_grouped_by_domain_type; all_roles.sort{|r1, r2| r1.domain_type <=> r2.domain_type}; end
|
4
|
+
def additional_column1_value; @permissions_object.domain_type; end
|
5
|
+
def additional_column2_value; "#{@permissions_object.users.count} users"; end
|
6
|
+
def all_roles; @lazy_all_roles ||= Role.all; end
|
7
|
+
def roles_that_current_user_manages; @lazy_roles_that_current_user_manages = @current_user.manages_roles; end
|
8
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Permissify
|
2
|
+
module Generators
|
3
|
+
class ViewsGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../template', __FILE__)
|
5
|
+
|
6
|
+
def generate_views
|
7
|
+
copy_file "role.rb", "app/views/role.rb"
|
8
|
+
copy_file "roles.rb", "app/views/system_fixtures/roles.rb"
|
9
|
+
|
10
|
+
directory "app/views/permissions"
|
11
|
+
|
12
|
+
empty_directory "app/views/roles"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: permissify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 9
|
10
|
+
version: 0.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Frederick Fix
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-06-
|
18
|
+
date: 2012-06-03 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
@@ -41,12 +41,11 @@ dependencies:
|
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
hash:
|
44
|
+
hash: 3
|
45
45
|
segments:
|
46
46
|
- 3
|
47
|
-
-
|
48
|
-
|
49
|
-
version: 3.0.9
|
47
|
+
- 2
|
48
|
+
version: "3.2"
|
50
49
|
type: :development
|
51
50
|
version_requirements: *id002
|
52
51
|
description: Not so simple authorization solution for Rails.
|
@@ -74,6 +73,32 @@ files:
|
|
74
73
|
- lib/generators/permissify/role/template/role.rb
|
75
74
|
- lib/generators/permissify/role/template/roles.rb
|
76
75
|
- lib/generators/permissify/role/USAGE
|
76
|
+
- lib/generators/permissify/views/template/permissions/_add_form.erb
|
77
|
+
- lib/generators/permissify/views/template/permissions/_aggregate_permissions.html.erb
|
78
|
+
- lib/generators/permissify/views/template/permissions/_color_coded_permission.erb
|
79
|
+
- lib/generators/permissify/views/template/permissions/_copy_controls.erb
|
80
|
+
- lib/generators/permissify/views/template/permissions/_cross_reference.html.erb
|
81
|
+
- lib/generators/permissify/views/template/permissions/_form.erb
|
82
|
+
- lib/generators/permissify/views/template/permissions/_list.erb
|
83
|
+
- lib/generators/permissify/views/template/permissions/_list_header.erb
|
84
|
+
- lib/generators/permissify/views/template/permissions/_model_permissions.html.erb
|
85
|
+
- lib/generators/permissify/views/template/permissions/_permission.erb
|
86
|
+
- lib/generators/permissify/views/template/permissions/_permission_category.erb
|
87
|
+
- lib/generators/permissify/views/template/permissions/_row.erb
|
88
|
+
- lib/generators/permissify/views/template/permissions/_section.html.erb
|
89
|
+
- lib/generators/permissify/views/template/permissions/create_response.rjs
|
90
|
+
- lib/generators/permissify/views/template/permissions/destroy_response.rjs
|
91
|
+
- lib/generators/permissify/views/template/permissions/edit_response.js.erb
|
92
|
+
- lib/generators/permissify/views/template/permissions/index.html.erb
|
93
|
+
- lib/generators/permissify/views/template/permissions/update_response.js.erb
|
94
|
+
- lib/generators/permissify/views/template/permissions_helper.rb
|
95
|
+
- lib/generators/permissify/views/template/role.rb
|
96
|
+
- lib/generators/permissify/views/template/roles/_additional_index_columns.erb
|
97
|
+
- lib/generators/permissify/views/template/roles/_permissions_fields.erb
|
98
|
+
- lib/generators/permissify/views/template/roles.rb
|
99
|
+
- lib/generators/permissify/views/template/roles_helper.rb
|
100
|
+
- lib/generators/permissify/views/USAGE
|
101
|
+
- lib/generators/permissify/views/views_generator.rb
|
77
102
|
- lib/permissify/aggregate.rb
|
78
103
|
- lib/permissify/controller.rb
|
79
104
|
- lib/permissify/model.rb
|