Skip to content
Snippets Groups Projects
Commit ea99abb1 authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent a9104a50
No related branches found
No related tags found
No related merge requests found
Showing
with 112 additions and 32 deletions
Loading
Loading
@@ -161,6 +161,14 @@ export default {
<div>
<div class="d-flex board-card-header" dir="auto">
<h4 class="board-card-title append-bottom-0 prepend-top-0">
<icon
v-if="issue.blocked"
v-gl-tooltip
name="issue-block"
:title="__('Blocked issue')"
class="issue-blocked-icon append-right-4"
:aria-label="__('Blocked issue')"
/>
<icon
v-if="issue.confidential"
v-gl-tooltip
Loading
Loading
Loading
Loading
@@ -37,6 +37,7 @@ class ListIssue {
this.project_id = obj.project_id;
this.timeEstimate = obj.time_estimate;
this.assignableLabelsEndpoint = obj.assignable_labels_endpoint;
this.blocked = obj.blocked;
 
if (obj.project) {
this.project = new IssueProject(obj.project);
Loading
Loading
Loading
Loading
@@ -19,6 +19,7 @@ const httpStatusCodes = {
UNAUTHORIZED: 401,
FORBIDDEN: 403,
NOT_FOUND: 404,
CONFLICT: 409,
GONE: 410,
UNPROCESSABLE_ENTITY: 422,
SERVICE_UNAVAILABLE: 503,
Loading
Loading
Loading
Loading
@@ -287,6 +287,10 @@
cursor: help;
}
 
.issue-blocked-icon {
color: $red-500;
}
@include media-breakpoint-down(md) {
padding: $gl-padding-8;
}
Loading
Loading
Loading
Loading
@@ -4,6 +4,7 @@ class Groups::BoardsController < Groups::ApplicationController
include BoardsActions
include RecordUserLastActivity
 
before_action :authorize_read_board!, only: [:index, :show]
before_action :assign_endpoint_vars
before_action do
push_frontend_feature_flag(:multi_select_board, default_enabled: true)
Loading
Loading
@@ -16,4 +17,8 @@ class Groups::BoardsController < Groups::ApplicationController
@namespace_path = group.to_param
@labels_endpoint = group_labels_url(group)
end
def authorize_read_board!
access_denied! unless can?(current_user, :read_board, group)
end
end
Loading
Loading
@@ -67,6 +67,7 @@ class GroupPolicy < BasePolicy
enable :read_milestone
enable :read_list
enable :read_label
enable :read_board
end
 
rule { has_access }.enable :read_namespace
Loading
Loading
Loading
Loading
@@ -30,7 +30,7 @@ module Ci
end
 
downstream_pipeline.tap do |pipeline|
@bridge.drop!(:downstream_pipeline_creation_failed) if pipeline.has_yaml_errors?
@bridge.drop!(:downstream_pipeline_creation_failed) if pipeline.errors.any?
end
end
 
Loading
Loading
---
title: Add blocked icon on issue board card
merge_request: 24420
author:
type: added
---
title: Improve error messages when adding a child epic
merge_request: 22688
author:
type: fixed
---
title: Drop bridge on any downstream pipeline errors
merge_request: 24735
author:
type: fixed
Loading
Loading
@@ -32,9 +32,10 @@ bundle exec rake gitlab:import_export:data RAILS_ENV=production
 
Note the following:
 
- Importing is not possible if the version of the import instance is older than that of the exporter.
- The project import option must be enabled in application settings
(`/admin/application_settings/general`) under **Import sources**, which is available
- Importing is only possible if the version of the import and export GitLab instances are
compatible as described in the [Version history](../../user/project/settings/import_export.md#version-history).
- The project import option must be enabled in
application settings (`/admin/application_settings/general`) under **Import sources**, which is available
under **{admin}** **Admin Area >** **{settings}** **Settings > Visibility and access controls**.
- The exports are stored in a temporary [shared directory](../../development/shared_files.md)
and are deleted every 24 hours by a specific worker.
Loading
Loading
@@ -1986,7 +1986,20 @@ type Epic implements Noteable {
"""
last: Int
): UserConnection
reference(full: Boolean = false): String!
"""
Internal reference of the epic. Returned in shortened format by default
"""
reference(
"""
Indicates if the reference should be returned in full
"""
full: Boolean = false
): String!
"""
URI path of the epic-issue relationship
"""
relationPath: String
 
"""
Loading
Loading
@@ -2043,7 +2056,15 @@ type Epic implements Noteable {
Permissions for the current user on the resource
"""
userPermissions: EpicPermissions!
"""
Web path of the epic
"""
webPath: String!
"""
Web URL of the epic
"""
webUrl: String!
}
 
Loading
Loading
Loading
Loading
@@ -5013,11 +5013,11 @@
},
{
"name": "reference",
"description": null,
"description": "Internal reference of the epic. Returned in shortened format by default",
"args": [
{
"name": "full",
"description": null,
"description": "Indicates if the reference should be returned in full",
"type": {
"kind": "SCALAR",
"name": "Boolean",
Loading
Loading
@@ -5040,7 +5040,7 @@
},
{
"name": "relationPath",
"description": null,
"description": "URI path of the epic-issue relationship",
"args": [
 
],
Loading
Loading
@@ -5224,7 +5224,7 @@
},
{
"name": "webPath",
"description": null,
"description": "Web path of the epic",
"args": [
 
],
Loading
Loading
@@ -5242,7 +5242,7 @@
},
{
"name": "webUrl",
"description": null,
"description": "Web URL of the epic",
"args": [
 
],
Loading
Loading
Loading
Loading
@@ -295,8 +295,8 @@ Represents an epic.
| `id` | ID! | ID of the epic |
| `iid` | ID! | Internal ID of the epic |
| `parent` | Epic | Parent epic of the epic |
| `reference` | String! | |
| `relationPath` | String | |
| `reference` | String! | Internal reference of the epic. Returned in shortened format by default |
| `relationPath` | String | URI path of the epic-issue relationship |
| `relativePosition` | Int | The relative position of the epic in the epic tree |
| `startDate` | Time | Start date of the epic |
| `startDateFixed` | Time | Fixed start date of the epic |
Loading
Loading
@@ -308,8 +308,8 @@ Represents an epic.
| `updatedAt` | Time | Timestamp of the epic's last activity |
| `upvotes` | Int! | Number of upvotes the epic has received |
| `userPermissions` | EpicPermissions! | Permissions for the current user on the resource |
| `webPath` | String! | |
| `webUrl` | String! | |
| `webPath` | String! | Web path of the epic |
| `webUrl` | String! | Web URL of the epic |
 
## EpicDescendantCount
 
Loading
Loading
doc/user/project/img/issue_boards_blocked_icon_v12_8.png

64.8 KiB

Loading
Loading
@@ -303,6 +303,14 @@ Different issue board features are available in different [GitLab tiers](https:/
| Premium / Silver | Multiple | Multiple | Yes | Yes |
| Ultimate / Gold | Multiple | Multiple | Yes | Yes |
 
## Blocked issues
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/34723) in GitLab 12.8.
If an issue is blocked by another issue, an icon will display next to its title to differentiate it from unblocked issues.
![Blocked issues](img/issue_boards_blocked_icon_v12_8.png)
## Actions you can take on an Issue Board
 
- [Create a new list](#creating-a-new-list).
Loading
Loading
Loading
Loading
@@ -6,28 +6,30 @@
Existing projects running on any GitLab instance or GitLab.com can be exported with all their related
data and be moved into a new GitLab instance.
 
The **GitLab import/export** button is displayed if the project import option is enabled.
See also:
 
- [Project import/export API](../../../api/project_import_export.md).
- [Project import/export administration rake tasks](../../../administration/raketasks/project_import_export.md). **(CORE ONLY)**
- [Project import/export API](../../../api/project_import_export.md)
- [Project import/export administration rake tasks](../../../administration/raketasks/project_import_export.md) **(CORE ONLY)**
To set up a project import/export:
1. Navigate to **{admin}** **Admin Area >** **{settings}** **Settings > Visibility and access controls**.
1. Scroll to **Import sources**
1. Enable desired **Import sources**
 
## Important notes
 
Note the following:
 
- Importing is not possible if the import instance version differs from
that of the exporter.
- The project import option must be enabled in application settings
(`/admin/application_settings/general`) under **Import sources**, which is
available under **{admin}** **Admin Area >** **{settings}** **Settings > Visibility and access controls**.
Ask your administrator if you don't see the **GitLab export** button when
creating a new project.
- The exports are stored in a temporary [shared directory](../../../development/shared_files.md)
- Imports will fail unless the import and export GitLab instances are
compatible as described in the [Version history](#version-history).
- Exports are stored in a temporary [shared directory](../../../development/shared_files.md)
and are deleted every 24 hours by a specific worker.
- Group members are exported as project members, as long as the user has
maintainer or admin access to the group where the exported project lives. An admin
in the import side is required to map the users, based on email.
Otherwise, a supplementary comment is left to mention the original author and
maintainer or admin access to the group where the exported project lives. Import admins should map users by email address.
Otherwise, a supplementary comment is left to mention that the original author and
the MRs, notes, or issues will be owned by the importer.
- Project members with owner access will be imported as maintainers.
- If an imported project contains merge requests originating from forks,
Loading
Loading
@@ -39,7 +41,7 @@ Note the following:
 
The following table lists updates to Import/Export:
 
| GitLab version | Import/Export version |
| GitLab version | Import/Export schema version |
| ---------------- | --------------------- |
| 11.1 to current | 0.2.4 |
| 10.8 | 0.2.3 |
Loading
Loading
@@ -56,7 +58,9 @@ The following table lists updates to Import/Export:
| 8.9.5 | 0.1.1 |
| 8.9.0 | 0.1.0 |
 
For example, 8.10.3 and 8.11 will have the same Import/Export version (0.1.3)
Projects can be exported and imported only between versions of GitLab with matching Import/Export versions.
For example, 8.10.3 and 8.11 have the same Import/Export version (0.1.3)
and the exports between them will be compatible.
 
## Exported contents
Loading
Loading
Loading
Loading
@@ -28,6 +28,7 @@ module API
success ::API::Entities::Board
end
get '/:board_id' do
authorize!(:read_board, user_group)
present board, with: ::API::Entities::Board
end
 
Loading
Loading
@@ -39,6 +40,7 @@ module API
use :pagination
end
get '/' do
authorize!(:read_board, user_group)
present paginate(board_parent.boards.with_associations), with: Entities::Board
end
end
Loading
Loading
@@ -55,6 +57,7 @@ module API
use :pagination
end
get '/lists' do
authorize!(:read_board, user_group)
present paginate(board_lists), with: Entities::List
end
 
Loading
Loading
@@ -66,6 +69,7 @@ module API
requires :list_id, type: Integer, desc: 'The ID of a list'
end
get '/lists/:list_id' do
authorize!(:read_board, user_group)
present board_lists.find(params[:list_id]), with: Entities::List
end
 
Loading
Loading
Loading
Loading
@@ -2768,6 +2768,9 @@ msgstr ""
msgid "Blocked"
msgstr ""
 
msgid "Blocked issue"
msgstr ""
msgid "Blocks"
msgstr ""
 
Loading
Loading
Loading
Loading
@@ -27,7 +27,8 @@ describe Groups::BoardsController do
context 'with unauthorized user' do
before do
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_board, group).and_return(false)
end
 
it 'returns a not found 404 response' do
Loading
Loading
@@ -70,7 +71,8 @@ describe Groups::BoardsController do
context 'with unauthorized user' do
before do
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_board, group).and_return(false)
end
 
it 'returns a not found 404 response' do
Loading
Loading
@@ -105,7 +107,8 @@ describe Groups::BoardsController do
context 'with unauthorized user' do
before do
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_board, group).and_return(false)
end
 
it 'returns a not found 404 response' do
Loading
Loading
@@ -142,6 +145,7 @@ describe Groups::BoardsController do
context 'with unauthorized user' do
before do
allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(true)
allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false)
end
 
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment