Commit 0a46759a authored by Vitali Tatarintev's avatar Vitali Tatarintev

Merge branch...

Merge branch '281809-convert-project-members-list-view-from-haml-to-vue-pass-data-from-haml-to-vue' into 'master'

Setup helper methods to pass data to Vue app

See merge request gitlab-org/gitlab!51766
parents 4476d625 6c0c1d9b
...@@ -14,7 +14,7 @@ module Groups::GroupMembersHelper ...@@ -14,7 +14,7 @@ module Groups::GroupMembersHelper
end end
def group_group_links_data_json(group_links) def group_group_links_data_json(group_links)
GroupGroupLinkSerializer.new.represent(group_links, { current_user: current_user }).to_json GroupLink::GroupGroupLinkSerializer.new.represent(group_links, { current_user: current_user }).to_json
end end
def members_data_json(group, members) def members_data_json(group, members)
......
...@@ -26,4 +26,30 @@ module Projects::ProjectMembersHelper ...@@ -26,4 +26,30 @@ module Projects::ProjectMembersHelper
project.group.has_owner?(current_user) project.group.has_owner?(current_user)
end end
def project_group_links_data_json(group_links)
GroupLink::ProjectGroupLinkSerializer.new.represent(group_links, { current_user: current_user }).to_json
end
def project_members_data_json(project, members)
MemberSerializer.new.represent(members, { current_user: current_user, group: project.group }).to_json
end
def project_members_list_data_attributes(project, members)
{
members: project_members_data_json(project, members),
member_path: project_project_member_path(project, ':id'),
source_id: project.id,
can_manage_members: can_manage_project_members?(project)
}
end
def project_group_links_list_data_attributes(project, group_links)
{
members: project_group_links_data_json(group_links),
member_path: project_group_link_path(project, ':id'),
source_id: project.id,
can_manage_members: can_manage_project_members?(project)
}
end
end end
# frozen_string_literal: true
class GroupGroupLinkEntity < Grape::Entity
include RequestAwareEntity
expose :id
expose :created_at
expose :expires_at do |group_link|
group_link.expires_at&.to_time
end
expose :can_update do |group_link|
can_manage?(group_link)
end
expose :can_remove do |group_link|
can_manage?(group_link)
end
expose :access_level do
expose :human_access, as: :string_value
expose :group_access, as: :integer_value
end
expose :valid_roles do |group_link|
group_link.class.access_options
end
expose :shared_with_group do
expose :avatar_url do |group_link|
group_link.shared_with_group.avatar_url(only_path: false)
end
expose :web_url do |group_link|
group_link.shared_with_group.web_url
end
expose :shared_with_group, merge: true, using: GroupBasicEntity
end
private
def current_user
options[:current_user]
end
def can_manage?(group_link)
can?(current_user, :admin_group_member, group_link.shared_group)
end
end
# frozen_string_literal: true
class GroupGroupLinkSerializer < BaseSerializer
entity GroupGroupLinkEntity
end
# frozen_string_literal: true
module GroupLink
class GroupGroupLinkEntity < GroupLink::GroupLinkEntity
include RequestAwareEntity
expose :can_update do |group_link|
can_manage?(group_link)
end
expose :can_remove do |group_link|
can_manage?(group_link)
end
private
def current_user
options[:current_user]
end
def can_manage?(group_link)
can?(current_user, :admin_group_member, group_link.shared_group)
end
end
end
# frozen_string_literal: true
module GroupLink
class GroupGroupLinkSerializer < BaseSerializer
entity GroupLink::GroupGroupLinkEntity
end
end
# frozen_string_literal: true
module GroupLink
class GroupLinkEntity < Grape::Entity
include RequestAwareEntity
expose :id
expose :created_at
expose :expires_at do |group_link|
group_link.expires_at&.to_time
end
expose :access_level do
expose :human_access, as: :string_value
expose :group_access, as: :integer_value
end
expose :valid_roles do |group_link|
group_link.class.access_options
end
expose :shared_with_group do
expose :avatar_url do |group_link|
group_link.shared_with_group.avatar_url(only_path: false, size: Member::AVATAR_SIZE)
end
expose :web_url do |group_link|
group_link.shared_with_group.web_url
end
expose :shared_with_group, merge: true, using: GroupBasicEntity
end
end
end
# frozen_string_literal: true
module GroupLink
class ProjectGroupLinkEntity < GroupLink::GroupLinkEntity
include RequestAwareEntity
include Projects::ProjectMembersHelper
expose :can_update do |group_link|
can_manage_project_members?(group_link.project)
end
expose :can_remove do |group_link|
can_manage_project_members?(group_link.project)
end
private
def current_user
options[:current_user]
end
end
end
# frozen_string_literal: true
module GroupLink
class ProjectGroupLinkSerializer < BaseSerializer
entity GroupLink::ProjectGroupLinkEntity
end
end
...@@ -132,7 +132,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do ...@@ -132,7 +132,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end end
end end
resources :project_members, except: [:show, :new, :edit], constraints: { id: %r{[a-zA-Z./0-9_\-#%+]+} }, concerns: :access_requestable do resources :project_members, except: [:show, :new, :edit], constraints: { id: %r{[a-zA-Z./0-9_\-#%+:]+} }, concerns: :access_requestable do
collection do collection do
delete :leave delete :leave
...@@ -219,7 +219,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do ...@@ -219,7 +219,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resources :starrers, only: [:index] resources :starrers, only: [:index]
resources :forks, only: [:index, :new, :create] resources :forks, only: [:index, :new, :create]
resources :group_links, only: [:create, :update, :destroy], constraints: { id: /\d+/ } resources :group_links, only: [:create, :update, :destroy], constraints: { id: /\d+|:id/ }
resource :import, only: [:new, :create, :show] resource :import, only: [:new, :create, :show]
resource :avatar, only: [:show, :destroy] resource :avatar, only: [:show, :destroy]
......
{
"type": "object",
"allOf": [
{ "$ref": "group_link.json" },
{
"required": [
"can_update",
"can_remove"
],
"properties": {
"can_update": { "type": "boolean" },
"can_remove": { "type": "boolean" }
}
}
]
}
{ {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "entities/group_group_link.json" "$ref": "group_group_link.json"
} }
} }
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
"id", "id",
"created_at", "created_at",
"expires_at", "expires_at",
"can_update",
"can_remove",
"access_level", "access_level",
"valid_roles" "valid_roles"
], ],
...@@ -13,15 +11,14 @@ ...@@ -13,15 +11,14 @@
"id": { "type": "integer" }, "id": { "type": "integer" },
"created_at": { "type": "date-time" }, "created_at": { "type": "date-time" },
"expires_at": { "type": ["date-time", "null"] }, "expires_at": { "type": ["date-time", "null"] },
"can_update": { "type": "boolean" },
"can_remove": { "type": "boolean" },
"access_level": { "access_level": {
"type": "object", "type": "object",
"required": ["integer_value", "string_value"], "required": ["integer_value", "string_value"],
"properties": { "properties": {
"integer_value": { "type": "integer" }, "integer_value": { "type": "integer" },
"string_value": { "type": "string" } "string_value": { "type": "string" }
} },
"additionalProperties": false
}, },
"valid_roles": { "type": "object" }, "valid_roles": { "type": "object" },
"shared_with_group": { "shared_with_group": {
...@@ -34,7 +31,8 @@ ...@@ -34,7 +31,8 @@
"full_path": { "type": "string" }, "full_path": { "type": "string" },
"avatar_url": { "type": ["string", "null"] }, "avatar_url": { "type": ["string", "null"] },
"web_url": { "type": "string" } "web_url": { "type": "string" }
} },
"additionalProperties": false
} }
} }
} }
{
"type": "object",
"allOf": [
{ "$ref": "group_link.json" },
{
"required": [
"can_update",
"can_remove"
],
"properties": {
"can_update": { "type": "boolean" },
"can_remove": { "type": "boolean" }
}
}
]
}
{
"type": "array",
"items": {
"$ref": "project_group_link.json"
}
}
...@@ -29,7 +29,7 @@ RSpec.describe Groups::GroupMembersHelper do ...@@ -29,7 +29,7 @@ RSpec.describe Groups::GroupMembersHelper do
it 'matches json schema' do it 'matches json schema' do
json = helper.group_group_links_data_json(shared_group.shared_with_group_links) json = helper.group_group_links_data_json(shared_group.shared_with_group_links)
expect(json).to match_schema('group_group_links') expect(json).to match_schema('group_link/group_group_links')
end end
end end
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe Projects::ProjectMembersHelper do RSpec.describe Projects::ProjectMembersHelper do
include MembersPresentation
let_it_be(:current_user) { create(:user) } let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) } let_it_be(:project) { create(:project) }
...@@ -142,4 +144,58 @@ RSpec.describe Projects::ProjectMembersHelper do ...@@ -142,4 +144,58 @@ RSpec.describe Projects::ProjectMembersHelper do
it { is_expected.to be(false) } it { is_expected.to be(false) }
end end
end end
describe 'project members' do
let_it_be(:project_members) { create_list(:project_member, 1, project: project) }
describe '#project_members_data_json' do
it 'matches json schema' do
expect(helper.project_members_data_json(project, present_members(project_members))).to match_schema('members')
end
end
describe '#project_members_list_data_attributes' do
let(:allow_admin_project) { true }
before do
allow(helper).to receive(:project_project_member_path).with(project, ':id').and_return('/foo-bar/-/project_members/:id')
end
it 'returns expected hash' do
expect(helper.project_members_list_data_attributes(project, present_members(project_members))).to include({
members: helper.project_members_data_json(project, present_members(project_members)),
member_path: '/foo-bar/-/project_members/:id',
source_id: project.id,
can_manage_members: true
})
end
end
end
describe 'project group links' do
let_it_be(:project_group_links) { create_list(:project_group_link, 1, project: project) }
let(:allow_admin_project) { true }
describe '#project_group_links_data_json' do
it 'matches json schema' do
expect(helper.project_group_links_data_json(project_group_links)).to match_schema('group_link/project_group_links')
end
end
describe '#project_group_links_list_data_attributes' do
before do
allow(helper).to receive(:project_group_link_path).with(project, ':id').and_return('/foo-bar/-/group_links/:id')
allow(helper).to receive(:can?).with(current_user, :admin_project_member, project).and_return(true)
end
it 'returns expected hash' do
expect(helper.project_group_links_list_data_attributes(project, project_group_links)).to include({
members: helper.project_group_links_data_json(project_group_links),
member_path: '/foo-bar/-/group_links/:id',
source_id: project.id,
can_manage_members: true
})
end
end
end
end end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe GroupGroupLinkEntity do RSpec.describe GroupLink::GroupGroupLinkEntity do
include_context 'group_group_link' include_context 'group_group_link'
let_it_be(:current_user) { create(:user) } let_it_be(:current_user) { create(:user) }
...@@ -13,15 +13,15 @@ RSpec.describe GroupGroupLinkEntity do ...@@ -13,15 +13,15 @@ RSpec.describe GroupGroupLinkEntity do
end end
it 'matches json schema' do it 'matches json schema' do
expect(entity.to_json).to match_schema('entities/group_group_link') expect(entity.to_json).to match_schema('group_link/group_group_link')
end end
context 'a user with :admin_group_member permissions' do context 'when current user has `:admin_group_member` permissions' do
before do before do
allow(entity).to receive(:can?).with(current_user, :admin_group_member, shared_group).and_return(true) allow(entity).to receive(:can?).with(current_user, :admin_group_member, shared_group).and_return(true)
end end
it 'sets `can_update` and `can_remove` to `true`' do it 'exposes `can_update` and `can_remove` as `true`' do
json = entity.as_json json = entity.as_json
expect(json[:can_update]).to be true expect(json[:can_update]).to be true
......
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe GroupGroupLinkSerializer do RSpec.describe GroupLink::GroupGroupLinkSerializer do
include_context 'group_group_link' include_context 'group_group_link'
subject(:json) { described_class.new.represent(shared_group.shared_with_group_links).to_json } subject(:json) { described_class.new.represent(shared_group.shared_with_group_links).to_json }
it 'matches json schema' do it 'matches json schema' do
expect(json).to match_schema('group_group_links') expect(json).to match_schema('group_link/group_group_links')
end end
end end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe GroupLink::GroupLinkEntity do
include_context 'group_group_link'
let(:entity) { described_class.new(group_group_link) }
let(:entity_hash) { entity.as_json }
it 'matches json schema' do
expect(entity.to_json).to match_schema('group_link/group_link')
end
it 'correctly exposes `valid_roles`' do
expect(entity_hash[:valid_roles]).to include(Gitlab::Access.options_with_owner)
end
it 'correctly exposes `shared_with_group.avatar_url`' do
avatar_url = 'https://gitlab.com/uploads/-/system/group/avatar/24/foobar.png?width=40'
allow(shared_with_group).to receive(:avatar_url).with(only_path: false, size: Member::AVATAR_SIZE).and_return(avatar_url)
expect(entity_hash[:shared_with_group][:avatar_url]).to match(avatar_url)
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe GroupLink::ProjectGroupLinkEntity do
let_it_be(:current_user) { create(:user) }
let_it_be(:project_group_link) { create(:project_group_link) }
let(:entity) { described_class.new(project_group_link) }
before do
allow(entity).to receive(:current_user).and_return(current_user)
end
it 'matches json schema' do
expect(entity.to_json).to match_schema('group_link/project_group_link')
end
context 'when current user has `admin_project_member` permissions' do
before do
allow(entity).to receive(:can?).with(current_user, :admin_project_member, project_group_link.project).and_return(true)
end
it 'exposes `can_update` and `can_remove` as `true`' do
json = entity.as_json
expect(json[:can_update]).to be true
expect(json[:can_remove]).to be true
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe GroupLink::ProjectGroupLinkSerializer do
let_it_be(:project_group_links) { create_list(:project_group_link, 1) }
subject(:json) { described_class.new.represent(project_group_links).to_json }
it 'matches json schema' do
expect(json).to match_schema('group_link/project_group_links')
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment