permissify 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. data/lib/generators/permissify/views/USAGE +3 -0
  2. data/lib/generators/permissify/views/template/permissions/_add_form.erb +13 -0
  3. data/lib/generators/permissify/views/template/permissions/_aggregate_permissions.html.erb +7 -0
  4. data/lib/generators/permissify/views/template/permissions/_color_coded_permission.erb +3 -0
  5. data/lib/generators/permissify/views/template/permissions/_copy_controls.erb +31 -0
  6. data/lib/generators/permissify/views/template/permissions/_cross_reference.html.erb +26 -0
  7. data/lib/generators/permissify/views/template/permissions/_form.erb +32 -0
  8. data/lib/generators/permissify/views/template/permissions/_list.erb +12 -0
  9. data/lib/generators/permissify/views/template/permissions/_list_header.erb +1 -0
  10. data/lib/generators/permissify/views/template/permissions/_model_permissions.html.erb +12 -0
  11. data/lib/generators/permissify/views/template/permissions/_permission.erb +11 -0
  12. data/lib/generators/permissify/views/template/permissions/_permission_category.erb +6 -0
  13. data/lib/generators/permissify/views/template/permissions/_row.erb +21 -0
  14. data/lib/generators/permissify/views/template/permissions/_section.html.erb +18 -0
  15. data/lib/generators/permissify/views/template/permissions/create_response.rjs +15 -0
  16. data/lib/generators/permissify/views/template/permissions/destroy_response.rjs +12 -0
  17. data/lib/generators/permissify/views/template/permissions/edit_response.js.erb +4 -0
  18. data/lib/generators/permissify/views/template/permissions/index.html.erb +52 -0
  19. data/lib/generators/permissify/views/template/permissions/update_response.js.erb +6 -0
  20. data/lib/generators/permissify/views/template/permissions_helper.rb +211 -0
  21. data/lib/generators/permissify/views/template/role.rb +66 -0
  22. data/lib/generators/permissify/views/template/roles/_additional_index_columns.erb +2 -0
  23. data/lib/generators/permissify/views/template/roles/_permissions_fields.erb +27 -0
  24. data/lib/generators/permissify/views/template/roles.rb +52 -0
  25. data/lib/generators/permissify/views/template/roles_helper.rb +8 -0
  26. data/lib/generators/permissify/views/views_generator.rb +16 -0
  27. metadata +33 -8
@@ -0,0 +1,3 @@
1
+ Description:
2
+ The permissify:role generator creates a Role class in the models directory.
3
+ You can move this file anywhere you want as long as it is in the load path.
@@ -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
+ &nbsp;&nbsp;&nbsp;
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>&nbsp;&nbsp;
7
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <a id="<%=@permission[:key]%>" style="color:<%=colorized_permission%>" onclick="<%=permission_click_actions%>">
2
+ <%= @permission[:action] %>
3
+ </a>&nbsp;&nbsp;
@@ -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
+ &nbsp;&nbsp;
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
+ &nbsp;
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,6 @@
1
+ <tr style="vertical-align:text-top;">
2
+
3
+ <td style="width:205px">&nbsp;&nbsp;&nbsp;<a onclick="$('<%=category_name%>').toggle();"><%= @category %></a></td>
4
+
5
+ <td><%= render(:partial => "permissions/#{@permissions_partial}") %></td>
6
+ </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
+ &nbsp;<%= 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
+ &nbsp;<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/>&nbsp;
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,4 @@
1
+ $("#permissions_list").hide();
2
+ $("#permissions_form").show();
3
+ $("#permissions_form").html("<%= escape_javascript(render(:partial => 'permissions/form')) %>");
4
+ $("#role_name").focus().select();
@@ -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,6 @@
1
+ <%- if @saved %>
2
+ window.location = "/roles?id=<%= @permissions_object.id %>"
3
+ <%- else %>
4
+ set_page_tag page, @permissions_object
5
+ edit_model "#permissions_list", "#permissions_form", "#{@permissions_prefix}name"
6
+ <%- end %>
@@ -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,2 @@
1
+ <td id="<%= additional_column_id(1) %>"><%= additional_column1_value %></td>
2
+ <td id="<%= additional_column_id(2) %>" style="text-align: right"><%= additional_column2_value %></td>
@@ -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: 15
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 8
10
- version: 0.0.8
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-02 00:00:00 Z
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: 21
44
+ hash: 3
45
45
  segments:
46
46
  - 3
47
- - 0
48
- - 9
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