permissify 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|