pageflow 0.0.4 → 0.0.5
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.
Potentially problematic release.
This version of pageflow might be problematic. Click here for more details.
- checksums.yaml +13 -5
- data/admins/pageflow/accounts.rb +75 -0
- data/admins/pageflow/entry.rb +112 -0
- data/admins/pageflow/folder.rb +59 -0
- data/admins/pageflow/membership.rb +21 -0
- data/admins/pageflow/revisions.rb +33 -0
- data/admins/pageflow/user.rb +184 -0
- data/lib/pageflow/version.rb +1 -1
- data/vendor/assets/javascripts/audio5.min.js +957 -0
- data/vendor/assets/javascripts/cocktail.js +87 -0
- data/vendor/assets/javascripts/html5shiv-printshiv.js +500 -0
- data/vendor/assets/javascripts/iscroll.js +1811 -0
- data/vendor/assets/javascripts/jquery.backgroundSize.js +314 -0
- data/vendor/assets/javascripts/jquery.fullscreen.js +158 -0
- data/vendor/assets/javascripts/jquery.placeholder.js +175 -0
- data/vendor/assets/javascripts/jquery.simulate-events.js +312 -0
- data/vendor/assets/javascripts/polyfills/bind.js +21 -0
- data/vendor/assets/javascripts/polyfills/get_computed_style.js +16 -0
- metadata +85 -69
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MWY2OTg0YTEzY2RiZmZmYWE2MDZlNmI3YjYwMmMxYWJkYjBmZTVhNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NGM3ZWNkYjIyN2RjNTY4MjE4MDE5YjRlYjZjZmQ5YTc2NmI3MjViZA==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YmVjM2UwN2U0ZDZlZWM4OTdhN2VjZjBkY2QxNDI3MTkzNDg4ZDE3NTRhZDdm
|
10
|
+
YjA1NDM5YTI2YzQwOGU0ODljMjEwMDc2M2UyODQzYjVjYzdjNGQ5YWVmZDhm
|
11
|
+
OTg5ODFiZmI1NjBiYzM0YTQ1M2Q2ZDFiYjA4ZGMxYzZjYzI4ZjQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZTU0ZDI4MjBmYmEyODQyZDliNzliNTM4ZDc5ZDBhODFmMjJkNjNjZWEyZTU1
|
14
|
+
OTE4NTIxNzRhODA0YTBkYTg1Y2FkZjM3NjdlNTI1NTMzMGVhNWExYzFjNDll
|
15
|
+
OThjYjhkNmIwMDA3M2ZjODEwYWQ5OGU4ZDk1MjkyOThkZWI2ZjA=
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Account, :as => 'Account' do
|
3
|
+
menu :priority => 3
|
4
|
+
|
5
|
+
config.batch_actions = false
|
6
|
+
config.clear_sidebar_sections!
|
7
|
+
|
8
|
+
index do
|
9
|
+
column :name do |account|
|
10
|
+
link_to account.name, admin_account_path(account)
|
11
|
+
end
|
12
|
+
column :cname
|
13
|
+
end
|
14
|
+
|
15
|
+
form do |f|
|
16
|
+
f.inputs do
|
17
|
+
f.input :name
|
18
|
+
f.input :default_file_rights
|
19
|
+
f.input :cname, :hint => I18n.t('admin.accounts.cname_hint')
|
20
|
+
f.input :default_theme, :include_blank => false
|
21
|
+
end
|
22
|
+
f.actions
|
23
|
+
end
|
24
|
+
|
25
|
+
show :title => :name do |account|
|
26
|
+
attributes_table_for account do
|
27
|
+
row :name, :class => 'name'
|
28
|
+
row :default_file_rights, :class => 'default_file_rights'
|
29
|
+
row :cname, :class => 'cname'
|
30
|
+
row :default_theme, :class => 'default_theme'
|
31
|
+
row :created_at
|
32
|
+
end
|
33
|
+
|
34
|
+
div :class => 'columns' do
|
35
|
+
panel I18n.t('activerecord.models.user.other') do
|
36
|
+
if account.users.any?
|
37
|
+
table_for account.users, :i18n => User do
|
38
|
+
column :full_name do |user|
|
39
|
+
link_to user.full_name, admin_user_path(user)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
else
|
43
|
+
div :class => "blank_slate_container" do
|
44
|
+
span :class => "blank_slate" do
|
45
|
+
I18n.t('admin.accounts.no_members')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
panel t('activerecord.models.entry.other') do
|
52
|
+
if account.entries.any?
|
53
|
+
table_for account.entries, :i18n => Entry do
|
54
|
+
column :title do |entry|
|
55
|
+
link_to(entry.title, admin_entry_path(entry))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
else
|
59
|
+
div :class => "blank_slate_container" do
|
60
|
+
span :class => "blank_slate" do
|
61
|
+
I18n.t('admin.accounts.no_entries')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
controller do
|
70
|
+
def permitted_params
|
71
|
+
params.permit(:account => [:name, :default_file_rights, :cname, :default_theme_id])
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Entry, :as => 'Entry' do
|
3
|
+
menu :priority => 1
|
4
|
+
|
5
|
+
config.batch_actions = false
|
6
|
+
config.clear_sidebar_sections!
|
7
|
+
|
8
|
+
index do
|
9
|
+
column :title, :sortable => 'title' do |entry|
|
10
|
+
link_to entry.title, admin_entry_path(entry)
|
11
|
+
end
|
12
|
+
column I18n.t('admin.entries.members'), :class => 'members' do |entry|
|
13
|
+
entry_user_badge_list(entry)
|
14
|
+
end
|
15
|
+
if authorized?(:read, Account)
|
16
|
+
column :account, :sortable => 'account_id' do |entry|
|
17
|
+
link_to(entry.account.name, admin_account_path(entry.account), :data => {:id => entry.account.id})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
column :created_at
|
21
|
+
column :updated_at
|
22
|
+
column :class => 'buttons' do |entry|
|
23
|
+
if authorized?(:edit, Entry)
|
24
|
+
span(link_to(I18n.t("admin.entries.editor"), pageflow.edit_entry_path(entry), :class => 'button'))
|
25
|
+
end
|
26
|
+
if entry.published?
|
27
|
+
span(link_to(I18n.t("admin.entries.show_public"), pageflow.entry_path(entry), :class => 'button'))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
sidebar :folders, :only => :index do
|
33
|
+
text_node(link_to(I18n.t('admin.entries.add_folder'), new_admin_folder_path, :class => 'new'))
|
34
|
+
grouped_folder_list(Folder.accessible_by(Ability.new(current_user), :read),
|
35
|
+
:class => authorized?(:manage, Folder) ? 'editable' : nil,
|
36
|
+
:active_id => params[:folder_id],
|
37
|
+
:grouped_by_accounts => authorized?(:read, Account))
|
38
|
+
end
|
39
|
+
|
40
|
+
form do |f|
|
41
|
+
f.inputs do
|
42
|
+
f.input :title, :hint => I18n.t('admin.entries.title_hint')
|
43
|
+
if authorized?(:read, Account)
|
44
|
+
f.input :account, :include_blank => false
|
45
|
+
|
46
|
+
unless f.object.new_record?
|
47
|
+
f.input :theme, :include_blank => false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
if authorized?(:manage, Folder)
|
51
|
+
f.input :folder, :collection => collection_for_folders(f.object.account), :include_blank => true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
f.actions
|
55
|
+
end
|
56
|
+
|
57
|
+
action_item :only => :show do
|
58
|
+
if authorized?(:publish, Entry) && entry.published?
|
59
|
+
button_to(I18n.t("admin.entries.depublish"),
|
60
|
+
pageflow.current_entry_revisions_path(entry),
|
61
|
+
:method => :delete,
|
62
|
+
:data => {:rel => 'depublish', :confirm => I18n.t('admin.entries.confirm_depublish')})
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
member_action :snapshot, :method => :post do
|
67
|
+
entry = Entry.find(params[:id])
|
68
|
+
authorize!(:snapshot, entry)
|
69
|
+
entry.snapshot(:creator => current_user, :type => 'user')
|
70
|
+
redirect_to(admin_entry_path(entry))
|
71
|
+
end
|
72
|
+
|
73
|
+
show :title => :title do |entry|
|
74
|
+
render 'attributes_table', :entry => entry
|
75
|
+
render 'links', :entry => entry
|
76
|
+
|
77
|
+
div :class => 'columns' do
|
78
|
+
render 'members', :entry => entry
|
79
|
+
render 'revisions', :entry => entry
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
controller do
|
84
|
+
helper FoldersHelper
|
85
|
+
helper Admin::RevisionsHelper
|
86
|
+
|
87
|
+
def scoped_collection
|
88
|
+
params.key?(:folder_id) ? super.where(:folder_id => params[:folder_id]) : super
|
89
|
+
end
|
90
|
+
|
91
|
+
def build_new_resource
|
92
|
+
super.tap do |entry|
|
93
|
+
entry.account ||= current_user.account
|
94
|
+
entry.theme ||= entry.account.default_theme
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def permitted_params
|
99
|
+
result = params.permit(:entry => [:title, :account_id, :theme_id, :folder_id])
|
100
|
+
restrict_attributes(params[:id], result[:entry]) if result[:entry]
|
101
|
+
result
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def restrict_attributes(id, attributes)
|
107
|
+
attributes.except!(:account_id, :theme_id) unless authorized?(:read, Account)
|
108
|
+
attributes.except!(:folder_id) unless authorized?(:manage, Folder)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Folder, :as => 'Folder' do
|
3
|
+
menu false
|
4
|
+
|
5
|
+
# TODO
|
6
|
+
actions :new, :create, :edit, :update, :destroy
|
7
|
+
|
8
|
+
form do |f|
|
9
|
+
f.inputs do
|
10
|
+
if authorized?(:read, Account) && f.object.new_record?
|
11
|
+
f.input :account, :include_blank => false
|
12
|
+
end
|
13
|
+
f.input :name
|
14
|
+
end
|
15
|
+
f.actions do
|
16
|
+
f.action(:submit)
|
17
|
+
f.action(:cancel, :wrapper_html => {:class => 'cancel'})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
controller do
|
22
|
+
def build_new_resource
|
23
|
+
super.tap do |folder|
|
24
|
+
folder.account ||= current_user.account
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def create
|
29
|
+
super do |success, failure|
|
30
|
+
success.html { redirect_to(admin_entries_path) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def update
|
35
|
+
super do |success, failure|
|
36
|
+
success.html { redirect_to(admin_entries_path(:folder_id => resource.id)) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
super do |success, failure|
|
42
|
+
success.html { redirect_to(admin_entries_path) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def permitted_params
|
47
|
+
result = params.permit(:folder => [:name, :account_id])
|
48
|
+
restrict_attributes(params[:id], result[:folder]) if result[:folder]
|
49
|
+
result
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def restrict_attributes(id, attributes)
|
55
|
+
attributes.except!(:account_id) if !authorized?(:read, Account) || id.present?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Membership, :as => 'Membership' do
|
3
|
+
menu false
|
4
|
+
|
5
|
+
actions :new, :create, :destroy
|
6
|
+
|
7
|
+
form :partial => 'form'
|
8
|
+
|
9
|
+
controller do
|
10
|
+
belongs_to :entry, :parent_class => Pageflow::Entry, :polymorphic => true
|
11
|
+
belongs_to :user, :parent_class => User, :polymorphic => true
|
12
|
+
|
13
|
+
helper Pageflow::UsersHelper
|
14
|
+
helper Pageflow::EntriesHelper
|
15
|
+
|
16
|
+
def permitted_params
|
17
|
+
params.permit(:membership => [:user_id, :entry_id])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register Revision, :as => 'Revision' do
|
3
|
+
menu false
|
4
|
+
|
5
|
+
actions :edit, :update, :show
|
6
|
+
|
7
|
+
form :partial => 'form'
|
8
|
+
|
9
|
+
member_action :restore, :method => :post do
|
10
|
+
revision = Revision.find(params[:id])
|
11
|
+
entry = revision.entry
|
12
|
+
authorize!(:restore, entry)
|
13
|
+
|
14
|
+
entry.edit_lock.aquire(current_user)
|
15
|
+
revision.entry.restore(:revision => revision, :creator => current_user)
|
16
|
+
entry.edit_lock.release(current_user)
|
17
|
+
|
18
|
+
redirect_to(admin_entry_path(entry, :notice => I18n.t('admin.revisions.restored')))
|
19
|
+
end
|
20
|
+
|
21
|
+
controller do
|
22
|
+
include EditLocking
|
23
|
+
|
24
|
+
def permitted_params
|
25
|
+
params.permit(:revision => [:published_until])
|
26
|
+
end
|
27
|
+
|
28
|
+
def show
|
29
|
+
redirect_to([:admin, resource.entry])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module Pageflow
|
2
|
+
ActiveAdmin.register User do
|
3
|
+
menu :priority => 2
|
4
|
+
|
5
|
+
config.batch_actions = false
|
6
|
+
config.clear_action_items!
|
7
|
+
|
8
|
+
index do
|
9
|
+
column :full_name, :sortable => 'last_name' do |user|
|
10
|
+
link_to(user.full_name, admin_user_path(user))
|
11
|
+
end
|
12
|
+
column :email
|
13
|
+
if authorized?(:read, Account)
|
14
|
+
column :account, :sortable => 'account_id' do |user|
|
15
|
+
link_to(user.account.name, admin_account_path(user.account))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
column :role, :sortable => 'role' do |user|
|
19
|
+
I18n.t(user.role, :scope => 'admin.users.roles')
|
20
|
+
end
|
21
|
+
column :last_sign_in_at
|
22
|
+
column :sign_in_count
|
23
|
+
boolean_status_tag_column :suspended?
|
24
|
+
end
|
25
|
+
|
26
|
+
filter :last_name
|
27
|
+
filter :first_name
|
28
|
+
filter :email
|
29
|
+
|
30
|
+
action_item :only => :index do
|
31
|
+
link_to I18n.t('admin.users.invite_user'), new_admin_user_path, :data => {:rel => 'invite_user'}
|
32
|
+
end
|
33
|
+
|
34
|
+
show do |user|
|
35
|
+
div :class => :columns do
|
36
|
+
div do
|
37
|
+
attributes_table_for user do
|
38
|
+
row :last_name, :class => 'last_name'
|
39
|
+
row :first_name, :class => 'first_name'
|
40
|
+
row :email, :class => 'email'
|
41
|
+
if authorized?(:read, Account)
|
42
|
+
row :account, :class => 'account'
|
43
|
+
end
|
44
|
+
row :role, :class => 'role' do
|
45
|
+
span 'data-user-role' => user.role do
|
46
|
+
I18n.t(user.role, :scope => 'admin.users.roles')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
row :created_at
|
51
|
+
row :last_sign_in_at
|
52
|
+
boolean_status_tag_row :suspended?
|
53
|
+
end
|
54
|
+
|
55
|
+
para do
|
56
|
+
link_to I18n.t('admin.users.resend_invitation'), resend_invitation_admin_user_path(user), :method => :post, :class => 'button', :data => {:rel => 'resend_invitation'}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
panel I18n.t('activerecord.models.entry.other') do
|
61
|
+
if user.memberships.any?
|
62
|
+
table_for user.memberships, :class => 'memberships', :i18n => Membership do
|
63
|
+
column :entry do |membership|
|
64
|
+
link_to(membership.entry.title, admin_entry_path(membership.entry))
|
65
|
+
end
|
66
|
+
column do |membership|
|
67
|
+
if authorized?(:destroy, membership)
|
68
|
+
link_to(I18n.t('admin.users.delete'), admin_user_membership_path(user, membership), :method => :delete, :data => {:confirm => I18n.t('active_admin.delete_confirmation'), :rel => 'delete_membership'})
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
else
|
73
|
+
div :class => "blank_slate_container" do
|
74
|
+
span :class => "blank_slate" do
|
75
|
+
I18n.t('admin.users.empty')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
span do
|
81
|
+
link_to I18n.t('admin.users.add_entry'), new_admin_user_membership_path(user), :class => 'button', :data => {:rel => 'add_membership'}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
action_item :only => :show do
|
88
|
+
link_to I18n.t('admin.users.edit'), edit_admin_user_path(user), :data => {:rel => 'edit_user'}
|
89
|
+
end
|
90
|
+
|
91
|
+
action_item :only => :show do
|
92
|
+
if user != current_user
|
93
|
+
if user.suspended?
|
94
|
+
link_to I18n.t('admin.users.unsuspend'), unsuspend_admin_user_path(user), :method => :post, :data => {:rel => 'unsuspend_user'}
|
95
|
+
else
|
96
|
+
link_to I18n.t('admin.users.suspend'), suspend_admin_user_path(user), :method => :post, :data => {:rel => 'suspend_user'}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
action_item :only => :show do
|
102
|
+
if user != current_user
|
103
|
+
link_to I18n.t('admin.users.delete'), admin_user_path(user), :method => :delete, :data => {:rel => 'delete_user', :confirm => I18n.t('admin.users.confirm_delete')}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
form do |f|
|
108
|
+
f.inputs "Details" do
|
109
|
+
f.input :email, :hint => f.object.new_record? && I18n.t('admin.users.email_invitation_hint')
|
110
|
+
f.input :first_name
|
111
|
+
f.input :last_name
|
112
|
+
if authorized?(:read, Account)
|
113
|
+
f.input :account, :include_blank => false
|
114
|
+
end
|
115
|
+
f.input :role, :collection => collection_for_user_roles, :include_blank => false, :hint => authorized?(:read, Account) ? I18n.t('admin.users.role_hint.admin') : I18n.t('admin.users.role_hint.other')
|
116
|
+
end
|
117
|
+
f.actions
|
118
|
+
end
|
119
|
+
|
120
|
+
collection_action 'me', :title => 'Profil', :method => [:get, :patch] do
|
121
|
+
if request.patch?
|
122
|
+
if current_user.update_with_password(user_profile_params)
|
123
|
+
sign_in current_user, :bypass => true
|
124
|
+
redirect_to admin_root_path, :notice => I18n.t('admin.users.me.updated')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
collection_action 'delete_me', :title => 'Konto entfernen', :method => [:get, :delete] do
|
130
|
+
if request.delete?
|
131
|
+
if current_user.destroy_with_password(params.require(:user)[:current_password])
|
132
|
+
redirect_to admin_root_path, :notice => I18n.t('admin.users.me.updated')
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
member_action :resend_invitation, :method => :post do
|
138
|
+
InvitedUser.find(params[:id]).send_invitation!
|
139
|
+
redirect_to :back, :notice => I18n.t('admin.users.resent_invitation')
|
140
|
+
end
|
141
|
+
|
142
|
+
member_action :suspend, :method => :post do
|
143
|
+
User.find(params[:id]).suspend!
|
144
|
+
redirect_to :back, :notice => I18n.t('admin.users.suspended')
|
145
|
+
end
|
146
|
+
|
147
|
+
member_action :unsuspend, :method => :post do
|
148
|
+
User.find(params[:id]).unsuspend!
|
149
|
+
redirect_to :back, :notice => I18n.t('admin.users.unsuspended')
|
150
|
+
end
|
151
|
+
|
152
|
+
controller do
|
153
|
+
helper Pageflow::UsersHelper
|
154
|
+
|
155
|
+
def build_new_resource
|
156
|
+
user = InvitedUser.new(permitted_params[:user])
|
157
|
+
user.account ||= current_user.account
|
158
|
+
user
|
159
|
+
end
|
160
|
+
|
161
|
+
def user_profile_params
|
162
|
+
params.require(:user).permit(:first_name, :last_name, :current_password, :password, :password_confirmation)
|
163
|
+
end
|
164
|
+
|
165
|
+
def permitted_params
|
166
|
+
result = params.permit(:user => [:first_name, :last_name, :email, :password, :password_confirmation, :account_id, :role])
|
167
|
+
restrict_attributes(params[:id], result[:user]) if result[:user]
|
168
|
+
result
|
169
|
+
end
|
170
|
+
|
171
|
+
private
|
172
|
+
|
173
|
+
def restrict_attributes(id, attributes)
|
174
|
+
if !authorized?(:read, Account)
|
175
|
+
attributes.delete(:account_id)
|
176
|
+
end
|
177
|
+
|
178
|
+
if !authorized?(:read, Account) && !User::NON_ADMIN_ROLES.include?(attributes[:role])
|
179
|
+
attributes.delete(:role)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|