granar 0.1.1
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +53 -0
- data/Rakefile +8 -0
- data/app/assets/config/rbac_rls_manifest.js +2 -0
- data/app/assets/javascripts/rbac_rls/application.js +1 -0
- data/app/assets/stylesheets/rbac_rls/application.css.scss +16 -0
- data/app/controllers/concerns/connection_rls_user_concern.rb +31 -0
- data/app/controllers/rbac_rls/application_controller.rb +3 -0
- data/app/controllers/rbac_rls/groups_controller.rb +94 -0
- data/app/controllers/rbac_rls/home_controller.rb +5 -0
- data/app/controllers/rbac_rls/permissions_controller.rb +69 -0
- data/app/controllers/rbac_rls/roles_controller.rb +61 -0
- data/app/helpers/rbac_rls/application_helper.rb +4 -0
- data/app/helpers/rbac_rls/groups_helper.rb +4 -0
- data/app/helpers/rbac_rls/permissions_helper.rb +41 -0
- data/app/helpers/rbac_rls/roles_helper.rb +4 -0
- data/app/jobs/rbac_rls/application_job.rb +4 -0
- data/app/mailers/rbac_rls/application_mailer.rb +6 -0
- data/app/models/concerns/connection_rls_concern.rb +19 -0
- data/app/models/rbac_rls/application_record.rb +3 -0
- data/app/models/rbac_rls/group.rb +14 -0
- data/app/models/rbac_rls/group_permission.rb +20 -0
- data/app/models/rbac_rls/group_user.rb +7 -0
- data/app/models/rbac_rls/permission.rb +68 -0
- data/app/models/rbac_rls/role.rb +10 -0
- data/app/models/rbac_rls/role_permission.rb +6 -0
- data/app/models/rbac_rls/user_role.rb +7 -0
- data/app/views/layouts/rbac_rls/application.html.erb +55 -0
- data/app/views/rbac_rls/groups/_form.html.erb +97 -0
- data/app/views/rbac_rls/groups/_group.html.erb +12 -0
- data/app/views/rbac_rls/groups/_group_permission_fields.html.erb +18 -0
- data/app/views/rbac_rls/groups/_group_user_fields.html.erb +9 -0
- data/app/views/rbac_rls/groups/edit.html.erb +10 -0
- data/app/views/rbac_rls/groups/index.html.erb +14 -0
- data/app/views/rbac_rls/groups/new.html.erb +9 -0
- data/app/views/rbac_rls/groups/show.html.erb +10 -0
- data/app/views/rbac_rls/home/_link_to_home_page.html.erb +3 -0
- data/app/views/rbac_rls/home/index.html.erb +28 -0
- data/app/views/rbac_rls/permissions/_form.html.erb +78 -0
- data/app/views/rbac_rls/permissions/_permission.html.erb +54 -0
- data/app/views/rbac_rls/permissions/_role_permission_fields.html.erb +9 -0
- data/app/views/rbac_rls/permissions/edit.html.erb +7 -0
- data/app/views/rbac_rls/permissions/index.html.erb +18 -0
- data/app/views/rbac_rls/permissions/new.html.erb +9 -0
- data/app/views/rbac_rls/permissions/show.html.erb +10 -0
- data/app/views/rbac_rls/roles/_form.html.erb +42 -0
- data/app/views/rbac_rls/roles/_role.html.erb +2 -0
- data/app/views/rbac_rls/roles/_user_role_fields.html.erb +9 -0
- data/app/views/rbac_rls/roles/edit.html.erb +9 -0
- data/app/views/rbac_rls/roles/index.html.erb +19 -0
- data/app/views/rbac_rls/roles/new.html.erb +8 -0
- data/app/views/rbac_rls/roles/show.html.erb +12 -0
- data/config/assets.rb +12 -0
- data/config/importmap.rb +9 -0
- data/config/routes.rb +14 -0
- data/config/setup.rb +0 -0
- data/db/migrate/20220411125339_create_rbac_rls_roles.rb +9 -0
- data/db/migrate/20220411125613_create_rbac_rls_user_roles.rb +9 -0
- data/db/migrate/20220411133054_create_rbac_rls_permissions.rb +18 -0
- data/db/migrate/20220425212731_create_role_permissions.rb +9 -0
- data/db/migrate/20220912104712_create_rbac_rls_groups.rb +10 -0
- data/db/migrate/20220912104929_create_rbac_rls_group_permissions.rb +12 -0
- data/db/migrate/20220914004802_create_rbac_rls_group_users.rb +10 -0
- data/db/migrate/20220914004803_create_basic_permissions_for_application_acess.rb +18 -0
- data/lib/generators/generator_helpers.rb +8 -0
- data/lib/generators/rbac_rls/custom_migration_generator.rb +78 -0
- data/lib/generators/rbac_rls/group_permission_generator.rb +57 -0
- data/lib/generators/rbac_rls/templates/group_permission_migration.rb +83 -0
- data/lib/generators/rbac_rls/templates/rls_migration.rb +81 -0
- data/lib/generators/rbac_rls/templates/rls_migration.rb.erb +64 -0
- data/lib/generators/rbac_rls/templates/rls_migration2.rb.erb +80 -0
- data/lib/rbac_rls/engine.rb +21 -0
- data/lib/rbac_rls/version.rb +3 -0
- data/lib/rbac_rls.rb +6 -0
- data/lib/tasks/rbac_rls_tasks.rake +4 -0
- metadata +178 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<%= javascript_include_tag 'rbac_rls/application' %>
|
5
|
+
<title>Rbac rls</title>
|
6
|
+
<%= csrf_meta_tags %>
|
7
|
+
<%= csp_meta_tag %>
|
8
|
+
|
9
|
+
<%= stylesheet_link_tag "rbac_rls/application", media: "all", "data-turbo-track": "reload" %>
|
10
|
+
|
11
|
+
|
12
|
+
</head>
|
13
|
+
<body style="padding-top: 5%;">
|
14
|
+
<div>
|
15
|
+
<nav class="navbar navbar-expand-xxl navbar-dark fixed-top bg-dark">
|
16
|
+
<%= link_to home_index_path, class: 'navbar-brand', remote: true do %>
|
17
|
+
Home
|
18
|
+
<% end %>
|
19
|
+
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
20
|
+
<ul class="navbar-nav mr-auto">
|
21
|
+
|
22
|
+
<li class="nav-item">
|
23
|
+
<%= link_to roles_path, class: 'nav-link' do %>
|
24
|
+
Roles
|
25
|
+
<% end %>
|
26
|
+
</li>
|
27
|
+
<li class="nav-item">
|
28
|
+
<%= link_to permissions_path, class: 'nav-link' do %>
|
29
|
+
permissions
|
30
|
+
<% end %>
|
31
|
+
</li>
|
32
|
+
<li class="nav-item">
|
33
|
+
<%= link_to groups_path, class: 'nav-link' do %>
|
34
|
+
Groups
|
35
|
+
<% end %>
|
36
|
+
</li>
|
37
|
+
<li>
|
38
|
+
<%= link_to '/', class: 'nav-link' do %>
|
39
|
+
Main Application
|
40
|
+
<% end %>
|
41
|
+
</li>
|
42
|
+
</ul>
|
43
|
+
</div>
|
44
|
+
</nav>
|
45
|
+
</div>
|
46
|
+
<div class="container">
|
47
|
+
<%= yield %>
|
48
|
+
</div>
|
49
|
+
</body>
|
50
|
+
<footer class="container">
|
51
|
+
<hr>
|
52
|
+
<p>BCC IFG 2022</p>
|
53
|
+
</footer>
|
54
|
+
</html>
|
55
|
+
<!--<script> alert('hellow')</script>-->
|
@@ -0,0 +1,97 @@
|
|
1
|
+
<%= form_with(model: group) do |form| %>
|
2
|
+
<% if group.errors.any? %>
|
3
|
+
<div style="color: red">
|
4
|
+
<h2><%= pluralize(group.errors.count, "error") %> prohibited this group from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% group.errors.each do |error| %>
|
8
|
+
<li><%= error.full_message %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div>
|
15
|
+
<%= form.label :name, style: "display: block" %>
|
16
|
+
<%= form.text_field :name %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div>
|
20
|
+
<%= form.label :comments, style: "display: block" %>
|
21
|
+
<%= form.text_field :comments %>
|
22
|
+
</div>
|
23
|
+
<div class="m-2">
|
24
|
+
<%= link_to_add_nested(form, :group_permissions, '#group_permissions',
|
25
|
+
partial: 'rbac_rls/groups/group_permission_fields',
|
26
|
+
link_text: 'Add new Permission to this Group Permission',
|
27
|
+
link_classes: 'btn-primary btn-sm') %>
|
28
|
+
</div>
|
29
|
+
<div id='group_permissions'>
|
30
|
+
<%= form.fields_for :group_permissions do |p| %>
|
31
|
+
<% render 'rbac_rls/groups/group_permission_fields', form: p %>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div class="m-2">
|
36
|
+
<%= link_to_add_nested(form, :group_users, '#group_users',
|
37
|
+
partial: 'rbac_rls/groups/group_user_fields',
|
38
|
+
link_text: 'Add new User to this Group User',
|
39
|
+
link_classes: 'btn-primary btn-sm') %>
|
40
|
+
</div>
|
41
|
+
<div id='group_users'>
|
42
|
+
<%= form.fields_for :group_users do |p| %>
|
43
|
+
<% render 'rbac_rls/groups/group_user_fields', form: p %>
|
44
|
+
<% end %>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<div>
|
48
|
+
<%= form.submit %>
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<% end %>
|
52
|
+
<script>
|
53
|
+
|
54
|
+
function popular_select(elementId, targetSelect) {
|
55
|
+
let permission_id = document.getElementById(elementId).value
|
56
|
+
let relatedId = document.getElementById(elementId).dataset.relatedId
|
57
|
+
if (permission_id.toString() === '') {
|
58
|
+
let selectList = document.getElementById(`${targetSelect}_${relatedId}`)
|
59
|
+
selectList.innerHTML = ""
|
60
|
+
return false
|
61
|
+
}
|
62
|
+
|
63
|
+
let url = new URL('<%= request.base_url + get_options_select_groups_path(format: :json) %>')
|
64
|
+
let params = {
|
65
|
+
permission_object_id: document.getElementById(`permission_id_${relatedId}`).value,
|
66
|
+
permission_id: permission_id,
|
67
|
+
target_select: targetSelect
|
68
|
+
}
|
69
|
+
|
70
|
+
url.search = new URLSearchParams(params).toString();
|
71
|
+
|
72
|
+
fetch(url)
|
73
|
+
.then(response => response.json())
|
74
|
+
.then(data => {
|
75
|
+
appendSelect(elementId, data, targetSelect)
|
76
|
+
}
|
77
|
+
);
|
78
|
+
return true
|
79
|
+
}
|
80
|
+
|
81
|
+
|
82
|
+
function appendSelect(select_id, options, targetSelect) {
|
83
|
+
let relatedId = document.getElementById(select_id).dataset.relatedId
|
84
|
+
|
85
|
+
let selectList = document.getElementById(`${targetSelect}_${relatedId}`)
|
86
|
+
|
87
|
+
|
88
|
+
options = Object.entries(options)
|
89
|
+
selectList.innerHTML = ""
|
90
|
+
for (let i = 0; i < options.length; i++) {
|
91
|
+
let option = document.createElement("option")
|
92
|
+
option.value = options[i][1]
|
93
|
+
option.text = options[i][0]
|
94
|
+
selectList.appendChild(option)
|
95
|
+
}
|
96
|
+
}
|
97
|
+
</script>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% utc = Time.now.utc.to_formatted_s(:number) %>
|
2
|
+
<div class="wrapper-div m-2">
|
3
|
+
<div class="">
|
4
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn-sm') %>
|
5
|
+
</div>
|
6
|
+
<div class="">
|
7
|
+
<%= form.label :permission_id %> <br>
|
8
|
+
<%= form.select(:permission_id, permission_options_for_select(form), { :prompt => "...", include_blank: true }, onchange: "popular_select(this.id,'table_key_id')", id: "permission_id_#{utc}", data: { related_id: utc }, class: 'form-control') %>
|
9
|
+
</div>
|
10
|
+
<div class="">
|
11
|
+
<%= form.label :table_key %> <br>
|
12
|
+
<%= form.select(:table_key, table_selected_key_options_for_select(form), { :prompt => "...", include_blank: true }, onchange: "popular_select(this.id,'table_value_id')", id: "table_key_id_#{utc}", data: { related_id: utc }, class: 'form-control') %>
|
13
|
+
</div>
|
14
|
+
<div class="">
|
15
|
+
<%= form.label :table_value %> <br>
|
16
|
+
<%= form.text_field :table_value %>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="wrapper-div m-2">
|
2
|
+
<div class="">
|
3
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn-sm') %>
|
4
|
+
</div>
|
5
|
+
<div class="">
|
6
|
+
<%= form.label :user_id %> <br>
|
7
|
+
<%= form.select(:user_id, user_options_for_select(form), { :prompt => "...", include_blank: true }, class: 'form-control') %>
|
8
|
+
</div>
|
9
|
+
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<h1>Groups</h1>
|
4
|
+
|
5
|
+
<div id="groups">
|
6
|
+
<% @groups.each do |group| %>
|
7
|
+
<%= render group %>
|
8
|
+
<p>
|
9
|
+
<%= link_to "Show this group", group %>
|
10
|
+
</p>
|
11
|
+
<% end %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<%= link_to "New group", new_group_path %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<%= render @group %>
|
4
|
+
|
5
|
+
<div>
|
6
|
+
<%= link_to "Edit this group", edit_group_path(@group) %> |
|
7
|
+
<%= link_to "Back to groups", groups_path %>
|
8
|
+
|
9
|
+
<%= button_to "Destroy this group", @group, method: :delete %>
|
10
|
+
</div>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<div role="main">
|
2
|
+
<div class="jumbotron">
|
3
|
+
<div class="container">
|
4
|
+
<h1 class="display-3">RBAC RLS GEM <i class="fas fa-gem"></i></h1>
|
5
|
+
<p>This is a GEM based on RBAC and RLS, to control users' access to information</p>
|
6
|
+
</div>
|
7
|
+
<hr>
|
8
|
+
</div>
|
9
|
+
<div class="container">
|
10
|
+
<div class="row">
|
11
|
+
<div class="col-md-5">
|
12
|
+
<h2>RBAC (ROLE BASED ACCESS CONTROL)</h2>
|
13
|
+
<p>Role-based access control (RBAC) is a method of restricting network access based on the roles of individual
|
14
|
+
users within an enterprise. RBAC ensures employees access only information
|
15
|
+
they need to do their jobs and prevents them from accessing information that doesn't pertain to them. </p>
|
16
|
+
</div>
|
17
|
+
<div class="col-md-5">
|
18
|
+
<h2>RLS(ROW LEVEL SECURITY)</h2>
|
19
|
+
<p> Row-Level Security enables you to use group membership or execution context to control access to rows in a
|
20
|
+
database table.
|
21
|
+
Row-Level Security (RLS) simplifies
|
22
|
+
the design and coding of security in your application. RLS helps you implement restrictions on data row
|
23
|
+
access.</p>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<hr>
|
27
|
+
</div>
|
28
|
+
</div>
|
@@ -0,0 +1,78 @@
|
|
1
|
+
<div class="w-75 container">
|
2
|
+
<%= form_with(model: permission) do |form| %>
|
3
|
+
<% if permission.errors.any? %>
|
4
|
+
<div style="color: red">
|
5
|
+
<h2><%= pluralize(permission.errors.count, "error") %> prohibited this permission from being saved:</h2>
|
6
|
+
|
7
|
+
<ul>
|
8
|
+
<% permission.errors.each do |error| %>
|
9
|
+
<li><%= error.full_message %></li>
|
10
|
+
<% end %>
|
11
|
+
</ul>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<div class="m-2">
|
16
|
+
<%= form.label :table_name %> <br>
|
17
|
+
<%= form.select(:table_name, table_name_options_for_select(form), {}, { class: 'form-control' }) %>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<div class="row m-2">
|
21
|
+
<div class="col-md-1">
|
22
|
+
<%= form.label :read, style: "display: block" %>
|
23
|
+
<%= form.check_box :read %>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="col-md-1">
|
27
|
+
<%= form.label :write, style: "display: block" %>
|
28
|
+
<%= form.check_box :write %>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="col-md-1">
|
32
|
+
<%= form.label :change, style: "display: block" %>
|
33
|
+
<%= form.check_box :change %>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<div class="col-md-1">
|
37
|
+
<%= form.label :remove, style: "display: block" %>
|
38
|
+
<%= form.check_box :remove %>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
<hr>
|
42
|
+
<div class="row m-2">
|
43
|
+
<div class="col-md-1">
|
44
|
+
<%= form.label :owner_read, style: "display: block" %>
|
45
|
+
<%= form.check_box :owner_read %>
|
46
|
+
</div>
|
47
|
+
|
48
|
+
<div class="col-md-1">
|
49
|
+
<%= form.label :owner_change, style: "display: block" %>
|
50
|
+
<%= form.check_box :owner_change %>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<div class="col-md-1">
|
54
|
+
<%= form.label :owner_remove, style: "display: block" %>
|
55
|
+
<%= form.check_box :owner_remove %>
|
56
|
+
</div>
|
57
|
+
</div>
|
58
|
+
|
59
|
+
<div class="">
|
60
|
+
<%= form.label :permission_id %> <br>
|
61
|
+
<%= form.select(:permission_id, permission_options_for_select(form), { :prompt => "...", include_blank: true }, class: 'form-control') %>
|
62
|
+
</div>
|
63
|
+
<div class="m-2">
|
64
|
+
<%= link_to_add_nested(form, :role_permissions, '#roles_permission',
|
65
|
+
partial: 'rbac_rls/permissions/role_permission_fields',
|
66
|
+
link_text: 'Add new User to this Role Permission',
|
67
|
+
link_classes: 'btn-primary btn-sm') %>
|
68
|
+
</div>
|
69
|
+
<div id='roles_permission'>
|
70
|
+
<%= form.fields_for :role_permissions do |p| %>
|
71
|
+
<% render 'rbac_rls/permissions/role_permission_fields', form: p %>
|
72
|
+
<% end %>
|
73
|
+
</div>
|
74
|
+
<div class="m-2">
|
75
|
+
<%= form.submit %>
|
76
|
+
</div>
|
77
|
+
<% end %>
|
78
|
+
</div>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<div id="<%= dom_id permission %>">
|
2
|
+
<p>
|
3
|
+
<strong>Name:</strong>
|
4
|
+
<%= permission.name %>
|
5
|
+
</p>
|
6
|
+
|
7
|
+
<p>
|
8
|
+
<strong>Table name:</strong>
|
9
|
+
<%= permission.table_name %>
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p>
|
13
|
+
<strong>Read:</strong>
|
14
|
+
<%= permission.read %>
|
15
|
+
</p>
|
16
|
+
|
17
|
+
<p>
|
18
|
+
<strong>Write:</strong>
|
19
|
+
<%= permission.write %>
|
20
|
+
</p>
|
21
|
+
|
22
|
+
<p>
|
23
|
+
<strong>Update:</strong>
|
24
|
+
<%= permission.change %>
|
25
|
+
</p>
|
26
|
+
|
27
|
+
<p>
|
28
|
+
<strong>Delete:</strong>
|
29
|
+
<%= permission.remove %>
|
30
|
+
</p>
|
31
|
+
|
32
|
+
<p>
|
33
|
+
<strong>Permission:</strong>
|
34
|
+
<%= permission.permission_id %>
|
35
|
+
</p>
|
36
|
+
<p>
|
37
|
+
<strong>
|
38
|
+
owner_read
|
39
|
+
</strong>
|
40
|
+
<%= permission.owner_read %>
|
41
|
+
</p>
|
42
|
+
<p>
|
43
|
+
<strong>
|
44
|
+
owner_change
|
45
|
+
</strong>
|
46
|
+
<%= permission.owner_change %>
|
47
|
+
</p>
|
48
|
+
<p>
|
49
|
+
<strong>
|
50
|
+
owner_remove
|
51
|
+
</strong>
|
52
|
+
<%= permission.owner_remove %>
|
53
|
+
</p>
|
54
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="wrapper-div m-2">
|
2
|
+
<div class="">
|
3
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn-sm') %>
|
4
|
+
</div>
|
5
|
+
<div class="">
|
6
|
+
<%= form.label :role_id %> <br>
|
7
|
+
<%= form.select(:role_id, role_options_for_select(form), { :prompt => "...", include_blank: true }, class: 'form-control') %>
|
8
|
+
</div>
|
9
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<h1 class="display-3">Permissions</h1>
|
4
|
+
|
5
|
+
<div class="">
|
6
|
+
<%= link_to new_permission_path, class: 'btn-primary btn-sm' do %>
|
7
|
+
New permission
|
8
|
+
<% end %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div id="permissions">
|
12
|
+
<% @permissions.each do |permission| %>
|
13
|
+
<%= render permission %>
|
14
|
+
<p>
|
15
|
+
<%= link_to "Show this permission", permission,class: 'btn btn-secondary'%>
|
16
|
+
</p>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<p style="color: green"><%= notice %></p>
|
2
|
+
|
3
|
+
<%= render @permission %>
|
4
|
+
|
5
|
+
<div>
|
6
|
+
<%= link_to "Edit this permission", edit_permission_path(@permission) %> |
|
7
|
+
<%= link_to "Back to permissions", permissions_path %>
|
8
|
+
|
9
|
+
<%= button_to "Destroy this permission", @permission, method: :delete %>
|
10
|
+
</div>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<div class="container">
|
2
|
+
<%= form_with(model: role) do |form| %>
|
3
|
+
<% if role.errors.any? %>
|
4
|
+
<div style="color: red">
|
5
|
+
<h2><%= pluralize(role.errors.count, "error") %> prohibited this role from being saved:</h2>
|
6
|
+
|
7
|
+
<ul>
|
8
|
+
<% role.errors.each do |error| %>
|
9
|
+
<li><%= error.full_message %></li>
|
10
|
+
<% end %>
|
11
|
+
</ul>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<div>
|
16
|
+
<%= form.label :name, style: "display: block" %>
|
17
|
+
<%= form.text_field :name, class: 'form-control' %>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<div>
|
21
|
+
<%= form.label :comments, style: "display: block" %>
|
22
|
+
<%= form.text_area :comments, class: 'form-control' %>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
|
26
|
+
<div id='user_roles'>
|
27
|
+
<%= form.fields_for :user_roles do |p| %>
|
28
|
+
<% render 'rbac_rls/roles/user_role_fields', form: p %>
|
29
|
+
<% end %>
|
30
|
+
</div>
|
31
|
+
<div class="m-2">
|
32
|
+
<%= link_to_add_nested(form, :user_roles, '#user_roles',
|
33
|
+
partial: 'rbac_rls/roles/user_role_fields',
|
34
|
+
link_text: 'Add new User to role',
|
35
|
+
link_classes: 'btn-primary btn-sm') %>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
<div class="m-2">
|
39
|
+
<%= form.submit "Create Role", class: 'btn-primary btn-sm' %>
|
40
|
+
</div>
|
41
|
+
<% end %>
|
42
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="wrapper-div m-2">
|
2
|
+
<div class="">
|
3
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn-sm') %>
|
4
|
+
</div>
|
5
|
+
<div class="">
|
6
|
+
<%= form.label :user_id %> <br>
|
7
|
+
<%= form.select(:user_id, user_options_for_select(form), { :prompt => "...", include_blank: true }, class: 'form-control') %>
|
8
|
+
</div>
|
9
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="container">
|
2
|
+
<h1>Editing role</h1>
|
3
|
+
<%= link_to "Show this role", @role, class: 'btn-primary btn-sm' %>
|
4
|
+
<%= link_to "Back to roles", roles_path, class: 'btn-danger btn-sm' %>
|
5
|
+
<div class="container w-75">
|
6
|
+
<%= render "form", role: @role %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
</div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div class="container">
|
2
|
+
<p style="color: green"><%= notice %></p>
|
3
|
+
|
4
|
+
<h1 class="display-3">Roles</h1>
|
5
|
+
|
6
|
+
<div class="">
|
7
|
+
<%= link_to new_role_path, class: 'btn-primary btn-sm' do %>
|
8
|
+
New Role
|
9
|
+
<% end %>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div id="roles" class="w-75 container">
|
13
|
+
<% @roles.each do |role| %>
|
14
|
+
<ul class="list-group mb-2">
|
15
|
+
<%= render role %>
|
16
|
+
</ul>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="container">
|
2
|
+
<p style="color: green"><%= notice %></p>
|
3
|
+
<%= link_to "Edit this role", edit_role_path(@role), class: 'btn-primary btn-sm' %>
|
4
|
+
<%= link_to "Back to roles", roles_path, class: 'btn-danger btn-sm' %>
|
5
|
+
|
6
|
+
|
7
|
+
<div class="w-75 m-2">
|
8
|
+
<%= render @role %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<%= button_to "Destroy this role", @role, method: :delete, class: 'btn-danger btn-sm', data: { confirm: "Are you sure?" } %>
|
12
|
+
</div>
|
data/config/assets.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
# Version of your assets, change this if you want to expire all your assets.
|
4
|
+
# Rails.application.config.assets.version = "1.0"
|
5
|
+
|
6
|
+
# Add additional assets to the asset load path.
|
7
|
+
# Rails.application.config.assets.paths << Emoji.images_path
|
8
|
+
|
9
|
+
# Precompile additional assets.
|
10
|
+
# application.js, application.css, and all non-JS/CSS in the app/assets
|
11
|
+
# folder are already added.
|
12
|
+
Rails.application.config.assets.precompile += %w( application.js, application.css )
|
data/config/importmap.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Pin npm packages by running ./bin/importmap
|
2
|
+
|
3
|
+
pin "application", preload: true
|
4
|
+
# pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
|
5
|
+
# pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
|
6
|
+
# pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
|
7
|
+
# pin_all_from "app/javascript/controllers", under: "controllers"
|
8
|
+
#
|
9
|
+
pin "vanilla-nested", to: "vanilla_nested.js", preload: true
|
data/config/routes.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
RbacRls::Engine.routes.draw do
|
2
|
+
|
3
|
+
root 'home#index'
|
4
|
+
resources :home, only: [:index], path: :rbac_rls_home_page
|
5
|
+
resources :permissions
|
6
|
+
resources :roles
|
7
|
+
|
8
|
+
resources :groups do
|
9
|
+
collection do
|
10
|
+
get :get_options_select
|
11
|
+
end
|
12
|
+
end
|
13
|
+
# end
|
14
|
+
end
|
data/config/setup.rb
ADDED
File without changes
|