Merge pull request #2746 from gitlabhq/features/teams
New feature: Teams
This commit is contained in:
commit
aa1f1eb680
115 changed files with 2714 additions and 174 deletions
16
app/views/admin/projects/members/_form.html.haml
Normal file
16
app/views/admin/projects/members/_form.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
= form_for @team_member_relation, as: :team_member, url: admin_project_member_path(@project, @member) do |f|
|
||||
-if @team_member_relation.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%ul
|
||||
- @team_member_relation.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.clearfix
|
||||
%label Project Access:
|
||||
.input
|
||||
= f.select :project_access, options_for_select(Project.access_options, @team_member_relation.project_access), {}, class: "project-access-select chosen span3"
|
||||
|
||||
%br
|
||||
.actions
|
||||
= f.submit 'Save', class: "btn primary"
|
||||
= link_to 'Cancel', :back, class: "btn"
|
8
app/views/admin/projects/members/edit.html.haml
Normal file
8
app/views/admin/projects/members/edit.html.haml
Normal file
|
@ -0,0 +1,8 @@
|
|||
%p.slead
|
||||
Edit access for
|
||||
= link_to @member.name, admin_user_path(@member)
|
||||
in
|
||||
= link_to @project.name_with_namespace, admin_project_path(@project)
|
||||
|
||||
%hr
|
||||
= render 'form'
|
|
@ -114,9 +114,9 @@
|
|||
%h5
|
||||
Team
|
||||
%small
|
||||
(#{@project.users_projects.count})
|
||||
(#{@project.users.count})
|
||||
%br
|
||||
%table.zebra-striped
|
||||
%table.zebra-striped.team_members
|
||||
%thead
|
||||
%tr
|
||||
%th Name
|
||||
|
@ -124,13 +124,13 @@
|
|||
%th Repository Access
|
||||
%th
|
||||
|
||||
- @project.users_projects.each do |tm|
|
||||
- @project.users.each do |tm|
|
||||
%tr
|
||||
%td
|
||||
= link_to tm.user_name, admin_user_path(tm.user)
|
||||
%td= tm.project_access_human
|
||||
%td= link_to 'Edit Access', edit_admin_team_member_path(tm), class: "btn small"
|
||||
%td= link_to 'Remove from team', admin_team_member_path(tm), confirm: 'Are you sure?', method: :delete, class: "btn danger small"
|
||||
= link_to tm.name, admin_user_path(tm)
|
||||
%td= @project.project_access_human(tm)
|
||||
%td= link_to 'Edit Access', edit_admin_project_member_path(@project, tm), class: "btn small"
|
||||
%td= link_to 'Remove from team', admin_project_member_path(@project, tm), confirm: 'Are you sure?', method: :delete, class: "btn danger small"
|
||||
|
||||
%br
|
||||
%h5 Add new team member
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
= form_for @admin_team_member, as: :team_member, url: admin_team_member_path(@admin_team_member) do |f|
|
||||
-if @admin_team_member.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%ul
|
||||
- @admin_team_member.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.clearfix
|
||||
%label Project Access:
|
||||
.input
|
||||
= f.select :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), {}, class: "project-access-select chosen span3"
|
||||
|
||||
%br
|
||||
.actions
|
||||
= f.submit 'Save', class: "btn primary"
|
||||
= link_to 'Cancel', :back, class: "btn"
|
|
@ -1,8 +0,0 @@
|
|||
%p.slead
|
||||
Edit access for
|
||||
= link_to @admin_team_member.user_name, admin_user_path(@admin_team_member)
|
||||
in
|
||||
= link_to @admin_team_member.project.name_with_namespace, admin_project_path(@admin_team_member)
|
||||
|
||||
%hr
|
||||
= render 'form'
|
23
app/views/admin/teams/edit.html.haml
Normal file
23
app/views/admin/teams/edit.html.haml
Normal file
|
@ -0,0 +1,23 @@
|
|||
%h3.page_title Rename Team
|
||||
%hr
|
||||
= form_for @team, url: admin_team_path(@team), method: :put do |f|
|
||||
- if @team.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%span= @team.errors.full_messages.first
|
||||
.clearfix.team_name_holder
|
||||
= f.label :name do
|
||||
Team name is
|
||||
.input
|
||||
= f.text_field :name, placeholder: "Example Team", class: "xxlarge"
|
||||
|
||||
.clearfix.team_name_holder
|
||||
= f.label :path do
|
||||
%span.cred Team path is
|
||||
.input
|
||||
= f.text_field :path, placeholder: "example-team", class: "xxlarge danger"
|
||||
%ul.cred
|
||||
%li It will change web url for access team and team projects.
|
||||
|
||||
.form-actions
|
||||
= f.submit 'Rename team', class: "btn danger"
|
||||
= link_to 'Cancel', admin_teams_path, class: "btn cancel-btn"
|
38
app/views/admin/teams/index.html.haml
Normal file
38
app/views/admin/teams/index.html.haml
Normal file
|
@ -0,0 +1,38 @@
|
|||
%h3.page_title
|
||||
Teams
|
||||
%small
|
||||
simple Teams description
|
||||
|
||||
= link_to 'New Team', new_admin_team_path, class: "btn small right"
|
||||
%br
|
||||
|
||||
= form_tag admin_teams_path, method: :get, class: 'form-inline' do
|
||||
= text_field_tag :name, params[:name], class: "xlarge"
|
||||
= submit_tag "Search", class: "btn submit primary"
|
||||
|
||||
%table
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
Name
|
||||
%i.icon-sort-down
|
||||
%th Path
|
||||
%th Projects
|
||||
%th Members
|
||||
%th Owner
|
||||
%th.cred Danger Zone!
|
||||
|
||||
- @teams.each do |team|
|
||||
%tr
|
||||
%td
|
||||
%strong= link_to team.name, admin_team_path(team)
|
||||
%td= team.path
|
||||
%td= team.projects.count
|
||||
%td= team.members.count
|
||||
%td
|
||||
= link_to team.owner.name, admin_user_path(team.owner_id)
|
||||
%td.bgred
|
||||
= link_to 'Rename', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn small"
|
||||
= link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn small danger"
|
||||
|
||||
= paginate @teams, theme: "admin"
|
20
app/views/admin/teams/members/_form.html.haml
Normal file
20
app/views/admin/teams/members/_form.html.haml
Normal file
|
@ -0,0 +1,20 @@
|
|||
= form_tag admin_team_member_path(@team, @member), method: :put do
|
||||
-if @member.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%ul
|
||||
- @member.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.clearfix
|
||||
%label Default access for Team projects:
|
||||
.input
|
||||
= select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3"
|
||||
.clearfix
|
||||
%label Team admin?
|
||||
.input
|
||||
= check_box_tag :group_admin, true, @team.admin?(@member)
|
||||
|
||||
%br
|
||||
.actions
|
||||
= submit_tag 'Save', class: "btn primary"
|
||||
= link_to 'Cancel', :back, class: "btn"
|
16
app/views/admin/teams/members/edit.html.haml
Normal file
16
app/views/admin/teams/members/edit.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
%h3
|
||||
Edit access #{@member.name} in #{@team.name} team
|
||||
|
||||
%hr
|
||||
%table.zebra-striped
|
||||
%tr
|
||||
%td User:
|
||||
%td= @member.name
|
||||
%tr
|
||||
%td Team:
|
||||
%td= @team.name
|
||||
%tr
|
||||
%td Since:
|
||||
%td= member_since(@team, @member).stamp("Nov 11, 2010")
|
||||
|
||||
= render 'form'
|
29
app/views/admin/teams/members/new.html.haml
Normal file
29
app/views/admin/teams/members/new.html.haml
Normal file
|
@ -0,0 +1,29 @@
|
|||
%h3.page_title
|
||||
Team: #{@team.name}
|
||||
|
||||
%fieldset
|
||||
%legend Members (#{@team.members.count})
|
||||
= form_tag admin_team_members_path(@team), id: "team_members", class: "bulk_import", method: :post do
|
||||
%table#members_list
|
||||
%thead
|
||||
%tr
|
||||
%th User name
|
||||
%th Default project access
|
||||
%th Team access
|
||||
%th
|
||||
- @team.members.each do |member|
|
||||
%tr.member
|
||||
%td
|
||||
= link_to [:admin, member] do
|
||||
= member.name
|
||||
%small= "(#{member.email})"
|
||||
%td= @team.human_default_projects_access(member)
|
||||
%td= @team.admin?(member) ? "Admin" : "Member"
|
||||
%td
|
||||
%tr
|
||||
%td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_email), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5'
|
||||
%td= select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }
|
||||
%td
|
||||
%span= check_box_tag :group_admin
|
||||
%span Admin?
|
||||
%td= submit_tag 'Add', class: "btn primary", id: :add_members_to_team
|
19
app/views/admin/teams/new.html.haml
Normal file
19
app/views/admin/teams/new.html.haml
Normal file
|
@ -0,0 +1,19 @@
|
|||
%h3.page_title New Team
|
||||
%hr
|
||||
= form_for @team, url: admin_teams_path do |f|
|
||||
- if @team.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%span= @team.errors.full_messages.first
|
||||
.clearfix
|
||||
= f.label :name do
|
||||
Team name is
|
||||
.input
|
||||
= f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
|
||||
|
||||
= f.submit 'Create team', class: "btn primary"
|
||||
%hr
|
||||
.padded
|
||||
%ul
|
||||
%li All created teams are public (users can view who enter into team and which project are assigned for this team)
|
||||
%li People within a team see only projects they have access to
|
||||
%li You will be able to assign existing projects for team
|
16
app/views/admin/teams/projects/_form.html.haml
Normal file
16
app/views/admin/teams/projects/_form.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
= form_tag admin_team_project_path(@team, @project), method: :put do
|
||||
-if @project.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%ul
|
||||
- @project.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.clearfix
|
||||
%label Max access for Team members:
|
||||
.input
|
||||
= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles, @team.max_project_access(@project)), class: "project-access-select chosen span3"
|
||||
|
||||
%br
|
||||
.actions
|
||||
= submit_tag 'Save', class: "btn primary"
|
||||
= link_to 'Cancel', :back, class: "btn"
|
16
app/views/admin/teams/projects/edit.html.haml
Normal file
16
app/views/admin/teams/projects/edit.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
%h3
|
||||
Edit max access in #{@project.name} for #{@team.name} team
|
||||
|
||||
%hr
|
||||
%table.zebra-striped
|
||||
%tr
|
||||
%td Project:
|
||||
%td= @project.name
|
||||
%tr
|
||||
%td Team:
|
||||
%td= @team.name
|
||||
%tr
|
||||
%td Since:
|
||||
%td= assigned_since(@team, @project).stamp("Nov 11, 2010")
|
||||
|
||||
= render 'form'
|
23
app/views/admin/teams/projects/new.html.haml
Normal file
23
app/views/admin/teams/projects/new.html.haml
Normal file
|
@ -0,0 +1,23 @@
|
|||
%h3.page_title
|
||||
Team: #{@team.name}
|
||||
|
||||
%fieldset
|
||||
%legend Projects (#{@team.projects.count})
|
||||
= form_tag admin_team_projects_path(@team), id: "assign_projects", class: "bulk_import", method: :post do
|
||||
%table#projects_list
|
||||
%thead
|
||||
%tr
|
||||
%th Project name
|
||||
%th Max access
|
||||
%th
|
||||
- @team.projects.each do |project|
|
||||
%tr.project
|
||||
%td
|
||||
= link_to project.name_with_namespace, [:admin, project]
|
||||
%td
|
||||
%span= @team.human_max_project_access(project)
|
||||
%td
|
||||
%tr
|
||||
%td= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
|
||||
%td= select_tag :greatest_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }
|
||||
%td= submit_tag 'Add', class: "btn primary", id: :assign_projects_to_team
|
101
app/views/admin/teams/show.html.haml
Normal file
101
app/views/admin/teams/show.html.haml
Normal file
|
@ -0,0 +1,101 @@
|
|||
%h3.page_title
|
||||
Team: #{@team.name}
|
||||
|
||||
%br
|
||||
%table.zebra-striped
|
||||
%thead
|
||||
%tr
|
||||
%th Team
|
||||
%th
|
||||
%tr
|
||||
%td
|
||||
%b
|
||||
Name:
|
||||
%td
|
||||
= @team.name
|
||||
|
||||
= link_to edit_admin_team_path(@team), class: "btn btn-small right" do
|
||||
%i.icon-edit
|
||||
Rename
|
||||
%tr
|
||||
%td
|
||||
%b
|
||||
Owner:
|
||||
%td
|
||||
= @team.owner.name
|
||||
.right
|
||||
= link_to "#", class: "btn btn-small change-owner-link" do
|
||||
%i.icon-edit
|
||||
Change owner
|
||||
|
||||
%tr.change-owner-holder.hide
|
||||
%td.bgred
|
||||
%b.cred
|
||||
New Owner:
|
||||
%td.bgred
|
||||
= form_for @team, url: admin_team_path(@team) do |f|
|
||||
= f.select :owner_id, User.all.map { |user| [user.name, user.id] }, {}, {class: 'chosen'}
|
||||
%div
|
||||
= f.submit 'Change Owner', class: "btn danger"
|
||||
= link_to "Cancel", "#", class: "btn change-owner-cancel-link"
|
||||
|
||||
%fieldset
|
||||
%legend
|
||||
Members (#{@team.members.count})
|
||||
%span= link_to 'Add members', new_admin_team_member_path(@team), class: "btn success small right", id: :add_members_to_team
|
||||
- if @team.members.any?
|
||||
%table#members_list
|
||||
%thead
|
||||
%tr
|
||||
%th User name
|
||||
%th Default project access
|
||||
%th Team access
|
||||
%th.cred.span3 Danger Zone!
|
||||
- @team.members.each do |member|
|
||||
%tr.member{ class: "user_#{member.id}"}
|
||||
%td
|
||||
= link_to [:admin, member] do
|
||||
= member.name
|
||||
%small= "(#{member.email})"
|
||||
%td= @team.human_default_projects_access(member)
|
||||
%td= @team.admin?(member) ? "Admin" : "Member"
|
||||
%td.bgred
|
||||
= link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn small"
|
||||
|
||||
= link_to 'Remove', admin_team_member_path(@team, member), confirm: 'Remove member from team. Are you sure?', method: :delete, class: "btn danger small", id: "remove_member_#{member.id}"
|
||||
|
||||
%fieldset
|
||||
%legend
|
||||
Projects (#{@team.projects.count})
|
||||
%span= link_to 'Add projects', new_admin_team_project_path(@team), class: "btn success small right", id: :assign_projects_to_team
|
||||
- if @team.projects.any?
|
||||
%table#projects_list
|
||||
%thead
|
||||
%tr
|
||||
%th Project name
|
||||
%th Max access
|
||||
%th.cred.span3 Danger Zone!
|
||||
- @team.projects.each do |project|
|
||||
%tr.project
|
||||
%td
|
||||
= link_to project.name_with_namespace, [:admin, project]
|
||||
%td
|
||||
%span= @team.human_max_project_access(project)
|
||||
%td.bgred
|
||||
= link_to 'Edit', edit_admin_team_project_path(@team, project), class: "btn small"
|
||||
|
||||
= link_to 'Relegate', admin_team_project_path(@team, project), confirm: 'Remove project from team. Are you sure?', method: :delete, class: "btn danger small", id: "relegate_project_#{project.id}"
|
||||
|
||||
:javascript
|
||||
$(function(){
|
||||
var modal = $('.change-owner-holder');
|
||||
$('.change-owner-link').bind("click", function(){
|
||||
$(this).hide();
|
||||
modal.show();
|
||||
});
|
||||
$('.change-owner-cancel-link').bind("click", function(){
|
||||
modal.hide();
|
||||
$('.change-owner-link').show();
|
||||
})
|
||||
})
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
.groups_box
|
||||
.ui-box
|
||||
%h5.title
|
||||
Groups
|
||||
%small
|
||||
|
@ -13,8 +13,6 @@
|
|||
%li
|
||||
= link_to group_path(id: group.path), class: dom_class(group) do
|
||||
%strong.well-title= truncate(group.name, length: 35)
|
||||
%span.arrow
|
||||
→
|
||||
%span.last_activity
|
||||
%strong Projects:
|
||||
%span= current_user.authorized_projects.where(namespace_id: group.id).count
|
||||
%span.right.light
|
||||
- if group.owner == current_user
|
||||
%i.icon-wrench
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
- if @teams.present?
|
||||
= render "teams", teams: @teams
|
||||
- if @groups.present?
|
||||
= render "groups", groups: @groups
|
||||
= render "projects", projects: @projects
|
||||
|
|
20
app/views/dashboard/_teams.html.haml
Normal file
20
app/views/dashboard/_teams.html.haml
Normal file
|
@ -0,0 +1,20 @@
|
|||
.ui-box
|
||||
%h5.title
|
||||
Teams
|
||||
%small
|
||||
(#{@teams.count})
|
||||
%span.right
|
||||
= link_to new_team_path, class: "btn very_small info" do
|
||||
%i.icon-plus
|
||||
New Team
|
||||
%ul.well-list
|
||||
- @teams.each do |team|
|
||||
%li
|
||||
= link_to team_path(id: team.path), class: dom_class(team) do
|
||||
%strong.well-title= truncate(team.name, length: 35)
|
||||
%span.right.light
|
||||
- if team.owner == current_user
|
||||
%i.icon-wrench
|
||||
- tm = current_user.user_team_user_relationships.find_by_user_team_id(team.id)
|
||||
- if tm
|
||||
= tm.access_human
|
|
@ -10,6 +10,8 @@
|
|||
= link_to "Stats", admin_root_path
|
||||
= nav_link(controller: :projects) do
|
||||
= link_to "Projects", admin_projects_path
|
||||
= nav_link(controller: :teams) do
|
||||
= link_to "Teams", admin_teams_path
|
||||
= nav_link(controller: :groups) do
|
||||
= link_to "Groups", admin_groups_path
|
||||
= nav_link(controller: :users) do
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
= render "layouts/head", title: "#{@group.name}"
|
||||
%body{class: "#{app_theme} application"}
|
||||
= render "layouts/flash"
|
||||
= render "layouts/head_panel", title: "#{@group.name}"
|
||||
= render "layouts/head_panel", title: "group: #{@group.name}"
|
||||
.container
|
||||
%ul.main_menu
|
||||
= nav_link(path: 'groups#show', html_options: {class: 'home'}) do
|
||||
|
|
40
app/views/layouts/user_team.html.haml
Normal file
40
app/views/layouts/user_team.html.haml
Normal file
|
@ -0,0 +1,40 @@
|
|||
!!! 5
|
||||
%html{ lang: "en"}
|
||||
= render "layouts/head", title: "#{@team.name}"
|
||||
%body{class: "#{app_theme} application"}
|
||||
= render "layouts/flash"
|
||||
= render "layouts/head_panel", title: "team: #{@team.name}"
|
||||
.container
|
||||
%ul.main_menu
|
||||
= nav_link(path: 'teams#show', html_options: {class: 'home'}) do
|
||||
= link_to "Home", team_path(@team), title: "Home"
|
||||
|
||||
= nav_link(path: 'teams#issues') do
|
||||
= link_to issues_team_path(@team) do
|
||||
Issues
|
||||
%span.count= Issue.opened.of_user_team(@team).count
|
||||
|
||||
= nav_link(path: 'teams#merge_requests') do
|
||||
= link_to merge_requests_team_path(@team) do
|
||||
Merge Requests
|
||||
%span.count= MergeRequest.opened.of_user_team(@team).count
|
||||
|
||||
= nav_link(path: 'teams#search') do
|
||||
= link_to "Search", search_team_path(@team)
|
||||
|
||||
= nav_link(controller: [:members]) do
|
||||
= link_to team_members_path(@team), class: "team-tab tab" do
|
||||
Members
|
||||
|
||||
- if can? current_user, :admin_user_team, @team
|
||||
= nav_link(controller: [:projects]) do
|
||||
= link_to team_projects_path(@team), class: "team-tab tab" do
|
||||
%i.icon-briefcase
|
||||
Projects
|
||||
|
||||
= nav_link(path: 'teams#edit') do
|
||||
= link_to edit_team_path(@team), class: "stat-tab tab " do
|
||||
%i.icon-edit
|
||||
Edit Team
|
||||
|
||||
.content= yield
|
|
@ -3,7 +3,7 @@
|
|||
= link_to project_path(@project), class: "activities-tab tab" do
|
||||
%i.icon-home
|
||||
Show
|
||||
= nav_link(controller: :team_members) do
|
||||
= nav_link(controller: [:team_members, :teams]) do
|
||||
= link_to project_team_index_path(@project), class: "team-tab tab" do
|
||||
%i.icon-user
|
||||
Team
|
||||
|
|
22
app/views/projects/teams/available.html.haml
Normal file
22
app/views/projects/teams/available.html.haml
Normal file
|
@ -0,0 +1,22 @@
|
|||
= render "projects/project_head"
|
||||
|
||||
%h3.page_title
|
||||
= "Assign project to team of users"
|
||||
%hr
|
||||
%p.slead
|
||||
Read more about assign to team of users #{link_to "here", '#', class: 'vlink'}.
|
||||
= form_tag assign_project_teams_path(@project), method: 'post' do
|
||||
%p.slead Choose Team of users you want to assign:
|
||||
.padded
|
||||
= label_tag :team_id, "Team"
|
||||
.input= select_tag(:team_id, options_from_collection_for_select(@teams, :id, :name), prompt: "Select team", class: "chosen xxlarge", required: true)
|
||||
%p.slead Choose greatest user acces in team you want to assign:
|
||||
.padded
|
||||
= label_tag :team_ids, "Permission"
|
||||
.input= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen span3" }
|
||||
|
||||
|
||||
.actions
|
||||
= submit_tag 'Assign', class: "btn save-btn"
|
||||
= link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn"
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
%h3.page_title
|
||||
= "New Team member(s)"
|
||||
%hr
|
||||
= form_for @team_member, as: :team_member, url: project_team_members_path(@project, @team_member) do |f|
|
||||
-if @team_member.errors.any?
|
||||
= form_for @user_project_relation, as: :team_member, url: project_team_members_path(@project) do |f|
|
||||
-if @user_project_relation.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%ul
|
||||
- @team_member.errors.full_messages.each do |msg|
|
||||
- @user_project_relation.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
%h6 1. Choose people you want in the team
|
||||
|
@ -16,7 +16,7 @@
|
|||
%h6 2. Set access level for them
|
||||
.clearfix
|
||||
= f.label :project_access, "Project Access"
|
||||
.input= select_tag :project_access, options_for_select(Project.access_options, @team_member.project_access), class: "project-access-select chosen"
|
||||
.input= select_tag :project_access, options_for_select(Project.access_options, @user_project_relation.project_access), class: "project-access-select chosen"
|
||||
|
||||
.actions
|
||||
= f.submit 'Save', class: "btn save-btn"
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
- user = member.user
|
||||
- allow_admin = can? current_user, :admin_project, @project
|
||||
%li{id: dom_id(member), class: "team_member_row user_#{user.id}"}
|
||||
%li{id: dom_id(user), class: "team_member_row user_#{user.id}"}
|
||||
.row
|
||||
.span6
|
||||
= link_to project_team_member_path(@project, member), title: user.name, class: "dark" do
|
||||
= link_to project_team_member_path(@project, user), title: user.name, class: "dark" do
|
||||
= image_tag gravatar_icon(user.email, 40), class: "avatar s32"
|
||||
= link_to project_team_member_path(@project, member), title: user.name, class: "dark" do
|
||||
= link_to project_team_member_path(@project, user), title: user.name, class: "dark" do
|
||||
%strong= truncate(user.name, lenght: 40)
|
||||
%br
|
||||
%small.cgray= user.email
|
||||
|
@ -13,7 +13,7 @@
|
|||
.span5.right
|
||||
- if allow_admin
|
||||
.left
|
||||
= form_for(member, as: :team_member, url: project_team_member_path(@project, member)) do |f|
|
||||
= form_for(member, as: :team_member, url: project_team_member_path(@project, member.user)) do |f|
|
||||
= f.select :project_access, options_for_select(UsersProject.access_roles, member.project_access), {}, class: "medium project-access-select span2"
|
||||
.right
|
||||
- if current_user == user
|
||||
|
@ -23,6 +23,6 @@
|
|||
- elsif user.blocked
|
||||
%span.btn.disabled.blocked Blocked
|
||||
- elsif allow_admin
|
||||
= link_to project_team_member_path(project_id: @project, id: member.id), confirm: remove_from_team_message(@project, member), method: :delete, class: "very_small btn danger" do
|
||||
= link_to project_team_member_path(@project, user), confirm: remove_from_project_team_message(@project, user), method: :delete, class: "very_small btn danger" do
|
||||
%i.icon-minus.icon-white
|
||||
|
||||
|
|
15
app/views/team_members/_show_team.html.haml
Normal file
15
app/views/team_members/_show_team.html.haml
Normal file
|
@ -0,0 +1,15 @@
|
|||
- team = team_rel.user_team
|
||||
- allow_admin = can? current_user, :admin_team_member, @project
|
||||
%li{id: dom_id(team), class: "user_team_row team_#{team.id}"}
|
||||
.row
|
||||
.span6
|
||||
%strong= link_to team.name, team_path(team), title: team.name, class: "dark"
|
||||
%br
|
||||
%small.cgray Members: #{team.members.count}
|
||||
|
||||
.span5.right
|
||||
.right
|
||||
- if allow_admin
|
||||
.left
|
||||
= link_to resign_project_team_path(@project, team), method: :delete, confirm: "Are you shure?", class: "btn danger small" do
|
||||
%i.icon-minus.icon-white
|
16
app/views/team_members/_teams.html.haml
Normal file
16
app/views/team_members/_teams.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
- grouper_project_teams(@project).each do |access, teams|
|
||||
.ui-box
|
||||
%h5.title
|
||||
= UserTeam.access_roles.key(access).pluralize
|
||||
%small= teams.size
|
||||
%ul.well-list
|
||||
- teams.sort_by(&:team_name).each do |tofr|
|
||||
= render(partial: 'team_members/show_team', locals: {team_rel: tofr})
|
||||
|
||||
|
||||
:javascript
|
||||
$(function(){
|
||||
$('.repo-access-select, .project-access-select').live("change", function() {
|
||||
$(this.form).submit();
|
||||
});
|
||||
})
|
|
@ -1,4 +1,4 @@
|
|||
- if @team_member.valid?
|
||||
- if @user_project_relation.valid?
|
||||
:plain
|
||||
$("#new_team_member").hide("slide", { direction: "right" }, 150, function(){
|
||||
$("#team-table").show("slide", { direction: "left" }, 150, function() {
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
= "Import team from another project"
|
||||
%hr
|
||||
%p.slead
|
||||
Read more about team import #{link_to "here", '#', class: 'vlink'}.
|
||||
Read more about project team import #{link_to "here", '#', class: 'vlink'}.
|
||||
= form_tag apply_import_project_team_members_path(@project), method: 'post' do
|
||||
%p.slead Choose project you want to use as team source:
|
||||
.padded
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
= render "projects/project_head"
|
||||
%h3.page_title
|
||||
Team Members
|
||||
(#{@project.users_projects.count})
|
||||
(#{@project.users.count})
|
||||
%small
|
||||
Read more about project permissions
|
||||
%strong= link_to "here", help_permissions_path, class: "vlink"
|
||||
|
@ -10,11 +10,24 @@
|
|||
%span.right
|
||||
= link_to import_project_team_members_path(@project), class: "btn small grouped", title: "Import team from another project" do
|
||||
Import team from another project
|
||||
= link_to available_project_teams_path(@project), class: "btn small grouped", title: "Assign project to team of users" do
|
||||
Assign project to Team of users
|
||||
= link_to new_project_team_member_path(@project), class: "btn success small grouped", title: "New Team Member" do
|
||||
New Team Member
|
||||
%hr
|
||||
|
||||
%hr
|
||||
|
||||
.clearfix
|
||||
%div.team-table
|
||||
= render partial: "team_members/team", locals: {project: @project}
|
||||
|
||||
|
||||
%h3.page_title
|
||||
Assigned teams
|
||||
(#{@project.user_teams.count})
|
||||
|
||||
%hr
|
||||
|
||||
.clearfix
|
||||
%div.team-table
|
||||
= render partial: "team_members/teams", locals: {project: @project}
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
- allow_admin = can? current_user, :admin_project, @project
|
||||
- user = @team_member.user
|
||||
|
||||
.team_member_show
|
||||
- if can? current_user, :admin_project, @project
|
||||
= link_to 'Remove from team', project_team_member_path(project_id: @project, id: @team_member.id), confirm: 'Are you sure?', method: :delete, class: "right btn danger"
|
||||
= link_to 'Remove from team', project_team_member_path(@project, @member), confirm: 'Are you sure?', method: :delete, class: "right btn danger"
|
||||
.profile_avatar_holder
|
||||
= image_tag gravatar_icon(user.email, 60), class: "borders"
|
||||
= image_tag gravatar_icon(@member.email, 60), class: "borders"
|
||||
%h3.page_title
|
||||
= user.name
|
||||
%small (@#{user.username})
|
||||
= @member.name
|
||||
%small (@#{@member.username})
|
||||
|
||||
%hr
|
||||
.back_link
|
||||
|
@ -21,34 +20,34 @@
|
|||
%table.lite
|
||||
%tr
|
||||
%td Email
|
||||
%td= mail_to user.email
|
||||
%td= mail_to @member.email
|
||||
%tr
|
||||
%td Skype
|
||||
%td= user.skype
|
||||
- unless user.linkedin.blank?
|
||||
%td= @member.skype
|
||||
- unless @member.linkedin.blank?
|
||||
%tr
|
||||
%td LinkedIn
|
||||
%td= user.linkedin
|
||||
- unless user.twitter.blank?
|
||||
%td= @member.linkedin
|
||||
- unless @member.twitter.blank?
|
||||
%tr
|
||||
%td Twitter
|
||||
%td= user.twitter
|
||||
- unless user.bio.blank?
|
||||
%td= @member.twitter
|
||||
- unless @member.bio.blank?
|
||||
%tr
|
||||
%td Bio
|
||||
%td= user.bio
|
||||
%td= @member.bio
|
||||
.span6
|
||||
%table.lite
|
||||
%tr
|
||||
%td Member since
|
||||
%td= @team_member.created_at.stamp("Aug 21, 2011")
|
||||
%td= @user_project_relation.created_at.stamp("Aug 21, 2011")
|
||||
%tr
|
||||
%td
|
||||
Project Access:
|
||||
%small (#{link_to "read more", help_permissions_path, class: "vlink"})
|
||||
%td
|
||||
= form_for(@team_member, as: :team_member, url: project_team_member_path(@project, @team_member)) do |f|
|
||||
= f.select :project_access, options_for_select(Project.access_options, @team_member.project_access), {}, class: "project-access-select", disabled: !allow_admin
|
||||
= form_for(@user_project_relation, as: :team_member, url: project_team_member_path(@project, @member)) do |f|
|
||||
= f.select :project_access, options_for_select(Project.access_options, @user_project_relation.project_access), {}, class: "project-access-select", disabled: !allow_admin
|
||||
%hr
|
||||
= render @events
|
||||
:javascript
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
- if @team_member.valid?
|
||||
- if @user_project_relation.valid?
|
||||
:plain
|
||||
$("##{dom_id(@team_member)}").effect("highlight", {color: "#529214"}, 1000);;
|
||||
$("##{dom_id(@user_project_relation)}").effect("highlight", {color: "#529214"}, 1000);;
|
||||
- else
|
||||
:plain
|
||||
$("##{dom_id(@team_member)}").effect("highlight", {color: "#D12F19"}, 1000);;
|
||||
$("##{dom_id(@user_project_relation)}").effect("highlight", {color: "#D12F19"}, 1000);;
|
||||
|
|
33
app/views/teams/_filter.html.haml
Normal file
33
app/views/teams/_filter.html.haml
Normal file
|
@ -0,0 +1,33 @@
|
|||
= form_tag team_filter_path(entity), method: 'get' do
|
||||
%fieldset.dashboard-search-filter
|
||||
= search_field_tag "search", params[:search], { placeholder: 'Search', class: 'search-text-input' }
|
||||
= button_tag type: 'submit', class: 'btn' do
|
||||
%i.icon-search
|
||||
|
||||
%fieldset
|
||||
%legend Status:
|
||||
%ul.nav.nav-pills.nav-stacked
|
||||
%li{class: ("active" if !params[:status])}
|
||||
= link_to team_filter_path(entity, status: nil) do
|
||||
Open
|
||||
%li{class: ("active" if params[:status] == 'closed')}
|
||||
= link_to team_filter_path(entity, status: 'closed') do
|
||||
Closed
|
||||
%li{class: ("active" if params[:status] == 'all')}
|
||||
= link_to team_filter_path(entity, status: 'all') do
|
||||
All
|
||||
|
||||
%fieldset
|
||||
%legend Projects:
|
||||
%ul.nav.nav-pills.nav-stacked
|
||||
- @projects.each do |project|
|
||||
- unless entities_per_project(project, entity).zero?
|
||||
%li{class: ("active" if params[:project_id] == project.id.to_s)}
|
||||
= link_to team_filter_path(entity, project_id: project.id) do
|
||||
= project.name_with_namespace
|
||||
%small.right= entities_per_project(project, entity)
|
||||
|
||||
%fieldset
|
||||
%hr
|
||||
= link_to "Reset", team_filter_path(entity), class: 'btn right'
|
||||
|
22
app/views/teams/_projects.html.haml
Normal file
22
app/views/teams/_projects.html.haml
Normal file
|
@ -0,0 +1,22 @@
|
|||
.projects_box
|
||||
%h5.title
|
||||
Projects
|
||||
%small
|
||||
(#{projects.count})
|
||||
- if can? current_user, :manage_group, @group
|
||||
%span.right
|
||||
= link_to new_project_path(namespace_id: @group.id), class: "btn very_small info" do
|
||||
%i.icon-plus
|
||||
New Project
|
||||
%ul.well-list
|
||||
- if projects.blank?
|
||||
%p.nothing_here_message This team has no projects yet
|
||||
- projects.each do |project|
|
||||
%li
|
||||
= link_to project_path(project), class: dom_class(project) do
|
||||
%strong.well-title= truncate(project.name, length: 25)
|
||||
%span.arrow
|
||||
→
|
||||
%span.last_activity
|
||||
%strong Last activity:
|
||||
%span= project_last_activity(project)
|
0
app/views/teams/_team_head.html.haml
Normal file
0
app/views/teams/_team_head.html.haml
Normal file
24
app/views/teams/edit.html.haml
Normal file
24
app/views/teams/edit.html.haml
Normal file
|
@ -0,0 +1,24 @@
|
|||
= render "team_head"
|
||||
|
||||
%h3.page_title= "Edit Team #{@team.name}"
|
||||
%hr
|
||||
= form_for @team, url: teams_path do |f|
|
||||
- if @team.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%span= @team.errors.full_messages.first
|
||||
.clearfix
|
||||
= f.label :name do
|
||||
Team name is
|
||||
.input
|
||||
= f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
|
||||
|
||||
.clearfix
|
||||
= f.label :path do
|
||||
Team path is
|
||||
.input
|
||||
= f.text_field :path, placeholder: "opensource", class: "xxlarge left"
|
||||
.clearfix
|
||||
.input.span3.center
|
||||
= f.submit 'Save team changes', class: "btn primary"
|
||||
.input.span3.center
|
||||
= link_to 'Delete team', team_path(@team), method: :delete, confirm: "You are shure?", class: "btn danger"
|
38
app/views/teams/index.html.haml
Normal file
38
app/views/teams/index.html.haml
Normal file
|
@ -0,0 +1,38 @@
|
|||
%h3.page_title
|
||||
Teams
|
||||
%small
|
||||
list of all teams
|
||||
|
||||
= link_to 'New Team', new_team_path, class: "btn success small right"
|
||||
%br
|
||||
|
||||
= form_tag search_teams_path, method: :get, class: 'form-inline' do
|
||||
= text_field_tag :name, params[:name], class: "xlarge"
|
||||
= submit_tag "Search", class: "btn submit primary"
|
||||
|
||||
%table.teams_list
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
Name
|
||||
%i.icon-sort-down
|
||||
%th Path
|
||||
%th Projects
|
||||
%th Members
|
||||
%th Owner
|
||||
%th.cred Danger Zone!
|
||||
|
||||
- @teams.each do |team|
|
||||
%tr
|
||||
%td
|
||||
%strong= link_to team.name, team_path(team)
|
||||
%td= team.path
|
||||
%td= link_to team.projects.count, team_projects_path(team)
|
||||
%td= link_to team.members.count, team_members_path(team)
|
||||
%td= link_to team.owner.name, team_member_path(team, team.owner)
|
||||
%td.bgred
|
||||
- if current_user.can?(:manage_user_team, team)
|
||||
= link_to "Edit", edit_team_path(team), class: "btn small"
|
||||
- if current_user.can?(:admin_user_team, team)
|
||||
= link_to "Destroy", team_path(team), method: :delete, confirm: "You are shure?", class: "danger btn small"
|
||||
|
25
app/views/teams/issues.html.haml
Normal file
25
app/views/teams/issues.html.haml
Normal file
|
@ -0,0 +1,25 @@
|
|||
= render "team_head"
|
||||
|
||||
%h3.page_title
|
||||
Issues
|
||||
%small (in Team projects assigned to Team members)
|
||||
%small.right #{@issues.total_count} issues
|
||||
|
||||
%hr
|
||||
.row
|
||||
.span3
|
||||
= render 'filter', entity: 'issue'
|
||||
.span9
|
||||
- if @issues.any?
|
||||
- @issues.group_by(&:project).each do |group|
|
||||
%div.ui-box
|
||||
- @project = group[0]
|
||||
%h5.title
|
||||
= link_to_project @project
|
||||
%ul.well-list.issues_table
|
||||
- group[1].each do |issue|
|
||||
= render(partial: 'issues/show', locals: {issue: issue})
|
||||
%hr
|
||||
= paginate @issues, theme: "gitlab"
|
||||
- else
|
||||
%p.nothing_here_message Nothing to show here
|
20
app/views/teams/members/_form.html.haml
Normal file
20
app/views/teams/members/_form.html.haml
Normal file
|
@ -0,0 +1,20 @@
|
|||
= form_tag admin_team_member_path(@team, @member), method: :put do
|
||||
-if @member.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%ul
|
||||
- @member.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.clearfix
|
||||
%label Default access for Team projects:
|
||||
.input
|
||||
= select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3"
|
||||
.clearfix
|
||||
%label Team admin?
|
||||
.input
|
||||
= check_box_tag :group_admin, true, @team.admin?(@member)
|
||||
|
||||
%br
|
||||
.actions
|
||||
= submit_tag 'Save', class: "btn primary"
|
||||
= link_to 'Cancel', :back, class: "btn"
|
31
app/views/teams/members/_show.html.haml
Normal file
31
app/views/teams/members/_show.html.haml
Normal file
|
@ -0,0 +1,31 @@
|
|||
- user = member.user
|
||||
- allow_admin = can? current_user, :manage_user_team, @team
|
||||
%li{id: dom_id(member), class: "team_member_row user_#{user.id}"}
|
||||
.row
|
||||
.span5
|
||||
= link_to user_path(user.username), title: user.name, class: "dark" do
|
||||
= image_tag gravatar_icon(user.email, 40), class: "avatar s32"
|
||||
= link_to user_path(user.username), title: user.name, class: "dark" do
|
||||
%strong= truncate(user.name, lenght: 40)
|
||||
%br
|
||||
%small.cgray= user.email
|
||||
|
||||
.span6.right
|
||||
- if allow_admin
|
||||
.left.span2
|
||||
= form_for(member, as: :team_member, url: team_member_path(@team, user)) do |f|
|
||||
= f.select :permission, options_for_select(UsersProject.access_roles, @team.default_projects_access(user)), {}, class: "medium project-access-select span2"
|
||||
.left.span2
|
||||
%span
|
||||
Admin access
|
||||
= check_box_tag :group_admin
|
||||
.right
|
||||
- if current_user == user
|
||||
%span.btn.disabled This is you!
|
||||
- if @team.owner == user
|
||||
%span.btn.disabled.success Owner
|
||||
- elsif user.blocked
|
||||
%span.btn.disabled.blocked Blocked
|
||||
- elsif allow_admin
|
||||
= link_to team_member_path(@team, user), confirm: remove_from_user_team_message(@team, user), method: :delete, class: "very_small btn danger" do
|
||||
%i.icon-minus.icon-white
|
16
app/views/teams/members/_team.html.haml
Normal file
16
app/views/teams/members/_team.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
- grouped_user_team_members(@team).each do |access, members|
|
||||
.ui-box
|
||||
%h5.title
|
||||
= Project.access_options.key(access).pluralize
|
||||
%small= members.size
|
||||
%ul.well-list
|
||||
- members.sort_by(&:user_name).each do |up|
|
||||
= render(partial: 'teams/members/show', locals: {member: up})
|
||||
|
||||
|
||||
:javascript
|
||||
$(function(){
|
||||
$('.repo-access-select, .project-access-select').live("change", function() {
|
||||
$(this.form).submit();
|
||||
});
|
||||
})
|
18
app/views/teams/members/edit.html.haml
Normal file
18
app/views/teams/members/edit.html.haml
Normal file
|
@ -0,0 +1,18 @@
|
|||
= render "teams/team_head"
|
||||
|
||||
%h3
|
||||
Edit access #{@member.name} in #{@team.name} team
|
||||
|
||||
%hr
|
||||
%table.zebra-striped
|
||||
%tr
|
||||
%td User:
|
||||
%td= @member.name
|
||||
%tr
|
||||
%td Team:
|
||||
%td= @team.name
|
||||
%tr
|
||||
%td Since:
|
||||
%td= member_since(@team, @member).stamp("Nov 11, 2010")
|
||||
|
||||
= render 'form'
|
19
app/views/teams/members/index.html.haml
Normal file
19
app/views/teams/members/index.html.haml
Normal file
|
@ -0,0 +1,19 @@
|
|||
= render "teams/team_head"
|
||||
|
||||
%h3.page_title
|
||||
Team Members
|
||||
(#{@members.count})
|
||||
%small
|
||||
Read more about project permissions
|
||||
%strong= link_to "here", help_permissions_path, class: "vlink"
|
||||
|
||||
- if can? current_user, :manage_user_team, @team
|
||||
%span.right
|
||||
= link_to new_team_member_path(@team), class: "btn success small grouped", title: "New Team Member" do
|
||||
New Team Member
|
||||
%hr
|
||||
|
||||
|
||||
.clearfix
|
||||
%div.team-table
|
||||
= render partial: "teams/members/team", locals: {project: @team}
|
30
app/views/teams/members/new.html.haml
Normal file
30
app/views/teams/members/new.html.haml
Normal file
|
@ -0,0 +1,30 @@
|
|||
= render "teams/team_head"
|
||||
|
||||
%h3.page_title
|
||||
Team: #{@team.name}
|
||||
|
||||
%fieldset
|
||||
%legend Members (#{@team.members.count})
|
||||
= form_tag team_members_path(@team), id: "team_members", class: "bulk_import", method: :post do
|
||||
%table#members_list
|
||||
%thead
|
||||
%tr
|
||||
%th User name
|
||||
%th Default project access
|
||||
%th Team access
|
||||
%th
|
||||
- @team.members.each do |member|
|
||||
%tr.member
|
||||
%td
|
||||
= member.name
|
||||
%small= "(#{member.email})"
|
||||
%td= @team.human_default_projects_access(member)
|
||||
%td= @team.admin?(member) ? "Admin" : "Member"
|
||||
%td
|
||||
%tr
|
||||
%td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_email), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5'
|
||||
%td= select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }
|
||||
%td
|
||||
%span= check_box_tag :group_admin
|
||||
%span Admin?
|
||||
%td= submit_tag 'Add', class: "btn primary", id: :add_members_to_team
|
62
app/views/teams/members/show.html.haml
Normal file
62
app/views/teams/members/show.html.haml
Normal file
|
@ -0,0 +1,62 @@
|
|||
= render "teams/team_head"
|
||||
|
||||
- allow_admin = can? current_user, :admin_project, @project
|
||||
- user = @team_member.user
|
||||
|
||||
.team_member_show
|
||||
- if can? current_user, :admin_project, @project
|
||||
= link_to 'Remove from team', project_team_member_path(project_id: @project, id: @team_member.id), confirm: 'Are you sure?', method: :delete, class: "right btn danger"
|
||||
.profile_avatar_holder
|
||||
= image_tag gravatar_icon(user.email, 60), class: "borders"
|
||||
%h3.page_title
|
||||
= user.name
|
||||
%small (@#{user.username})
|
||||
|
||||
%hr
|
||||
.back_link
|
||||
%br
|
||||
= link_to project_team_index_path(@project), class: "" do
|
||||
← To team list
|
||||
%br
|
||||
.row
|
||||
.span6
|
||||
%table.lite
|
||||
%tr
|
||||
%td Email
|
||||
%td= mail_to user.email
|
||||
%tr
|
||||
%td Skype
|
||||
%td= user.skype
|
||||
- unless user.linkedin.blank?
|
||||
%tr
|
||||
%td LinkedIn
|
||||
%td= user.linkedin
|
||||
- unless user.twitter.blank?
|
||||
%tr
|
||||
%td Twitter
|
||||
%td= user.twitter
|
||||
- unless user.bio.blank?
|
||||
%tr
|
||||
%td Bio
|
||||
%td= user.bio
|
||||
.span6
|
||||
%table.lite
|
||||
%tr
|
||||
%td Member since
|
||||
%td= @team_member.created_at.stamp("Aug 21, 2011")
|
||||
%tr
|
||||
%td
|
||||
Project Access:
|
||||
%small (#{link_to "read more", help_permissions_path, class: "vlink"})
|
||||
%td
|
||||
= form_for(@team_member, as: :team_member, url: project_team_member_path(@project, @team_member)) do |f|
|
||||
= f.select :project_access, options_for_select(Project.access_options, @team_member.project_access), {}, class: "project-access-select", disabled: !allow_admin
|
||||
%hr
|
||||
= render @events
|
||||
:javascript
|
||||
$(function(){
|
||||
$('.repo-access-select, .project-access-select').live("change", function() {
|
||||
$(this.form).submit();
|
||||
});
|
||||
})
|
||||
|
26
app/views/teams/merge_requests.html.haml
Normal file
26
app/views/teams/merge_requests.html.haml
Normal file
|
@ -0,0 +1,26 @@
|
|||
= render "team_head"
|
||||
|
||||
%h3.page_title
|
||||
Merge Requests
|
||||
%small (authored by or assigned to Team members)
|
||||
%small.right #{@merge_requests.total_count} merge requests
|
||||
|
||||
%hr
|
||||
.row
|
||||
.span3
|
||||
= render 'filter', entity: 'merge_request'
|
||||
.span9
|
||||
- if @merge_requests.any?
|
||||
- @merge_requests.group_by(&:project).each do |group|
|
||||
.ui-box
|
||||
- @project = group[0]
|
||||
%h5.title
|
||||
= link_to_project @project
|
||||
%ul.well-list
|
||||
- group[1].each do |merge_request|
|
||||
= render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request})
|
||||
%hr
|
||||
= paginate @merge_requests, theme: "gitlab"
|
||||
|
||||
- else
|
||||
%h3.nothing_here_message Nothing to show here
|
19
app/views/teams/new.html.haml
Normal file
19
app/views/teams/new.html.haml
Normal file
|
@ -0,0 +1,19 @@
|
|||
%h3.page_title New Team
|
||||
%hr
|
||||
= form_for @team, url: teams_path do |f|
|
||||
- if @team.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%span= @team.errors.full_messages.first
|
||||
.clearfix
|
||||
= f.label :name do
|
||||
Team name is
|
||||
.input
|
||||
= f.text_field :name, placeholder: "Ex. Ruby Developers", class: "xxlarge left"
|
||||
|
||||
= f.submit 'Create team', class: "btn primary"
|
||||
%hr
|
||||
.padded
|
||||
%ul
|
||||
%li All created teams are public (users can view who enter into team and which project are assigned for this team)
|
||||
%li People within a team see only projects they have access to
|
||||
%li You will be able to assign existing projects for team
|
16
app/views/teams/projects/_form.html.haml
Normal file
16
app/views/teams/projects/_form.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
= form_tag team_project_path(@team, @project), method: :put do
|
||||
-if @project.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%ul
|
||||
- @project.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.clearfix
|
||||
%label Max access for Team members:
|
||||
.input
|
||||
= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles, @team.max_project_access(@project)), class: "project-access-select chosen span3"
|
||||
|
||||
%br
|
||||
.actions
|
||||
= submit_tag 'Save', class: "btn primary"
|
||||
= link_to 'Cancel', :back, class: "btn"
|
18
app/views/teams/projects/edit.html.haml
Normal file
18
app/views/teams/projects/edit.html.haml
Normal file
|
@ -0,0 +1,18 @@
|
|||
= render "teams/team_head"
|
||||
|
||||
%h3
|
||||
Edit max access in #{@project.name} for #{@team.name} team
|
||||
|
||||
%hr
|
||||
%table.zebra-striped
|
||||
%tr
|
||||
%td Project:
|
||||
%td= @project.name
|
||||
%tr
|
||||
%td Team:
|
||||
%td= @team.name
|
||||
%tr
|
||||
%td Since:
|
||||
%td= assigned_since(@team, @project).stamp("Nov 11, 2010")
|
||||
|
||||
= render 'form'
|
34
app/views/teams/projects/index.html.haml
Normal file
34
app/views/teams/projects/index.html.haml
Normal file
|
@ -0,0 +1,34 @@
|
|||
= render "teams/team_head"
|
||||
|
||||
%h3.page_title
|
||||
Assigned projects (#{@team.projects.count})
|
||||
%small
|
||||
Read more about project permissions
|
||||
%strong= link_to "here", help_permissions_path, class: "vlink"
|
||||
|
||||
- if current_user.can?(:manage_user_team, @team) && @avaliable_projects.any?
|
||||
%span.right
|
||||
= link_to new_team_project_path(@team), class: "btn success small grouped", title: "New Team Member" do
|
||||
Assign project to Team
|
||||
|
||||
%hr
|
||||
|
||||
%table.projects-table
|
||||
%thead
|
||||
%tr
|
||||
%th Project name
|
||||
%th Max access
|
||||
- if current_user.can?(:admin_user_team, @team)
|
||||
%th.span3
|
||||
|
||||
- @team.projects.each do |project|
|
||||
%tr.project
|
||||
%td
|
||||
= link_to project.name_with_namespace, project_path(project)
|
||||
%td
|
||||
%span= @team.human_max_project_access(project)
|
||||
|
||||
- if current_user.can?(:admin_user_team, @team)
|
||||
%td.bgred
|
||||
= link_to 'Edit max access', edit_team_project_path(@team, project), class: "btn small"
|
||||
= link_to 'Relegate', team_project_path(@team, project), confirm: 'Remove project from team and move to global namespace. Are you sure?', method: :delete, class: "btn danger small"
|
25
app/views/teams/projects/new.html.haml
Normal file
25
app/views/teams/projects/new.html.haml
Normal file
|
@ -0,0 +1,25 @@
|
|||
= render "teams/team_head"
|
||||
|
||||
%h3.page_title
|
||||
Team: #{@team.name}
|
||||
|
||||
%fieldset
|
||||
%legend Projects (#{@team.projects.count})
|
||||
= form_tag team_projects_path(@team), id: "assign_projects", class: "bulk_import", method: :post do
|
||||
%table#projects_list
|
||||
%thead
|
||||
%tr
|
||||
%th Project name
|
||||
%th Max access
|
||||
%th
|
||||
- @team.projects.each do |project|
|
||||
%tr.project
|
||||
%td
|
||||
= link_to project.name_with_namespace, team_project_path(@team, project)
|
||||
%td
|
||||
%span= @team.human_max_project_access(project)
|
||||
%td
|
||||
%tr
|
||||
%td= select_tag :project_ids, options_from_collection_for_select(@avaliable_projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
|
||||
%td= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen span3" }
|
||||
%td= submit_tag 'Add', class: "btn primary", id: :assign_projects_to_team
|
11
app/views/teams/search.html.haml
Normal file
11
app/views/teams/search.html.haml
Normal file
|
@ -0,0 +1,11 @@
|
|||
= render "team_head"
|
||||
|
||||
= form_tag search_team_path(@team), method: :get, class: 'form-inline' do |f|
|
||||
.padded
|
||||
= label_tag :search do
|
||||
%strong Looking for
|
||||
.input
|
||||
= search_field_tag :search, params[:search], placeholder: "issue 143", class: "input-xxlarge search-text-input", id: "dashboard_search"
|
||||
= submit_tag 'Search', class: "btn primary wide"
|
||||
- if params[:search].present?
|
||||
= render 'search/result'
|
30
app/views/teams/show.html.haml
Normal file
30
app/views/teams/show.html.haml
Normal file
|
@ -0,0 +1,30 @@
|
|||
= render "team_head"
|
||||
|
||||
.projects
|
||||
.activities.span8
|
||||
= link_to dashboard_path, class: 'btn very_small' do
|
||||
← To dashboard
|
||||
|
||||
%span.cgray Events and projects are filtered in scope of team
|
||||
%hr
|
||||
- if @events.any?
|
||||
.content_list
|
||||
- else
|
||||
%p.nothing_here_message Projects activity will be displayed here
|
||||
.loading.hide
|
||||
.side.span4
|
||||
= render "projects", projects: @projects
|
||||
%div
|
||||
%span.rss-icon
|
||||
= link_to dashboard_path(:atom, { private_token: current_user.private_token }) do
|
||||
= image_tag "rss_ui.png", title: "feed"
|
||||
%strong News Feed
|
||||
|
||||
%hr
|
||||
.gitlab-promo
|
||||
= link_to "Homepage", "http://gitlabhq.com"
|
||||
= link_to "Blog", "http://blog.gitlabhq.com"
|
||||
= link_to "@gitlabhq", "https://twitter.com/gitlabhq"
|
||||
|
||||
:javascript
|
||||
$(function(){ Pager.init(20, true); });
|
Loading…
Add table
Add a link
Reference in a new issue