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.
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