Skip to content

Commit

Permalink
Make core pinnable
Browse files Browse the repository at this point in the history
  • Loading branch information
ArtOfCode- committed Mar 8, 2018
1 parent cfbb5d0 commit 3c82bf3
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 8 deletions.
13 changes: 9 additions & 4 deletions app/controllers/admin_controller.rb
Expand Up @@ -79,14 +79,19 @@ def permissions
end

def update_permissions
if params['permitted'] == 'true'
if params['role'] == 'developer'
if params[:permitted] == 'true'
if params[:role] == 'developer'
render plain: 'you must be a developer', status: :forbidden
return
end
User.find(params['user_id']).add_role params['role']

if params[:pinned]
User.find(params[:user_id]).add_pinned_role params[:role]
else
User.find(params[:user_id]).add_role params[:role]
end
else
User.find(params['user_id']).remove_role params['role']
User.find(params[:user_id]).remove_role params[:role]
end

render plain: 'success', status: :accepted
Expand Down
20 changes: 20 additions & 0 deletions app/javascript/admin.js
Expand Up @@ -22,6 +22,26 @@ onLoad(() => {
}
});
});

$('input.pin-checkbox').change(function () {
const $this = $(this);
$this.disabled = true;
$.ajax({
type: 'put',
data: {
permitted: $this.is(':checked'),
pinned: true,
user_id: $this.data('user-id'),
role: $this.data('role')
},
dataType: 'json',
url: '/admin/permissions/update',
success() {
$this.disabled = false;
}
});
});

$('input.trust-checkbox').change(function () {
const $this = $(this);
$this.disabled = true;
Expand Down
15 changes: 14 additions & 1 deletion app/models/user.rb
Expand Up @@ -233,8 +233,21 @@ def self.update_core_users
u.add_role(:core)
else
logger.info "#{u.username} below core threshold, dropping"
u.remove_role(:core)
u.remove_role(:core) unless u.has_pinned_role?(:core)
end
end
end

def add_pinned_role(name)
role = Role.find_by name: name
if UsersRole.where(user: self, role: role).exists?
UsersRole.where(user: self, role: role).order(:user_id).last.update(pinned: true)
else
UsersRole.create(user: self, role: role, pinned: true)
end
end

def has_pinned_role?(role)
UsersRole.where(user: self, role: Role.find_by(name: role), pinned: true).exists?
end
end
6 changes: 6 additions & 0 deletions app/models/users_role.rb
@@ -0,0 +1,6 @@
# frozen_string_literal: true

class UsersRole < ApplicationRecord
belongs_to :user
belongs_to :role
end
13 changes: 12 additions & 1 deletion app/views/admin/permissions.html.erb
Expand Up @@ -20,7 +20,18 @@
<td><%= user.id %></td>
<td><%= sanitize user.username %></td>
<% @roles.each do |role| %>
<td><label class="permissions-checkbox-label"><%= check_box_tag "#{user.id}[#{role.to_s}]", "foo", user.has_cached_role?(role), disabled: (role == :developer and not user.has_cached_role?(role)), class: "permissions-checkbox", data: {:user_id => user.id, :role => role.to_s } %></label></td>
<td>
<label class="permissions-checkbox-label">
<%= check_box_tag "#{user.id}[#{role.to_s}]", 'foo', user.has_cached_role?(role),
disabled: (role == :developer and not user.has_cached_role?(role)),
class: "permissions-checkbox", data: {:user_id => user.id, :role => role.to_s } %>
<% if role.to_sym == :core %>
<%= check_box_tag "#{user.id}[#{role.to_s}]", 'foo', user.has_pinned_role?(role),
disabled: (role == :developer and not user.has_cached_role?(role)),
class: "pin-checkbox", data: {:user_id => user.id, :role => role.to_s } %>
<% end %>
</label>
</td>
<% end %>
</tr>
<% end %>
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20180308093040_add_pinned_to_users_roles.rb
@@ -0,0 +1,5 @@
class AddPinnedToUsersRoles < ActiveRecord::Migration[5.2]
def change
add_column :users_roles, :pinned, :boolean, default: false
end
end
5 changes: 5 additions & 0 deletions db/migrate/20180308104133_add_id_to_users_roles.rb
@@ -0,0 +1,5 @@
class AddIdToUsersRoles < ActiveRecord::Migration[5.2]
def change
add_column :users_roles, :id, :primary_key
end
end
5 changes: 3 additions & 2 deletions db/schema.rb
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2018_03_07_025200) do
ActiveRecord::Schema.define(version: 2018_03_08_104133) do

create_table "announcements", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.text "text"
Expand Down Expand Up @@ -361,9 +361,10 @@
t.index ["email"], name: "index_users_on_email", unique: true
end

create_table "users_roles", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
create_table "users_roles", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.integer "user_id"
t.integer "role_id"
t.boolean "pinned", default: false
t.index ["user_id", "role_id"], name: "index_users_roles_on_user_id_and_role_id"
end

Expand Down

0 comments on commit 3c82bf3

Please sign in to comment.