...@@ -133,7 +133,7 @@ export default { ...@@ -133,7 +133,7 @@ export default {
if (this.board.name.length === 0) return; if (this.board.name.length === 0) return;
this.isLoading = true; this.isLoading = true;
if (this.isDeleteForm) { if (this.isDeleteForm) {
gl.boardService boardsStore
.deleteBoard(this.currentBoard) .deleteBoard(this.currentBoard)
.then(() => { .then(() => {
visitUrl(boardsStore.rootPath); visitUrl(boardsStore.rootPath);
...@@ -143,7 +143,7 @@ export default { ...@@ -143,7 +143,7 @@ export default {
this.isLoading = false; this.isLoading = false;
}); });
} else { } else {
gl.boardService boardsStore
.createBoard(this.board) .createBoard(this.board)
.then(resp => resp.data) .then(resp => resp.data)
.then(data => { .then(data => {
... ...
......
...@@ -290,5 +290,5 @@ export default function dropzoneInput(form) { ...@@ -290,5 +290,5 @@ export default function dropzoneInput(form) {
formTextarea.focus(); formTextarea.focus();
}); });
return Dropzone.forElement($formDropzone.get(0)); return $formDropzone.get(0) ? Dropzone.forElement($formDropzone.get(0)) : null;
} }
/* eslint-disable func-names, no-var, no-underscore-dangle, one-var, consistent-return */ /* eslint-disable func-names, no-underscore-dangle, consistent-return */
import $ from 'jquery'; import $ from 'jquery';
import { __ } from '~/locale'; import { __ } from '~/locale';
...@@ -64,12 +64,10 @@ MergeRequest.prototype.showAllCommits = function() { ...@@ -64,12 +64,10 @@ MergeRequest.prototype.showAllCommits = function() {
}; };
MergeRequest.prototype.initMRBtnListeners = function() { MergeRequest.prototype.initMRBtnListeners = function() {
var _this; const _this = this;
_this = this;
return $('a.btn-close, a.btn-reopen').on('click', function(e) { return $('a.btn-close, a.btn-reopen').on('click', function(e) {
var $this, shouldSubmit; const $this = $(this);
$this = $(this); const shouldSubmit = $this.hasClass('btn-comment');
shouldSubmit = $this.hasClass('btn-comment');
if (shouldSubmit && $this.data('submitted')) { if (shouldSubmit && $this.data('submitted')) {
return; return;
} }
...@@ -88,8 +86,7 @@ MergeRequest.prototype.initMRBtnListeners = function() { ...@@ -88,8 +86,7 @@ MergeRequest.prototype.initMRBtnListeners = function() {
}; };
MergeRequest.prototype.submitNoteForm = function(form, $button) { MergeRequest.prototype.submitNoteForm = function(form, $button) {
var noteText; const noteText = form.find('textarea.js-note-text').val();
noteText = form.find('textarea.js-note-text').val();
if (noteText.trim().length > 0) { if (noteText.trim().length > 0) {
form.submit(); form.submit();
$button.data('submitted', true); $button.data('submitted', true);
...@@ -99,7 +96,7 @@ MergeRequest.prototype.submitNoteForm = function(form, $button) { ...@@ -99,7 +96,7 @@ MergeRequest.prototype.submitNoteForm = function(form, $button) {
MergeRequest.prototype.initCommitMessageListeners = function() { MergeRequest.prototype.initCommitMessageListeners = function() {
$(document).on('click', 'a.js-with-description-link', e => { $(document).on('click', 'a.js-with-description-link', e => {
var textarea = $('textarea.js-commit-message'); const textarea = $('textarea.js-commit-message');
e.preventDefault(); e.preventDefault();
textarea.val(textarea.data('messageWithDescription')); textarea.val(textarea.data('messageWithDescription'));
...@@ -108,7 +105,7 @@ MergeRequest.prototype.initCommitMessageListeners = function() { ...@@ -108,7 +105,7 @@ MergeRequest.prototype.initCommitMessageListeners = function() {
}); });
$(document).on('click', 'a.js-without-description-link', e => { $(document).on('click', 'a.js-without-description-link', e => {
var textarea = $('textarea.js-commit-message'); const textarea = $('textarea.js-commit-message');
e.preventDefault(); e.preventDefault();
textarea.val(textarea.data('messageWithoutDescription')); textarea.val(textarea.data('messageWithoutDescription'));
... ...
......
/* eslint-disable func-names, no-var, one-var, consistent-return, camelcase */ /* eslint-disable func-names, consistent-return, camelcase */
import $ from 'jquery'; import $ from 'jquery';
import { __ } from '../locale'; import { __ } from '../locale';
...@@ -40,18 +40,20 @@ export default class BranchGraph { ...@@ -40,18 +40,20 @@ export default class BranchGraph {
} }
prepareData(days, commits) { prepareData(days, commits) {
var c, ch, cw, j, len, ref; let c = 0;
let j = 0;
let len = 0;
this.days = days; this.days = days;
this.commits = commits; this.commits = commits;
this.collectParents(); this.collectParents();
this.graphHeight = $(this.element).height(); this.graphHeight = $(this.element).height();
this.graphWidth = $(this.element).width(); this.graphWidth = $(this.element).width();
ch = Math.max(this.graphHeight, this.offsetY + this.unitTime * this.mtime + 150); const ch = Math.max(this.graphHeight, this.offsetY + this.unitTime * this.mtime + 150);
cw = Math.max(this.graphWidth, this.offsetX + this.unitSpace * this.mspace + 300); const cw = Math.max(this.graphWidth, this.offsetX + this.unitSpace * this.mspace + 300);
this.r = Raphael(this.element.get(0), cw, ch); this.r = Raphael(this.element.get(0), cw, ch);
this.top = this.r.set(); this.top = this.r.set();
this.barHeight = Math.max(this.graphHeight, this.unitTime * this.days.length + 320); this.barHeight = Math.max(this.graphHeight, this.unitTime * this.days.length + 320);
ref = this.commits; const ref = this.commits;
for (j = 0, len = ref.length; j < len; j += 1) { for (j = 0, len = ref.length; j < len; j += 1) {
c = ref[j]; c = ref[j];
if (c.id in this.parents) { if (c.id in this.parents) {
...@@ -64,18 +66,20 @@ export default class BranchGraph { ...@@ -64,18 +66,20 @@ export default class BranchGraph {
} }
collectParents() { collectParents() {
var c, j, len, p, ref, results; let j = 0;
var l, len1, ref1, results1; let l = 0;
ref = this.commits; let len = 0;
results = []; let len1 = 0;
const ref = this.commits;
const results = [];
for (j = 0, len = ref.length; j < len; j += 1) { for (j = 0, len = ref.length; j < len; j += 1) {
c = ref[j]; const c = ref[j];
this.mtime = Math.max(this.mtime, c.time); this.mtime = Math.max(this.mtime, c.time);
this.mspace = Math.max(this.mspace, c.space); this.mspace = Math.max(this.mspace, c.space);
ref1 = c.parents; const ref1 = c.parents;
results1 = []; const results1 = [];
for (l = 0, len1 = ref1.length; l < len1; l += 1) { for (l = 0, len1 = ref1.length; l < len1; l += 1) {
p = ref1[l]; const p = ref1[l];
this.parents[p[0]] = true; this.parents[p[0]] = true;
results1.push((this.mspace = Math.max(this.mspace, p[1]))); results1.push((this.mspace = Math.max(this.mspace, p[1])));
} }
...@@ -85,9 +89,8 @@ export default class BranchGraph { ...@@ -85,9 +89,8 @@ export default class BranchGraph {
} }
collectColors() { collectColors() {
var k, results; let k = 0;
k = 0; const results = [];
results = [];
while (k < this.mspace) { while (k < this.mspace) {
this.colors.push(Raphael.getColor(0.8)); this.colors.push(Raphael.getColor(0.8));
// Skipping a few colors in the spectrum to get more contrast between colors // Skipping a few colors in the spectrum to get more contrast between colors
...@@ -99,20 +102,21 @@ export default class BranchGraph { ...@@ -99,20 +102,21 @@ export default class BranchGraph {
} }
buildGraph() { buildGraph() {
var cuday, cumonth, day, len, mm, ref; let mm = 0;
let len = 0;
let cuday = 0;
let cumonth = '';
const { r } = this; const { r } = this;
cuday = 0;
cumonth = '';
r.rect(0, 0, 40, this.barHeight).attr({ r.rect(0, 0, 40, this.barHeight).attr({
fill: '#222', fill: '#222',
}); });
r.rect(40, 0, 30, this.barHeight).attr({ r.rect(40, 0, 30, this.barHeight).attr({
fill: '#444', fill: '#444',
}); });
ref = this.days; const ref = this.days;
for (mm = 0, len = ref.length; mm < len; mm += 1) { for (mm = 0, len = ref.length; mm < len; mm += 1) {
day = ref[mm]; const day = ref[mm];
if (cuday !== day[0] || cumonth !== day[1]) { if (cuday !== day[0] || cumonth !== day[1]) {
// Dates // Dates
r.text(55, this.offsetY + this.unitTime * mm, day[0]).attr({ r.text(55, this.offsetY + this.unitTime * mm, day[0]).attr({
...@@ -137,26 +141,25 @@ export default class BranchGraph { ...@@ -137,26 +141,25 @@ export default class BranchGraph {
} }
renderPartialGraph() { renderPartialGraph() {
var commit, end, i, isGraphEdge, start, x, y; const isGraphEdge = true;
start = Math.floor((this.element.scrollTop() - this.offsetY) / this.unitTime) - 10; let i = 0;
let start = Math.floor((this.element.scrollTop() - this.offsetY) / this.unitTime) - 10;
if (start < 0) { if (start < 0) {
isGraphEdge = true;
start = 0; start = 0;
} }
end = start + 40; let end = start + 40;
if (this.commits.length < end) { if (this.commits.length < end) {
isGraphEdge = true;
end = this.commits.length; end = this.commits.length;
} }
if (this.prev_start === -1 || Math.abs(this.prev_start - start) > 10 || isGraphEdge) { if (this.prev_start === -1 || Math.abs(this.prev_start - start) > 10 || isGraphEdge) {
i = start; i = start;
this.prev_start = start; this.prev_start = start;
while (i < end) { while (i < end) {
commit = this.commits[i]; const commit = this.commits[i];
i += 1; i += 1;
if (commit.hasDrawn !== true) { if (commit.hasDrawn !== true) {
x = this.offsetX + this.unitSpace * (this.mspace - commit.space); const x = this.offsetX + this.unitSpace * (this.mspace - commit.space);
y = this.offsetY + this.unitTime * commit.time; const y = this.offsetY + this.unitTime * commit.time;
this.drawDot(x, y, commit); this.drawDot(x, y, commit);
this.drawLines(x, y, commit); this.drawLines(x, y, commit);
this.appendLabel(x, y, commit); this.appendLabel(x, y, commit);
...@@ -203,27 +206,25 @@ export default class BranchGraph { ...@@ -203,27 +206,25 @@ export default class BranchGraph {
} }
appendLabel(x, y, commit) { appendLabel(x, y, commit) {
var label, rect, shortrefs, text, textbox;
if (!commit.refs) { if (!commit.refs) {
return; return;
} }
const { r } = this; const { r } = this;
shortrefs = commit.refs; let shortrefs = commit.refs;
// Truncate if longer than 15 chars // Truncate if longer than 15 chars
if (shortrefs.length > 17) { if (shortrefs.length > 17) {
shortrefs = `${shortrefs.substr(0, 15)}…`; shortrefs = `${shortrefs.substr(0, 15)}…`;
} }
text = r.text(x + 4, y, shortrefs).attr({ const text = r.text(x + 4, y, shortrefs).attr({
'text-anchor': 'start', 'text-anchor': 'start',
font: '10px Monaco, monospace', font: '10px Monaco, monospace',
fill: '#FFF', fill: '#FFF',
title: commit.refs, title: commit.refs,
}); });
textbox = text.getBBox(); const textbox = text.getBBox();
// Create rectangle based on the size of the textbox // Create rectangle based on the size of the textbox
rect = r.rect(x, y - 7, textbox.width + 5, textbox.height + 5, 4).attr({ const rect = r.rect(x, y - 7, textbox.width + 5, textbox.height + 5, 4).attr({
fill: '#000', fill: '#000',
'fill-opacity': 0.5, 'fill-opacity': 0.5,
stroke: 'none', stroke: 'none',
...@@ -234,7 +235,7 @@ export default class BranchGraph { ...@@ -234,7 +235,7 @@ export default class BranchGraph {
'fill-opacity': 0.5, 'fill-opacity': 0.5,
stroke: 'none', stroke: 'none',
}); });
label = r.set(rect, text); const label = r.set(rect, text);
label.transform(['t', -rect.getBBox().width - 15, 0]); label.transform(['t', -rect.getBBox().width - 15, 0]);
// Set text to front // Set text to front
return text.toFront(); return text.toFront();
...@@ -286,17 +287,21 @@ export default class BranchGraph { ...@@ -286,17 +287,21 @@ export default class BranchGraph {
} }
drawLines(x, y, commit) { drawLines(x, y, commit) {
var arrow, color, i, len, offset, parent, parentCommit, parentX1, parentX2, parentY, route; let i = 0;
let len = 0;
let arrow = '';
let offset = [];
let color = [];
const { r } = this; const { r } = this;
const ref = commit.parents; const ref = commit.parents;
const results = []; const results = [];
for (i = 0, len = ref.length; i < len; i += 1) { for (i = 0, len = ref.length; i < len; i += 1) {
parent = ref[i]; const parent = ref[i];
parentCommit = this.preparedCommits[parent[0]]; const parentCommit = this.preparedCommits[parent[0]];
parentY = this.offsetY + this.unitTime * parentCommit.time; const parentY = this.offsetY + this.unitTime * parentCommit.time;
parentX1 = this.offsetX + this.unitSpace * (this.mspace - parentCommit.space); const parentX1 = this.offsetX + this.unitSpace * (this.mspace - parentCommit.space);
parentX2 = this.offsetX + this.unitSpace * (this.mspace - parent[1]); const parentX2 = this.offsetX + this.unitSpace * (this.mspace - parent[1]);
// Set line color // Set line color
if (parentCommit.space <= commit.space) { if (parentCommit.space <= commit.space) {
color = this.colors[commit.space]; color = this.colors[commit.space];
...@@ -315,7 +320,7 @@ export default class BranchGraph { ...@@ -315,7 +320,7 @@ export default class BranchGraph {
arrow = 'l-5,0,2,4,3,-4,-4,2'; arrow = 'l-5,0,2,4,3,-4,-4,2';
} }
// Start point // Start point
route = ['M', x + offset[0], y + offset[1]]; const route = ['M', x + offset[0], y + offset[1]];
// Add arrow if not first parent // Add arrow if not first parent
if (i > 0) { if (i > 0) {
route.push(arrow); route.push(arrow);
... ...
......
/* eslint-disable no-return-assign, one-var, no-var, consistent-return, class-methods-use-this, vars-on-top */ /* eslint-disable no-return-assign, consistent-return, class-methods-use-this */
import $ from 'jquery'; import $ from 'jquery';
import { escape, throttle } from 'underscore'; import { escape, throttle } from 'underscore';
...@@ -29,14 +29,14 @@ const KEYCODE = { ...@@ -29,14 +29,14 @@ const KEYCODE = {
}; };
function setSearchOptions() { function setSearchOptions() {
var $projectOptionsDataEl = $('.js-search-project-options'); const $projectOptionsDataEl = $('.js-search-project-options');
var $groupOptionsDataEl = $('.js-search-group-options'); const $groupOptionsDataEl = $('.js-search-group-options');
var $dashboardOptionsDataEl = $('.js-search-dashboard-options'); const $dashboardOptionsDataEl = $('.js-search-dashboard-options');
if ($projectOptionsDataEl.length) { if ($projectOptionsDataEl.length) {
gl.projectOptions = gl.projectOptions || {}; gl.projectOptions = gl.projectOptions || {};
var projectPath = $projectOptionsDataEl.data('projectPath'); const projectPath = $projectOptionsDataEl.data('projectPath');
gl.projectOptions[projectPath] = { gl.projectOptions[projectPath] = {
name: $projectOptionsDataEl.data('name'), name: $projectOptionsDataEl.data('name'),
...@@ -49,7 +49,7 @@ function setSearchOptions() { ...@@ -49,7 +49,7 @@ function setSearchOptions() {
if ($groupOptionsDataEl.length) { if ($groupOptionsDataEl.length) {
gl.groupOptions = gl.groupOptions || {}; gl.groupOptions = gl.groupOptions || {};
var groupPath = $groupOptionsDataEl.data('groupPath'); const groupPath = $groupOptionsDataEl.data('groupPath');
gl.groupOptions[groupPath] = { gl.groupOptions[groupPath] = {
name: $groupOptionsDataEl.data('name'), name: $groupOptionsDataEl.data('name'),
...@@ -387,20 +387,18 @@ export class SearchAutocomplete { ...@@ -387,20 +387,18 @@ export class SearchAutocomplete {
} }
restoreOriginalState() { restoreOriginalState() {
var i, input, inputs, len; const inputs = Object.keys(this.originalState);
inputs = Object.keys(this.originalState); for (let i = 0, len = inputs.length; i < len; i += 1) {
for (i = 0, len = inputs.length; i < len; i += 1) { const input = inputs[i];
input = inputs[i];
this.getElement(`#${input}`).val(this.originalState[input]); this.getElement(`#${input}`).val(this.originalState[input]);
} }
} }
resetSearchState() { resetSearchState() {
var i, input, inputs, len, results; const inputs = Object.keys(this.originalState);
inputs = Object.keys(this.originalState); const results = [];
results = []; for (let i = 0, len = inputs.length; i < len; i += 1) {
for (i = 0, len = inputs.length; i < len; i += 1) { const input = inputs[i];
input = inputs[i];
results.push(this.getElement(`#${input}`).val('')); results.push(this.getElement(`#${input}`).val(''));
} }
return results; return results;
...@@ -415,8 +413,7 @@ export class SearchAutocomplete { ...@@ -415,8 +413,7 @@ export class SearchAutocomplete {
} }
restoreMenu() { restoreMenu() {
var html; const html = `<ul><li class="dropdown-menu-empty-item"><a>${__('Loading...')}</a></li></ul>`;
html = `<ul><li class="dropdown-menu-empty-item"><a>${__('Loading...')}</a></li></ul>`;
return this.dropdownContent.html(html); return this.dropdownContent.html(html);
} }
... ...
......
# frozen_string_literal: true
module Types
class ExtendedIssueType < IssueType
graphql_name 'ExtendedIssue'
authorize :read_issue
expose_permissions Types::PermissionTypes::Issue
present_using IssuePresenter
field :subscribed, GraphQL::BOOLEAN_TYPE, method: :subscribed?, null: false, complexity: 5,
description: 'Boolean flag for whether the currently logged in user is subscribed to this issue'
end
end
...@@ -68,6 +68,8 @@ module Types ...@@ -68,6 +68,8 @@ module Types
field :participants, Types::UserType.connection_type, null: true, complexity: 5, field :participants, Types::UserType.connection_type, null: true, complexity: 5,
description: 'List of participants in the issue' description: 'List of participants in the issue'
field :subscribed, GraphQL::BOOLEAN_TYPE, method: :subscribed?, null: false, complexity: 5,
description: 'Boolean flag for whether the currently logged in user is subscribed to this issue'
field :time_estimate, GraphQL::INT_TYPE, null: false, field :time_estimate, GraphQL::INT_TYPE, null: false,
description: 'Time estimate of the issue' description: 'Time estimate of the issue'
field :total_time_spent, GraphQL::INT_TYPE, null: false, field :total_time_spent, GraphQL::INT_TYPE, null: false,
... ...
......
...@@ -135,7 +135,7 @@ module Types ...@@ -135,7 +135,7 @@ module Types
resolver: Resolvers::IssuesResolver resolver: Resolvers::IssuesResolver
field :issue, field :issue,
Types::ExtendedIssueType, Types::IssueType,
null: true, null: true,
description: 'A single issue of the project', description: 'A single issue of the project',
resolver: Resolvers::IssuesResolver.single resolver: Resolvers::IssuesResolver.single
... ...
......
---
title: Expose subscribed field in issue lists queried with GraphQL
merge_request: 19458
author: briankabiro
type: changed
---
title: Use new trial registration URL in billing
merge_request: 19978
author:
type: fixed
---
title: Fixed the scale of embedded videos to fit the page
merge_request: 20056
author:
type: fixed
---
title: Remove all reference to BoardService in board_form.vue
merge_request: 20158
author: nuwe1
type: other
---
title: Prevent Dropzone.js initialisation error by checking target element existence
merge_request: 20256
author: Fabio Huser
type: fixed
...@@ -240,7 +240,7 @@ def lint_commit(commit) # rubocop:disable Metrics/AbcSize ...@@ -240,7 +240,7 @@ def lint_commit(commit) # rubocop:disable Metrics/AbcSize
fail_commit( fail_commit(
commit, commit,
'Use full URLs instead of short references ' \ 'Use full URLs instead of short references ' \
'(`gitlab-org/gitlab-ce#123` or `!123`), as short references are ' \ '(`gitlab-org/gitlab#123` or `!123`), as short references are ' \
'displayed as plain text outside of GitLab' 'displayed as plain text outside of GitLab'
) )
... ...
......
...@@ -1625,6 +1625,11 @@ type EpicIssue implements Noteable { ...@@ -1625,6 +1625,11 @@ type EpicIssue implements Noteable {
""" """
state: IssueState! state: IssueState!
"""
Boolean flag for whether the currently logged in user is subscribed to this issue
"""
subscribed: Boolean!
""" """
Task completion status of the issue Task completion status of the issue
""" """
...@@ -1908,276 +1913,6 @@ type EpicTreeReorderPayload { ...@@ -1908,276 +1913,6 @@ type EpicTreeReorderPayload {
errors: [String!]! errors: [String!]!
} }
type ExtendedIssue implements Noteable {
"""
Assignees of the issue
"""
assignees(
"""
Returns the elements in the list that come after the specified cursor.
"""
after: String
"""
Returns the elements in the list that come before the specified cursor.
"""
before: String
"""
Returns the first _n_ elements from the list.
"""
first: Int
"""
Returns the last _n_ elements from the list.
"""
last: Int
): UserConnection
"""
User that created the issue
"""
author: User!
"""
Timestamp of when the issue was closed
"""
closedAt: Time
"""
Indicates the issue is confidential
"""
confidential: Boolean!
"""
Timestamp of when the issue was created
"""
createdAt: Time!
"""
Description of the issue
"""
description: String
"""
The GitLab Flavored Markdown rendering of `description`
"""
descriptionHtml: String
designCollection: DesignCollection
designs: DesignCollection @deprecated(reason: "use design_collection")
"""
Indicates discussion is locked on the issue
"""
discussionLocked: Boolean!
"""
All discussions on this noteable
"""
discussions(
"""
Returns the elements in the list that come after the specified cursor.
"""
after: String
"""
Returns the elements in the list that come before the specified cursor.
"""
before: String
"""
Returns the first _n_ elements from the list.
"""
first: Int
"""
Returns the last _n_ elements from the list.
"""
last: Int
): DiscussionConnection!
"""
Number of downvotes the issue has received
"""
downvotes: Int!
"""
Due date of the issue
"""
dueDate: Time
"""
The epic to which issue belongs
"""
epic: Epic
"""
Internal ID of the issue
"""
iid: ID!
"""
Labels of the issue
"""
labels(
"""
Returns the elements in the list that come after the specified cursor.
"""
after: String
"""
Returns the elements in the list that come before the specified cursor.
"""
before: String
"""
Returns the first _n_ elements from the list.
"""
first: Int
"""
Returns the last _n_ elements from the list.
"""
last: Int
): LabelConnection
"""
Milestone of the issue
"""
milestone: Milestone
"""
All notes on this noteable
"""
notes(
"""
Returns the elements in the list that come after the specified cursor.
"""
after: String
"""
Returns the elements in the list that come before the specified cursor.
"""
before: String
"""
Returns the first _n_ elements from the list.
"""
first: Int
"""
Returns the last _n_ elements from the list.
"""
last: Int
): NoteConnection!
"""
List of participants in the issue
"""
participants(
"""
Returns the elements in the list that come after the specified cursor.
"""
after: String
"""
Returns the elements in the list that come before the specified cursor.
"""
before: String
"""
Returns the first _n_ elements from the list.
"""
first: Int
"""
Returns the last _n_ elements from the list.
"""
last: Int
): UserConnection
"""
Internal reference of the issue. Returned in shortened format by default
"""
reference(
"""
Boolean option specifying whether the reference should be returned in full
"""
full: Boolean = false
): String!
"""
Relative position of the issue (used for positioning in epic tree and issue boards)
"""
relativePosition: Int
"""
State of the issue
"""
state: IssueState!
"""
Boolean flag for whether the currently logged in user is subscribed to this issue
"""
subscribed: Boolean!
"""
Task completion status of the issue
"""
taskCompletionStatus: TaskCompletionStatus!
"""
Time estimate of the issue
"""
timeEstimate: Int!
"""
Title of the issue
"""
title: String!
"""
The GitLab Flavored Markdown rendering of `title`
"""
titleHtml: String
"""
Total time reported as spent on the issue
"""
totalTimeSpent: Int!
"""
Timestamp of when the issue was last updated
"""
updatedAt: Time!
"""
Number of upvotes the issue has received
"""
upvotes: Int!
"""
Number of user notes of the issue
"""
userNotesCount: Int!
"""
Permissions for the current user on the resource
"""
userPermissions: IssuePermissions!
"""
Web path of the issue
"""
webPath: String!
"""
Web URL of the issue
"""
webUrl: String!
weight: Int
}
type Group { type Group {
""" """
Avatar URL of the group Avatar URL of the group
...@@ -2626,6 +2361,11 @@ type Issue implements Noteable { ...@@ -2626,6 +2361,11 @@ type Issue implements Noteable {
""" """
state: IssueState! state: IssueState!
"""
Boolean flag for whether the currently logged in user is subscribed to this issue
"""
subscribed: Boolean!
""" """
Task completion status of the issue Task completion status of the issue
""" """
...@@ -4270,7 +4010,7 @@ type Project { ...@@ -4270,7 +4010,7 @@ type Project {
Issues updated before this date Issues updated before this date
""" """
updatedBefore: Time updatedBefore: Time
): ExtendedIssue ): Issue
""" """
Issues of the project Issues of the project
... ...
......
...@@ -506,7 +506,7 @@ ...@@ -506,7 +506,7 @@
], ],
"type": { "type": {
"kind": "OBJECT", "kind": "OBJECT",
"name": "ExtendedIssue", "name": "Issue",
"ofType": null "ofType": null
}, },
"isDeprecated": false, "isDeprecated": false,
...@@ -4359,11 +4359,6 @@ ...@@ -4359,11 +4359,6 @@
"name": "EpicIssue", "name": "EpicIssue",
"ofType": null "ofType": null
}, },
{
"kind": "OBJECT",
"name": "ExtendedIssue",
"ofType": null
},
{ {
"kind": "OBJECT", "kind": "OBJECT",
"name": "Issue", "name": "Issue",
...@@ -7368,6 +7363,24 @@ ...@@ -7368,6 +7363,24 @@
"isDeprecated": false, "isDeprecated": false,
"deprecationReason": null "deprecationReason": null
}, },
{
"name": "subscribed",
"description": "Boolean flag for whether the currently logged in user is subscribed to this issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{ {
"name": "taskCompletionStatus", "name": "taskCompletionStatus",
"description": "Task completion status of the issue", "description": "Task completion status of the issue",
...@@ -8734,6 +8747,24 @@ ...@@ -8734,6 +8747,24 @@
"isDeprecated": false, "isDeprecated": false,
"deprecationReason": null "deprecationReason": null
}, },
{
"name": "subscribed",
"description": "Boolean flag for whether the currently logged in user is subscribed to this issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{ {
"name": "taskCompletionStatus", "name": "taskCompletionStatus",
"description": "Task completion status of the issue", "description": "Task completion status of the issue",
...@@ -13653,801 +13684,6 @@ ...@@ -13653,801 +13684,6 @@
], ],
"possibleTypes": null "possibleTypes": null
}, },
{
"kind": "OBJECT",
"name": "ExtendedIssue",
"description": null,
"fields": [
{
"name": "assignees",
"description": "Assignees of the issue",
"args": [
{
"name": "after",
"description": "Returns the elements in the list that come after the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "before",
"description": "Returns the elements in the list that come before the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "first",
"description": "Returns the first _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
},
{
"name": "last",
"description": "Returns the last _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
}
],
"type": {
"kind": "OBJECT",
"name": "UserConnection",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "author",
"description": "User that created the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "OBJECT",
"name": "User",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "closedAt",
"description": "Timestamp of when the issue was closed",
"args": [
],
"type": {
"kind": "SCALAR",
"name": "Time",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "confidential",
"description": "Indicates the issue is confidential",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "createdAt",
"description": "Timestamp of when the issue was created",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Time",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "description",
"description": "Description of the issue",
"args": [
],
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "descriptionHtml",
"description": "The GitLab Flavored Markdown rendering of `description`",
"args": [
],
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "designCollection",
"description": null,
"args": [
],
"type": {
"kind": "OBJECT",
"name": "DesignCollection",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "designs",
"description": null,
"args": [
],
"type": {
"kind": "OBJECT",
"name": "DesignCollection",
"ofType": null
},
"isDeprecated": true,
"deprecationReason": "use design_collection"
},
{
"name": "discussionLocked",
"description": "Indicates discussion is locked on the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "discussions",
"description": "All discussions on this noteable",
"args": [
{
"name": "after",
"description": "Returns the elements in the list that come after the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "before",
"description": "Returns the elements in the list that come before the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "first",
"description": "Returns the first _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
},
{
"name": "last",
"description": "Returns the last _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
}
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "OBJECT",
"name": "DiscussionConnection",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "downvotes",
"description": "Number of downvotes the issue has received",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "dueDate",
"description": "Due date of the issue",
"args": [
],
"type": {
"kind": "SCALAR",
"name": "Time",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "epic",
"description": "The epic to which issue belongs",
"args": [
],
"type": {
"kind": "OBJECT",
"name": "Epic",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "iid",
"description": "Internal ID of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "ID",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "labels",
"description": "Labels of the issue",
"args": [
{
"name": "after",
"description": "Returns the elements in the list that come after the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "before",
"description": "Returns the elements in the list that come before the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "first",
"description": "Returns the first _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
},
{
"name": "last",
"description": "Returns the last _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
}
],
"type": {
"kind": "OBJECT",
"name": "LabelConnection",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "milestone",
"description": "Milestone of the issue",
"args": [
],
"type": {
"kind": "OBJECT",
"name": "Milestone",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "notes",
"description": "All notes on this noteable",
"args": [
{
"name": "after",
"description": "Returns the elements in the list that come after the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "before",
"description": "Returns the elements in the list that come before the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "first",
"description": "Returns the first _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
},
{
"name": "last",
"description": "Returns the last _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
}
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "OBJECT",
"name": "NoteConnection",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "participants",
"description": "List of participants in the issue",
"args": [
{
"name": "after",
"description": "Returns the elements in the list that come after the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "before",
"description": "Returns the elements in the list that come before the specified cursor.",
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null
},
{
"name": "first",
"description": "Returns the first _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
},
{
"name": "last",
"description": "Returns the last _n_ elements from the list.",
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"defaultValue": null
}
],
"type": {
"kind": "OBJECT",
"name": "UserConnection",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "reference",
"description": "Internal reference of the issue. Returned in shortened format by default",
"args": [
{
"name": "full",
"description": "Boolean option specifying whether the reference should be returned in full",
"type": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
},
"defaultValue": "false"
}
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "String",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "relativePosition",
"description": "Relative position of the issue (used for positioning in epic tree and issue boards)",
"args": [
],
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "state",
"description": "State of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "ENUM",
"name": "IssueState",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "subscribed",
"description": "Boolean flag for whether the currently logged in user is subscribed to this issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "taskCompletionStatus",
"description": "Task completion status of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "OBJECT",
"name": "TaskCompletionStatus",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "timeEstimate",
"description": "Time estimate of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "title",
"description": "Title of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "String",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "titleHtml",
"description": "The GitLab Flavored Markdown rendering of `title`",
"args": [
],
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "totalTimeSpent",
"description": "Total time reported as spent on the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "updatedAt",
"description": "Timestamp of when the issue was last updated",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Time",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "upvotes",
"description": "Number of upvotes the issue has received",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "userNotesCount",
"description": "Number of user notes of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "userPermissions",
"description": "Permissions for the current user on the resource",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "OBJECT",
"name": "IssuePermissions",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "webPath",
"description": "Web path of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "String",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "webUrl",
"description": "Web URL of the issue",
"args": [
],
"type": {
"kind": "NON_NULL",
"name": null,
"ofType": {
"kind": "SCALAR",
"name": "String",
"ofType": null
}
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "weight",
"description": null,
"args": [
],
"type": {
"kind": "SCALAR",
"name": "Int",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
}
],
"inputFields": null,
"interfaces": [
{
"kind": "INTERFACE",
"name": "Noteable",
"ofType": null
}
],
"enumValues": null,
"possibleTypes": null
},
{ {
"kind": "OBJECT", "kind": "OBJECT",
"name": "Metadata", "name": "Metadata",
... ...
......
...@@ -254,6 +254,7 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph ...@@ -254,6 +254,7 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph
| `webPath` | String! | Web path of the issue | | `webPath` | String! | Web path of the issue |
| `webUrl` | String! | Web URL of the issue | | `webUrl` | String! | Web URL of the issue |
| `relativePosition` | Int | Relative position of the issue (used for positioning in epic tree and issue boards) | | `relativePosition` | Int | Relative position of the issue (used for positioning in epic tree and issue boards) |
| `subscribed` | Boolean! | Boolean flag for whether the currently logged in user is subscribed to this issue |
| `timeEstimate` | Int! | Time estimate of the issue | | `timeEstimate` | Int! | Time estimate of the issue |
| `totalTimeSpent` | Int! | Total time reported as spent on the issue | | `totalTimeSpent` | Int! | Total time reported as spent on the issue |
| `closedAt` | Time | Timestamp of when the issue was closed | | `closedAt` | Time | Timestamp of when the issue was closed |
...@@ -296,41 +297,6 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph ...@@ -296,41 +297,6 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph
| `clientMutationId` | String | A unique identifier for the client performing the mutation. | | `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Reasons why the mutation failed. | | `errors` | String! => Array | Reasons why the mutation failed. |
### ExtendedIssue
| Name | Type | Description |
| --- | ---- | ---------- |
| `userPermissions` | IssuePermissions! | Permissions for the current user on the resource |
| `iid` | ID! | Internal ID of the issue |
| `title` | String! | Title of the issue |
| `titleHtml` | String | The GitLab Flavored Markdown rendering of `title` |
| `description` | String | Description of the issue |
| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
| `state` | IssueState! | State of the issue |
| `reference` | String! | Internal reference of the issue. Returned in shortened format by default |
| `author` | User! | User that created the issue |
| `milestone` | Milestone | Milestone of the issue |
| `dueDate` | Time | Due date of the issue |
| `confidential` | Boolean! | Indicates the issue is confidential |
| `discussionLocked` | Boolean! | Indicates discussion is locked on the issue |
| `upvotes` | Int! | Number of upvotes the issue has received |
| `downvotes` | Int! | Number of downvotes the issue has received |
| `userNotesCount` | Int! | Number of user notes of the issue |
| `webPath` | String! | Web path of the issue |
| `webUrl` | String! | Web URL of the issue |
| `relativePosition` | Int | Relative position of the issue (used for positioning in epic tree and issue boards) |
| `timeEstimate` | Int! | Time estimate of the issue |
| `totalTimeSpent` | Int! | Total time reported as spent on the issue |
| `closedAt` | Time | Timestamp of when the issue was closed |
| `createdAt` | Time! | Timestamp of when the issue was created |
| `updatedAt` | Time! | Timestamp of when the issue was last updated |
| `taskCompletionStatus` | TaskCompletionStatus! | Task completion status of the issue |
| `epic` | Epic | The epic to which issue belongs |
| `weight` | Int | |
| `designs` | DesignCollection | |
| `designCollection` | DesignCollection | |
| `subscribed` | Boolean! | Boolean flag for whether the currently logged in user is subscribed to this issue |
### Group ### Group
| Name | Type | Description | | Name | Type | Description |
...@@ -382,6 +348,7 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph ...@@ -382,6 +348,7 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph
| `webPath` | String! | Web path of the issue | | `webPath` | String! | Web path of the issue |
| `webUrl` | String! | Web URL of the issue | | `webUrl` | String! | Web URL of the issue |
| `relativePosition` | Int | Relative position of the issue (used for positioning in epic tree and issue boards) | | `relativePosition` | Int | Relative position of the issue (used for positioning in epic tree and issue boards) |
| `subscribed` | Boolean! | Boolean flag for whether the currently logged in user is subscribed to this issue |
| `timeEstimate` | Int! | Time estimate of the issue | | `timeEstimate` | Int! | Time estimate of the issue |
| `totalTimeSpent` | Int! | Total time reported as spent on the issue | | `totalTimeSpent` | Int! | Total time reported as spent on the issue |
| `closedAt` | Time | Timestamp of when the issue was closed | | `closedAt` | Time | Timestamp of when the issue was closed |
...@@ -678,7 +645,7 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph ...@@ -678,7 +645,7 @@ The API can be explored interactively using the [GraphiQL IDE](../index.md#graph
| `statistics` | ProjectStatistics | Statistics of the project | | `statistics` | ProjectStatistics | Statistics of the project |
| `repository` | Repository | Git repository of the project | | `repository` | Repository | Git repository of the project |
| `mergeRequest` | MergeRequest | A single merge request of the project | | `mergeRequest` | MergeRequest | A single merge request of the project |
| `issue` | ExtendedIssue | A single issue of the project | | `issue` | Issue | A single issue of the project |
### ProjectPermissions ### ProjectPermissions
... ...
......
...@@ -15,7 +15,7 @@ module Banzai ...@@ -15,7 +15,7 @@ module Banzai
end end
def extra_element_attrs def extra_element_attrs
{ width: "100%" } { width: "400" }
end end
end end
end end
... ...
......
...@@ -24,6 +24,7 @@ describe('AssigneeAvatarLink component', () => { ...@@ -24,6 +24,7 @@ describe('AssigneeAvatarLink component', () => {
}; };
wrapper = shallowMount(AssigneeAvatarLink, { wrapper = shallowMount(AssigneeAvatarLink, {
attachToDocument: true,
propsData, propsData,
sync: false, sync: false,
}); });
... ...
......